diff options
Diffstat (limited to 'gnu/usr.bin/texinfo/emacs/detexinfo.el')
-rw-r--r-- | gnu/usr.bin/texinfo/emacs/detexinfo.el | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/gnu/usr.bin/texinfo/emacs/detexinfo.el b/gnu/usr.bin/texinfo/emacs/detexinfo.el new file mode 100644 index 00000000000..fda99091c49 --- /dev/null +++ b/gnu/usr.bin/texinfo/emacs/detexinfo.el @@ -0,0 +1,250 @@ +;;; Here is a handy keybinding: + +(global-set-key "\C-x\\" 'detexinfo) + +;;;;;;;;;;;;;;;; detexinfo.el ;;;;;;;;;;;;;;;; +;;; +;;; Remove Texinfo commands from a Texinfo source file. +;;; +;;; Copyright (C) 1991, 1992 Free Software Foundation +;;; Robert J. Chassell +;;; bugs to bug-texinfo@prep.ai.mit.edu +;;; +;;; ==> test version <== +;;; Fails if Texinfo source file contains formatting errors. +;;; +;;; Version 0.05 - 3 Jun 1992 +;;; Add to list of removed commands. Improve messages. +;;; +;;; Version 0.04 - 27 Jan 1992 +;;; Rewrite to insert detexinfo'd text into a temporary buffer. +;;; +;;; Version 0.03 - 27 Dec 1991 +;;; Improved messages. +;;; +;;; Version 0.02 - 13 Nov 1991 +;;; detexinfo-remove-inline-cmd, detexinfo-syntax-table: Handle +;;; nested commands. +;;; detexinfo: Handle nested @'s, eg @samp{@}} and @samp{@@}; +;;; replace @TeX{} with TeX. +;;; +;;; Version 0.01 - 13 Nov 1991 +;;; +;;; Based on detex.el, by Bengt Martensson, 4 Oct 1987 +;;; +;;;;;;;;;;;;;;;; + +(defvar detexinfo-buffer-name "*detexinfo*" + "*Name of the temporary buffer used by \\[detexinfo].") + +(defvar detexinfo-syntax-table nil) + +(if detexinfo-syntax-table + nil + (setq detexinfo-syntax-table (make-syntax-table)) + (modify-syntax-entry ?\[ "." detexinfo-syntax-table) + (modify-syntax-entry ?\] "." detexinfo-syntax-table) + (modify-syntax-entry ?\" "." detexinfo-syntax-table) + (modify-syntax-entry ?\\ "." detexinfo-syntax-table) + (modify-syntax-entry ?\( "." detexinfo-syntax-table) + (modify-syntax-entry ?\) "." detexinfo-syntax-table) + (modify-syntax-entry ?{ "(}" detexinfo-syntax-table) + (modify-syntax-entry ?} "){" detexinfo-syntax-table)) + +(defun detexinfo () + "Remove Texinfo commands from current buffer, copying result to new buffer. +BUG: Fails if Texinfo source file contains formatting errors." + (interactive) + (let ((input-buffer (current-buffer))) + ;; Find a buffer to use. + (switch-to-buffer (get-buffer-create detexinfo-buffer-name)) + (setq major-mode 'detexinfo-mode) + (set-syntax-table detexinfo-syntax-table) + (erase-buffer) + (insert-buffer-substring input-buffer) + + ;; Replace @{ and @} with %#* and *#% temporarily, so @samp{@{} works. + ;; What is a better way of doing this?? + (goto-char (point-min)) + (while (search-forward "@{" nil t) ; e.g., @samp{@{} + (replace-match "%#*")) + (goto-char (point-min)) + (while (search-forward "@}" nil t) + (forward-char -3) ; e.g., @samp{@@} + (if (looking-at "@") ; Two @@ in a row + (progn + (delete-char 2) + (insert "%&%#")) + (forward-char 1) + (delete-char 2) + (insert "*#%"))) + + (goto-char (point-min)) + ;; Remove @refill, the only inline command without braces. + (while (search-forward "@refill" nil t) + (replace-match "")) + ;; Replace @TeX{} with TeX + (goto-char (point-min)) + (while (search-forward "@TeX{}" nil t) (replace-match "TeX" t t)) + + (detexinfo-remove-line-cmds-without-arg) + (detexinfo-remove-inline-cmds-without-arg) + (detexinfo-remove-inline-cmds-keep-arg) + (detexinfo-remove-line-cmds-deletable-arg) + (detexinfo-remove-line-cmds-maybe-delete-arg) + (detexinfo-remove-line-cmds-keep-arg) + + ;; Now replace %#*, *#%, and %&%# with {, }, and @@. + (goto-char (point-min)) + (while (search-forward "%#*" nil t) + (replace-match "{")) + (goto-char (point-min)) + (while (search-forward "*#%" nil t) + (replace-match "}")) + (goto-char (point-min)) + (while (search-forward "%&%#" nil t) + (replace-match "@@")) + + ;; Scan for remaining two character @-commands + (goto-char (point-min)) + (while (search-forward "@" nil t) + (cond ((looking-at "[*:]") + (delete-region (1- (point)) (1+ (point)))) + ((looking-at "[{}^@.'`]\"?!") + (delete-region (1- (point)) (point))))) + + (goto-char (point-min)) + (message "Done...removed Texinfo commands from buffer. You may save it."))) + +(defun detexinfo-remove-whole-line (cmd) + "Delete Texinfo line command CMD at beginning of line and rest of line." + (goto-char (point-min)) + (while + (re-search-forward + (concat "^@" cmd "[ \n]+") (point-max) t) + (goto-char (match-beginning 0)) + (delete-region + (point) (save-excursion (end-of-line) (1+ (point)))))) + +(defun detexinfo-remove-inline-cmd (cmd) + "Delete Texinfo inline command CMD, eg. @point, @code." + (goto-char (point-min)) + (while + (re-search-forward (concat "@" cmd "{") (point-max) t) + (save-excursion + (forward-char -1) + (forward-sexp 1) + (delete-char -1)) ; delete right brace + (delete-region (point) (match-beginning 0)))) + +;;;;;;;;;;;;;;;; + +;;; 1. @setfilename and other line commands with args to delete + +(defvar detexinfo-line-cmds-deletable-arg + '("enumerate" "ftable" "vtable" "itemize" "table" + "setfilename" "settitle" "setchapternewpage" + "footnotestyle" "paragraphindent" + "include" "need" "sp" + "clear" "ifclear" "ifset" "set" + "defcodeindex" "defindex" "syncodeindex" "synindex") + "List of Texinfo commands whose arguments should be deleted.") + +(defun detexinfo-remove-line-cmds-deletable-arg () + "Delete Texinfo line commands together with their args, eg @setfilename." + (message "Removing commands such as @enumerate...with their arguments...") + (mapcar 'detexinfo-remove-whole-line + detexinfo-line-cmds-deletable-arg)) + +;;; 2. @cindex and other cmds with args that may be deleted +;;; This list is here just to make it easier to revise the +;;; categories. In particular, you might want to keep the index entries. + +(defvar detexinfo-line-cmds-maybe-delete-arg + '("cindex" "findex" "kindex" "pindex" "tindex" "vindex" "node" + "c" "comment" "end" "headings" "printindex" "vskip" + "evenfooting" "evenheading" "everyfooting" "everyheading" + "oddfooting" "oddheading") + "List of Texinfo commands whose arguments may possibly be deleted.") + +(defun detexinfo-remove-line-cmds-maybe-delete-arg () + "Delete Texinfo line commands together with their arguments, eg, @cindex." + (message "Removing commands such as @cindex...with their arguments...") + (mapcar 'detexinfo-remove-whole-line + detexinfo-line-cmds-maybe-delete-arg)) + +;;; 3. @chapter and other line cmds with args to keep. + +(defvar detexinfo-line-cmds-keep-arg + '("top" "chapter" "section" "subsection" "subsubsection" + "unnumbered" "unnumberedsec" "unnumberedsubsec" "unnumberedsubsubsec" + "majorheading" "chapheading" "heading" "subheading" "subsubheading" + "appendix" "appendixsec" "appendixsubsec" "appendixsubsubsec" + "item" "itemx" + "title" "subtitle" "center" "author" "exdent" + "defcv" "deffn" "defivar" "defmac" "defmethod" "defop" "defopt" + "defspec" "deftp" "deftypefn" "deftypefun" "deftypvr" + "deftypevar" "defun" "defvar" "defvr") + "List of Texinfo line commands whose arguments should be kept.") + +(defun detexinfo-remove-line-cmds-keep-arg () + "Delete Texinfo line commands but keep their arguments, eg @chapter." + (message "Removing commands such as @chapter...but not their arguments...") + (mapcar 'detexinfo-remove-line-cmd-keep-arg + detexinfo-line-cmds-keep-arg)) + +(defun detexinfo-remove-line-cmd-keep-arg (cmd) + "Delete Texinfo line command CMD but keep its argument, eg @chapter." + (goto-char (point-min)) + (while + (re-search-forward + (concat "^@" cmd "[ \n]+") (point-max) t) + (delete-region (match-beginning 0) (match-end 0)))) + +;;; 4. @bye and other line commands without args. + +(defvar detexinfo-line-cmds-without-arg + '("bye" "contents" "display" "example" "finalout" + "flushleft" "flushright" "format" "group" "ifhtml" "ifinfo" "iftex" + "ignore" "lisp" "menu" "noindent" "page" "quotation" + "shortcontents" "smallbook" "smallexample" "smalllisp" + "summarycontents" "tex" "thischapter" "thischaptername" + "thisfile" "thispage" "thissection" "thistitle" "titlepage") + "List of Texinfo commands without arguments that should be deleted.") + +(defun detexinfo-remove-line-cmds-without-arg () + "Delete line Texinfo commands that lack args, eg. @example." + (message "Removing commands such as @example...that lack arguments...") + (mapcar 'detexinfo-remove-whole-line + detexinfo-line-cmds-without-arg)) + +;;; 5. @equiv and other inline cmds without args. + +(defvar detexinfo-inline-cmds-without-arg + '("equiv" "error" "expansion" "point" "print" "result" + "asis" "br" "bullet" "dots" "minus" "today") + "List of Texinfo inline commands without arguments that should be deleted.") + +(defun detexinfo-remove-inline-cmds-without-arg () + "Delete Texinfo inline commands in that lack arguments." + (message "Removing within line commands such as @result...") + (mapcar 'detexinfo-remove-inline-cmd + detexinfo-inline-cmds-without-arg)) + +;;; 6. @code and other inline cmds with args to keep + +(defvar detexinfo-inline-cmds-keep-arg + '("b" "cartouche" "cite" "code" "copyright" "ctrl" "dfn" "dmn" + "emph" "file" "footnote" "i" "inforef" + "kbd" "key" "pxref" "r" "ref" "samp" "sc" "titlefont" + "strong" "t" "var" "w" "xref") + "List of Texinfo inline commands with arguments that should be kept.") + +(defun detexinfo-remove-inline-cmds-keep-arg () + "Delete Texinfo inline commands but keep its arg, eg. @code." + (message + "Removing within line commands such as @code...but not their arguments...") + (mapcar 'detexinfo-remove-inline-cmd + detexinfo-inline-cmds-keep-arg)) + +;;;;;;;;;;;;;;;; end detexinfo.el ;;;;;;;;;;;;;;;; |