Bladeren bron

org-element: Define new objects (bold, code, italic, ...)

* contrib/lisp/org-e-ascii.el (org-e-ascii-option-alist): Fix typo.
(org-e-ascii-bold, org-e-ascii-code, org-e-ascii-strike-through,
org-e-ascii-underline): New functions.
(org-e-ascii-emphasis): Remove function.
* contrib/lisp/org-e-html.el (org-e-html-text-markup-alist): Variable
  renamed from `org-e-html-emphasis-alist'.  Change value type.
(org-e-html-bold, org-e-html-italic, org-e-html-strike-through,
org-e-html-underline): New functions.
(org-e-html-verbatim): Update function.
(org-e-html-emphasis): Remove function.
* contrib/lisp/org-e-latex.el (org-e-latex-text-markup-alist):
  Variable renamed from `org-e-latex-emphasis-alist'.  Change value
  type.
(org-e-latex-center-block): Fix docstring.
(org-e-latex--text-markup, org-e-latex-bold, org-e-latex-code,
org-e-latex-italic, org-e-latex-strike-through,
org-e-latex-underline): New functions.
(org-e-latex-verbatim): Update function.
(org-e-latex-emphasis): Remove function.
* contrib/lisp/org-e-odt.el (org-e-odt-bold, org-e-odt-code,
  org-e-odt-italic, org-e-odt-strike-through, org-e-odt-underline):
  New functions.
(org-e-odt-verbatim): Update function.
(org-e-odt-center-block): Fix docstring.
(org-e-odt-emphasis): Remove function.
* contrib/lisp/org-element.el (org-element-bold-parser):
(org-element-bold-interpreter, org-element-code-parser,
org-element-code-interpreter, org-element-italic-parser,
org-element-italic-interpreter, org-element-strike-through-parser,
org-element-strike-through-interpreter, org-element-underline-parser,
org-element-underline-interpreter): New functions.
(org-element-emphasis-parser, org-element-emphasis-interpreter):
Remove functions.
(org-element-verbatim-parser, org-element-verbatim-interpreter,
org-element-text-markup-successor): Update function.
(org-element-object-successor-alist): Add associations for new object
types.
(org-element-recursive-objects): Add `bold', `italic',
`strike-through' and `underline' as recursive types.
(org-element-object-restrictions): Add restrictions for new recursive
object types.
* contrib/lisp/org-export.el (org-export-filters-alist): Add filters
  for new object types.
(org-export-with-todo-keywords): Add missing keywords.
(org-export-filter-center-block-functions,
org-export-filter-drawer-functions,
org-export-filter-dynamic-block-functions,
org-export-filter-headline-functions,
org-export-filter-inlinetask-functions,
org-export-filter-plain-list-functions,
org-export-filter-item-functions, org-export-filter-comment-functions,
org-export-filter-comment-block-functions,
org-export-filter-example-block-functions,
org-export-filter-export-block-functions,
org-export-filter-fixed-width-functions,
org-export-filter-footnote-definition-functions,
org-export-filter-horizontal-rule-functions,
org-export-filter-keyword-functions,
org-export-filter-latex-environment-functions,
org-export-filter-babel-call-functions,
org-export-filter-paragraph-functions,
org-export-filter-property-drawer-functions,
org-export-filter-quote-section-functions,
org-export-filter-quote-block-functions,
org-export-filter-section-functions,
org-export-filter-special-block-functions,
org-export-filter-src-block-functions,
org-export-filter-table-functions,
org-export-filter-table-cell-functions,
org-export-filter-table-row-functions,
org-export-filter-verse-block-functions,
org-export-filter-entity-functions,
org-export-filter-export-snippet-functions,
org-export-filter-footnote-reference-functions,
org-export-filter-inline-babel-call-functions,
org-export-filter-inline-src-block-functions,
org-export-filter-latex-fragment-functions,
org-export-filter-line-break-functions,
org-export-filter-link-functions, org-export-filter-macro-functions,
org-export-filter-radio-target-functions,
org-export-filter-statistics-cookie-functions,
org-export-filter-subscript-functions,
org-export-filter-superscript-functions,
org-export-filter-target-functions,
org-export-filter-time-stamp-functions,
org-export-filter-verbatim-functions): Fix docstring.
(org-export-filter-bold-functions, org-export-filter-code-functions,
org-export-filter-italic-functions,
org-export-filter-strike-through-functions,
org-export-filter-underline-functions): New variables.
(org-export-filter-emphasis-functions): Remove variable.
* testing/lisp/test-org-element.el: Add tests.
Nicolas Goaziou 13 jaren geleden
bovenliggende
commit
b21b6ead24

+ 45 - 14
contrib/lisp/org-e-ascii.el

@@ -83,8 +83,7 @@
 ;; control blank lines separating them in output string.
 ;; control blank lines separating them in output string.
 
 
 (defconst org-e-ascii-option-alist
 (defconst org-e-ascii-option-alist
-  '((:ascii-charset nil nil org-e-ascii-charset)
-    )
+  '((:ascii-charset nil nil org-e-ascii-charset))
   "Alist between ASCII export properties and ways to set them.
   "Alist between ASCII export properties and ways to set them.
 See `org-export-option-alist' for more information on the
 See `org-export-option-alist' for more information on the
 structure or the values.")
 structure or the values.")
@@ -1000,6 +999,15 @@ charset, fall-back to S."
 ;; Babel Calls are ignored.
 ;; Babel Calls are ignored.
 
 
 
 
+;;;; Bold
+
+(defun org-e-ascii-bold (bold contents info)
+  "Transcode BOLD from Org to ASCII.
+CONTENTS is the text with bold markup.  INFO is a plist holding
+contextual information."
+  (format "*%s*" contents))
+
+
 ;;;; Center Block
 ;;;; Center Block
 
 
 (defun org-e-ascii-center-block (center-block contents info)
 (defun org-e-ascii-center-block (center-block contents info)
@@ -1010,6 +1018,15 @@ holding contextual information."
    contents (org-e-ascii--current-text-width center-block info) 'center))
    contents (org-e-ascii--current-text-width center-block info) 'center))
 
 
 
 
+;;;; Code
+
+(defun org-e-ascii-code (code contents info)
+  "Return a CODE object from Org to ASCII.
+CONTENTS is nil.  INFO is a plist holding contextual
+information."
+  (format org-e-ascii-verbatim-format (org-element-property :value code)))
+
+
 ;;;; Comment
 ;;;; Comment
 
 
 ;; Comments are ignored.
 ;; Comments are ignored.
@@ -1044,17 +1061,6 @@ holding contextual information.  See `org-export-data'."
   contents)
   contents)
 
 
 
 
-;;;; Emphasis
-
-(defun org-e-ascii-emphasis (emphasis contents info)
-  "Transcode EMPHASIS from Org to ASCII.
-CONTENTS is the contents of the emphasized text.  INFO is a plist
-holding contextual information.."
-  (let ((marker (org-element-property :marker emphasis)))
-    ;; Leave emphasis markers as-is.
-    (concat marker contents marker)))
-
-
 ;;;; Entity
 ;;;; Entity
 
 
 (defun org-e-ascii-entity (entity contents info)
 (defun org-e-ascii-entity (entity contents info)
@@ -1248,6 +1254,14 @@ holding contextual information."
 	      org-e-ascii-inner-margin)
 	      org-e-ascii-inner-margin)
 	    (org-e-ascii--current-text-width inlinetask info)))))))
 	    (org-e-ascii--current-text-width inlinetask info)))))))
 
 
+;;;; Italic
+
+(defun org-e-ascii-italic (italic contents info)
+  "Transcode italic from Org to ASCII.
+CONTENTS is the text with italic markup.  INFO is a plist holding
+contextual information."
+  (format "/%s/" contents))
+
 
 
 ;;;; Item
 ;;;; Item
 
 
@@ -1573,6 +1587,15 @@ contextual information."
     (format "_%s" contents)))
     (format "_%s" contents)))
 
 
 
 
+;;;; Strike-through
+
+(defun org-e-ascii-strike-through (strike-through contents info)
+  "Transcode STRIKE-THROUGH from Org to ASCII.
+CONTENTS is text with strike-through markup.  INFO is a plist
+holding contextual information."
+  (format "+%s+" contents))
+
+
 ;;;; Table
 ;;;; Table
 
 
 (defun org-e-ascii-table (table contents info)
 (defun org-e-ascii-table (table contents info)
@@ -1592,7 +1615,6 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
 
 
 ;;;; Table Cell
 ;;;; Table Cell
 
 
-
 (defun org-e-ascii--table-cell-width (table-cell info)
 (defun org-e-ascii--table-cell-width (table-cell info)
   "Return width of TABLE-CELL.
   "Return width of TABLE-CELL.
 
 
@@ -1709,6 +1731,15 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
   (org-element-time-stamp-interpreter time-stamp contents))
   (org-element-time-stamp-interpreter time-stamp contents))
 
 
 
 
+;;;; Underline
+
+(defun org-e-ascii-underline (underline contents info)
+  "Transcode UNDERLINE from Org to ASCII.
+CONTENTS is the text with underline markup.  INFO is a plist
+holding contextual information."
+  (format "_%s_" contents))
+
+
 ;;;; Verbatim
 ;;;; Verbatim
 
 
 (defun org-e-ascii-verbatim (verbatim contents info)
 (defun org-e-ascii-verbatim (verbatim contents info)

+ 75 - 35
contrib/lisp/org-e-html.el

@@ -863,27 +863,28 @@ order to reproduce the default set-up:
   :group 'org-export-e-html
   :group 'org-export-e-html
   :type 'function)
   :type 'function)
 
 
-;;;; Emphasis
 
 
-(defcustom org-e-html-emphasis-alist
-  '(("*" . "<b>%s</b>")
-    ("/" . "<i>%s</i>")
-    ("_" . "<span style=\"text-decoration:underline;\">%s</span>")
-    ("+" . "<del>%s</del>")
-    ("=" . "<code>%s</code>")
-    ("~" . "<code>%s</code>"))
-  "Alist of HTML expressions to convert emphasis fontifiers.
-
-The key is the character used as a marker for fontification.  The
-value is a formatting string to wrap fontified text with.
-
-Value can also be set to the following symbols: `verb' and
-`protectedtexttt'.  For the former, Org will use \"\\verb\" to
-create a format string and select a delimiter character that
-isn't in the string.  For the latter, Org will use \"\\texttt\"
-to typeset and try to protect special characters."
+;;;; Text Markup
+
+(defcustom org-e-html-text-markup-alist
+  '((bold . "<b>%s</b>")
+    (code . "<code>%s</code>")
+    (italic . "<i>%s</i>")
+    (strike-through . "<del>%s</del>")
+    (underline . "<span style=\"text-decoration:underline;\">%s</span>")
+    (verbatim . "<code>%s</code>"))
+  "Alist of HTML expressions to convert text markup
+
+The key must be a symbol among `bold', `code', `italic',
+`strike-through', `underline' and `verbatim'.  The value is
+a formatting string to wrap fontified text with.
+
+If no association can be found for a given markup, text will be
+returned as-is."
   :group 'org-export-e-html
   :group 'org-export-e-html
-  :type 'alist)
+  :type '(alist :key-type (symbol :tag "Markup type")
+		:value-type (string :tag "Format string"))
+  :options '(bold code italic strike-through underline verbatim))
 
 
 
 
 ;;;; Footnotes
 ;;;; Footnotes
@@ -1830,7 +1831,17 @@ original parsed data.  INFO is a plist holding export options."
 
 
 ;;; Transcode Functions
 ;;; Transcode Functions
 
 
-;;;; Block
+;;;; Bold
+
+(defun org-e-html-bold (bold contents info)
+  "Transcode BOLD from Org to HTML.
+CONTENTS is the text with bold markup.  INFO is a plist holding
+contextual information."
+  (format (or (cdr (assq 'bold org-e-html-text-markup-alist)) "%s")
+	  contents))
+
+
+;;;; Center Block
 
 
 (defun org-e-html-center-block (center-block contents info)
 (defun org-e-html-center-block (center-block contents info)
   "Transcode a CENTER-BLOCK element from Org to HTML.
   "Transcode a CENTER-BLOCK element from Org to HTML.
@@ -1841,6 +1852,16 @@ holding contextual information."
    (format "<div style=\"text-align: center\">\n%s</div>" contents)))
    (format "<div style=\"text-align: center\">\n%s</div>" contents)))
 
 
 
 
+;;;; Code
+
+(defun org-e-html-code (code contents info)
+  "Transcode CODE from Org to HTML.
+CONTENTS is nil.  INFO is a plist holding contextual
+information."
+  (format (or (cdr (assq 'code org-e-html-text-markup-alist)) "%s")
+	  (org-element-property :value code)))
+
+
 ;;;; Comment
 ;;;; Comment
 
 
 ;; Comments are ignored.
 ;; Comments are ignored.
@@ -1876,16 +1897,6 @@ holding contextual information.  See `org-export-data'."
   (org-e-html--wrap-label dynamic-block contents))
   (org-e-html--wrap-label dynamic-block contents))
 
 
 
 
-;;;; Emphasis
-
-(defun org-e-html-emphasis (emphasis contents info)
-  "Transcode EMPHASIS from Org to HTML.
-CONTENTS is the contents of the emphasized text.  INFO is a plist
-holding contextual information.."
-  (let* ((marker (org-element-property :marker emphasis)))
-    (format (cdr (assoc marker org-e-html-emphasis-alist)) contents)))
-
-
 ;;;; Entity
 ;;;; Entity
 
 
 (defun org-e-html-entity (entity contents info)
 (defun org-e-html-entity (entity contents info)
@@ -2154,6 +2165,15 @@ holding contextual information."
 	contents)))))
 	contents)))))
 
 
 
 
