summaryrefslogtreecommitdiff
path: root/Doc/tools/py2texi.el
diff options
context:
space:
mode:
Diffstat (limited to 'Doc/tools/py2texi.el')
-rw-r--r--Doc/tools/py2texi.el970
1 files changed, 0 insertions, 970 deletions
diff --git a/Doc/tools/py2texi.el b/Doc/tools/py2texi.el
deleted file mode 100644
index 404234f68e..0000000000
--- a/Doc/tools/py2texi.el
+++ /dev/null
@@ -1,970 +0,0 @@
-;;; py2texi.el -- Conversion of Python LaTeX documentation to Texinfo
-
-;; Copyright (C) 2006 Jeroen Dekkers <jeroen@dekkers.cx>
-;; Copyright (C) 1998, 1999, 2001, 2002 Milan Zamazal
-
-;; Author: Milan Zamazal <pdm@zamazal.org>
-;; Version: $Id$
-;; Keywords: python
-
-;; COPYRIGHT NOTICE
-;;
-;; This program is free software; you can redistribute it and/or modify it
-;; under the terms of the GNU General Public License as published by the Free
-;; Software Foundation; either version 2, or (at your option) any later
-;; version.
-;;
-;; This program 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. See the GNU General Public License
-;; for more details.
-;;
-;; You can find the GNU General Public License at
-;; http://www.gnu.org/copyleft/gpl.html
-;; or you can write to the Free Software Foundation, Inc., 59 Temple Place,
-;; Suite 330, Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; This is a Q&D hack for conversion of Python manuals to on-line help format.
-;; I desperately needed usable online documenta for Python, so I wrote this.
-;; The result code is ugly and need not contain complete information from
-;; Python manuals. I apologize for my ignorance, especially ignorance to
-;; python.sty. Improvements of this convertor are welcomed.
-
-;; How to use it:
-;; Load this file and apply `M-x py2texi'. You will be asked for name of a
-;; file to be converted.
-
-;; Where to find it:
-;; New versions of this code might be found at
-;; http://www.zamazal.org/software/python/py2texi/ .
-
-;;; Code:
-
-
-(require 'texinfo)
-(eval-when-compile
- (require 'cl))
-
-
-(defvar py2texi-python-version "2.2"
- "What to substitute for the \\version macro.")
-
-(defvar py2texi-python-short-version
- (progn
- (string-match "[0-9]+\\.[0-9]+" py2texi-python-version)
- (match-string 0 py2texi-python-version))
- "Short version number, usually set by the LaTeX commands.")
-
-(defvar py2texi-texi-file-name nil
- "If non-nil, that string is used as the name of the Texinfo file.
-Otherwise a generated Texinfo file name is used.")
-
-(defvar py2texi-info-file-name nil
- "If non-nil, that string is used as the name of the Info file.
-Otherwise a generated Info file name is used.")
-
-(defvar py2texi-stop-on-problems nil
- "*If non-nil, stop when you encouter soft problem.")
-
-(defconst py2texi-environments
- '(("abstract" 0 "@quotation" "@end quotation\n")
- ("center" 0 "" "")
- ("cfuncdesc" 3
- (progn (setq findex t)
- "\n@table @code\n@item \\1 \\2(\\3)\n@findex \\2\n")
- "@end table\n")
- ("cmemberdesc" 3
- "\n@table @code\n@item \\2 \\3\n"
- "@end table\n")
- ("classdesc" 2
- (progn (setq obindex t)
- "\n@table @code\n@item \\1(\\2)\n@obindex \\1\n")
- "@end table\n")
- ("classdesc*" 1
- (progn (setq obindex t)
- "\n@table @code\n@item \\1\n@obindex \\1\n")
- "@end table\n")
- ("comment" 0 "\n@ignore\n" "\n@end ignore\n")
- ("csimplemacrodesc" 1
- (progn (setq cindex t)
- "\n@table @code\n@item \\1\n@cindex \\1\n")
- "@end table\n")
- ("ctypedesc" 1
- (progn (setq cindex t)
- "\n@table @code\n@item \\1\n@cindex \\1\n")
- "@end table\n")
- ("cvardesc" 2
- (progn (setq findex t)
- "\n@table @code\n@item \\1 \\2\n@findex \\2\n")
- "@end table\n")
- ("datadesc" 1
- (progn (setq findex t)
- "\n@table @code\n@item \\1\n@findex \\1\n")
- "@end table\n")
- ("datadescni" 1 "\n@table @code\n@item \\1\n" "@end table\n")
- ("definitions" 0 "@table @dfn" "@end table\n")
- ("description" 0 "@table @samp" "@end table\n")
- ("displaymath" 0 "" "")
- ("document" 0
- (concat "@defcodeindex mo\n"
- "@defcodeindex ob\n"
- "@titlepage\n"
- (format "@title " title "\n")
- (format "@author " author "\n")
- "@page\n"
- author-address
- "@end titlepage\n"
- "@node Top, , , (dir)\n")
- (concat "@indices\n"
- "@contents\n"
- "@bye\n"))
- ("enumerate" 0 "@enumerate" "@end enumerate")
- ("envdesc" 2 (concat "\n@table @code"
- "\n@item @backslash{}begin@{\\1@}\\2")
- "@end table\n")
- ("excdesc" 1
- (progn (setq obindex t)
- "\n@table @code\n@item \\1\n@obindex \\1\n")
- "@end table\n")
- ("excclassdesc" 2
- (progn (setq obindex t)
- "\n@table @code\n@item \\1(\\2)\n@obindex \\1\n")
- "@end table\n")
- ("flushleft" 0 "" "")
- ("fulllineitems" 0 "\n@table @code\n" "@end table\n")
- ("funcdesc" 2
- (progn (setq findex t)
- "\n@table @code\n@item \\1(\\2)\n@findex \\1\n")
- "@end table\n")
- ("funcdescni" 2 "\n@table @code\n@item \\1(\\2)\n" "@end table\n")
- ("itemize" 0 "@itemize @bullet" "@end itemize\n")
- ("list" 2 "\n@table @code\n" "@end table\n")
- ("longtableii" 4 (concat "@multitable @columnfractions .5 .5\n"
- "@item \\3 @tab \\4\n"
- "@item ------- @tab ------ \n")
- "@end multitable\n")
- ("longtableiii" 5 (concat "@multitable @columnfractions .33 .33 .33\n"
- "@item \\3 @tab \\4 @tab \\5\n"
- "@item ------- @tab ------ @tab ------\n")
- "@end multitable\n")
- ("macrodesc" 2 (concat "\n@table @code"
- "\n@item \\1@{\\2@}")
- "@end table\n")
- ("memberdesc" 1
- (progn (setq findex t)
- "\n@table @code\n@item \\1\n@findex \\1\n")
- "@end table\n")
- ("memberdescni" 1 "\n@table @code\n@item \\1\n" "@end table\n")
- ("methoddesc" 2
- (progn (setq findex t)
- "\n@table @code\n@item \\1(\\2)\n@findex \\1\n")
- "@end table\n")
- ("methoddescni" 2 "\n@table @code\n@item \\1(\\2)\n" "@end table\n")
- ("notice" 0 "@emph{Notice:} " "")
- ("opcodedesc" 2
- (progn (setq findex t)
- "\n@table @code\n@item \\1 \\2\n@findex \\1\n")
- "@end table\n")
- ("productionlist" 0 "\n@table @code\n" "@end table\n")
- ("quotation" 0 "@quotation" "@end quotation")
- ("quote" 0 "@quotation" "@end quotation")
- ("seealso" 0 "See also:\n@table @emph\n" "@end table\n")
- ("seealso*" 0 "@table @emph\n" "@end table\n")
- ("sloppypar" 0 "" "")
- ("small" 0 "" "")
- ("tableii" 4 (concat "@multitable @columnfractions .5 .5\n"
- "@item \\3 @tab \\4\n"
- "@item ------- @tab ------ \n")
- "@end multitable\n")
- ("tableiii" 5 (concat "@multitable @columnfractions .33 .33 .33\n"
- "@item \\3 @tab \\4 @tab \\5\n"
- "@item ------- @tab ------ @tab ------\n")
- "@end multitable\n")
- ("tableiv" 6 (concat
- "@multitable @columnfractions .25 .25 .25 .25\n"
- "@item \\3 @tab \\4 @tab \\5 @tab \\6\n"
- "@item ------- @tab ------- @tab ------- @tab -------\n")
- "@end multitable\n")
- ("tablev" 7 (concat
- "@multitable @columnfractions .20 .20 .20 .20 .20\n"
- "@item \\3 @tab \\4 @tab \\5 @tab \\6 @tab \\7\n"
- "@item ------- @tab ------- @tab ------- @tab ------- @tab -------\n")
- "@end multitable\n")
- ("alltt" 0 "@example" "@end example")
- )
- "Associative list defining substitutions for environments.
-Each list item is of the form (ENVIRONMENT ARGNUM BEGIN END) where:
-- ENVIRONMENT is LaTeX environment name
-- ARGNUM is number of (required) macro arguments
-- BEGIN is substitution for \begin{ENVIRONMENT}
-- END is substitution for \end{ENVIRONMENT}
-Both BEGIN and END are evaled. Moreover, you can reference arguments through
-\N regular expression notation in strings of BEGIN.")
-
-(defconst py2texi-commands
- '(("AA" 0 "@AA{}")
- ("aa" 0 "@aa{}")
- ("ABC" 0 "ABC")
- ("appendix" 0 (progn (setq appendix t) ""))
- ("ASCII" 0 "ASCII")
- ("author" 1 (progn (setq author (match-string 1 string)) ""))
- ("authoraddress" 1
- (progn (setq author-address (match-string 1 string)) ""))
- ("b" 1 "@w{\\1}")
- ("backslash" 0 "@backslash{}")
- ("bf" 0 "@destroy")
- ("bifuncindex" 1 (progn (setq findex t) "@findex{\\1}"))
- ("C" 0 "C")
- ("c" 0 "@,")
- ("catcode" 0 "")
- ("cdata" 1 "@code{\\1}")
- ("centerline" 1 "@center \\1")
- ("cfuncline" 3 "@itemx \\1 \\2(\\3)\n@findex \\2")
- ("cfunction" 1 "@code{\\1}")
- ("chapter" 1 (format "@node \\1\n@%s \\1\n"
- (if appendix "appendix" "chapter")))
- ("chapter*" 1 "@node \\1\n@unnumbered \\1\n")
- ("character" 1 "@samp{\\1}")
- ("citetitle" 1 "@ref{Top,,,\\1}")
- ("class" 1 "@code{\\1}")
- ("cmemberline" 3 "@itemx \\2 \\3\n")
- ("code" 1 "@code{\\1}")
- ("command" 1 "@command{\\1}")
- ("constant" 1 "@code{\\1}")
- ("copyright" 1 "@copyright{}")
- ("Cpp" 0 "C++")
- ("csimplemacro" 1 "@code{\\1}")
- ("ctype" 1 "@code{\\1}")
- ("dataline" 1 (progn (setq findex t) "@item \\1\n@findex \\1\n"))
- ("date" 1 "\\1")
- ("declaremodule" 2 (progn (setq cindex t) "@label{\\2}@cindex{\\2}"))
- ("deprecated" 2 "@emph{This is deprecated in Python \\1. \\2}\n\n")
- ("dfn" 1 "@dfn{\\1}")
- ("documentclass" 1 py2texi-magic)
- ("e" 0 "@backslash{}")
- ("else" 0 (concat "@end ifinfo\n@" (setq last-if "iftex")))
- ("env" 1 "@code{\\1}")
- ("EOF" 0 "@code{EOF}")
- ("email" 1 "@email{\\1}")
- ("em" 1 "@emph{\\1}")
- ("emph" 1 "@emph{\\1}")
- ("envvar" 1 "@env{\\1}")
- ("exception" 1 "@code{\\1}")
- ("exindex" 1 (progn (setq obindex t) "@obindex{\\1}"))
- ("fi" 0 (if (equal last-if "ifx") "" (concat "@end " last-if)))
- ("file" 1 "@file{\\1}")
- ("filenq" 1 "@file{\\1}")
- ("filevar" 1 "@file{@var{\\1}}")
- ("footnote" 1 "@footnote{\\1}")
- ("frac" 0 "")
- ("funcline" 2 (progn (setq findex t) "@item \\1 \\2\n@findex \\1"))
- ("funclineni" 2 "@item \\1 \\2")
- ("function" 1 "@code{\\1}")
- ("grammartoken" 1 "@code{\\1}")
- ("guilabel" 1 "@strong{\\1}")
- ("hline" 0 "")
- ("ifx" 0 (progn (setq last-if "ifx") ""))
- ("ifhtml" 0 (concat "@" (setq last-if "ifinfo")))
- ("iftexi" 0 (concat "@" (setq last-if "ifinfo")))
- ("index" 1 (progn (setq cindex t) "@cindex{\\1}"))
- ("indexii" 2 (progn (setq cindex t) "@cindex{\\1 \\2}"))
- ("indexiii" 3 (progn (setq cindex t) "@cindex{\\1 \\2 \\3}"))
- ("indexiv" 3 (progn (setq cindex t) "@cindex{\\1 \\2 \\3 \\4}"))
- ("infinity" 0 "@emph{infinity}")
- ("it" 0 "@destroy")
- ("kbd" 1 "@key{\\1}")
- ("keyword" 1 "@code{\\1}")
- ("kwindex" 1 (progn (setq cindex t) "@cindex{\\1}"))
- ("label" 1 "@label{\\1}")
- ("Large" 0 "")
- ("LaTeX" 0 "La@TeX{}")
- ("large" 0 "")
- ("ldots" 0 "@dots{}")
- ("leftline" 1 "\\1")
- ("leq" 0 "<=")
- ("lineii" 2 "@item \\1 @tab \\2")
- ("lineiii" 3 "@item \\1 @tab \\2 @tab \\3")
- ("lineiv" 4 "@item \\1 @tab \\2 @tab \\3 @tab \\4")
- ("linev" 5 "@item \\1 @tab \\2 @tab \\3 @tab \\4 @tab \\5")
- ("locallinewidth" 0 "")
- ("localmoduletable" 0 "")
- ("longprogramopt" 1 "@option{--\\1}")
- ("macro" 1 "@code{@backslash{}\\1}")
- ("mailheader" 1 "@code{\\1}")
- ("makeindex" 0 "")
- ("makemodindex" 0 "")
- ("maketitle" 0 (concat "@top " title "\n"))
- ("makevar" 1 "@code{\\1}")
- ("manpage" 2 "@samp{\\1(\\2)}")
- ("mbox" 1 "@w{\\1}")
- ("member" 1 "@code{\\1}")
- ("memberline" 1 "@item \\1\n@findex \\1\n")
- ("menuselection" 1 "@samp{\\1}")
- ("method" 1 "@code{\\1}")
- ("methodline" 2 (progn (setq moindex t) "@item \\1(\\2)\n@moindex \\1\n"))
- ("methodlineni" 2 "@item \\1(\\2)\n")
- ("mimetype" 1 "@samp{\\1}")
- ("module" 1 "@samp{\\1}")
- ("moduleauthor" 2 "")
- ("modulesynopsis" 1 "\\1")
- ("moreargs" 0 "@dots{}")
- ("n" 0 "@backslash{}n")
- ("newcommand" 2 "")
- ("newlength" 1 "")
- ("newsgroup" 1 "@samp{\\1}")
- ("nodename" 1
- (save-excursion
- (save-match-data
- (re-search-backward "^@node "))
- (delete-region (point) (save-excursion (end-of-line) (point)))
- (insert "@node " (match-string 1 string))
- ""))
- ("noindent" 0 "@noindent ")
- ("note" 1 "@emph{Note:} \\1")
- ("NULL" 0 "@code{NULL}")
- ("obindex" 1 (progn (setq obindex t) "@obindex{\\1}"))
- ("opindex" 1 (progn (setq cindex t) "@cindex{\\1}"))
- ("option" 1 "@option{\\1}")
- ("optional" 1 "[\\1]")
- ("paragraph" 1 "@subsubheading \\1")
- ("pep" 1 (progn (setq cindex t) "PEP@ \\1@cindex PEP \\1\n"))
- ("pi" 0 "pi")
- ("platform" 1 "")
- ("plusminus" 0 "+-")
- ("POSIX" 0 "POSIX")
- ("production" 2 "@item \\1 \\2")
- ("productioncont" 1 "@item @w{} \\1")
- ("program" 1 "@command{\\1}")
- ("programopt" 1 "@option{\\1}")
- ("protect" 0 "")
- ("pytype" 1 "@code{\\1}")
- ("ref" 1 "@ref{\\1}")
- ("refbimodindex" 1 (progn (setq moindex t) "@moindex{\\1}"))
- ("refmodindex" 1 (progn (setq moindex t) "@moindex{\\1}"))
- ("refmodule" 1 "@samp{\\1}")
- ("refstmodindex" 1 (progn (setq moindex t) "@moindex{\\1}"))
- ("regexp" 1 "\"\\1\"")
- ("release" 1
- (progn (setq py2texi-python-version (match-string 1 string)) ""))
- ("renewcommand" 2 "")
- ("rfc" 1 (progn (setq cindex t) "RFC@ \\1@cindex RFC \\1\n"))
- ("rm" 0 "@destroy")
- ("samp" 1 "@samp{\\1}")
- ("section" 1 (let ((str (match-string 1 string)))
- (save-match-data
- (if (string-match "\\(.*\\)[ \t\n]*---[ \t\n]*\\(.*\\)"
- str)
- (format
- "@node %s\n@section %s\n"
- (py2texi-backslash-quote (match-string 1 str))
- (py2texi-backslash-quote (match-string 2 str)))
- "@node \\1\n@section \\1\n"))))
- ("sectionauthor" 2 "")
- ("seelink" 3 "\n@table @url\n@item @strong{\\1}\n(\\2)\n\\3\n@end table\n")
- ("seemodule" 2 "@ref{\\1} \\2")
- ("seepep" 3 "\n@table @strong\n@item PEP\\1 \\2\n\\3\n@end table\n")
- ("seerfc" 3 "\n@table @strong\n@item RFC\\1 \\2\n\\3\n@end table\n")
- ("seetext" 1 "\\1")
- ("seetitle" 1 "@cite{\\1}")
- ("seeurl" 2 "\n@table @url\n@item \\1\n\\2\n@end table\n")
- ("setindexsubitem" 1 (progn (setq cindex t) "@cindex \\1"))
- ("setlength" 2 "")
- ("setreleaseinfo" 1 (progn (setq py2texi-releaseinfo "")))
- ("setshortversion" 1
- (progn (setq py2texi-python-short-version (match-string 1 string)) ""))
- ("shortversion" 0 py2texi-python-short-version)
- ("sqrt" 0 "")
- ("stindex" 1 (progn (setq cindex t) "@cindex{\\1}"))
- ("stmodindex" 1 (progn (setq moindex t) "@moindex{\\1}"))
- ("strong" 1 "@strong{\\1}")
- ("sub" 0 "/")
- ("subsection" 1 "@node \\1\n@subsection \\1\n")
- ("subsubsection" 1 "@node \\1\n@subsubsection \\1\n")
- ("sum" 0 "")
- ("tableofcontents" 0 "")
- ("term" 1 "@item \\1")
- ("TeX" 0 "@TeX{}")
- ("textasciitilde" 0 "~")
- ("textasciicircum" 0 "^")
- ("textbackslash" 0 "@backslash{}")
- ("textbar" 0 "|")
- ("textbf" 1 "@strong{\\1}")
- ("texteuro" 0 "@euro{}")
- ; Unfortunately, this alternate spelling doesn't actually apply to
- ; the usage found in Python Tutorial, which actually requires a
- ; Euro symbol to make sense, so this is commented out as well.
- ; ("texteuro" 0 "Euro ")
- ("textgreater" 0 ">")
- ("textit" 1 "@i{\\1}")
- ("textless" 0 "<")
- ("textrm" 1 "\\1")
- ("texttt" 1 "@code{\\1}")
- ("textunderscore" 0 "_")
- ("tilde" 0 "~")
- ("title" 1 (progn (setq title (match-string 1 string)) "@settitle \\1"))
- ("today" 0 "@today{}")
- ("token" 1 "@code{\\1}")
- ("tt" 0 "@destroy")
- ("ttindex" 1 (progn (setq cindex t) "@cindex{\\1}"))
- ("u" 0 "@backslash{}u")
- ("ulink" 2 "\\1")
- ("UNIX" 0 "UNIX")
- ("undefined" 0 "")
- ("unspecified" 0 "@dots{}")
- ("url" 1 "@url{\\1}")
- ("usepackage" 1 "")
- ("var" 1 "@var{\\1}")
- ("verbatiminput" 1 "@code{\\1}")
- ("version" 0 py2texi-python-version)
- ("versionadded" 1 "@emph{Added in Python version \\1}")
- ("versionchanged" 1 "@emph{Changed in Python version \\1}")
- ("vskip" 1 "")
- ("vspace" 1 "")
- ("warning" 1 "@emph{\\1}")
- ("withsubitem" 2 "\\2")
- ("XXX" 1 "@strong{\\1}"))
- "Associative list of command substitutions.
-Each list item is of the form (COMMAND ARGNUM SUBSTITUTION) where:
-- COMMAND is LaTeX command name
-- ARGNUM is number of (required) command arguments
-- SUBSTITUTION substitution for the command. It is evaled and you can
- reference command arguments through the \\N regexp notation in strings.")
-
-(defvar py2texi-magic "@documentclass\n"
- "\"Magic\" string for auxiliary insertion at the beginning of document.")
-
-(defvar py2texi-dirs '("./" "../texinputs/")
- "Where to search LaTeX input files.")
-
-(defvar py2texi-buffer "*py2texi*"
- "The name of a buffer where Texinfo is generated.")
-
-(defconst py2texi-xemacs (string-match "^XEmacs" (emacs-version))
- "Running under XEmacs?")
-
-
-(defmacro py2texi-search (regexp &rest body)
- `(progn
- (goto-char (point-min))
- (while (re-search-forward ,regexp nil t)
- ,@body)))
-
-(defmacro py2texi-search-safe (regexp &rest body)
- `(py2texi-search ,regexp
- (unless (py2texi-protected)
- ,@body)))
-
-
-(defun py2texi-message (message)
- "Report message and stop if `py2texi-stop-on-problems' is non-nil."
- (if py2texi-stop-on-problems
- (error message)
- (message message)))
-
-
-(defun py2texi-backslash-quote (string)
- "Double backslahes in STRING."
- (let ((i 0))
- (save-match-data
- (while (setq i (string-match "\\\\" string i))
- (setq string (replace-match "\\\\\\\\" t nil string))
- (setq i (+ i 2))))
- string))
-
-
-(defun py2texi (file)
- "Convert Python LaTeX documentation FILE to Texinfo."
- (interactive "fFile to convert: ")
- (switch-to-buffer (get-buffer-create py2texi-buffer))
- (erase-buffer)
- (insert-file file)
- (let ((case-fold-search nil)
- (title "")
- (author "")
- (author-address "")
- (appendix nil)
- (findex nil)
- (obindex nil)
- (cindex nil)
- (moindex nil)
- last-if)
- (py2texi-process-verbatims)
- (py2texi-process-comments)
- (py2texi-process-includes)
- (py2texi-process-funnyas)
- (py2texi-process-environments)
- (py2texi-process-commands)
- (py2texi-fix-indentation)
- (py2texi-fix-nodes)
- (py2texi-fix-references)
- (py2texi-fix-indices)
- (py2texi-process-simple-commands)
- (py2texi-fix-fonts)
- (py2texi-fix-braces)
- (py2texi-fix-backslashes)
- (py2texi-destroy-empties)
- (py2texi-fix-newlines)
- (py2texi-adjust-level))
- (let* ((texi-file-name (or py2texi-texi-file-name
- (py2texi-texi-file-name file)))
- (info-file-name (or py2texi-info-file-name
- (py2texi-info-file-name texi-file-name))))
- (goto-char (point-min))
- (when (looking-at py2texi-magic)
- (delete-region (point) (progn (beginning-of-line 2) (point)))
- (insert "\\input texinfo @c -*-texinfo-*-\n")
- (insert "@setfilename " info-file-name))
- (when (re-search-forward "@chapter" nil t)
- (texinfo-all-menus-update t))
- (goto-char (point-min))
- (write-file texi-file-name)
- (message (format "You can apply `makeinfo %s' now." texi-file-name))))
-
-
-(defun py2texi-texi-file-name (filename)
- "Generate name of Texinfo file from original file name FILENAME."
- (concat filename
- (if (string-match "\\.tex$" filename) "i" ".texi")))
-
-
-(defun py2texi-info-file-name (filename)
- "Generate name of info file from original file name FILENAME."
- (setq filename (expand-file-name filename))
- (let ((directory (file-name-directory filename))
- (basename (file-name-nondirectory filename)))
- (concat directory "python-"
- (substring basename 0 (- (length basename) 4)) "info")))
-
-
-(defun py2texi-process-verbatims ()
- "Process and protect verbatim environments."
- (let (delimiter
- beg
- end)
- (py2texi-search-safe "\\\\begin{\\(verbatim\\|displaymath\\)}"
- (when (save-excursion
- ; Make sure we aren't looking at a commented out version
- ; of a verbatim environment
- (beginning-of-line)
- (not (looking-at "%")))
- (replace-match "@example ")
- (setq beg (copy-marker (point) nil))
- (re-search-forward "\\\\end{\\(verbatim\\|displaymath\\)}")
- (setq end (copy-marker (match-beginning 0) nil))
- (replace-match "@end example")
- (py2texi-texinfo-escape beg end)
- (put-text-property (- beg (length "@example "))
- (+ end (length "@end example"))
- 'py2texi-protected t)))
- (py2texi-search-safe "\\\\verb\\([^a-z]\\)"
- (setq delimiter (match-string 1))
- (replace-match "@code{")
- (setq beg (copy-marker (point) nil))
- (re-search-forward (regexp-quote delimiter))
- (setq end (copy-marker (match-beginning 0) nil))
- (replace-match "}")
- (put-text-property (- beg (length "@code{")) (+ end (length "}"))
- 'py2texi-protected t)
- (py2texi-texinfo-escape beg end))))
-
-
-(defun py2texi-process-comments ()
- "Remove comments."
- (let (point)
- (py2texi-search-safe "%"
- (setq point (point))
- (when (save-excursion
- (re-search-backward "\\(^\\|[^\\]\\(\\\\\\\\\\)*\\)%\\=" nil t))
- (delete-region (1- point)
- (save-excursion (beginning-of-line 2) (point)))))))
-
-
-(defun py2texi-process-includes ()
- "Include LaTeX input files.
-Do not include .ind files."
- (let ((path (file-name-directory file))
- filename
- dirs
- includefile)
- (py2texi-search-safe "\\\\input{\\([^}]+\\)}"
- (setq filename (match-string 1))
- (unless (save-match-data (string-match "\\.tex$" filename))
- (setq filename (concat filename ".tex")))
- (setq includefile (save-match-data
- (string-match "\\.ind\\.tex$" filename)))
- (setq dirs py2texi-dirs)
- (while (and (not includefile) dirs)
- (setq includefile
- (concat (file-name-as-directory (car dirs)) filename))
- (if (not (file-name-absolute-p includefile))
- (setq includefile
- (concat (file-name-as-directory path) includefile)))
- (unless (file-exists-p includefile)
- (setq includefile nil)
- (setq dirs (cdr dirs))))
- (if includefile
- (save-restriction
- (narrow-to-region (match-beginning 0) (match-end 0))
- (delete-region (point-min) (point-max))
- (when (stringp includefile)
- (insert-file-contents includefile)
- (goto-char (point-min))
- (insert "\n")
- (py2texi-process-verbatims)
- (py2texi-process-comments)
- (py2texi-process-includes)))
- (replace-match (format "\\\\emph{Included file %s}" filename))
- (py2texi-message (format "Input file %s not found" filename))))))
-
-
-(defun py2texi-process-funnyas ()
- "Convert @s."
- (py2texi-search-safe "@"
- (replace-match "@@")))
-
-
-(defun py2texi-process-environments ()
- "Process LaTeX environments."
- (let ((stack ())
- kind
- environment
- parameter
- arguments
- n
- string
- description)
- (py2texi-search-safe (concat "\\\\\\(begin\\|end\\|item\\)"
- "\\({\\([^}]*\\)}\\|[[]\\([^]]*\\)[]]\\|\\)")
- (setq kind (match-string 1)
- environment (match-string 3)
- parameter (match-string 4))
- (replace-match "")
- (cond
- ((string= kind "begin")
- (setq description (assoc environment py2texi-environments))
- (if description
- (progn
- (setq n (cadr description))
- (setq description (cddr description))
- (setq string (py2texi-tex-arguments n))
- (string-match (py2texi-regexp n) string)
- ; incorrect but sufficient
- (insert (replace-match (eval (car description))
- t nil string))
- (setq stack (cons (cadr description) stack)))
- (py2texi-message (format "Unknown environment: %s" environment))
- (setq stack (cons "" stack))))
- ((string= kind "end")
- (insert (eval (car stack)))
- (setq stack (cdr stack)))
- ((string= kind "item")
- (insert "\n@item " (or parameter "") "\n"))))
- (when stack
- (py2texi-message (format "Unclosed environment: %s" (car stack))))))
-
-
-(defun py2texi-process-commands ()
- "Process LaTeX commands."
- (let (done
- command
- command-info
- string
- n)
- (while (not done)
- (setq done t)
- (py2texi-search-safe "\\\\\\([a-zA-Z*]+\\)\\(\\[[^]]*\\]\\)?"
- (setq command (match-string 1))
- (setq command-info (assoc command py2texi-commands))
- (if command-info
- (progn
- (setq done nil)
- (replace-match "")
- (setq command-info (cdr command-info))
- (setq n (car command-info))
- (setq string (py2texi-tex-arguments n))
- (string-match (py2texi-regexp n) string)
- ; incorrect but sufficient
- (insert (replace-match (eval (cadr command-info))
- t nil string)))
- (py2texi-message (format "Unknown command: %s (not processed)"
- command)))))))
-
-
-(defun py2texi-argument-pattern (count)
- (let ((filler "\\(?:[^{}]\\|\\\\{\\|\\\\}\\)*"))
- (if (<= count 0)
- filler
- (concat filler "\\(?:{"
- (py2texi-argument-pattern (1- count))
- "}" filler "\\)*" filler))))
-(defconst py2texi-tex-argument
- (concat
- "{\\("
- (py2texi-argument-pattern 10) ;really at least 10!
- "\\)}[ \t%@c\n]*")
- "Regexp describing LaTeX command argument including argument separators.")
-
-
-(defun py2texi-regexp (n)
- "Make regexp matching N LaTeX command arguments."
- (if (= n 0)
- ""
- (let ((regexp "^[^{]*"))
- (while (> n 0)
- (setq regexp (concat regexp py2texi-tex-argument))
- (setq n (1- n)))
- regexp)))
-
-
-(defun py2texi-tex-arguments (n)
- "Remove N LaTeX command arguments and return them as a string."
- (let ((point (point))
- (i 0)
- result
- match)
- (if (= n 0)
- (progn
- (when (re-search-forward "\\=\\({}\\| *\\)" nil t)
- (replace-match ""))
- "")
- (while (> n 0)
- (unless (re-search-forward
- "\\(\\=\\|[^\\\\]\\)\\(\\\\\\\\\\)*\\([{}]\\)" nil t)
- (debug))
- (if (string= (match-string 3) "{")
- (setq i (1+ i))
- (setq i (1- i))
- (when (<= i 0)
- (setq n (1- n)))))
- (setq result (buffer-substring-no-properties point (point)))
- (while (string-match "\n[ \t]*" result)
- (setq result (replace-match " " t nil result)))
- (delete-region point (point))
- result)))
-
-
-(defun py2texi-process-simple-commands ()
- "Replace single character LaTeX commands."
- (let (char)
- (py2texi-search-safe "\\\\\\([^a-z]\\)"
- (setq char (match-string 1))
- (replace-match (format "%s%s"
- (if (or (string= char "{")
- (string= char "}")
- (string= char " "))
- "@"
- "")
- (if (string= char "\\")
- "\\\\"
- char))))))
-
-
-(defun py2texi-fix-indentation ()
- "Remove white space at the beginning of lines."
- (py2texi-search-safe "^[ \t]+"
- (replace-match "")))
-
-
-(defun py2texi-fix-nodes ()
- "Remove unwanted characters from nodes and make nodes unique."
- (let ((nodes (make-hash-table :test 'equal))
- id
- counter
- string
- label
- index)
- (py2texi-search "^@node +\\(.*\\)$"
- (setq string (match-string 1))
- (if py2texi-xemacs
- (replace-match "@node " t)
- (replace-match "" t nil nil 1))
- (while (string-match "@label{[^}]*}" string)
- (setq label (match-string 0 string))
- (setq string (replace-match "" t nil string)))
- (while (string-match "@..?index{[^}]*}" string)
- (setq index (match-string 0 string))
- (setq string (replace-match "" t nil string)))
- (while (string-match "@[a-zA-Z]+\\|[{}():]\\|``\\|''" string)
- (setq string (replace-match "" t nil string)))
- (while (string-match " -- " string)
- (setq string (replace-match " - " t nil string)))
- (while (string-match "\\." string)
- (setq string (replace-match "" t nil string)))
- (when (string-match " +$" string)
- (setq string (replace-match "" t nil string)))
- (when (string-match "^\\(Built-in\\|Standard\\) Module \\|The " string)
- (setq string (replace-match "" t nil string)))
- (string-match "^[^,]+" string)
- (setq id (match-string 0 string))
- (setq counter (gethash id nodes))
- (if counter
- (progn
- (setq counter (1+ counter))
- (setq string (replace-match (format "\\& %d" counter)
- t nil string)))
- (setq counter 1))
- (setf (gethash id nodes) counter)
- (insert string)
- (beginning-of-line 3)
- (when label
- (insert label "\n"))
- (when index
- (insert index "\n")))))
-
-
-(defun py2texi-fix-references ()
- "Process labels and make references to point to appropriate nodes."
- (let ((labels ())
- node)
- (py2texi-search-safe "@label{\\([^}]*\\)}"
- (setq node (save-excursion
- (save-match-data
- (and (re-search-backward "@node +\\([^,\n]+\\)" nil t)
- (match-string 1)))))
- (when node
- (setq labels (cons (cons (match-string 1) node) labels)))
- (replace-match ""))
- (py2texi-search-safe "@ref{\\([^}]*\\)}"
- (setq node (assoc (match-string 1) labels))
- (replace-match "")
- (when node
- (insert (format "@ref{%s}" (cdr node)))))))
-
-
-(defun py2texi-fix-indices ()
- "Remove unwanted characters from @*index commands and create final indices."
- (py2texi-search-safe "@..?index\\>[^\n]*\\(\\)\n"
- (replace-match "" t nil nil 1))
- (py2texi-search-safe "@..?index\\>[^\n]*\\(\\)"
- (replace-match "\n" t nil nil 1))
- (py2texi-search-safe "@..?index\\({\\)\\([^}]+\\)\\(}+\\)"
- (replace-match " " t nil nil 1)
- (replace-match "" t nil nil 3)
- (let ((string (match-string 2)))
- (save-match-data
- (while (string-match "@[a-z]+{" string)
- (setq string (replace-match "" nil nil string)))
- (while (string-match "{" string)
- (setq string (replace-match "" nil nil string))))
- (replace-match string t t nil 2)))
- (py2texi-search-safe "@..?index\\>.*\\([{}]\\|@[a-z]*\\)"
- (replace-match "" t nil nil 1)
- (goto-char (match-beginning 0)))
- (py2texi-search-safe "[^\n]\\(\\)@..?index\\>"
- (replace-match "\n" t nil nil 1))
- (goto-char (point-max))
- (re-search-backward "@indices")
- (replace-match "")
- (insert (if moindex
- (concat "@node Module Index\n"
- "@unnumbered Module Index\n"
- "@printindex mo\n")
- "")
- (if obindex
- (concat "@node Class-Exception-Object Index\n"
- "@unnumbered Class, Exception, and Object Index\n"
- "@printindex ob\n")
- "")
- (if findex
- (concat "@node Function-Method-Variable Index\n"
- "@unnumbered Function, Method, and Variable Index\n"
- "@printindex fn\n")
- "")
- (if cindex
- (concat "@node Miscellaneous Index\n"
- "@unnumbered Miscellaneous Index\n"
- "@printindex cp\n")
- "")))
-
-
-(defun py2texi-fix-backslashes ()
- "Make backslashes from auxiliary commands."
- (py2texi-search-safe "@backslash{}"
- (replace-match "\\\\")))
-
-
-(defun py2texi-fix-fonts ()
- "Remove garbage after unstructured font commands."
- (let (string)
- (py2texi-search-safe "@destroy"
- (replace-match "")
- (when (eq (preceding-char) ?{)
- (forward-char -1)
- (setq string (py2texi-tex-arguments 1))
- (insert (substring string 1 (1- (length string))))))))
-
-
-(defun py2texi-fix-braces ()
- "Escape braces for Texinfo."
- (py2texi-search "{@{}"
- (replace-match "@{"))
- (py2texi-search "{@}}"
- (replace-match "@}"))
- (let (string)
- (py2texi-search "{"
- (unless (or (py2texi-protected)
- (save-excursion
- (re-search-backward
- "@\\([a-zA-Z]*\\|multitable.*\\){\\=" nil t)))
- (forward-char -1)
- (setq string (py2texi-tex-arguments 1))
- (insert "@" (substring string 0 (1- (length string))) "@}")))))
-
-
-(defun py2texi-fix-newlines ()
- "Remove extra newlines."
- (py2texi-search "\n\n\n+"
- (replace-match "\n\n"))
- (py2texi-search-safe "@item.*\n\n"
- (delete-backward-char 1))
- (py2texi-search "@end example"
- (unless (looking-at "\n\n")
- (insert "\n"))))
-
-
-(defun py2texi-destroy-empties ()
- "Remove all comments.
-This avoids some makeinfo errors."
- (py2texi-search "@c\\>"
- (unless (eq (py2texi-protected) t)
- (delete-region (- (point) 2) (save-excursion (end-of-line) (point)))
- (cond
- ((looking-at "\n\n")
- (delete-char 1))
- ((save-excursion (re-search-backward "^[ \t]*\\=" nil t))
- (delete-region (save-excursion (beginning-of-line) (point))
- (1+ (point))))))))
-
-
-(defun py2texi-adjust-level ()
- "Increase heading level to @chapter, if needed.
-This is only needed for distutils, so it has a very simple form only."
- (goto-char (point-min))
- (unless (re-search-forward "@chapter\\>" nil t)
- (py2texi-search-safe "@section\\>"
- (replace-match "@chapter" t))
- (py2texi-search-safe "@\\(sub\\)\\(sub\\)?section\\>"
- (replace-match "" nil nil nil 1))))
-
-
-(defun py2texi-texinfo-escape (beg end)
- "Escape Texinfo special characters in region."
- (save-excursion
- (goto-char beg)
- (while (re-search-forward "[@{}]" end t)
- (replace-match "@\\&"))))
-
-
-(defun py2texi-protected ()
- "Return protection status of the point before current point."
- (get-text-property (1- (point)) 'py2texi-protected))
-
-
-;;; Announce
-
-(provide 'py2texi)
-
-
-;;; py2texi.el ends here