Change this script to Perl 5 style. Add support for multiple refnames.

Sort the output by command name.  This previously only worked by source
file name, which doesn't always match the command name exactly.  And it
certainly won't work for multiple refnames.
This commit is contained in:
Peter Eisentraut 2008-11-19 09:51:55 +00:00
parent 89ad92a216
commit 8b4da40487
1 changed files with 33 additions and 45 deletions

View File

@ -1,11 +1,11 @@
#! /usr/bin/perl #! /usr/bin/perl -w
################################################################# #################################################################
# create_help.pl -- converts SGML docs to internal psql help # create_help.pl -- converts SGML docs to internal psql help
# #
# Copyright (c) 2000-2008, PostgreSQL Global Development Group # Copyright (c) 2000-2008, PostgreSQL Global Development Group
# #
# $PostgreSQL: pgsql/src/bin/psql/create_help.pl,v 1.17 2008/01/20 21:13:55 tgl Exp $ # $PostgreSQL: pgsql/src/bin/psql/create_help.pl,v 1.18 2008/11/19 09:51:55 petere Exp $
################################################################# #################################################################
# #
@ -19,9 +19,12 @@
# sure does matter to the rest of the source. # sure does matter to the rest of the source.
# #
$docdir = $ARGV[0] || die "$0: missing required argument: docdir\n"; use strict;
$outputfile = $ARGV[1] || die "$0: missing required argument: output file\n";
my $docdir = $ARGV[0] or die "$0: missing required argument: docdir\n";
my $outputfile = $ARGV[1] or die "$0: missing required argument: output file\n";
my $outputfilebasename;
if ($outputfile =~ m!.*/([^/]+)$!) { if ($outputfile =~ m!.*/([^/]+)$!) {
$outputfilebasename = $1; $outputfilebasename = $1;
} }
@ -29,14 +32,14 @@ else {
$outputfilebasename = $outputfile; $outputfilebasename = $outputfile;
} }
$define = $outputfilebasename; my $define = $outputfilebasename;
$define =~ tr/a-z/A-Z/; $define =~ tr/a-z/A-Z/;
$define =~ s/\W/_/g; $define =~ s/\W/_/g;
opendir(DIR, $docdir) opendir(DIR, $docdir)
|| die "$0: could not open documentation source dir '$docdir': $!\n"; or die "$0: could not open documentation source dir '$docdir': $!\n";
open(OUT, ">$outputfile") open(OUT, ">$outputfile")
|| die "$0: could not open output file '$outputfile': $!\n"; or die "$0: could not open output file '$outputfile': $!\n";
print OUT print OUT
"/* "/*
@ -64,46 +67,29 @@ struct _helpStruct
static const struct _helpStruct QL_HELP[] = { static const struct _helpStruct QL_HELP[] = {
"; ";
$count = 0; my $maxlen = 0;
$maxlen = 0;
foreach $file (sort readdir DIR) { my %entries;
local ($cmdname, $cmddesc, $cmdsynopsis);
$file =~ /\.sgml$/ || next;
open(FILE, "$docdir/$file") || next; foreach my $file (sort readdir DIR) {
$filecontent = join('', <FILE>); my (@cmdnames, $cmddesc, $cmdsynopsis);
$file =~ /\.sgml$/ or next;
open(FILE, "$docdir/$file") or next;
my $filecontent = join('', <FILE>);
close FILE; close FILE;
# Ignore files that are not for SQL language statements # Ignore files that are not for SQL language statements
$filecontent =~ m!<refmiscinfo>\s*SQL - Language Statements\s*</refmiscinfo>!i $filecontent =~ m!<refmiscinfo>\s*SQL - Language Statements\s*</refmiscinfo>!i
|| next; or next;
# Extract <refname>, <refpurpose>, and <synopsis> fields, taking the # Collect multiple refnames
# first one if there are more than one. NOTE: we cannot just say LOOP: { $filecontent =~ m!\G.*?<refname>\s*([a-z ]+?)\s*</refname>!cgis and push @cmdnames, $1 and redo LOOP; }
# "<synopsis>(.*)</synopsis>", because that will match the first $filecontent =~ m!<refpurpose>\s*(.+?)\s*</refpurpose>!is and $cmddesc = $1;
# occurrence of <synopsis> and the last one of </synopsis>! Under $filecontent =~ m!<synopsis>\s*(.+?)\s*</synopsis>!is and $cmdsynopsis = $1;
# Perl 5 we could use a non-greedy wildcard, .*?, to ensure we match
# the first </synopsis>, but we want this script to run under Perl 4
# too, and Perl 4 hasn't got that feature. So, do it the hard way.
# Also, use [\000-\377] where we want to match anything including
# newline --- Perl 4 does not have Perl 5's /s modifier.
$filecontent =~ m!<refname>\s*([a-z ]*[a-z])\s*</refname>!i && ($cmdname = $1);
if ($filecontent =~ m!<refpurpose>\s*([\000-\377]+)$!i) {
$tmp = $1; # everything after first <refpurpose>
if ($tmp =~ s!\s*</refpurpose>[\000-\377]*$!!i) {
$cmddesc = $tmp;
}
}
if ($filecontent =~ m!<synopsis>\s*([\000-\377]+)$!i) {
$tmp = $1; # everything after first <synopsis>
if ($tmp =~ s!\s*</synopsis>[\000-\377]*$!!i) {
$cmdsynopsis = $tmp;
}
}
if ($cmdname && $cmddesc && $cmdsynopsis) { if (@cmdnames && $cmddesc && $cmdsynopsis) {
$cmdname =~ s/\"/\\"/g; s/\"/\\"/g foreach @cmdnames;
$cmddesc =~ s/<[^>]+>//g; $cmddesc =~ s/<[^>]+>//g;
$cmddesc =~ s/\s+/ /g; $cmddesc =~ s/\s+/ /g;
@ -113,22 +99,24 @@ foreach $file (sort readdir DIR) {
$cmdsynopsis =~ s/\r?\n/\\n/g; $cmdsynopsis =~ s/\r?\n/\\n/g;
$cmdsynopsis =~ s/\"/\\"/g; $cmdsynopsis =~ s/\"/\\"/g;
print OUT " { \"$cmdname\",\n N_(\"$cmddesc\"),\n N_(\"$cmdsynopsis\") },\n\n"; foreach my $cmdname (@cmdnames) {
$entries{$cmdname} = { cmddesc => $cmddesc, cmdsynopsis => $cmdsynopsis };
$count++; $maxlen = ($maxlen >= length $cmdname) ? $maxlen : length $cmdname;
$maxlen = ($maxlen >= length $cmdname) ? $maxlen : length $cmdname; }
} }
else { else {
print STDERR "$0: parsing file '$file' failed (N='$cmdname' D='$cmddesc')\n"; die "$0: parsing file '$file' failed (N='@cmdnames' D='$cmddesc')\n";
} }
} }
print OUT " { \"$_\",\n N_(\"".$entries{$_}{cmddesc}."\"),\n N_(\"".$entries{$_}{cmdsynopsis}."\") },\n\n" foreach (sort keys %entries);
print OUT " print OUT "
{ NULL, NULL, NULL } /* End of list marker */ { NULL, NULL, NULL } /* End of list marker */
}; };
#define QL_HELP_COUNT $count /* number of help items */ #define QL_HELP_COUNT ".scalar(keys %entries)." /* number of help items */
#define QL_MAX_CMD_LEN $maxlen /* largest strlen(cmd) */ #define QL_MAX_CMD_LEN $maxlen /* largest strlen(cmd) */