summaryrefslogtreecommitdiffstats
path: root/man/xmltoman
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xman/xmltoman216
-rw-r--r--man/xmltoman.css27
-rw-r--r--man/xmltoman.dtd36
-rw-r--r--man/xmltoman.xsl126
4 files changed, 405 insertions, 0 deletions
diff --git a/man/xmltoman b/man/xmltoman
new file mode 100755
index 0000000..92422f0
--- /dev/null
+++ b/man/xmltoman
@@ -0,0 +1,216 @@
+#!/usr/bin/perl -w
+
+# xmltoman - simple xml to man converter
+# Copyright (C) 2000-2002 Oliver Kurth <oku@masqmail.cx>
+# 2003 Lennart Poettering <mzkzygbzna@0pointer.de>
+#
+# 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 2 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 <http://www.gnu.org/licenses/>.
+
+use XML::Parser;
+
+my $buffer = "";
+my $break_req = 0;
+
+my @stack;
+my $stack_n = 0;
+
+my $para = 0;
+
+sub out {
+ my $t = shift;
+
+ if ($t ne "") {
+ print $t;
+ $break_req=1;
+ }
+}
+
+sub out_buf {
+ local $_;
+
+ my $space = shift;
+
+ $_ = $buffer;
+ $buffer = "";
+
+ s/\n/\ /gm;
+ s/\s+/\ /gm;
+ s/^\s*//gm if (!$break_req);
+ s/^\s$//gm if (!$space);
+
+ out($_);
+}
+
+sub stack_push {
+ my $a = shift;
+
+ if ($stack_n == 0 or $a ne $stack[$stack_n-1]) {
+ out("\\fB") if $a =~ /^bold$/;
+ out("\\fI") if $a =~ /^italic$/;
+ }
+
+ $stack[$stack_n++] = $a;
+}
+
+sub stack_pop {
+ local $_;
+
+ if ($stack_n > 0) {
+ $stack_n--;
+
+ if ($stack_n > 0) {
+ $a = $stack[$stack_n-1];
+ out("\\fB") if $a =~ /^bold$/;
+ out("\\fI") if $a =~ /^italic$/;
+ } else {
+ out("\\f1");
+ }
+ }
+}
+
+sub handle_start {
+ local $_;
+ my $expat = shift;
+ my $element = shift;
+ my %attr = @_;
+
+ $_ = $element;
+
+ if (/^manpage$/) {
+ out_buf(0);
+ print "\n" if ($break_req);
+ print ".TH " . $attr{name} . " " . $attr{section} . " User Manuals\n";
+ print ".SH NAME\n";
+ print $attr{name} . " \\- " . $attr{desc} . "\n";
+ $break_req = 0;
+ } elsif (/^synopsis$/) {
+ out_buf(0);
+ print "\n" if ($break_req);
+ print ".SH SYNOPSIS\n";
+ $section = $element;
+ $break_req = 0;
+ stack_push("bold");
+ } elsif (/^description$/) {
+ out_buf(0);
+ print "\n" if ($break_req);
+ print ".SH DESCRIPTION\n";
+ $section = $element;
+ $break_req = 0;
+ } elsif (/^options$/) {
+ out_buf(0);
+ print "\n" if ($break_req);
+ print ".SH OPTIONS\n";
+ $section = $element;
+ $break_req = 0;
+ } elsif (/^seealso$/) {
+ out_buf(0);
+ print "\n" if ($break_req);
+ print ".SH SEE ALSO\n";
+ $section = $element;
+ $break_req = 0;
+ } elsif (/^section$/) {
+ out_buf(0);
+ print "\n" if ($break_req);
+ print ".SH ".uc($attr{name})."\n";
+ $section = $attr{name};
+ $break_req = 0;
+ } elsif (/^option$/) {
+ out_buf(0);
+ print "\n" if ($break_req);
+ print ".TP\n";
+ $break_req = 0;
+ } elsif (/^p$/ or /^cmd$/) {
+ out_buf(0);
+ print "\n" if ($para);
+ $break_req = 0;
+ } elsif (/^optdesc$/) {
+ out_buf(0);
+ $break_req = 0;
+ } elsif (/^arg$/ or /^file$/) {
+ out_buf(1);
+ stack_push("italic");
+ } elsif (/^opt$/) {
+ out_buf(1);
+ stack_push("bold");
+ } elsif (/^manref$/) {
+ out_buf(1);
+ stack_push("bold");
+ out($attr{name} ."(" . $attr{section} . ")");
+ stack_pop();
+ } elsif (/^url$/) {
+ out_buf(1);
+ stack_push("bold");
+ out($attr{href});
+ stack_pop();
+ };
+
+ $para = 0;
+}
+
+sub handle_end {
+ local $_;
+ my $expat = shift;
+ my $element = shift;
+
+ $_ = $element;
+
+ $para = 0;
+
+ if (/^description$/ or /^options$/ or /^section$/ or /^seealso$/) {
+ out_buf(0);
+ } elsif (/^p$/ or /^cmd$/) {
+ out_buf(0);
+ print "\n" if ($break_req);
+ $para = 1;
+ $break_req = 0;
+ } elsif (/^synopsis$/) {
+ out_buf(0);
+ stack_pop();
+ } elsif (/^opt$/ or /^arg$/ or /^file$/) {
+ out_buf(1);
+ stack_pop();
+ } elsif (/^manpage$/) {
+ out_buf(0);
+ print "\n" if $break_req;
+ $break_req = 0;
+ } elsif (/^optdesc$/ or /^cmd$/ or /^option$/) {
+ # Simply ignore
+ } else {
+ out_buf(1);
+ }
+};
+
+sub handle_char {
+ local $_;
+ my $expat = shift;
+ my $string = shift;
+
+ $buffer .= $string;
+}
+
+MAIN:{
+ my $file = shift;
+
+ if (!$file) {
+ print STDERR "You need to specify a file to parse\n";
+ exit(1);
+ }
+
+ my $parser = new XML::Parser(Handlers => {
+ Start => \&handle_start,
+ End => \&handle_end,
+ Char => \&handle_char});
+
+ $parser->parsefile($file, ProtocolEncoding => 'ISO-8859-1');
+}
diff --git a/man/xmltoman.css b/man/xmltoman.css
new file mode 100644
index 0000000..2ddb867
--- /dev/null
+++ b/man/xmltoman.css
@@ -0,0 +1,27 @@
+/***
+ This file is part of PulseAudio.
+
+ PulseAudio 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 2 of the License, or (at your
+ option) any later version.
+
+ PulseAudio 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 PulseAudio; if not, see <http://www.gnu.org/licenses/>.
+***/
+
+body { color: black; background-color: white; }
+a:link, a:visited { color: #900000; }
+h1 { text-transform:uppercase; font-size: 18pt; }
+p { margin-left:1cm; margin-right:1cm; }
+.cmd { font-family:monospace; }
+.file { font-family:monospace; }
+.arg { text-transform:uppercase; font-family:monospace; font-style: italic; }
+.opt { font-family:monospace; font-weight: bold; }
+.manref { font-family:monospace; }
+.option .optdesc { margin-left:2cm; }
diff --git a/man/xmltoman.dtd b/man/xmltoman.dtd
new file mode 100644
index 0000000..e0e211c
--- /dev/null
+++ b/man/xmltoman.dtd
@@ -0,0 +1,36 @@
+<!--
+ This file is part of PulseAudio.
+
+ PulseAudio 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 2 of the License, or (at your
+ option) any later version.
+
+ PulseAudio 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 PulseAudio; if not, see <http://www.gnu.org/licenses/>.
+-->
+
+<!ELEMENT manpage (synopsis | description | section | options | seealso)*>
+<!ATTLIST manpage name CDATA #REQUIRED section CDATA #REQUIRED desc CDATA #IMPLIED>
+<!ELEMENT arg (#PCDATA)>
+<!ELEMENT p (#PCDATA | arg | url | manref | opt | file )*>
+<!ELEMENT synopsis (cmd | p)+>
+<!ELEMENT description (p)+>
+<!ELEMENT section (p | option)*>
+<!ATTLIST section name CDATA #REQUIRED>
+<!ELEMENT option (#PCDATA | p | optdesc)*>
+<!ELEMENT optdesc (#PCDATA | p )*>
+<!ELEMENT cmd (#PCDATA | arg | opt)*>
+<!ELEMENT options (p | option)*>
+<!ELEMENT seealso (p)*>
+<!ELEMENT opt (#PCDATA)>
+<!ELEMENT file (#PCDATA)>
+<!ELEMENT manref EMPTY>
+<!ATTLIST manref name CDATA #REQUIRED section CDATA #REQUIRED href CDATA #IMPLIED>
+<!ELEMENT url EMPTY>
+<!ATTLIST url href CDATA #REQUIRED>
diff --git a/man/xmltoman.xsl b/man/xmltoman.xsl
new file mode 100644
index 0000000..1271064
--- /dev/null
+++ b/man/xmltoman.xsl
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="iso-8859-15"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
+
+<!--
+ This file is part of PulseAudio.
+
+ PulseAudio 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 2 of the License, or (at your
+ option) any later version.
+
+ PulseAudio 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 PulseAudio; if not, see <http://www.gnu.org/licenses/>.
+-->
+
+<xsl:output method="xml" version="1.0" encoding="iso-8859-15" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes"/>
+
+<xsl:template match="/manpage">
+
+ <html>
+
+ <head>
+ <title><xsl:value-of select="@name"/>(<xsl:value-of select="@section"/>)</title>
+ <style type="text/css">
+ body { color: black; background-color: white; }
+ a:link, a:visited { color: #900000; }
+ h1 { text-transform:uppercase; font-size: 18pt; }
+ p { margin-left:1cm; margin-right:1cm; }
+ .cmd { font-family:monospace; }
+ .file { font-family:monospace; }
+ .arg { text-transform:uppercase; font-family:monospace; font-style: italic; }
+ .opt { font-family:monospace; font-weight: bold; }
+ .manref { font-family:monospace; }
+ .option .optdesc { margin-left:2cm; }
+ </style>
+ </head>
+ <body>
+ <h1>Name</h1>
+ <p><xsl:value-of select="@name"/>
+ <xsl:if test="string-length(@desc) &gt; 0"> - <xsl:value-of select="@desc"/></xsl:if>
+ </p>
+ <xsl:apply-templates />
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="p">
+ <p>
+ <xsl:apply-templates/>
+ </p>
+</xsl:template>
+
+<xsl:template match="cmd">
+ <p class="cmd">
+ <xsl:apply-templates/>
+ </p>
+</xsl:template>
+
+<xsl:template match="arg">
+ <span class="arg"><xsl:apply-templates/></span>
+</xsl:template>
+
+<xsl:template match="opt">
+ <span class="opt"><xsl:apply-templates/></span>
+</xsl:template>
+
+<xsl:template match="file">
+ <span class="file"><xsl:apply-templates/></span>
+</xsl:template>
+
+<xsl:template match="optdesc">
+ <div class="optdesc">
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="synopsis">
+ <h1>Synopsis</h1>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="seealso">
+ <h1>Synopsis</h1>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="description">
+ <h1>Description</h1>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="options">
+ <h1>Options</h1>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="section">
+ <h1><xsl:value-of select="@name"/></h1>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="option">
+ <div class="option"><xsl:apply-templates/></div>
+</xsl:template>
+
+<xsl:template match="manref">
+ <xsl:choose>
+ <xsl:when test="string-length(@href) &gt; 0">
+ <a class="manref"><xsl:attribute name="href"><xsl:value-of select="@href"/></xsl:attribute><xsl:value-of select="@name"/>(<xsl:value-of select="@section"/>)</a>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="manref"><xsl:value-of select="@name"/>(<xsl:value-of select="@section"/>)</span>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="url">
+ <a class="url"><xsl:attribute name="href"><xsl:value-of select="@href"/></xsl:attribute><xsl:value-of select="@href"/></a>
+</xsl:template>
+
+</xsl:stylesheet>