+;;;; Italic
+
+(defun org-e-html-italic (italic contents info)
+  "Transcode ITALIC from Org to HTML.
+CONTENTS is the text with italic markup.  INFO is a plist holding
+contextual information."
+  (format (or (cdr (assq 'italic org-e-html-text-markup-alist)) "%s") contents))
+
+
 ;;;; Item
 ;;;; Item
 
 
 (defun org-e-html-checkbox (checkbox)
 (defun org-e-html-checkbox (checkbox)
@@ -2731,6 +2751,16 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
     (format "<code>%s</code>" cookie-value)))
     (format "<code>%s</code>" cookie-value)))
 
 
 
 
+;;;; Strike-Through
+
+(defun org-e-html-strike-through (strike-through contents info)
+  "Transcode STRIKE-THROUGH from Org to HTML.
+CONTENTS is the text with strike-through markup.  INFO is a plist
+holding contextual information."
+  (format (or (cdr (assq 'strike-through org-e-html-text-markup-alist)) "%s")
+	  contents))
+
+
 ;;;; Subscript
 ;;;; Subscript
 
 
 (defun org-e-html-subscript (subscript contents info)
 (defun org-e-html-subscript (subscript contents info)
@@ -2923,14 +2953,24 @@ information."
 	    (format "<span class=\"timestamp\">%s</span>" value))))
 	    (format "<span class=\"timestamp\">%s</span>" value))))
 
 
 
 
+;;;; Underline
+
+(defun org-e-html-underline (underline contents info)
+  "Transcode UNDERLINE from Org to HTML.
+CONTENTS is the text with underline markup.  INFO is a plist
+holding contextual information."
+  (format (or (cdr (assq 'underline org-e-html-text-markup-alist)) "%s")
+	  contents))
+
+
 ;;;; Verbatim
 ;;;; Verbatim
 
 
 (defun org-e-html-verbatim (verbatim contents info)
 (defun org-e-html-verbatim (verbatim contents info)
-  "Transcode a VERBATIM object from Org to HTML.
-CONTENTS is nil.  INFO is a plist used as a communication
-channel."
-  (org-e-html-emphasis
-   verbatim (org-element-property :value verbatim) info))
+  "Transcode VERBATIM from Org to HTML.
+CONTENTS is nil.  INFO is a plist holding contextual
+information."
+  (format (or (cdr (assq 'verbatim org-e-html-text-markup-alist)) "%s")
+	  (org-element-property :value verbatim)))
 
 
 
 
 ;;;; Verse Block
 ;;;; Verse Block

+ 111 - 66
contrib/lisp/org-e-latex.el

@@ -290,29 +290,6 @@ order to reproduce the default set-up:
   :type 'function)
   :type 'function)
 
 
 
 
-;;;; Emphasis
-
-(defcustom org-e-latex-emphasis-alist
-  '(("*" . "\\textbf{%s}")
-    ("/" . "\\emph{%s}")
-    ("_" . "\\underline{%s}")
-    ("+" . "\\st{%s}")
-    ("=" . protectedtexttt)
-    ("~" . verb))
-  "Alist of LaTeX expressions to convert emphasis fontifiers.
-
-The key is the character used as a marker for fontification.  The
-value is a formatting string to wrap fontified text with.
-
-Value can also be set to the following symbols: `verb' and
-`protectedtexttt'.  For the former, Org will use \"\\verb\" to
-create a format string and select a delimiter character that
-isn't in the string.  For the latter, Org will use \"\\texttt\"
-to typeset and try to protect special characters."
-  :group 'org-export-e-latex
-  :type 'alist)
-
-
 ;;;; Footnotes
 ;;;; Footnotes
 
 
 (defcustom org-e-latex-footnote-separator "\\textsuperscript{,}\\,"
 (defcustom org-e-latex-footnote-separator "\\textsuperscript{,}\\,"
@@ -413,6 +390,33 @@ When nil, no transformation is made."
 	  (const :tag "No formatting")))
 	  (const :tag "No formatting")))
 
 
 
 
+;;;; Text markup
+
+(defcustom org-e-latex-text-markup-alist '((bold . "\\textbf{%s}")
+					   (code . verb)
+					   (italic . "\\emph{%s}")
+					   (strike-through . "\\st{%s}")
+					   (underline . "\\underline{%s}")
+					   (verbatim . protectedtexttt))
+  "Alist of LaTeX expressions to convert text markup.
+
+The key must be a symbol among `bold', `code', `italic',
+`strike-through', `underline' and `verbatim'.  The value is
+a formatting string to wrap fontified text with.
+
+Value can also be set to the following symbols: `verb' and
+`protectedtexttt'.  For the former, Org will use \"\\verb\" to
+create a format string and select a delimiter character that
+isn't in the string.  For the latter, Org will use \"\\texttt\"
+to typeset and try to protect special characters.
+
+If no association can be found for a given markup, text will be
+returned as-is."
+  :group 'org-export-e-latex
+  :type 'alist
+  :options '(bold code italic strike-through underline verbatim))
+
+
 ;;;; Drawers
 ;;;; Drawers
 
 
 (defcustom org-e-latex-format-drawer-function nil
 (defcustom org-e-latex-format-drawer-function nil
@@ -810,6 +814,42 @@ This function shouldn't be used for floats.  See
 	output
 	output
       (concat (format "\\label{%s}\n" label) output))))
       (concat (format "\\label{%s}\n" label) output))))
 
 
+(defun org-e-latex--text-markup (text markup)
+  "Format text depending on MARKUP text markup.
+See `org-e-latex-text-markup-alist' for details."
+  (let ((fmt (cdr (assq markup org-e-latex-text-markup-alist))))
+    (cond
+     ;; No format string: Return raw text.
+     ((not fmt) text)
+     ;; Handle the `verb' special case: Find and appropriate separator
+     ;; and use "\\verb" command.
+     ((eq 'verb fmt)
+      (let ((separator (org-e-latex--find-verb-separator text)))
+	(concat "\\verb" separator text separator)))
+     ;; Handle the `protectedtexttt' special case: Protect some
+     ;; special chars and use "\texttt{%s}" format string.
+     ((eq 'protectedtexttt fmt)
+      (let ((start 0)
+	    (trans '(("\\" . "\\textbackslash{}")
+		     ("~" . "\\textasciitilde{}")
+		     ("^" . "\\textasciicircum{}")))
+	    (rtn "")
+	    char)
+	(while (string-match "[\\{}$%&_#~^]" text)
+	  (setq char (match-string 0 text))
+	  (if (> (match-beginning 0) 0)
+	      (setq rtn (concat rtn (substring value 0 (match-beginning 0)))))
+	  (setq text (substring text (1+ (match-beginning 0))))
+	  (setq char (or (cdr (assoc char trans)) (concat "\\" char))
+		rtn (concat rtn char)))
+	(setq text (concat rtn text)
+	      fmt "\\texttt{%s}")
+	(while (string-match "--" text)
+	  (setq text (replace-match "-{}-" t t text)))
+	(format fmt text)))
+     ;; Else use format string.
+     (t (format fmt text)))))
+
 
 
 
 
 ;;; Template
 ;;; Template
@@ -901,17 +941,35 @@ holding export options."
 
 
 ;;; Transcode Functions
 ;;; Transcode Functions
 
 
-;;;; Block
+;;;; Bold
+
+(defun org-e-latex-bold (bold contents info)
+  "Transcode BOLD from Org to LaTeX.
+CONTENTS is the text with bold markup.  INFO is a plist holding
+contextual information."
+  (org-e-latex--text-markup contents 'bold))
+
+
+;;;; Center Block
 
 
 (defun org-e-latex-center-block (center-block contents info)
 (defun org-e-latex-center-block (center-block contents info)
   "Transcode a CENTER-BLOCK element from Org to LaTeX.
   "Transcode a CENTER-BLOCK element from Org to LaTeX.
-CONTENTS holds the contents of the block.  INFO is a plist
+CONTENTS holds the contents of the center block.  INFO is a plist
 holding contextual information."
 holding contextual information."
   (org-e-latex--wrap-label
   (org-e-latex--wrap-label
    center-block
    center-block
    (format "\\begin{center}\n%s\\end{center}" contents)))
    (format "\\begin{center}\n%s\\end{center}" contents)))
 
 
 
 
+;;;; Code
+
+(defun org-e-latex-code (code contents info)
+  "Transcode a CODE object from Org to LaTeX.
+CONTENTS is nil.  INFO is a plist used as a communication
+channel."
+  (org-e-latex--text-markup (org-element-property :value code) 'code))
+
+
 ;;;; Comment
 ;;;; Comment
 
 
 ;; Comments are ignored.
 ;; Comments are ignored.
@@ -947,17 +1005,6 @@ holding contextual information.  See `org-export-data'."
   (org-e-latex--wrap-label dynamic-block contents))
   (org-e-latex--wrap-label dynamic-block contents))
 
 
 
 
-;;;; Emphasis
-
-(defun org-e-latex-emphasis (emphasis contents info)
-  "Transcode EMPHASIS from Org to LaTeX.
-CONTENTS is the contents of the emphasized text.  INFO is a plist
-holding contextual information.."
-  (format (cdr (assoc (org-element-property :marker emphasis)
-		      org-e-latex-emphasis-alist))
-	  contents))
-
-
 ;;;; Entity
 ;;;; Entity
 
 
 (defun org-e-latex-entity (entity contents info)
 (defun org-e-latex-entity (entity contents info)
@@ -1267,6 +1314,15 @@ holding contextual information."
 		 full-title contents))))))
 		 full-title contents))))))
 
 
 
 
