Browse Source

org-element: Fix special block parsing

* lisp/org-element.el (org-element-special-block-parser): Fix typo in
  regexp matching block type.  Also quote the type so it can contain
  special characters.
* testing/lisp/test-org-element.el: Add test.
Nicolas Goaziou 11 years ago
parent
commit
dffdc499ea
2 changed files with 27 additions and 18 deletions
  1. 3 2
      lisp/org-element.el
  2. 24 16
      testing/lisp/test-org-element.el

+ 3 - 2
lisp/org-element.el

@@ -1353,11 +1353,12 @@ containing `:type', `:begin', `:end', `:hiddenp',
 
 Assume point is at the beginning of the block."
   (let* ((case-fold-search t)
-	 (type (progn (looking-at "[ \t]*#\\+BEGIN_\\(S-+\\)")
+	 (type (progn (looking-at "[ \t]*#\\+BEGIN_\\(\\S-+\\)")
 		      (upcase (match-string-no-properties 1)))))
     (if (not (save-excursion
 	       (re-search-forward
-		(format "^[ \t]*#\\+END_%s[ \t]*$" type) limit t)))
+		(format "^[ \t]*#\\+END_%s[ \t]*$" (regexp-quote type))
+		limit t)))
 	;; Incomplete block: parse it as a paragraph.
 	(org-element-paragraph-parser limit affiliated)
       (let ((block-end-line (match-beginning 0)))

+ 24 - 16
testing/lisp/test-org-element.el

@@ -1648,25 +1648,33 @@ Outside list"
 (ert-deftest test-org-element/special-block-parser ()
   "Test `special-block' parser."
   ;; Standard test.
-  (let ((special-block
-	 (org-test-with-temp-text "#+BEGIN_SPECIAL\nText\n#+END_SPECIAL"
-	   (org-element-map
-	    (org-element-parse-buffer) 'special-block 'identity nil t))))
-    (should (equal (org-element-property :type special-block) "SPECIAL"))
-    (should (org-element-map special-block 'paragraph 'identity)))
+  (should
+   (equal "SPECIAL"
+	  (org-test-with-temp-text "#+BEGIN_SPECIAL\nText\n#+END_SPECIAL"
+	    (org-element-property :type (org-element-at-point)))))
+  ;; Special blocks can contain paragraphs.
+  (should
+   (eq 'paragraph
+       (org-test-with-temp-text "#+BEGIN_SPECIAL\nText\n#+END_SPECIAL"
+	 (forward-line)
+	 (org-element-type (org-element-at-point)))))
   ;; Test folded block.
-  (org-test-with-temp-text "#+BEGIN_SPECIAL\nText\n#+END_SPECIAL"
-    (org-cycle)
-    (should
-     (org-element-property
-      :hiddenp
-      (org-element-map
-       (org-element-parse-buffer) 'special-block 'identity nil t))))
+  (should
+   (org-test-with-temp-text "#+BEGIN_SPECIAL\nText\n#+END_SPECIAL"
+     (org-cycle)
+     (org-element-property :hiddenp (org-element-at-point))))
   ;; Ignore incomplete block.
   (should-not
-   (org-test-with-temp-text "#+BEGIN_SPECIAL"
-     (org-element-map
-      (org-element-parse-buffer) 'special-block 'identity nil t))))
+   (eq 'special-block
+       (org-test-with-temp-text "#+BEGIN_SPECIAL"
+	 (org-element-type (org-element-at-point)))))
+  ;; Allow special characters in type.
+  (should
+   (equal '(special-block "SPECIAL*")
+	  (org-test-with-temp-text "#+BEGIN_SPECIAL*\nContents\n#+END_SPECIAL*"
+	    (let ((element (org-element-at-point)))
+	      (list (org-element-type element)
+		    (org-element-property :type element)))))))
 
 
 ;;;; Src Block