emacs/code/elpa/auctex-13.2.1/doc/preview-dtxdoc.pl

157 lines
4.4 KiB
Perl

#!/usr/bin/perl
# -*- coding: iso-latin-1; -*-
# Autoconverter from preview.dtx to preview-dtxdoc.texi
# Author: Jan-Åke Larsson <jalar@mai.liu.se>
# Maintainer: auctex-devel@gnu.org
# Copyright (C) 2002, 2005, 2020, 2021 Free Software Foundation, Inc.
# This file is part of AUCTeX.
# AUCTeX 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 3, or (at your option)
# any later version.
# AUCTeX 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 should have received a copy of the GNU General Public License
# along with AUCTeX; see the file COPYING. If not, write to the Free
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
# Commentary:
# Simpleminded autoconverter from preview.dtx to preview-dtxdoc.texi
# run as 'perl preview-dtxdoc.pl ../latex/preview.dtx preview-dtxdoc.texi'
die "Usage: perl preview-dtxdoc.pl infile outfile" unless ($#ARGV == 1);
open(STDIN, $ARGV[0]) || die "Can't open $ARGV[0] for reading";
open(STDOUT, "> $ARGV[1]") || die "Can't open $ARGV[1] for writing";
# Eat header
MUNGE: while (<STDIN>) {
last MUNGE if /^% *.section/;
}
# Fish out possible CR characters.
/(\r*)$/;
$cr = $1;
# Noindent is used sometimes after \end{quote} (see below)
$noindent="";
# Quote environments is translated into @example _without_
# @code{..} inside (see below)
$quote="";
MAIN: while (<STDIN>) {
s/^%//;
s/\\%/%/g;
# Comment
s/\^\^A.*\n//;
# Text-substitution macros
s/\@/\@\@/g;
s/\\#/#/g;
s/AUC~?\\TeX[\\ ]?/\@AUCTeX{}/g;
s/\\LaTeX[\\ ]?/\@LaTeX{}/g;
s/\\TeX[\\ ]?/\@TeX{}/g;
s/\\previewlatex[\\ ]?/\@previewlatex{}/g;
s/EPS/\@acronym{EPS}/g;
s/DVI/\@acronym{DVI}/g;
s/~/\@w{ }/g;
s/^ *//;
# Environments
if (s/\\begin\{quote\}/$cr\n\@example/) {
$quote="yes" }
if (/^\w/) {
print $noindent }
$noindent = "";
if (s/\\end\{quote\}/\@end example$cr\n/) {
$quote="";
$noindent="\@noindent$cr\n" }
s/\\begin\{description\}/$cr\n\@table \@w/;
# Convoluted pattern: handle
# \item[|...|], \item[\meta{..}] and \item[{|[]|}]
s/\\item\[\{?(.+?[\|\}])\}?\] ?/\@item $1$cr\n/;
s/\\end\{description\}/\@end table$cr\n/;
s/\\begin\{enumerate\}/$cr\n\@enumerate/;
s/\\item /\@item /;
s/\\end\{enumerate\}/\@end enumerate$cr\n/;
# Formatting (\cmd is special within {quote})
s/\\texttt/\@option/g;
s/\\marg\{([^}]+)\}/\@{\@var{$1}\@}/g;
s/\\meta/\@var/g;
s/\\emph/\@emph/g;
s/\\cmd(\\[\(\)\w]+)/|$1|/g;
s/\\cmd\{(.*?)\}/|$1|/g;
s/\\oarg\{([^}]+?)\}/\[\@var{$1}\]/g;
s/\\char.//g;
s/\\raggedright$cr\n//g;
s/\\DescribeEnv\{(.*?)\} /\@item \\begin\@{$1\@}\@dots{}\\end\@{$1\@}$cr\n/;
if (s/\\DescribeMacro\{(.*?)\}( |$cr\n)/\@item $1$cr\n/) {
# Index entries for two important macros
if (/(\\Preview(Macro|Environment))( |$cr\n)/) {
$_ .= "\@findex $1$cr\n";
}
}
# ||||||| Hell... I hate bars
# Braces WITHIN bars should be escaped like so: @{ @}
# and |..| translates to @code{..} or @file{..} depending on content
# and to .. if in {quote}
@chunks = split /\|/;
$odd=0;
COMMAND: foreach (@chunks) {
if ($odd==0) {
$odd=1;
} else {
s/\{/\@\{/g;
s/\}/\@\}/g;
if (! $quote) {
if (/[.\/]/) {
$_="\@file\{".$_."\}";
} else {
$_="\@code\{".$_."\}";
}
}
$odd=0;
}
}
$_=join("",@chunks);
# Argh! mixed types occurs in @code{...}@var{..}@file{..}
# Should be @file{...@var{..}..}
s/\@code(\S*?)\}(\S*)\@file\{/\@file$1$2/g;
# Texinfo @node-ification
if (s/\\section\{(.*)\}/\@subsection $1/) {
if (s/[Oo]ptions/options/) {
$_="\@menu$cr\n" .
"* Package options::$cr\n" .
"* Provided commands::$cr\n" .
"\@end menu$cr\n$cr\n" .
"\@node Package options, Provided commands, The LaTeX style file, The LaTeX style file$cr\n" . $_;
} elsif (s/[Cc]ommands/commands/) {
# \Describe... needs @table
$_= "\@node Provided commands, ,Package options, The LaTeX style file$cr\n" .
$_ . "$cr\n\@table \@code$cr\n";
}
}
# Stop here
# \Describe.... needs @end table
if (/^.StopEventually/) {
print "\@end table$cr\n";
last MAIN;
}
print $_;
}