home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2 / Openstep-4.2-Intel-User.iso / usr / lib / emacs / lisp / texinfmt.el < prev    next >
Lisp/Scheme  |  1991-12-08  |  43KB  |  1,216 lines

  1. ;; Convert texinfo files to info files.
  2. ;; Copyright (C) 1985, 1986, 1988 Free Software Foundation, Inc.
  3.  
  4. ;; This file is part of GNU Emacs.
  5.  
  6. ;; GNU Emacs is free software; you can redistribute it and/or modify
  7. ;; it under the terms of the GNU General Public License as published by
  8. ;; the Free Software Foundation; either version 1, or (at your option)
  9. ;; any later version.
  10.  
  11. ;; GNU Emacs is distributed in the hope that it will be useful,
  12. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ;; GNU General Public License for more details.
  15.  
  16. ;; You should have received a copy of the GNU General Public License
  17. ;; along with GNU Emacs; see the file COPYING.  If not, write to
  18. ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20.  
  21. (defvar texinfo-format-syntax-table nil)
  22.  
  23. (defvar texinfo-vindex)
  24. (defvar texinfo-findex)
  25. (defvar texinfo-cindex)
  26. (defvar texinfo-pindex)
  27. (defvar texinfo-tindex)
  28. (defvar texinfo-kindex)
  29. (defvar texinfo-last-node)
  30. (defvar texinfo-node-names)
  31.  
  32. (if texinfo-format-syntax-table
  33.     nil
  34.   (setq texinfo-format-syntax-table (make-syntax-table))
  35.   (modify-syntax-entry ?\" " " texinfo-format-syntax-table)
  36.   (modify-syntax-entry ?\\ " " texinfo-format-syntax-table)
  37.   (modify-syntax-entry ?@ "\\" texinfo-format-syntax-table)
  38.   (modify-syntax-entry ?\^q "\\" texinfo-format-syntax-table)
  39.   (modify-syntax-entry ?\[ "." texinfo-format-syntax-table)
  40.   (modify-syntax-entry ?\] "." texinfo-format-syntax-table)
  41.   (modify-syntax-entry ?\( "." texinfo-format-syntax-table)
  42.   (modify-syntax-entry ?\) "." texinfo-format-syntax-table)
  43.   (modify-syntax-entry ?{ "(}" texinfo-format-syntax-table)
  44.   (modify-syntax-entry ?} "){" texinfo-format-syntax-table)
  45.   (modify-syntax-entry ?\' "." texinfo-format-syntax-table))
  46.  
  47. (defun texinfo-format-buffer (&optional notagify)
  48.   "Process the current buffer as texinfo code, into an Info file.
  49. The Info file output is generated in a buffer visiting the Info file
  50. names specified in the @setfilename command.
  51.  
  52. Non-nil argument (prefix, if interactive) means don't make tag table
  53. and don't split the file if large.  You can use Info-tagify and
  54. Info-split to do these manually."
  55.   (interactive "P")
  56.   (let ((lastmessage "Formatting Info file..."))
  57.     (message lastmessage)
  58.     (texinfo-format-buffer-1)
  59.     (if notagify
  60.     nil
  61.       (if (> (buffer-size) 30000)
  62.       (progn
  63.         (message (setq lastmessage "Making tags table for Info file..."))
  64.         (Info-tagify)))
  65.       (if (> (buffer-size) 100000)
  66.       (progn
  67.         (message (setq lastmessage "Splitting Info file..."))
  68.         (Info-split))))
  69.     (message (concat lastmessage
  70.              (if (interactive-p) "done.  Now save it." "done.")))))
  71.  
  72. (defun texinfo-format-buffer-1 ()
  73.   (let (texinfo-format-filename
  74.     texinfo-example-start
  75.     texinfo-command-start
  76.     texinfo-command-end
  77.     texinfo-command-name
  78.     texinfo-last-node
  79.     texinfo-vindex
  80.     texinfo-findex
  81.     texinfo-cindex
  82.     texinfo-pindex
  83.     texinfo-tindex
  84.     texinfo-kindex
  85.     texinfo-stack
  86.     texinfo-node-names
  87.     outfile
  88.     (fill-column fill-column)
  89.     (input-buffer (current-buffer))
  90.     (input-directory default-directory))
  91.     (save-excursion
  92.       (goto-char (point-min))
  93.       (search-forward "@setfilename")
  94.       (setq texinfo-command-end (point))
  95.       (setq outfile (texinfo-parse-line-arg)))
  96.     (find-file outfile)
  97.     (texinfo-mode)
  98.     (set-syntax-table texinfo-format-syntax-table)
  99.     (erase-buffer)
  100.     (insert-buffer-substring input-buffer)
  101.     (goto-char (point-min))
  102.     (search-forward "@setfilename")
  103.     (beginning-of-line)
  104.     (delete-region (point-min) (point))
  105.     ;; Remove @bye at end of file, if it is there.
  106.     (goto-char (point-max))
  107.     (if (search-backward "@bye" nil t)
  108.     (delete-region (point) (point-max)))
  109.     ;; Make sure buffer ends in a newline.
  110.     (or (= (preceding-char) ?\n)
  111.     (insert "\n"))
  112.     ;; Scan the whole buffer, converting to Info format.
  113.     (texinfo-format-scan)
  114.     ;; Return data for indices.
  115.     (goto-char (point-min))
  116.     (list outfile
  117.       texinfo-vindex texinfo-findex texinfo-cindex
  118.       texinfo-pindex texinfo-tindex texinfo-kindex)))
  119.  
  120. (defvar texinfo-region-buffer-name "*Info Region*"
  121.   "*Name of the temporary buffer used by \\[texinfo-format-region].")
  122.  
  123. (defun texinfo-format-region (region-beginning region-ending)
  124.   "Convert the the current region of the Texinfo file to Info format.
  125. This lets you see what that part of the file will look like in Info.
  126. The command is bound to \\[texinfo-format-region].  The text that is
  127. converted to Info is stored in a temporary buffer."
  128.   (interactive "r")
  129.   (message "Converting region to Info format...")
  130.   (let (texinfo-command-start
  131.     texinfo-command-end
  132.     texinfo-command-name
  133.     texinfo-vindex
  134.     texinfo-findex
  135.     texinfo-cindex
  136.     texinfo-pindex
  137.     texinfo-tindex
  138.     texinfo-kindex
  139.     texinfo-stack
  140.     texinfo-format-filename
  141.     texinfo-example-start
  142.     texinfo-last-node
  143.     texinfo-node-names
  144.     (fill-column fill-column)
  145.     (input-buffer (current-buffer))
  146.     (input-directory default-directory)
  147.     filename-beginning
  148.     filename-ending)
  149.  
  150. ;;; Find a buffer to use.
  151.  
  152.     (switch-to-buffer (get-buffer-create texinfo-region-buffer-name))
  153.  
  154.     ;; Insert the region into the buffer.
  155.     (erase-buffer)
  156.  
  157.     (save-excursion
  158.       (set-buffer input-buffer)
  159.       (save-excursion
  160.     (save-restriction
  161.       (widen)
  162.       (goto-char (point-min))
  163.       ;; Initialize the buffer with the filename
  164.       ;; or else explain that a filename is needed.
  165.       (or (search-forward "@setfilename"
  166.                   (save-excursion (forward-line 100) (point)) t)
  167.           (error "The texinfo file needs a line saying: @setfilename <name>"))
  168.       (beginning-of-line)
  169.       (setq filename-beginning (point))
  170.       (forward-line 1)
  171.       (setq filename-ending (point)))))
  172.  
  173.     ;; Insert the @setfilename line into the buffer.
  174.     (insert-buffer-substring input-buffer
  175.                  (min filename-beginning region-beginning)  
  176.                  filename-ending)
  177.     
  178.     ;; Insert the region into the buffer.
  179.     (insert-buffer-substring input-buffer
  180.                  (max region-beginning filename-ending)
  181.                  region-ending)
  182.  
  183.     (texinfo-mode)
  184.  
  185.     ;; Install a syntax table useful for scanning command operands.
  186.     (set-syntax-table texinfo-format-syntax-table)
  187.     
  188.     ;; If the region includes the effective end of the data,
  189.     ;; discard everything after that.
  190.     (goto-char (point-max))
  191.     (if (re-search-backward "^@bye" nil t)
  192.     (delete-region (point) (point-max)))
  193.     ;; Make sure buffer ends in a newline.
  194.     (or (= (preceding-char) ?\n)
  195.     (insert "\n"))
  196.  
  197.     ;; Now convert for real.
  198.     (goto-char (point-min))
  199.     (texinfo-format-scan)
  200.     (goto-char (point-min)))
  201.  
  202.   (message "Done."))
  203.  
  204. ;; Perform those texinfo-to-info conversions that apply to the whole input
  205. ;; uniformly.
  206. (defun texinfo-format-scan ()
  207.   ;; Convert left and right quotes to typewriter font quotes.
  208.   (goto-char (point-min))
  209.   (while (search-forward "``" nil t)
  210.     (replace-match "\""))
  211.   (goto-char (point-min))
  212.   (while (search-forward "''" nil t)
  213.     (replace-match "\""))
  214.   ;; Scan for @-commands.
  215.   (goto-char (point-min))
  216.   (while (search-forward "@" nil t)
  217.     (if (looking-at "[@{}'` *]")
  218.     ;; Handle a few special @-followed-by-one-char commands.
  219.     (if (= (following-char) ?*)
  220.         ;; @* has no effect, since we are not filling.
  221.         (delete-region (1- (point)) (1+ (point)))
  222.       ;; The other characters are simply quoted.  Delete the @.
  223.       (delete-char -1)
  224.       (forward-char 1))
  225.       ;; @ is followed by a command-word; find the end of the word.
  226.       (setq texinfo-command-start (1- (point)))
  227.       (if (= (char-syntax (following-char)) ?w)
  228.       (forward-word 1)
  229.     (forward-char 1))
  230.       (setq texinfo-command-end (point))
  231.       ;; Call the handler for this command.
  232.       (setq texinfo-command-name
  233.         (intern (buffer-substring (1+ texinfo-command-start)
  234.                       texinfo-command-end)))
  235.       (let ((cmd (get texinfo-command-name 'texinfo-format)))
  236.     (if cmd (funcall cmd)
  237.       (texinfo-unsupported)))))
  238.   (cond (texinfo-stack
  239.      (goto-char (nth 2 (car texinfo-stack)))
  240.      (error "Unterminated @%s" (car (car texinfo-stack))))))
  241.  
  242. (put 'begin 'texinfo-format 'texinfo-format-begin)
  243. (defun texinfo-format-begin ()
  244.   (texinfo-format-begin-end 'texinfo-format))
  245.  
  246. (put 'end 'texinfo-format 'texinfo-format-end)
  247. (defun texinfo-format-end ()
  248.   (texinfo-format-begin-end 'texinfo-end))
  249.  
  250. (defun texinfo-format-begin-end (prop)
  251.   (setq texinfo-command-name (intern (texinfo-parse-line-arg)))
  252.   (setq cmd (get texinfo-command-name prop))
  253.   (if cmd (funcall cmd)
  254.     (texinfo-unsupported)))
  255.  
  256. (defun texinfo-parse-line-arg ()
  257.   (goto-char texinfo-command-end)
  258.   (let ((start (point)))
  259.     (cond ((looking-at " ")
  260.        (skip-chars-forward " ")
  261.        (setq start (point))
  262.        (end-of-line)
  263.        (setq texinfo-command-end (1+ (point))))
  264.       ((looking-at "{")
  265.        (setq start (1+ (point)))
  266.        (forward-list 1)
  267.        (setq texinfo-command-end (point))
  268.        (forward-char -1))
  269.       (t
  270.        (error "Invalid texinfo command arg format")))
  271.     (prog1 (buffer-substring start (point))
  272.        (if (eolp) (forward-char 1)))))
  273.  
  274. (defun texinfo-parse-expanded-arg ()
  275.   (goto-char texinfo-command-end)
  276.   (let ((start (point))
  277.     marker)
  278.     (cond ((looking-at " ")
  279.        (skip-chars-forward " ")
  280.        (setq start (point))
  281.        (end-of-line)
  282.        (setq texinfo-command-end (1+ (point))))
  283.       ((looking-at "{")
  284.        (setq start (1+ (point)))
  285.        (forward-list 1)
  286.        (setq texinfo-command-end (point))
  287.        (forward-char -1))
  288.       (t
  289.        (error "Invalid texinfo command arg format")))
  290.     (setq marker (move-marker (make-marker) texinfo-command-end))
  291.     (texinfo-format-expand-region start (point))
  292.     (setq texinfo-command-end (marker-position marker))
  293.     (move-marker marker nil)
  294.     (prog1 (buffer-substring start (point))
  295.        (if (eolp) (forward-char 1)))))
  296.  
  297. (defun texinfo-format-expand-region (start end)
  298.   (save-restriction
  299.     (narrow-to-region start end)
  300.     (let (texinfo-command-start
  301.       texinfo-command-end
  302.       texinfo-command-name
  303.       texinfo-stack)
  304.       (texinfo-format-scan))
  305.     (goto-char (point-max))))
  306.  
  307. (defun texinfo-parse-arg-discard ()
  308.   (prog1 (texinfo-parse-line-arg)
  309.      (texinfo-discard-command)))
  310.  
  311. (defun texinfo-discard-command ()
  312.   (delete-region texinfo-command-start texinfo-command-end))
  313.  
  314. (defun texinfo-format-parse-line-args ()
  315.   (let ((start (1- (point)))
  316.     next beg end
  317.     args)
  318.     (skip-chars-forward " ")
  319.     (while (not (eolp))
  320.       (setq beg (point))
  321.       (re-search-forward "[\n,]")
  322.       (setq next (point))
  323.       (if (bolp) (setq next (1- next)))
  324.       (forward-char -1)
  325.       (skip-chars-backward " ")
  326.       (setq end (point))
  327.       (setq args (cons (if (> end beg) (buffer-substring beg end))
  328.                args))
  329.       (goto-char next)
  330.       (skip-chars-forward " "))
  331.     (if (eolp) (forward-char 1))
  332.     (setq texinfo-command-end (point))
  333.     (nreverse args)))
  334.  
  335. (defun texinfo-format-parse-args ()
  336.   (let ((start (1- (point)))
  337.     next beg end
  338.     args)
  339.     (search-forward "{")
  340.     (while (/= (preceding-char) ?\})
  341.       (skip-chars-forward " \t\n")
  342.       (setq beg (point))
  343.       (re-search-forward "[},]")
  344.       (setq next (point))
  345.       (forward-char -1)
  346.       (skip-chars-backward " \t\n")
  347.       (setq end (point))
  348.       (cond ((< beg end)
  349.          (goto-char beg)
  350.          (while (search-forward "\n" end t)
  351.            (replace-match " "))))
  352.       (setq args (cons (if (> end beg) (buffer-substring beg end))
  353.                args))
  354.       (goto-char next))
  355.     (if (eolp) (forward-char 1))
  356.     (setq texinfo-command-end (point))
  357.     (nreverse args)))
  358.  
  359. (defun texinfo-format-parse-defun-args ()
  360.   (goto-char texinfo-command-end)
  361.   (let ((start (point)))
  362.     (end-of-line)
  363.     (setq texinfo-command-end (1+ (point)))
  364.     (let ((marker (move-marker (make-marker) texinfo-command-end)))
  365.       (texinfo-format-expand-region start (point))
  366.       (setq texinfo-command-end (marker-position marker))
  367.       (move-marker marker nil))
  368.     (goto-char start)
  369.     (let ((args '())
  370.       beg end)
  371.       (skip-chars-forward " ")
  372.       (while (not (eolp))
  373.     (cond ((looking-at "{")
  374.            (setq beg (1+ (point)))
  375.            (forward-list 1)
  376.            (setq end (1- (point))))
  377.           (t
  378.            (setq beg (point))
  379.            (re-search-forward "[\n ]")
  380.            (forward-char -1)
  381.            (setq end (point))))
  382.     (setq args (cons (buffer-substring beg end) args))
  383.     (skip-chars-forward " "))
  384.       (forward-char 1)
  385.       (nreverse args))))
  386.  
  387. (put 'setfilename 'texinfo-format 'texinfo-format-setfilename)
  388. (defun texinfo-format-setfilename ()
  389.   (let ((arg (texinfo-parse-arg-discard)))
  390.     (setq texinfo-format-filename
  391.       (file-name-nondirectory (expand-file-name arg)))
  392.     (insert "Info file: "
  393.         texinfo-format-filename ",    -*-Text-*-\n"
  394.         "produced by texinfo-format-buffer\nfrom "
  395.         (if (buffer-file-name input-buffer)
  396.         (concat "file: "
  397.             (file-name-sans-versions
  398.              (file-name-nondirectory
  399.               (buffer-file-name input-buffer))))
  400.           (concat "buffer " (buffer-name input-buffer)))
  401.         "\n\n")))
  402.  
  403. (put 'node 'texinfo-format 'texinfo-format-node)
  404. (defun texinfo-format-node ()
  405.   (let* ((args (texinfo-format-parse-line-args))
  406.      (name (nth 0 args))
  407.      (next (nth 1 args))
  408.      (prev (nth 2 args))
  409.      (up (nth 3 args)))
  410.     (texinfo-discard-command)
  411.     (setq texinfo-last-node name)
  412.     (let ((tem (downcase name)))
  413.       (if (assoc tem texinfo-node-names)
  414.       (error "Duplicate node name: %s" name)
  415.     (setq texinfo-node-names (cons tem texinfo-node-names))))
  416.     (or (bolp)
  417.     (insert ?\n))
  418.     (insert "\^_\nFile: " texinfo-format-filename
  419.         "  Node: " name)
  420.     (if prev
  421.     (insert ", Prev: " prev))
  422.     (if up
  423.     (insert ", Up: " up))
  424.     (if next
  425.     (insert ", Next: " next))
  426.     (insert ?\n)))
  427.  
  428. (put 'menu 'texinfo-format 'texinfo-format-menu)
  429. (defun texinfo-format-menu ()
  430.   (texinfo-discard-line)
  431.   (insert "* Menu:\n\n"))
  432.  
  433. (put 'menu 'texinfo-end 'texinfo-discard-command)
  434. (defun texinfo-discard-line ()
  435.   (goto-char texinfo-command-end)
  436.   (skip-chars-forward " \t")
  437.   (or (eolp)
  438.       (error "Extraneous text at end of command line."))
  439.   (goto-char texinfo-command-start)
  440.   (or (bolp)
  441.       (error "Extraneous text at beginning of command line."))
  442.   (delete-region (point) (progn (forward-line 1) (point))))
  443.  
  444. ; @xref {NODE, FNAME, NAME, FILE, DOCUMENT}
  445. ; -> *Note FNAME: (FILE)NODE
  446. ;   If FILE is missing,
  447. ;    *Note FNAME: NODE
  448. ;   If FNAME is empty and NAME is present
  449. ;    *Note NAME: Node
  450. ;   If both NAME and FNAME are missing
  451. ;    *Note NODE::
  452. ;   texinfo ignores the DOCUMENT argument.
  453. ; -> See section <xref to NODE> [NAME, else NODE], page <xref to NODE>
  454. ;   If FILE is specified, (FILE)NODE is used for xrefs.
  455. ;   If fifth argument DOCUMENT is specified, produces
  456. ;    See section <xref to NODE> [NAME, else NODE], page <xref to NODE>
  457. ;    of DOCUMENT
  458. (put 'xref 'texinfo-format 'texinfo-format-xref)
  459. (defun texinfo-format-xref ()
  460.   (let ((args (texinfo-format-parse-args)))
  461.     (texinfo-discard-command)
  462.     (insert "*Note ")
  463.     (let ((fname (or (nth 1 args) (nth 2 args))))
  464.       (if (null (or fname (nth 3 args)))
  465.       (insert (car args) "::")
  466.     (insert (or fname (car args)) ": ")
  467.     (if (nth 3 args)
  468.         (insert "(" (nth 3 args) ")"))
  469.     (insert (car args))))))
  470.  
  471. (put 'pxref 'texinfo-format 'texinfo-format-pxref)
  472. (defun texinfo-format-pxref ()
  473.   (texinfo-format-xref)
  474.   (or (save-excursion
  475.     (forward-char -2)
  476.     (looking-at "::"))
  477.       (insert ".")))
  478.  
  479. ;@inforef{NODE, FNAME, FILE}
  480. ;Like @xref{NODE, FNAME,,FILE} in texinfo.
  481. ;In Tex, generates "See Info file FILE, node NODE"
  482. (put 'inforef 'texinfo-format 'texinfo-format-inforef)
  483. (defun texinfo-format-inforef ()
  484.   (let ((args (texinfo-format-parse-args)))
  485.     (texinfo-discard-command)
  486.     (insert "*Note " (nth 1 args) ": (" (nth 2 args) ")" (car args))))
  487.  
  488. (put 'chapheading 'texinfo-format 'texinfo-format-chapter)
  489. (put 'ichapter 'texinfo-format 'texinfo-format-chapter)
  490. (put 'chapter 'texinfo-format 'texinfo-format-chapter)
  491. (put 'iappendix 'texinfo-format 'texinfo-format-chapter)
  492. (put 'appendix 'texinfo-format 'texinfo-format-chapter)
  493. (put 'iunnumbered 'texinfo-format 'texinfo-format-chapter)
  494. (put 'unnumbered 'texinfo-format 'texinfo-format-chapter)
  495. (defun texinfo-format-chapter ()
  496.   (texinfo-format-chapter-1 ?*))
  497.  
  498. (put 'heading 'texinfo-format 'texinfo-format-section)
  499. (put 'isection 'texinfo-format 'texinfo-format-section)
  500. (put 'section 'texinfo-format 'texinfo-format-section)
  501. (put 'iappendixsection 'texinfo-format 'texinfo-format-section)
  502. (put 'appendixsection 'texinfo-format 'texinfo-format-section)
  503. (put 'iappendixsec 'texinfo-format 'texinfo-format-section)
  504. (put 'appendixsec 'texinfo-format 'texinfo-format-section)
  505. (put 'iunnumberedsec 'texinfo-format 'texinfo-format-section)
  506. (put 'unnumberedsec 'texinfo-format 'texinfo-format-section)
  507. (defun texinfo-format-section ()
  508.   (texinfo-format-chapter-1 ?=))
  509.  
  510. (put 'subheading 'texinfo-format 'texinfo-format-subsection)
  511. (put 'isubsection 'texinfo-format 'texinfo-format-subsection)
  512. (put 'subsection 'texinfo-format 'texinfo-format-subsection)
  513. (put 'iappendixsubsec 'texinfo-format 'texinfo-format-subsection)
  514. (put 'appendixsubsec 'texinfo-format 'texinfo-format-subsection)
  515. (put 'iunnumberedsubsec 'texinfo-format 'texinfo-format-subsection)
  516. (put 'unnumberedsubsec 'texinfo-format 'texinfo-format-subsection)
  517. (defun texinfo-format-subsection ()
  518.   (texinfo-format-chapter-1 ?-))
  519.  
  520. (put 'subsubheading 'texinfo-format 'texinfo-format-subsubsection)
  521. (put 'isubsubsection 'texinfo-format 'texinfo-format-subsubsection)
  522. (put 'subsubsection 'texinfo-format 'texinfo-format-subsubsection)
  523. (put 'iappendixsubsubsec 'texinfo-format 'texinfo-format-subsubsection)
  524. (put 'appendixsubsubsec 'texinfo-format 'texinfo-format-subsubsection)
  525. (put 'iunnumberedsubsubsec 'texinfo-format 'texinfo-format-subsubsection)
  526. (put 'unnumberedsubsubsec 'texinfo-format 'texinfo-format-subsubsection)
  527. (defun texinfo-format-subsubsection ()
  528.   (texinfo-format-chapter-1 ?.))
  529.  
  530. (defun texinfo-format-chapter-1 (belowchar)
  531.   (let ((arg (texinfo-parse-arg-discard)))
  532.     (insert ?\n arg ?\n "@SectionPAD " belowchar ?\n)
  533.     (forward-line -2)))
  534.  
  535. (put 'SectionPAD 'texinfo-format 'texinfo-format-sectionpad)
  536. (defun texinfo-format-sectionpad ()
  537.   (let ((str (texinfo-parse-arg-discard)))
  538.     (forward-char -1)
  539.     (let ((column (current-column)))
  540.       (forward-char 1)
  541.       (while (> column 0)
  542.     (insert str)
  543.     (setq column (1- column))))
  544.     (insert ?\n)))
  545.  
  546. (put '\. 'texinfo-format 'texinfo-format-\.)
  547. (defun texinfo-format-\. ()
  548.   (texinfo-discard-command)
  549.   (insert "."))
  550.  
  551. (put '\: 'texinfo-format 'texinfo-format-\:)
  552. (defun texinfo-format-\: ()
  553.   (texinfo-discard-command))
  554.  
  555. (put 'center 'texinfo-format 'texinfo-format-center)
  556. (defun texinfo-format-center ()
  557.   (texinfo-discard-command)
  558.   (let ((indent-tabs-mode nil))
  559.     (center-line)))
  560.  
  561. ;; @itemize pushes (itemize "COMMANDS" STARTPOS) on texinfo-stack.
  562. ;; @enumerate pushes (enumerate 0 STARTPOS).
  563. ;; @item dispatches to the texinfo-item prop of the first elt of the list.
  564. ;; For itemize, this puts in and rescans the COMMANDS.
  565. ;; For enumerate, this increments the number and puts it in.
  566. ;; In either case, it puts a Backspace at the front of the line
  567. ;; which marks it not to be indented later.
  568. ;; All other lines get indented by 5 when the @end is reached.
  569.  
  570. (defun texinfo-push-stack (check arg)
  571.   (setq texinfo-stack
  572.     (cons (list check arg texinfo-command-start)
  573.           texinfo-stack)))
  574.  
  575. (defun texinfo-pop-stack (check)
  576.   (if (null texinfo-stack)
  577.       (error "Unmatched @end %s" check))
  578.   (if (not (eq (car (car texinfo-stack)) check))
  579.       (error "@end %s matches @%s"
  580.          check (car (car texinfo-stack))))
  581.   (prog1 (cdr (car texinfo-stack))
  582.      (setq texinfo-stack (cdr texinfo-stack))))
  583.  
  584. (put 'itemize 'texinfo-format 'texinfo-itemize)
  585. (defun texinfo-itemize ()
  586.   (texinfo-push-stack 'itemize (texinfo-parse-arg-discard))
  587.   (setq fill-column (- fill-column 5)))
  588.  
  589. (put 'itemize 'texinfo-end 'texinfo-end-itemize)
  590. (defun texinfo-end-itemize ()
  591.   (setq fill-column (+ fill-column 5))
  592.   (texinfo-discard-command)
  593.   (let ((stacktop
  594.      (texinfo-pop-stack 'itemize)))
  595.     (texinfo-do-itemize (nth 1 stacktop))))
  596.  
  597. (put 'enumerate 'texinfo-format 'texinfo-enumerate)
  598. (defun texinfo-enumerate ()
  599.   (texinfo-push-stack 'enumerate 0)
  600.   (setq fill-column (- fill-column 5))
  601.   (texinfo-discard-line))
  602.  
  603. (put 'enumerate 'texinfo-end 'texinfo-end-enumerate)
  604. (defun texinfo-end-enumerate ()
  605.   (setq fill-column (+ fill-column 5))
  606.   (texinfo-discard-command)
  607.   (let ((stacktop
  608.      (texinfo-pop-stack 'enumerate)))
  609.     (texinfo-do-itemize (nth 1 stacktop))))
  610.  
  611. (put 'table 'texinfo-format 'texinfo-table)
  612. (defun texinfo-table ()
  613.   (texinfo-push-stack 'table (texinfo-parse-arg-discard))
  614.   (setq fill-column (- fill-column 5)))
  615.  
  616. (put 'ftable 'texinfo-format 'texinfo-ftable)
  617. (defun texinfo-ftable ()
  618.   (texinfo-push-stack 'table "@code")
  619.   (setq fill-column (- fill-column 5))
  620.   (texinfo-discard-line))
  621.  
  622. (put 'description 'texinfo-format 'texinfo-description)
  623. (defun texinfo-description ()
  624.   (texinfo-push-stack 'table "@asis")
  625.   (setq fill-column (- fill-column 5))
  626.   (texinfo-discard-line))
  627.  
  628. (put 'table 'texinfo-end 'texinfo-end-table)
  629. (put 'ftable 'texinfo-end 'texinfo-end-table)
  630. (put 'description 'texinfo-end 'texinfo-end-table)
  631. (defun texinfo-end-table ()
  632.   (setq fill-column (+ fill-column 5))
  633.   (texinfo-discard-command)
  634.   (let ((stacktop
  635.      (texinfo-pop-stack 'table)))
  636.     (texinfo-do-itemize (nth 1 stacktop))))
  637.  
  638. ;; At the @end, indent all the lines within the construct
  639. ;; except those marked with backspace.  FROM says where
  640. ;; construct started.
  641. (defun texinfo-do-itemize (from)
  642.   (save-excursion
  643.    (while (progn (forward-line -1)
  644.          (>= (point) from))
  645.      (if (= (following-char) ?\b)
  646.      (save-excursion
  647.        (delete-char 1)
  648.        (end-of-line)
  649.        (delete-char 6))
  650.        (if (not (looking-at "[ \t]*$"))
  651.        (save-excursion (insert "     ")))))))
  652.  
  653. (put 'item 'texinfo-format 'texinfo-item)
  654. (put 'itemx 'texinfo-format 'texinfo-item)
  655. (defun texinfo-item ()
  656.   (funcall (get (car (car texinfo-stack)) 'texinfo-item)))
  657.  
  658. (put 'itemize 'texinfo-item 'texinfo-itemize-item)
  659. (defun texinfo-itemize-item ()
  660.   (texinfo-discard-line)
  661.   (insert "\b   " (nth 1 (car texinfo-stack)) " \n")
  662.   (forward-line -1))
  663.  
  664. (put 'enumerate 'texinfo-item 'texinfo-enumerate-item)
  665. (defun texinfo-enumerate-item ()
  666.   (texinfo-discard-line)
  667.   (let ((next (1+ (car (cdr (car texinfo-stack))))))
  668.     (setcar (cdr (car texinfo-stack)) next)
  669.     (insert ?\b (format "%3d. " next) ?\n))
  670.   (forward-line -1))
  671.  
  672. (put 'table 'texinfo-item 'texinfo-table-item)
  673. (defun texinfo-table-item ()
  674.   (let ((arg (texinfo-parse-arg-discard))
  675.     (itemfont (car (cdr (car texinfo-stack)))))
  676.     (insert ?\b itemfont ?\{ arg "}\n     \n"))
  677.   (forward-line -2))
  678.  
  679. (put 'ifinfo 'texinfo-format 'texinfo-discard-line)
  680. (put 'ifinfo 'texinfo-end 'texinfo-discard-command)
  681.  
  682. (put 'iftex 'texinfo-format 'texinfo-format-iftex)
  683. (defun texinfo-format-iftex ()
  684.   (delete-region texinfo-command-start
  685.          (progn (re-search-forward "@end iftex\n")
  686.             (point))))
  687.  
  688. (put 'tex 'texinfo-format 'texinfo-format-tex)
  689. (defun texinfo-format-tex ()
  690.   (delete-region texinfo-command-start
  691.          (progn (re-search-forward "@end tex\n")
  692.             (point))))
  693.  
  694. (put 'titlepage 'texinfo-format 'texinfo-format-titlepage)
  695. (defun texinfo-format-titlepage ()
  696.   (delete-region texinfo-command-start
  697.          (progn (search-forward "@end titlepage\n")
  698.             (point))))
  699.  
  700. (put 'endtitlepage 'texinfo-format 'texinfo-discard-line)
  701.  
  702. (put 'ignore 'texinfo-format 'texinfo-format-ignore)
  703. (defun texinfo-format-ignore ()
  704.   (delete-region texinfo-command-start
  705.          (progn (search-forward "@end ignore\n")
  706.             (point))))
  707.  
  708. (put 'endignore 'texinfo-format 'texinfo-discard-line)
  709.  
  710. (put 'var 'texinfo-format 'texinfo-format-var)
  711. (defun texinfo-format-var ()
  712.   (insert (upcase (texinfo-parse-arg-discard)))
  713.   (goto-char texinfo-command-start))
  714.  
  715. (put 'asis 'texinfo-format 'texinfo-format-noop)
  716. (put 'b 'texinfo-format 'texinfo-format-noop)
  717. (put 't 'texinfo-format 'texinfo-format-noop)
  718. (put 'i 'texinfo-format 'texinfo-format-noop)
  719. (put 'r 'texinfo-format 'texinfo-format-noop)
  720. (put 'key 'texinfo-format 'texinfo-format-noop)
  721. (put 'w 'texinfo-format 'texinfo-format-noop)
  722. (defun texinfo-format-noop ()
  723.   (insert (texinfo-parse-arg-discard))
  724.   (goto-char texinfo-command-start))
  725.  
  726. (put 'code 'texinfo-format 'texinfo-format-code)
  727. (put 'samp 'texinfo-format 'texinfo-format-code)
  728. (put 'file 'texinfo-format 'texinfo-format-code)
  729. (put 'kbd 'texinfo-format 'texinfo-format-code)
  730. (put 'cite 'texinfo-format 'texinfo-format-code)
  731. (defun texinfo-format-code ()
  732.   (insert "`" (texinfo-parse-arg-discard) "'")
  733.   (goto-char texinfo-command-start))
  734.  
  735. (put 'emph 'texinfo-format 'texinfo-format-emph)
  736. (put 'strong 'texinfo-format 'texinfo-format-emph)
  737. (defun texinfo-format-emph ()
  738.   (insert "*" (texinfo-parse-arg-discard) "*")
  739.   (goto-char texinfo-command-start))
  740.  
  741. (put 'defn 'texinfo-format 'texinfo-format-defn)
  742. (put 'dfn 'texinfo-format 'texinfo-format-defn)
  743. (defun texinfo-format-defn ()
  744.   (insert "\"" (texinfo-parse-arg-discard) "\"")
  745.   (goto-char texinfo-command-start))
  746.  
  747. (put 'bullet 'texinfo-format 'texinfo-format-bullet)
  748. (defun texinfo-format-bullet ()
  749.   (texinfo-discard-command)
  750.   (insert "*"))
  751.  
  752. (put 'smallexample 'texinfo-format 'texinfo-format-example)
  753. (put 'example 'texinfo-format 'texinfo-format-example)
  754. (put 'quotation 'texinfo-format 'texinfo-format-example)
  755. (put 'lisp 'texinfo-format 'texinfo-format-example)
  756. (put 'display 'texinfo-format 'texinfo-format-example)
  757. (put 'format 'texinfo-format 'texinfo-format-example)
  758. (put 'flushleft 'texinfo-format 'texinfo-format-example)
  759. (defun texinfo-format-example ()
  760.   (texinfo-push-stack 'example nil)
  761.   (setq fill-column (- fill-column 5))
  762.   (texinfo-discard-line))
  763.  
  764. (put 'smallexample 'texinfo-end 'texinfo-end-example)
  765. (put 'example 'texinfo-end 'texinfo-end-example)
  766. (put 'quotation 'texinfo-end 'texinfo-end-example)
  767. (put 'lisp 'texinfo-end 'texinfo-end-example)
  768. (put 'display 'texinfo-end 'texinfo-end-example)
  769. (put 'format 'texinfo-end 'texinfo-end-example)
  770. (put 'flushleft 'texinfo-end 'texinfo-end-example)
  771. (defun texinfo-end-example ()
  772.   (setq fill-column (+ fill-column 5))
  773.   (texinfo-discard-command)
  774.   (let ((stacktop
  775.      (texinfo-pop-stack 'example)))
  776.     (texinfo-do-itemize (nth 1 stacktop))))
  777.  
  778. (put 'exdent 'texinfo-format 'texinfo-format-exdent)
  779. (defun texinfo-format-exdent ()
  780.   (texinfo-discard-command)
  781.   (delete-region (point)
  782.          (progn
  783.           (skip-chars-forward " ")
  784.           (point)))
  785.   (insert ?\b)
  786.   ;; Cancel out the deletion that texinfo-do-itemize
  787.   ;; is going to do at the end of this line.
  788.   (save-excursion
  789.     (end-of-line)
  790.     (insert "\n     ")))
  791.  
  792. (put 'ctrl 'texinfo-format 'texinfo-format-ctrl)
  793. (defun texinfo-format-ctrl ()
  794.   (let ((str (texinfo-parse-arg-discard)))
  795.     (insert (logand 31 (aref str 0)))))
  796.  
  797. (put 'TeX 'texinfo-format 'texinfo-format-TeX)
  798. (defun texinfo-format-TeX ()
  799.   (texinfo-parse-arg-discard)
  800.   (insert "TeX"))
  801.  
  802. (put 'copyright 'texinfo-format 'texinfo-format-copyright)
  803. (defun texinfo-format-copyright ()
  804.   (texinfo-parse-arg-discard)
  805.   (insert "(C)"))
  806.  
  807. (put 'minus 'texinfo-format 'texinfo-format-minus)
  808. (defun texinfo-format-minus ()
  809.   (texinfo-parse-arg-discard)
  810.   (insert "-"))
  811.  
  812. (put 'dots 'texinfo-format 'texinfo-format-dots)
  813. (defun texinfo-format-dots ()
  814.   (texinfo-parse-arg-discard)
  815.   (insert "..."))
  816.  
  817. (put 'refill 'texinfo-format 'texinfo-format-refill)
  818. (defun texinfo-format-refill ()
  819.   (texinfo-discard-command)
  820.   (fill-paragraph nil))
  821.  
  822. (put 'sp 'texinfo-format 'texinfo-format-sp)
  823. (defun texinfo-format-sp ()
  824.   (texinfo-discard-command)
  825.   (insert "\n"))
  826.  
  827. ;; Index generation
  828.  
  829. (put 'vindex 'texinfo-format 'texinfo-format-vindex)
  830. (defun texinfo-format-vindex ()
  831.   (texinfo-index 'texinfo-vindex))
  832.  
  833. (put 'cindex 'texinfo-format 'texinfo-format-cindex)
  834. (defun texinfo-format-cindex ()
  835.   (texinfo-index 'texinfo-cindex))
  836.  
  837. (put 'findex 'texinfo-format 'texinfo-format-findex)
  838. (defun texinfo-format-findex ()
  839.   (texinfo-index 'texinfo-findex))
  840.  
  841. (put 'pindex 'texinfo-format 'texinfo-format-pindex)
  842. (defun texinfo-format-pindex ()
  843.   (texinfo-index 'texinfo-pindex))
  844.  
  845. (put 'tindex 'texinfo-format 'texinfo-format-tindex)
  846. (defun texinfo-format-tindex ()
  847.   (texinfo-index 'texinfo-tindex))
  848.  
  849. (put 'kindex 'texinfo-format 'texinfo-format-kindex)
  850. (defun texinfo-format-kindex ()
  851.   (texinfo-index 'texinfo-kindex))
  852.  
  853. (defun texinfo-index (indexvar)
  854.   (let ((arg (texinfo-parse-expanded-arg)))
  855.     (texinfo-discard-command)
  856.     (set indexvar
  857.      (cons (list arg texinfo-last-node)
  858.            (symbol-value indexvar)))))
  859.  
  860. (defconst texinfo-indexvar-alist
  861.   '(("cp" . texinfo-cindex)
  862.     ("fn" . texinfo-findex)
  863.     ("vr" . texinfo-vindex)
  864.     ("tp" . texinfo-tindex)
  865.     ("pg" . texinfo-pindex)
  866.     ("ky" . texinfo-kindex)))
  867.  
  868. (put 'printindex 'texinfo-format 'texinfo-format-printindex)
  869. (defun texinfo-format-printindex ()
  870.   (let ((indexelts (symbol-value
  871.             (cdr (assoc (texinfo-parse-arg-discard)
  872.                 texinfo-indexvar-alist))))
  873.     opoint)
  874.     (insert "\n* Menu:\n\n")
  875.     (setq opoint (point))
  876.     (texinfo-print-index nil indexelts)
  877.     (if (eq system-type 'vax-vms) 
  878.     (texinfo-sort-region opoint (point))
  879.       (shell-command-on-region opoint (point) "sort -fd" 1))))
  880.  
  881. (defun texinfo-print-index (file indexelts)
  882.   (while indexelts
  883.     (if (stringp (car (car indexelts)))
  884.     (insert "* " (car (car indexelts))
  885.         ": " (if file (concat "(" file ")") "")
  886.         (nth 1 (car indexelts)) ".\n")
  887.       ;; index entries from @include'd file
  888.       (texinfo-print-index (nth 1 (car indexelts))
  889.                (nth 2 (car indexelts))))
  890.     (setq indexelts (cdr indexelts))))
  891.  
  892.  
  893. ;;;; Lisp Definitions
  894.  
  895. (defun texinfo-format-defun ()
  896.   (texinfo-push-stack 'defun nil)
  897.   (setq fill-column (- fill-column 5))
  898.   (texinfo-format-defun-1 t))
  899.  
  900. (defun texinfo-format-defunx ()
  901.   (texinfo-format-defun-1 nil))
  902.  
  903. (defun texinfo-format-defun-1 (first-p)
  904.   (let ((args (texinfo-format-parse-defun-args))
  905.     (type (get texinfo-command-name 'texinfo-defun-type)))
  906.     (texinfo-discard-command)
  907.     (if (eq type 'arg)
  908.     (progn (setq type (car args))
  909.            (setq args (cdr args))))
  910.     (let ((formatter (get texinfo-command-name 'texinfo-defun-format-type)))
  911.       (if formatter
  912.       (setq type (funcall formatter type args))))
  913.     ;; Delete extra newline inserted after previous header line.
  914.     (if (not first-p)
  915.     (delete-char -1))
  916.     (insert "* " type ": " (car args))
  917.     (let ((args (cdr args)))
  918.       (while args
  919.     (insert " "
  920.         (if (= ?& (aref (car args) 0))
  921.             (car args)
  922.           (upcase (car args))))
  923.     (setq args (cdr args))))
  924.     ;; Insert extra newline so that paragraph filling does not mess
  925.     ;; with header line.
  926.     (insert "\n\n")
  927.     (rplaca (cdr (cdr (car texinfo-stack))) (point))
  928.     (let ((indexvar (get texinfo-command-name 'texinfo-defun-index))
  929.       (formatter (get texinfo-command-name 'texinfo-defun-format-index)))
  930.       (set indexvar
  931.        (cons (list (if formatter (funcall formatter type args) (car args))
  932.                texinfo-last-node)
  933.          (symbol-value indexvar))))))
  934.  
  935. (defun texinfo-end-defun ()
  936.   (setq fill-column (+ fill-column 5))
  937.   (texinfo-discard-command)
  938.   (let ((start (nth 1 (texinfo-pop-stack 'defun))))
  939.     (texinfo-do-itemize start)
  940.     ;; Delete extra newline inserted after header.
  941.     (save-excursion
  942.       (goto-char start)
  943.       (delete-char -1))))
  944.  
  945. (put 'deffn 'texinfo-format 'texinfo-format-defun)
  946. (put 'deffnx 'texinfo-format 'texinfo-format-defunx)
  947. (put 'deffn 'texinfo-end 'texinfo-end-defun)
  948. (put 'deffn 'texinfo-defun-type 'arg)
  949. (put 'deffnx 'texinfo-defun-type 'arg)
  950. (put 'deffn 'texinfo-defun-index 'texinfo-findex)
  951. (put 'deffnx 'texinfo-defun-index 'texinfo-findex)
  952.  
  953. (put 'defun 'texinfo-format 'texinfo-format-defun)
  954. (put 'defunx 'texinfo-format 'texinfo-format-defunx)
  955. (put 'defun 'texinfo-end 'texinfo-end-defun)
  956. (put 'defun 'texinfo-defun-type "Function")
  957. (put 'defunx 'texinfo-defun-type "Function")
  958. (put 'defun 'texinfo-defun-index 'texinfo-findex)
  959. (put 'defunx 'texinfo-defun-index 'texinfo-findex)
  960.  
  961. (put 'defmac 'texinfo-format 'texinfo-format-defun)
  962. (put 'defmacx 'texinfo-format 'texinfo-format-defunx)
  963. (put 'defmac 'texinfo-end 'texinfo-end-defun)
  964. (put 'defmac 'texinfo-defun-type "Macro")
  965. (put 'defmacx 'texinfo-defun-type "Macro")
  966. (put 'defmac 'texinfo-defun-index 'texinfo-findex)
  967. (put 'defmacx 'texinfo-defun-index 'texinfo-findex)
  968.  
  969. (put 'defspec 'texinfo-format 'texinfo-format-defun)
  970. (put 'defspecx 'texinfo-format 'texinfo-format-defunx)
  971. (put 'defspec 'texinfo-end 'texinfo-end-defun)
  972. (put 'defspec 'texinfo-defun-type "Special form")
  973. (put 'defspecx 'texinfo-defun-type "Special form")
  974. (put 'defspec 'texinfo-defun-index 'texinfo-findex)
  975. (put 'defspecx 'texinfo-defun-index 'texinfo-findex)
  976.  
  977. (put 'defvr 'texinfo-format 'texinfo-format-defun)
  978. (put 'defvrx 'texinfo-format 'texinfo-format-defunx)
  979. (put 'defvr 'texinfo-end 'texinfo-end-defun)
  980. (put 'defvr 'texinfo-defun-type 'arg)
  981. (put 'defvrx 'texinfo-defun-type 'arg)
  982. (put 'defvr 'texinfo-defun-index 'texinfo-vindex)
  983. (put 'defvrx 'texinfo-defun-index 'texinfo-vindex)
  984.  
  985. (put 'defvar 'texinfo-format 'texinfo-format-defun)
  986. (put 'defvarx 'texinfo-format 'texinfo-format-defunx)
  987. (put 'defvar 'texinfo-end 'texinfo-end-defun)
  988. (put 'defvar 'texinfo-defun-type "Variable")
  989. (put 'defvarx 'texinfo-defun-type "Variable")
  990. (put 'defvar 'texinfo-defun-index 'texinfo-vindex)
  991. (put 'defvarx 'texinfo-defun-index 'texinfo-vindex)
  992.  
  993. (put 'defopt 'texinfo-format 'texinfo-format-defun)
  994. (put 'defoptx 'texinfo-format 'texinfo-format-defunx)
  995. (put 'defopt 'texinfo-end 'texinfo-end-defun)
  996. (put 'defopt 'texinfo-defun-type "User Option")
  997. (put 'defoptx 'texinfo-defun-type "User Option")
  998. (put 'defopt 'texinfo-defun-index 'texinfo-vindex)
  999. (put 'defoptx 'texinfo-defun-index 'texinfo-vindex)
  1000.  
  1001. (put 'deftp 'texinfo-format 'texinfo-format-defun)
  1002. (put 'deftpx 'texinfo-format 'texinfo-format-defunx)
  1003. (put 'deftp 'texinfo-end 'texinfo-end-defun)
  1004. (put 'deftp 'texinfo-defun-type 'arg)
  1005. (put 'deftpx 'texinfo-defun-type 'arg)
  1006. (put 'deftp 'texinfo-defun-index 'texinfo-tindex)
  1007. (put 'deftpx 'texinfo-defun-index 'texinfo-tindex)
  1008.  
  1009. ;;; Object-oriented stuff is a little hairier.
  1010.  
  1011. (put 'defop 'texinfo-format 'texinfo-format-defun)
  1012. (put 'defopx 'texinfo-format 'texinfo-format-defunx)
  1013. (put 'defop 'texinfo-end 'texinfo-end-defun)
  1014. (put 'defop 'texinfo-defun-type 'arg)
  1015. (put 'defopx 'texinfo-defun-type 'arg)
  1016. (put 'defop 'texinfo-defun-format-type 'texinfo-format-defop-type)
  1017. (put 'defopx 'texinfo-defun-format-type 'texinfo-format-defop-type)
  1018. (put 'defop 'texinfo-defun-index 'texinfo-findex)
  1019. (put 'defopx 'texinfo-defun-index 'texinfo-findex)
  1020. (put 'defop 'texinfo-defun-format-index 'texinfo-format-defop-index)
  1021. (put 'defopx 'texinfo-defun-format-index 'texinfo-format-defop-index)
  1022.  
  1023. (put 'defmethod 'texinfo-format 'texinfo-format-defun)
  1024. (put 'defmethodx 'texinfo-format 'texinfo-format-defunx)
  1025. (put 'defmethod 'texinfo-end 'texinfo-end-defun)
  1026. (put 'defmethod 'texinfo-defun-type "Operation")
  1027. (put 'defmethodx 'texinfo-defun-type "Operation")
  1028. (put 'defmethod 'texinfo-defun-format-type 'texinfo-format-defop-type)
  1029. (put 'defmethodx 'texinfo-defun-format-type 'texinfo-format-defop-type)
  1030. (put 'defmethod 'texinfo-defun-index 'texinfo-findex)
  1031. (put 'defmethodx 'texinfo-defun-index 'texinfo-findex)
  1032. (put 'defmethod 'texinfo-defun-format-index 'texinfo-format-defop-index)
  1033. (put 'defmethodx 'texinfo-defun-format-index 'texinfo-format-defop-index)
  1034.  
  1035. (defun texinfo-format-defop-type (type args)
  1036.   (format "%s on %s" type (car args)))
  1037.  
  1038. (defun texinfo-format-defop-index (type args)
  1039.   (format "%s on %s" (car (cdr args)) (car args)))
  1040.  
  1041. (put 'defcv 'texinfo-format 'texinfo-format-defun)
  1042. (put 'defcvx 'texinfo-format 'texinfo-format-defunx)
  1043. (put 'defcv 'texinfo-end 'texinfo-end-defun)
  1044. (put 'defcv 'texinfo-defun-type 'arg)
  1045. (put 'defcvx 'texinfo-defun-type 'arg)
  1046. (put 'defcv 'texinfo-defun-format-type 'texinfo-format-defcv-type)
  1047. (put 'defcvx 'texinfo-defun-format-type 'texinfo-format-defcv-type)
  1048. (put 'defcv 'texinfo-defun-index 'texinfo-vindex)
  1049. (put 'defcvx 'texinfo-defun-index 'texinfo-vindex)
  1050. (put 'defcv 'texinfo-defun-format-index 'texinfo-format-defcv-index)
  1051. (put 'defcvx 'texinfo-defun-format-index 'texinfo-format-defcv-index)
  1052.  
  1053. (put 'defivar 'texinfo-format 'texinfo-format-defun)
  1054. (put 'defivarx 'texinfo-format 'texinfo-format-defunx)
  1055. (put 'defivar 'texinfo-end 'texinfo-end-defun)
  1056. (put 'defivar 'texinfo-defun-type "Instance variable")
  1057. (put 'defivarx 'texinfo-defun-type "Instance variable")
  1058. (put 'defivar 'texinfo-defun-format-type 'texinfo-format-defcv-type)
  1059. (put 'defivarx 'texinfo-defun-format-type 'texinfo-format-defcv-type)
  1060. (put 'defivar 'texinfo-defun-index 'texinfo-vindex)
  1061. (put 'defivarx 'texinfo-defun-index 'texinfo-vindex)
  1062. (put 'defivar 'texinfo-defun-format-index 'texinfo-format-defcv-index)
  1063. (put 'defivarx 'texinfo-defun-format-index 'texinfo-format-defcv-index)
  1064.  
  1065. (defun texinfo-format-defcv-type (type args)
  1066.   (format "%s of %s" type (car args)))
  1067.  
  1068. (defun texinfo-format-defcv-index (type args)
  1069.   (format "%s of %s" (car (cdr args)) (car args)))
  1070.  
  1071. ;; process included files
  1072. (put 'include 'texinfo-format 'texinfo-format-include)
  1073. (defun texinfo-format-include ()
  1074.   (let ((filename (texinfo-parse-arg-discard))
  1075.     (default-directory input-directory)
  1076.     subindex)
  1077.     (setq subindex
  1078.       (save-excursion
  1079.         (progn (find-file
  1080.             (cond ((file-readable-p (concat filename ".texinfo"))
  1081.                (concat filename ".texinfo"))
  1082.               ((file-readable-p (concat filename ".tex"))
  1083.                (concat filename ".tex"))
  1084.               ((file-readable-p filename)
  1085.                filename)
  1086.               (t (error "@include'd file %s not found"
  1087.                     filename))))
  1088.            (texinfo-format-buffer-1))))
  1089.     (texinfo-subindex 'texinfo-vindex (car subindex) (nth 1 subindex))
  1090.     (texinfo-subindex 'texinfo-findex (car subindex) (nth 2 subindex))
  1091.     (texinfo-subindex 'texinfo-cindex (car subindex) (nth 3 subindex))
  1092.     (texinfo-subindex 'texinfo-pindex (car subindex) (nth 4 subindex))
  1093.     (texinfo-subindex 'texinfo-tindex (car subindex) (nth 5 subindex))
  1094.     (texinfo-subindex 'texinfo-kindex (car subindex) (nth 6 subindex))))
  1095.  
  1096. (defun texinfo-subindex (indexvar file content)
  1097.   (set indexvar (cons (list 'recurse file content)
  1098.               (symbol-value indexvar))))
  1099.  
  1100.  
  1101. ;; Lots of bolio constructs do nothing in texinfo.
  1102.  
  1103. (put 'need 'texinfo-format 'texinfo-discard-line-with-args)
  1104. (put 'page 'texinfo-format 'texinfo-discard-line-with-args)
  1105. (put 'c 'texinfo-format 'texinfo-discard-line-with-args)
  1106. (put 'comment 'texinfo-format 'texinfo-discard-line-with-args)
  1107. (put 'setchapternewpage 'texinfo-format 'texinfo-discard-line-with-args)
  1108. (put 'contents 'texinfo-format 'texinfo-discard-line-with-args)
  1109. (put 'summarycontents 'texinfo-format 'texinfo-discard-line-with-args)
  1110. (put 'nopara 'texinfo-format 'texinfo-discard-line-with-args)
  1111. (put 'noindent 'texinfo-format 'texinfo-discard-line-with-args)
  1112. (put 'setx 'texinfo-format 'texinfo-discard-line-with-args)
  1113. (put 'setq 'texinfo-format 'texinfo-discard-line-with-args)
  1114. (put 'settitle 'texinfo-format 'texinfo-discard-line-with-args)
  1115. (put 'defindex 'texinfo-format 'texinfo-discard-line-with-args)
  1116. (put 'synindex 'texinfo-format 'texinfo-discard-line-with-args)
  1117. (put 'hsize 'texinfo-format 'texinfo-discard-line-with-args)
  1118. (put 'parindent 'texinfo-format 'texinfo-discard-line-with-args)
  1119. (put 'lispnarrowing 'texinfo-format 'texinfo-discard-line-with-args)
  1120. (put 'itemindent 'texinfo-format 'texinfo-discard-line-with-args)
  1121. (put 'headings 'texinfo-format 'texinfo-discard-line-with-args)
  1122. (put 'group 'texinfo-format 'texinfo-discard-line-with-args)
  1123. (put 'group 'texinfo-end 'texinfo-discard-line-with-args)
  1124. (put 'bye 'texinfo-format 'texinfo-discard-line)
  1125. (put 'smallbook 'texinfo-format 'texinfo-discard-line)
  1126.  
  1127. (defun texinfo-discard-line-with-args ()
  1128.   (goto-char texinfo-command-start)
  1129.   (delete-region (point) (progn (forward-line 1) (point))))
  1130.  
  1131. ;; Sort an index which is in the current buffer between START and END.
  1132. ;; Used on VMS, where the `sort' utility is not available.
  1133. (defun texinfo-sort-region (start end)
  1134.   (require 'sort)
  1135.   (save-restriction
  1136.     (narrow-to-region start end)
  1137.     (sort-subr nil 'forward-line 'end-of-line 'texinfo-sort-startkeyfun)))
  1138.  
  1139. ;; Subroutine for sorting an index.
  1140. ;; At start of a line, return a string to sort the line under.
  1141. (defun texinfo-sort-startkeyfun ()
  1142.   (let ((line
  1143.      (buffer-substring (point) (save-excursion (end-of-line) (point)))))
  1144.     ;; Canonicalize whitespace and eliminate funny chars.
  1145.     (while (string-match "[ \t][ \t]+\\|[^a-z0-9 ]+" line)
  1146.       (setq line (concat (substring line 0 (match-beginning 0))
  1147.              " "
  1148.              (substring line (match-end 0) (length line)))))
  1149.     line))
  1150.  
  1151. ;; Some cannot be handled
  1152.  
  1153. (defun texinfo-unsupported ()
  1154.   (error "%s is not handled by texinfo"
  1155.      (buffer-substring texinfo-command-start texinfo-command-end)))
  1156.  
  1157. (defun batch-texinfo-format ()
  1158.   "Runs  texinfo-format-buffer  on the files remaining on the command line.
  1159. Must be used only with -batch, and kills emacs on completion.
  1160. Each file will be processed even if an error occurred previously.
  1161. For example, invoke
  1162.   \"emacs -batch -funcall batch-texinfo-format $docs/ ~/*.texinfo\"."
  1163.   (if (not noninteractive)
  1164.       (error "batch-texinfo-format may only be used -batch."))
  1165.   (let ((version-control t)
  1166.     (auto-save-default nil)
  1167.     (find-file-run-dired nil)
  1168.     (kept-old-versions 259259)
  1169.     (kept-new-versions 259259))
  1170.     (let ((error 0)
  1171.       file
  1172.       (files ()))
  1173.       (while command-line-args-left
  1174.     (setq file (expand-file-name (car command-line-args-left)))
  1175.     (cond ((not (file-exists-p file))
  1176.            (message ">> %s does not exist!" file)
  1177.            (setq error 1
  1178.              command-line-args-left (cdr command-line-args-left)))
  1179.           ((file-directory-p file)
  1180.            (setq command-line-args-left
  1181.              (nconc (directory-files file)
  1182.                 (cdr command-line-args-left))))
  1183.           (t
  1184.            (setq files (cons file files)
  1185.              command-line-args-left (cdr command-line-args-left)))))
  1186.       (while files
  1187.     (setq file (car files)
  1188.           files (cdr files))
  1189.     (condition-case err
  1190.         (progn
  1191.           (if buffer-file-name (kill-buffer (current-buffer)))
  1192.           (find-file file)
  1193.           (buffer-flush-undo (current-buffer))
  1194.           (set-buffer-modified-p nil)
  1195.           (texinfo-mode)
  1196.           (message "texinfo formatting %s..." file)
  1197.           (texinfo-format-buffer nil)
  1198.           (if (buffer-modified-p)
  1199.           (progn (message "Saving modified %s" (buffer-file-name))
  1200.              (save-buffer))))
  1201.       (error
  1202.        (message ">> Error: %s" (prin1-to-string err))
  1203.        (message ">>  point at")
  1204.        (let ((s (buffer-substring (point)
  1205.                       (min (+ (point) 100)
  1206.                        (point-max))))
  1207.          (tem 0))
  1208.          (while (setq tem (string-match "\n+" s tem))
  1209.            (setq s (concat (substring s 0 (match-beginning 0))
  1210.                    "\n>>  "
  1211.                    (substring s (match-end 0)))
  1212.              tem (1+ tem)))
  1213.          (message ">>  %s" s))
  1214.        (setq error 1))))
  1215.       (kill-emacs error))))
  1216.