org-element: Fix macro parsing with protected commas 7.9.3e
authorNicolas Goaziou <n.goaziou@gmail.com>
Thu, 31 Jan 2013 21:15:15 +0000 (22:15 +0100)
committerNicolas Goaziou <n.goaziou@gmail.com>
Thu, 31 Jan 2013 21:15:39 +0000 (22:15 +0100)
* lisp/org-element.el (org-element-macro-parser): Fix error when last
  argument ends with a protected comma.
* testing/lisp/test-org-element.el (test-org-element/macro-parser):
  Add tests.

lisp/org-element.el
testing/lisp/test-org-element.el

index f86c366..6a0b8ee 100644 (file)
@@ -2893,10 +2893,13 @@ Assume point is at the macro."
          (end (point))
          (args (let ((args (org-match-string-no-properties 3)) args2)
                  (when args
-                   (setq args (org-split-string args ","))
+                   ;; Do not use `org-split-string' since empty
+                   ;; strings are meaningful here.
+                   (setq args (split-string args ","))
                    (while args
                      (while (string-match "\\\\\\'" (car args))
-                       ;; Repair bad splits.
+                       ;; Repair bad splits, when comma is protected,
+                        ;; and thus not a real separator.
                        (setcar (cdr args) (concat (substring (car args) 0 -1)
                                                   "," (nth 1 args)))
                        (pop args))
index 97d8533..29e1af8 100644 (file)
@@ -1207,7 +1207,18 @@ e^{i\\pi}+1=0
   ;; With arguments.
   (should
    (org-test-with-temp-text "{{{macro(arg1,arg2)}}}"
-     (org-element-map (org-element-parse-buffer) 'macro 'identity))))
+     (org-element-map (org-element-parse-buffer) 'macro 'identity)))
+  ;; Properly handle protected commas in arguments...
+  (should
+   (= 2
+      (length
+       (org-test-with-temp-text "{{{macro(arg1\\,arg1,arg2)}}}"
+        (org-element-property :args (org-element-context))))))
+  ;; ... even when last argument ends with a protected comma.
+  (should
+   (equal '("C-,")
+         (org-test-with-temp-text "{{{macro(C-\\,)}}}"
+           (org-element-property :args (org-element-context))))))
 
 
 ;;;; Paragraph