branch: elpa/gnuplot
commit bc2227824f392f8fadd21ffccfffca8f0249b8d6
Author: Daniel Mendler <m...@daniel-mendler.de>
Commit: Daniel Mendler <m...@daniel-mendler.de>

    Add doc2texi.el used to generate gnuplot-eldoc.el and gnuplot.texi
---
 .elpaignore |   3 +-
 .gitignore  |   7 +-
 doc2texi.el | 916 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 922 insertions(+), 4 deletions(-)

diff --git a/.elpaignore b/.elpaignore
index f3f478298d..4516fc0bf4 100644
--- a/.elpaignore
+++ b/.elpaignore
@@ -6,4 +6,5 @@ Makefile
 gnuplot-debug-context.el
 gnuplot-test-context.el
 gnuplot-tests.el
-gpelcard.tex
\ No newline at end of file
+gpelcard.tex
+doc2texi.el
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index b22b44af1c..a9b1d846d8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,14 +3,15 @@
 *.elc
 *.log
 *.pdf
+*.tar.gz
+*.tar.xz
 */#*#
 *~
 .#*
 /#*#
 /*-autoloads.el
 /*-pkg.el
+/gnuplot-*.*.*/
 /gpelcard.ps
 /hacks.el
-/info-look.el
-gnuplot-mode-*.tar.gz
-/gnuplot-*.*.*/
\ No newline at end of file
+/info-look.el
\ No newline at end of file
diff --git a/doc2texi.el b/doc2texi.el
new file mode 100644
index 0000000000..90cab4e26d
--- /dev/null
+++ b/doc2texi.el
@@ -0,0 +1,916 @@
+;;;; doc2texi.el -- generate a texinfo file from the gnuplot doc file
+
+;; Copyright (C) 1999 Bruce Ravel
+
+;; Author:     Bruce Ravel <ra...@phys.washington.edu>
+;; Maintainer: Bruce Ravel <ra...@phys.washington.edu>
+;; Created:    March 23 1999
+;; Updated:    May 28 1999
+;; Version:    0.2
+;; Keywords:   gnuplot, document, info
+
+;; This file is not part of GNU Emacs.
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This lisp script is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+;;
+;; Permission is granted to distribute copies of this lisp script
+;; provided the copyright notice and this permission are preserved in
+;; all copies.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; send bug reports to the author (ra...@phys.washington.edu)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Commentary:
+;;
+;; I suppose the most immediate question to ask is "Why do this in
+;; emacs lisp???"  While it is true that the gnuplot.doc file lends
+;; itself to processing by a 1 pass filter, there are some aspects of
+;; texinfo files that are a bit tricky and would require 2 or perhaps
+;; three passes.  Specifically, getting all of the cross references
+;; made correctly is a lot of work.  Fortunately, texinfo-mode has
+;; functions for building menus and updating nodes.  This saves a lot
+;; of sweat and is the principle reason why I decided to write this in
+;; emacs lisp.
+;;
+;; Everything else in gnuplot is written in C for the sake of
+;; portability.  Emacs lisp, of course, requires that you have emacs.
+;; For many gnuplot users, that is not a good assumption.  However,
+;; the likelihood of needing info files in the absence of emacs is
+;; very, very slim.  I think it is safe to say that someone who needs
+;; info files has emacs installed and thus will be able to use this
+;; program.
+;;
+;; Since this is emacs, I am not treating the gnuplot.doc file as a
+;; text stream.  It seems much more efficient in this context to treat
+;; it as a buffer.  All of the work is done by the function
+;; `d2t-doc-to-texi'.  Each of the conversion chores is handled by an
+;; individual function.  Each of these functions is very similar in
+;; structure.  They start at the top of the buffer, search forward for
+;; a line matching the text element being converted, perform the
+;; replacement in place, and move on until the end of the buffer.
+;; These text manipulations are actually quite speedy.  The slow part
+;; of the process is using the texinfo-mode function to update the
+;; nodes and menus.  However, using these slow functions has one
+;; advantage -- the texinfo-mode functions for doing menus and nodes
+;; are certain to do the job correctly.  Although rather slow, this
+;; approach doesn't totally suck compared to the time cost of
+;; compiling and running a C program.  And the output from this is
+;; much more useful than the output from the doc2info program.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Use:
+;;
+;; Customize the variables at the start of the executable code.  Then
+;; I intend that this be used from the command line or from a Makefile
+;; like so:
+;;
+;;      emacs -batch -l doc2texi.el -f d2t-doc-to-texi
+;;
+;; or
+;;
+;;      emacs -batch -l doc2texi.el -f d2t-doc-to-texi-verbosely
+;;
+;; This will start emacs in batch mode, load this file, run the
+;; converter, then quit.  This takes about 30 seconds my 133 MHz
+;; Pentium.  It also sends a large number of messages to stderr, so you
+;; may want to redirect stderr to /dev/null or to a file.
+;;
+;; Then you can do
+;;
+;;      makeinfo gnuplot.info
+;;
+;; You may want to use the --no-split option.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; History:
+;;
+;;  0.1  Mar 23 1999 <BR> Initial version
+;;  0.2  May 28 1999 <BR>
+;;  0.3  Jun  2 1999 <BR> Added terminal information, fixed uref problem.
+;;  0.4  Feb 23 2012 <jjo> Added generation of gnuplot-eldoc strings file
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Acknowledgements:
+;;
+;; Lars Hecking asked me to look into the doc -> info problem.  Silly
+;; me, I said "ok."  This is what I came up with.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; To do:
+;;
+;;  -- internal cross-references: these are not perfect due to
+;;     inconsistencies in the use of `` and case inconsistencies in
+;;     the text.  The latter can be fixed.  Also I need a way to not
+;;     make the @ref if point is currently in that region.
+;;  -- catch errors gracefully, particularly when looking for files.
+;;  -- are guesses about OS specific terminal information correct?
+;;  -- turn the lists in the "What's New" and "xlabel" sections into
+;;     proper lists.  "^\\([0-9]\\)+\." finds the list items.  If
+;;     (match-string 1) is "1" then insert "@enumerate\n@item\n", else
+;;     insert "@item\n".  also use (replace-match "").  need to find
+;;     the end somehow.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Code:
+
+;;; You may need to customize these variables:
+(defvar d2t-doc-file-name "gnuplot.doc"
+  "Name of the gnuplot.doc file.")
+(defvar d2t-terminal-directory (expand-file-name "../term/")
+  "Location of .trm files in gnuplot source tree.")
+
+
+;;; You should not need to touch anything below here ;;;;;;;;;;;;;;;;;;;;;
+
+(require 'cl)
+(eval-and-compile                      ; need split-string to do xrefs
+  (if (fboundp 'split-string)
+      ()
+    (defun split-string (string &optional pattern)
+      "Return a list of substrings of STRING which are separated by PATTERN.
+If PATTERN is omitted, it defaults to \"[ \\f\\t\\n\\r\\v]+\"."
+      (or pattern
+          (setq pattern "[ \f\t\n\r\v]+"))
+      (let (parts (start 0))
+        (while (string-match pattern string start)
+          (setq parts (cons (substring string start (match-beginning 0)) parts)
+                start (match-end 0)))
+        (nreverse (cons (substring string start) parts)))) ))
+(eval-and-compile
+  (and (featurep 'xemacs)
+    ;; XEmacs 21.4 doesn't have replace-regexp-in-string
+    (not (fboundp 'replace-regexp-in-string))
+    (defun replace-regexp-in-string (regexp rep string)
+       (replace-in-string string regexp rep))))
+
+(defconst d2t-work-buffer-name "*doc2texi*"
+  "Name of scratch buffer where the doc file will be converted into a
+  texi file.")
+(defconst d2t-scratch-buffer-name "*doc2texi-output*")
+(defconst d2t-terminal-buffer-name "*doc2texi-terminal*")
+(defvar d2t-verbose nil)
+(defconst d2t-texi-filename "gnuplot.texi")
+
+(defconst d2t-texi-header
+  "\\input texinfo   @c -*-texinfo-*-
+
+@c %**start of header
+@setfilename gnuplot.info
+@settitle Gnuplot: An Interactive Plotting Program
+@setchapternewpage odd
+@c %**end of header
+
+@c define the command and options indices
+@defindex cm
+@defindex op
+@defindex tm
+
+@dircategory Math
+@direntry
+* GNUPLOT: (gnuplot).             An Interactive Plotting Program
+@end direntry
+
+@ifnottex
+@node Top, gnuplot, (dir), (dir)
+@top Master Menu
+@end ifnottex
+
+@example
+                       GNUPLOT
+
+            An Interactive Plotting Program
+             Thomas Williams & Colin Kelley
+                Version 5.0 organized by
+       Ethan A Merritt with help from many others
+
+   Copyright (C) 1986 - 1993, 1998, 2004   Thomas Williams, Colin Kelley
+           Copyright (C) 2004 - 2012  various authors
+
+       Mailing list for comments: gnuplot-info@@lists.sourceforge.net
+     Mailing list for bug reports: gnuplot-bugs@@lists.sourceforge.net
+
+         This manual was originally prepared by Dick Crawford
+                   Version 5.0 - March 2014
+
+
+Major contributors (alphabetic order):
+@end example
+
+"
+  "Texinfo header.")
+
+(defconst d2t-main-menu
+  "@menu
+@end menu"
+  "Main menu.")
+
+(defconst d2t-texi-footer
+  "@node Concept_Index, Command_Index, Bugs, Top
+@unnumbered Concept Index
+@printindex cp
+
+@node Command_Index, Option_Index, Concept_Index, Top
+@unnumbered Command Index
+@printindex cm
+
+@node Options_Index, Function_Index, Command_Index, Top
+@unnumbered Options Index
+@printindex op
+
+@node Function_Index, Terminal_Index, Options_Index, Top
+@unnumbered Function Index
+@printindex fn
+
+@node Terminal_Index, , Options_Index, Top
+@unnumbered Terminal Index
+@printindex tm
+
+@c @shortcontents
+@contents
+@bye
+"
+  "Texinfo file terminator.")
+
+(defvar d2t-level-1-alist nil
+  "Alist of level 1 tags and markers.")
+(defvar d2t-level-2-alist nil
+  "Alist of level 2 tags and markers.")
+(defvar d2t-level-3-alist nil
+  "Alist of level 3 tags and markers.")
+(defvar d2t-level-4-alist nil
+  "Alist of level 4 tags and markers.")
+(defvar d2t-level-5-alist nil
+  "Alist of level 5 tags and markers.")
+(defvar d2t-commands-alist nil
+  "Alist of commands and markers.")
+(defvar d2t-set-show-alist nil
+  "Alist of options and markers.")
+(defvar d2t-functions-alist nil
+  "Alist of functions and markers.")
+(defvar d2t-terminals-alist nil
+  "Alist of terminal types and markers.")
+(defvar d2t-node-list nil
+  "List of nodes.")
+
+(defvar d2t-terminal-list ())
+(setq d2t-terminal-list
+      '("ai"
+        "aquaterm"
+        "be"
+        "cairo"
+        "canvas"
+        "cgm"
+        "context"
+        "corel"
+        "debug"
+        "djsvga"
+        "dumb"
+        "dxf"
+        "dxy"
+        "eepic"
+        "emf"
+        "emxvga"
+        "epslatex"
+        "epson"
+        "excl"
+        "fg"
+        "fig"
+        "gd"
+        "ggi"
+        "gif"
+        "gpic"
+        "gpr"
+        "grass"
+        "hp26"
+        "hp2648"
+        "hp500c"
+        "hpgl"
+        "hpljii"
+        "hppj"
+        "imagen"
+        "jpeg"
+        "kyo"
+        "latex"
+        "linux"
+        "lua"
+        "mac"
+        "metafont"
+        "metapost"
+        "mgr"
+        "mif"
+        "pbm"
+        "pc"
+        "pdf"
+        "png"
+        "post"
+        "pslatex"
+        "pstricks"
+        "qms"
+        "regis"
+        "svg"
+        "t410x"
+        "table"
+        "tek"
+        "texdraw"
+        "tgif"
+        "tikz"
+        "tkcanvas"
+        "tpic"
+        "vgagl"
+        "vws"
+        "win"
+        "wxt"
+        "x11"
+        "xlib"))
+
+(defvar d2t-gnuplot-license
+  ";;;; This file is generated automatically from the Gnuplot
+;;;; documentation by `doc2texi.el', part of the Gnuplot distribution.
+;;;; It is not intended to be edited manually.  See docs/gnuplot.doc
+;;;; in the gnuplot source tree (available from
+;;;; gnuplot.sourcefourge.net) for the original.
+
+;; This file is covered by the Gnuplot licensing terms:
+
+;; Copyright 1986 - 1993, 1998, 2004   Thomas Williams, Colin Kelley
+;;
+;; Permission to use, copy, and distribute this software and its
+;; documentation for any purpose with or without fee is hereby granted,
+;; provided that the above copyright notice appear in all copies and
+;; that both that copyright notice and this permission notice appear
+;; in supporting documentation.
+;;
+;; Permission to modify the software is granted, but not the right to
+;; distribute the complete modified source code.  Modifications are to
+;; be distributed as patches to the released version.  Permission to
+;; distribute binaries produced by compiling modified sources is granted,
+;; provided you
+;;   1. distribute the corresponding source modifications from the
+;;    released version in the form of a patch file along with the binaries,
+;;   2. add special version identification to distinguish your version
+;;    in addition to the base release version number,
+;;   3. provide your name and address as the primary contact for the
+;;    support of your modified version, and
+;;   4. retain our contact information in regard to use of the base
+;;    software.
+;; Permission to distribute the released version of the source code along
+;; with corresponding source modifications in the form of a patch file is
+;; granted with same provisions 2 through 4 for binary distributions.
+;;
+;; This software is provided \"as is\" without express or implied warranty
+;; to the extent permitted by applicable law."
+
+  "Gnuplot license for insertion into automatically generated gnuplot-eldoc.el 
file.")
+
+
+(defun d2t-doc-to-texi-verbosely ()
+  "Run `d2t-doc-to-texi' noisily"
+  (interactive)
+  (setq d2t-verbose t)
+  (d2t-doc-to-texi))
+
+(defun d2t-doc-to-texi ()
+  "This is the doc to texi converter function.
+It calls a bunch of other functions, each of which handles one
+particular conversion chore."
+  (interactive)
+  (setq d2t-level-1-alist   nil ;; initialize variables
+        d2t-level-2-alist   nil
+        d2t-level-3-alist   nil
+        d2t-level-4-alist   nil
+        d2t-level-5-alist   nil
+        d2t-commands-alist  nil
+        d2t-set-show-alist  nil
+        d2t-functions-alist nil
+        d2t-terminals-alist nil
+        d2t-node-list       nil)
+  ;; open the doc file and get some data about its contents
+  (d2t-prepare-workspace)
+  (message "Inserting help for terminals ...")
+  (d2t-get-terminals)
+  (message "Analyzing doc file ...")
+  (d2t-get-levels)
+  (d2t-get-commands)
+  (d2t-get-set-show)
+  (d2t-get-functions)
+  ;; convert the buffer from doc to texi, one element at a time
+  (message "Converting to texinfo ...")
+  (d2t-braces-atsigns)   ;; this must be the first conversion function
+  (d2t-transitem)        ;; translate new list item
+  (d2t-comments)         ;; delete comments
+  (d2t-sectioning)       ;; chapters, sections, etc
+  (d2t-get-eldoc-strings)
+  (d2t-indexing)         ;; index markup
+  (d2t-tables)           ;; fix up tables
+  (d2t-handle-html)      ;; fix up html markup
+  (d2t-first-column)     ;; left justify normal text
+  (d2t-enclose-examples) ;; turn indented text into @examples
+  (message "Menus, nodes, xrefs ...")
+  (d2t-make-refs)
+  ;(d2t-make-menus)
+  ;(d2t-set-nodes)
+  (save-excursion        ;; fix a few more things explicitly
+    (goto-char (point-min))
+    (insert d2t-texi-header)
+    (search-forward "@node")
+    ;; (beginning-of-line)
+    ;; (insert "\n\n" d2t-main-menu "\n\n")
+    (goto-char (point-max))
+    (insert d2t-texi-footer))
+  (load-library "texinfo") ;; now do the hard stuff with texinfo-mode
+  (texinfo-mode)
+  (let ((message-log-max 0)
+        (standard-output (get-buffer-create d2t-scratch-buffer-name)))
+    (message "Making texinfo nodes ...\n")
+    (texinfo-every-node-update)
+    (message "Making texinfo menus ...\n")
+    (texinfo-all-menus-update))
+  (write-file d2t-texi-filename) )  ; save it and done!
+
+(defun d2t-prepare-workspace ()
+  "Create a scratch buffer and populate it with gnuplot.doc."
+  (and d2t-verbose (message "  Doing d2t-prepare-workspace ..."))
+  (if (get-buffer d2t-work-buffer-name)
+      (kill-buffer d2t-work-buffer-name))
+  (if (get-buffer d2t-texi-filename)
+      (kill-buffer d2t-texi-filename))
+  (if (get-buffer d2t-terminal-buffer-name)
+      (kill-buffer d2t-terminal-buffer-name))
+  (get-buffer-create d2t-terminal-buffer-name)
+  (set-buffer (get-buffer-create d2t-work-buffer-name))
+  (insert-file-contents d2t-doc-file-name)
+  (goto-char (point-min)))
+
+
+(defvar d2t-additional-terminals
+  '(("linux" "linux")
+    ("canvas" "canvas")
+    ("lua" "lua" "tikz")
+    ("mac" "mac")
+    ("beos" "be")
+    ("dos" "emxvga" "djsvga" "fg" "pc")
+    ("windows" "win")
+    ("os2" "pm" "emxvga")
+    ("vms" "vws"))
+
+  "Additional terminals to add to the converted gnuplot.info file.
+
+The CARs of the items are strings to match against
+`system-configuration', and the CDRs are the elements to add to
+the end of `d2t-get-terminals'.")
+
+(defun d2t-get-terminals ()
+  "Insert all appropriate terminal help."
+  (let ((case-fold-search t))
+    (dolist (rec d2t-additional-terminals)
+      (let ((system (car rec))
+            (terms (cdr rec)))
+        (when (string-match system system-configuration)
+          (dolist (term terms)
+            (add-to-list 'd2t-terminal-list term)))))
+
+    (unless (member* system-configuration '("pc" "windows")
+                     :test 'string-match)
+      (dolist (term '("x11" "tgif" "gpic" "regis" "t410x" "tex" "xlib"))
+        (add-to-list 'd2t-terminal-list term)))
+
+  (setq d2t-terminal-list (sort d2t-terminal-list 'string<))
+  (let ((list d2t-terminal-list) file node marker)
+    (save-excursion
+      (when (re-search-forward "^<3" (point-max) t)
+        (beginning-of-line)
+        (let ((eol (save-excursion (end-of-line) (point-marker))))
+          (delete-region (point-marker) eol))
+        (dolist (elem list)
+          (and d2t-verbose (message "    %s ..." elem))
+          (setq file (concat d2t-terminal-directory elem ".trm"))
+          (when (file-exists-p file)
+            (with-current-buffer d2t-terminal-buffer-name
+              (erase-buffer)
+              (insert-file-contents file)
+              ;; find the terminal help
+              (when (search-forward "START_HELP" (point-max) "to_end")
+                (forward-line 1)
+                (delete-region (point-min) (point-marker))
+                (search-forward "END_HELP" (point-max) "to_end")
+                (beginning-of-line)
+                (delete-region (point-marker) (point-max))
+                ;; tidy up the terminal help content
+                (goto-char (point-min))
+                (while (re-search-forward "\",[ \t]*$" nil t)
+                  (replace-match "" nil nil))
+                (goto-char (point-min))
+                (while (re-search-forward "^\"" nil t)
+                  (replace-match "" nil nil))
+                (goto-char (point-min))
+                (while (re-search-forward "\\\\\"" nil t)
+                  (replace-match "\"" nil nil))
+                (goto-char (point-min))
+                (while (re-search-forward "^1[ \t]+\\(.+\\)$" nil t)
+                  (setq node   (match-string 1)
+                        marker (point-marker))
+                  (replace-match (concat "3  " node) nil nil))
+                (goto-char (point-min))
+                (while (re-search-forward "^2" nil t)
+                  (replace-match "4 " nil nil))
+                (goto-char (point-min))
+                ;; set up terminals index
+                (while (re-search-forward "^\?\\([^ ]+\\)$" nil t)
+                  (let ((word (match-string 1)))
+                    (unless (string-match "_\\|command-line-options" word)
+                      (setq d2t-terminals-alist
+                            (append d2t-terminals-alist
+                                    (list (cons word (point-marker))))))))
+
+                ;; and cram it into the doc buffer
+                (with-current-buffer d2t-work-buffer-name
+                  (insert-buffer-substring d2t-terminal-buffer-name)))))))))))
+
+
+;;; functions for obtaining lists of nodes in the document
+
+(defun d2t-get-levels ()
+  "Find positions of all nodes in the doc."
+  (and d2t-verbose (message "  Doing d2t-get-levels ..."))
+  (let ((list '("1" "2" "3" "4" "5")) str)
+    (while list
+      (setq str (concat "d2t-level-" (car list) "-alist"))
+      (and d2t-verbose (message "    %s ..." str))
+      (save-excursion
+        (while (not (eobp))
+          (when (re-search-forward (concat "^" (car list) " \\(.+\\)$")
+                                   (point-max) "to_end")
+            (beginning-of-line)
+            (set (intern str)
+                 (append (eval (intern str))
+                         (list (cons (match-string 1) (point-marker)))))
+            (forward-line 1))))
+      (setq list (cdr list)))))
+
+
+(defun d2t-get-commands ()
+  "Find all commands in the doc."
+  (and d2t-verbose (message "  Doing d2t-get-commands ..."))
+  (save-excursion
+    (let ((alist d2t-level-1-alist) start end)
+      (while alist
+        (if (string= (caar alist) "Commands")
+            (setq start (cdar  alist) ;; location of "1 Commands"
+                  end   (cdadr alist) ;; location of next level 1 heading
+                  alist nil)
+          (setq alist (cdr alist))))
+      ;;(message "%S %S" start end)
+      (goto-char start)
+      (while (< (point) end)
+        (when (re-search-forward "^2 \\(.+\\)$" (point-max) "to_end")
+          (beginning-of-line)
+          (unless (> (point) end)
+            (setq d2t-commands-alist
+                  (append d2t-commands-alist
+                          (list (cons (match-string 1) (point-marker))))))
+          (forward-line 1))) )))
+
+(defun d2t-get-set-show ()
+  "Find all set-show options in the doc."
+  (and d2t-verbose (message "  Doing d2t-get-set-show ..."))
+  (save-excursion
+    (let ((alist d2t-commands-alist) start end)
+      (while alist
+        (if (string= (caar alist) "set-show")
+            (setq start (cdar  alist) ;; location of "1 set-show"
+                  end   (cdadr alist) ;; location of next level 2 heading
+                  alist nil)
+          (setq alist (cdr alist))))
+      ;;(message "%S %S" start end)
+      (goto-char start)
+      (while (< (point) end)
+        (when (re-search-forward "^3 \\(.+\\)$" (point-max) "to_end")
+          (beginning-of-line)
+          (unless (> (point) end)
+            (setq d2t-set-show-alist
+                  (append d2t-set-show-alist
+                          (list (cons (match-string 1) (point-marker))))))
+          (forward-line 1))) )))
+
+
+(defun d2t-get-functions ()
+  "Find all functions in the doc."
+  (and d2t-verbose (message "  Doing d2t-get-functions ..."))
+  (let (begin end)
+    (save-excursion                    ; determine bounds of functions
+      (when (re-search-forward "^3 Functions" (point-max) "to_end")
+          (beginning-of-line)
+          (setq begin (point-marker))
+          (forward-line 1)
+          (when (re-search-forward "^3 " (point-max) "to_end")
+            (beginning-of-line)
+            (setq end (point-marker))))
+      (goto-char begin)
+      (while (< (point) end)
+        (when (re-search-forward "^4 \\(.+\\)$" (point-max) "to_end")
+          (beginning-of-line)
+          (unless (> (point) end)
+            (setq d2t-functions-alist
+                  (append d2t-functions-alist
+                          (list (cons (match-string 1) (point-marker))))))
+          (forward-line 1))) )))
+
+;; buffer manipulation functions
+
+;; this can probably be made faster using a let-scoped alist rather
+;; than the big cons block
+(defun d2t-sectioning ()
+  "Find all lines starting with a number.
+These are chapters, sections, etc.  Delete these lines and insert the
+appropriate sectioning and @node commands."
+  (and d2t-verbose (message "  Doing d2t-sectioning ..."))
+  (save-excursion
+    (while (not (eobp))
+      (re-search-forward "^\\([1-9]\\) +\\(.+\\)$" (point-max) "to_end")
+      (unless (eobp)
+        (let* ((number (match-string 1))
+               (word (match-string 2))
+               (node (substitute ?_ ?  word :test 'char-equal))
+               (eol  (save-excursion (end-of-line) (point-marker))))
+          ;; some node names appear twice.  make them unique.
+          (while (member* node d2t-node-list :test 'string=)
+            (setq node (concat node "_")))
+          (setq d2t-node-list (append d2t-node-list (list node)))
+          (beginning-of-line)
+          (delete-region (point-marker) eol)
+          (if (string-match "[1-4]" number) (insert "\n@node " node "\n"))
+          (cond ((string= number "1")
+                 (insert "@chapter " word "\n"))
+                ((string= number "2")
+                 (insert "@section " word "\n"))
+                ((string= number "3")
+                 (insert "@subsection " word "\n"))
+                ((string= number "4")
+                 (insert "@subsubsection " word "\n"))
+                (t
+                 (insert "\n\n@noindent --- " (upcase word) " ---\n")) ) )))))
+
+(defun d2t-get-eldoc-strings ()
+  "Find all syntax descriptions in the doc for ElDoc alist.
+
+Dumps the resulting data into gnuplot-eldoc.el"
+  (and d2t-verbose (message "  Doing d2t-get-eldoc-strings ..."))
+  (save-excursion
+    (goto-char (point-min))
+    (let ((alist '()))
+      (while (re-search-forward "^\\s-Syntax:" nil t)
+        ;; Find the section name
+        (let ((section
+               (save-excursion
+                 (re-search-backward "@node *\\([^ ].*\\)$")
+                 (match-string 1))))
+
+          ;; Skip blank lines
+          (forward-line)
+          (while (looking-at "^\\s-*$") (forward-line))
+
+          ;; Grab everything at this level of indentation
+          (let* ((lines '())
+                 (indent
+                  (save-excursion
+                    (skip-syntax-forward "-")))
+                 (indent-regexp
+                  (buffer-substring (point) (+ (point) indent))))
+            (while (looking-at indent-regexp)
+              (let ((line
+                     (replace-regexp-in-string
+                      "@\\([@{}]\\)" "\\1"
+                      (buffer-substring (+ (point-at-bol) indent) 
(point-at-eol)))))
+                (push line lines))
+              (forward-line))
+
+            ;; Add to alist
+            (if (= (length lines) 1)
+                (push `(,section ,(car lines)) alist)
+              (setq lines (nreverse lines))
+              (push `(,section ,(concat (car lines) " [more ...]")
+                               ,(mapconcat 'identity lines "\n")) alist)))))
+      ;; Save in "gnuplot-eldoc.el"
+      (with-temp-file "gnuplot-eldoc.el"
+        (let ((print-level nil)
+              (print-length nil))
+          (insert
+           (format ";;;; Automatically generated by doc2texi.el on %s\n\n"
+                   (format-time-string "%a, %d %B %Y")))
+          (insert d2t-gnuplot-license)
+          (insert
+           (format
+            "\n\n%S\n%S"
+            '(eval-when-compile (defvar gnuplot-eldoc-hash nil))
+            `(setq gnuplot-eldoc-hash
+                   (let ((tbl (make-hash-table :test 'equal))
+                         (alist ',alist))
+                     (while alist
+                       (puthash (caar alist) (cdar alist) tbl)
+                       (setq alist (cdr alist)))
+                     tbl)))))))))
+
+
+(defun d2t-indexing ()
+  "Find all lines starting with a question mark.
+These are index references.  Delete these lines and insert the
+appropriate indexing commands.  Only index one word ? entries,
+comment out the multi-word ? entries."
+  (and d2t-verbose (message "  Doing d2t-indexing ..."))
+  (save-excursion
+    (while (not (eobp))
+      (re-search-forward "^\\(\\\?\\([^ \n]+\\)\\|=\\([^\n]+\\)\\) *$"
+                         (point-max) "to_end")
+      (unless (eobp)
+        (let ((word (or (match-string 2) (match-string 3)))
+              (eol  (save-excursion (end-of-line) (point-marker))))
+          (beginning-of-line)
+          (delete-region (point-marker) eol)
+          (insert "@cindex " word "\n")
+          (cond ((assoc word d2t-commands-alist)
+                 (insert "@cmindex " word "\n\n"))
+                ((assoc word d2t-set-show-alist)
+                 (insert "@opindex " word "\n\n"))
+                ((assoc word d2t-terminals-alist)
+                 (insert "@tmindex " word "\n\n"))
+                ((assoc word d2t-functions-alist)
+                 (insert "@findex " word "\n\n"))) )))
+    (goto-char (point-min))
+    (while (not (eobp))
+      (re-search-forward "^\\\?" (point-max) "to_end")
+      (unless (eobp)
+        (if (looking-at "functions? \\(tm_\\w+\\)")
+            (progn
+              (beginning-of-line)
+              (insert "@findex " (match-string 1) "\n@c "))
+          (beginning-of-line)
+          (insert "@c ")))) ))
+
+(defun d2t-transitem ()
+  "Translation lines beginning with #start, #end, #b, and ##.
+These lines makes a itemized list."
+  (and d2t-verbose (message "  Doing d2t-transitem ..."))
+  (save-excursion
+    (while (re-search-forward "^#start" (point-max) "to_end")
+      (replace-match "@itemize @bullet" t))
+    (goto-char (point-min))
+    (while (re-search-forward "^#end" (point-max) "to_end")
+      (replace-match "@end itemize" t))
+    (goto-char (point-min))
+    (while (re-search-forward "^#b " (point-max) "to_end")
+      (replace-match "@item\n " t))
+    (goto-char (point-min))
+    (while (re-search-forward "^##" (point-max) "to_end")
+      (replace-match "" t))))
+
+(defun d2t-comments ()
+  "Delete comments and lines beginning with # or %.
+# and % lines are used in converting tables into various formats.
+Also ignore F lines denoting figures."
+  (and d2t-verbose (message "  Doing d2t-comments ..."))
+  (save-excursion
+    (while (not (eobp))
+      (re-search-forward "^[C#%F]" (point-max) "to_end")
+      (unless (eobp)
+        (let ((eol  (save-excursion (end-of-line)
+                                    (forward-char 1)
+                                    (point-marker))))
+          (beginning-of-line)
+          (delete-region (point-marker) eol) )))))
+
+(defun d2t-first-column ()
+  "Justify normal text to the 0th column.
+This must be run before `d2t-enclose-examples'.
+This is rather slow since there are almost 9000 lines of text."
+  (and d2t-verbose (message "  Doing d2t-first-column ..."))
+  (save-excursion
+    (while (not (eobp))
+      (and (char-equal (char-after (point)) ? )
+           (delete-char 1))
+      (forward-line))))
+
+(defun d2t-braces-atsigns ()
+  "Prepend @ to @, {, or } everywhere in the doc.
+This MUST be the first conversion function called in
+`d2t-doc-to-texi'."
+  (and d2t-verbose (message "  Doing d2t-braces-atsigns ..."))
+  (save-excursion
+    (while (not (eobp))
+      (re-search-forward "[@{}]" (point-max) "to_end")
+      (unless (eobp)
+        (backward-char 1)
+        (insert "@")
+        (forward-char 1)))))
+
+(defun d2t-tables ()
+  "Remove @start table and @end table tags.
+These will be made into @example's by `d2t-enclose-examples'.
+Thus, the plain text formatting already in the doc is used."
+  (and d2t-verbose (message "  Doing d2t-tables ..."))
+  (save-excursion
+    (while (not (eobp))
+      (re-search-forward "^ *@+start table" (point-max) "to_end")
+      (unless (eobp)
+        (let ((eol  (save-excursion (end-of-line) (point-marker))))
+          (beginning-of-line)
+          (delete-region (point-marker) eol))))
+          ;;(insert "@example")
+    (goto-char (point-min))
+    (while (not (eobp))
+      (re-search-forward "^ *@+end table" (point-max) "to_end")
+      (unless (eobp)
+        (let ((eol  (save-excursion (end-of-line) (point-marker))))
+          (beginning-of-line)
+          (delete-region (point-marker) eol))))))
+          ;;(insert "@end example")
+
+
+(defun d2t-enclose-examples ()
+  "Turn indented text in the doc into @examples.
+This must be run after `d2t-first-column'."
+  (and d2t-verbose (message "  Doing d2t-enclose-examples ..."))
+  (save-excursion
+    (while (not (eobp))
+      (re-search-forward "^ +[^ \n]" (point-max) "to_end")
+      (unless (eobp)
+        (beginning-of-line)
+        (insert "@example\n")
+        (forward-line 1)
+        (re-search-forward "^[^ ]" (point-max) "to_end")
+        (beginning-of-line)
+        (insert "@end example\n\n") ))))
+
+(defun d2t-handle-html ()
+  "Deal with all of the html markup in the doc."
+  (and d2t-verbose (message "  Doing d2t-handle-html ..."))
+  (save-excursion
+    (while (not (eobp))
+      (let ((rx (concat "^" (regexp-quote "^")
+                        " *\\(<?\\)\\([^ \n]+\\)" )))
+        (re-search-forward rx (point-max) "to_end")
+        (unless (eobp)
+          (let ((bracket (match-string 1))
+                (tag (match-string 2))
+                (eol  (save-excursion (end-of-line) (point-marker))))
+            (beginning-of-line)
+            (cond
+             ;; comment out images
+             ((and (string= bracket "<") (string= tag "img"))
+              (insert "@c "))
+             ;; tyepset anchors
+             ((and (string= bracket "<") (string-match "^/?a" tag))
+              ;(insert "@c fix me!!  ")
+              (beginning-of-line)
+              (if (looking-at (concat "\\^\\s-*<a\\s-+href=" ; opening tag
+                                      "\"\\([^\"]+\\)\">\\s-*\n*\\s-*" ; url
+                                      "\\([^<]+\\)" ; text
+                                      "[ \t]*\\^?</a>" ; closing tag
+                                      ))
+                  (replace-match (concat "@uref{"
+                                         (match-string 1)
+                                         ","
+                                         (remove* ?^ (match-string 2)
+                                                  :test 'char-equal)
+                                         "}"))
+                  (insert "@c ")))
+             ;; translate <ul> </ul> to @itemize environment
+             ((and (string= bracket "<") (string-match "^ul" tag))
+              (delete-region (point) eol)
+              (insert "\n@itemize @bullet"))
+             ((and (string= bracket "<") (string-match "/ul" tag))
+              (delete-region (point) eol)
+              (insert "@end itemize\n"))
+             ;; list items
+             ((and (string= bracket "<") (string-match "^li" tag))
+              (delete-char 5)
+              (delete-horizontal-space)
+              (insert "@item\n"))
+             ;; fix up a few miscellaneous things
+             (t ;;(looking-at ".*Terminal Types")
+              (insert "@c ")) )
+            (forward-line))) ))))
+
+
+(defvar d2t-dont-make-ref
+  "^fit f\(x\)\\|gnuplot\\|help\\s-+plotting")
+(defun d2t-make-refs ()
+  "Make cross-references in the text."
+  (and d2t-verbose (message "  Doing d2t-make-refs ..."))
+  (let ((big-alist (append d2t-level-1-alist
+                           d2t-level-2-alist
+                           d2t-level-3-alist
+                           d2t-level-4-alist)))
+    (save-excursion
+      (while (re-search-forward "\\(`\\([^`]+\\)`\\)" nil t)
+        (let* ((b (match-beginning 1))
+               (e (match-end 1))
+               (list (save-match-data (split-string (match-string 2))))
+               (last (car (reverse list)))
+               (text (concat "@ref{" last "}")))
+          ;; (message "%s %s" (match-string 1) last)
+          (when (and (equal t (try-completion last big-alist))
+                     (not (string= last "gnuplot")))
+            (delete-region b e)
+            (insert text)))))))
+
+;;; doc2texi.el ends here


Reply via email to