From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rasmus Subject: Re: [bug?, org-element] latex-environment delimiters must be at BOL Date: Tue, 22 Jul 2014 11:08:22 +0200 Message-ID: <87fvhtlq0p.fsf@gmx.us> References: <877g3ltomt.fsf@gmx.us> <87iomxjvyv.fsf@nicolasgoaziou.fr> <87vbqu1xb6.fsf@gmx.us> <87mwc3gbtj.fsf@nicolasgoaziou.fr> <87egxf12n7.fsf@gmx.us> <87ha29g76m.fsf@nicolasgoaziou.fr> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:56761) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X9W3x-00076J-98 for emacs-orgmode@gnu.org; Tue, 22 Jul 2014 05:08:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X9W3q-0003tJ-HV for emacs-orgmode@gnu.org; Tue, 22 Jul 2014 05:08:44 -0400 Received: from mout.gmx.net ([212.227.15.15]:60950) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X9W3q-0003tF-7O for emacs-orgmode@gnu.org; Tue, 22 Jul 2014 05:08:38 -0400 Received: from W530 ([109.201.154.147]) by mail.gmx.com (mrgmx002) with ESMTPSA (Nemesis) id 0Lk7T8-1WXhCk2bfO-00c7G8 for ; Tue, 22 Jul 2014 11:08:36 +0200 In-Reply-To: <87ha29g76m.fsf@nicolasgoaziou.fr> (Nicolas Goaziou's message of "Tue, 22 Jul 2014 09:54:09 +0200") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi, Nicolas Goaziou writes: > IMO, the way to go would be to define regexps as constants everywhere in > "org-element.el", but that would introduce duplicates with some > constants in "org.el". IOW, there's no clear design about it. Situation > may change when the parser gets more integrated into core. Sounds like an daunting, but worthwhile task. > Meanwhile, it can't hurt to use constants in "org-element.el". Good to know. The attached patch hopefully addresses all of the issues you pointed out. Sorry about those typos before! Thanks, Rasmus --=20 S=C3=A5dan en god dansk lagereddike kan man slet ikke bruge mere --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-org-element.el-Allow-one-line-LaTeX-environments.patch >From b34f2199a648f6eafd6917662ec0d6c56e12bc8b 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-element--latex-begin-environment, org-element--latex-end-environment): New format strings to identify beginning and ending of LaTeX environments. (org-element-latex-environment-parser, org-element-paragraph-parser, org-element--current-element): Use `org-element--latex-begin-environment' and `org-element--latex-end-environment'. * test-org-element.el (test-org-element/latex-environment-parser): Add tests. --- lisp/org-element.el | 29 ++++++++++++++++++++++------- testing/lisp/test-org-element.el | 22 +++++++++++++++++++++- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index 850ed94..147432e 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -2084,6 +2084,23 @@ CONTENTS is nil." ;;;; Latex Environment +(defconst org-element--latex-begin-environment + "^[ \t]*\\\\begin{\\([A-Za-z0-9*]+\\)}" + ;; The following format string also matches optional arguments: + ;; "^[ \t]*\\\\begin{\\([A-Za-z0-9*]+\\)}\\(\\[.*?\\]\\|{.*?}\\)*[ \t]*?" + "Format string matching the beginning of a LaTeX environment. + +Usage example: + (format org-element--latex-begin-environment ENV) +where ENV is a LaTeX environment. + +See also `org-element--latex-end-environment'.") + +(defconst org-element--latex-end-environment + "\\\\end{%s}[ \t]*$" + "Format string matching the ending of a LaTeX environment. +See also `org-element--latex-begin-environment'.") + (defun org-element-latex-environment-parser (limit affiliated) "Parse a LaTeX environment. @@ -2100,8 +2117,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-element--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 +2236,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-element--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 +3723,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-element--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..0ca0f8a 100644 --- a/testing/lisp/test-org-element.el +++ b/testing/lisp/test-org-element.el @@ -1310,9 +1310,29 @@ 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\\end{env}" + (org-element-type (org-element-at-point))))) + ;; LaTeX environments must be on separate lines. + (should-not + (eq 'latex-environment + (org-test-with-temp-text "\\begin{env} x \\end{env} y" + (org-element-type (org-element-at-point))))) (should-not (eq 'latex-environment - (org-test-with-temp-text "\\begin{env}{arg} something\nvalue\n\\end{env}" + (org-test-with-temp-text "y \\begin{env} x \\end{env}" (org-element-type (org-element-at-point))))) ;; Handle non-empty blank line at the end of buffer. (should -- 2.0.2 --=-=-=--