From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nicolas Goaziou Subject: [RFC] Change in export block syntax Date: Mon, 26 Oct 2015 15:09:57 +0100 Message-ID: <87oaflvhze.fsf@nicolasgoaziou.fr> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:39181) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZqiRe-0000RX-1s for emacs-orgmode@gnu.org; Mon, 26 Oct 2015 10:08:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZqiRa-0006A0-Fl for emacs-orgmode@gnu.org; Mon, 26 Oct 2015 10:08:17 -0400 Received: from relay3-d.mail.gandi.net ([2001:4b98:c:538::195]:35785) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZqiRZ-00067z-VQ for emacs-orgmode@gnu.org; Mon, 26 Oct 2015 10:08:14 -0400 Received: from selenimh (unknown [IPv6:2a01:6600:8080:9601::2de]) (Authenticated sender: mail@nicolasgoaziou.fr) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id B8EE9A80E5 for ; Mon, 26 Oct 2015 15:08:11 +0100 (CET) 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: Org Mode List --=-=-= Content-Type: text/plain Hello, This one is a long standing issue. I didn't include it in the projects thread since the patch was almost finished. Basically, syntax between export blocks and special blocks is ambiguous, as it depends on the export back-end loaded. For example, #+begin_odt <> #+end_odt will be parsed very differently if `ox-odt' is loaded or not. In the former case, the target is inactive whereas in the latter case, it can be reached with an internal link. As a solution, export blocks are explicitly marked as such at the syntax level to disambiguate their parsing from special blocks. The new syntax is: #+BEGIN_EXPORT backend ... #+END_EXPORT instead of #+BEGIN_backend ... #+END_backend So, basically, "export" is a reserved block type, much like "src". As a consequence, =INCLUDE= keywords syntax is modified, e.g., ,#+INCLUDE: "file.org" HTML becomes ,#+INCLUDE: "file.org" export html The following function, included in ORG-NEWS, updates any Org document to the new syntax. It is meant to be applied after applying the patch. (defun org-repair-export-blocks () "Repair export blocks and INCLUDE keywords in current buffer." (when (eq major-mode 'org-mode) (let ((case-fold-search t) (back-end-re (regexp-opt '("HTML" "ASCII" "LATEX" "ODT" "MARKDOWN" "MD" "ORG" "MAN" "BEAMER" "TEXINFO" "GROFF" "KOMA-LETTER") t))) (org-with-wide-buffer (goto-char (point-min)) (let ((block-re (concat "^[ \t]*#\\+BEGIN_" back-end-re))) (save-excursion (while (re-search-forward block-re nil t) (let ((element (save-match-data (org-element-at-point)))) (when (eq (org-element-type element) 'special-block) (save-excursion (goto-char (org-element-property :end element)) (save-match-data (search-backward "_")) (forward-char) (insert "EXPORT") (delete-region (point) (line-end-position))) (replace-match "EXPORT \\1" nil nil nil 1)))))) (let ((include-re (format "^[ \t]*#\\+INCLUDE: .*?%s[ \t]*$" back-end-re))) (while (re-search-forward include-re nil t) (let ((element (save-match-data (org-element-at-point)))) (when (and (eq (org-element-type element) 'keyword) (string= (org-element-property :key element) "INCLUDE")) (replace-match "EXPORT \\1" nil nil nil 1))))))))) The patch is still lacking documentation update. Once applied, I plan to implement two checkers in Org lint: one to detect old syntax and another one to signal a missing back-end after BEGIN_EXPORT string. Feedback welcome, Regards, -- Nicolas Goaziou 0x80A93738 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-Change-export-block-syntax.patch >From 0190f756ce4393b9db851da89cc731baabdfe7ce Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Tue, 3 Feb 2015 16:16:54 +0100 Subject: [PATCH] Change export block syntax * lisp/org-element.el (org-element-export-block-parser): (org-element--current-element): Use new syntax for export blocks. (org-element-block-name-alist): Remove. * lisp/ox.el (org-export-register-backend): (org-export-define-derived-backend): Remove :export-block keyword from back-end's definition. (org-export-expand-include-keyword): Use new syntax for include keywords. * lisp/ox-ascii.el (ascii): * lisp/ox-beamer.el (beamer): * lisp/ox-html.el (html): * lisp/ox-latex.el (latex): (org-latex-prefer-user-labels): * lisp/ox-man.el (man): * lisp/ox-md.el (md): * lisp/ox-odt.el (odt): * lisp/ox-texinfo.el (texinfo): Propagate changes to "ox.el". * lisp/ob-core.el (org-babel-insert-result): * lisp/ob-haskell.el (org-babel-haskell-export-to-lhs): Use new syntax. * lisp/org.el (org-structure-template-alist): Use new syntax. (org-protecting-blocks): Add "export" to protected blocks. Remove back-ends blocks, which are now special blocks. (org-fontify-meta-lines-and-blocks-1): Fontify correctly new blocks. * lisp/org-footnote.el (org-footnote-forbidden-blocks): * lisp/org-list.el (org-list-forbidden-blocks): Add "export" to forbidden blocks. Remove back-ends blocks, which are now special blocks. * contrib/lisp/ox-extra.el: Update comments. * testing/lisp/test-org-element.el (test-org-element/export-block-parser): (test-org-element/export-block-interpreter): * testing/lisp/test-ob.el (test-ob/org-babel-remove-result--results-html): (test-ob/org-babel-remove-result--results-latex): * testing/lisp/test-ox.el (test-org-export/expand-include): Update tests. Export blocks are explicitly marked as such at the syntax level to disambiguate their parsing from special blocks. The new syntax is #+BEGIN_EXPORT backend ... #+END_EXPORT instead of #+BEGIN_backend ... #+END_backend As a consequence, =INCLUDE= keywords syntax is modified, e.g., ,#+INCLUDE: "file.org" HTML becomes ,#+INCLUDE: "file.org" export html --- contrib/lisp/ox-extra.el | 4 +- etc/ORG-NEWS | 67 +++++++++++++++++++++ lisp/ob-core.el | 17 +++--- lisp/ob-haskell.el | 4 +- lisp/org-element.el | 123 ++++++++++++++++++--------------------- lisp/org-footnote.el | 3 +- lisp/org-list.el | 3 +- lisp/org.el | 17 +++--- lisp/ox-ascii.el | 1 - lisp/ox-beamer.el | 1 - lisp/ox-html.el | 1 - lisp/ox-latex.el | 5 +- lisp/ox-man.el | 1 - lisp/ox-md.el | 1 - lisp/ox-odt.el | 1 - lisp/ox-texinfo.el | 1 - lisp/ox.el | 63 ++++++-------------- testing/lisp/test-ob.el | 8 +-- testing/lisp/test-org-element.el | 38 ++++++------ testing/lisp/test-ox.el | 14 +---- 20 files changed, 192 insertions(+), 181 deletions(-) diff --git a/contrib/lisp/ox-extra.el b/contrib/lisp/ox-extra.el index e6d45cc..85dae47 100644 --- a/contrib/lisp/ox-extra.el +++ b/contrib/lisp/ox-extra.el @@ -37,9 +37,9 @@ ;; for export. These blocks should be tagged with #+header: :header ;; yes. For example: ;; #+header: :header yes -;; #+begin_latex +;; #+begin_export latex ;; ... -;; #+end_latex +;; #+end_export ;; - `ignore-headlines' -- allow a headline (but not its children) to ;; be ignored. Any headline tagged with the 'ignore' tag will be diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 624654a..1819a63 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -9,6 +9,73 @@ See the end of the file for license conditions. Please send Org bug reports to mailto:emacs-orgmode@gnu.org. * Version 8.4 +** Incompatible changes +*** New syntax for export blocks +Export blocks are explicetly marked as such at the syntax level to +disambiguate their parsing from special blocks. The new syntax is + +#+BEGIN_SRC org +,#+BEGIN_EXPORT backend +... +,#+END_EXPORT +#+END_SRC + +instead of + +#+BEGIN_SRC org +,#+BEGIN_backend +... +,#+END_backend +#+END_SRC + +As a consequence, =INCLUDE= keywords syntax is modified, e.g., + +#+BEGIN_SRC org +,#+INCLUDE: "file.org" HTML +#+END_SRC + +becomes + +#+BEGIN_SRC org +,#+INCLUDE: "file.org" export html +#+END_SRC + + +The following function repairs export blocks and =INCLUDE= keywords +using previous syntax: + +#+BEGIN_SRC emacs-lisp +(defun org-repair-export-blocks () + "Repair export blocks and INCLUDE keywords in current buffer." + (when (eq major-mode 'org-mode) + (let ((case-fold-search t) + (back-end-re (regexp-opt + '("HTML" "ASCII" "LATEX" "ODT" "MARKDOWN" "MD" "ORG" + "MAN" "BEAMER" "TEXINFO" "GROFF" "KOMA-LETTER") + t))) + (org-with-wide-buffer + (goto-char (point-min)) + (let ((block-re (concat "^[ \t]*#\\+BEGIN_" back-end-re))) + (save-excursion + (while (re-search-forward block-re nil t) + (let ((element (save-match-data (org-element-at-point)))) + (when (eq (org-element-type element) 'special-block) + (save-excursion + (goto-char (org-element-property :end element)) + (save-match-data (search-backward "_")) + (forward-char) + (insert "EXPORT") + (delete-region (point) (line-end-position))) + (replace-match "EXPORT \\1" nil nil nil 1)))))) + (let ((include-re + (format "^[ \t]*#\\+INCLUDE: .*?%s[ \t]*$" back-end-re))) + (while (re-search-forward include-re nil t) + (let ((element (save-match-data (org-element-at-point)))) + (when (and (eq (org-element-type element) 'keyword) + (string= (org-element-property :key element) "INCLUDE")) + (replace-match "EXPORT \\1" nil nil nil 1))))))))) +#+END_SRC + ** New features *** Org linter ~org-lint~ can check syntax and report common issues in Org documents. diff --git a/lisp/ob-core.el b/lisp/ob-core.el index 902315a..d35a23b 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -2096,15 +2096,16 @@ org ----- results are added inside of a \"src_org{}\" or \"#+BEGIN_SRC but Org syntax here will be discarded when exporting the file. -html ---- results are added inside of a #+BEGIN_HTML block or - html export snippet depending on whether the current +html ---- results are added inside of a #+BEGIN_EXPORT HTML block + or html export snippet depending on whether the current source block is inline or not. This is a good option if your code block will output html formatted text. -latex --- results are added inside of a #+BEGIN_LATEX block or - latex export snippet depending on whether the current - source block is inline or not. This is a good option - if your code block will output latex formatted text. +latex --- results are added inside of a #+BEGIN_EXPORT LATEX + block or latex export snippet depending on whether the + current source block is inline or not. This is a good + option if your code block will output latex formatted + text. code ---- the results are extracted in the syntax of the source code of the language being evaluated and are added @@ -2279,10 +2280,10 @@ INFO may provide the values of these header arguments (in the (concat "#+END_" (car (org-split-string name))) nil nil (concat "{{{results(@@" name ":") "@@)}}}"))) ((member "html" result-params) - (funcall wrap "#+BEGIN_HTML" "#+END_HTML" nil nil + (funcall wrap "#+BEGIN_EXPORT html" "#+END_EXPORT" nil nil "{{{results(@@html:" "@@)}}}")) ((member "latex" result-params) - (funcall wrap "#+BEGIN_LaTeX" "#+END_LaTeX" nil nil + (funcall wrap "#+BEGIN_EXPORT latex" "#+END_EXPORT" nil nil "{{{results(@@latex:" "@@)}}}")) ((member "org" result-params) (goto-char beg) (if (org-at-table-p) (org-cycle)) diff --git a/lisp/ob-haskell.el b/lisp/ob-haskell.el index 84b1309..8d16223 100644 --- a/lisp/ob-haskell.el +++ b/lisp/ob-haskell.el @@ -177,12 +177,12 @@ constructs (header arguments, no-web syntax etc...) are ignored." (save-match-data (setq indentation (length (match-string 1)))) (replace-match (save-match-data (concat - "#+begin_latex\n\\begin{code}\n" + "#+begin_export latex\n\\begin{code}\n" (if (or preserve-indentp (string-match "-i" (match-string 2))) (match-string 3) (org-remove-indentation (match-string 3))) - "\n\\end{code}\n#+end_latex\n")) + "\n\\end{code}\n#+end_export\n")) t t) (indent-code-rigidly (match-beginning 0) (match-end 0) indentation))) (save-excursion diff --git a/lisp/org-element.el b/lisp/org-element.el index 834756e..c7d9072 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -257,17 +257,6 @@ specially in `org-element--object-lex'.") (append org-element-recursive-objects '(paragraph table-row verse-block)) "List of object or element types that can directly contain objects.") -(defvar org-element-block-name-alist - '(("CENTER" . org-element-center-block-parser) - ("COMMENT" . org-element-comment-block-parser) - ("EXAMPLE" . org-element-example-block-parser) - ("QUOTE" . org-element-quote-block-parser) - ("SRC" . org-element-src-block-parser) - ("VERSE" . org-element-verse-block-parser)) - "Alist between block names and the associated parsing function. -Names must be uppercase. Any block whose name has no association -is parsed with `org-element-special-block-parser'.") - (defconst org-element-affiliated-keywords '("CAPTION" "DATA" "HEADER" "HEADERS" "LABEL" "NAME" "PLOT" "RESNAME" "RESULT" "RESULTS" "SOURCE" "SRCNAME" "TBLNAME") @@ -1599,9 +1588,6 @@ CONTENTS is the contents of the element." ;; through the following steps: implement a parser and an interpreter, ;; tweak `org-element--current-element' so that it recognizes the new ;; type and add that new type to `org-element-all-elements'. -;; -;; As a special case, when the newly defined type is a block type, -;; `org-element-block-name-alist' has to be modified accordingly. ;;;; Babel Call @@ -1952,42 +1938,41 @@ containing `:begin', `:end', `:type', `:value', `:post-blank' and `:post-affiliated' keywords. Assume point is at export-block beginning." - (let* ((case-fold-search t) - (type (progn (looking-at "[ \t]*#\\+BEGIN_\\(\\S-+\\)") - (upcase (org-match-string-no-properties 1))))) + (let* ((case-fold-search t)) (if (not (save-excursion - (re-search-forward - (format "^[ \t]*#\\+END_%s[ \t]*$" type) limit t))) + (re-search-forward "^[ \t]*#\\+END_EXPORT[ \t]*$" limit t))) ;; Incomplete block: parse it as a paragraph. (org-element-paragraph-parser limit affiliated) - (let ((contents-end (match-beginning 0))) - (save-excursion - (let* ((begin (car affiliated)) - (post-affiliated (point)) - (contents-begin (progn (forward-line) (point))) - (pos-before-blank (progn (goto-char contents-end) - (forward-line) - (point))) - (end (progn (skip-chars-forward " \r\t\n" limit) - (if (eobp) (point) (line-beginning-position)))) - (value (buffer-substring-no-properties contents-begin - contents-end))) - (list 'export-block - (nconc - (list :begin begin - :end end - :type type - :value value - :post-blank (count-lines pos-before-blank end) - :post-affiliated post-affiliated) - (cdr affiliated))))))))) + (save-excursion + (let* ((contents-end (match-beginning 0)) + (backend (progn + (looking-at "[ \t]*#\\+BEGIN_EXPORT[ \t]+\\(\\S-+\\)") + (org-match-string-no-properties 1))) + (begin (car affiliated)) + (post-affiliated (point)) + (contents-begin (progn (forward-line) (point))) + (pos-before-blank (progn (goto-char contents-end) + (forward-line) + (point))) + (end (progn (skip-chars-forward " \r\t\n" limit) + (if (eobp) (point) (line-beginning-position)))) + (value (buffer-substring-no-properties contents-begin + contents-end))) + (list 'export-block + (nconc + (list :type backend + :begin begin + :end end + :value value + :post-blank (count-lines pos-before-blank end) + :post-affiliated post-affiliated) + (cdr affiliated)))))))) (defun org-element-export-block-interpreter (export-block _) "Interpret EXPORT-BLOCK element as Org syntax." - (let ((type (org-element-property :type export-block))) - (concat (format "#+BEGIN_%s\n" type) - (org-element-property :value export-block) - (format "#+END_%s" type)))) + (format "#+BEGIN_EXPORT %s\n%s#+END_EXPORT" + (org-element-property :type export-block) + (org-element-property :value export-block))) ;;;; Fixed-width @@ -3762,27 +3747,35 @@ element it has to parse." ;; Keywords. ((looking-at "[ \t]*#") (goto-char (match-end 0)) - (cond ((looking-at "\\(?: \\|$\\)") - (beginning-of-line) - (org-element-comment-parser limit affiliated)) - ((looking-at "\\+BEGIN_\\(\\S-+\\)") - (beginning-of-line) - (let ((parser (assoc (upcase (match-string 1)) - org-element-block-name-alist))) - (if parser (funcall (cdr parser) limit affiliated) - (org-element-special-block-parser limit affiliated)))) - ((looking-at "\\+CALL:") - (beginning-of-line) - (org-element-babel-call-parser limit affiliated)) - ((looking-at "\\+BEGIN:? ") - (beginning-of-line) - (org-element-dynamic-block-parser limit affiliated)) - ((looking-at "\\+\\S-+:") - (beginning-of-line) - (org-element-keyword-parser limit affiliated)) - (t - (beginning-of-line) - (org-element-paragraph-parser limit affiliated)))) + (cond + ((looking-at "\\(?: \\|$\\)") + (beginning-of-line) + (org-element-comment-parser limit affiliated)) + ((looking-at "\\+BEGIN_\\(\\S-+\\)") + (beginning-of-line) + (funcall (pcase (upcase (match-string 1)) + ("CENTER" #'org-element-center-block-parser) + ("COMMENT" #'org-element-comment-block-parser) + ("EXAMPLE" #'org-element-example-block-parser) + ("EXPORT" #'org-element-export-block-parser) + ("QUOTE" #'org-element-quote-block-parser) + ("SRC" #'org-element-src-block-parser) + ("VERSE" #'org-element-verse-block-parser) + (_ #'org-element-special-block-parser)) + limit + affiliated)) + ((looking-at "\\+CALL:") + (beginning-of-line) + (org-element-babel-call-parser limit affiliated)) + ((looking-at "\\+BEGIN:? ") + (beginning-of-line) + (org-element-dynamic-block-parser limit affiliated)) + ((looking-at "\\+\\S-+:") + (beginning-of-line) + (org-element-keyword-parser limit affiliated)) + (t + (beginning-of-line) + (org-element-paragraph-parser limit affiliated)))) ;; Footnote Definition. ((looking-at org-footnote-definition-re) (org-element-footnote-definition-parser limit affiliated)) diff --git a/lisp/org-footnote.el b/lisp/org-footnote.el index 759cc2e..d78e3fb 100644 --- a/lisp/org-footnote.el +++ b/lisp/org-footnote.el @@ -92,8 +92,7 @@ (org-re "^\\[\\([0-9]+\\|fn:[-_[:word:]]+\\)\\]") "Regular expression matching the definition of a footnote.") -(defconst org-footnote-forbidden-blocks - '("ascii" "beamer" "comment" "example" "html" "latex" "odt" "src") +(defconst org-footnote-forbidden-blocks '("comment" "example" "export" "src") "Names of blocks where footnotes are not allowed.") (defgroup org-footnote nil diff --git a/lisp/org-list.el b/lisp/org-list.el index 798fbb0..71a5893 100644 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -359,8 +359,7 @@ list, obtained by prompting the user." (list (symbol :tag "Major mode") (string :tag "Format")))) -(defvar org-list-forbidden-blocks '("example" "verse" "src" "ascii" "beamer" - "html" "latex" "odt") +(defvar org-list-forbidden-blocks '("example" "verse" "src" "export") "Names of blocks where lists are not allowed. Names must be in lower case.") diff --git a/lisp/org.el b/lisp/org.el index 4111084..32907d2 100755 --- a/lisp/org.el +++ b/lisp/org.el @@ -4407,8 +4407,7 @@ You need to reload Org or to restart Emacs after customizing this." (plist :tag "Face property list")) (option (const verbatim))))) -(defvar org-protecting-blocks - '("src" "example" "latex" "ascii" "html" "ditaa" "dot" "r" "R") +(defvar org-protecting-blocks '("src" "example" "export") "Blocks that contain text that is quoted, i.e. not processed as Org syntax. This is needed for font-lock setup.") @@ -5916,7 +5915,7 @@ by a #." quoting (member block-type org-protecting-blocks)) (when (re-search-forward (concat "^[ \t]*#\\+end" (match-string 4) "\\>.*") - nil t) ;; on purpose, we look further than LIMIT + nil t) ; on purpose, we look further than LIMIT (setq end (min (point-max) (match-end 0)) end1 (min (point-max) (1- (match-beginning 0)))) (setq block-end (match-beginning 0)) @@ -5932,12 +5931,14 @@ by a #." end1 (min (point-max) (1+ end)) '(face org-meta-line)) (org-remove-flyspell-overlays-in end1 end) (cond - ((and lang (not (string= lang "")) org-src-fontify-natively) + ((and (org-string-nw-p lang) + (string= block-type "src") + org-src-fontify-natively) (org-src-font-lock-fontify-block lang block-start block-end) (add-text-properties beg1 block-end '(src-block t))) (quoting (add-text-properties beg1 (min (point-max) (1+ end1)) - '(face org-block))) ; end of source block + '(face org-block))) ((not org-fontify-quote-and-verse-blocks)) ((string= block-type "quote") (add-text-properties beg1 (min (point-max) (1+ end1)) '(face org-quote))) @@ -12340,11 +12341,11 @@ keywords relative to each registered export back-end." ("v" "#+BEGIN_VERSE\n?\n#+END_VERSE") ("V" "#+BEGIN_VERBATIM\n?\n#+END_VERBATIM") ("c" "#+BEGIN_CENTER\n?\n#+END_CENTER") - ("l" "#+BEGIN_LaTeX\n?\n#+END_LaTeX") + ("l" "#+BEGIN_EXPORT latex\n?\n#+END_EXPORT") ("L" "#+LaTeX: ") - ("h" "#+BEGIN_HTML\n?\n#+END_HTML") + ("h" "#+BEGIN_EXPORT html\n?\n#+END_EXPORT") ("H" "#+HTML: ") - ("a" "#+BEGIN_ASCII\n?\n#+END_ASCII") + ("a" "#+BEGIN_EXPORT ascii\n?\n#+END_EXPORT") ("A" "#+ASCII: ") ("i" "#+INDEX: ?") ("I" "#+INCLUDE: %file ?")) diff --git a/lisp/ox-ascii.el b/lisp/ox-ascii.el index 59e311b..32e7a11 100644 --- a/lisp/ox-ascii.el +++ b/lisp/ox-ascii.el @@ -93,7 +93,6 @@ (underline . org-ascii-underline) (verbatim . org-ascii-verbatim) (verse-block . org-ascii-verse-block)) - :export-block "ASCII" :menu-entry '(?t "Export to Plain Text" ((?A "As ASCII buffer" diff --git a/lisp/ox-beamer.el b/lisp/ox-beamer.el index 6c2baaf..4f4e3db 100644 --- a/lisp/ox-beamer.el +++ b/lisp/ox-beamer.el @@ -231,7 +231,6 @@ Return overlay specification, as a string, or nil." ;;; Define Back-End (org-export-define-derived-backend 'beamer 'latex - :export-block "BEAMER" :menu-entry '(?l 1 ((?B "As LaTeX buffer (Beamer)" org-beamer-export-as-latex) diff --git a/lisp/ox-html.el b/lisp/ox-html.el index a2db938..1798acb 100644 --- a/lisp/ox-html.el +++ b/lisp/ox-html.el @@ -96,7 +96,6 @@ (underline . org-html-underline) (verbatim . org-html-verbatim) (verse-block . org-html-verse-block)) - :export-block "HTML" :filters-alist '((:filter-options . org-html-infojs-install-script) (:filter-final-output . org-html-final-function)) :menu-entry diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 297b563..6eb47db 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -90,7 +90,6 @@ ;; Pseudo objects and elements. (latex-math-block . org-latex-math-block) (latex-matrices . org-latex-matrices)) - :export-block '("LATEX" "TEX") :menu-entry '(?l "Export to LaTeX" ((?L "As LaTeX buffer" org-latex-export-as-latex) @@ -364,9 +363,9 @@ For example, when this variable is non-nil, a headline like this: :CUSTOM_ID: sec:foo :END: This is section [[#sec:foo]]. - #+BEGIN_LATEX + #+BEGIN_EXPORT latex And this is still section \\ref{sec:foo}. - #+END_LATEX + #+END_EXPORT will be exported to LaTeX as: diff --git a/lisp/ox-man.el b/lisp/ox-man.el index a5d0d49..23ad7d1 100644 --- a/lisp/ox-man.el +++ b/lisp/ox-man.el @@ -98,7 +98,6 @@ (underline . org-man-underline) (verbatim . org-man-verbatim) (verse-block . org-man-verse-block)) - :export-block "MAN" :menu-entry '(?M "Export to MAN" ((?m "As MAN file" org-man-export-to-man) diff --git a/lisp/ox-md.el b/lisp/ox-md.el index 602c149..8b28c3b 100644 --- a/lisp/ox-md.el +++ b/lisp/ox-md.el @@ -55,7 +55,6 @@ This variable can be set to either `atx' or `setext'." ;;; Define Back-End (org-export-define-derived-backend 'md 'html - :export-block '("MD" "MARKDOWN") :filters-alist '((:filter-parse-tree . org-md-separate-elements)) :menu-entry '(?m "Export to Markdown" diff --git a/lisp/ox-odt.el b/lisp/ox-odt.el index 75353a0..fcffce1 100644 --- a/lisp/ox-odt.el +++ b/lisp/ox-odt.el @@ -83,7 +83,6 @@ (underline . org-odt-underline) (verbatim . org-odt-verbatim) (verse-block . org-odt-verse-block)) - :export-block "ODT" :filters-alist '((:filter-parse-tree . (org-odt--translate-latex-fragments org-odt--translate-description-lists diff --git a/lisp/ox-texinfo.el b/lisp/ox-texinfo.el index c8c6554..b37f376 100644 --- a/lisp/ox-texinfo.el +++ b/lisp/ox-texinfo.el @@ -78,7 +78,6 @@ (timestamp . org-texinfo-timestamp) (verbatim . org-texinfo-verbatim) (verse-block . org-texinfo-verse-block)) - :export-block "TEXINFO" :filters-alist '((:filter-headline . org-texinfo--filter-section-blank-lines) (:filter-parse-tree . org-texinfo--normalize-headlines) diff --git a/lisp/ox.el b/lisp/ox.el index 80cbc37..fd74929 100644 --- a/lisp/ox.el +++ b/lisp/ox.el @@ -965,10 +965,6 @@ BACKEND is a structure with `org-export-backend' type." (let ((parent (org-export-backend-parent backend))) (when (and parent (not (org-export-get-backend parent))) (error "Cannot use unknown \"%s\" back-end as a parent" parent))) - ;; Register dedicated export blocks in the parser. - (dolist (name (org-export-backend-blocks backend)) - (add-to-list 'org-element-block-name-alist - (cons name 'org-element-export-block-parser))) ;; If a back-end with the same name as BACKEND is already ;; registered, replace it with BACKEND. Otherwise, simply add ;; BACKEND to the list of registered back-ends. @@ -1095,14 +1091,6 @@ back-end. BODY can start with pre-defined keyword arguments. The following keywords are understood: - :export-block - - String, or list of strings, representing block names that - will not be parsed. This is used to specify blocks that will - contain raw code specific to the back-end. These blocks - still have to be handled by the relative `export-block' type - translator. - :filters-alist Alist between filters and function, or list of functions, @@ -1172,23 +1160,19 @@ keywords are understood: `org-export-options-alist' for more information about structure of the values." (declare (indent 1)) - (let (blocks filters menu-entry options) + (let (filters menu-entry options) (while (keywordp (car body)) (let ((keyword (pop body))) - (cl-case keyword - (:export-block (let ((names (pop body))) - (setq blocks (if (consp names) (mapcar 'upcase names) - (list (upcase names)))))) + (pcase keyword (:filters-alist (setq filters (pop body))) (:menu-entry (setq menu-entry (pop body))) (:options-alist (setq options (pop body))) - (t (error "Unknown keyword: %s" keyword))))) + (_ (error "Unknown keyword: %s" keyword))))) (org-export-register-backend (org-export-create-backend :name backend :transcoders transcoders :options options :filters filters - :blocks blocks :menu menu-entry)))) (defun org-export-define-derived-backend (child parent &rest body) @@ -1200,14 +1184,6 @@ the parent back-end. BODY can start with pre-defined keyword arguments. The following keywords are understood: - :export-block - - String, or list of strings, representing block names that - will not be parsed. This is used to specify blocks that will - contain raw code specific to the back-end. These blocks - still have to be handled by the relative `export-block' type - translator. - :filters-alist Alist of filters that will overwrite or complete filters @@ -1244,25 +1220,21 @@ The back-end could then be called with, for example: (org-export-to-buffer \\='my-latex \"*Test my-latex*\")" (declare (indent 2)) - (let (blocks filters menu-entry options transcoders) + (let (filters menu-entry options transcoders) (while (keywordp (car body)) (let ((keyword (pop body))) - (cl-case keyword - (:export-block (let ((names (pop body))) - (setq blocks (if (consp names) (mapcar 'upcase names) - (list (upcase names)))))) + (pcase keyword (:filters-alist (setq filters (pop body))) (:menu-entry (setq menu-entry (pop body))) (:options-alist (setq options (pop body))) (:translate-alist (setq transcoders (pop body))) - (t (error "Unknown keyword: %s" keyword))))) + (_ (error "Unknown keyword: %s" keyword))))) (org-export-register-backend (org-export-create-backend :name child :parent parent :transcoders transcoders :options options :filters filters - :blocks blocks :menu menu-entry)))) @@ -3242,10 +3214,12 @@ storing and resolving footnotes. It is created automatically." value) (prog1 (match-string 1 value) (setq value (replace-match "" nil nil value))))) - (env (cond ((string-match "\\" value) - 'literal) - ((string-match "\\" value) 'literal) + ((string-match "\\" value) (match-string 1 value)))) ;; Remove keyword. - (delete-region (point) (progn (forward-line) (point))) + (delete-region (point) (line-beginning-position 2)) (cond ((not file) nil) ((not (file-readable-p file)) @@ -3276,10 +3249,8 @@ storing and resolving footnotes. It is created automatically." (cond ((eq env 'literal) (insert - (let ((ind-str (make-string ind ? )) - (arg-str (if (stringp src-args) - (format " %s" src-args) - "")) + (let ((ind-str (make-string ind ?\s)) + (arg-str (if (stringp args) (format " %s" args) "")) (contents (org-escape-code-in-string (org-export--prepare-file-contents file lines)))) @@ -3287,7 +3258,7 @@ storing and resolving footnotes. It is created automatically." ind-str block arg-str contents ind-str block)))) ((stringp block) (insert - (let ((ind-str (make-string ind ? )) + (let ((ind-str (make-string ind ?\s)) (contents (org-export--prepare-file-contents file lines))) (format "%s#+BEGIN_%s\n%s%s#+END_%s\n" diff --git a/testing/lisp/test-ob.el b/testing/lisp/test-ob.el index 508a3ed..b0643a8 100644 --- a/testing/lisp/test-ob.el +++ b/testing/lisp/test-ob.el @@ -1058,9 +1058,9 @@ content\" (ert-deftest test-ob/org-babel-remove-result--results-html () "Test `org-babel-remove-result' with :results html." (test-ob-verify-result-and-removed-result - "#+BEGIN_HTML + "#+BEGIN_EXPORT html -#+END_HTML" +#+END_EXPORT" "* org-babel-remove-result #+begin_src emacs-lisp :results html @@ -1072,11 +1072,11 @@ content\" (ert-deftest test-ob/org-babel-remove-result--results-latex () "Test `org-babel-remove-result' with :results latex." (test-ob-verify-result-and-removed-result - "#+BEGIN_LaTeX + "#+BEGIN_EXPORT latex Line 1 Line 2 Line 3 -#+END_LaTeX" +#+END_EXPORT" "* org-babel-remove-result #+begin_src emacs-lisp :results latex diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el index 89cb1bd..1abdd9d 100644 --- a/testing/lisp/test-org-element.el +++ b/testing/lisp/test-org-element.el @@ -829,31 +829,27 @@ Some other text "Test `export-block' parser." ;; Standard test. (should - (org-test-with-temp-text "#+BEGIN_LATEX\nText\n#+END_LATEX" - (org-element-map - (let ((org-element-block-name-alist - '(("LATEX" . org-element-export-block-parser)))) - (org-element-parse-buffer)) - 'export-block 'identity))) + (eq 'export-block + (org-test-with-temp-text "#+BEGIN_EXPORT LATEX\nText\n#+END_EXPORT" + (org-element-type (org-element-at-point))))) + (should + (equal "LATEX" + (org-test-with-temp-text "#+BEGIN_EXPORT LATEX\nText\n#+END_EXPORT" + (org-element-property :type (org-element-at-point))))) ;; Ignore case. (should - (let ((org-element-block-name-alist - '(("LATEX" . org-element-export-block-parser)))) - (org-test-with-temp-text "#+begin_latex\nText\n#+end_latex" - (org-element-map (org-element-parse-buffer) 'export-block 'identity)))) + (eq 'export-block + (org-test-with-temp-text "#+begin_export latex\nText\n#+end_export" + (org-element-type (org-element-at-point))))) ;; Ignore incomplete block. (should-not - (let ((org-element-block-name-alist - '(("LATEX" . org-element-export-block-parser)))) - (org-test-with-temp-text "#+BEGIN_LATEX" - (org-element-map (org-element-parse-buffer) 'export-block - 'identity nil t)))) + (eq 'export-block + (org-test-with-temp-text "#+BEGIN_EXPORT" + (org-element-type (org-element-at-point))))) ;; Handle non-empty blank line at the end of buffer. (should - (let ((org-element-block-name-alist - '(("LATEX" . org-element-export-block-parser)))) - (org-test-with-temp-text "#+BEGIN_LATEX\nC\n#+END_LATEX\n " - (= (org-element-property :end (org-element-at-point)) (point-max)))))) + (org-test-with-temp-text "#+BEGIN_EXPORT latex\nC\n#+END_EXPORT\n " + (= (org-element-property :end (org-element-at-point)) (point-max))))) ;;;; Export Snippet @@ -2638,8 +2634,8 @@ CLOCK: [2012-01-01 sun. 00:01]--[2012-01-01 sun. 00:02] => 0:01")))) (ert-deftest test-org-element/export-block-interpreter () "Test export block interpreter." (should (equal (org-test-parse-and-interpret - "#+BEGIN_HTML\nTest\n#+END_HTML") - "#+BEGIN_HTML\nTest\n#+END_HTML\n"))) + "#+BEGIN_EXPORT HTML\nTest\n#+END_EXPORT") + "#+BEGIN_EXPORT HTML\nTest\n#+END_EXPORT\n"))) (ert-deftest test-org-element/fixed-width-interpreter () "Test fixed width interpreter." diff --git a/testing/lisp/test-ox.el b/testing/lisp/test-ox.el index d619ec8..cac0adf 100644 --- a/testing/lisp/test-ox.el +++ b/testing/lisp/test-ox.el @@ -1005,10 +1005,10 @@ text ;; Inclusion within an html export-block. (should (equal - "#+BEGIN_HTML\n

HTML!

\n#+END_HTML\n" + "#+BEGIN_EXPORT html\n

HTML!

\n#+END_EXPORT\n" (org-test-with-temp-text (format - "#+INCLUDE: \"%s/examples/include.html\" HTML" + "#+INCLUDE: \"%s/examples/include.html\" EXPORT html" org-test-dir) (org-export-expand-include-keyword) (buffer-string)))) @@ -1400,15 +1400,7 @@ Footnotes[fn:2], foot[fn:test], digit only[3], and [fn:inline:anonymous footnote (org-export-define-backend 'test '((headline . my-headline-test)) :menu-entry '(?k "Test Export" test)) - (org-export-backend-menu (org-export-get-backend 'test))))) - ;; Export Blocks. - (should - (equal '(("TEST" . org-element-export-block-parser)) - (let (org-export-registered-backends org-element-block-name-alist) - (org-export-define-backend 'test - '((headline . my-headline-test)) - :export-block '("test")) - org-element-block-name-alist)))) + (org-export-backend-menu (org-export-get-backend 'test)))))) (ert-deftest test-org-export/define-derived-backend () "Test `org-export-define-derived-backend' specifications." -- 2.6.2 --=-=-=--