#!/usr/bin/env perl
# $Id: txicmdcheck,v 1.1 2008/09/07 22:47:47 karl Exp $
# Copyright 2008 Free Software Foundation, Inc.
#
# 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 3 of the License,
# 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 should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
# Original author: Karl Berry.
#
# Kludge of a script to check command lists in refcard vs. refman
# for consistency. Would be nice to check makeinfo, too.
exit (&main ());
sub main
{
my @cardcmds = &read_refcard ("txirefcard.tex");
my @mancmds = &read_refman ("../texinfo.txi");
my (%mancmds, %cardcmds);
@mancmds{@mancmds} = ();
@cardcmds{@cardcmds} = ();
my @found = ();
for my $cc (@cardcmds) {
if (exists $mancmds{$cc}) {
push (@found, $cc);
delete $mancmds{$cc};
delete $cardcmds{$cc};
}
}
printf " common %d: @{[sort @found]}\n", @found + 0;
my @card_only = keys %cardcmds;
printf "refcard only %s: @{[sort @card_only]}\n", @card_only + 0;
my @man_only = keys %mancmds;
printf "refman only %s: @{[sort @man_only]}\n", @man_only + 0;
return @card_only + @man_only;
}
# Return command names given in the reference card.
#
sub read_refcard
{
my ($fname) = @_;
my @ret = ();
local *FILE;
$FILE = $fname;
open (FILE) || die "open($FILE) failed: $!";
while () {
next unless /^\\txicmd/;
chomp;
my $xcmd = 0;
s/\\txicmdarg{.*?}}?//; # first get rid of the arguments
s/}{.*//; # then the descriptions
s/^\\txicmdx{// && ($xcmd = 1); # used for the @def...x
s/^\\txicmd{//; # finally the markup cmd itself
my (@cmds) = split (/, */, $_); # a couple of times we combine cmds
# we typeset these specially in TeX.
if ("@cmds" eq "@#1footing") {
@cmds = ('@oddfooting', '@evenfooting', '@everyfooting');
} elsif ("@cmds" eq "@#1heading") {
@cmds = ('@oddheading', '@evenheading', '@everyheading');
}
# add each command from this line to the return.
for my $c (@cmds) {
#warn "refcard $c\n";
#warn "refcard $c{x}\n" if $xcmd;
if ($c eq '@\tildechar') { # TeX specialties, forcibly make them match
$c = '@~';
} elsif ($c eq '@\var{whitespace}') {
$c = '@var{whitespace}';
}
$c = '@~' if $c eq '@\tildechar'; # TeX
$c = '@\\' if $c eq '@\bschar'; # TeX
$c = '@{' if $c eq '@\lbracechar'; # TeX
$c = '@}' if $c eq '@\rbracechar'; # TeX
push (@ret, $c);
push (@ret, "${c}x") if $xcmd;
}
}
push (@ret, '@,'); # our non-parsing above lost the comma
push (@ret, '@end', '@uref', '@appendixsection'); # described in text
close (FILE) || warn "close($FILE) failed: $!";
return @ret;
}
# Return command names from the @-Command List summary node in the
# reference manual.
#
sub read_refman
{
my ($fname) = @_;
my @ret = ();
local *FILE;
$FILE = $fname;
open (FILE) || die "open($FILE) failed: $!";
while () {
last if /^\@appendix \@\@-Command List/; # ignore until right appendix
}
while () {
last if /^\@end table/; # ignore again after the summary
next unless s/^\@itemx? *\@//; # only want item[x]s in the table
chomp;
s/\@\{.*//; # remove braced arguments
s/ .*//; # remove arguments following a space
s/\@\@/@/g; # @@ -> @
next if $_ =~ /^\@(br|ctrl)$/; # @ignore-d in text
push (@ret, $_);
}
push (@ret, '@{'); # our non-parsing above fails on this one
close (FILE) || warn "close($FILE) failed: $!";
return @ret;
}