Make permissions more consistent
[muse-el.git] / muse-texinfo.el
blob75bae95bb53b65edbc6a7dc7bddbf4c90103c899
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;;
3 ;; Muse Texinfo Publishing
4 ;;
5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7 (require 'muse-publish)
8 (require 'muse-latex)
9 (require 'texnfo-upd)
11 (defgroup muse-texinfo nil
12 "Rules for marking up a Muse file as a Texinfo article."
13 :group 'muse-publish)
15 (defcustom muse-texinfo-process-natively t
16 "If non-nil, use the Emacs `texinfmt' module to make Info files."
17 :type 'boolean
18 :require 'texinfmt
19 :group 'muse-texinfo)
21 (defcustom muse-texinfo-extension ".texi"
22 "Default file extension for publishing Texinfo files."
23 :type 'string
24 :group 'muse-texinfo)
26 (defcustom muse-texinfo-info-extension ".info"
27 "Default file extension for publishing Texinfo files."
28 :type 'string
29 :group 'muse-texinfo)
31 (defcustom muse-texinfo-pdf-extension ".pdf"
32 "Default file extension for publishing Texinfo files."
33 :type 'string
34 :group 'muse-texinfo)
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
44 @iftex
45 @finalout
46 @end iftex
48 @titlepage
49 @title <lisp>(muse-publishing-directive \"title\")</lisp>
50 @author <lisp>(muse-publishing-directive \"author\")</lisp>
51 @end titlepage
53 @node Top, Overview, , (dir)
54 @top Overview
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."
58 :type 'string
59 :group 'muse-texinfo)
61 (defcustom muse-texinfo-footer
62 "\n@c Page published by Emacs Muse ends here
63 <lisp>(and muse-publish-generate-contents \"@contents\")</lisp>
64 @bye\n"
65 "Text to append to a Muse page being published as Texinfo.
66 This text may contain <lisp> markup tags."
67 :type 'string
68 :group 'muse-texinfo)
70 (defcustom muse-texinfo-markup-regexps
71 '(;; join together the parts of a list or table
72 (10000
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"
78 integer
79 (choice regexp symbol)
80 integer
81 (choice string function symbol))
82 function))
83 :group 'muse-texinfo)
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)
91 :group 'muse-texinfo)
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}")
99 (emdash . "---")
100 (rule . "@sp 1")
101 (enddots . "....")
102 (dots . "...")
103 (section . "@chapter ")
104 (subsection . "@section ")
105 (subsubsection . "@subsection ")
106 (footnote . "@footnote{")
107 (footnote-end . "}")
108 (begin-underline . "")
109 (end-underline . "")
110 (begin-literal . "@samp{")
111 (end-literal . "}")
112 (begin-emph . "@emph{")
113 (end-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 ")
133 (start-dde . "\n")
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
142 '((?@ . "@@"))
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 ()
148 (let* ((str (prog1
149 (match-string 1)
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"
170 (function
171 (lambda (file output-path)
172 (if muse-texinfo-process-natively
173 (save-window-excursion
174 (save-excursion
175 (find-file file)
176 (let ((inhibit-read-only t))
177 (texinfo-format-buffer))
178 (save-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))))
185 (= 0 (shell-command
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"
192 (function
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
207 :browser 'find-file)
209 (muse-derive-style "info" "texi"
210 :final 'muse-texinfo-info-generate
211 :osuffix 'muse-texinfo-info-extension
212 :browser 'info)
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