"\\(\\\\\\|\\.info\\)" ""
(buffer-substring start (point)))))))
-(defun make-manuals (root)
- "Generate the web manuals for the Emacs webpage."
- (interactive "DEmacs root directory: ")
+(defun make-manuals (root &optional type)
+ "Generate the web manuals for the Emacs webpage.
+Interactively with a prefix argument, prompt for TYPE.
+Optional argument TYPE is type of output (nil means all)."
+ (interactive (let ((root (read-directory-name "Emacs root directory: "
+ source-directory nil t)))
+ (list root
+ (if current-prefix-arg
+ (completing-read
+ "Type: "
+ (append
+ '("misc" "pdf" "ps")
+ (let (res)
+ (dolist (i '("emacs" "elisp" "eintr") res)
+ (dolist (j '("" "-mono" "-node" "-ps" "-pdf"))
+ (push (concat i j) res))))
+ (manual-misc-manuals root)))))))
(let* ((dest (expand-file-name "manual" root))
(html-node-dir (expand-file-name "html_node" dest))
(html-mono-dir (expand-file-name "html_mono" dest))
(ps-dir (expand-file-name "ps" dest))
- (pdf-dir (expand-file-name "pdf" dest)))
+ (pdf-dir (expand-file-name "pdf" dest))
+ (emacs (expand-file-name "doc/emacs/emacs.texi" root))
+ (elisp (expand-file-name "doc/lispref/elisp.texi" root))
+ (eintr (expand-file-name "doc/lispintro/emacs-lisp-intro.texi" root))
+ (misc (manual-misc-manuals root)))
+ ;; TODO this makes it non-continuable.
+ ;; Instead, delete the individual dest directory each time.
(when (file-directory-p dest)
- (if (y-or-n-p (format "Directory %s exists, delete it first?" dest))
+ (if (y-or-n-p (format "Directory %s exists, delete it first? " dest))
(delete-directory dest t)
- (error "Aborted")))
- (make-directory dest)
- (make-directory html-node-dir)
- (make-directory html-mono-dir)
- (make-directory ps-dir)
- (make-directory pdf-dir)
- ;; Emacs manual
- (let ((texi (expand-file-name "doc/emacs/emacs.texi" root)))
- (manual-html-node texi (expand-file-name "emacs" html-node-dir))
- (manual-html-mono texi (expand-file-name "emacs.html" html-mono-dir))
- (manual-pdf texi (expand-file-name "emacs.pdf" pdf-dif))
- (manual-ps texi (expand-file-name "emacs.ps" ps-dir)))
- ;; Lisp manual
- (let ((texi (expand-file-name "doc/lispref/elisp.texi" root)))
- (manual-html-node texi (expand-file-name "elisp" html-node-dir))
- (manual-html-mono texi (expand-file-name "elisp.html" html-mono-dir))
- (manual-pdf texi (expand-file-name "elisp.pdf" pdf-dir))
- (manual-ps texi (expand-file-name "elisp.ps" ps-dir)))
- ;; Lisp intro.
- (let ((texi (expand-file-name "doc/lispintro/emacs-lisp-intro.texi" root)))
- (manual-html-node texi (expand-file-name "eintr" html-node-dir))
- (manual-html-mono texi (expand-file-name "eintr.html" html-mono-dir))
- (manual-pdf texi (expand-file-name "eintr.pdf" pdf-dir))
- (manual-ps texi (expand-file-name "eintr.ps" ps-dir)))
+ (user-error "Aborted")))
+ (if (member type '(nil "emacs" "emacs-node"))
+ (manual-html-node emacs (expand-file-name "emacs" html-node-dir)))
+ (if (member type '(nil "emacs" "emacs-mono"))
+ (manual-html-mono emacs (expand-file-name "emacs.html" html-mono-dir)))
+ (if (member type '(nil "emacs" "emacs-pdf" "pdf"))
+ (manual-pdf emacs (expand-file-name "emacs.pdf" pdf-dir)))
+ (if (member type '(nil "emacs" "emacs-ps" "ps"))
+ (manual-ps emacs (expand-file-name "emacs.ps" ps-dir)))
+ (if (member type '(nil "elisp" "elisp-node"))
+ (manual-html-node elisp (expand-file-name "elisp" html-node-dir)))
+ (if (member type '(nil "elisp" "elisp-mono"))
+ (manual-html-mono elisp (expand-file-name "elisp.html" html-mono-dir)))
+ (if (member type '(nil "elisp" "elisp-pdf" "pdf"))
+ (manual-pdf elisp (expand-file-name "elisp.pdf" pdf-dir)))
+ (if (member type '(nil "elisp" "elisp-ps" "ps"))
+ (manual-ps elisp (expand-file-name "elisp.ps" ps-dir)))
+ (if (member type '(nil "eintr" "eintr-node"))
+ (manual-html-node eintr (expand-file-name "eintr" html-node-dir)))
+ (if (member type '(nil "eintr" "eintr-node"))
+ (manual-html-mono eintr (expand-file-name "eintr.html" html-mono-dir)))
+ (if (member type '(nil "eintr" "eintr-pdf" "pdf"))
+ (manual-pdf eintr (expand-file-name "eintr.pdf" pdf-dir)))
+ (if (member type '(nil "eintr" "eintr-ps" "ps"))
+ (manual-ps eintr (expand-file-name "eintr.ps" ps-dir)))
;; Misc manuals
- (dolist (manual (manual-misc-manuals root))
- (manual-misc-html manual root html-node-dir html-mono-dir))
+ (dolist (manual misc)
+ (if (member type `(nil ,manual "misc"))
+ (manual-misc-html manual root html-node-dir html-mono-dir)))
(message "Manuals created in %s" dest)))
(defconst manual-doctype-string
@import url('/s/emacs/manual.css');\n</style>\n")
(defun manual-misc-html (name root html-node-dir html-mono-dir)
- (let ((texi (expand-file-name (format "doc/misc/%s.texi" name) root)))
+ ;; Hack to deal with the cases where .texi creates a different .info.
+ ;; Blech. TODO Why not just rename the .texi files?
+ (let* ((texiname (cond ((equal name "ccmode") "cc-mode")
+ ((equal name "efaq") "faq")
+ (t name)))
+ (texi (expand-file-name (format "doc/misc/%s.texi" texiname) root)))
(manual-html-node texi (expand-file-name name html-node-dir))
(manual-html-mono texi (expand-file-name (concat name ".html")
html-mono-dir))))
This function also edits the HTML files so that they validate as
HTML 4.01 Transitional, and pulls in the gnu.org stylesheet using
the @import directive."
+ (make-directory (or (file-name-directory dest) ".") t)
(call-process "makeinfo" nil nil nil
"-D" "WWW_GNU_ORG"
"-I" (expand-file-name "../emacs"
the @import directive."
(unless (file-exists-p texi-file)
(error "Manual file %s not found" texi-file))
+ (make-directory dir t)
(call-process "makeinfo" nil nil nil
"-D" "WWW_GNU_ORG"
"-I" (expand-file-name "../emacs"
(defun manual-pdf (texi-file dest)
"Run texi2pdf on TEXI-FILE, emitting pdf output to DEST."
+ (make-directory (or (file-name-directory dest) ".") t)
(let ((default-directory (file-name-directory texi-file)))
(call-process "texi2pdf" nil nil nil
"-I" "../emacs" "-I" "../misc"
(defun manual-ps (texi-file dest)
"Generate a PostScript version of TEXI-FILE as DEST."
+ (make-directory (or (file-name-directory dest) ".") t)
(let ((dvi-dest (concat (file-name-sans-extension dest) ".dvi"))
(default-directory (file-name-directory texi-file)))
(call-process "texi2dvi" nil nil nil
(setq done t))
(t
(if (eobp)
- (error "Parse error in %s" f)) ; f is bound in manual-html-node
+ (error "Parse error in %s"
+ (file-name-nondirectory buffer-file-name)))
(unless open-td
(setq done t))))
(forward-line 1))))