summaryrefslogtreecommitdiffstats
path: root/hacks/xml2man.pl
diff options
context:
space:
mode:
authorSimon Rettberg2018-10-16 10:08:48 +0200
committerSimon Rettberg2018-10-16 10:08:48 +0200
commitd3a98cf6cbc3bd0b9efc570f58e8812c03931c18 (patch)
treecbddf8e50f35a9c6e878a5bfe3c6d625d99e12ba /hacks/xml2man.pl
downloadxscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.tar.gz
xscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.tar.xz
xscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.zip
Original 5.40
Diffstat (limited to 'hacks/xml2man.pl')
-rwxr-xr-xhacks/xml2man.pl266
1 files changed, 266 insertions, 0 deletions
diff --git a/hacks/xml2man.pl b/hacks/xml2man.pl
new file mode 100755
index 0000000..d7d4e32
--- /dev/null
+++ b/hacks/xml2man.pl
@@ -0,0 +1,266 @@
+#!/usr/bin/perl -w
+# Copyright © 2002-2014 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# Created: 30-May-2002.
+#
+# This creates man pages from the XML program descriptions in
+# xscreensaver/hacks/config/.
+#
+# They aren't necessarily the most accurate or well-written man pages,
+# but at least they exist.
+
+require 5;
+use diagnostics;
+use strict;
+
+use Text::Wrap;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.7 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+
+my $default_args = ("[\\-display \\fIhost:display.screen\\fP]\n" .
+ "[\\-visual \\fIvisual\\fP]\n" .
+ "[\\-window]\n" .
+ "[\\-root]\n");
+my $default_options = (".TP 8\n" .
+ ".B \\-visual \\fIvisual\\fP\n" .
+ "Specify which visual to use. Legal values " .
+ "are the name of a visual class,\n" .
+ "or the id number (decimal or hex) of a " .
+ "specific visual.\n" .
+ ".TP 8\n" .
+ ".B \\-window\n" .
+ "Draw on a newly-created window. " .
+ "This is the default.\n" .
+ ".TP 8\n" .
+ ".B \\-root\n" .
+ "Draw on the root window.\n");
+
+my $man_suffix = (".SH ENVIRONMENT\n" .
+ ".PP\n" .
+ ".TP 8\n" .
+ ".B DISPLAY\n" .
+ "to get the default host and display number.\n" .
+ ".TP 8\n" .
+ ".B XENVIRONMENT\n" .
+ "to get the name of a resource file that overrides " .
+ "the global resources\n" .
+ "stored in the RESOURCE_MANAGER property.\n" .
+ ".SH SEE ALSO\n" .
+ ".BR X (1),\n" .
+ ".BR xscreensaver (1)\n" .
+ ".SH COPYRIGHT\n" .
+ "Copyright \\(co %YEAR% by %AUTHOR%. " .
+ "Permission to use, copy, modify, \n" .
+ "distribute, and sell this software and its " .
+ "documentation for any purpose is \n" .
+ "hereby granted without fee, provided that " .
+ "the above copyright notice appear \n" .
+ "in all copies and that both that copyright " .
+ "notice and this permission notice\n" .
+ "appear in supporting documentation. No " .
+ "representations are made about the \n" .
+ "suitability of this software for any purpose. " .
+ "It is provided \"as is\" without\n" .
+ "express or implied warranty.\n" .
+ ".SH AUTHOR\n" .
+ "%AUTHOR%.\n");
+
+sub xml2man($) {
+ my ($exe) = @_;
+ $exe =~ s/\.xml$//s;
+ my $cfgdir = (-d "config" ? "config" : "../config");
+ my $xml = "$cfgdir/$exe.xml";
+ my $man = "$exe.man";
+
+ error ("$exe does not exist") if (! -f $exe);
+ error ("$xml does not exist") if (! -f $xml);
+ error ("$man already exists") if (-f $man);
+
+ local *IN;
+ open (IN, "<$xml") || error ("$xml: $!");
+ my $xmltxt = "";
+ while (<IN>) { $xmltxt .= $_; }
+ close IN;
+
+ my $args = "";
+ my $body = "";
+ my $desc;
+
+ $xmltxt =~ s/\s+/ /gs;
+ $xmltxt =~ s/<!--.*?-->//g;
+ $xmltxt =~ s@(<[^/])@\n$1@gs;
+
+ foreach (split ('\n', $xmltxt)) {
+ next if m/^$/;
+ next if m/^<\?xml\b/;
+ next if m/^<screensaver\b/;
+ next if m/^<command\b/;
+ next if m/^<[hv]group\b/;
+ next if m/^<select\b/;
+
+ my ($x,$arg) = m@\barg(|-unset|-set)=\"([^\"]+)\"@;
+ my ($label) = m@\b_?label=\"([^\"]+)\"@;
+ my ($low) = m@\blow=\"([^\"]+)\"@;
+ my ($hi) = m@\bhigh=\"([^\"]+)\"@;
+ my ($def) = m@\bdefault=\"([^\"]+)\"@;
+
+ $arg =~ s@\s*\%\s*@ \\fInumber\\fP@g if ($arg);
+
+ my $carg = $arg;
+ my $boolp = m/^<boolean/;
+ my $novalsp = 0;
+
+ if ($arg && $arg =~ m/^-no(-.*)/) {
+ $arg = "$1 | \\$arg";
+ } elsif ($boolp && $arg) {
+ $arg = "$arg | \\-no$arg";
+ }
+
+ if ($carg && $carg =~ m/colors/) {
+ $hi = $low = undef;
+ }
+
+ if (!$carg) {
+ } elsif ($carg eq '-move' || $carg eq '-no-move' ||
+ $carg eq '-wander' || $carg eq '-no-wander') {
+ $label = "Whether the object should wander around the screen.";
+ } elsif ($boolp && ($carg eq '-spin' || $carg eq '-no-spin')) {
+ $label = "Whether the object should spin.";
+ } elsif ($carg eq '-spin X') {
+ $carg = '-spin \fI[XYZ]\fP';
+ $arg = $carg;
+ $label = "Around which axes should the object spin?";
+ } elsif ($carg eq '-fps' || $carg eq '-no-fps') {
+ $label = "Whether to show a frames-per-second display " .
+ "at the bottom of the screen.";
+ } elsif ($carg eq '-wireframe' || $carg eq '-wire') {
+ $label = "Render in wireframe instead of solid.";
+ } elsif ($carg =~ m/^-delay/ && $hi && $hi >= 10000) {
+ $label = "Per-frame delay, in microseconds.";
+ $def = sprintf ("%d (%0.2f seconds)", $def, ($def/1000000.0));
+ $low = $hi = undef;
+ } elsif ($carg eq '-speed \fInumber\fP') {
+ $label = "Animation speed. 2.0 means twice as fast, " .
+ "0.5 means half as fast.";
+ $novalsp = 1;
+ } elsif ($boolp) {
+ $label .= ". Boolean.";
+ } elsif ($label) {
+ $label .= ".";
+ }
+
+ if (m/^<(number|boolean|option)/) {
+
+ next if (!$arg && m/<option/);
+ if (!$label) {
+ print STDERR "$progname: ERROR: no label: $_\n";
+ $label = "???";
+ }
+
+ $args .= "[\\$carg]\n";
+
+ if (! $novalsp) {
+ $label .= " $low - $hi." if (defined($low) && defined($hi));
+ $label .= " Default: $def." if (defined ($def));
+ }
+ $label = wrap ("", "", $label);
+
+ $body .= ".TP 8\n.B \\$arg\n$label";
+ $body .= "\n";
+
+ } elsif (m@^<_description>\s*(.*)\s*</_description>@) {
+ $desc = $1;
+ } elsif (m@^<xscreensaver-updater@) {
+ } elsif (m@^<video\b@) {
+ } else {
+ print STDERR "$progname: ERROR: UNKNOWN: $_\n";
+ }
+ }
+
+ $desc = "Something pretty." unless $desc;
+
+ my $author = undef;
+ if ($desc =~ m@^(.*?)\s*(Written by|By) ([^.]+\.?\s*)$@s) {
+ $desc = $1;
+ $author = $3;
+ $author =~ s/\s*[.]\s*$//;
+ }
+
+ if (!$author) {
+ print STDERR "$progname: $exe: WARNING: unknown author\n";
+ $author = "UNKNOWN";
+ }
+
+ $desc =~ s@http://en\.wikipedia\.org/[^\s]+@@gs;
+
+ $desc = wrap ("", "", $desc);
+
+ $body = (".TH XScreenSaver 1 \"\" \"X Version 11\"\n" .
+ ".SH NAME\n" .
+ "$exe - screen saver.\n" .
+ ".SH SYNOPSIS\n" .
+ ".B $exe\n" .
+ $default_args .
+ $args .
+ ".SH DESCRIPTION\n" .
+ $desc . "\n" .
+ ".SH OPTIONS\n" .
+ $default_options .
+ $body .
+ $man_suffix);
+
+ my $year = $1 if ($author =~ s/; (\d{4})$//s);
+ $year = (localtime)[5] + 1900 unless $year;
+
+ $body =~ s/%AUTHOR%/$author/g;
+ $body =~ s/%YEAR%/$year/g;
+
+#print $body; exit 0;
+
+ local *OUT;
+ open (OUT, ">$man") || error ("$man: $!");
+ print OUT $body || error ("$man: $!");
+ close OUT || error ("$man: $!");
+ print STDERR "$progname: wrote $man\n";
+}
+
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR "$progname: $err\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "usage: $progname [--verbose] programs...\n";
+ exit 1;
+}
+
+sub main() {
+ my @progs = ();
+ while ($_ = $ARGV[0]) {
+ shift @ARGV;
+ if ($_ eq "--verbose") { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif (m/^-./) { usage; }
+ else { push @progs, $_; }
+ }
+
+ usage() if ($#progs < 0);
+
+ foreach (@progs) { xml2man($_); }
+}
+
+main();
+exit 0;