From f21ae57759ca5a1d4f19424c4eb0be8db4dcbfb5 Mon Sep 17 00:00:00 2001 From: Rasmus Date: Fri, 18 Jul 2014 17:01:53 +0200 Subject: [PATCH] org-element.el: allow one-line LaTeX environments * org-element.el (org-elment--latex-begin-environment, org-element--latex-end-environment): New regexps identifying begining and ending of LaTeX environment. (org-element-latex-environment-parser, org-element-paragraph-parser, org-element--current-element): use org-elment--latex-begin-environment and org-element--latex-end-environment * test-org-element.el (test-org-element/latex-environment-parser): test for one-line LaTeX environments. (test-org-element/latex-environment-parser): test different start tag and end tag. --- lisp/org-element.el | 19 ++++++++++++------- testing/lisp/test-org-element.el | 13 ++++++++++++- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index 91b4934..5311e60 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -2083,6 +2083,13 @@ CONTENTS is nil." ;;;; Latex Environment +(defconst org-elment--latex-begin-environment + "[ \t]*\\\\begin{\\([A-Za-z0-9*]+\\)}\\(\\[.*?\\]\\|{.*?}\\)*[ \t]*?" + "Holds regexp matching beginning of LaTeX environments.") + +(defconst org-element--latex-end-environment + "[ \t]*\\\\end{%s}[ \t]*" + "Holds regexp matching ending of LaTeX environments.") (defun org-element-latex-environment-parser (limit affiliated) "Parse a LaTeX environment. @@ -2100,8 +2107,8 @@ Assume point is at the beginning of the latex environment." (save-excursion (let ((case-fold-search t) (code-begin (point))) - (looking-at "[ \t]*\\\\begin{\\([A-Za-z0-9]+\\*?\\)}") - (if (not (re-search-forward (format "^[ \t]*\\\\end{%s}[ \t]*$" + (looking-at org-elment--latex-begin-environment) + (if (not (re-search-forward (format org-element--latex-end-environment (regexp-quote (match-string 1))) limit t)) ;; Incomplete latex environment: parse it as a paragraph. @@ -2219,11 +2226,10 @@ Assume point is at the beginning of the paragraph." (org-match-string-no-properties 1))) limit t))) ;; Stop at valid latex environments. - (and (looking-at - "[ \t]*\\\\begin{\\([A-Za-z0-9]+\\*?\\)}") + (and (looking-at org-elment--latex-begin-environment) (save-excursion (re-search-forward - (format "^[ \t]*\\\\end{%s}[ \t]*$" + (format org-element--latex-end-environment (regexp-quote (org-match-string-no-properties 1))) limit t))) @@ -3707,8 +3713,7 @@ element it has to parse." (goto-char (car affiliated)) (org-element-keyword-parser limit nil)) ;; LaTeX Environment. - ((looking-at - "[ \t]*\\\\begin{[A-Za-z0-9*]+}\\(\\[.*?\\]\\|{.*?}\\)*[ \t]*$") + ((looking-at org-elment--latex-begin-environment) (org-element-latex-environment-parser limit affiliated)) ;; Drawer and Property Drawer. ((looking-at org-drawer-regexp) diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el index 04ef1ce..0c042e1 100644 --- a/testing/lisp/test-org-element.el +++ b/testing/lisp/test-org-element.el @@ -1310,9 +1310,20 @@ e^{i\\pi}+1=0 (eq 'latex-environment (org-test-with-temp-text "\\begin{env}{arg}\nvalue\n\\end{env}" (org-element-type (org-element-at-point))))) + ;; Allow environments without newline after \begin{.}. + (should + (eq 'latex-environment + (org-test-with-temp-text "\\begin{env}{arg}something\nvalue\n\\end{env}" + (org-element-type (org-element-at-point))))) + ;; Allow one-line environments. + (should + (eq 'latex-environment + (org-test-with-temp-text "\\begin{env}{arg}something\\end{env}" + (org-element-type (org-element-at-point))))) + ;; Should not allow different tags (should-not (eq 'latex-environment - (org-test-with-temp-text "\\begin{env}{arg} something\nvalue\n\\end{env}" + (org-test-with-temp-text "\\begin{env*}{arg}something\\end{env}" (org-element-type (org-element-at-point))))) ;; Handle non-empty blank line at the end of buffer. (should -- 2.0.2