Patchwork [O,babel] BUG in inline source blocks

login
register
Submitter Martyn Jago
Date 2012-01-26 13:29:10
Message ID <m24nvisic9.fsf@btinternet.com>
Download mbox | patch
Permalink /patch/1142/
State Superseded
Delegated to: Bastien Guerry
Headers show

Comments

Martyn Jago - 2012-01-26 13:29:10
Hi,

Andreas Leha <andreas.leha@med.uni-goettingen.de> writes:

> Hi all,
>
> I experience unexpected behaviour when an inline source block is not
> preceded by whitespace.
>
> Example:
> =======================
> * Test inline
>   This is a functional inline src_R{print("source block")}.
>
>   This (src_R{print("here")}) is not.
> =======================
>
> Regards,
> Andreas 

I can confirm this behaviour and provide a patch to allow for inline
source blocks to be preceded by punctuation, or, for instance, enclosed
in parenthesis, as in Andreas' example. Patch is attached for
consideration.

Best, Martyn

Patch

From ce7ccfe97ce640f47ed83cdb2fdb6ffa8a6d3c54 Mon Sep 17 00:00:00 2001
From: Martyn Jago <martyn.jago@btinternet.com>
Date: Thu, 26 Jan 2012 13:22:25 +0000
Subject: [PATCH] Fix for where inline source block is not preceded by whitespace but by
 punctuation (reported by Andreas Leha).

* lisp/ob.el: Fix for where inline source block is not preceded by
whitespace but by punctuation.

* testing/lisp/test-ob.el: Regression test, testing inline source
block preceded by point, equality, and enclosed in parenthesis and
brackets.
---
 lisp/ob.el              |   21 ++++++++++++---------
 testing/lisp/test-ob.el |   44 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 9 deletions(-)

diff --git a/lisp/ob.el b/lisp/ob.el
index 70c258f..fbf032b 100644
--- a/lisp/ob.el
+++ b/lisp/ob.el
@@ -170,24 +170,27 @@  not match KEY should be returned."
 (defun org-babel-get-inline-src-block-matches()
   "Set match data if within body of an inline source block.
 Returns non-nil if match-data set"
-  (let ((src-at-0-p (save-excursion
+  (let* ((src-at-0-p (save-excursion
 		      (beginning-of-line 1)
 		      (string= "src" (thing-at-point 'word))))
 	(first-line-p (= 1 (line-number-at-pos)))
-	(orig (point)))
-    (let ((search-for (cond ((and src-at-0-p first-line-p  "src_"))
-			    (first-line-p "[ \t]src_")
-			    (t "[ \f\t\n\r\v]src_")))
-	  (lower-limit (if first-line-p
-			   nil
-			 (- (point-at-bol) 1))))
+	(orig (point))
+	(search-for (cond ((and src-at-0-p first-line-p  "src_"))
+			  (first-line-p "[ \t[:punct:]]src_")
+			  (t "[ \f\t\n\r\v[:punct:]]src_")))
+	(lower-limit (if first-line-p
+			 nil
+		       (- (point-at-bol) 1))))
+      (message "src-at-0-p = %S" src-at-0-p)
+      (message "first-line-p = %S" src-at-0-p)
+      (message "search-for = %S" search-for)
       (save-excursion
 	(when (or (and src-at-0-p (bobp))
 		  (and (re-search-forward "}" (point-at-eol) t)
 		       (re-search-backward search-for lower-limit t)
 		       (> orig (point))))
 	  (when (looking-at org-babel-inline-src-block-regexp)
-	    t ))))))
+	    t )))))
 
 (defvar org-babel-inline-lob-one-liner-regexp)
 (defun org-babel-get-lob-one-liner-matches()
diff --git a/testing/lisp/test-ob.el b/testing/lisp/test-ob.el
index 7dccd22..fb38ead 100644
--- a/testing/lisp/test-ob.el
+++ b/testing/lisp/test-ob.el
@@ -430,6 +430,50 @@  this is simple"
 		       (buffer-substring-no-properties
 			(point-min) (point-max)))))))
 
+(ert-deftest test-org-babel/inline-src_blk-preceded-punct ()
+  "Test inline source block where preceded by punctuation"
+
+  ;; inline-src-blk preceded by point
+  (let ((test-line ".src_emacs-lisp[ :results verbatim ]{ \"x\"  }"))
+    (org-test-with-temp-text
+	test-line
+      (forward-char 1)
+      (org-ctrl-c-ctrl-c)
+      (should (string= (concat test-line " =\"x\"=")
+		       (buffer-substring-no-properties
+			(point-min) (point-max))))))
+
+  ;; inline-src-blk preceded by equality
+  (let ((test-line "=src_emacs-lisp[ :results verbatim ]{ \"x\"  }"))
+    (org-test-with-temp-text
+	test-line
+      (forward-char 1)
+      (org-ctrl-c-ctrl-c)
+      (should (string= (concat test-line " =\"x\"=")
+		       (buffer-substring-no-properties
+			(point-min) (point-max))))))
+
+  ;; inline-src-blk enclosed within parenthesis
+  (let ((test-line "(src_emacs-lisp[ :results verbatim ]{ \"x\"  }"))
+    (org-test-with-temp-text
+	(concat test-line ")")
+      (forward-char 1)
+      (org-ctrl-c-ctrl-c)
+      (should (string= (concat test-line " =\"x\"=)" )
+		       (buffer-substring-no-properties
+			(point-min) (point-max))))))
+
+  ;; inline-src-blk enclosed within parenthesis
+  (let ((test-line "{src_emacs-lisp[ :results verbatim ]{ \"x\"  }"))
+    (org-test-with-temp-text
+	(concat test-line "}")
+      (forward-char 1)
+      (org-ctrl-c-ctrl-c)
+      (should (string= (concat test-line " =\"x\"=}")
+		       (buffer-substring-no-properties
+			(point-min) (point-max))))))
+
+  )
 (ert-deftest test-org-babel/combining-scalar-and-raw-result-types ()
   (org-test-with-temp-text-in-file "
 
-- 
1.7.3.4