+;;;; Italic
+
+(defun org-e-latex-italic (italic contents info)
+  "Transcode ITALIC from Org to LaTeX.
+CONTENTS is the text with italic markup.  INFO is a plist holding
+contextual information."
+  (org-e-latex--text-markup contents 'italic))
+
+
 ;;;; Item
 ;;;; Item
 
 
 (defun org-e-latex-item (item contents info)
 (defun org-e-latex-item (item contents info)
@@ -1801,6 +1857,15 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
   (org-element-property :value statistics-cookie))
   (org-element-property :value statistics-cookie))
 
 
 
 
+;;;; Strike-Through
+
+(defun org-e-latex-strike-through (strike-through contents info)
+  "Transcode STRIKE-THROUGH from Org to LaTeX.
+CONTENTS is the text with strike-through markup.  INFO is a plist
+holding contextual information."
+  (org-e-latex--text-markup contents 'strike-through))
+
+
 ;;;; Subscript
 ;;;; Subscript
 
 
 (defun org-e-latex-subscript (subscript contents info)
 (defun org-e-latex-subscript (subscript contents info)
@@ -2065,42 +2130,22 @@ information."
 		   (format org-e-latex-diary-timestamp-format value))))))
 		   (format org-e-latex-diary-timestamp-format value))))))
 
 
 
 
