#+DESCRIPTION: Dummy Filters for Orgmode Exporter #+AUTHOR: Charles C. Berry #+DATE: 05 Feb 2013 #+BEGIN_COMMENT Copyright (C) 2013 Charles C. Berry This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. For a copy of the GNU General Public License, see . #+END_COMMENT * Marking Up Elements to be Exported ** Filters in the Exporter The exporter in =ox.el= has more than 50 elements that can be filtered. Developers can write filters for new backends, and users can write filters to customize output to thier individual needs. ** Understanding Elements and Filters Figuring out how to craft a filter to customize output requires detailed knowledge of what the elements are and how they are rendered by a backend. It can be fairly difficult to sort this out and keep it all in mind by just reading the code. One way to understand an element and the markup applied to it by an export backend is to write a filter that will mark the element. For example, the function #+BEGIN_SRC emacs-lisp (defun ox-mrkup-filter-bold (text back-end info) "Markup TEXT as TEXT. Ignore BACK-END and INFO." (format "%s" text)) #+END_SRC will show a bold element inside the tags ~~ and ~~. Using that filter with the latex backend will render #+begin_src org This text should be in *BOLD*. #+end_src as : This text should be in \textbf{BOLD}. ** A Complete Set of Filter Functions Here is a complete set of filter functions to provide markup tags. #+begin_src emacs-lisp (defun ox-mrkup-filter-bold (text back-end info) "Markup TEXT as TEXT. Ignore BACK-END and INFO." (format "%s" text)) (defun ox-mrkup-filter-babel-call (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-center-block (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-clock (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-code (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-comment (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-comment-block (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-diary-sexp (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-drawer (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-dynamic-block (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-entity (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-example-block (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-export-block (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-export-snippet (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-final-output (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-fixed-width (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-footnote-definition (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-footnote-reference (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-headline (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-horizontal-rule (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-inline-babel-call (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-inline-src-block (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-inlinetask (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-italic (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-item (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-keyword (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-latex-environment (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-latex-fragment (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-line-break (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-link (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-macro (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-node-property (text back-end info) (format "%s" text)) ;; dont (defun ox-mrkup-filter-options ...) (defun ox-mrkup-filter-paragraph (text back-end info) (format "%s" text)) ;; dont (defun ox-mrkup-filter-parse-tree ...) (defun ox-mrkup-filter-plain-list (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-plain-text (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-planning (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-property-drawer (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-quote-block (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-quote-section (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-radio-target (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-section (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-special-block (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-src-block (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-statistics-cookie (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-strike-through (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-subscript (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-superscript (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-table (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-table-cell (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-table-row (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-target (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-timestamp (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-underline (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-verbatim (text back-end info) (format "%s" text)) (defun ox-mrkup-filter-verse-block (text back-end info) (format "%s" text)) #+end_src #+RESULTS: : ox-mrkup-filter-verse-block ** A LaTeX Backend Example Here is a derived backend that will use those tags. This backend takes ~latex~ as its parent, but other backends could be used as well. It is called ~latex2~ and can be used like this: : M-: (org-export-to-buffer 'latex2 "latex-buffer-marked") or : M-: (org-export-to-file 'latex2 "latex-file-marked.tex") For many purposes only a subset of these might be needed. So the code could be editted to purpose. #+begin_src emacs-lisp (require 'ox-latex) (org-export-define-derived-backend 'latex2 'latex :filters-alist '((:filter-bold . ox-mrkup-filter-bold) (:filter-babel-call . ox-mrkup-filter-babel-call) (:filter-center-block . ox-mrkup-filter-center-block) (:filter-clock . ox-mrkup-filter-clock) (:filter-code . ox-mrkup-filter-code) (:filter-comment . ox-mrkup-filter-comment) (:filter-comment-block . ox-mrkup-filter-comment-block) (:filter-diary-sexp . ox-mrkup-filter-diary-sexp) (:filter-drawer . ox-mrkup-filter-drawer) (:filter-dynamic-block . ox-mrkup-filter-dynamic-block) (:filter-entity . ox-mrkup-filter-entity) (:filter-example-block . ox-mrkup-filter-example-block) (:filter-export-block . ox-mrkup-filter-export-block) (:filter-export-snippet . ox-mrkup-filter-export-snippet) (:filter-final-output . ox-mrkup-filter-final-output) (:filter-fixed-width . ox-mrkup-filter-fixed-width) (:filter-footnote-definition . ox-mrkup-filter-footnote-definition) (:filter-footnote-reference . ox-mrkup-filter-footnote-reference) (:filter-headline . ox-mrkup-filter-headline) (:filter-horizontal-rule . ox-mrkup-filter-horizontal-rule) (:filter-inline-babel-call . ox-mrkup-filter-inline-babel-call) (:filter-inline-src-block . ox-mrkup-filter-inline-src-block) (:filter-inlinetask . ox-mrkup-filter-inlinetask) (:filter-italic . ox-mrkup-filter-italic) (:filter-item . ox-mrkup-filter-item) (:filter-keyword . ox-mrkup-filter-keyword) (:filter-latex-environment . ox-mrkup-filter-latex-environment) (:filter-latex-fragment . ox-mrkup-filter-latex-fragment) (:filter-line-break . ox-mrkup-filter-line-break) (:filter-link . ox-mrkup-filter-link) (:filter-macro . ox-mrkup-filter-macro) (:filter-node-property . ox-mrkup-filter-node-property) ;; omit filter with different args ;; (:filter-options . ox-mrkup-filter-options) (:filter-paragraph . ox-mrkup-filter-paragraph) ;; omit filter with different args ;; (:filter-parse-tree . ox-mrkup-filter-parse-tree) (:filter-plain-list . ox-mrkup-filter-plain-list) (:filter-plain-text . ox-mrkup-filter-plain-text) (:filter-planning . ox-mrkup-filter-planning) (:filter-property-drawer . ox-mrkup-filter-property-drawer) (:filter-quote-block . ox-mrkup-filter-quote-block) (:filter-quote-section . ox-mrkup-filter-quote-section) (:filter-radio-target . ox-mrkup-filter-radio-target) (:filter-section . ox-mrkup-filter-section) (:filter-special-block . ox-mrkup-filter-special-block) (:filter-src-block . ox-mrkup-filter-src-block) (:filter-statistics-cookie . ox-mrkup-filter-statistics-cookie) (:filter-strike-through . ox-mrkup-filter-strike-through) (:filter-subscript . ox-mrkup-filter-subscript) (:filter-superscript . ox-mrkup-filter-superscript) (:filter-table . ox-mrkup-filter-table) (:filter-table-cell . ox-mrkup-filter-table-cell) (:filter-table-row . ox-mrkup-filter-table-row) (:filter-target . ox-mrkup-filter-target) (:filter-timestamp . ox-mrkup-filter-timestamp) (:filter-underline . ox-mrkup-filter-underline) (:filter-verbatim . ox-mrkup-filter-verbatim) (:filter-verse-block . ox-mrkup-filter-verse-block))) #+END_SRC ** Options for Adding Filters Users can add filter functions to the lists in ~org-export-filters-alist~ and subsequent exports will apply those functions accordingly. Alternatively, writing a derived backend in which the ~:filters-alist~ contains an entry such as: : (:filter-bold . ox-mrkup-filter-bold) will result in bold elements being filterd through that function. The advantage of using a derived backend to experiment with filters is that ~org-export-filters-alist~ is not filled with functions that will need to be removed once the experiments have ended.