| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 1 | ;;; py2texi.el -- Conversion of Python LaTeX documentation to Texinfo | 
 | 2 |  | 
 | 3 | ;; Copyright (C) 1998, 1999, 2001, 2002 Milan Zamazal | 
 | 4 |  | 
 | 5 | ;; Author: Milan Zamazal <pdm@zamazal.org> | 
 | 6 | ;; Version: $Id$ | 
 | 7 | ;; Keywords: python | 
 | 8 |  | 
 | 9 | ;; COPYRIGHT NOTICE | 
 | 10 | ;; | 
 | 11 | ;; This program is free software; you can redistribute it and/or modify it | 
 | 12 | ;; under the terms of the GNU General Public License as published by the Free | 
 | 13 | ;; Software Foundation; either version 2, or (at your option) any later | 
 | 14 | ;; version. | 
 | 15 | ;; | 
 | 16 | ;; This program is distributed in the hope that it will be useful, but | 
 | 17 | ;; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | 
 | 18 | ;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | 
 | 19 | ;; for more details. | 
 | 20 | ;; | 
 | 21 | ;; You can find the GNU General Public License at | 
 | 22 | ;; http://www.gnu.org/copyleft/gpl.html | 
 | 23 | ;; or you can write to the Free Software Foundation, Inc., 59 Temple Place, | 
 | 24 | ;; Suite 330, Boston, MA 02111-1307, USA. | 
 | 25 |  | 
 | 26 | ;;; Commentary: | 
 | 27 |  | 
 | 28 | ;; This is a Q&D hack for conversion of Python manuals to on-line help format. | 
 | 29 | ;; I desperately needed usable online documenta for Python, so I wrote this. | 
 | 30 | ;; The result code is ugly and need not contain complete information from | 
 | 31 | ;; Python manuals.  I apologize for my ignorance, especially ignorance to | 
 | 32 | ;; python.sty.  Improvements of this convertor are welcomed. | 
 | 33 |  | 
 | 34 | ;; How to use it: | 
 | 35 | ;; Load this file and apply `M-x py2texi'.  You will be asked for name of a | 
 | 36 | ;; file to be converted. | 
 | 37 |  | 
 | 38 | ;; Where to find it: | 
 | 39 | ;; New versions of this code might be found at | 
 | 40 | ;; http://www.zamazal.org/software/python/py2texi/ . | 
 | 41 |  | 
 | 42 | ;;; Code: | 
 | 43 |  | 
 | 44 |  | 
 | 45 | (require 'texinfo) | 
 | 46 | (eval-when-compile | 
 | 47 |   (require 'cl)) | 
 | 48 |  | 
 | 49 |  | 
 | 50 | (defvar py2texi-python-version "2.2" | 
 | 51 |   "What to substitute for the \\version macro.") | 
 | 52 |  | 
 | 53 | (defvar py2texi-python-short-version | 
 | 54 |   (progn | 
 | 55 |     (string-match "[0-9]+\\.[0-9]+" py2texi-python-version) | 
 | 56 |     (match-string 0 py2texi-python-version)) | 
 | 57 |   "Short version number, usually set by the LaTeX commands.") | 
 | 58 |  | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 59 | (defvar py2texi-texi-file-name nil | 
 | 60 |   "If non-nil, that string is used as the name of the Texinfo file. | 
 | 61 | Otherwise a generated Texinfo file name is used.") | 
 | 62 |  | 
 | 63 | (defvar py2texi-info-file-name nil | 
 | 64 |   "If non-nil, that string is used as the name of the Info file. | 
 | 65 | Otherwise a generated Info file name is used.") | 
 | 66 |  | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 67 | (defvar py2texi-stop-on-problems nil | 
 | 68 |   "*If non-nil, stop when you encouter soft problem.") | 
 | 69 |  | 
 | 70 | (defconst py2texi-environments | 
 | 71 |   '(("abstract" 0 "@quotation" "@end quotation\n") | 
 | 72 |     ("center" 0 "" "") | 
 | 73 |     ("cfuncdesc" 3 | 
 | 74 |      (progn (setq findex t) | 
 | 75 | 	    "\n@table @code\n@item \\1 \\2(\\3)\n@findex \\2\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 76 |      "@end table\n") | 
 | 77 |     ("cmemberdesc" 3 | 
 | 78 |      "\n@table @code\n@item \\2 \\3\n" | 
 | 79 |      "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 80 |     ("classdesc" 2 | 
 | 81 |      (progn (setq obindex t) | 
 | 82 | 	    "\n@table @code\n@item \\1(\\2)\n@obindex \\1\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 83 |      "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 84 |     ("classdesc*" 1 | 
 | 85 |      (progn (setq obindex t) | 
 | 86 | 	    "\n@table @code\n@item \\1\n@obindex \\1\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 87 |      "@end table\n") | 
| Fred Drake | 6675881 | 2003-07-02 14:44:08 +0000 | [diff] [blame] | 88 |     ("comment" 0 "\n@ignore\n" "\n@end ignore\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 89 |     ("csimplemacrodesc" 1 | 
 | 90 |      (progn (setq cindex t) | 
 | 91 | 	    "\n@table @code\n@item \\1\n@cindex \\1\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 92 |      "@end table\n")      | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 93 |     ("ctypedesc" 1 | 
 | 94 |      (progn (setq cindex t) | 
 | 95 | 	    "\n@table @code\n@item \\1\n@cindex \\1\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 96 |      "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 97 |     ("cvardesc" 2 | 
 | 98 |      (progn (setq findex t) | 
 | 99 | 	    "\n@table @code\n@item \\1 \\2\n@findex \\2\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 100 |      "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 101 |     ("datadesc" 1 | 
 | 102 |      (progn (setq findex t) | 
 | 103 | 	    "\n@table @code\n@item \\1\n@findex \\1\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 104 |      "@end table\n") | 
 | 105 |     ("datadescni" 1 "\n@table @code\n@item \\1\n" "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 106 |     ("definitions" 0 "@table @dfn" "@end table\n") | 
 | 107 |     ("description" 0 "@table @samp" "@end table\n") | 
 | 108 |     ("displaymath" 0 "" "") | 
 | 109 |     ("document" 0 | 
 | 110 |      (concat "@defcodeindex mo\n" | 
 | 111 | 	     "@defcodeindex ob\n" | 
 | 112 | 	     "@titlepage\n" | 
 | 113 | 	     (format "@title " title "\n") | 
 | 114 | 	     (format "@author " author "\n") | 
 | 115 | 	     "@page\n" | 
 | 116 | 	     author-address | 
 | 117 | 	     "@end titlepage\n" | 
 | 118 | 	     "@node Top, , , (dir)\n") | 
 | 119 |      (concat "@indices\n" | 
 | 120 | 	     "@contents\n" | 
 | 121 | 	     "@bye\n")) | 
 | 122 |     ("enumerate" 0 "@enumerate" "@end enumerate") | 
| Fred Drake | 3b09558 | 2003-07-02 14:22:48 +0000 | [diff] [blame] | 123 |     ("envdesc" 2 (concat "\n@table @code" | 
 | 124 |                          "\n@item @backslash{}begin@{\\1@}\\2") | 
 | 125 |      "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 126 |     ("excdesc" 1 | 
 | 127 |      (progn (setq obindex t) | 
 | 128 | 	    "\n@table @code\n@item \\1\n@obindex \\1\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 129 |      "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 130 |     ("excclassdesc" 2 | 
 | 131 |      (progn (setq obindex t) | 
 | 132 | 	    "\n@table @code\n@item \\1(\\2)\n@obindex \\1\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 133 |      "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 134 |     ("flushleft" 0 "" "") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 135 |     ("fulllineitems" 0 "\n@table @code\n" "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 136 |     ("funcdesc" 2 | 
 | 137 |      (progn (setq findex t) | 
 | 138 | 	    "\n@table @code\n@item \\1(\\2)\n@findex \\1\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 139 |      "@end table\n") | 
 | 140 |     ("funcdescni" 2 "\n@table @code\n@item \\1(\\2)\n" "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 141 |     ("itemize" 0 "@itemize @bullet" "@end itemize\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 142 |     ("list" 2 "\n@table @code\n" "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 143 |     ("longtableii" 4 (concat "@multitable @columnfractions .5 .5\n" | 
 | 144 | 			     "@item \\3 @tab \\4\n" | 
 | 145 | 			     "@item ------- @tab ------ \n") | 
 | 146 |      "@end multitable\n") | 
 | 147 |     ("longtableiii" 5 (concat "@multitable @columnfractions .33 .33 .33\n" | 
 | 148 | 			      "@item \\3 @tab \\4 @tab \\5\n" | 
 | 149 | 			      "@item ------- @tab ------ @tab ------\n") | 
 | 150 |      "@end multitable\n") | 
| Fred Drake | 3b09558 | 2003-07-02 14:22:48 +0000 | [diff] [blame] | 151 |     ("macrodesc" 2 (concat "\n@table @code" | 
 | 152 |                            "\n@item \\1@{\\2@}") | 
 | 153 |      "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 154 |     ("memberdesc" 1 | 
 | 155 |      (progn (setq findex t) | 
 | 156 | 	    "\n@table @code\n@item \\1\n@findex \\1\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 157 |      "@end table\n") | 
 | 158 |     ("memberdescni" 1 "\n@table @code\n@item \\1\n" "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 159 |     ("methoddesc" 2 | 
 | 160 |      (progn (setq findex t) | 
 | 161 | 	    "\n@table @code\n@item \\1(\\2)\n@findex \\1\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 162 |      "@end table\n") | 
 | 163 |     ("methoddescni" 2 "\n@table @code\n@item \\1(\\2)\n" "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 164 |     ("notice" 0 "@emph{Notice:} " "") | 
 | 165 |     ("opcodedesc" 2 | 
 | 166 |      (progn (setq findex t) | 
 | 167 | 	    "\n@table @code\n@item \\1 \\2\n@findex \\1\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 168 |      "@end table\n") | 
 | 169 |     ("productionlist" 0 "\n@table @code\n" "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 170 |     ("quotation" 0 "@quotation" "@end quotation") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 171 |     ("seealso" 0 "See also:\n@table @emph\n" "@end table\n") | 
 | 172 |     ("seealso*" 0 "@table @emph\n" "@end table\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 173 |     ("sloppypar" 0 "" "") | 
 | 174 |     ("small" 0 "" "") | 
 | 175 |     ("tableii" 4 (concat "@multitable @columnfractions .5 .5\n" | 
 | 176 | 			 "@item \\3 @tab \\4\n" | 
 | 177 | 			 "@item ------- @tab ------ \n") | 
 | 178 |      "@end multitable\n") | 
 | 179 |     ("tableiii" 5 (concat "@multitable @columnfractions .33 .33 .33\n" | 
 | 180 | 			 "@item \\3 @tab \\4 @tab \\5\n" | 
 | 181 | 			 "@item ------- @tab ------ @tab ------\n") | 
 | 182 |      "@end multitable\n") | 
 | 183 |     ("tableiv" 6 (concat | 
 | 184 | 		  "@multitable @columnfractions .25 .25 .25 .25\n" | 
 | 185 | 		  "@item \\3 @tab \\4 @tab \\5 @tab \\6\n" | 
 | 186 | 		  "@item ------- @tab ------- @tab ------- @tab -------\n") | 
 | 187 |      "@end multitable\n") | 
 | 188 |     ("tablev" 7 (concat | 
 | 189 | 		 "@multitable @columnfractions .20 .20 .20 .20 .20\n" | 
 | 190 | 		 "@item \\3 @tab \\4 @tab \\5 @tab \\6 @tab \\7\n" | 
 | 191 | 		 "@item ------- @tab ------- @tab ------- @tab ------- @tab -------\n") | 
| Fred Drake | 8500263 | 2003-07-16 03:35:41 +0000 | [diff] [blame] | 192 |      "@end multitable\n") | 
 | 193 |     ("alltt" 0 "@example" "@end example") | 
 | 194 |     ) | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 195 |   "Associative list defining substitutions for environments. | 
 | 196 | Each list item is of the form (ENVIRONMENT ARGNUM BEGIN END) where: | 
 | 197 | - ENVIRONMENT is LaTeX environment name | 
 | 198 | - ARGNUM is number of (required) macro arguments | 
 | 199 | - BEGIN is substitution for \begin{ENVIRONMENT} | 
 | 200 | - END is substitution for \end{ENVIRONMENT} | 
 | 201 | Both BEGIN and END are evaled.  Moreover, you can reference arguments through | 
 | 202 | \N regular expression notation in strings of BEGIN.") | 
 | 203 |  | 
 | 204 | (defconst py2texi-commands | 
| Fred Drake | 7769bb9 | 2003-07-16 03:16:34 +0000 | [diff] [blame] | 205 |   '(("AA" 0 "@AA{}") | 
 | 206 |     ("aa" 0 "@aa{}") | 
 | 207 |     ("ABC" 0 "ABC") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 208 |     ("appendix" 0 (progn (setq appendix t) "")) | 
 | 209 |     ("ASCII" 0 "ASCII") | 
 | 210 |     ("author" 1 (progn (setq author (match-string 1 string)) "")) | 
 | 211 |     ("authoraddress" 1 | 
 | 212 |      (progn (setq author-address (match-string 1 string)) "")) | 
 | 213 |     ("b" 1 "@w{\\1}") | 
| Andrew M. Kuchling | e970d2a | 2004-07-17 14:43:32 +0000 | [diff] [blame^] | 214 |     ("backslash" 0 "@backslash{}") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 215 |     ("bf" 0 "@destroy") | 
 | 216 |     ("bifuncindex" 1 (progn (setq findex t) "@findex{\\1}")) | 
 | 217 |     ("C" 0 "C") | 
 | 218 |     ("c" 0 "@,") | 
 | 219 |     ("catcode" 0 "") | 
 | 220 |     ("cdata" 1 "@code{\\1}") | 
 | 221 |     ("centerline" 1 "@center \\1") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 222 |     ("cfuncline" 3 "@itemx \\1 \\2(\\3)\n@findex \\2") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 223 |     ("cfunction" 1 "@code{\\1}") | 
 | 224 |     ("chapter" 1 (format "@node \\1\n@%s \\1\n" | 
 | 225 | 			 (if appendix "appendix" "chapter"))) | 
 | 226 |     ("chapter*" 1 "@node \\1\n@unnumbered \\1\n") | 
 | 227 |     ("character" 1 "@samp{\\1}") | 
 | 228 |     ("citetitle" 1 "@ref{Top,,,\\1}") | 
 | 229 |     ("class" 1 "@code{\\1}") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 230 |     ("cmemberline" 3 "@itemx \\2 \\3\n") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 231 |     ("code" 1 "@code{\\1}") | 
 | 232 |     ("command" 1 "@command{\\1}") | 
 | 233 |     ("constant" 1 "@code{\\1}") | 
 | 234 |     ("copyright" 1 "@copyright{}") | 
 | 235 |     ("Cpp" 0 "C++") | 
| Fred Drake | d805fef | 2002-06-27 18:38:06 +0000 | [diff] [blame] | 236 |     ("csimplemacro" 1 "@code{\\1}") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 237 |     ("ctype" 1 "@code{\\1}") | 
 | 238 |     ("dataline" 1 (progn (setq findex t) "@item \\1\n@findex \\1\n")) | 
 | 239 |     ("date" 1 "\\1") | 
 | 240 |     ("declaremodule" 2 (progn (setq cindex t) "@label{\\2}@cindex{\\2}")) | 
 | 241 |     ("deprecated" 2 "@emph{This is deprecated in Python \\1.  \\2}") | 
 | 242 |     ("dfn" 1 "@dfn{\\1}") | 
 | 243 |     ("documentclass" 1 py2texi-magic) | 
 | 244 |     ("e" 0 "@backslash{}") | 
 | 245 |     ("else" 0 (concat "@end ifinfo\n@" (setq last-if "iftex"))) | 
| Fred Drake | 3b09558 | 2003-07-02 14:22:48 +0000 | [diff] [blame] | 246 |     ("env" 1 "@code{\\1}") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 247 |     ("EOF" 0 "@code{EOF}") | 
 | 248 |     ("email" 1 "@email{\\1}") | 
 | 249 |     ("emph" 1 "@emph{\\1}") | 
| Fred Drake | 0bb242b | 2003-07-16 03:44:48 +0000 | [diff] [blame] | 250 |     ("envvar" 1 "@env{\\1}") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 251 |     ("exception" 1 "@code{\\1}") | 
 | 252 |     ("exindex" 1 (progn (setq obindex t) "@obindex{\\1}")) | 
 | 253 |     ("fi" 0 (concat "@end " last-if)) | 
 | 254 |     ("file" 1 "@file{\\1}") | 
| Fred Drake | 3b09558 | 2003-07-02 14:22:48 +0000 | [diff] [blame] | 255 |     ("filenq" 1 "@file{\\1}") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 256 |     ("filevar" 1 "@file{@var{\\1}}") | 
 | 257 |     ("footnote" 1 "@footnote{\\1}") | 
 | 258 |     ("frac" 0 "") | 
 | 259 |     ("funcline" 2 (progn (setq findex t) "@item \\1 \\2\n@findex \\1")) | 
 | 260 |     ("funclineni" 2 "@item \\1 \\2") | 
 | 261 |     ("function" 1 "@code{\\1}") | 
 | 262 |     ("grammartoken" 1 "@code{\\1}") | 
 | 263 |     ("hline" 0 "") | 
 | 264 |     ("ifhtml" 0 (concat "@" (setq last-if "ifinfo"))) | 
 | 265 |     ("iftexi" 0 (concat "@" (setq last-if "ifinfo"))) | 
 | 266 |     ("index" 1 (progn (setq cindex t) "@cindex{\\1}")) | 
 | 267 |     ("indexii" 2 (progn (setq cindex t) "@cindex{\\1 \\2}")) | 
 | 268 |     ("indexiii" 3 (progn (setq cindex t) "@cindex{\\1 \\2 \\3}")) | 
 | 269 |     ("indexiv" 3 (progn (setq cindex t) "@cindex{\\1 \\2 \\3 \\4}")) | 
 | 270 |     ("infinity" 0 "@emph{infinity}") | 
 | 271 |     ("it" 0 "@destroy") | 
 | 272 |     ("kbd" 1 "@key{\\1}") | 
 | 273 |     ("keyword" 1 "@code{\\1}") | 
 | 274 |     ("kwindex" 1 (progn (setq cindex t) "@cindex{\\1}")) | 
 | 275 |     ("label" 1 "@label{\\1}") | 
 | 276 |     ("Large" 0 "") | 
 | 277 |     ("LaTeX" 0 "La@TeX{}") | 
 | 278 |     ("large" 0 "") | 
 | 279 |     ("ldots" 0 "@dots{}") | 
 | 280 |     ("leftline" 1 "\\1") | 
 | 281 |     ("lineii" 2 "@item \\1 @tab \\2") | 
 | 282 |     ("lineiii" 3 "@item \\1 @tab \\2 @tab \\3") | 
 | 283 |     ("lineiv" 4 "@item \\1 @tab \\2 @tab \\3 @tab \\4") | 
 | 284 |     ("linev" 5 "@item \\1 @tab \\2 @tab \\3 @tab \\4 @tab \\5") | 
 | 285 |     ("localmoduletable" 0 "") | 
 | 286 |     ("longprogramopt" 1 "@option{--\\1}") | 
| Fred Drake | 3b09558 | 2003-07-02 14:22:48 +0000 | [diff] [blame] | 287 |     ("macro" 1 "@code{@backslash{}\\1}") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 288 |     ("mailheader" 1 "@code{\\1}") | 
 | 289 |     ("makeindex" 0 "") | 
 | 290 |     ("makemodindex" 0 "") | 
 | 291 |     ("maketitle" 0 (concat "@top " title "\n")) | 
 | 292 |     ("makevar" 1 "@code{\\1}") | 
 | 293 |     ("manpage" 2 "@samp{\\1(\\2)}") | 
 | 294 |     ("mbox" 1 "@w{\\1}") | 
 | 295 |     ("member" 1 "@code{\\1}") | 
 | 296 |     ("memberline" 1 "@item \\1\n@findex \\1\n") | 
 | 297 |     ("menuselection" 1 "@samp{\\1}") | 
 | 298 |     ("method" 1 "@code{\\1}") | 
 | 299 |     ("methodline" 2 (progn (setq moindex t) "@item \\1(\\2)\n@moindex \\1\n")) | 
 | 300 |     ("methodlineni" 2 "@item \\1(\\2)\n") | 
 | 301 |     ("mimetype" 1 "@samp{\\1}") | 
 | 302 |     ("module" 1 "@samp{\\1}") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 303 |     ("moduleauthor" 2 "") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 304 |     ("modulesynopsis" 1 "\\1") | 
 | 305 |     ("moreargs" 0 "@dots{}") | 
 | 306 |     ("n" 0 "@backslash{}n") | 
 | 307 |     ("newcommand" 2 "") | 
 | 308 |     ("newsgroup" 1 "@samp{\\1}") | 
 | 309 |     ("nodename" 1 | 
 | 310 |      (save-excursion | 
 | 311 |        (save-match-data | 
 | 312 | 	 (re-search-backward "^@node ")) | 
 | 313 |        (delete-region (point) (save-excursion (end-of-line) (point))) | 
 | 314 |        (insert "@node " (match-string 1 string)) | 
 | 315 |        "")) | 
 | 316 |     ("noindent" 0 "@noindent ") | 
 | 317 |     ("note" 1 "@emph{Note:} \\1") | 
 | 318 |     ("NULL" 0 "@code{NULL}") | 
 | 319 |     ("obindex" 1 (progn (setq obindex t) "@obindex{\\1}")) | 
 | 320 |     ("opindex" 1 (progn (setq cindex t) "@cindex{\\1}")) | 
 | 321 |     ("option" 1 "@option{\\1}") | 
 | 322 |     ("optional" 1 "[\\1]") | 
 | 323 |     ("pep" 1 (progn (setq cindex t) "PEP@ \\1@cindex PEP \\1\n")) | 
 | 324 |     ("pi" 0 "pi") | 
 | 325 |     ("platform" 1 "") | 
 | 326 |     ("plusminus" 0 "+-") | 
 | 327 |     ("POSIX" 0 "POSIX") | 
 | 328 |     ("production" 2 "@item \\1 \\2") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 329 |     ("productioncont" 1 "@item @w{} \\1") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 330 |     ("program" 1 "@command{\\1}") | 
 | 331 |     ("programopt" 1 "@option{\\1}") | 
 | 332 |     ("protect" 0 "") | 
 | 333 |     ("pytype" 1 "@code{\\1}") | 
 | 334 |     ("ref" 1 "@ref{\\1}") | 
 | 335 |     ("refbimodindex" 1 (progn (setq moindex t) "@moindex{\\1}")) | 
 | 336 |     ("refmodindex" 1 (progn (setq moindex t) "@moindex{\\1}")) | 
 | 337 |     ("refmodule" 1 "@samp{\\1}") | 
 | 338 |     ("refstmodindex" 1 (progn (setq moindex t) "@moindex{\\1}")) | 
 | 339 |     ("regexp" 1 "\"\\1\"") | 
 | 340 |     ("release" 1 | 
 | 341 |      (progn (setq py2texi-python-version (match-string 1 string)) "")) | 
 | 342 |     ("renewcommand" 2 "") | 
 | 343 |     ("rfc" 1 (progn (setq cindex t) "RFC@ \\1@cindex RFC \\1\n")) | 
 | 344 |     ("rm" 0 "@destroy") | 
 | 345 |     ("samp" 1 "@samp{\\1}") | 
 | 346 |     ("section" 1 (let ((str (match-string 1 string))) | 
 | 347 | 		   (save-match-data | 
 | 348 | 		     (if (string-match "\\(.*\\)[ \t\n]*---[ \t\n]*\\(.*\\)" | 
 | 349 | 				       str) | 
 | 350 | 			 (format | 
 | 351 | 			  "@node %s\n@section %s\n" | 
 | 352 | 			  (py2texi-backslash-quote (match-string 1 str)) | 
 | 353 | 			  (py2texi-backslash-quote (match-string 2 str))) | 
 | 354 | 		       "@node \\1\n@section \\1\n")))) | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 355 |     ("sectionauthor" 2 "") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 356 |     ("seemodule" 2 "@ref{\\1} \\2") | 
 | 357 |     ("seepep" 3 "\n@table @strong\n@item PEP\\1 \\2\n\\3\n@end table\n") | 
 | 358 |     ("seerfc" 3 "\n@table @strong\n@item RFC\\1 \\2\n\\3\n@end table\n") | 
 | 359 |     ("seetext" 1 "\\1") | 
 | 360 |     ("seetitle" 1 "@cite{\\1}") | 
 | 361 |     ("seeurl" 2 "\n@table @url\n@item \\1\n\\2\n@end table\n") | 
 | 362 |     ("setindexsubitem" 1 (progn (setq cindex t) "@cindex \\1")) | 
 | 363 |     ("setreleaseinfo" 1 (progn (setq py2texi-releaseinfo ""))) | 
 | 364 |     ("setshortversion" 1 | 
 | 365 |      (progn (setq py2texi-python-short-version (match-string 1 string)) "")) | 
 | 366 |     ("shortversion" 0 py2texi-python-short-version) | 
 | 367 |     ("sqrt" 0 "") | 
 | 368 |     ("stindex" 1 (progn (setq cindex t) "@cindex{\\1}")) | 
 | 369 |     ("stmodindex" 1 (progn (setq moindex t) "@moindex{\\1}")) | 
 | 370 |     ("strong" 1 "@strong{\\1}") | 
 | 371 |     ("sub" 0 "/") | 
 | 372 |     ("subsection" 1 "@node \\1\n@subsection \\1\n") | 
 | 373 |     ("subsubsection" 1 "@node \\1\n@subsubsection \\1\n") | 
 | 374 |     ("sum" 0 "") | 
 | 375 |     ("tableofcontents" 0 "") | 
 | 376 |     ("term" 1 "@item \\1") | 
| Fred Drake | 3b09558 | 2003-07-02 14:22:48 +0000 | [diff] [blame] | 377 |     ("TeX" 0 "@TeX{}") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 378 |     ("textasciitilde" 0 "~") | 
 | 379 |     ("textasciicircum" 0 "^") | 
 | 380 |     ("textbackslash" 0 "@backslash{}") | 
| Fred Drake | d805fef | 2002-06-27 18:38:06 +0000 | [diff] [blame] | 381 |     ("textgreater" 0 ">") | 
 | 382 |     ("textless" 0 "<") | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 383 |     ("textrm" 1 "\\1") | 
 | 384 |     ("texttt" 1 "@code{\\1}") | 
 | 385 |     ("textunderscore" 0 "_") | 
 | 386 |     ("title" 1 (progn (setq title (match-string 1 string)) "@settitle \\1")) | 
 | 387 |     ("today" 0 "@today{}") | 
 | 388 |     ("token" 1 "@code{\\1}") | 
 | 389 |     ("tt" 0 "@destroy") | 
 | 390 |     ("ttindex" 1 (progn (setq cindex t) "@cindex{\\1}")) | 
 | 391 |     ("u" 0 "@backslash{}u") | 
 | 392 |     ("ulink" 2 "\\1") | 
 | 393 |     ("UNIX" 0 "UNIX") | 
 | 394 |     ("unspecified" 0 "@dots{}") | 
 | 395 |     ("url" 1 "@url{\\1}") | 
 | 396 |     ("usepackage" 1 "") | 
 | 397 |     ("var" 1 "@var{\\1}") | 
 | 398 |     ("verbatiminput" 1 "@code{\\1}") | 
 | 399 |     ("version" 0 py2texi-python-version) | 
 | 400 |     ("versionadded" 1 "@emph{Added in Python version \\1}") | 
 | 401 |     ("versionchanged" 1 "@emph{Changed in Python version \\1}") | 
 | 402 |     ("vskip" 1 "") | 
 | 403 |     ("vspace" 1 "") | 
 | 404 |     ("warning" 1 "@emph{\\1}") | 
 | 405 |     ("withsubitem" 2 "\\2") | 
 | 406 |     ("XXX" 1 "@strong{\\1}")) | 
 | 407 |   "Associative list of command substitutions. | 
 | 408 | Each list item is of the form (COMMAND ARGNUM SUBSTITUTION) where: | 
 | 409 | - COMMAND is LaTeX command name | 
 | 410 | - ARGNUM is number of (required) command arguments | 
 | 411 | - SUBSTITUTION substitution for the command.  It is evaled and you can | 
 | 412 |   reference command arguments through the \\N regexp notation in strings.") | 
 | 413 |  | 
 | 414 | (defvar py2texi-magic "@documentclass\n" | 
 | 415 |   "\"Magic\" string for auxiliary insertion at the beginning of document.") | 
 | 416 |  | 
 | 417 | (defvar py2texi-dirs '("./" "../texinputs/") | 
 | 418 |   "Where to search LaTeX input files.") | 
 | 419 |  | 
 | 420 | (defvar py2texi-buffer "*py2texi*" | 
 | 421 |   "The name of a buffer where Texinfo is generated.") | 
 | 422 |  | 
 | 423 | (defconst py2texi-xemacs (string-match "^XEmacs" (emacs-version)) | 
 | 424 |   "Running under XEmacs?") | 
 | 425 |  | 
 | 426 |  | 
 | 427 | (defmacro py2texi-search (regexp &rest body) | 
 | 428 |   `(progn | 
 | 429 |      (goto-char (point-min)) | 
 | 430 |      (while (re-search-forward ,regexp nil t) | 
 | 431 |        ,@body))) | 
 | 432 |  | 
 | 433 | (defmacro py2texi-search-safe (regexp &rest body) | 
 | 434 |   `(py2texi-search ,regexp | 
 | 435 |     (unless (py2texi-protected) | 
 | 436 |       ,@body))) | 
 | 437 |  | 
 | 438 |  | 
 | 439 | (defun py2texi-message (message) | 
 | 440 |   "Report message and stop if `py2texi-stop-on-problems' is non-nil." | 
 | 441 |   (if py2texi-stop-on-problems | 
 | 442 |       (error message) | 
 | 443 |     (message message))) | 
 | 444 |  | 
 | 445 |  | 
 | 446 | (defun py2texi-backslash-quote (string) | 
 | 447 |   "Double backslahes in STRING." | 
 | 448 |   (let ((i 0)) | 
 | 449 |     (save-match-data | 
 | 450 |       (while (setq i (string-match "\\\\" string i)) | 
 | 451 | 	(setq string (replace-match "\\\\\\\\" t nil string)) | 
 | 452 | 	(setq i (+ i 2)))) | 
 | 453 |     string)) | 
 | 454 |  | 
 | 455 |  | 
 | 456 | (defun py2texi (file) | 
 | 457 |   "Convert Python LaTeX documentation FILE to Texinfo." | 
 | 458 |   (interactive "fFile to convert: ") | 
 | 459 |   (switch-to-buffer (get-buffer-create py2texi-buffer)) | 
 | 460 |   (erase-buffer) | 
 | 461 |   (insert-file file) | 
 | 462 |   (let ((case-fold-search nil) | 
 | 463 | 	(title "") | 
 | 464 | 	(author "") | 
 | 465 | 	(author-address "") | 
 | 466 | 	(appendix nil) | 
 | 467 | 	(findex nil) | 
 | 468 | 	(obindex nil) | 
 | 469 | 	(cindex nil) | 
 | 470 | 	(moindex nil) | 
 | 471 | 	last-if) | 
 | 472 |     (py2texi-process-verbatims) | 
 | 473 |     (py2texi-process-comments) | 
 | 474 |     (py2texi-process-includes) | 
 | 475 |     (py2texi-process-funnyas) | 
 | 476 |     (py2texi-process-environments) | 
 | 477 |     (py2texi-process-commands) | 
 | 478 |     (py2texi-fix-indentation) | 
 | 479 |     (py2texi-fix-nodes) | 
 | 480 |     (py2texi-fix-references) | 
 | 481 |     (py2texi-fix-indices) | 
 | 482 |     (py2texi-process-simple-commands) | 
 | 483 |     (py2texi-fix-fonts) | 
 | 484 |     (py2texi-fix-braces) | 
 | 485 |     (py2texi-fix-backslashes) | 
 | 486 |     (py2texi-destroy-empties) | 
 | 487 |     (py2texi-fix-newlines) | 
 | 488 |     (py2texi-adjust-level)) | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 489 |   (let* ((texi-file-name (or py2texi-texi-file-name | 
 | 490 | 			     (py2texi-texi-file-name file))) | 
 | 491 | 	 (info-file-name (or py2texi-info-file-name | 
 | 492 | 			     (py2texi-info-file-name texi-file-name)))) | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 493 |     (goto-char (point-min)) | 
 | 494 |     (when (looking-at py2texi-magic) | 
 | 495 |       (delete-region (point) (progn (beginning-of-line 2) (point))) | 
 | 496 |       (insert "\\input texinfo @c -*-texinfo-*-\n") | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 497 |       (insert "@setfilename " info-file-name)) | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 498 |     (when (re-search-forward "@chapter" nil t) | 
 | 499 |       (texinfo-all-menus-update t)) | 
 | 500 |     (goto-char (point-min)) | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 501 |     (write-file texi-file-name) | 
 | 502 |     (message (format "You can apply `makeinfo %s' now." texi-file-name)))) | 
 | 503 |  | 
 | 504 |  | 
 | 505 | (defun py2texi-texi-file-name (filename) | 
 | 506 |   "Generate name of Texinfo file from original file name FILENAME." | 
 | 507 |   (concat filename | 
 | 508 | 	  (if (string-match "\\.tex$" filename) "i" ".texi"))) | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 509 |  | 
 | 510 |  | 
 | 511 | (defun py2texi-info-file-name (filename) | 
 | 512 |   "Generate name of info file from original file name FILENAME." | 
 | 513 |   (setq filename (expand-file-name filename)) | 
 | 514 |   (let ((directory (file-name-directory filename)) | 
 | 515 | 	(basename (file-name-nondirectory filename))) | 
 | 516 |     (concat directory "python-" | 
 | 517 | 	    (substring basename 0 (- (length basename) 4)) "info"))) | 
 | 518 |  | 
 | 519 |  | 
 | 520 | (defun py2texi-process-verbatims () | 
 | 521 |   "Process and protect verbatim environments." | 
 | 522 |   (let (delimiter | 
 | 523 | 	beg | 
 | 524 | 	end) | 
 | 525 |     (py2texi-search-safe "\\\\begin{\\(verbatim\\|displaymath\\)}" | 
 | 526 |       (replace-match "@example") | 
 | 527 |       (setq beg (copy-marker (point) nil)) | 
 | 528 |       (re-search-forward "\\\\end{\\(verbatim\\|displaymath\\)}") | 
 | 529 |       (setq end (copy-marker (match-beginning 0) nil)) | 
 | 530 |       (replace-match "@end example") | 
 | 531 |       (py2texi-texinfo-escape beg end) | 
 | 532 |       (put-text-property (- beg (length "@example")) | 
 | 533 | 			 (+ end (length "@end example")) | 
 | 534 | 			 'py2texi-protected t)) | 
 | 535 |     (py2texi-search-safe "\\\\verb\\([^a-z]\\)" | 
 | 536 |       (setq delimiter (match-string 1)) | 
 | 537 |       (replace-match "@code{") | 
 | 538 |       (setq beg (copy-marker (point) nil)) | 
 | 539 |       (re-search-forward (regexp-quote delimiter)) | 
 | 540 |       (setq end (copy-marker (match-beginning 0) nil)) | 
 | 541 |       (replace-match "}") | 
 | 542 |       (put-text-property (- beg (length "@code{")) (+ end (length "}")) | 
 | 543 | 			 'py2texi-protected t) | 
 | 544 |       (py2texi-texinfo-escape beg end)))) | 
 | 545 |  | 
 | 546 |  | 
 | 547 | (defun py2texi-process-comments () | 
 | 548 |   "Remove comments." | 
 | 549 |   (let (point) | 
 | 550 |     (py2texi-search-safe "%" | 
 | 551 |       (setq point (point)) | 
 | 552 |       (when (save-excursion | 
 | 553 | 	      (re-search-backward "\\(^\\|[^\\]\\(\\\\\\\\\\)*\\)%\\=" nil t)) | 
 | 554 | 	(delete-region (1- point) | 
 | 555 | 		       (save-excursion (beginning-of-line 2) (point))))))) | 
 | 556 |  | 
 | 557 |  | 
 | 558 | (defun py2texi-process-includes () | 
 | 559 |   "Include LaTeX input files. | 
 | 560 | Do not include .ind files." | 
 | 561 |   (let ((path (file-name-directory file)) | 
 | 562 | 	filename | 
 | 563 | 	dirs | 
 | 564 | 	includefile) | 
 | 565 |     (py2texi-search-safe "\\\\input{\\([^}]+\\)}" | 
 | 566 |       (setq filename (match-string 1)) | 
 | 567 |       (unless (save-match-data (string-match "\\.tex$" filename)) | 
 | 568 | 	(setq filename (concat filename ".tex"))) | 
 | 569 |       (setq includefile (save-match-data | 
 | 570 | 			  (string-match "\\.ind\\.tex$" filename))) | 
 | 571 |       (setq dirs py2texi-dirs) | 
 | 572 |       (while (and (not includefile) dirs) | 
| Fred Drake | d4956aa | 2003-09-28 03:10:09 +0000 | [diff] [blame] | 573 | 	(setq includefile | 
 | 574 |               (concat (file-name-as-directory (car dirs)) filename)) | 
 | 575 |         (if (not (file-name-absolute-p includefile)) | 
 | 576 |             (setq includefile | 
 | 577 |                   (concat (file-name-as-directory path) includefile))) | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 578 | 	(unless (file-exists-p includefile) | 
| Fred Drake | d4956aa | 2003-09-28 03:10:09 +0000 | [diff] [blame] | 579 |           (setq includefile nil) | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 580 | 	  (setq dirs (cdr dirs)))) | 
 | 581 |       (if includefile | 
 | 582 | 	  (save-restriction | 
 | 583 | 	    (narrow-to-region (match-beginning 0) (match-end 0)) | 
 | 584 | 	    (delete-region (point-min) (point-max)) | 
 | 585 | 	    (when (stringp includefile) | 
 | 586 | 	      (insert-file-contents includefile) | 
 | 587 | 	      (goto-char (point-min)) | 
 | 588 | 	      (insert "\n") | 
 | 589 | 	      (py2texi-process-verbatims) | 
 | 590 | 	      (py2texi-process-comments) | 
 | 591 | 	      (py2texi-process-includes))) | 
 | 592 | 	(replace-match (format "\\\\emph{Included file %s}" filename)) | 
 | 593 | 	(py2texi-message (format "Input file %s not found" filename)))))) | 
 | 594 |  | 
 | 595 |  | 
 | 596 | (defun py2texi-process-funnyas () | 
 | 597 |   "Convert @s." | 
 | 598 |   (py2texi-search-safe "@" | 
 | 599 |     (replace-match "@@"))) | 
 | 600 |  | 
 | 601 |  | 
 | 602 | (defun py2texi-process-environments () | 
 | 603 |   "Process LaTeX environments." | 
 | 604 |   (let ((stack ()) | 
 | 605 | 	kind | 
 | 606 | 	environment | 
 | 607 | 	parameter | 
 | 608 | 	arguments | 
 | 609 | 	n | 
 | 610 | 	string | 
 | 611 | 	description) | 
 | 612 |     (py2texi-search-safe (concat "\\\\\\(begin\\|end\\|item\\)" | 
 | 613 | 				 "\\({\\([^}]*\\)}\\|[[]\\([^]]*\\)[]]\\|\\)") | 
 | 614 |       (setq kind (match-string 1) | 
 | 615 | 	    environment (match-string 3) | 
 | 616 | 	    parameter (match-string 4)) | 
 | 617 |       (replace-match "") | 
 | 618 |       (cond | 
 | 619 |        ((string= kind "begin") | 
 | 620 | 	(setq description (assoc environment py2texi-environments)) | 
 | 621 | 	(if description | 
 | 622 | 	    (progn | 
 | 623 | 	      (setq n (cadr description)) | 
 | 624 | 	      (setq description (cddr description)) | 
 | 625 | 	      (setq string (py2texi-tex-arguments n)) | 
 | 626 | 	      (string-match (py2texi-regexp n) string) | 
 | 627 | 				      ; incorrect but sufficient | 
 | 628 | 	      (insert (replace-match (eval (car description)) | 
 | 629 | 				     t nil string)) | 
 | 630 | 	      (setq stack (cons (cadr description) stack))) | 
 | 631 | 	  (py2texi-message (format "Unknown environment: %s" environment)) | 
 | 632 | 	  (setq stack (cons "" stack)))) | 
 | 633 |        ((string= kind "end") | 
 | 634 | 	(insert (eval (car stack))) | 
 | 635 | 	(setq stack (cdr stack))) | 
 | 636 |        ((string= kind "item") | 
 | 637 | 	(insert "\n@item " (or parameter "") "\n")))) | 
 | 638 |     (when stack | 
 | 639 |       (py2texi-message (format "Unclosed environment: %s" (car stack)))))) | 
 | 640 |  | 
 | 641 |  | 
 | 642 | (defun py2texi-process-commands () | 
 | 643 |   "Process LaTeX commands." | 
 | 644 |   (let (done | 
 | 645 | 	command | 
 | 646 | 	command-info | 
 | 647 | 	string | 
 | 648 | 	n) | 
 | 649 |     (while (not done) | 
 | 650 |       (setq done t) | 
 | 651 |       (py2texi-search-safe "\\\\\\([a-zA-Z*]+\\)\\(\\[[^]]*\\]\\)?" | 
 | 652 | 	(setq command (match-string 1)) | 
 | 653 | 	(setq command-info (assoc command py2texi-commands)) | 
 | 654 | 	(if command-info | 
 | 655 | 	    (progn | 
 | 656 | 	      (setq done nil) | 
 | 657 | 	      (replace-match "") | 
 | 658 | 	      (setq command-info (cdr command-info)) | 
 | 659 | 	      (setq n (car command-info)) | 
 | 660 | 	      (setq string (py2texi-tex-arguments n)) | 
 | 661 | 	      (string-match (py2texi-regexp n) string) | 
 | 662 | 				      ; incorrect but sufficient | 
 | 663 | 	      (insert (replace-match (eval (cadr command-info)) | 
 | 664 | 				     t nil string))) | 
 | 665 | 	  (py2texi-message (format "Unknown command: %s (not processed)" | 
 | 666 | 				   command))))))) | 
 | 667 |  | 
 | 668 |  | 
 | 669 | (defun py2texi-argument-pattern (count) | 
 | 670 |   (let ((filler "\\(?:[^{}]\\|\\\\{\\|\\\\}\\)*")) | 
 | 671 |     (if (<= count 0) | 
 | 672 | 	filler | 
 | 673 |       (concat filler "\\(?:{" | 
 | 674 | 	      (py2texi-argument-pattern (1- count)) | 
 | 675 | 	      "}" filler "\\)*" filler)))) | 
 | 676 | (defconst py2texi-tex-argument | 
 | 677 |   (concat | 
 | 678 |    "{\\(" | 
 | 679 |    (py2texi-argument-pattern 10)	;really at least 10! | 
 | 680 |    "\\)}[ \t%@c\n]*") | 
 | 681 |   "Regexp describing LaTeX command argument including argument separators.") | 
 | 682 |  | 
 | 683 |  | 
 | 684 | (defun py2texi-regexp (n) | 
 | 685 |   "Make regexp matching N LaTeX command arguments." | 
 | 686 |   (if (= n 0) | 
 | 687 |       "" | 
 | 688 |     (let ((regexp "^[^{]*")) | 
 | 689 |       (while (> n 0) | 
 | 690 | 	(setq regexp (concat regexp py2texi-tex-argument)) | 
 | 691 | 	(setq n (1- n))) | 
 | 692 |       regexp))) | 
 | 693 |  | 
 | 694 |  | 
 | 695 | (defun py2texi-tex-arguments (n) | 
 | 696 |   "Remove N LaTeX command arguments and return them as a string." | 
 | 697 |   (let ((point (point)) | 
 | 698 | 	(i 0) | 
 | 699 | 	result | 
 | 700 | 	match) | 
 | 701 |     (if (= n 0) | 
 | 702 | 	(progn | 
 | 703 | 	  (when (re-search-forward "\\=\\({}\\| *\\)" nil t) | 
 | 704 | 	    (replace-match "")) | 
 | 705 | 	  "") | 
 | 706 |       (while (> n 0) | 
 | 707 | 	(unless (re-search-forward | 
 | 708 | 		 "\\(\\=\\|[^\\\\]\\)\\(\\\\\\\\\\)*\\([{}]\\)" nil t) | 
 | 709 | 	  (debug)) | 
 | 710 | 	(if (string= (match-string 3) "{") | 
 | 711 | 	    (setq i (1+ i)) | 
 | 712 | 	  (setq i (1- i)) | 
 | 713 | 	  (when (<= i 0) | 
 | 714 | 	    (setq n (1- n))))) | 
 | 715 |       (setq result (buffer-substring-no-properties point (point))) | 
 | 716 |       (while (string-match "\n[ \t]*" result) | 
 | 717 | 	(setq result (replace-match " " t nil result))) | 
 | 718 |       (delete-region point (point)) | 
 | 719 |       result))) | 
 | 720 |  | 
 | 721 |  | 
 | 722 | (defun py2texi-process-simple-commands () | 
 | 723 |   "Replace single character LaTeX commands." | 
 | 724 |   (let (char) | 
 | 725 |     (py2texi-search-safe "\\\\\\([^a-z]\\)" | 
 | 726 |       (setq char (match-string 1)) | 
 | 727 |       (replace-match (format "%s%s" | 
 | 728 | 			     (if (or (string= char "{") | 
 | 729 | 				     (string= char "}") | 
 | 730 | 				     (string= char " ")) | 
 | 731 | 				 "@" | 
 | 732 | 			       "") | 
 | 733 | 			     (if (string= char "\\") | 
 | 734 | 				 "\\\\" | 
 | 735 | 			       char)))))) | 
 | 736 |  | 
 | 737 |  | 
 | 738 | (defun py2texi-fix-indentation () | 
 | 739 |   "Remove white space at the beginning of lines." | 
 | 740 |   (py2texi-search-safe "^[ \t]+" | 
 | 741 |     (replace-match ""))) | 
 | 742 |  | 
 | 743 |  | 
 | 744 | (defun py2texi-fix-nodes () | 
 | 745 |   "Remove unwanted characters from nodes and make nodes unique." | 
 | 746 |   (let ((nodes (make-hash-table :test 'equal)) | 
 | 747 | 	id | 
 | 748 | 	counter | 
 | 749 | 	string | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 750 | 	label | 
 | 751 | 	index) | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 752 |     (py2texi-search "^@node +\\(.*\\)$" | 
 | 753 |       (setq string (match-string 1)) | 
 | 754 |       (if py2texi-xemacs | 
 | 755 | 	  (replace-match "@node " t) | 
 | 756 | 	(replace-match "" t nil nil 1)) | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 757 |       (while (string-match "@label{[^}]*}" string) | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 758 | 	(setq label (match-string 0 string)) | 
 | 759 | 	(setq string (replace-match "" t nil string))) | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 760 |       (while (string-match "@..?index{[^}]*}" string) | 
 | 761 | 	(setq index (match-string 0 string)) | 
 | 762 | 	(setq string (replace-match "" t nil string))) | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 763 |       (while (string-match "@[a-zA-Z]+\\|[{}():]\\|``\\|''" string) | 
 | 764 | 	(setq string (replace-match "" t nil string))) | 
 | 765 |       (while (string-match " -- " string) | 
 | 766 | 	(setq string (replace-match " - " t nil string))) | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 767 |       (while (string-match "\\." string) | 
 | 768 | 	(setq string (replace-match "" t nil string))) | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 769 |       (when (string-match " +$" string) | 
 | 770 | 	(setq string (replace-match "" t nil string))) | 
 | 771 |       (when (string-match "^\\(Built-in\\|Standard\\) Module \\|The " string) | 
 | 772 | 	(setq string (replace-match "" t nil string))) | 
 | 773 |       (string-match "^[^,]+" string) | 
 | 774 |       (setq id (match-string 0 string)) | 
 | 775 |       (setq counter (gethash id nodes)) | 
 | 776 |       (if counter | 
 | 777 | 	  (progn | 
 | 778 | 	    (setq counter (1+ counter)) | 
 | 779 | 	    (setq string (replace-match (format "\\& %d" counter) | 
 | 780 | 					t nil string))) | 
 | 781 | 	(setq counter 1)) | 
 | 782 |       (setf (gethash id nodes) counter) | 
 | 783 |       (insert string) | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 784 |       (beginning-of-line 3) | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 785 |       (when label | 
| Fred Drake | 66abcee | 2002-11-13 19:31:04 +0000 | [diff] [blame] | 786 | 	(insert label "\n")) | 
 | 787 |       (when index | 
 | 788 | 	(insert index "\n"))))) | 
| Fred Drake | bfc18bd | 2002-05-03 04:50:51 +0000 | [diff] [blame] | 789 |  | 
 | 790 |  | 
 | 791 | (defun py2texi-fix-references () | 
 | 792 |   "Process labels and make references to point to appropriate nodes." | 
 | 793 |   (let ((labels ()) | 
 | 794 | 	node) | 
 | 795 |     (py2texi-search-safe "@label{\\([^}]*\\)}" | 
 | 796 |       (setq node (save-excursion | 
 | 797 | 		   (save-match-data | 
 | 798 | 		     (and (re-search-backward "@node +\\([^,\n]+\\)" nil t) | 
 | 799 | 			  (match-string 1))))) | 
 | 800 |       (when node | 
 | 801 | 	(setq labels (cons (cons (match-string 1) node) labels))) | 
 | 802 |       (replace-match "")) | 
 | 803 |     (py2texi-search-safe "@ref{\\([^}]*\\)}" | 
 | 804 |       (setq node (assoc (match-string 1) labels)) | 
 | 805 |       (replace-match "") | 
 | 806 |       (when node | 
 | 807 | 	(insert (format "@ref{%s}" (cdr node))))))) | 
 | 808 |  | 
 | 809 |  | 
 | 810 | (defun py2texi-fix-indices () | 
 | 811 |   "Remove unwanted characters from @*index commands and create final indices." | 
 | 812 |   (py2texi-search-safe "@..?index\\>[^\n]*\\(\\)\n" | 
 | 813 |     (replace-match "" t nil nil 1)) | 
 | 814 |   (py2texi-search-safe "@..?index\\>[^\n]*\\(\\)" | 
 | 815 |     (replace-match "\n" t nil nil 1)) | 
 | 816 |   (py2texi-search-safe "@..?index\\({\\)\\([^}]+\\)\\(}+\\)" | 
 | 817 |     (replace-match " " t nil nil 1) | 
 | 818 |     (replace-match "" t nil nil 3) | 
 | 819 |     (let ((string (match-string 2))) | 
 | 820 |       (save-match-data | 
 | 821 | 	(while (string-match "@[a-z]+{" string) | 
 | 822 | 	  (setq string (replace-match "" nil nil string))) | 
 | 823 | 	(while (string-match "{" string) | 
 | 824 | 	  (setq string (replace-match "" nil nil string)))) | 
 | 825 |       (replace-match string t t nil 2))) | 
 | 826 |   (py2texi-search-safe "@..?index\\>.*\\([{}]\\|@[a-z]*\\)" | 
 | 827 |     (replace-match "" t nil nil 1) | 
 | 828 |     (goto-char (match-beginning 0))) | 
 | 829 |   (py2texi-search-safe "[^\n]\\(\\)@..?index\\>" | 
 | 830 |     (replace-match "\n" t nil nil 1)) | 
 | 831 |   (goto-char (point-max)) | 
 | 832 |   (re-search-backward "@indices") | 
 | 833 |   (replace-match "") | 
 | 834 |   (insert (if moindex | 
 | 835 | 	      (concat "@node Module Index\n" | 
 | 836 | 		      "@unnumbered Module Index\n" | 
 | 837 | 		      "@printindex mo\n") | 
 | 838 | 	    "") | 
 | 839 | 	  (if obindex | 
 | 840 | 	      (concat "@node Class-Exception-Object Index\n" | 
 | 841 | 		      "@unnumbered Class, Exception, and Object Index\n" | 
 | 842 | 		      "@printindex ob\n") | 
 | 843 | 	    "") | 
 | 844 | 	  (if findex | 
 | 845 | 	      (concat "@node Function-Method-Variable Index\n" | 
 | 846 | 		      "@unnumbered Function, Method, and Variable Index\n" | 
 | 847 | 		      "@printindex fn\n") | 
 | 848 | 	    "") | 
 | 849 | 	  (if cindex | 
 | 850 | 	      (concat "@node Miscellaneous Index\n" | 
 | 851 | 		      "@unnumbered Miscellaneous Index\n" | 
 | 852 | 		      "@printindex cp\n") | 
 | 853 | 	    ""))) | 
 | 854 |  | 
 | 855 |  | 
 | 856 | (defun py2texi-fix-backslashes () | 
 | 857 |   "Make backslashes from auxiliary commands." | 
 | 858 |   (py2texi-search-safe "@backslash{}" | 
 | 859 |     (replace-match "\\\\"))) | 
 | 860 |  | 
 | 861 |  | 
 | 862 | (defun py2texi-fix-fonts () | 
 | 863 |   "Remove garbage after unstructured font commands." | 
 | 864 |   (let (string) | 
 | 865 |     (py2texi-search-safe "@destroy" | 
 | 866 |       (replace-match "") | 
 | 867 |       (when (eq (preceding-char) ?{) | 
 | 868 | 	(forward-char -1) | 
 | 869 | 	(setq string (py2texi-tex-arguments 1)) | 
 | 870 | 	(insert (substring string 1 (1- (length string)))))))) | 
 | 871 |  | 
 | 872 |  | 
 | 873 | (defun py2texi-fix-braces () | 
 | 874 |   "Escape braces for Texinfo." | 
 | 875 |   (let (string) | 
 | 876 |     (py2texi-search "{" | 
 | 877 |        (unless (or (py2texi-protected) | 
 | 878 | 		   (save-excursion | 
 | 879 | 		     (re-search-backward | 
 | 880 | 		      "@\\([a-zA-Z]*\\|multitable.*\\){\\=" nil t))) | 
 | 881 | 	 (forward-char -1) | 
 | 882 | 	 (setq string (py2texi-tex-arguments 1)) | 
 | 883 | 	 (insert "@" (substring string 0 (1- (length string))) "@}"))))) | 
 | 884 |  | 
 | 885 |  | 
 | 886 | (defun py2texi-fix-newlines () | 
 | 887 |   "Remove extra newlines." | 
 | 888 |   (py2texi-search "\n\n\n+" | 
 | 889 |     (replace-match "\n\n")) | 
 | 890 |   (py2texi-search-safe "@item.*\n\n" | 
 | 891 |     (delete-backward-char 1)) | 
 | 892 |   (py2texi-search "@end example" | 
 | 893 |     (unless (looking-at "\n\n") | 
 | 894 |       (insert "\n")))) | 
 | 895 |  | 
 | 896 |  | 
 | 897 | (defun py2texi-destroy-empties () | 
 | 898 |   "Remove all comments. | 
 | 899 | This avoids some makeinfo errors." | 
 | 900 |   (py2texi-search "@c\\>" | 
 | 901 |     (unless (eq (py2texi-protected) t) | 
 | 902 |       (delete-region (- (point) 2) (save-excursion (end-of-line) (point))) | 
 | 903 |       (cond | 
 | 904 |        ((looking-at "\n\n") | 
 | 905 | 	(delete-char 1)) | 
 | 906 |        ((save-excursion (re-search-backward "^[ \t]*\\=" nil t)) | 
 | 907 | 	(delete-region (save-excursion (beginning-of-line) (point)) | 
 | 908 | 		       (1+ (point)))))))) | 
 | 909 |  | 
 | 910 |  | 
 | 911 | (defun py2texi-adjust-level () | 
 | 912 |   "Increase heading level to @chapter, if needed. | 
 | 913 | This is only needed for distutils, so it has a very simple form only." | 
 | 914 |   (goto-char (point-min)) | 
 | 915 |   (unless (re-search-forward "@chapter\\>" nil t) | 
 | 916 |     (py2texi-search-safe "@section\\>" | 
 | 917 |       (replace-match "@chapter" t)) | 
 | 918 |     (py2texi-search-safe "@\\(sub\\)\\(sub\\)?section\\>" | 
 | 919 |       (replace-match "" nil nil nil 1)))) | 
 | 920 |  | 
 | 921 |  | 
 | 922 | (defun py2texi-texinfo-escape (beg end) | 
 | 923 |   "Escape Texinfo special characters in region." | 
 | 924 |   (save-excursion | 
 | 925 |     (goto-char beg) | 
 | 926 |     (while (re-search-forward "[@{}]" end t) | 
 | 927 |       (replace-match "@\\&")))) | 
 | 928 |  | 
 | 929 |  | 
 | 930 | (defun py2texi-protected () | 
 | 931 |   "Return protection status of the point before current point." | 
 | 932 |   (get-text-property (1- (point)) 'py2texi-protected)) | 
 | 933 |  | 
 | 934 |  | 
 | 935 | ;;; Announce | 
 | 936 |  | 
 | 937 | (provide 'py2texi) | 
 | 938 |  | 
 | 939 |  | 
 | 940 | ;;; py2texi.el ends here |