+;;;; Underline
+
+(defun org-e-latex-underline (underline contents info)
+  "Transcode UNDERLINE from Org to LaTeX.
+CONTENTS is the text with underline markup.  INFO is a plist
+holding contextual information."
+  (org-e-latex--text-markup contents 'underline))
+
+
 ;;;; Verbatim
 ;;;; Verbatim
 
 
 (defun org-e-latex-verbatim (verbatim contents info)
 (defun org-e-latex-verbatim (verbatim contents info)
   "Transcode a VERBATIM object from Org to LaTeX.
   "Transcode a VERBATIM object from Org to LaTeX.
 CONTENTS is nil.  INFO is a plist used as a communication
 CONTENTS is nil.  INFO is a plist used as a communication
 channel."
 channel."
-  (let ((fmt (cdr (assoc (org-element-property :marker verbatim)
-			 org-e-latex-emphasis-alist)))
-	(value (org-element-property :value verbatim)))
-    (cond
-     ;; Handle the `verb' special case.
-     ((eq 'verb fmt)
-      (let ((separator (org-e-latex--find-verb-separator value)))
-	(concat "\\verb" separator value separator)))
-     ;; Handle the `protectedtexttt' special case.
-     ((eq 'protectedtexttt fmt)
-      (let ((start 0)
-	    (trans '(("\\" . "\\textbackslash{}")
-		     ("~" . "\\textasciitilde{}")
-		     ("^" . "\\textasciicircum{}")))
-	    (rtn "")
-	    char)
-	(while (string-match "[\\{}$%&_#~^]" value)
-	  (setq char (match-string 0 value))
-	  (if (> (match-beginning 0) 0)
-	      (setq rtn (concat rtn (substring value 0 (match-beginning 0)))))
-	  (setq value (substring value (1+ (match-beginning 0))))
-	  (setq char (or (cdr (assoc char trans)) (concat "\\" char))
-		rtn (concat rtn char)))
-	(setq value (concat rtn value)
-	      fmt "\\texttt{%s}")
-	(while (string-match "--" value)
-	  (setq value (replace-match "-{}-" t t value)))
-	(format fmt value)))
-     ;; Else use format string.
-     (t (format fmt value)))))
+  (org-e-latex--text-markup (org-element-property :value verbatim) 'verbatim))
 
 
 
 
 ;;;; Verse Block
 ;;;; Verse Block

+ 48 - 24
contrib/lisp/org-e-odt.el

@@ -2929,15 +2929,33 @@ original parsed data.  INFO is a plist holding export options."
 
 
 ;;; Transcode Functions
 ;;; Transcode Functions
 
 
-;;;; Block
+;;;; Bold
+
+(defun org-e-odt-bold (bold contents info)
+  "Transcode BOLD from Org to HTML.
+CONTENTS is the text with bold markup.  INFO is a plist holding
+contextual information."
+  (org-e-odt-format-fontify contents 'bold))
+
+
+;;;; Center Block
 
 
 (defun org-e-odt-center-block (center-block contents info)
 (defun org-e-odt-center-block (center-block contents info)
   "Transcode a CENTER-BLOCK element from Org to HTML.
   "Transcode a CENTER-BLOCK element from Org to HTML.
-CONTENTS holds the contents of the block.  INFO is a plist
+CONTENTS holds the contents of the center block.  INFO is a plist
 holding contextual information."
 holding contextual information."
   (org-e-odt--wrap-label center-block contents))
   (org-e-odt--wrap-label center-block contents))
 
 
 
 
+;;;; Code
+
+(defun org-e-odt-code (code contents info)
+  "Transcode a CODE object from Org to HTML.
+CONTENTS is nil.  INFO is a plist used as a communication
+channel."
+  (org-e-odt-format-fontify (org-element-property :value code) 'code))
+
+
 ;;;; Comment
 ;;;; Comment
 
 
 ;; Comments are ignored.
 ;; Comments are ignored.
@@ -2973,26 +2991,6 @@ holding contextual information.  See `org-export-data'."
   (org-e-odt--wrap-label dynamic-block contents))
   (org-e-odt--wrap-label dynamic-block contents))
 
 
 
 
-;;;; Emphasis
-
-(defun org-e-odt-emphasis (emphasis contents info)
-  "Transcode EMPHASIS from Org to HTML.
-CONTENTS is the contents of the emphasized text.  INFO is a plist
-holding contextual information.."
-  ;; (format (cdr (assoc (org-element-property :marker emphasis)
-  ;; 		      org-e-odt-emphasis-alist))
-  ;; 	  contents)
-  (org-e-odt-format-fontify
-   contents (cadr (assoc
-		   (org-element-property :marker emphasis)
-		   '(("*" bold)
-		     ("/" emphasis)
-		     ("_" underline)
-		     ("=" code)
-		     ("~" verbatim)
-		     ("+" strike))))))
-
-
 ;;;; Entity
 ;;;; Entity
 
 
 (defun org-e-odt-entity (entity contents info)
 (defun org-e-odt-entity (entity contents info)
@@ -3248,6 +3246,15 @@ holding contextual information."
 		     contents)
 		     contents)
 	     nil nil "OrgInlineTaskFrame" " style:rel-width=\"100%\""))))))
 	     nil nil "OrgInlineTaskFrame" " style:rel-width=\"100%\""))))))
 
 
+;;;; Italic
+
+(defun org-e-odt-italic (italic contents info)
+  "Transcode ITALIC from Org to HTML.
+CONTENTS is the text with italic markup.  INFO is a plist holding
+contextual information."
+  (org-e-odt-format-fontify contents 'italic))
+
+
 ;;;; Item
 ;;;; Item
 
 
 (defun org-e-odt-format-list-item (contents type checkbox
 (defun org-e-odt-format-list-item (contents type checkbox
@@ -3847,6 +3854,15 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
     (org-e-odt-format-fontify cookie-value 'code)))
     (org-e-odt-format-fontify cookie-value 'code)))
 
 
 
 
+;;;; Strike-Through
+
+(defun org-e-odt-strike-through (strike-through contents info)
+  "Transcode STRIKE-THROUGH from Org to HTML.
+CONTENTS is the text with strike-through markup.  INFO is a plist
+holding contextual information."
+  (org-e-odt-format-fontify contents 'strike))
+
+
 ;;;; Subscript
 ;;;; Subscript
 
 
 (defun org-e-odt-subscript (subscript contents info)
 (defun org-e-odt-subscript (subscript contents info)
@@ -4124,14 +4140,22 @@ information."
      "timestamp-wrapper")))
      "timestamp-wrapper")))
 
 
 
 
+;;;; Underline
+
+(defun org-e-odt-underline (underline contents info)
+  "Transcode UNDERLINE from Org to HTML.
+CONTENTS is the text with underline markup.  INFO is a plist
+holding contextual information."
+  (org-e-odt-format-fontify contents 'underline))
+
+
 ;;;; Verbatim
 ;;;; Verbatim
 
 
 (defun org-e-odt-verbatim (verbatim contents info)
 (defun org-e-odt-verbatim (verbatim contents info)
   "Transcode a VERBATIM object from Org to HTML.
   "Transcode a VERBATIM object from Org to HTML.
 CONTENTS is nil.  INFO is a plist used as a communication
 CONTENTS is nil.  INFO is a plist used as a communication
 channel."
 channel."
-  (org-e-odt-emphasis
-   verbatim (org-element-property :value verbatim) info))
+  (org-e-odt-format-fontify (org-element-property :value verbatim) 'verbatim))
 
 
 
 
 ;;;; Verse Block
 ;;;; Verse Block

+ 188 - 52
contrib/lisp/org-element.el

@@ -49,12 +49,12 @@
 ;; `verse-block' types can contain Org objects and plain text.
 ;; `verse-block' types can contain Org objects and plain text.
 ;;
 ;;
 ;; Objects are related to document's contents.  Some of them are
 ;; Objects are related to document's contents.  Some of them are
-;; recursive.  Associated types are of the following: `emphasis',
+;; recursive.  Associated types are of the following: `bold', `code',
 ;; `entity', `export-snippet', `footnote-reference',
 ;; `entity', `export-snippet', `footnote-reference',
-;; `inline-babel-call', `inline-src-block', `latex-fragment',
-;; `line-break', `link', `macro', `radio-target', `statistics-cookie',
-;; `subscript', `superscript', `table-cell', `target', `time-stamp'
-;; and `verbatim'.
+;; `inline-babel-call', `inline-src-block', `italic',
+;; `latex-fragment', `line-break', `link', `macro', `radio-target',
+;; `statistics-cookie', `strike-through', `subscript', `superscript',
+;; `table-cell', `target', `time-stamp', `underline' and `verbatim'.
 ;;
 ;;
 ;; Some elements also have special properties whose value can hold
 ;; Some elements also have special properties whose value can hold
 ;; objects themselves (i.e. an item tag or an headline name).  Such
 ;; objects themselves (i.e. an item tag or an headline name).  Such
@@ -1639,78 +1639,113 @@ CONTENTS is verse block contents."
 
 
 
 
 ;;; Objects
 ;;; Objects
-
+;;
 ;; Unlike to elements, interstices can be found between objects.
 ;; Unlike to elements, interstices can be found between objects.
 ;; That's why, along with the parser, successor functions are provided
 ;; That's why, along with the parser, successor functions are provided
-;; for each object.  Some objects share the same successor
-;; (i.e. `emphasis' and `verbatim' objects).
-
+;; for each object. Some objects share the same successor (i.e. `code'
+;; and `verbatim' objects).
+;;
 ;; A successor must accept a single argument bounding the search.  It
 ;; A successor must accept a single argument bounding the search.  It
 ;; will return either a cons cell whose CAR is the object's type, as
 ;; will return either a cons cell whose CAR is the object's type, as
 ;; a symbol, and CDR the position of its next occurrence, or nil.
 ;; a symbol, and CDR the position of its next occurrence, or nil.
-
+;;
 ;; Successors follow the naming convention:
 ;; Successors follow the naming convention:
 ;; org-element-NAME-successor, where NAME is the name of the
 ;; org-element-NAME-successor, where NAME is the name of the
 ;; successor, as defined in `org-element-all-successors'.
 ;; successor, as defined in `org-element-all-successors'.
-
+;;
 ;; Some object types (i.e. `emphasis') are recursive.  Restrictions on
 ;; Some object types (i.e. `emphasis') are recursive.  Restrictions on
 ;; object types they can contain will be specified in
 ;; object types they can contain will be specified in
 ;; `org-element-object-restrictions'.
 ;; `org-element-object-restrictions'.
-
+;;
 ;; Adding a new type of object is simple.  Implement a successor,
 ;; Adding a new type of object is simple.  Implement a successor,
 ;; a parser, and an interpreter for it, all following the naming
 ;; a parser, and an interpreter for it, all following the naming
 ;; convention.  Register type in `org-element-all-objects' and
 ;; convention.  Register type in `org-element-all-objects' and
 ;; successor in `org-element-all-successors'.  Maybe tweak
 ;; successor in `org-element-all-successors'.  Maybe tweak
 ;; restrictions about it, and that's it.
 ;; restrictions about it, and that's it.
 
 
-;;;; Emphasis
 
 
-(defun org-element-emphasis-parser ()
-  "Parse text markup object at point.
+;;;; Bold
 
 
-Return a list whose CAR is `emphasis' and CDR is a plist with
-`:marker', `:begin', `:end', `:contents-begin' and
-`:contents-end' and `:post-blank' keywords.
+(defun org-element-bold-parser ()
+  "Parse bold object at point.
 
 
-Assume point is at the first emphasis marker."
+Return a list whose CAR is `bold' and CDR is a plist with
+`:begin', `:end', `:contents-begin' and `:contents-end' and
+`:post-blank' keywords.
+
+Assume point is at the first star marker."
   (save-excursion
   (save-excursion
     (unless (bolp) (backward-char 1))
     (unless (bolp) (backward-char 1))
     (looking-at org-emph-re)
     (looking-at org-emph-re)
     (let ((begin (match-beginning 2))
     (let ((begin (match-beginning 2))
-	  (marker (org-match-string-no-properties 3))
 	  (contents-begin (match-beginning 4))
 	  (contents-begin (match-beginning 4))
 	  (contents-end (match-end 4))
 	  (contents-end (match-end 4))
 	  (post-blank (progn (goto-char (match-end 2))
 	  (post-blank (progn (goto-char (match-end 2))
 			     (skip-chars-forward " \t")))
 			     (skip-chars-forward " \t")))
 	  (end (point)))
 	  (end (point)))
-      `(emphasis
-	(:marker ,marker
-		 :begin ,begin
-		 :end ,end
-		 :contents-begin ,contents-begin
-		 :contents-end ,contents-end
-		 :post-blank ,post-blank)))))
+      `(bold
+	(:begin ,begin
+		:end ,end
+		:contents-begin ,contents-begin
+		:contents-end ,contents-end
+		:post-blank ,post-blank)))))
 
 
-(defun org-element-emphasis-interpreter (emphasis contents)
-  "Interpret EMPHASIS object as Org syntax.
+(defun org-element-bold-interpreter (bold contents)
+  "Interpret BOLD object as Org syntax.
 CONTENTS is the contents of the object."
 CONTENTS is the contents of the object."
-  (let ((marker (org-element-property :marker emphasis)))
-    (concat marker contents marker)))
+  (format "*%s*" contents))
 
 
 (defun org-element-text-markup-successor (limit)
 (defun org-element-text-markup-successor (limit)
-  "Search for the next emphasis or verbatim object.
+  "Search for the next text-markup object.
 
 
 LIMIT bounds the search.
 LIMIT bounds the search.
 
 
-Return value is a cons cell whose CAR is `emphasis' or `verbatim'
+Return value is a cons cell whose CAR is a symbol among `bold',
+`italic', `underline', `strike-through', `code' and `verbatim'
 and CDR is beginning position."
 and CDR is beginning position."
   (save-excursion
   (save-excursion
     (unless (bolp) (backward-char))
     (unless (bolp) (backward-char))
     (when (re-search-forward org-emph-re limit t)
     (when (re-search-forward org-emph-re limit t)
-      (cons (if (nth 4 (assoc (match-string 3) org-emphasis-alist))
-		'verbatim
-	      'emphasis)
-	    (match-beginning 2)))))
+      (let ((marker (match-string 3)))
+	(cons (cond
+	       ((equal marker "*") 'bold)
+	       ((equal marker "/") 'italic)
+	       ((equal marker "_") 'underline)
+	       ((equal marker "+") 'strike-through)
+	       ((equal marker "~") 'code)
+	       ((equal marker "=") 'verbatim)
+	       (t (error "Unknown marker at %d" (match-beginning 3))))
+	      (match-beginning 2))))))
+
+
+;;;; Code
+
+(defun org-element-code-parser ()
+  "Parse code object at point.
+
+Return a list whose CAR is `code' and CDR is a plist with
+`:value', `:begin', `:end' and `:post-blank' keywords.
+
+Assume point is at the first tilde marker."
+  (save-excursion
+    (unless (bolp) (backward-char 1))
+    (looking-at org-emph-re)
+    (let ((begin (match-beginning 2))
+	  (value (org-match-string-no-properties 4))
+	  (post-blank (progn (goto-char (match-end 2))
+			     (skip-chars-forward " \t")))
+	  (end (point)))
+      `(code
+	(:value ,value
+		:begin ,begin
+		:end ,end
+		:post-blank ,post-blank)))))
+
+(defun org-element-code-interpreter (code contents)
+  "Interpret CODE object as Org syntax.
+CONTENTS is nil."
+  (format "~%s~" (org-element-property :value code)))
+
 
 
 ;;;; Entity
 ;;;; Entity
 
 
@@ -2008,6 +2043,37 @@ CDR is beginning position."
     (when (re-search-forward org-babel-inline-src-block-regexp limit t)
     (when (re-search-forward org-babel-inline-src-block-regexp limit t)
       (cons 'inline-src-block (match-beginning 1)))))
       (cons 'inline-src-block (match-beginning 1)))))
 
 
+;;;; Italic
+
+(defun org-element-italic-parser ()
+  "Parse italic object at point.
+
+Return a list whose CAR is `italic' and CDR is a plist with
+`:begin', `:end', `:contents-begin' and `:contents-end' and
+`:post-blank' keywords.
+
+Assume point is at the first slash marker."
+  (save-excursion
+    (unless (bolp) (backward-char 1))
+    (looking-at org-emph-re)
+    (let ((begin (match-beginning 2))
+	  (contents-begin (match-beginning 4))
+	  (contents-end (match-end 4))
+	  (post-blank (progn (goto-char (match-end 2))
+			     (skip-chars-forward " \t")))
+	  (end (point)))
+      `(italic
+	(:begin ,begin
+		:end ,end
+		:contents-begin ,contents-begin
+		:contents-end ,contents-end
+		:post-blank ,post-blank)))))
+
+(defun org-element-italic-interpreter (italic contents)
+  "Interpret ITALIC object as Org syntax.
+CONTENTS is the contents of the object."
+  (format "/%s/" contents))
+
 
 
 ;;;; Latex Fragment
 ;;;; Latex Fragment
 
 
@@ -2325,6 +2391,38 @@ CDR is beginning position."
       (cons 'statistics-cookie (match-beginning 0)))))
       (cons 'statistics-cookie (match-beginning 0)))))
 
 
 
 
+;;;; Strike-Through
+
+(defun org-element-strike-through-parser ()
+  "Parse strike-through object at point.
+
+Return a list whose CAR is `strike-through' and CDR is a plist
+with `:begin', `:end', `:contents-begin' and `:contents-end' and
+`:post-blank' keywords.
+
+Assume point is at the first plus sign marker."
+  (save-excursion
+    (unless (bolp) (backward-char 1))
+    (looking-at org-emph-re)
+    (let ((begin (match-beginning 2))
+	  (contents-begin (match-beginning 4))
+	  (contents-end (match-end 4))
+	  (post-blank (progn (goto-char (match-end 2))
+			     (skip-chars-forward " \t")))
+	  (end (point)))
+      `(strike-through
+	(:begin ,begin
+		:end ,end
+		:contents-begin ,contents-begin
+		:contents-end ,contents-end
+		:post-blank ,post-blank)))))
+
+(defun org-element-strike-through-interpreter (strike-through contents)
+  "Interpret STRIKE-THROUGH object as Org syntax.
+CONTENTS is the contents of the object."
+  (format "+%s+" contents))
+
+
 ;;;; Subscript
 ;;;; Subscript
 
 
 (defun org-element-subscript-parser ()
 (defun org-element-subscript-parser ()
@@ -2562,37 +2660,65 @@ beginning position."
       (cons 'time-stamp (match-beginning 0)))))
       (cons 'time-stamp (match-beginning 0)))))
 
 
 
 
+;;;; Underline
+
+(defun org-element-underline-parser ()
+  "Parse underline object at point.
+
+Return a list whose CAR is `underline' and CDR is a plist with
+`:begin', `:end', `:contents-begin' and `:contents-end' and
+`:post-blank' keywords.
+
+Assume point is at the first underscore marker."
+  (save-excursion
+    (unless (bolp) (backward-char 1))
+    (looking-at org-emph-re)
+    (let ((begin (match-beginning 2))
+	  (contents-begin (match-beginning 4))
+	  (contents-end (match-end 4))
+	  (post-blank (progn (goto-char (match-end 2))
+			     (skip-chars-forward " \t")))
+	  (end (point)))
+      `(underline
+	(:begin ,begin
+		:end ,end
+		:contents-begin ,contents-begin
+		:contents-end ,contents-end
+		:post-blank ,post-blank)))))
+
+(defun org-element-underline-interpreter (underline contents)
+  "Interpret UNDERLINE object as Org syntax.
+CONTENTS is the contents of the object."
+  (format "_%s_" contents))
+
+
 ;;;; Verbatim
 ;;;; Verbatim
 
 
 (defun org-element-verbatim-parser ()
 (defun org-element-verbatim-parser ()
   "Parse verbatim object at point.
   "Parse verbatim object at point.
 
 
 Return a list whose CAR is `verbatim' and CDR is a plist with
 Return a list whose CAR is `verbatim' and CDR is a plist with
-`:marker', `:begin', `:end' and `:post-blank' keywords.
+`:value', `:begin', `:end' and `:post-blank' keywords.
 
 
-Assume point is at the first verbatim marker."
+Assume point is at the first equal sign marker."
   (save-excursion
   (save-excursion
     (unless (bolp) (backward-char 1))
     (unless (bolp) (backward-char 1))
     (looking-at org-emph-re)
     (looking-at org-emph-re)
     (let ((begin (match-beginning 2))
     (let ((begin (match-beginning 2))
-	  (marker (org-match-string-no-properties 3))
 	  (value (org-match-string-no-properties 4))
 	  (value (org-match-string-no-properties 4))
 	  (post-blank (progn (goto-char (match-end 2))
 	  (post-blank (progn (goto-char (match-end 2))
 			     (skip-chars-forward " \t")))
 			     (skip-chars-forward " \t")))
 	  (end (point)))
 	  (end (point)))
       `(verbatim
       `(verbatim
-	(:marker ,marker
-		 :begin ,begin
-		 :end ,end
-		 :value ,value
-		 :post-blank ,post-blank)))))
+	(:value ,value
+		:begin ,begin
+		:end ,end
+		:post-blank ,post-blank)))))
 
 
 (defun org-element-verbatim-interpreter (verbatim contents)
 (defun org-element-verbatim-interpreter (verbatim contents)
   "Interpret VERBATIM object as Org syntax.
   "Interpret VERBATIM object as Org syntax.
 CONTENTS is nil."
 CONTENTS is nil."
-  (let ((marker (org-element-property :marker verbatim))
-	(value (org-element-property :value verbatim)))
-    (concat marker value marker)))
+  (format "=%s=" (org-element-property :value verbatim)))
 
 
 
 
 
 
@@ -2645,7 +2771,9 @@ CONTENTS is nil."
 
 
 (defconst org-element-object-successor-alist
 (defconst org-element-object-successor-alist
   '((subscript . sub/superscript) (superscript . sub/superscript)
   '((subscript . sub/superscript) (superscript . sub/superscript)
-    (emphasis . text-markup) (verbatim . text-markup)
+    (bold . text-markup) (code . text-markup) (italic . text-markup)
+    (strike-through . text-markup) (underline . text-markup)
+    (verbatim . text-markup) (verbatim . text-markup)
     (entity . latex-or-entity) (latex-fragment . latex-or-entity))
     (entity . latex-or-entity) (latex-fragment . latex-or-entity))
   "Alist of translations between object type and successor name.
   "Alist of translations between object type and successor name.
 
 
@@ -2660,7 +2788,8 @@ regexp matching one object can also match the other object.")
   "Complete list of object types.")
   "Complete list of object types.")
 
 
 (defconst org-element-recursive-objects
 (defconst org-element-recursive-objects
-  '(emphasis link macro subscript radio-target superscript table-cell)
+  '(bold italic link macro subscript radio-target strike-through superscript
+	 table-cell underline)
   "List of recursive object types.")
   "List of recursive object types.")
 
 
 (defconst org-element-non-recursive-block-alist
 (defconst org-element-non-recursive-block-alist
@@ -2721,8 +2850,8 @@ This list is checked after translations have been applied.  See
 `org-element-keyword-translation-alist'.")
 `org-element-keyword-translation-alist'.")
 
 
 (defconst org-element-object-restrictions
 (defconst org-element-object-restrictions
-  `((emphasis entity export-snippet inline-babel-call inline-src-block link
-	      radio-target sub/superscript target text-markup time-stamp)
+  `((bold entity export-snippet inline-babel-call inline-src-block link
+	  radio-target sub/superscript target text-markup time-stamp)
     (footnote-reference entity export-snippet footnote-reference
     (footnote-reference entity export-snippet footnote-reference
 			inline-babel-call inline-src-block latex-fragment
 			inline-babel-call inline-src-block latex-fragment
 			line-break link macro radio-target sub/superscript
 			line-break link macro radio-target sub/superscript
@@ -2732,6 +2861,8 @@ This list is checked after translations have been applied.  See
 	      time-stamp)
 	      time-stamp)
     (inlinetask entity inline-babel-call inline-src-block latex-fragment link
     (inlinetask entity inline-babel-call inline-src-block latex-fragment link
 		macro radio-target sub/superscript text-markup time-stamp)
 		macro radio-target sub/superscript text-markup time-stamp)
+    (italic entity export-snippet inline-babel-call inline-src-block link
+	    radio-target sub/superscript target text-markup time-stamp)
     (item entity inline-babel-call latex-fragment macro radio-target
     (item entity inline-babel-call latex-fragment macro radio-target
 	  sub/superscript target text-markup)
 	  sub/superscript target text-markup)
     (keyword entity latex-fragment macro sub/superscript text-markup)
     (keyword entity latex-fragment macro sub/superscript text-markup)
@@ -2740,6 +2871,9 @@ This list is checked after translations have been applied.  See
     (macro macro)
     (macro macro)
     (paragraph ,@org-element-all-successors)
     (paragraph ,@org-element-all-successors)
     (radio-target entity export-snippet latex-fragment sub/superscript)
     (radio-target entity export-snippet latex-fragment sub/superscript)
+    (strike-through entity export-snippet inline-babel-call inline-src-block
+		    link radio-target sub/superscript target text-markup
+		    time-stamp)
     (subscript entity export-snippet inline-babel-call inline-src-block
     (subscript entity export-snippet inline-babel-call inline-src-block
 	       latex-fragment sub/superscript text-markup)
 	       latex-fragment sub/superscript text-markup)
     (superscript entity export-snippet inline-babel-call inline-src-block
     (superscript entity export-snippet inline-babel-call inline-src-block
@@ -2747,6 +2881,8 @@ This list is checked after translations have been applied.  See
     (table-cell entity export-snippet latex-fragment link macro radio-target
     (table-cell entity export-snippet latex-fragment link macro radio-target
 		sub/superscript target text-markup time-stamp)
 		sub/superscript target text-markup time-stamp)
     (table-row table-cell)
     (table-row table-cell)
+    (underline entity export-snippet inline-babel-call inline-src-block link
+	       radio-target sub/superscript target text-markup time-stamp)
     (verse-block entity footnote-reference inline-babel-call inline-src-block
     (verse-block entity footnote-reference inline-babel-call inline-src-block
 		 latex-fragment line-break link macro radio-target
 		 latex-fragment line-break link macro radio-target
 		 sub/superscript target text-markup time-stamp))
 		 sub/superscript target text-markup time-stamp))

+ 164 - 171
contrib/lisp/org-export.el

@@ -177,8 +177,10 @@ way they are handled must be hard-coded into
 `org-export-get-inbuffer-options' function.")
 `org-export-get-inbuffer-options' function.")
 
 
 (defconst org-export-filters-alist
 (defconst org-export-filters-alist
-  '((:filter-babel-call . org-export-filter-babel-call-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-center-block . org-export-filter-center-block-functions)
+    (:filter-code . org-export-filter-code-functions)
     (:filter-comment . org-export-filter-comment-functions)
     (:filter-comment . org-export-filter-comment-functions)
     (:filter-comment-block . org-export-filter-comment-block-functions)
     (:filter-comment-block . org-export-filter-comment-block-functions)
     (:filter-drawer . org-export-filter-drawer-functions)
     (:filter-drawer . org-export-filter-drawer-functions)
@@ -197,6 +199,7 @@ way they are handled must be hard-coded into
     (:filter-inline-babel-call . org-export-filter-inline-babel-call-functions)
     (:filter-inline-babel-call . org-export-filter-inline-babel-call-functions)
     (:filter-inline-src-block . org-export-filter-inline-src-block-functions)
     (:filter-inline-src-block . org-export-filter-inline-src-block-functions)
     (:filter-inlinetask . org-export-filter-inlinetask-functions)
     (:filter-inlinetask . org-export-filter-inlinetask-functions)
+    (:filter-italic . org-export-filter-italic-functions)
     (:filter-item . org-export-filter-item-functions)
     (:filter-item . org-export-filter-item-functions)
     (:filter-keyword . org-export-filter-keyword-functions)
     (:filter-keyword . org-export-filter-keyword-functions)
     (:filter-latex-environment . org-export-filter-latex-environment-functions)
     (:filter-latex-environment . org-export-filter-latex-environment-functions)
@@ -216,6 +219,7 @@ way they are handled must be hard-coded into
     (:filter-special-block . org-export-filter-special-block-functions)
     (:filter-special-block . org-export-filter-special-block-functions)
     (:filter-src-block . org-export-filter-src-block-functions)
     (:filter-src-block . org-export-filter-src-block-functions)
     (:filter-statistics-cookie . org-export-filter-statistics-cookie-functions)
     (:filter-statistics-cookie . org-export-filter-statistics-cookie-functions)
+    (:filter-strike-through . org-export-filter-strike-through-functions)
     (:filter-subscript . org-export-filter-subscript-functions)
     (:filter-subscript . org-export-filter-subscript-functions)
     (:filter-superscript . org-export-filter-superscript-functions)
     (:filter-superscript . org-export-filter-superscript-functions)
     (:filter-table . org-export-filter-table-functions)
     (:filter-table . org-export-filter-table-functions)
@@ -223,6 +227,7 @@ way they are handled must be hard-coded into
     (:filter-table-row . org-export-filter-table-row-functions)
     (:filter-table-row . org-export-filter-table-row-functions)
     (:filter-target . org-export-filter-target-functions)
     (:filter-target . org-export-filter-target-functions)
     (:filter-time-stamp . org-export-filter-time-stamp-functions)
     (:filter-time-stamp . org-export-filter-time-stamp-functions)
+    (:filter-underline . org-export-filter-underline-functions)
     (:filter-verbatim . org-export-filter-verbatim-functions)
     (:filter-verbatim . org-export-filter-verbatim-functions)
     (:filter-verse-block . org-export-filter-verse-block-functions))
     (:filter-verse-block . org-export-filter-verse-block-functions))
   "Alist between filters properties and initial values.
   "Alist between filters properties and initial values.
@@ -258,8 +263,9 @@ rules.")
 
 
 ;; Configuration for the masses.
 ;; Configuration for the masses.
 
 
-;; They should never be evaled directly, as their value is to be
+;; They should never be accessed directly, as their value is to be
 ;; stored in a property list (cf. `org-export-option-alist').
 ;; stored in a property list (cf. `org-export-option-alist').
+;; Back-ends will read their value from there instead.
 
 
 (defgroup org-export nil
 (defgroup org-export nil
   "Options for exporting Org mode files."
   "Options for exporting Org mode files."
@@ -583,7 +589,9 @@ e.g. \"timestamp:nil\"."
 
 
 (defcustom org-export-with-todo-keywords t
 (defcustom org-export-with-todo-keywords t
   "Non-nil means include TODO keywords in export.
   "Non-nil means include TODO keywords in export.
-When nil, remove all these keywords from the export.")
+When nil, remove all these keywords from the export."
+  :group 'org-export-general
+  :type 'boolean)
 
 
 (defcustom org-export-allow-BIND 'confirm
 (defcustom org-export-allow-BIND 'confirm
   "Non-nil means allow #+BIND to define local variable values for export.
   "Non-nil means allow #+BIND to define local variable values for export.
@@ -1697,6 +1705,7 @@ code executed, on a copy of original buffer's area being
 exported.  Visibility is the same as in the original one.  Point
 exported.  Visibility is the same as in the original one.  Point
 is left at the beginning of the new one.")
 is left at the beginning of the new one.")
 
 
+
 ;;;; Special Filters
 ;;;; Special Filters
 
 
 (defvar org-export-filter-parse-tree-functions nil
 (defvar org-export-filter-parse-tree-functions nil
@@ -1725,317 +1734,301 @@ nil.")
 
 
 (defvar org-export-filter-center-block-functions nil
 (defvar org-export-filter-center-block-functions nil
   "List of functions applied to a transcoded center block.
   "List of functions applied to a transcoded center block.
-Each filter is called with three arguments: the transcoded center
-block, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-drawer-functions nil
 (defvar org-export-filter-drawer-functions nil
   "List of functions applied to a transcoded drawer.
   "List of functions applied to a transcoded drawer.
-Each filter is called with three arguments: the transcoded
-drawer, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-dynamic-block-functions nil
 (defvar org-export-filter-dynamic-block-functions nil
   "List of functions applied to a transcoded dynamic-block.
   "List of functions applied to a transcoded dynamic-block.
-Each filter is called with three arguments: the transcoded
-dynamic-block, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-headline-functions nil
 (defvar org-export-filter-headline-functions nil
   "List of functions applied to a transcoded headline.
   "List of functions applied to a transcoded headline.
-Each filter is called with three arguments: the transcoded
-headline, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-inlinetask-functions nil
 (defvar org-export-filter-inlinetask-functions nil
   "List of functions applied to a transcoded inlinetask.
   "List of functions applied to a transcoded inlinetask.
-Each filter is called with three arguments: the transcoded
-inlinetask, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-plain-list-functions nil
 (defvar org-export-filter-plain-list-functions nil
   "List of functions applied to a transcoded plain-list.
   "List of functions applied to a transcoded plain-list.
-Each filter is called with three arguments: the transcoded
-plain-list, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-item-functions nil
 (defvar org-export-filter-item-functions nil
   "List of functions applied to a transcoded item.
   "List of functions applied to a transcoded item.
-Each filter is called with three arguments: the transcoded item,
+Each filter is called with three arguments: the transcoded data,
 as a string, the back-end, as a symbol, and the communication
 as a string, the back-end, as a symbol, and the communication
 channel, as a plist.  It must return a string or nil.")
 channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-comment-functions nil
 (defvar org-export-filter-comment-functions nil
   "List of functions applied to a transcoded comment.
   "List of functions applied to a transcoded comment.
-Each filter is called with three arguments: the transcoded
-comment, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-comment-block-functions nil
 (defvar org-export-filter-comment-block-functions nil
   "List of functions applied to a transcoded comment-comment.
   "List of functions applied to a transcoded comment-comment.
-Each filter is called with three arguments: the transcoded
-comment-block, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-example-block-functions nil
 (defvar org-export-filter-example-block-functions nil
   "List of functions applied to a transcoded example-block.
   "List of functions applied to a transcoded example-block.
-Each filter is called with three arguments: the transcoded
-example-block, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-export-block-functions nil
 (defvar org-export-filter-export-block-functions nil
   "List of functions applied to a transcoded export-block.
   "List of functions applied to a transcoded export-block.
-Each filter is called with three arguments: the transcoded
-export-block, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-fixed-width-functions nil
 (defvar org-export-filter-fixed-width-functions nil
   "List of functions applied to a transcoded fixed-width.
   "List of functions applied to a transcoded fixed-width.
-Each filter is called with three arguments: the transcoded
-fixed-width, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-footnote-definition-functions nil
 (defvar org-export-filter-footnote-definition-functions nil
   "List of functions applied to a transcoded footnote-definition.
   "List of functions applied to a transcoded footnote-definition.
-Each filter is called with three arguments: the transcoded
-footnote-definition, as a string, the back-end, as a symbol, and
-the communication channel, as a plist.  It must return a string
-or nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-horizontal-rule-functions nil
 (defvar org-export-filter-horizontal-rule-functions nil
   "List of functions applied to a transcoded horizontal-rule.
   "List of functions applied to a transcoded horizontal-rule.
-Each filter is called with three arguments: the transcoded
-horizontal-rule, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-keyword-functions nil
 (defvar org-export-filter-keyword-functions nil
   "List of functions applied to a transcoded keyword.
   "List of functions applied to a transcoded keyword.
-Each filter is called with three arguments: the transcoded
-keyword, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-latex-environment-functions nil
 (defvar org-export-filter-latex-environment-functions nil
   "List of functions applied to a transcoded latex-environment.
   "List of functions applied to a transcoded latex-environment.
-Each filter is called with three arguments: the transcoded
-latex-environment, as a string, the back-end, as a symbol, and
-the communication channel, as a plist.  It must return a string
-or nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-babel-call-functions nil
 (defvar org-export-filter-babel-call-functions nil
   "List of functions applied to a transcoded babel-call.
   "List of functions applied to a transcoded babel-call.
-Each filter is called with three arguments: the transcoded
-babel-call, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-paragraph-functions nil
 (defvar org-export-filter-paragraph-functions nil
   "List of functions applied to a transcoded paragraph.
   "List of functions applied to a transcoded paragraph.
-Each filter is called with three arguments: the transcoded
-paragraph, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-property-drawer-functions nil
 (defvar org-export-filter-property-drawer-functions nil
   "List of functions applied to a transcoded property-drawer.
   "List of functions applied to a transcoded property-drawer.
-Each filter is called with three arguments: the transcoded
-property-drawer, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-quote-block-functions nil
 (defvar org-export-filter-quote-block-functions nil
   "List of functions applied to a transcoded quote block.
   "List of functions applied to a transcoded quote block.
 Each filter is called with three arguments: the transcoded quote
 Each filter is called with three arguments: the transcoded quote
-block, as a string, the back-end, as a symbol, and the
+data, as a string, the back-end, as a symbol, and the
 communication channel, as a plist.  It must return a string or
 communication channel, as a plist.  It must return a string or
 nil.")
 nil.")
 
 
 (defvar org-export-filter-quote-section-functions nil
 (defvar org-export-filter-quote-section-functions nil
   "List of functions applied to a transcoded quote-section.
   "List of functions applied to a transcoded quote-section.
-Each filter is called with three arguments: the transcoded
-quote-section, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-section-functions nil
 (defvar org-export-filter-section-functions nil
   "List of functions applied to a transcoded section.
   "List of functions applied to a transcoded section.
-Each filter is called with three arguments: the transcoded
-section, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-special-block-functions nil
 (defvar org-export-filter-special-block-functions nil
   "List of functions applied to a transcoded special block.
   "List of functions applied to a transcoded special block.
-Each filter is called with three arguments: the transcoded
-special block, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-src-block-functions nil
 (defvar org-export-filter-src-block-functions nil
   "List of functions applied to a transcoded src-block.
   "List of functions applied to a transcoded src-block.
-Each filter is called with three arguments: the transcoded
-src-block, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-table-functions nil
 (defvar org-export-filter-table-functions nil
   "List of functions applied to a transcoded table.
   "List of functions applied to a transcoded table.
-Each filter is called with three arguments: the transcoded table,
+Each filter is called with three arguments: the transcoded data,
 as a string, the back-end, as a symbol, and the communication
 as a string, the back-end, as a symbol, and the communication
 channel, as a plist.  It must return a string or nil.")
 channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-table-cell-functions nil
 (defvar org-export-filter-table-cell-functions nil
   "List of functions applied to a transcoded table-cell.
   "List of functions applied to a transcoded table-cell.
-Each filter is called with three arguments: the transcoded
-table-cell, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-table-row-functions nil
 (defvar org-export-filter-table-row-functions nil
   "List of functions applied to a transcoded table-row.
   "List of functions applied to a transcoded table-row.
-Each filter is called with three arguments: the transcoded
-table-row, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-verse-block-functions nil
 (defvar org-export-filter-verse-block-functions nil
   "List of functions applied to a transcoded verse block.
   "List of functions applied to a transcoded verse block.
-Each filter is called with three arguments: the transcoded verse
-block, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 
 
 ;;;; Objects Filters
 ;;;; Objects Filters
 
 
-(defvar org-export-filter-emphasis-functions nil
-  "List of functions applied to a transcoded emphasis.
-Each filter is called with three arguments: the transcoded
-emphasis, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+(defvar org-export-filter-bold-functions nil
+  "List of functions applied to transcoded bold text.
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
+
+(defvar org-export-filter-code-functions nil
+  "List of functions applied to transcoded code text.
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-entity-functions nil
 (defvar org-export-filter-entity-functions nil
   "List of functions applied to a transcoded entity.
   "List of functions applied to a transcoded entity.
-Each filter is called with three arguments: the transcoded
-entity, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-export-snippet-functions nil
 (defvar org-export-filter-export-snippet-functions nil
   "List of functions applied to a transcoded export-snippet.
   "List of functions applied to a transcoded export-snippet.
-Each filter is called with three arguments: the transcoded
-export-snippet, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-footnote-reference-functions nil
 (defvar org-export-filter-footnote-reference-functions nil
   "List of functions applied to a transcoded footnote-reference.
   "List of functions applied to a transcoded footnote-reference.
-Each filter is called with three arguments: the transcoded
-footnote-reference, as a string, the back-end, as a symbol, and
-the communication channel, as a plist.  It must return a string
-or nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-inline-babel-call-functions nil
 (defvar org-export-filter-inline-babel-call-functions nil
   "List of functions applied to a transcoded inline-babel-call.
   "List of functions applied to a transcoded inline-babel-call.
-Each filter is called with three arguments: the transcoded
-inline-babel-call, as a string, the back-end, as a symbol, and
-the communication channel, as a plist.  It must return a string
-or nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-inline-src-block-functions nil
 (defvar org-export-filter-inline-src-block-functions nil
   "List of functions applied to a transcoded inline-src-block.
   "List of functions applied to a transcoded inline-src-block.
-Each filter is called with three arguments: the transcoded
-inline-src-block, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
+
+(defvar org-export-filter-italic-functions nil
+  "List of functions applied to transcoded italic text.
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-latex-fragment-functions nil
 (defvar org-export-filter-latex-fragment-functions nil
   "List of functions applied to a transcoded latex-fragment.
   "List of functions applied to a transcoded latex-fragment.
-Each filter is called with three arguments: the transcoded
-latex-fragment, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-line-break-functions nil
 (defvar org-export-filter-line-break-functions nil
   "List of functions applied to a transcoded line-break.
   "List of functions applied to a transcoded line-break.
-Each filter is called with three arguments: the transcoded
-line-break, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-link-functions nil
 (defvar org-export-filter-link-functions nil
   "List of functions applied to a transcoded link.
   "List of functions applied to a transcoded link.
-Each filter is called with three arguments: the transcoded link,
+Each filter is called with three arguments: the transcoded data,
 as a string, the back-end, as a symbol, and the communication
 as a string, the back-end, as a symbol, and the communication
 channel, as a plist.  It must return a string or nil.")
 channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-macro-functions nil
 (defvar org-export-filter-macro-functions nil
   "List of functions applied to a transcoded macro.
   "List of functions applied to a transcoded macro.
-Each filter is called with three arguments: the transcoded macro,
+Each filter is called with three arguments: the transcoded data,
 as a string, the back-end, as a symbol, and the communication
 as a string, the back-end, as a symbol, and the communication
 channel, as a plist.  It must return a string or nil.")
 channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-radio-target-functions nil
 (defvar org-export-filter-radio-target-functions nil
   "List of functions applied to a transcoded radio-target.
   "List of functions applied to a transcoded radio-target.
-Each filter is called with three arguments: the transcoded
-radio-target, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-statistics-cookie-functions nil
 (defvar org-export-filter-statistics-cookie-functions nil
   "List of functions applied to a transcoded statistics-cookie.
   "List of functions applied to a transcoded statistics-cookie.
-Each filter is called with three arguments: the transcoded
-statistics-cookie, as a string, the back-end, as a symbol, and
-the communication channel, as a plist.  It must return a string
-or nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
+
+(defvar org-export-filter-strike-through-functions nil
+  "List of functions applied to transcoded strike-through text.
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-subscript-functions nil
 (defvar org-export-filter-subscript-functions nil
   "List of functions applied to a transcoded subscript.
   "List of functions applied to a transcoded subscript.
-Each filter is called with three arguments: the transcoded
-subscript, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-superscript-functions nil
 (defvar org-export-filter-superscript-functions nil
   "List of functions applied to a transcoded superscript.
   "List of functions applied to a transcoded superscript.
-Each filter is called with three arguments: the transcoded
-superscript, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-target-functions nil
 (defvar org-export-filter-target-functions nil
   "List of functions applied to a transcoded target.
   "List of functions applied to a transcoded target.
-Each filter is called with three arguments: the transcoded
-target, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-time-stamp-functions nil
 (defvar org-export-filter-time-stamp-functions nil
   "List of functions applied to a transcoded time-stamp.
   "List of functions applied to a transcoded time-stamp.
-Each filter is called with three arguments: the transcoded
-time-stamp, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
+
+(defvar org-export-filter-underline-functions nil
+  "List of functions applied to transcoded underline text.
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defvar org-export-filter-verbatim-functions nil
 (defvar org-export-filter-verbatim-functions nil
-  "List of functions applied to a transcoded verbatim.
-Each filter is called with three arguments: the transcoded
-verbatim, as a string, the back-end, as a symbol, and the
-communication channel, as a plist.  It must return a string or
-nil.")
+  "List of functions applied to transcoded verbatim text.
+Each filter is called with three arguments: the transcoded data,
+as a string, the back-end, as a symbol, and the communication
+channel, as a plist.  It must return a string or nil.")
 
 
 (defun org-export-filter-apply-functions (filters value info)
 (defun org-export-filter-apply-functions (filters value info)
   "Call every function in FILTERS.
   "Call every function in FILTERS.

+ 26 - 2
testing/lisp/test-org-element.el

@@ -650,6 +650,14 @@ Paragraph \\alpha."
    (equal (org-test-parse-and-interpret "#+BEGIN_VERSE\nTest\n#+END_VERSE")
    (equal (org-test-parse-and-interpret "#+BEGIN_VERSE\nTest\n#+END_VERSE")
 	  "#+BEGIN_VERSE\nTest\n#+END_VERSE\n")))
 	  "#+BEGIN_VERSE\nTest\n#+END_VERSE\n")))
 
 
+(ert-deftest test-org-element/bold-interpreter ()
+  "Test bold interpreter."
+  (should (equal (org-test-parse-and-interpret "*text*") "*text*\n")))
+
+(ert-deftest test-org-element/code-interpreter ()
+  "Test code interpreter."
+  (should (equal (org-test-parse-and-interpret "~text~") "~text~\n")))
+
 (ert-deftest test-org-element/entity-interpreter ()
 (ert-deftest test-org-element/entity-interpreter ()
   "Test entity interpreter."
   "Test entity interpreter."
   ;; 1. Without brackets.
   ;; 1. Without brackets.
@@ -702,6 +710,10 @@ Paragraph \\alpha."
 		  "src_emacs-lisp[:results silent]{(+ 1 1)}")
 		  "src_emacs-lisp[:results silent]{(+ 1 1)}")
 		 "src_emacs-lisp[:results silent]{(+ 1 1)}\n")))
 		 "src_emacs-lisp[:results silent]{(+ 1 1)}\n")))
 
 
+(ert-deftest test-org-element/italic-interpreter ()
+  "Test italic interpreter."
+  (should (equal (org-test-parse-and-interpret "/text/") "/text/\n")))
+
 (ert-deftest test-org-element/latex-fragment-interpreter ()
 (ert-deftest test-org-element/latex-fragment-interpreter ()
   "Test latex fragment interpreter."
   "Test latex fragment interpreter."
   (let ((org-latex-regexps
   (let ((org-latex-regexps
@@ -772,6 +784,10 @@ Paragraph \\alpha."
   ;; 2. With percent.
   ;; 2. With percent.
   (should (equal (org-test-parse-and-interpret "[66%]") "[66%]\n")))
   (should (equal (org-test-parse-and-interpret "[66%]") "[66%]\n")))
 
 
+(ert-deftest test-org-element/strike-through-interpreter ()
+  "Test strike through interpreter."
+  (should (equal (org-test-parse-and-interpret "+target+") "+target+\n")))
+
 (ert-deftest test-org-element/subscript-interpreter ()
 (ert-deftest test-org-element/subscript-interpreter ()
   "Test subscript interpreter."
   "Test subscript interpreter."
   ;; 1. Without brackets.
   ;; 1. Without brackets.
@@ -790,6 +806,14 @@ Paragraph \\alpha."
   "Test target interpreter."
   "Test target interpreter."
   (should (equal (org-test-parse-and-interpret "<<target>>") "<<target>>\n")))
   (should (equal (org-test-parse-and-interpret "<<target>>") "<<target>>\n")))
 
 
+(ert-deftest test-org-element/underline-interpreter ()
+  "Test underline interpreter."
+  (should (equal (org-test-parse-and-interpret "_text_") "_text_\n")))
+
+(ert-deftest test-org-element/verbatim-interpreter ()
+  "Test verbatim interpreter."
+  (should (equal (org-test-parse-and-interpret "=text=") "=text=\n")))
+
 
 
 
 
 ;;;; Normalize contents
 ;;;; Normalize contents
@@ -820,8 +844,8 @@ Paragraph \\alpha."
   (should
   (should
    (equal
    (equal
     (org-element-normalize-contents
     (org-element-normalize-contents
-     '(paragraph nil "  Two spaces " (emphasis nil " and\n One space")))
-    '(paragraph nil " Two spaces " (emphasis nil " and\nOne space"))))
+     '(paragraph nil "  Two spaces " (bold nil " and\n One space")))
+    '(paragraph nil " Two spaces " (bold nil " and\nOne space"))))
   ;; 5. When optional argument is provided, ignore first line
   ;; 5. When optional argument is provided, ignore first line
   ;;    indentation.
   ;;    indentation.
   (should
   (should