diff --git a/Makefile b/Makefile
index 1156bcbe2..41fa61d0c 100644
--- a/Makefile
+++ b/Makefile
@@ -72,6 +72,7 @@ LISPF = org.el \
org-compat.el \
org-exp.el \
org-export-latex.el \
+ org-docbook.el \
org-faces.el \
org-footnote.el \
org-gnus.el \
@@ -323,6 +324,7 @@ lisp/org-colview-xemacs.elc: lisp/org.el
lisp/org-compat.elc: lisp/org-macs.el
lisp/org-exp.elc: lisp/org.el lisp/org-agenda.el
lisp/org-export-latex.elc: lisp/org.el lisp/org-exp.el
+lisp/org-docbook.elc: lisp/org.el lisp/org-exp.el
lisp/org-faces.elc: lisp/org-macs.el lisp/org-compat.el
lisp/org-footnotes.elc: lisp/org-macs.el lisp/org-compat.el
lisp/org-gnus.elc: lisp/org.el
diff --git a/doc/org.texi b/doc/org.texi
index 7f4162850..6372d8c11 100644
--- a/doc/org.texi
+++ b/doc/org.texi
@@ -296,7 +296,7 @@ Exporting
* ASCII export:: Exporting to plain ASCII
* HTML export:: Exporting to HTML
* LaTeX and PDF export:: Exporting to LaTeX, and processing to PDF
-* Docbook export:: Exporting to Docbook
+* DocBook export:: Exporting to DocBook
* XOXO export:: Exporting to XOXO
* iCalendar export:: Exporting in iCalendar format
@@ -337,6 +337,15 @@ LaTeX and PDF export
* Tables in LaTeX export:: Options for exporting tables to LaTeX
* Images in LaTeX export:: How to insert figures into LaTeX output
+DocBook export
+
+* DocBook export commands:: How to invoke DocBook export
+* Quoting DocBook code:: Incorporating DocBook code in Org files
+* Recursive sections:: Recursive sections in DocBook
+* Tables in DocBook export:: Tables are exported as HTML tables
+* Images in DocBook export:: How to insert figures into DocBook output
+* Special characters:: How to handle special characters
+
Publishing
* Configuration:: Defining projects
@@ -7743,15 +7752,16 @@ is normal.
@cindex exporting
Org mode documents can be exported into a variety of other formats. For
-printing and sharing of notes, ASCII export produces a readable and
-simple version of an Org file. HTML export allows you to publish a
-notes file on the web, while the XOXO format provides a solid base for
-exchange with a broad range of other applications. La@TeX{} export lets
-you use Org mode and its structured editing functions to easily create
-La@TeX{} files. To incorporate entries with associated times like
-deadlines or appointments into a desktop calendar program like iCal,
-Org mode can also produce extracts in the iCalendar format. Currently
-Org mode only supports export, not import of these different formats.
+printing and sharing of notes, ASCII export produces a readable and simple
+version of an Org file. HTML export allows you to publish a notes file on
+the web, while the XOXO format provides a solid base for exchange with a
+broad range of other applications. La@TeX{} export lets you use Org mode and
+its structured editing functions to easily create La@TeX{} files. DocBook
+export makes it possible to convert Org files to many other formats using
+DocBook tools. To incorporate entries with associated times like deadlines
+or appointments into a desktop calendar program like iCal, Org mode can also
+produce extracts in the iCalendar format. Currently Org mode only supports
+export, not import of these different formats.
Org supports export of selected regions when @code{transient-mark-mode} is
enabled (default in Emacs 23).
@@ -7764,7 +7774,7 @@ enabled (default in Emacs 23).
* ASCII export:: Exporting to plain ASCII
* HTML export:: Exporting to HTML
* LaTeX and PDF export:: Exporting to LaTeX, and processing to PDF
-* Docbook export:: Exporting to Docbook
+* DocBook export:: Exporting to DocBook
* XOXO export:: Exporting to XOXO
* iCalendar export:: Exporting in iCalendar format
@end menu
@@ -7772,11 +7782,11 @@ enabled (default in Emacs 23).
@node Markup rules, Selective export, Exporting, Exporting
@section Markup rules
-When exporting Org mode documents, the exporter tries to reflect the
+When exporting Org mode documents, the exporter tries to reflect the
structure of the document as accurately as possible in the back-end. Since
-export targets like HTML or La@TeX{} allow much richer formatting, Org mode
-has rules how to prepare text for rich export. This section summarizes the
-markup rule used in an Org mode buffer.
+export targets like HTML, La@TeX{}, or DocBook allow much richer formatting,
+Org mode has rules how to prepare text for rich export. This section
+summarizes the markup rule used in an Org mode buffer.
@menu
* Document title:: How the document title is determined
@@ -7860,8 +7870,8 @@ the table of contents entirely by configuring the variable
Org mode normally exports the text before the first headline, and even uses
the first line as the document title. The text will be fully marked up. If
-you need to include literal HTML or La@TeX{} code, use the special constructs
-described below in the sections for the individual exporters.
+you need to include literal HTML, La@TeX{}, or DocBook code, use the special
+constructs described below in the sections for the individual exporters.
@vindex org-export-skip-text-before-1st-heading
Some people like to use the space before the first headline for setup and
@@ -8078,10 +8088,10 @@ a caption and a label for cross references:
@subheading Inlined Images
@cindex inlined images, markup rules
-Some backends (HTML and LaTeX) allow to directly include images into the
-exported document. Org does this, if a link to an image files does not have
-a description part, for example @code{[[./img/a.jpg]]}. If you wish to
-define a caption for the image and maybe a label for internal cross
+Some backends (HTML, LaTeX, and DocBook) allow to directly include images
+into the exported document. Org does this, if a link to an image files does
+not have a description part, for example @code{[[./img/a.jpg]]}. If you wish
+to define a caption for the image and maybe a label for internal cross
references, you can use (before, but close to the link)
@example
@@ -8709,7 +8719,7 @@ You can choose default values for these options by customizing the variable
@code{org-infojs-options}. If you always want to apply the script to your
pages, configure the variable @code{org-export-html-use-infojs}.
-@node LaTeX and PDF export, Docbook export, HTML export, Exporting
+@node LaTeX and PDF export, DocBook export, HTML export, Exporting
@section LaTeX and PDF export
@cindex LaTeX export
@cindex PDF export
@@ -8874,25 +8884,193 @@ pdflatex (@file{png}, @file{jpg}, and @file{pdf} files). If you process your
files in a different way, you may need to customize the variable
@code{org-export-latex-inline-image-extensions}.
-@node Docbook export, XOXO export, LaTeX and PDF export, Exporting
-@section Docbook export
-@cindex Docbook export
+@node DocBook export, XOXO export, LaTeX and PDF export, Exporting
+@section DocBook export
+@cindex DocBook export
+@cindex PDF export
-The Docbook exporter was contributed to Org by Baoqiu Cui.
+Org contains a DocBook exporter written by Baoqiu Cui. Once an Org file is
+exported to DocBook format, it can be further processed to produce other
+formats, including PDF, HTML, man pages, etc, using many available DocBook
+tools and stylesheets.
+Currently DocBook exporter only supports DocBook V5.0.
+
+@menu
+* DocBook export commands:: How to invoke DocBook export
+* Quoting DocBook code:: Incorporating DocBook code in Org files
+* Recursive sections:: Recursive sections in DocBook
+* Tables in DocBook export:: Tables are exported as HTML tables
+* Images in DocBook export:: How to insert figures into DocBook output
+* Special characters:: How to handle special characters
+@end menu
+
+@node DocBook export commands, Quoting DocBook code, DocBook export, DocBook export
+@subsection DocBook export commands
+
+@cindex region, active
+@cindex active region
+@cindex transient-mark-mode
@table @kbd
@kindex C-c C-e D
@item C-c C-e D
-Export as Docbook file @file{myfile.xml}.
+Export as DocBook file. For an Org file @file{myfile.org}, the DocBook XML
+file will be @file{myfile.xml}. The file will be overwritten without
+warning. If there is an active region@footnote{This requires
+@code{transient-mark-mode} to be turned on}, only the region will be
+exported. If the selected region is a single tree@footnote{To select the
+current subtree, use @kbd{C-c @@}.}, the tree head will become the document
+title. If the tree head entry as, or inherits, an @code{EXPORT_FILE_NAME}
+property, that name will be used for the export.
@kindex C-c C-e V
@item C-c C-e V
-Export as Docbook file and launch a viewer.
-@kindex C-c C-e v
+Export as DocBook file, process to PDF, then open the resulting PDF file.
+
+@vindex org-export-docbook-xslt-proc-command
+@vindex org-export-docbook-xsl-fo-proc-command
+Note that, in order to produce PDF output based on exported DocBook file, you
+need to have XSLT processor and XSL-FO processor software installed on your
+system. Check variables @code{org-export-docbook-xslt-proc-command} and
+@code{org-export-docbook-xsl-fo-proc-command}.
+
+@kindex C-c C-e v D
@item C-c C-e v D
Export only the visible part of the document.
@end table
-@node XOXO export, iCalendar export, Docbook export, Exporting
+@node Quoting DocBook code, Recursive sections, DocBook export commands, DocBook export
+@subsection Quoting DocBook code
+
+You can quote DocBook code in Org files and copy it verbatim into exported
+DocBook file with the following constructs:
+
+@example
+#+DOCBOOK: Literal DocBook code for export
+@end example
+
+@noindent or
+@cindex #+BEGIN_DOCBOOK
+
+@example
+#+BEGIN_DOCBOOK
+All lines between these markers are exported by DocBook exporter
+literally.
+#+END_DOCBOOK
+@end example
+
+For example, you can use the following lines to include a DocBook warning
+admonition. As what this warning says, you should pay attention to the
+document context when quoting DocBook code in Org files. You may make
+exported DocBook XML file invalid if not quoting DocBook code correctly.
+
+@example
+#+BEGIN_DOCBOOK
+
+ You should know what you are doing when quoting DocBook XML code
+ in your Org file. Invalid DocBook XML file may be generated by
+ DocBook exporter if you are not careful!
+
+#+END_DOCBOOK
+@end example
+
+@node Recursive sections, Tables in DocBook export, Quoting DocBook code, DocBook export
+@subsection Recursive sections
+@cindex DocBook recursive sections
+
+DocBook exporter exports Org files as articles using the @code{article}
+element in DocBook. Recursive sections, i.e. @code{section} elements, are
+used in exported articles. Top level headlines in Org files are exported as
+top level sections, and lower level headlines are exported as nested
+sections. The entire structure of Org files will be exported completely, no
+matter how many nested levels of headlines there are.
+
+Using recursive sections makes it easy to port and reuse exported DocBook
+code in other DocBook document types like @code{book} or @code{set}.
+
+@node Tables in DocBook export, Images in DocBook export, Recursive sections, DocBook export
+@subsection Tables in DocBook export
+@cindex tables, in DocBook export
+
+Tables in Org files are exported as HTML tables, which are supported since
+DocBook V4.3.
+
+If a table does not have a caption, an informal table is generated using the
+@code{informaltable} element; otherwise, a formal table will be generated
+using the @code{table} element.
+
+@node Images in DocBook export, Special characters, Tables in DocBook export, DocBook export
+@subsection Images in DocBook export
+@cindex images, inline in DocBook
+@cindex inlining images in DocBook
+
+Images that are linked to without a description part in the link, like
+@samp{[[file:img.jpg]]} or @samp{[[./img.jpg]]}, will be exported to DocBook
+using @code{mediaobject} elements. Each @code{mediaobject} element contains
+an @code{imageobject} that wraps an @code{imagedata} element. If you have
+specified a caption for an image as described in @ref{Markup rules}, a
+@code{caption} element will be added in @code{mediaobject}. If a label is
+also specified, it will be exported as an @code{xml:id} attribute of the
+@code{mediaobject} element.
+
+@vindex org-export-docbook-default-image-attributes
+Image attributes supported by the @code{imagedata} element, like @code{align}
+or @code{width}, can be specified in two ways: you can either customize
+variable @code{org-export-docbook-default-image-attributes} or use the
+@code{#+ATTR_DOCBOOK:} line. Attributes sepcified in variable
+@code{org-export-docbook-default-image-attributes} are applied to all inline
+images in the Org file to be exported (unless they are overwritten by image
+attributes specified in @code{#+ATTR_DOCBOOK:} lines).
+
+The @code{#+ATTR_DOCBOOK:} line can be used to specify additional image
+attributes or overwrite default image attributes for individual images. If
+the same attribute appears in both the @code{#+ATTR_DOCBOOK:} line and
+variable @code{org-export-docbook-default-image-attributes}, the former
+overwrites the latter. Here is an example about how image attributes can be
+set:
+
+@example
+#+CAPTION: The logo of Org-mode
+#+LABEL: unicorn-svg
+#+ATTR_DOCBOOK: scalefit="1" width="100%" depth="100%"
+[[./img/org-mode-unicorn.svg]]
+@end example
+
+@vindex org-export-docbook-inline-image-extensions
+By default, DocBook exporter recognizes the following image file types:
+@file{jpeg}, @file{jpg}, @file{png}, @file{gif}, and @file{svg}. You can
+customize variable @code{org-export-docbook-inline-image-extensions} to add
+more types to this list as long as DocBook supports them.
+
+@node Special characters, , Images in DocBook export, DocBook export
+@subsection Special characters in DocBook export
+@cindex Special characters in DocBook export
+
+@vindex org-export-docbook-doctype
+@vindex org-html-entities
+Special characters that are written in TeX-like syntax, such as @code{\alpha}
+@code{\Gamma}, and @code{\Zeta}, are supported by DocBook exporter. These
+characters are rewritten to XML entities, like @code{α},
+@code{Γ}, and @code{Ζ}, based on the list saved in variable
+@code{org-html-entities}. As long as the generated DocBook file includes the
+corresponding entities, these special characters are recognized.
+
+You can customize variable @code{org-export-docbook-doctype} to include the
+entities you need. For example, you can set variable
+@code{org-export-docbook-doctype} to the following value to recognize all
+special characters included in XHTML entities:
+
+@example
+"
+%xhtml1-symbol;
+]>
+"
+@end example
+
+@node XOXO export, iCalendar export, DocBook export, Exporting
@section XOXO export
@cindex XOXO export
@@ -10939,6 +11117,8 @@ calculations and improved XEmacs compatibility, in particular by porting
@item
@i{Sacha Chua} suggested to copy some linking code from Planner.
@item
+@i{Baoqiu Cui} contributed the DocBook exporter.
+@item
@i{Eddward DeVilla} proposed and tested checkbox statistics. He also
came up with the idea of properties, and that there should be an API for
them.
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index d1b82e7da..61010335e 100755
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,11 @@
+2009-03-30 Carsten Dominik
+
+ * org-docbook.el (org-id-find-id-file): Add function declaration.
+
+ * org.el (org-require-autoloaded-modules): Add org-docbook.el.
+
+ * org-docbook.el: New file.
+
2009-03-28 Carsten Dominik
* org.el (org-reftex-citation): New command.
diff --git a/lisp/org-docbook.el b/lisp/org-docbook.el
new file mode 100644
index 000000000..0ec76ffaa
--- /dev/null
+++ b/lisp/org-docbook.el
@@ -0,0 +1,1317 @@
+;;; org-docbook.el --- DocBook exporter for org-mode
+;;
+;; Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
+;;
+;; Emacs Lisp Archive Entry
+;; Filename: org-docbook.el
+;; Version: 1.0
+;; Author: Baoqiu Cui
+;; Maintainer: Baoqiu Cui
+;; Keywords: org, wp, docbook
+;; Description: Converts an org-mode buffer into DocBook
+;; $Id: org-docbook.el 35 2009-03-23 01:03:21Z baoqiu $
+;; URL:
+
+;; This file is NOT part of GNU Emacs.
+
+;; GNU Emacs 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.
+
+;; GNU Emacs 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.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see .
+
+;; Commentary:
+;;
+;; This library implements a DocBook exporter for org-mode. The basic
+;; idea and design is very similar to what `org-export-as-html' has.
+;; Code prototype was also started with `org-export-as-html'.
+;;
+;; Put this file into your load-path and the following line into your
+;; ~/.emacs:
+;;
+;; (require 'org-docbook)
+;;
+;; The interactive functions are similar to those of the HTML and LaTeX
+;; exporters:
+;;
+;; M-x `org-export-as-docbook'
+;; M-x `org-export-as-docbook-pdf'
+;; M-x `org-export-as-docbook-pdf-and-open'
+;; M-x `org-export-as-docbook-batch'
+;; M-x `org-export-as-docbook-to-buffer'
+;; M-x `org-export-region-as-docbook'
+;; M-x `org-replace-region-by-docbook'
+;;
+;; Note that, in order to generate PDF files using the DocBook XML files
+;; created by DocBook exporter, the following two variables have to be
+;; set based on what DocBook tools you use for XSLT processor and XSL-FO
+;; processor:
+;;
+;; org-export-docbook-xslt-proc-command
+;; org-export-docbook-xsl-fo-proc-command
+;;
+;; Check the document of these two variables to see examples of how they
+;; can be set.
+;;
+;; If the Org file to be exported contains special characters written in
+;; TeX-like syntax, like \alpha and \beta, you need to include the right
+;; entity file(s) in the DOCTYPE declaration for the DocBook XML file.
+;; This is required to make the DocBook XML file valid. The DOCTYPE
+;; declaration string can be set using the following variable:
+;;
+;; org-export-docbook-doctype
+;;
+;;; Code:
+
+(eval-when-compile
+ (require 'cl))
+
+(require 'footnote)
+(require 'org)
+(require 'org-exp)
+
+;;; Variables:
+
+(defvar org-docbook-para-open nil)
+(defvar org-export-docbook-inline-images t)
+(defvar org-export-docbook-link-org-files-as-docbook nil)
+
+(declare-function org-id-find-id-file "org-id" (id))
+
+;;; User variables:
+
+(defgroup org-export-docbook nil
+ "Options for exporting Org-mode files to DocBook."
+ :tag "Org Export DocBook"
+ :group 'org-export)
+
+(defcustom org-export-docbook-extension ".xml"
+ "Extension of DocBook XML files."
+ :group 'org-export-docbook
+ :type 'string)
+
+(defcustom org-export-docbook-header "\n"
+ "Header of DocBook XML files."
+ :group 'org-export-docbook
+ :type 'string)
+
+(defcustom org-export-docbook-doctype nil
+ "DOCTYPE declaration string for DocBook XML files.
+This can be used to include entities that are needed to handle
+special characters in Org files.
+
+For example, if the Org file to be exported contains XHTML
+entities, you can set this variable to:
+
+\"
+%xhtml1-symbol;
+]>
+\"
+
+If you want to process DocBook documents without internet
+connection, it is suggested that you download the required entity
+file(s) and use system identifier(s) (external files) in the
+DOCTYPE declaration."
+ :group 'org-export-docbook
+ :type 'string)
+
+(defcustom org-export-docbook-article-header ""
+ "Article header of DocBook XML files."
+ :group 'org-export-docbook
+ :type 'string)
+
+(defcustom org-export-docbook-section-id-prefix "sec-"
+ "Prefix of section IDs used during exporting.
+This can be set before exporting to avoid same set of section IDs
+being used again and again, which can be a problem when multiple
+people work on the same document."
+ :group 'org-export-docbook
+ :type 'string)
+
+(defcustom org-export-docbook-footnote-id-prefix "fn-"
+ "The prefix of footnote IDs used during exporting. Like
+`org-export-docbook-section-id-prefix', this variable can help
+avoid same set of footnote IDs being used multiple times."
+ :group 'org-export-docbook
+ :type 'string)
+
+(defcustom org-export-docbook-emphasis-alist
+ `(("*" "" "")
+ ("/" "" "")
+ ("_" "" "")
+ ("=" "" "")
+ ("~" "" "")
+ ("+" "" ""))
+ "Alist of DocBook expressions to convert emphasis fontifiers.
+Each element of the list is a list of three elements.
+The first element is the character used as a marker for fontification.
+The second element is a formatting string to wrap fontified text with.
+The third element decides whether to protect converted text from other
+conversions."
+ :group 'org-export-docbook
+ :type 'alist)
+
+(defcustom org-export-docbook-default-image-attributes
+ `(("align" . "\"center\"")
+ ("valign". "\"middle\""))
+ "Alist of default DocBook image attributes.
+These attributes will be inserted into element by
+default, but users can override them using `#+ATTR_DocBook:'."
+ :group 'org-export-docbook
+ :type 'alist)
+
+(defcustom org-export-docbook-inline-image-extensions
+ '("jpeg" "jpg" "png" "gif" "svg")
+ "Extensions of image files that can be inlined into DocBook."
+ :group 'org-export-docbook
+ :type '(repeat (string :tag "Extension")))
+
+(defcustom org-export-docbook-coding-system nil
+ "Coding system for DocBook XML files."
+ :group 'org-export-docbook
+ :type 'coding-system)
+
+(defcustom org-export-docbook-xslt-proc-command nil
+ "XSLT processor command used by DocBook exporter.
+This is the command used to process a DocBook XML file to
+generate the formatting object (FO) file.
+
+The value of this variable should be a format control string that
+includes two `%s' arguments: the first one is for the output FO
+file name, and the second one is for the input DocBook XML file
+name.
+
+For example, if you use Saxon as the XSLT processor, you may want
+to set the variable to
+
+ \"java com.icl.saxon.StyleSheet -o %s %s /path/to/docbook.xsl\"
+
+If you use Xalan, you can set it to
+
+ \"java org.apache.xalan.xslt.Process -out %s -in %s -xsl /path/to/docbook.xsl\"
+
+For xsltproc, the following string should work:
+
+ \"xsltproc --output %s /path/to/docbook.xsl %s\"
+
+You need to replace \"/path/to/docbook.xsl\" with the actual path
+to the DocBook stylesheet file on your machine. You can also
+replace it with your own customization layer if you have one.
+
+You can include additional stylesheet parameters in this command.
+Just make sure that they meet the syntax requirement of each
+processor."
+ :group 'org-export-docbook
+ :type 'string)
+
+(defcustom org-export-docbook-xsl-fo-proc-command nil
+ "XSL-FO processor command used by DocBook exporter.
+This is the command used to process a formatting object (FO) file
+to generate the PDF file.
+
+The value of this variable should be a format control string that
+includes two `%s' arguments: the first one is for the input FO
+file name, and the second one is for the output PDF file name.
+
+For example, if you use FOP as the XSL-FO processor, you can set
+the variable to
+
+ \"fop %s %s\""
+ :group 'org-export-docbook
+ :type 'string)
+
+;;; Autoload functions:
+
+;;;###autoload
+(defun org-export-as-docbook-batch ()
+ "Call `org-export-as-docbook' in batch style.
+This function can be used in batch processing.
+
+For example:
+
+$ emacs --batch
+ --load=$HOME/lib/emacs/org.el
+ --visit=MyOrgFile.org --funcall org-export-as-docbook-batch"
+ (org-export-as-docbook 'hidden))
+
+;;;###autoload
+(defun org-export-as-docbook-to-buffer ()
+ "Call `org-export-as-docbook' with output to a temporary buffer.
+No file is created."
+ (interactive)
+ (org-export-as-docbook nil nil "*Org DocBook Export*")
+ (switch-to-buffer-other-window "*Org DocBook Export*"))
+
+;;;###autoload
+(defun org-replace-region-by-docbook (beg end)
+ "Replace the region from BEG to END with its DocBook export.
+It assumes the region has `org-mode' syntax, and then convert it to
+DocBook. This can be used in any buffer. For example, you could
+write an itemized list in `org-mode' syntax in an DocBook buffer and
+then use this command to convert it."
+ (interactive "r")
+ (let (reg docbook buf)
+ (save-window-excursion
+ (if (org-mode-p)
+ (setq docbook (org-export-region-as-docbook
+ beg end t 'string))
+ (setq reg (buffer-substring beg end)
+ buf (get-buffer-create "*Org tmp*"))
+ (save-excursion
+ (set-buffer buf)
+ (erase-buffer)
+ (insert reg)
+ (org-mode)
+ (setq docbook (org-export-region-as-docbook
+ (point-min) (point-max) t 'string)))
+ (kill-buffer buf)))
+ (delete-region beg end)
+ (insert docbook)))
+
+;;;###autoload
+(defun org-export-region-as-docbook (beg end &optional body-only buffer)
+ "Convert region from BEG to END in `org-mode' buffer to DocBook.
+If prefix arg BODY-ONLY is set, omit file header and footer and
+only produce the region of converted text, useful for
+cut-and-paste operations. If BUFFER is a buffer or a string,
+use/create that buffer as a target of the converted DocBook. If
+BUFFER is the symbol `string', return the produced DocBook as a
+string and leave not buffer behind. For example, a Lisp program
+could call this function in the following way:
+
+ (setq docbook (org-export-region-as-docbook beg end t 'string))
+
+When called interactively, the output buffer is selected, and shown
+in a window. A non-interactive call will only retunr the buffer."
+ (interactive "r\nP")
+ (when (interactive-p)
+ (setq buffer "*Org DocBook Export*"))
+ (let ((transient-mark-mode t)
+ (zmacs-regions t)
+ rtn)
+ (goto-char end)
+ (set-mark (point)) ;; To activate the region
+ (goto-char beg)
+ (setq rtn (org-export-as-docbook
+ nil nil
+ buffer body-only))
+ (if (fboundp 'deactivate-mark) (deactivate-mark))
+ (if (and (interactive-p) (bufferp rtn))
+ (switch-to-buffer-other-window rtn)
+ rtn)))
+
+;;;###autoload
+(defun org-export-as-docbook-pdf (&optional hidden ext-plist
+ to-buffer body-only pub-dir)
+ "Export as DocBook XML file, and generate PDF file."
+ (interactive "P")
+ (if (or (not org-export-docbook-xslt-proc-command)
+ (not (string-match "%s.+%s" org-export-docbook-xslt-proc-command)))
+ (error "XSLT processor command is not set correctly"))
+ (if (or (not org-export-docbook-xsl-fo-proc-command)
+ (not (string-match "%s.+%s" org-export-docbook-xsl-fo-proc-command)))
+ (error "XSL-FO processor command is not set correctly"))
+ (message "Exporting to PDF...")
+ (let* ((wconfig (current-window-configuration))
+ (docbook-buf (org-export-as-docbook hidden ext-plist
+ to-buffer body-only pub-dir))
+ (filename (buffer-file-name docbook-buf))
+ (base (file-name-sans-extension filename))
+ (fofile (concat base ".fo"))
+ (pdffile (concat base ".pdf")))
+ (and (file-exists-p pdffile) (delete-file pdffile))
+ (message "Processing DocBook XML file...")
+ (shell-command (format org-export-docbook-xslt-proc-command
+ fofile (shell-quote-argument filename)))
+ (shell-command (format org-export-docbook-xsl-fo-proc-command
+ fofile pdffile))
+ (message "Processing DocBook file...done")
+ (if (not (file-exists-p pdffile))
+ (error "PDF file was not produced")
+ (set-window-configuration wconfig)
+ (message "Exporting to PDF...done")
+ pdffile)))
+
+;;;###autoload
+(defun org-export-as-docbook-pdf-and-open ()
+ "Export as DocBook XML file, generate PDF file, and open it."
+ (interactive)
+ (let ((pdffile (org-export-as-docbook-pdf)))
+ (if pdffile
+ (org-open-file pdffile)
+ (error "PDF file was not produced"))))
+
+;;;###autoload
+(defun org-export-as-docbook (&optional hidden ext-plist
+ to-buffer body-only pub-dir)
+ "Export the current buffer as a DocBook file.
+If there is an active region, export only the region. When
+HIDDEN is non-nil, don't display the HTML buffer. EXT-PLIST is a
+property list with external parameters overriding org-mode's
+default settings, but still inferior to file-local settings.
+When TO-BUFFER is non-nil, create a buffer with that name and
+export to that buffer. If TO-BUFFER is the symbol `string',
+don't leave any buffer behind but just return the resulting HTML
+as a string. When BODY-ONLY is set, don't produce the file
+header and footer, simply return the content of the document (all
+top-level sections). When PUB-DIR is set, use this as the
+publishing directory."
+ (interactive "P")
+ ;; Make sure we have a file name when we need it.
+ (when (and (not (or to-buffer body-only))
+ (not buffer-file-name))
+ (if (buffer-base-buffer)
+ (org-set-local 'buffer-file-name
+ (with-current-buffer (buffer-base-buffer)
+ buffer-file-name))
+ (error "Need a file name to be able to export.")))
+
+ (message "Exporting...")
+ (setq-default org-todo-line-regexp org-todo-line-regexp)
+ (setq-default org-deadline-line-regexp org-deadline-line-regexp)
+ (setq-default org-done-keywords org-done-keywords)
+ (setq-default org-maybe-keyword-time-regexp org-maybe-keyword-time-regexp)
+ (let* ((opt-plist
+ (org-export-process-option-filters
+ (org-combine-plists (org-default-export-plist)
+ ext-plist
+ (org-infile-export-plist))))
+ (link-validate (plist-get opt-plist :link-validation-function))
+ valid
+ (odd org-odd-levels-only)
+ (region-p (org-region-active-p))
+ (rbeg (and region-p (region-beginning)))
+ (rend (and region-p (region-end)))
+ (subtree-p
+ (if (plist-get opt-plist :ignore-subree-p)
+ nil
+ (when region-p
+ (save-excursion
+ (goto-char rbeg)
+ (and (org-at-heading-p)
+ (>= (org-end-of-subtree t t) rend))))))
+ (level-offset (if subtree-p
+ (save-excursion
+ (goto-char rbeg)
+ (+ (funcall outline-level)
+ (if org-odd-levels-only 1 0)))
+ 0))
+ (opt-plist (if subtree-p
+ (org-export-add-subtree-options opt-plist rbeg)
+ opt-plist))
+ ;; The following two are dynamically scoped into other
+ ;; routines below.
+ (org-current-export-dir
+ (or pub-dir (org-export-directory :docbook opt-plist)))
+ (org-current-export-file buffer-file-name)
+ (level 0) (line "") (origline "") txt todo
+ (filename (if to-buffer nil
+ (expand-file-name
+ (concat
+ (file-name-sans-extension
+ (or (and subtree-p
+ (org-entry-get (region-beginning)
+ "EXPORT_FILE_NAME" t))
+ (file-name-nondirectory buffer-file-name)))
+ org-export-docbook-extension)
+ (file-name-as-directory
+ (or pub-dir (org-export-directory :docbook opt-plist))))))
+ (current-dir (if buffer-file-name
+ (file-name-directory buffer-file-name)
+ default-directory))
+ (buffer (if to-buffer
+ (cond
+ ((eq to-buffer 'string) (get-buffer-create "*Org DocBook Export*"))
+ (t (get-buffer-create to-buffer)))
+ (find-file-noselect filename)))
+ ;; org-levels-open is a global variable
+ (org-levels-open (make-vector org-level-max nil))
+ (date (plist-get opt-plist :date))
+ (author (or (plist-get opt-plist :author)
+ user-full-name))
+ (email (plist-get opt-plist :email))
+ firstname othername surname
+ (title (or (and subtree-p (org-export-get-title-from-subtree))
+ (plist-get opt-plist :title)
+ (and (not
+ (plist-get opt-plist :skip-before-1st-heading))
+ (org-export-grab-title-from-buffer))
+ (and buffer-file-name
+ (file-name-sans-extension
+ (file-name-nondirectory buffer-file-name)))
+ "UNTITLED"))
+ ;; We will use HTML table formatter to export tables to DocBook
+ ;; format, so need to set html-table-tag here.
+ (html-table-tag (plist-get opt-plist :html-table-tag))
+ (quote-re0 (concat "^[ \t]*" org-quote-string "\\>"))
+ (quote-re (concat "^\\(\\*+\\)\\([ \t]+" org-quote-string "\\>\\)"))
+ (inquote nil)
+ (infixed nil)
+ (inverse nil)
+ (in-local-list nil)
+ (local-list-type nil)
+ (local-list-indent nil)
+ (llt org-plain-list-ordered-item-terminator)
+ (email (plist-get opt-plist :email))
+ (language (plist-get opt-plist :language))
+ (lang-words nil)
+ cnt
+ (start 0)
+ (coding-system (and (boundp 'buffer-file-coding-system)
+ buffer-file-coding-system))
+ (coding-system-for-write (or org-export-docbook-coding-system
+ coding-system))
+ (save-buffer-coding-system (or org-export-docbook-coding-system
+ coding-system))
+ (charset (and coding-system-for-write
+ (fboundp 'coding-system-get)
+ (coding-system-get coding-system-for-write
+ 'mime-charset)))
+ (region
+ (buffer-substring
+ (if region-p (region-beginning) (point-min))
+ (if region-p (region-end) (point-max))))
+ (lines
+ (org-split-string
+ (org-export-preprocess-string
+ region
+ :emph-multiline t
+ :for-docbook t
+ :skip-before-1st-heading
+ (plist-get opt-plist :skip-before-1st-heading)
+ :drawers (plist-get opt-plist :drawers)
+ :todo-keywords (plist-get opt-plist :todo-keywords)
+ :tags (plist-get opt-plist :tags)
+ :priority (plist-get opt-plist :priority)
+ :footnotes (plist-get opt-plist :footnotes)
+ :timestamps (plist-get opt-plist :timestamps)
+ :archived-trees
+ (plist-get opt-plist :archived-trees)
+ :select-tags (plist-get opt-plist :select-tags)
+ :exclude-tags (plist-get opt-plist :exclude-tags)
+ :add-text
+ (plist-get opt-plist :text)
+ :LaTeX-fragments
+ (plist-get opt-plist :LaTeX-fragments))
+ "[\r\n]"))
+ ;; Use literal output to show check boxes.
+ (checkbox-start
+ (nth 1 (assoc "=" org-export-docbook-emphasis-alist)))
+ (checkbox-end
+ (nth 2 (assoc "=" org-export-docbook-emphasis-alist)))
+ table-open type
+ table-buffer table-orig-buffer
+ ind item-type starter didclose
+ rpl path attr caption label desc descp desc1 desc2 link
+ fnc item-tag
+ footref-seen footnote-list
+ id-file
+ )
+
+ ;; Fine detailed info about author name.
+ (if (string-match "\\([^ ]+\\) \\(.+ \\)?\\([^ ]+\\)" author)
+ (progn
+ (setq firstname (match-string 1 author)
+ othername (or (match-string 2 author) "")
+ surname (match-string 3 author))))
+
+ ;; Get all footnote text.
+ (setq footnote-list
+ (org-export-docbook-get-footnotes lines))
+
+ (let ((inhibit-read-only t))
+ (org-unmodified
+ (remove-text-properties (point-min) (point-max)
+ '(:org-license-to-kill t))))
+
+ (setq org-min-level (org-get-min-level lines level-offset))
+ (setq org-last-level org-min-level)
+ (org-init-section-numbers)
+
+ ;; Get and save the date.
+ (cond
+ ((and date (string-match "%" date))
+ (setq date (format-time-string date)))
+ (date)
+ (t (setq date (format-time-string "%Y-%m-%d %T %Z"))))
+
+ ;; Get the language-dependent settings
+ (setq lang-words (or (assoc language org-export-language-setup)
+ (assoc "en" org-export-language-setup)))
+
+ ;; Switch to the output buffer. Use fundamental-mode for now. We
+ ;; could turn on nXML mode later and do some indentation.
+ (set-buffer buffer)
+ (let ((inhibit-read-only t)) (erase-buffer))
+ (fundamental-mode)
+
+ (and (fboundp 'set-buffer-file-coding-system)
+ (set-buffer-file-coding-system coding-system-for-write))
+
+ ;; The main body...
+ (let ((case-fold-search nil)
+ (org-odd-levels-only odd))
+
+ ;; Create local variables for all options, to make sure all called
+ ;; functions get the correct information
+ (mapc (lambda (x)
+ (set (make-local-variable (nth 2 x))
+ (plist-get opt-plist (car x))))
+ org-export-plist-vars)
+
+ ;; Insert DocBook file header, title, and author info.
+ (unless body-only
+ (insert org-export-docbook-header)
+ (if org-export-docbook-doctype
+ (insert org-export-docbook-doctype))
+ (insert "\n")
+ (insert (format "\n"
+ org-version emacs-major-version))
+ (insert org-export-docbook-article-header)
+ (insert (format
+ "\n %s
+
+
+
+ %s%s%s
+
+ %s
+
+ \n"
+ (org-docbook-expand title)
+ firstname othername surname
+ (if email (concat "" email "") "")
+ )))
+
+ (org-init-section-numbers)
+
+ (org-export-docbook-open-para)
+
+ ;; Loop over all the lines...
+ (while (setq line (pop lines) origline line)
+ (catch 'nextline
+
+ ;; End of quote section?
+ (when (and inquote (string-match "^\\*+ " line))
+ (insert "]]>\n\n")
+ (setq inquote nil))
+ ;; Inside a quote section?
+ (when inquote
+ (insert (org-docbook-protect line) "\n")
+ (throw 'nextline nil))
+
+ ;; Fixed-width, verbatim lines (examples)
+ (when (and org-export-with-fixed-width
+ (string-match "^[ \t]*:\\(\\([ \t]\\|$\\)\\(.*\\)\\)" line))
+ (when (not infixed)
+ (setq infixed t)
+ (org-export-docbook-close-para-maybe)
+ (insert "\n\n"))
+ (throw 'nextline nil))
+
+ ;; Protected HTML
+ (when (get-text-property 0 'org-protected line)
+ (let (par)
+ (when (re-search-backward
+ "\\(\\)\\([ \t\r\n]*\\)\\=" (- (point) 100) t)
+ (setq par (match-string 1))
+ (replace-match "\\2\n"))
+ (insert line "\n")
+ (while (and lines
+ (or (= (length (car lines)) 0)
+ (get-text-property 0 'org-protected (car lines))))
+ (insert (pop lines) "\n"))
+ (and par (insert "\n")))
+ (throw 'nextline nil))
+
+ ;; Start of block quotes and verses
+ (when (or (equal "ORG-BLOCKQUOTE-START" line)
+ (and (equal "ORG-VERSE-START" line)
+ (setq inverse t)))
+ (org-export-docbook-close-para-maybe)
+ (insert "
")
+ ;; Check whether attribution for this blockquote exists.
+ (let (tmp1
+ attribution
+ (end (if inverse "ORG-VERSE-END" "ORG-BLOCKQUOTE-END"))
+ (quote-lines nil))
+ (while (and (setq tmp1 (pop lines))
+ (not (equal end tmp1)))
+ (push tmp1 quote-lines))
+ (push tmp1 lines) ; Put back quote end mark
+ ;; Check the last line in the quote to see if it contains
+ ;; the attribution.
+ (setq tmp1 (pop quote-lines))
+ (if (string-match "\\(^.*\\)\\(--[ \t]+\\)\\(.+\\)$" tmp1)
+ (progn
+ (setq attribution (match-string 3 tmp1))
+ (when (save-match-data
+ (string-match "[^ \t]" (match-string 1 tmp1)))
+ (push (match-string 1 tmp1) lines)))
+ (push tmp1 lines))
+ (while (setq tmp1 (pop quote-lines))
+ (push tmp1 lines))
+ (when attribution
+ (insert "" attribution "")))
+ ;; Insert for verse.
+ (if inverse
+ (insert "\n")
+ (org-export-docbook-open-para))
+ (throw 'nextline nil))
+
+ ;; End of block quotes
+ (when (equal "ORG-BLOCKQUOTE-END" line)
+ (org-export-docbook-close-para-maybe)
+ (insert "
\n")
+ (throw 'nextline nil))
+
+ ;; End of verses
+ (when (equal "ORG-VERSE-END" line)
+ (insert "\n\n")
+ (setq inverse nil)
+ (throw 'nextline nil))
+
+ ;; Text centering. Element does not
+ ;; seem to work with FOP, so for now we use to
+ ;; center the text, which can contain multiple paragraphs.
+ (when (equal "ORG-CENTER-START" line)
+ (org-export-docbook-close-para-maybe)
+ (insert "\n"
+ "\n"
+ "\n")
+ (org-export-docbook-open-para)
+ (throw 'nextline nil))
+
+ (when (equal "ORG-CENTER-END" line)
+ (org-export-docbook-close-para-maybe)
+ (insert "\n"
+ "\n\n")
+ (throw 'nextline nil))
+
+ ;; Make targets to anchors. Note that currently FOP does not
+ ;; seem to support tags when generating PDF output,
+ ;; but this can be used in DocBook --> HTML conversion.
+ (while (string-match "<<\\([^<>]*\\)>>>?\\((INVISIBLE)\\)?[ \t]*\n?" line)
+ (cond
+ ((match-end 2)
+ (setq line (replace-match
+ (format "@"
+ (org-solidify-link-text (match-string 1 line)))
+ t t line)))
+ (t
+ (setq line (replace-match
+ (format "@"
+ (org-solidify-link-text (match-string 1 line)))
+ t t line)))))
+
+ ;; Replace "&" by "&", "<" and ">" by "<" and ">"
+ ;; handle @<..> HTML tags (replace "@>..<" by "<..>")
+ ;; Also handle sub_superscripts and checkboxes
+ (or (string-match org-table-hline-regexp line)
+ (setq line (org-docbook-expand line)))
+
+ ;; Format the links
+ (setq start 0)
+ (while (string-match org-bracket-link-analytic-regexp++ line start)
+ (setq start (match-beginning 0))
+ (setq path (save-match-data (org-link-unescape
+ (match-string 3 line))))
+ (setq type (cond
+ ((match-end 2) (match-string 2 line))
+ ((save-match-data
+ (or (file-name-absolute-p path)
+ (string-match "^\\.\\.?/" path)))
+ "file")
+ (t "internal")))
+ (setq path (org-extract-attributes (org-link-unescape path)))
+ (setq attr (get-text-property 0 'org-attributes path)
+ caption (get-text-property 0 'org-caption path)
+ label (get-text-property 0 'org-label path))
+ (setq desc1 (if (match-end 5) (match-string 5 line))
+ desc2 (if (match-end 2) (concat type ":" path) path)
+ descp (and desc1 (not (equal desc1 desc2)))
+ desc (or desc1 desc2))
+ ;; Make an image out of the description if that is so wanted
+ (when (and descp (org-file-image-p
+ desc org-export-docbook-inline-image-extensions))
+ (save-match-data
+ (if (string-match "^file:" desc)
+ (setq desc (substring desc (match-end 0))))))
+ ;; FIXME: do we need to unescape here somewhere?
+ (cond
+ ((equal type "internal")
+ (setq rpl (format "%s"
+ (org-solidify-link-text
+ (save-match-data (org-link-unescape path)) nil)
+ (org-export-docbook-format-desc desc))))
+ ((and (equal type "id")
+ (setq id-file (org-id-find-id-file path)))
+ ;; This is an id: link to another file (if it was the same file,
+ ;; it would have become an internal link...)
+ (setq id-file (file-relative-name
+ id-file (file-name-directory org-current-export-file)))
+ (setq id-file (concat (file-name-sans-extension id-file)
+ org-export-docbook-extension))
+ (setq rpl (format "%s"
+ id-file path (org-export-docbook-format-desc desc))))
+ ((member type '("http" "https"))
+ ;; Standard URL, just check if we need to inline an image
+ (if (and (or (eq t org-export-docbook-inline-images)
+ (and org-export-docbook-inline-images (not descp)))
+ (org-file-image-p
+ path org-export-docbook-inline-image-extensions))
+ (setq rpl (org-export-docbook-format-image
+ (concat type ":" path)))
+ (setq link (concat type ":" path))
+ (setq rpl (format "%s"
+ (org-export-html-format-href link)
+ (org-export-docbook-format-desc desc)))
+ ))
+ ((member type '("ftp" "mailto" "news"))
+ ;; Standard URL
+ (setq link (concat type ":" path))
+ (setq rpl (format "%s"
+ (org-export-html-format-href link)
+ (org-export-docbook-format-desc desc))))
+ ((string= type "coderef")
+ (setq rpl (format (org-export-get-coderef-format path (and descp desc))
+ (cdr (assoc path org-export-code-refs)))))
+ ((functionp (setq fnc (nth 2 (assoc type org-link-protocols))))
+ ;; The link protocol has a function for format the link
+ (setq rpl
+ (save-match-data
+ (funcall fnc (org-link-unescape path) desc1 'html))))
+
+ ((string= type "file")
+ ;; FILE link
+ (let* ((filename path)
+ (abs-p (file-name-absolute-p filename))
+ thefile file-is-image-p search)
+ (save-match-data
+ (if (string-match "::\\(.*\\)" filename)
+ (setq search (match-string 1 filename)
+ filename (replace-match "" t nil filename)))
+ (setq valid
+ (if (functionp link-validate)
+ (funcall link-validate filename current-dir)
+ t))
+ (setq file-is-image-p
+ (org-file-image-p
+ filename org-export-docbook-inline-image-extensions))
+ (setq thefile (if abs-p (expand-file-name filename) filename))
+ ;; Carry over the properties (expand-file-name will
+ ;; discard the properties of filename)
+ (add-text-properties 0 (1- (length thefile))
+ (list 'org-caption caption
+ 'org-attributes attr
+ 'org-label label)
+ thefile)
+ (when (and org-export-docbook-link-org-files-as-docbook
+ (string-match "\\.org$" thefile))
+ (setq thefile (concat (substring thefile 0
+ (match-beginning 0))
+ org-export-docbook-extension))
+ (if (and search
+ ;; make sure this is can be used as target search
+ (not (string-match "^[0-9]*$" search))
+ (not (string-match "^\\*" search))
+ (not (string-match "^/.*/$" search)))
+ (setq thefile (concat thefile "#"
+ (org-solidify-link-text
+ (org-link-unescape search)))))
+ (when (string-match "^file:" desc)
+ (setq desc (replace-match "" t t desc))
+ (if (string-match "\\.org$" desc)
+ (setq desc (replace-match "" t t desc))))))
+ (setq rpl (if (and file-is-image-p
+ (or (eq t org-export-docbook-inline-images)
+ (and org-export-docbook-inline-images
+ (not descp))))
+ (progn
+ (message "image %s %s" thefile org-docbook-para-open)
+ (org-export-docbook-format-image thefile))
+ (format "%s"
+ thefile (org-export-docbook-format-desc desc))))
+ (if (not valid) (setq rpl desc))))
+
+ (t
+ ;; Just publish the path, as default
+ (setq rpl (concat "<" type ":"
+ (save-match-data (org-link-unescape path))
+ ">"))))
+ (setq line (replace-match rpl t t line)
+ start (+ start (length rpl))))
+
+ ;; TODO items: can we do something better?!
+ (if (and (string-match org-todo-line-regexp line)
+ (match-beginning 2))
+ (setq line
+ (concat (substring line 0 (match-beginning 2))
+ "[" (match-string 2 line) "]"
+ (substring line (match-end 2)))))
+
+ ;; Does this contain a reference to a footnote?
+ (when org-export-with-footnotes
+ (setq start 0)
+ (while (string-match "\\([^* \t].*?\\)\\[\\([0-9]+\\)\\]" line start)
+ (if (get-text-property (match-beginning 2) 'org-protected line)
+ (setq start (match-end 2))
+ (let ((num (match-string 2 line)))
+ (if (assoc num footref-seen)
+ (setq line (replace-match
+ (format "%s"
+ (match-string 1 line)
+ org-export-docbook-footnote-id-prefix num)
+ t t line))
+ (setq line (replace-match
+ (format "%s%s"
+ (match-string 1 line)
+ org-export-docbook-footnote-id-prefix
+ num (cdr (assoc num footnote-list)))
+ t t line))
+ (push (cons num 1) footref-seen))))))
+
+ (cond
+ ((string-match "^\\(\\*+\\)[ \t]+\\(.*\\)" line)
+ ;; This is a headline
+ (setq level (org-tr-level (- (match-end 1) (match-beginning 1)
+ level-offset))
+ txt (match-string 2 line))
+ (if (string-match quote-re0 txt)
+ (setq txt (replace-match "" t t txt)))
+ (when in-local-list
+ ;; Close any local lists before inserting a new header line
+ (while local-list-type
+ (let ((listtype (car local-list-type)))
+ (org-export-docbook-close-li listtype)
+ (insert (cond
+ ((equal listtype "o") "\n")
+ ((equal listtype "u") "\n")
+ ((equal listtype "d") "\n"))))
+ (pop local-list-type))
+ (setq local-list-indent nil
+ in-local-list nil))
+ (org-export-docbook-level-start level txt)
+ ;; QUOTES
+ (when (string-match quote-re line)
+ (org-export-docbook-close-para-maybe)
+ (insert "\n")
+ ((equal listtype "u") "\n")
+ ((equal listtype "d") "\n"))))
+ (pop local-list-type) (pop local-list-indent)
+ (setq in-local-list local-list-indent))
+ (cond
+ ((and starter
+ (or (not in-local-list)
+ (> ind (car local-list-indent))))
+ ;; Start new (level of) list
+ (org-export-docbook-close-para-maybe)
+ (insert (cond
+ ((equal item-type "u") "\n\n")
+ ((equal item-type "o") "\n\n")
+ ((equal item-type "d")
+ (format "\n%s\n" item-tag))))
+ ;; For DocBook, we need to open a para right after tag
+ ;; .
+ (org-export-docbook-open-para)
+ (push item-type local-list-type)
+ (push ind local-list-indent)
+ (setq in-local-list t))
+ (starter
+ ;; Continue current list
+ (let ((listtype (car local-list-type)))
+ (org-export-docbook-close-li listtype)
+ (insert (cond
+ ((equal listtype "o") "")
+ ((equal listtype "u") "")
+ ((equal listtype "d") (format
+ "%s"
+ (or item-tag
+ "???"))))))
+ ;; For DocBook, we need to open a para right after tag
+ ;; .
+ (org-export-docbook-open-para))
+ (didclose
+ ;; We did close a list, normal text follows: need
+ (org-export-docbook-open-para)))
+ ;; Checkboxes.
+ (if (string-match "^[ \t]*\\(\\[[X -]\\]\\)" line)
+ (setq line
+ (replace-match (concat checkbox-start
+ (match-string 1 line)
+ checkbox-end)
+ t t line))))
+
+ ;; Empty lines start a new paragraph. If hand-formatted lists
+ ;; are not fully interpreted, lines starting with "-", "+", "*"
+ ;; also start a new paragraph.
+ (if (and (string-match "^ [-+*]-\\|^[ \t]*$" line)
+ (not inverse))
+ (org-export-docbook-open-para))
+
+ ;; Is this the start of a footnote?
+ (when org-export-with-footnotes
+ (when (and (boundp 'footnote-section-tag-regexp)
+ (string-match (concat "^" footnote-section-tag-regexp)
+ line))
+ ;; ignore this line
+ (throw 'nextline nil))
+ ;; These footnote lines have been read and saved before,
+ ;; ignore them at this time.
+ (when (string-match "^[ \t]*\\[\\([0-9]+\\)\\]" line)
+ (org-export-docbook-close-para-maybe)
+ (throw 'nextline nil)))
+
+ ;; FIXME: It might be a good idea to add an option to
+ ;; support line break processing instruction .
+ ;; Org-mode supports line break "\\" in HTML exporter, and
+ ;; some DocBook users may also want to force line breaks
+ ;; even though DocBook only supports that in
+ ;; .
+
+ (insert line "\n")))))
+
+ ;; Properly close all local lists and other lists
+ (when inquote
+ (insert "]]>\n\n")
+ (org-export-docbook-open-para))
+ (when in-local-list
+ ;; Close any local lists before inserting a new header line
+ (while local-list-type
+ (let ((listtype (car local-list-type)))
+ (org-export-docbook-close-li listtype)
+ (insert (cond
+ ((equal listtype "o") "\n")
+ ((equal listtype "u") "\n")
+ ((equal listtype "d") "\n"))))
+ (pop local-list-type))
+ (setq local-list-indent nil
+ in-local-list nil))
+ ;; Close all open sections.
+ (org-export-docbook-level-start 1 nil)
+
+ (unless (plist-get opt-plist :buffer-will-be-killed)
+ (normal-mode)
+ (if (eq major-mode default-major-mode)
+ (nxml-mode)))
+
+ ;; Remove empty paragraphs and lists. Replace them with a
+ ;; newline.
+ (goto-char (point-min))
+ (while (re-search-forward
+ "[ \r\n\t]*\\(\\)[ \r\n\t]*[ \r\n\t]*" nil t)
+ (when (not (get-text-property (match-beginning 1) 'org-protected))
+ (replace-match "\n")
+ (backward-char 1)))
+ ;; Fill empty sections with . This is to make sure
+ ;; that the DocBook document generated is valid and well-formed.
+ (goto-char (point-min))
+ (while (re-search-forward
+ "\\([ \r\n\t]*\\)" nil t)
+ (when (not (get-text-property (match-beginning 0) 'org-protected))
+ (replace-match "\n\n" nil nil nil 1)))
+ ;; Insert the last closing tag.
+ (goto-char (point-max))
+ (unless body-only
+ (insert ""))
+ (or to-buffer (save-buffer))
+ (goto-char (point-min))
+ (message "Exporting... done")
+ (if (eq to-buffer 'string)
+ (prog1 (buffer-substring (point-min) (point-max))
+ (kill-buffer (current-buffer)))
+ (current-buffer)))))
+
+(defun org-export-docbook-open-para ()
+ "Insert , but first close previous paragraph if any."
+ (org-export-docbook-close-para-maybe)
+ (insert "\n")
+ (setq org-docbook-para-open t))
+
+(defun org-export-docbook-close-para-maybe ()
+ "Close DocBook paragraph if there is one open."
+ (when org-docbook-para-open
+ (insert "\n")
+ (setq org-docbook-para-open nil)))
+
+(defun org-export-docbook-close-li (&optional type)
+ "Close list if necessary."
+ (org-export-docbook-close-para-maybe)
+ (if (equal type "d")
+ (insert "\n")
+ (insert "\n")))
+
+(defun org-export-docbook-level-start (level title)
+ "Insert a new level in DocBook export.
+When TITLE is nil, just close all open levels."
+ (org-export-docbook-close-para-maybe)
+ (let* ((target (and title (org-get-text-property-any 0 'target title)))
+ (l org-level-max)
+ section-number)
+ (while (>= l level)
+ (if (aref org-levels-open (1- l))
+ (progn
+ (insert "\n")
+ (aset org-levels-open (1- l) nil)))
+ (setq l (1- l)))
+ (when title
+ ;; If title is nil, this means this function is called to close
+ ;; all levels, so the rest is done only if title is given.
+ ;;
+ ;; Format tags: put them into a superscript like format.
+ (when (string-match (org-re "\\(:[[:alnum:]_@:]+:\\)[ \t]*$") title)
+ (setq title
+ (replace-match
+ (if org-export-with-tags
+ (save-match-data
+ (concat
+ ""
+ (match-string 1 title)
+ ""))
+ "")
+ t t title)))
+ (aset org-levels-open (1- level) t)
+ (setq section-number (org-section-number level))
+ (insert (format "\n\n%s"
+ org-export-docbook-section-id-prefix
+ section-number title))
+ (org-export-docbook-open-para))))
+
+(defun org-docbook-expand (string)
+ "Prepare STRING for DocBook export.
+Applies all active conversions. If there are links in the
+string, don't modify these."
+ (let* ((re (concat org-bracket-link-regexp "\\|"
+ (org-re "[ \t]+\\(:[[:alnum:]_@:]+:\\)[ \t]*$")))
+ m s l res)
+ (while (setq m (string-match re string))
+ (setq s (substring string 0 m)
+ l (match-string 0 string)
+ string (substring string (match-end 0)))
+ (push (org-docbook-do-expand s) res)
+ (push l res))
+ (push (org-docbook-do-expand string) res)
+ (apply 'concat (nreverse res))))
+
+(defun org-docbook-do-expand (s)
+ "Apply all active conversions to translate special ASCII to DocBook."
+ (setq s (org-html-protect s))
+ (while (string-match "@<\\([^&]*\\)>" s)
+ (setq s (replace-match "<\\1>" t nil s)))
+ (if org-export-with-emphasize
+ (setq s (org-export-docbook-convert-emphasize s)))
+ (if org-export-with-special-strings
+ (setq s (org-export-docbook-convert-special-strings s)))
+ (if org-export-with-sub-superscripts
+ (setq s (org-export-docbook-convert-sub-super s)))
+ (if org-export-with-TeX-macros
+ (let ((start 0) wd ass)
+ (while (setq start (string-match "\\\\\\([a-zA-Z]+\\)\\({}\\)?"
+ s start))
+ (if (get-text-property (match-beginning 0) 'org-protected s)
+ (setq start (match-end 0))
+ (setq wd (match-string 1 s))
+ (if (setq ass (assoc wd org-html-entities))
+ (setq s (replace-match (or (cdr ass)
+ (concat "&" (car ass) ";"))
+ t t s))
+ (setq start (+ start (length wd))))))))
+ s)
+
+(defun org-export-docbook-format-desc (desc)
+ "Make sure DESC is valid as a description in a link."
+ (save-match-data
+ (org-docbook-do-expand desc)))
+
+(defun org-export-docbook-convert-emphasize (string)
+ "Apply emphasis for DocBook exporting."
+ (let ((s 0) rpl)
+ (while (string-match org-emph-re string s)
+ (if (not (equal
+ (substring string (match-beginning 3) (1+ (match-beginning 3)))
+ (substring string (match-beginning 4) (1+ (match-beginning 4)))))
+ (setq s (match-beginning 0)
+ rpl
+ (concat
+ (match-string 1 string)
+ (nth 1 (assoc (match-string 3 string)
+ org-export-docbook-emphasis-alist))
+ (match-string 4 string)
+ (nth 2 (assoc (match-string 3 string)
+ org-export-docbook-emphasis-alist))
+ (match-string 5 string))
+ string (replace-match rpl t t string)
+ s (+ s (- (length rpl) 2)))
+ (setq s (1+ s))))
+ string))
+
+(defun org-docbook-protect (string)
+ (org-html-protect string))
+
+;; For now, simply return string as it is.
+(defun org-export-docbook-convert-special-strings (string)
+ "Convert special characters in STRING to DocBook."
+ string)
+
+(defun org-export-docbook-get-footnotes (lines)
+ "Given a list of LINES, return a list of alist footnotes."
+ (let ((list nil) line)
+ (while (setq line (pop lines))
+ (if (string-match "^[ \t]*\\[\\([0-9]+\\)\\] \\(.+\\)" line)
+ (push (cons (match-string 1 line) (match-string 2 line))
+ list)))
+ list))
+
+(defun org-export-docbook-format-image (src)
+ "Create image element in DocBook."
+ (save-match-data
+ (let* ((caption (org-find-text-property-in-string 'org-caption src))
+ (attr (or (org-find-text-property-in-string 'org-attributes src)
+ ""))
+ (label (org-find-text-property-in-string 'org-label src))
+ (default-attr org-export-docbook-default-image-attributes)
+ tmp)
+ (while (setq tmp (pop default-attr))
+ (if (not (string-match (concat (car tmp) "=") attr))
+ (setq attr (concat attr " " (car tmp) "=" (cdr tmp)))))
+ (format "
+\n\n
+%s"
+ (if label (concat " xml:id=\"" label "\"") "")
+ src attr
+ (if caption
+ (concat "
\n"
+ caption
+ "\n
\n")
+ "")
+ ))))
+
+(defun org-export-docbook-preprocess (parameters)
+ "Extra preprocessing work for DocBook export."
+ ;; Merge lines starting with "\par" to one line. Such lines are
+ ;; regarded as the continuation of a long footnote.
+ (goto-char (point-min))
+ (while (re-search-forward "\n\\(\\\\par\\>\\)" nil t)
+ (if (not (get-text-property (match-beginning 1) 'org-protected))
+ (replace-match ""))))
+
+(defun org-export-docbook-finalize-table (table)
+ "Change TABLE to informaltable if caption does not exist.
+TABLE is a string containing the HTML code generated by
+`org-format-table-html' for a table in Org-mode buffer."
+ (if (string-match
+ "^
\n\\(\\(.\\|\n\\)+\\)
"
+ table)
+ (replace-match (concat "")
+ nil nil table)
+ table))
+
+;; Note: This function is very similar to
+;; org-export-html-convert-sub-super. They can be merged in the future.
+(defun org-export-docbook-convert-sub-super (string)
+ "Convert sub- and superscripts in STRING for DocBook."
+ (let (key c (s 0) (requireb (eq org-export-with-sub-superscripts '{})))
+ (while (string-match org-match-substring-regexp string s)
+ (cond
+ ((and requireb (match-end 8)) (setq s (match-end 2)))
+ ((get-text-property (match-beginning 2) 'org-protected string)
+ (setq s (match-end 2)))
+ (t
+ (setq s (match-end 1)
+ key (if (string= (match-string 2 string) "_")
+ "subscript"
+ "superscript")
+ c (or (match-string 8 string)
+ (match-string 6 string)
+ (match-string 5 string))
+ string (replace-match
+ (concat (match-string 1 string)
+ "<" key ">" c "" key ">")
+ t t string)))))
+ (while (string-match "\\\\\\([_^]\\)" string)
+ (setq string (replace-match (match-string 1 string) t t string)))
+ string))
+
+(provide 'org-docbook)
+
+;;; org-docbook.el ends here
diff --git a/lisp/org-exp.el b/lisp/org-exp.el
index f476a8f7d..df0cab210 100644
--- a/lisp/org-exp.el
+++ b/lisp/org-exp.el
@@ -1171,7 +1171,8 @@ value of `org-export-run-in-background'."
\[p] export as LaTeX and process to PDF
\[d] export as LaTeX, process to PDF, and open the resulting PDF document
-\[D] export as Docbook [V] export and view Docbook file
+\[D] export as DocBook
+\[V] export as DocBook, process to PDF, and open the resulting PDF document
\[x] export as XOXO
@@ -1191,7 +1192,7 @@ value of `org-export-run-in-background'."
(?R org-export-region-as-html nil)
(?x org-export-as-xoxo t)
(?D org-export-as-docbook t)
- (?V org-export-as-docbook-and-open t)
+ (?V org-export-as-docbook-pdf-and-open t)
(?l org-export-as-latex t)
(?p org-export-as-pdf t)
(?d org-export-as-pdf-and-open t)
@@ -1705,11 +1706,11 @@ on this string to produce the exported version."
;; HTML-specific preprocessing
(when htmlp
(org-export-html-preprocess parameters))
-
+
;; DocBook-specific preprocessing
(when docbookp
- (require 'org-export-docbook nil)
- (org-export-docbook-preprocess parameters))
+ (require 'org-docbook nil)
+ (org-export-docbook-preprocess parameters))
;; Remove or replace comments
(org-export-handle-comments (plist-get parameters :comments))
@@ -1998,7 +1999,7 @@ from the buffer."
(defun org-export-select-backend-specific-text (backend)
(let ((formatters
'((docbook "DOCBOOK" "BEGIN_DOCBOOK" "END_DOCBOOK")
- (html "HTML" "BEGIN_HTML" "END_HTML")
+ (html "HTML" "BEGIN_HTML" "END_HTML")
(ascii "ASCII" "BEGIN_ASCII" "END_ASCII")
(latex "LaTeX" "BEGIN_LaTeX" "END_LaTeX")))
(case-fold-search t)
@@ -2493,8 +2494,7 @@ Numbering lines works for all three major backends (html, latex, and ascii)."
(org-count-lines code))
fmt (if (string-match "-l[ \t]+\"\\([^\"\n]+\\)\"" opts)
(match-string 1 opts)))
- (when (or (and textareap (eq backend 'html))
- (eq backend 'docbook))
+ (when (and textareap (eq backend 'html))
;; we cannot use numbering or highlighting.
(setq num nil cont nil lang nil))
(if keepp (setq rpllbl 'keep))
@@ -2511,13 +2511,13 @@ Numbering lines works for all three major backends (html, latex, and ascii)."
;; Now backend-specific coding
(cond
((eq backend 'docbook)
- (setq rtn (concat "\n\n"))
- (concat "\n#+BEGIN_DOCBOOK\n"
- rtn
- "\n#+END_DOCBOOK\n\n")
- )
+ (setq rtn (org-export-number-lines rtn 'docbook 0 0 num cont rpllbl fmt))
+ (concat "\n#+BEGIN_DOCBOOK\n"
+ (org-add-props (concat "\n\n")
+ '(org-protected t))
+ "#+END_DOCBOOK\n"))
((eq backend 'html)
;; We are exporting to HTML
(when lang
@@ -2607,6 +2607,7 @@ Numbering lines works for all three major backends (html, latex, and ascii)."
fmt))
((eq backend 'ascii) fmt)
((eq backend 'latex) fmt)
+ ((eq backend 'docbook) fmt)
(t "")))
(label-format (or label-format org-coderef-label-format))
(label-pre (if (string-match "%s" label-format)
@@ -3091,10 +3092,10 @@ continue to use it. The prefix arg ARG is passed through to the exporting
command."
(interactive
(list (progn
- (message "Export visible: [a]SCII [h]tml [b]rowse HTML [H/R]uffer with HTML [x]OXO [ ]keep buffer")
+ (message "Export visible: [a]SCII [h]tml [b]rowse HTML [H/R]uffer with HTML [D]ocBook [x]OXO [ ]keep buffer")
(read-char-exclusive))
current-prefix-arg))
- (if (not (member type '(?a ?\C-a ?b ?\C-b ?h ?x ?\ )))
+ (if (not (member type '(?a ?\C-a ?b ?\C-b ?h ?D ?x ?\ )))
(error "Invalid export key"))
(let* ((binding (cdr (assoc type
'((?a . org-export-as-ascii)
@@ -3104,6 +3105,7 @@ command."
(?h . org-export-as-html)
(?H . org-export-as-html-to-buffer)
(?R . org-export-region-as-html)
+ (?D . org-export-as-docbook)
(?x . org-export-as-xoxo)))))
(keepp (equal type ?\ ))
(file buffer-file-name)
diff --git a/lisp/org.el b/lisp/org.el
index 415309a94..28c4d888d 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -14596,8 +14596,8 @@ With optional NODE, go directly to that node."
(interactive)
(mapc 'require
'(org-agenda org-archive org-attach org-clock org-colview
- org-exp org-id org-export-latex org-publish
- org-remember org-table org-timer)))
+ org-exp org-id org-export-latex org-docbook.el
+ org-publish org-remember org-table org-timer)))
;;;###autoload
(defun org-reload (&optional uncompiled)