ox-texinfo: Fix `org-texinfo-classes'

* lisp/ox-texinfo.el (org-texinfo-classes): Change default value.
  Update docstring.
(org-texinfo-template): Insert header string from current class after
"@settitle" command.  Always provide "\input texinfo" at the beginning
of the output.

Header string in the class was inserted before "@setfilename".
Texinfo ignores anything between "\input texinfo" and that command,
making any value besides the default one useless.
This commit is contained in:
Nicolas Goaziou 2014-08-04 11:47:40 +02:00
parent 3ff46fdbff
commit 4b6f9b25b8
1 changed files with 52 additions and 22 deletions

View File

@ -162,19 +162,42 @@ If `nil' it will default to `buffer-file-coding-system'."
(defcustom org-texinfo-classes
'(("info"
"\\input texinfo @c -*- texinfo -*-"
"@documentencoding AUTO\n@documentlanguage AUTO"
("@chapter %s" . "@unnumbered %s")
("@section %s" . "@unnumberedsec %s")
("@subsection %s" . "@unnumberedsubsec %s")
("@subsubsection %s" . "@unnumberedsubsubsec %s")))
"Alist of Texinfo classes and associated header and structure.
If #+Texinfo_CLASS is set in the buffer, use its value and the
If #+TEXINFO_CLASS is set in the buffer, use its value and the
associated information. Here is the structure of each cell:
\(class-name
header-string
\(numbered-section . unnumbered-section\)
...\)
\(numbered-section . unnumbered-section)
...)
The header string
-----------------
The header string is inserted in the header of the generated
document, right after \"@setfilename\" and \"@settitle\"
commands.
If it contains the special string
\"@documentencoding AUTO\"
\"AUTO\" will be replaced with an appropriate coding system. See
`org-texinfo-coding-system' for more information. Likewise, if
the string contains the special string
\"@documentlanguage AUTO\"
\"AUTO\" will be replaced with the language defined in the
buffer, through #+LANGUAGE keyword, or globally, with
`org-export-default-language', which see.
The sectioning structure
------------------------
@ -186,10 +209,12 @@ section string and will be replaced by the title of the section.
Instead of a list of sectioning commands, you can also specify
a function name. That function will be called with two
parameters, the \(reduced) level of the headline, and a predicate
parameters, the reduced) level of the headline, and a predicate
non-nil when the headline should be numbered. It must return
a format string in which the section title will be added."
:group 'org-export-texinfo
:version "24.4"
:package-version '(Org . "8.2")
:type '(repeat
(list (string :tag "Texinfo class")
(string :tag "Texinfo header")
@ -682,8 +707,6 @@ holding export options."
(info-filename (or (plist-get info :texinfo-filename)
(file-name-nondirectory
(org-export-output-file-name ".info"))))
(header (nth 1 (assoc (plist-get info :texinfo-class)
org-texinfo-classes)))
;; Copying data is the contents of the first headline in
;; parse tree with a non-nil copying property.
(copying (org-element-map (plist-get info :parse-tree) 'headline
@ -692,24 +715,31 @@ holding export options."
(org-element-contents hl)))
info t)))
(concat
;; Header
header "\n"
"\\input texinfo @c -*- texinfo -*-\n"
"@c %**start of header\n"
;; Filename and Title
"@setfilename " info-filename "\n"
(format "@settitle %s\n" title)
;; Coding system.
(format
"@documentencoding %s\n"
(catch 'coding-system
(let ((case-fold-search t)
(name (symbol-name (or org-texinfo-coding-system
buffer-file-coding-system))))
(dolist (system org-texinfo-supported-coding-systems "UTF-8")
(when (org-string-match-p (regexp-quote system) name)
(throw 'coding-system system))))))
;; Language.
(format "@documentlanguage %s\n" (plist-get info :language))
;; Insert class-defined header.
(org-element-normalize-string
(let ((header (nth 1 (assoc (plist-get info :texinfo-class)
org-texinfo-classes)))
(coding
(catch 'coding-system
(let ((case-fold-search t)
(name (symbol-name (or org-texinfo-coding-system
buffer-file-coding-system))))
(dolist (system org-texinfo-supported-coding-systems "UTF-8")
(when (org-string-match-p (regexp-quote system) name)
(throw 'coding-system system))))))
(language (plist-get info :language))
(case-fold-search nil))
;; Auto coding system.
(replace-regexp-in-string
"^@documentencoding \\(AUTO\\)$"
coding
(replace-regexp-in-string
"^@documentlanguage \\(AUTO\\)$" language header nil nil 1)
nil nil 1)))
;; Additional header options set by #+TEXINFO_HEADER.
(let ((texinfo-header (plist-get info :texinfo-header)))
(and texinfo-header (org-element-normalize-string texinfo-header)))