Browse Source

ox: Implement body filter

* lisp/ox.el (org-export-filters-alist): Add body filter.
(org-export-filter-body-functions): New variable.
(org-export-as): Call body filter.

* doc/org.texi (Advanced configuration):
* etc/ORG-NEWS (argument): Document new filter.
Nicolas Goaziou 10 years ago
parent
commit
c235bd83d2
3 changed files with 61 additions and 43 deletions
  1. 38 38
      doc/org.texi
  2. 3 0
      etc/ORG-NEWS
  3. 20 5
      lisp/ox.el

+ 38 - 38
doc/org.texi

@@ -13424,63 +13424,63 @@ are all named after the same scheme: @code{org-export-filter-TYPE-functions},
 where @code{TYPE} is the type targeted by the filter.  Valid types are:
 
 @multitable @columnfractions .33 .33 .33
-@item bold
+@item body
+@tab bold
 @tab babel-call
-@tab center-block
-@item clock
+@item center-block
+@tab clock
 @tab code
-@tab comment
-@item comment-block
+@item comment
+@tab comment-block
 @tab diary-sexp
-@tab drawer
-@item dynamic-block
+@item drawer
+@tab dynamic-block
 @tab entity
-@tab example-block
-@item export-block
+@item example-block
+@tab export-block
 @tab export-snippet
-@tab final-output
-@item fixed-width
+@item final-output
+@tab fixed-width
 @tab footnote-definition
-@tab footnote-reference
-@item headline
+@item footnote-reference
+@tab headline
 @tab horizontal-rule
-@tab inline-babel-call
-@item inline-src-block
+@item inline-babel-call
+@tab inline-src-block
 @tab inlinetask
-@tab italic
-@item item
+@item italic
+@tab item
 @tab keyword
-@tab latex-environment
-@item latex-fragment
+@item latex-environment
+@tab latex-fragment
 @tab line-break
-@tab link
-@item node-property
+@item link
+@tab node-property
 @tab options
-@tab paragraph
-@item parse-tree
+@item paragraph
+@tab parse-tree
 @tab plain-list
-@tab plain-text
-@item planning
+@item plain-text
+@tab planning
 @tab property-drawer
-@tab quote-block
-@item quote-section
+@item quote-block
+@tab quote-section
 @tab radio-target
-@tab section
-@item special-block
+@item section
+@tab special-block
 @tab src-block
-@tab statistics-cookie
-@item strike-through
+@item statistics-cookie
+@tab strike-through
 @tab subscript
-@tab superscript
-@item table
+@item superscript
+@tab table
 @tab table-cell
-@tab table-row
-@item target
+@item table-row
+@tab target
 @tab timestamp
-@tab underline
-@item verbatim
+@item underline
+@tab verbatim
 @tab verse-block
-@tab
 @end multitable
 
 For example, the following snippet allows me to use non-breaking spaces in

+ 3 - 0
etc/ORG-NEWS

@@ -111,6 +111,9 @@ in the output, depending on the parameters.
 *** Extend ~org-export-first-sibling-p~ and ~org-export-last-sibling-p~
 These functions now support any element or object, not only headlines.
 *** New function: ~org-export-table-row-in-header-p~
+*** New filter: ~org-export-filter-body-functions~
+Functions in this filter are applied on the body of the exported
+document, befor wrapping it within the template.
 ** Miscellaneous
 *** File names in links accept are now compatible with URI syntax
 Absolute file names can now start with =///= in addition to =/=. E.g.,

+ 20 - 5
lisp/ox.el

@@ -176,7 +176,8 @@ way they are handled must be hard-coded into
 `org-export--get-inbuffer-options' function.")
 
 (defconst org-export-filters-alist
-  '((:filter-bold . org-export-filter-bold-functions)
+  '((:filter-body . org-export-filter-body-functions)
+    (:filter-bold . org-export-filter-bold-functions)
     (:filter-babel-call . org-export-filter-babel-call-functions)
     (:filter-center-block . org-export-filter-center-block-functions)
     (:filter-clock . org-export-filter-clock-functions)
@@ -2447,9 +2448,13 @@ Any element in `:ignore-list' will be skipped when using
 ;;   tree.  Users can set it through
 ;;   `org-export-filter-parse-tree-functions' variable.
 ;;
+;; - `:filter-body' applies to the body of the output, before template
+;;   translator chimes in.  Users can set it through
+;;   `org-export-filter-body-functions' variable.
+;;
 ;; - `:filter-final-output' applies to the final transcoded string.
 ;;   Users can set it with `org-export-filter-final-output-functions'
-;;   variable
+;;   variable.
 ;;
 ;; - `:filter-plain-text' applies to any string not recognized as Org
 ;;   syntax.  `org-export-filter-plain-text-functions' allows users to
@@ -2457,7 +2462,7 @@ Any element in `:ignore-list' will be skipped when using
 ;;
 ;; - `:filter-TYPE' applies on the string returned after an element or
 ;;   object of type TYPE has been transcoded.  A user can modify
-;;   `org-export-filter-TYPE-functions'
+;;   `org-export-filter-TYPE-functions' to install these filters.
 ;;
 ;; All filters sets are applied with
 ;; `org-export-filter-apply-functions' function.  Filters in a set are
@@ -2520,6 +2525,13 @@ contains no Org syntax, the back-end, as a symbol, and the
 communication channel, as a plist.  It must return a string or
 nil.")
 
+(defvar org-export-filter-body-functions nil
+  "List of functions applied to transcoded body.
+Each filter is called with three arguments: a string which
+contains no Org syntax, the back-end, as a symbol, and the
+communication channel, as a plist.  It must return a string or
+nil.")
+
 (defvar org-export-filter-final-output-functions nil
   "List of functions applied to the transcoded string.
 Each filter is called with three arguments: the full transcoded
@@ -3142,8 +3154,11 @@ Return code as a string."
 		       (or (org-export-data tree info) "")))
 		(inner-template (cdr (assq 'inner-template
 					   (plist-get info :translate-alist))))
-		(full-body (if (not (functionp inner-template)) body
-			     (funcall inner-template body info)))
+		(full-body (org-export-filter-apply-functions
+			    (plist-get info :filter-body)
+			    (if (not (functionp inner-template)) body
+			      (funcall inner-template body info))
+			    info))
 		(template (cdr (assq 'template
 				     (plist-get info :translate-alist)))))
 	   ;; Remove all text properties since they cannot be