1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 ;; Muse Texinfo Publishing
5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7 (require 'muse-publish
)
11 (defgroup muse-texinfo nil
12 "Rules for marking up a Muse file as a Texinfo article."
15 (defcustom muse-texinfo-process-natively t
16 "If non-nil, use the Emacs `texinfmt' module to make Info files."
21 (defcustom muse-texinfo-extension
".texi"
22 "Default file extension for publishing Texinfo files."
26 (defcustom muse-texinfo-info-extension
".info"
27 "Default file extension for publishing Texinfo files."
31 (defcustom muse-texinfo-pdf-extension
".pdf"
32 "Default file extension for publishing Texinfo files."
36 (defcustom muse-texinfo-header
37 "\\input texinfo @c -*-texinfo-*-
39 @setfilename <lisp>(concat (muse-page-name) \".info\")</lisp>
40 @settitle <lisp>(muse-publishing-directive \"title\")</lisp>
42 @documentencoding iso-8859-1
49 @title <lisp>(muse-publishing-directive \"title\")</lisp>
50 @author <lisp>(muse-publishing-directive \"author\")</lisp>
53 @node Top, Overview, , (dir)
55 @c Page published by Emacs Muse begins here\n\n"
56 "Text to prepend to a Muse page being published as Texinfo.
57 This text may contain <lisp> markup tags."
61 (defcustom muse-texinfo-footer
62 "\n@c Page published by Emacs Muse ends here
63 <lisp>(and muse-publish-generate-contents \"@contents\")</lisp>
65 "Text to append to a Muse page being published as Texinfo.
66 This text may contain <lisp> markup tags."
70 (defcustom muse-texinfo-markup-regexps
71 '(;; join together the parts of a list or table
73 "@end \\(\\(multi\\)?table\\|itemize\\|enumerate\\)\n+@\\1.*\n+" 0 ""))
74 "List of markup rules for publishing a Muse page to Texinfo.
75 For more on the structure of this list, see `muse-publish-markup-regexps'."
76 :type
'(repeat (choice
77 (list :tag
"Markup rule"
79 (choice regexp symbol
)
81 (choice string function symbol
))
85 (defcustom muse-texinfo-markup-functions
86 '((table . muse-texinfo-markup-table
))
87 "An alist of style types to custom functions for that kind of text.
88 For more on the structure of this list, see
89 `muse-publish-markup-functions'."
90 :type
'(alist :key-type symbol
:value-type function
)
93 (defcustom muse-texinfo-markup-strings
94 '((image-with-desc .
"@image{%s}")
95 (image-link .
"@image{%s}")
96 (url-with-image .
"@uref{%s, %s}")
97 (url-link .
"@uref{%s, %s}")
98 (email-addr .
"@email{%s}")
103 (section .
"@chapter ")
104 (subsection .
"@section ")
105 (subsubsection .
"@subsection ")
106 (footnote .
"@footnote{")
108 (begin-underline .
"")
110 (begin-literal .
"@samp{")
112 (begin-emph .
"@emph{")
114 (begin-more-emph .
"@strong{")
115 (end-more-emph .
"}")
116 (begin-most-emph .
"@strong{@emph{")
117 (end-most-emph .
"}}")
118 (begin-verse .
"@display\n")
119 (end-verse-line .
"")
120 (verse-space .
"@ @ ")
121 (end-verse .
"\n@end display")
122 (begin-example .
"@example")
123 (end-example .
"@end example")
124 (begin-center .
"@center\n")
125 (end-center .
"\n@end center")
126 (begin-quote .
"@quotation\n")
127 (end-quote .
"\n@end quotation")
128 (begin-uli .
"@itemize @bullet\n@item\n")
129 (end-uli .
"\n@end itemize")
130 (begin-oli .
"@enumerate\n@item\n")
131 (end-oli .
"\n@end enumerate")
132 (begin-ddt .
"@table @strong\n@item ")
134 (end-ddt .
"\n@end table"))
135 "Strings used for marking up text.
136 These cover the most basic kinds of markup, the handling of which
137 differs little between the various styles."
138 :type
'(alist :key-type symbol
:value-type string
)
139 :group
'muse-texinfo
)
141 (defcustom muse-texinfo-markup-specials
143 "A table of characters which must be represented specially."
144 :type
'(alist :key-type character
:value-type string
)
145 :group
'muse-texinfo
)
147 (defun muse-texinfo-markup-table ()
150 (delete-region (match-beginning 0) (match-end 0))))
151 (fields (split-string str
"\\s-*|+\\s-*")) field
)
152 (insert "@multitable @columnfractions ")
153 (dotimes (field (length fields
))
154 (insert (number-to-string (/ 1.0 (length fields
))) " "))
155 (insert "\n@item " (mapconcat 'identity fields
" @tab "))
156 (insert "\n@end multitable")))
158 (defun muse-texinfo-finalize-buffer ()
159 (goto-char (point-min))
160 (muse-latex-fixup-dquotes)
161 (texinfo-insert-node-lines (point-min) (point-max) t
)
162 (texinfo-all-menus-update t
))
164 (defun muse-texinfo-pdf-browse-file (file)
165 (shell-command (concat "open " file
)))
167 (defun muse-texinfo-info-generate (file output-path final-target
)
168 (muse-publish-transform-output
169 file output-path final-target
"Info"
171 (lambda (file output-path
)
172 (if muse-texinfo-process-natively
173 (save-window-excursion
176 (let ((inhibit-read-only t
))
177 (texinfo-format-buffer))
179 (kill-buffer (current-buffer))
180 (let ((buf (get-file-buffer file
)))
181 (with-current-buffer buf
182 (set-buffer-modified-p nil
)
183 (kill-buffer (current-buffer))))
186 (concat "makeinfo --enable-encoding --output="
187 output-path
" " file
))))))))
189 (defun muse-texinfo-pdf-generate (file output-path final-target
)
190 (muse-publish-transform-output
191 file output-path final-target
"PDF"
193 (lambda (file output-path
)
194 (= 0 (shell-command (concat "texi2pdf -q --clean --output="
195 output-path
" " file
)))))))
197 (unless (assoc "texi" muse-publishing-styles
)
198 (muse-define-style "texi"
199 :suffix
'muse-texinfo-extension
200 :regexps
'muse-texinfo-markup-regexps
201 :functions
'muse-texinfo-markup-functions
202 :strings
'muse-texinfo-markup-strings
203 :specials
'muse-texinfo-markup-specials
204 :after
'muse-texinfo-finalize-buffer
205 :header
'muse-texinfo-header
206 :footer
'muse-texinfo-footer
209 (muse-derive-style "info" "texi"
210 :final
'muse-texinfo-info-generate
211 :osuffix
'muse-texinfo-info-extension
214 (muse-derive-style "info-pdf" "texi"
215 :final
'muse-texinfo-pdf-generate
216 :osuffix
'muse-texinfo-pdf-extension
217 :browser
'muse-texinfo-pdf-browse-file
))
219 (provide 'muse-texinfo
)
221 ;;; muse-texinfo.el ends here