Annotation of OpenXM_contrib/gnuplot/docs/doc2texi.el, Revision 1.1
1.1 ! maekawa 1: ;;;; doc2texi.el -- generate a texinfo file from the gnuplot doc file
! 2:
! 3: ;; Copyright (C) 1999 Bruce Ravel
! 4:
! 5: ;; Author: Bruce Ravel <ravel@phys.washington.edu>
! 6: ;; Maintainer: Bruce Ravel <ravel@phys.washington.edu>
! 7: ;; Created: March 23 1999
! 8: ;; Updated: May 28 1999
! 9: ;; Version: 0.2
! 10: ;; Keywords: gnuplot, document, info
! 11:
! 12: ;; This file is not part of GNU Emacs.
! 13:
! 14: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
! 15: ;; This lisp script is distributed in the hope that it will be useful,
! 16: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
! 17: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
! 18: ;;
! 19: ;; Permission is granted to distribute copies of this lisp script
! 20: ;; provided the copyright notice and this permission are preserved in
! 21: ;; all copies.
! 22: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
! 23: ;; send bug reports to the author (ravel@phys.washington.edu)
! 24: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
! 25: ;;; Commentary:
! 26: ;;
! 27: ;; I suppose the most immediate question to ask is "Why do this in
! 28: ;; emacs lisp???" While it is true that the gnuplot.doc file lends
! 29: ;; itself to processing by a 1 pass filter, there are some aspects of
! 30: ;; texinfo files that are a bit tricky and would require 2 or perhaps
! 31: ;; three passes. Specifically, getting all of the cross references
! 32: ;; made correctly is a lot of work. Fortunately, texinfo-mode has
! 33: ;; functions for building menus and updating nodes. This saves a lot
! 34: ;; of sweat and is the principle reason why I decided to write this is
! 35: ;; emacs lisp.
! 36: ;;
! 37: ;; Everything else in gnuplot is written in C for the sake of
! 38: ;; portability. Emacs lisp, of course, requires that you have emacs.
! 39: ;; For many gnuplot users, that is not a good assumption. However,
! 40: ;; the likelihood of needing info files in the absence of emacs is
! 41: ;; very, very slim. I think it is safe to say that someone who needs
! 42: ;; info files has emacs installed and thus will be able to use this
! 43: ;; program.
! 44: ;;
! 45: ;; Since this is emacs, I am not treating the gnuplot.doc file as a
! 46: ;; text stream. It seems much more efficient in this context to treat
! 47: ;; it as a buffer. All of the work is done by the function
! 48: ;; `d2t-doc-to-texi'. Each of the conversion chores is handled by an
! 49: ;; individual function. Each of thse functions is very similar in
! 50: ;; structure. They start at the top of the buffer, search forward for
! 51: ;; a line matching the text element being converted, perform the
! 52: ;; replacement in place, and move on until the end of the buffer.
! 53: ;; These text manipulations are actually quite speedy. The slow part
! 54: ;; of the process is using the texinfo-mode function to update the
! 55: ;; nodes and menus. However, using these slow functions has one
! 56: ;; advantage -- the texinfo-mode functions for doing menus and nodes
! 57: ;; are certain to do the job correctly. Although rather slow, this
! 58: ;; approach doesn't totally suck compared to the time cost of
! 59: ;; compiling and running a C program. And the output from this is
! 60: ;; much more useful than the output from the doc2info program.
! 61: ;;
! 62: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
! 63: ;;; Use:
! 64: ;;
! 65: ;; Customize the variables at the start of the executable code. Then
! 66: ;; I intend that this be used from the command line or from a Makefile
! 67: ;; like so:
! 68: ;;
! 69: ;; emacs -batch -l doc2texi.el -f d2t-doc-to-texi
! 70: ;;
! 71: ;; or
! 72: ;;
! 73: ;; emacs -batch -l doc2texi.el -f d2t-doc-to-texi-verbosely
! 74: ;;
! 75: ;; This will start emacs in batch mode, load this file, run the
! 76: ;; converter, then quit. This takes about 30 seconds my 133 MHz
! 77: ;; Pentium. It also sends a large number of mesages to stderr, so you
! 78: ;; may want to redirect stderr to /dev/null or to a file.
! 79: ;;
! 80: ;; Then you can do
! 81: ;;
! 82: ;; makeinfo gnuplot.info
! 83: ;;
! 84: ;; You may want to use the --no-split option.
! 85: ;;
! 86: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
! 87: ;;; History:
! 88: ;;
! 89: ;; 0.1 Mar 23 1999 <BR> Initial version
! 90: ;; 0.2 May 28 1999 <BR>
! 91: ;; 0.3 Jun 2 1999 <BR> Added terminal information, fixed uref problem.
! 92: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
! 93: ;;; Acknowledgements:
! 94: ;;
! 95: ;; Lars Hecking asked me to look into the doc -> info problem. Silly
! 96: ;; me, I said "ok." This is what I came up with.
! 97: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
! 98: ;;; To do:
! 99: ;;
! 100: ;; -- internal cross-references: these are not perfect due to
! 101: ;; inconsistencies in the use of `` and case inconsistencies in
! 102: ;; the text. The latter can be fixed. Also I need a way to not
! 103: ;; make the @ref if point is currently in that region.
! 104: ;; -- catch errors gracefully, particularly when looking for files.
! 105: ;; -- are guesses about OS specific terminal information correct?
! 106: ;; -- turn the lists in the "What's New" and "xlabel" sections into
! 107: ;; proper lists. "^\\([0-9]\\)+\." finds the list items. If
! 108: ;; (match-string 1) is "1" then insert "@enumerate\n@item\n", else
! 109: ;; insert "@item\n". also use (replace-match ""). need to find
! 110: ;; the end somehow.
! 111: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
! 112: ;;; Code:
! 113:
! 114: ;;; You may need to customize these variables:
! 115: (defvar d2t-doc-file-name "gnuplot.doc"
! 116: "Name of the gnuplot.doc file.")
! 117: (defvar d2t-terminal-directory (expand-file-name "../term/")
! 118: "Location of .trm files in gnuplot source tree.")
! 119:
! 120:
! 121: ;;; You should not need to touch anything below here ;;;;;;;;;;;;;;;;;;;;;
! 122:
! 123: (require 'cl)
! 124: (eval-and-compile ; need split-string to do xrefs
! 125: (if (fboundp 'split-string)
! 126: ()
! 127: (defun split-string (string &optional pattern)
! 128: "Return a list of substrings of STRING which are separated by PATTERN.
! 129: If PATTERN is omitted, it defaults to \"[ \\f\\t\\n\\r\\v]+\"."
! 130: (or pattern
! 131: (setq pattern "[ \f\t\n\r\v]+"))
! 132: (let (parts (start 0))
! 133: (while (string-match pattern string start)
! 134: (setq parts (cons (substring string start (match-beginning 0)) parts)
! 135: start (match-end 0)))
! 136: (nreverse (cons (substring string start) parts)))) ))
! 137:
! 138: (defconst d2t-work-buffer-name "*doc2texi*"
! 139: "Name of scratch buffer where the doc file will be converted into a
! 140: texi file.")
! 141: (defconst d2t-scratch-buffer-name "*doc2texi-output*")
! 142: (defconst d2t-terminal-buffer-name "*doc2texi-terminal*")
! 143: (defvar d2t-verbose nil)
! 144: (defconst d2t-texi-filename "gnuplot.texi")
! 145:
! 146: (defconst d2t-texi-header
! 147: "\\input texinfo @c -*-texinfo-*-
! 148:
! 149: @c %**start of header
! 150: @setfilename gnuplot.info
! 151: @settitle Gnuplot: An Interactive Plotting Program
! 152: @setchapternewpage odd
! 153: @c %**end of header
! 154:
! 155: @c define the command and options indeces
! 156: @defindex cm
! 157: @defindex op
! 158: @defindex tm
! 159:
! 160: @direntry
! 161: * GNUPLOT: (gnuplot). An Interactive Plotting Program
! 162: @end direntry
! 163:
! 164: @ifnottex
! 165: @node Top, gnuplot, (dir), (dir)
! 166: @top Master Menu
! 167: @end ifnottex
! 168:
! 169: @example
! 170: GNUPLOT
! 171:
! 172: An Interactive Plotting Program
! 173: Thomas Williams & Colin Kelley
! 174: Version 3.7 organized by: David Denholm
! 175:
! 176: Copyright (C) 1986 - 1993, 1998 Thomas Williams, Colin Kelley
! 177:
! 178: Mailing list for comments: info-gnuplot@@dartmouth.edu
! 179: Mailing list for bug reports: bug-gnuplot@@dartmouth.edu
! 180:
! 181: This manual was prepared by Dick Crawford
! 182: 3 December 1998
! 183:
! 184:
! 185: Major contributors (alphabetic order):
! 186: @end example
! 187:
! 188: "
! 189: "Texinfo header.")
! 190:
! 191: (defconst d2t-main-menu
! 192: "@menu
! 193: @end menu"
! 194: "Main menu.")
! 195:
! 196: (defconst d2t-texi-footer
! 197: "@node Concept_Index, Command_Index, Bugs, Top
! 198: @unnumbered Concept Index
! 199: @printindex cp
! 200:
! 201: @node Command_Index, Option_Index, Concept_Index, Top
! 202: @unnumbered Command Index
! 203: @printindex cm
! 204:
! 205: @node Options_Index, Function_Index, Command_Index, Top
! 206: @unnumbered Options Index
! 207: @printindex op
! 208:
! 209: @node Function_Index, Terminal_Index, Options_Index, Top
! 210: @unnumbered Function Index
! 211: @printindex fn
! 212:
! 213: @node Terminal_Index, , Options_Index, Top
! 214: @unnumbered Terminal Index
! 215: @printindex tm
! 216:
! 217: @c @shortcontents
! 218: @contents
! 219: @bye
! 220: "
! 221: "Texinfo file terminator.")
! 222:
! 223: (defvar d2t-level-1-alist nil
! 224: "Alist of level 1 tags and markers.")
! 225: (defvar d2t-level-2-alist nil
! 226: "Alist of level 2 tags and markers.")
! 227: (defvar d2t-level-3-alist nil
! 228: "Alist of level 3 tags and markers.")
! 229: (defvar d2t-level-4-alist nil
! 230: "Alist of level 4 tags and markers.")
! 231: (defvar d2t-level-5-alist nil
! 232: "Alist of level 5 tags and markers.")
! 233: (defvar d2t-commands-alist nil
! 234: "Alist of commands and markers.")
! 235: (defvar d2t-set-show-alist nil
! 236: "Alist of options and markers.")
! 237: (defvar d2t-functions-alist nil
! 238: "Alist of functions and markers.")
! 239: (defvar d2t-terminals-alist nil
! 240: "Alist of terminal types and markers.")
! 241: (defvar d2t-node-list nil
! 242: "List of nodes.")
! 243:
! 244: (defvar d2t-terminal-list ())
! 245: (setq d2t-terminal-list
! 246: '("ai"
! 247: "cgm"
! 248: "corel"
! 249: "dumb"
! 250: "dxf"
! 251: "eepic"
! 252: "epson"
! 253: "fig"
! 254: "gif"
! 255: "hp26"
! 256: "hp2648"
! 257: "hp500c"
! 258: "hpgl"
! 259: "hpljii"
! 260: "hppj"
! 261: "imagen"
! 262: "latex"
! 263: "metafont"
! 264: "mif"
! 265: "pbm"
! 266: "png"
! 267: "post"
! 268: "pslatex"
! 269: "pstricks"
! 270: "qms"
! 271: "table"
! 272: "tek"
! 273: "texdraw"
! 274: "tkcanvas"
! 275: "tpic"))
! 276:
! 277: (defun d2t-doc-to-texi-verbosely ()
! 278: "Run `d2t-doc-to-texi' noisily"
! 279: (interactive)
! 280: (setq d2t-verbose t)
! 281: (d2t-doc-to-texi))
! 282:
! 283: (defun d2t-doc-to-texi ()
! 284: "This is the doc to texi converter function.
! 285: It calls a bunch of other functions, each of which handles one
! 286: particular conversion chore."
! 287: (interactive)
! 288: (setq d2t-level-1-alist nil ;; initialize variables
! 289: d2t-level-2-alist nil
! 290: d2t-level-3-alist nil
! 291: d2t-level-4-alist nil
! 292: d2t-level-5-alist nil
! 293: d2t-commands-alist nil
! 294: d2t-set-show-alist nil
! 295: d2t-functions-alist nil
! 296: d2t-terminals-alist nil
! 297: d2t-node-list nil)
! 298: ;; open the doc file and get some data about its contents
! 299: (d2t-prepare-workspace)
! 300: (message "Inserting help for terminals ...")
! 301: (d2t-get-terminals)
! 302: (message "Analyzing doc file ...")
! 303: (d2t-get-levels)
! 304: (d2t-get-commands)
! 305: (d2t-get-set-show)
! 306: (d2t-get-functions)
! 307: ;; convert the buffer from doc to texi, one element at a time
! 308: (message "Converting to texinfo ...")
! 309: (d2t-braces-atsigns) ;; this must be the first conversion function
! 310: (d2t-comments) ;; delete comments
! 311: (d2t-sectioning) ;; chapters, sections, etc
! 312: (d2t-indexing) ;; index markup
! 313: (d2t-tables) ;; fix up tables
! 314: (d2t-handle-html) ;; fix up html markup
! 315: (d2t-first-column) ;; left justify normal text
! 316: (d2t-enclose-examples) ;; turn indented text into @examples
! 317: (message "Menus, nodes, xrefs ...")
! 318: (d2t-make-refs)
! 319: ;(d2t-make-menus)
! 320: ;(d2t-set-nodes)
! 321: (save-excursion ;; fix a few more things explicitly
! 322: (goto-char (point-min))
! 323: (insert d2t-texi-header)
! 324: (search-forward "@node")
! 325: ;; (beginning-of-line)
! 326: ;; (insert "\n\n" d2t-main-menu "\n\n")
! 327: (search-forward "@node Old_bugs") ; `texinfo-all-menus-update' seems
! 328: (beginning-of-line) ; to miss this one. how odd.
! 329: (insert "@menu\n* Old_bugs::\t\t\t\n@end menu\n\n")
! 330: (goto-char (point-max))
! 331: (insert d2t-texi-footer))
! 332: (load-library "texinfo") ;; now do the hard stuff with texinfo-mode
! 333: (texinfo-mode)
! 334: (let ((message-log-max 0)
! 335: (standard-output (get-buffer-create d2t-scratch-buffer-name)))
! 336: (message "Making texinfo nodes ...\n")
! 337: (texinfo-every-node-update)
! 338: (message "Making texinfo menus ...\n")
! 339: (texinfo-all-menus-update))
! 340: (write-file d2t-texi-filename) ) ; save it and done!
! 341:
! 342: (defun d2t-prepare-workspace ()
! 343: "Create a scratch buffer and populate it with gnuplot.doc."
! 344: (and d2t-verbose (message " Doing d2t-prepare-workspace ..."))
! 345: (if (get-buffer d2t-work-buffer-name)
! 346: (kill-buffer d2t-work-buffer-name))
! 347: (if (get-buffer d2t-texi-filename)
! 348: (kill-buffer d2t-texi-filename))
! 349: (if (get-buffer d2t-terminal-buffer-name)
! 350: (kill-buffer d2t-terminal-buffer-name))
! 351: (get-buffer-create d2t-terminal-buffer-name)
! 352: (set-buffer (get-buffer-create d2t-work-buffer-name))
! 353: (insert-file-contents d2t-doc-file-name)
! 354: (goto-char (point-min)))
! 355:
! 356:
! 357: (defun d2t-get-terminals ()
! 358: "Insert all appropriate terminal help."
! 359: (let ((case-fold-search t))
! 360: (if (string-match "linux" system-configuration)
! 361: (setq d2t-terminal-list (append d2t-terminal-list
! 362: '("linux"))))
! 363: (if (string-match "amiga" system-configuration)
! 364: (setq d2t-terminal-list (append d2t-terminal-list
! 365: '("amiga"))))
! 366: (if (string-match "atari" system-configuration)
! 367: (setq d2t-terminal-list (append d2t-terminal-list
! 368: '("atarivdi" "multitos" "atariaes"))))
! 369: (if (string-match "mac" system-configuration)
! 370: (setq d2t-terminal-list (append d2t-terminal-list
! 371: '("mac"))))
! 372: (if (string-match "beos" system-configuration)
! 373: (setq d2t-terminal-list (append d2t-terminal-list
! 374: '("be"))))
! 375: (if (string-match "dos" system-configuration)
! 376: (setq d2t-terminal-list (append d2t-terminal-list
! 377: '("emxvga" "djsvga" "fg" "pc"))))
! 378: (if (string-match "windows" (format "%s" system-type))
! 379: (setq d2t-terminal-list (append d2t-terminal-list
! 380: '("win"))))
! 381: (if (string-match "next" system-configuration)
! 382: (setq d2t-terminal-list (append d2t-terminal-list
! 383: '("next"))))
! 384: (if (string-match "os2" system-configuration)
! 385: (setq d2t-terminal-list (append d2t-terminal-list
! 386: '("pm" "emxvga"))))
! 387: (if (string-match "irix" system-configuration)
! 388: (setq d2t-terminal-list (append d2t-terminal-list
! 389: '("iris4d"))))
! 390: (if (string-match "sco" system-configuration)
! 391: (setq d2t-terminal-list (append d2t-terminal-list
! 392: '("cgi"))))
! 393: (if (string-match "sun" system-configuration)
! 394: (setq d2t-terminal-list (append d2t-terminal-list
! 395: '("sun"))))
! 396: (if (string-match "vms" system-configuration)
! 397: (setq d2t-terminal-list (append d2t-terminal-list
! 398: '("vws"))))
! 399: (unless (member* system-configuration '("dos" "windows" "atari" "amiga")
! 400: :test 'string-match)
! 401: (setq d2t-terminal-list
! 402: (append d2t-terminal-list
! 403: '("x11" "tgif" "gpic" "regis" "t410x" "tex" "xlib")))) )
! 404: (setq d2t-terminal-list (sort d2t-terminal-list 'string<))
! 405: (let ((list d2t-terminal-list) file node marker)
! 406: (save-excursion
! 407: (when (re-search-forward "^<4" (point-max) t)
! 408: (beginning-of-line)
! 409: (insert "@c ")
! 410: (forward-line 1)
! 411: (while list
! 412: (and d2t-verbose (message " %s ..." (car list)))
! 413: (setq file (concat d2t-terminal-directory (car list) ".trm"))
! 414: (when (file-exists-p file)
! 415: (set-buffer d2t-terminal-buffer-name)
! 416: (erase-buffer)
! 417: (insert-file-contents file)
! 418: ;; find the terminal help
! 419: (when (search-forward "START_HELP" (point-max) "to_end")
! 420: (forward-line 1)
! 421: (delete-region (point-min) (point-marker))
! 422: (search-forward "END_HELP" (point-max) "to_end")
! 423: (beginning-of-line)
! 424: (delete-region (point-marker) (point-max))
! 425: ;; tidy up the terminal help content
! 426: (goto-char (point-min))
! 427: (while (re-search-forward "\",[ \t]*$" nil t)
! 428: (replace-match "" nil nil))
! 429: (goto-char (point-min))
! 430: (while (re-search-forward "^\"" nil t)
! 431: (replace-match "" nil nil))
! 432: (goto-char (point-min))
! 433: (while (re-search-forward "\\\\\"" nil t)
! 434: (replace-match "\"" nil nil))
! 435: (goto-char (point-min))
! 436: (while (re-search-forward "^1[ \t]+\\(.+\\)$" nil t)
! 437: (setq node (match-string 1)
! 438: marker (point-marker))
! 439: (replace-match (concat "4 " node) nil nil))
! 440: (goto-char (point-min))
! 441: (while (re-search-forward "^2" nil t)
! 442: (replace-match "5 " nil nil))
! 443: (goto-char (point-min))
! 444: ;; set up terminals index
! 445: (while (re-search-forward "^\?\\([^ ]+\\)$" nil t)
! 446: (let ((word (match-string 1)))
! 447: (unless (string-match "_\\|command-line-options" word)
! 448: (setq d2t-terminals-alist
! 449: (append d2t-terminals-alist
! 450: (list (cons word (point-marker))))))))
! 451: ;; and cram it into the doc buffer
! 452: (set-buffer d2t-work-buffer-name)
! 453: (insert-buffer-substring d2t-terminal-buffer-name)
! 454: ))
! 455: (setq list (cdr list))
! 456: )))))
! 457:
! 458: ;;; functions for obtaining lists of nodes in the document
! 459:
! 460: (defun d2t-get-levels ()
! 461: "Find positions of all nodes in the doc."
! 462: (and d2t-verbose (message " Doing d2t-get-levels ..."))
! 463: (let ((list '("1" "2" "3" "4" "5")) str)
! 464: (while list
! 465: (setq str (concat "d2t-level-" (car list) "-alist"))
! 466: (and d2t-verbose (message " %s ..." str))
! 467: (save-excursion
! 468: (while (not (eobp))
! 469: (when (re-search-forward (concat "^" (car list) " \\(.+\\)$")
! 470: (point-max) "to_end")
! 471: (beginning-of-line)
! 472: (set (intern str)
! 473: (append (eval (intern str))
! 474: (list (cons (match-string 1) (point-marker)))))
! 475: (forward-line 1))))
! 476: (setq list (cdr list)))))
! 477:
! 478:
! 479: (defun d2t-get-commands ()
! 480: "Find all commands in the doc."
! 481: (and d2t-verbose (message " Doing d2t-get-commands ..."))
! 482: (save-excursion
! 483: (let ((alist d2t-level-1-alist) start end)
! 484: (while alist
! 485: (if (string= (caar alist) "Commands")
! 486: (setq start (cdar alist) ;; location of "1 Commands"
! 487: end (cdadr alist) ;; location of next level 1 heading
! 488: alist nil)
! 489: (setq alist (cdr alist))))
! 490: ;;(message "%S %S" start end)
! 491: (goto-char start)
! 492: (while (< (point) end)
! 493: (when (re-search-forward "^2 \\(.+\\)$" (point-max) "to_end")
! 494: (beginning-of-line)
! 495: (unless (> (point) end)
! 496: (setq d2t-commands-alist
! 497: (append d2t-commands-alist
! 498: (list (cons (match-string 1) (point-marker))))))
! 499: (forward-line 1))) )))
! 500:
! 501: (defun d2t-get-set-show ()
! 502: "Find all set-show options in the doc."
! 503: (and d2t-verbose (message " Doing d2t-get-set-show ..."))
! 504: (save-excursion
! 505: (let ((alist d2t-commands-alist) start end)
! 506: (while alist
! 507: (if (string= (caar alist) "set-show")
! 508: (setq start (cdar alist) ;; location of "1 set-show"
! 509: end (cdadr alist) ;; location of next level 2 heading
! 510: alist nil)
! 511: (setq alist (cdr alist))))
! 512: ;;(message "%S %S" start end)
! 513: (goto-char start)
! 514: (while (< (point) end)
! 515: (when (re-search-forward "^3 \\(.+\\)$" (point-max) "to_end")
! 516: (beginning-of-line)
! 517: (unless (> (point) end)
! 518: (setq d2t-set-show-alist
! 519: (append d2t-set-show-alist
! 520: (list (cons (match-string 1) (point-marker))))))
! 521: (forward-line 1))) )))
! 522:
! 523:
! 524: (defun d2t-get-functions ()
! 525: "Find all functions in the doc."
! 526: (and d2t-verbose (message " Doing d2t-get-functions ..."))
! 527: (let (begin end)
! 528: (save-excursion ; determine bounds of functions
! 529: (when (re-search-forward "^3 Functions" (point-max) "to_end")
! 530: (beginning-of-line)
! 531: (setq begin (point-marker))
! 532: (forward-line 1)
! 533: (when (re-search-forward "^3 " (point-max) "to_end")
! 534: (beginning-of-line)
! 535: (setq end (point-marker))))
! 536: (goto-char begin)
! 537: (while (< (point) end)
! 538: (when (re-search-forward "^4 \\(.+\\)$" (point-max) "to_end")
! 539: (beginning-of-line)
! 540: (unless (> (point) end)
! 541: (setq d2t-functions-alist
! 542: (append d2t-functions-alist
! 543: (list (cons (match-string 1) (point-marker))))))
! 544: (forward-line 1))) )))
! 545:
! 546: ;; buffer manipulation functions
! 547:
! 548: ;; this can probably be made faster using a let-scoped alist rather
! 549: ;; than the big cons block
! 550: (defun d2t-sectioning ()
! 551: "Find all lines starting with a number.
! 552: These are chapters, sections, etc. Delete these lines and insert the
! 553: appropriate sectioning and @node commands."
! 554: (and d2t-verbose (message " Doing d2t-sectioning ..."))
! 555: (save-excursion
! 556: (while (not (eobp))
! 557: (re-search-forward "^\\([1-9]\\) +\\(.+\\)$" (point-max) "to_end")
! 558: (unless (eobp)
! 559: (let* ((number (match-string 1))
! 560: (word (match-string 2))
! 561: (node (substitute ?_ ? word :test 'char-equal))
! 562: (eol (save-excursion (end-of-line) (point-marker))))
! 563: ;; some node names appear twice. make the second one unique.
! 564: ;; this will fail to work if a third pops up in the future!
! 565: (if (member* node d2t-node-list :test 'string=)
! 566: (setq node (concat node "_")))
! 567: (setq d2t-node-list (append d2t-node-list (list node)))
! 568: (beginning-of-line)
! 569: (delete-region (point-marker) eol)
! 570: (if (string-match "[1-4]" number) (insert "\n@node " node "\n"))
! 571: (cond ((string= number "1")
! 572: (insert "@chapter " word "\n"))
! 573: ((string= number "2")
! 574: (insert "@section " word "\n"))
! 575: ((string= number "3")
! 576: (insert "@subsection " word "\n"))
! 577: ((string= number "4")
! 578: (insert "@subsubsection " word "\n"))
! 579: (t
! 580: (insert "\n\n@noindent --- " (upcase word) " ---\n")) ) )))))
! 581:
! 582: (defun d2t-indexing ()
! 583: "Find all lines starting with a question mark.
! 584: These are index references. Delete these lines and insert the
! 585: appropriate indexing commands. Only index one word ? entries,
! 586: comment out the multi-word ? entries."
! 587: (and d2t-verbose (message " Doing d2t-indexing ..."))
! 588: (save-excursion
! 589: (while (not (eobp))
! 590: (re-search-forward "^\\\?\\([^ \n]+\\) *$" (point-max) "to_end")
! 591: (unless (eobp)
! 592: (let ((word (match-string 1))
! 593: (eol (save-excursion (end-of-line) (point-marker))))
! 594: (beginning-of-line)
! 595: (delete-region (point-marker) eol)
! 596: (insert "@cindex " word "\n")
! 597: (cond ((assoc word d2t-commands-alist)
! 598: (insert "@cmindex " word "\n\n"))
! 599: ((assoc word d2t-set-show-alist)
! 600: (insert "@opindex " word "\n\n"))
! 601: ((assoc word d2t-terminals-alist)
! 602: (insert "@tmindex " word "\n\n"))
! 603: ((assoc word d2t-functions-alist)
! 604: (insert "@findex " word "\n\n"))) )))
! 605: (goto-char (point-min))
! 606: (while (not (eobp))
! 607: (re-search-forward "^\\\?" (point-max) "to_end")
! 608: (unless (eobp)
! 609: (if (looking-at "functions? \\(tm_\\w+\\)")
! 610: (progn
! 611: (beginning-of-line)
! 612: (insert "@findex " (match-string 1) "\n@c "))
! 613: (beginning-of-line)
! 614: (insert "@c ")))) ))
! 615:
! 616: (defun d2t-comments ()
! 617: "Delete comments and lines beginning with # or %.
! 618: # and % lines are used in converting tables into various formats."
! 619: (and d2t-verbose (message " Doing d2t-comments ..."))
! 620: (save-excursion
! 621: (while (not (eobp))
! 622: (re-search-forward "^[C#%]" (point-max) "to_end")
! 623: (unless (eobp)
! 624: (let ((eol (save-excursion (end-of-line)
! 625: (forward-char 1)
! 626: (point-marker))))
! 627: (beginning-of-line)
! 628: (delete-region (point-marker) eol) )))))
! 629:
! 630: (defun d2t-first-column ()
! 631: "Justify normal text to the 0th column.
! 632: This must be run before `d2t-enclose-examples'.
! 633: This is rather slow since there are almost 9000 lines of text."
! 634: (and d2t-verbose (message " Doing d2t-first-column ..."))
! 635: (save-excursion
! 636: (while (not (eobp))
! 637: (and (char-equal (char-after (point)) ? )
! 638: (delete-char 1))
! 639: (forward-line))))
! 640:
! 641: (defun d2t-braces-atsigns ()
! 642: "Prepend @ to @, {, or } everywhere in the doc.
! 643: This MUST be the first conversion function called in
! 644: `d2t-doc-to-texi'."
! 645: (and d2t-verbose (message " Doing d2t-braces-atsigns ..."))
! 646: (save-excursion
! 647: (while (not (eobp))
! 648: (re-search-forward "[@{}]" (point-max) "to_end")
! 649: (unless (eobp)
! 650: (backward-char 1)
! 651: (insert "@")
! 652: (forward-char 1)))))
! 653:
! 654: (defun d2t-tables ()
! 655: "Remove @start table and @end table tags.
! 656: These will be made into @example's by `d2t-enclose-examples'.
! 657: Thus, the plain text formatting already in the doc is used."
! 658: (and d2t-verbose (message " Doing d2t-tables ..."))
! 659: (save-excursion
! 660: (while (not (eobp))
! 661: (re-search-forward "^ *@+start table" (point-max) "to_end")
! 662: (unless (eobp)
! 663: (let ((eol (save-excursion (end-of-line) (point-marker))))
! 664: (beginning-of-line)
! 665: (delete-region (point-marker) eol))))
! 666: ;;(insert "@example")
! 667: (goto-char (point-min))
! 668: (while (not (eobp))
! 669: (re-search-forward "^ *@+end table" (point-max) "to_end")
! 670: (unless (eobp)
! 671: (let ((eol (save-excursion (end-of-line) (point-marker))))
! 672: (beginning-of-line)
! 673: (delete-region (point-marker) eol))))))
! 674: ;;(insert "@end example")
! 675:
! 676:
! 677: (defun d2t-enclose-examples ()
! 678: "Turn indented text in the doc into @examples.
! 679: This must be run after `d2t-first-column'."
! 680: (and d2t-verbose (message " Doing d2t-enclose-examples ..."))
! 681: (save-excursion
! 682: (while (not (eobp))
! 683: (re-search-forward "^ +[^ \n]" (point-max) "to_end")
! 684: (unless (eobp)
! 685: (beginning-of-line)
! 686: (insert "@example\n")
! 687: (forward-line 1)
! 688: (re-search-forward "^[^ ]" (point-max) "to_end")
! 689: (beginning-of-line)
! 690: (insert "@end example\n\n") ))))
! 691:
! 692: (defun d2t-handle-html ()
! 693: "Deal with all of the html markup in the doc."
! 694: (and d2t-verbose (message " Doing d2t-handle-html ..."))
! 695: (save-excursion
! 696: (while (not (eobp))
! 697: (let ((rx (concat "^" (regexp-quote "^")
! 698: " *\\(<?\\)\\([^ \n]+\\)" )))
! 699: (re-search-forward rx (point-max) "to_end")
! 700: (unless (eobp)
! 701: (let ((bracket (match-string 1))
! 702: (tag (match-string 2))
! 703: (eol (save-excursion (end-of-line) (point-marker))))
! 704: (beginning-of-line)
! 705: (cond
! 706: ;; comment out images
! 707: ((and (string= bracket "<") (string= tag "img"))
! 708: (insert "@c "))
! 709: ;; tyepset anchors
! 710: ((and (string= bracket "<") (string-match "^/?a" tag))
! 711: ;(insert "@c fix me!! ")
! 712: (beginning-of-line)
! 713: (if (looking-at (concat "\\^\\s-*<a\\s-+href=" ; opening tag
! 714: "\"\\([^\"]+\\)\">\\s-*" ; url
! 715: "\\([^<]+\\)" ; text
! 716: "[ \t]*\\^?</a>" ; closing tag
! 717: ))
! 718: (replace-match (concat "@uref{"
! 719: (match-string 1)
! 720: ","
! 721: (remove* ?^ (match-string 2)
! 722: :test 'char-equal)
! 723: "}"))))
! 724: ;; translate <ul> </ul> to @itemize environment
! 725: ((and (string= bracket "<") (string-match "^ul" tag))
! 726: (delete-region (point) eol)
! 727: (insert "\n@itemize @bullet"))
! 728: ((and (string= bracket "<") (string-match "/ul" tag))
! 729: (delete-region (point) eol)
! 730: (insert "@end itemize\n"))
! 731: ;; list items
! 732: ((and (string= bracket "<") (string-match "^li" tag))
! 733: (delete-char 5)
! 734: (delete-horizontal-space)
! 735: (insert "@item\n"))
! 736: ;; fix up a few miscellaneous things
! 737: (t ;;(looking-at ".*Terminal Types")
! 738: (insert "@c ")) )
! 739: (forward-line))) ))))
! 740:
! 741:
! 742: (defvar d2t-dont-make-ref
! 743: "^fit f\(x\)\\|gnuplot\\|help\\s-+plotting")
! 744: (defun d2t-make-refs ()
! 745: "Make cross-references in the text."
! 746: (and d2t-verbose (message " Doing d2t-make-refs ..."))
! 747: (let ((big-alist (append d2t-level-1-alist
! 748: d2t-level-2-alist
! 749: d2t-level-3-alist
! 750: d2t-level-4-alist)))
! 751: (save-excursion
! 752: (while (not (eobp))
! 753: (re-search-forward "\\(`\\([^`]+\\)`\\)" (point-max) "to_end")
! 754: (unless (eobp)
! 755: (let* ((b (match-beginning 1))
! 756: (e (match-end 1))
! 757: (list (split-string (match-string 2)))
! 758: (last (car (reverse list)))
! 759: (text (concat "@ref{" last "}")))
! 760: ;;(message "%s %s" (match-string 1) last)
! 761: (when (and (equal t (try-completion last big-alist))
! 762: (not (string= last "gnuplot")))
! 763: (delete-region b e)
! 764: (insert text))))
! 765: ))))
! 766:
! 767: ;;; doc2texi.el ends here
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>