Use XSL to generate man page from the rules XML
authorPeter Hutterer <peter.hutterer@who-t.net>
Wed, 8 Jun 2011 02:50:49 +0000 (12:50 +1000)
committerSergey V. Udaltsov <svu@gnome.org>
Wed, 8 Jun 2011 20:16:44 +0000 (21:16 +0100)
Take evdev.xml and convert it into a man page, install it as
xkeyoard-config.7 man page to list all option that xkeyboard-config
provides.

man.xsl is badly indented because I couldn't figure out how to make xsl
ignore whitespaces properly.

Adds a requirement on the xorg util-macros.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
configure.in
rules/Makefile.am
xslt/man.xsl [new file with mode: 0644]

index 527e807..a037abb 100644 (file)
@@ -3,6 +3,13 @@ AC_CONFIG_SRCDIR(rules/base.xml.in)
 AM_INIT_AUTOMAKE([foreign dist-bzip2])
 AM_MAINTAINER_MODE
 
+# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS
+m4_ifndef([XORG_MACROS_VERSION],
+          [m4_fatal([must install xorg-macros 1.8 or later before
+          running autoconf/autogen])])
+XORG_MACROS_VERSION(1.8)
+XORG_MANPAGE_SECTIONS
+
 AC_SUBST(VERSION)
 
 AC_PATH_PROG([XKBCOMP], [xkbcomp], [not_found])
@@ -24,6 +31,13 @@ AC_ARG_ENABLE( compat_rules,
                enable_compat_rules="$enableval",
                enable_compat_rules="yes" )
 
+AC_PATH_PROG(SED, [sed])
+AC_PATH_PROG(XSLTPROC, [xsltproc])
+AM_CONDITIONAL([HAVE_XSLTPROC], [test "x$XSLTPROC" != "x"])
+if test "x$XSLTPROC" = "x"; then
+    AC_MSG_WARN([xsltproc not found, needed to generate man page.])
+fi
+
 # xkeyboard-config does not have build-time dependencies. However, it does
 # have run-time dependencies and keyboard layouts may not work without the
 # right libX11 or xproto installed.
index f2d73ce..39351c9 100644 (file)
@@ -234,3 +234,11 @@ rulesdir = $(xkb_base)/rules
 xmldir = $(rulesdir)
 
 @INTLTOOL_XML_NOMERGE_RULE@
+
+xkeyboard-config.man: evdev.xml
+       $(XSLTPROC) $(top_srcdir)/xslt/man.xsl evdev.xml > $@
+
+xkeyboard-config.7: xkeyboard-config.man
+       $(SED) $(MAN_SUBSTS) < $< > $@
+
+dist_man_MANS = xkeyboard-config.7
diff --git a/xslt/man.xsl b/xslt/man.xsl
new file mode 100644 (file)
index 0000000..f0475e0
--- /dev/null
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" 
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  >
+<xsl:output method="text" encoding="UTF-8" doctype-system="xkb.dtd"/>
+<xsl:template match="/xkbConfigRegistry"><![CDATA[.\" WARNING: this man page is autogenerated. Do not edit or you will lose all your changes.
+.TH XKEYBOARD-CONFIG __miscmansuffix__ __vendorversion__
+.SH NAME
+xkeyboard-config \- XKB data description files
+.SH DESCRIPTION
+xkeyboard-config provides the description files for the X Keyboard
+Extension (XKB). The configuration options below are usually applied with
+setxkbmap.
+.SH MODELS
+.TS
+l l
+___
+lB l.
+model  description ]]>
+<xsl:apply-templates select="modelList"/>
+<![CDATA[
+.TE
+.SH LAYOUTS
+.TS
+l l l
+____
+lB lB l.
+layout variant description ]]>
+<xsl:apply-templates select="layoutList"/>
+<![CDATA[
+.TE
+.SH OPTIONS
+]]>
+<xsl:apply-templates select="optionList"/>
+<![CDATA[
+.SH SEE ALSO
+setxkbmap(__appmansuffix__)
+]]>
+</xsl:template>
+
+<!-- split model/description into a normal table -->
+<xsl:template match="modelList">
+    <xsl:for-each select="model">
+        <xsl:value-of select="configItem/name"/><xsl:text>     </xsl:text><xsl:value-of select="configItem/description"/>
+<xsl:text>
+</xsl:text>
+</xsl:for-each>
+</xsl:template>
+
+<!-- split layout/variant/description into a table like this
+
+        layout1                 description
+                variant1        description
+                variant2        description
+        layout2                 description
+                variant1        description
+-->
+<xsl:template match="layoutList">
+<xsl:for-each select="layout">
+<xsl:value-of select="configItem/name"/><xsl:text>             </xsl:text><xsl:value-of select="configItem/description"/>
+<xsl:text>
+</xsl:text>
+<xsl:for-each select="variantList/variant">
+<xsl:text>     </xsl:text><xsl:value-of select="configItem/name"/><xsl:text>   </xsl:text><xsl:value-of select="configItem/description"/>
+<xsl:text>
+</xsl:text>
+</xsl:for-each>
+<xsl:text>
+</xsl:text>
+</xsl:for-each>
+</xsl:template>
+
+<!-- split option into a table like this
+
+option description:
+        optarg          description
+        optarg          description
+        optarg          description
+
+option2 description:
+        optarg          description
+        optarg          description
+-->
+<xsl:template match="optionList">
+<xsl:for-each select="group">
+<![CDATA[
+.SS]]> <xsl:value-of select="configItem/description"/>
+<![CDATA[
+.BR
+.TS
+l l
+___
+lB l.
+option description ]]>
+<xsl:for-each select="option">
+<xsl:value-of select="configItem/name"/><xsl:text>     </xsl:text><xsl:value-of select="configItem/description"/>
+<xsl:text>
+</xsl:text>
+</xsl:for-each>
+<![CDATA[
+.TE
+
+]]>
+</xsl:for-each>
+</xsl:template>
+</xsl:stylesheet>