From c17f8b08740aed26687fd65c84e654a6cdc163a2 Mon Sep 17 00:00:00 2001
From: Peter Hutterer <peter.hutterer@who-t.net>
Date: Mon, 13 Jun 2011 23:39:30 +0100
Subject: [PATCH] Use XSL to generate man page from the rules XML

Generate a man-page from the evdev.xml through the xslt/man.xsl stylesheet.

Adds a requirement on the xorg util-macros and xsltproc.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Dan Nicholson <dbn.lists@gmail.com>
Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
---
 Makefile.am     |    2 +-
 configure.in    |   10 ++++
 man/Makefile.am |   17 +++++++
 man/man.xsl     |  137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 165 insertions(+), 1 deletions(-)
 create mode 100644 man/Makefile.am
 create mode 100644 man/man.xsl

diff --git a/Makefile.am b/Makefile.am
index e98117e..943539f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,6 @@
 AUTOMAKE_OPTIONS = foreign
 
-SUBDIRS = compat geometry keycodes keymap po rules semantics symbols types docs
+SUBDIRS = compat geometry keycodes keymap po rules semantics symbols types docs man
 
 pkgconfigdir = $(datadir)/pkgconfig
 pkgconfig_DATA = xkeyboard-config.pc
diff --git a/configure.in b/configure.in
index 527e807..e98919a 100644
--- a/configure.in
+++ b/configure.in
@@ -3,6 +3,15 @@ AC_CONFIG_SRCDIR(rules/base.xml.in)
 AM_INIT_AUTOMAKE([foreign dist-bzip2])
 AM_MAINTAINER_MODE
 
+# Require X.Org macros 1.12 or later for XORG_WITH_XSLTPROC
+m4_ifndef([XORG_MACROS_VERSION],
+          [m4_fatal([must install xorg-macros 1.12 or later before
+          running autoconf/autogen])])
+XORG_MACROS_VERSION(1.12)
+XORG_MANPAGE_SECTIONS
+XORG_WITH_XSLTPROC
+AC_PROG_SED
+
 AC_SUBST(VERSION)
 
 AC_PATH_PROG([XKBCOMP], [xkbcomp], [not_found])
@@ -104,6 +113,7 @@ types/Makefile
 xkeyboard-config.pc
 xkeyboard-config.spec
 docs/Makefile
+man/Makefile
 ])
 
 echo '***********************************************************'
diff --git a/man/Makefile.am b/man/Makefile.am
new file mode 100644
index 0000000..2e9deaa
--- /dev/null
+++ b/man/Makefile.am
@@ -0,0 +1,17 @@
+EXTRA_DIST = man.xsl
+
+if HAVE_XSLTPROC
+miscmandir = $(MISC_MAN_DIR)
+miscman_PRE = xkeyboard-config.man
+miscman_DATA = $(miscman_PRE:man=@MISC_MAN_SUFFIX@)
+CLEANFILES = $(miscman_DATA) $(miscman_PRE)
+SUFFIXES = .$(MISC_MAN_SUFFIX) .man
+MAN_SUBSTS += -e 's|__xkb_base__|$(xkb_base)|g'
+
+xkeyboard-config.man: $(top_builddir)/rules/evdev.xml $(srcdir)/man.xsl
+	$(XSLTPROC) -nonet $(srcdir)/man.xsl $(top_builddir)/rules/evdev.xml > $@
+
+.man.$(MISC_MAN_SUFFIX):
+	$(SED) $(MAN_SUBSTS) < $< > $@
+
+endif
diff --git a/man/man.xsl b/man/man.xsl
new file mode 100644
index 0000000..a5bd14d
--- /dev/null
+++ b/man/man.xsl
@@ -0,0 +1,137 @@
+<?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">
+        <xsl:text><![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(__appmansuffix__).
+.SH MODELS
+.TS
+left,box;
+lB lB
+___
+lB l.
+Model	Description
+]]></xsl:text>
+        <xsl:apply-templates select="modelList"/>
+        <xsl:text><![CDATA[
+.TE
+.SH LAYOUTS
+.TS
+left,box;
+lB lB
+____
+lB l.
+Layout(Variant)	Description
+]]></xsl:text>
+        <xsl:apply-templates select="layoutList"/>
+        <xsl:text><![CDATA[
+.TE
+.SH OPTIONS
+]]></xsl:text>
+        <xsl:apply-templates select="optionList"/>
+        <xsl:text><![CDATA[
+.SH FILES
+__xkb_base__/compat
+
+__xkb_base__/compiled
+
+__xkb_base__/geometry
+
+__xkb_base__/keycodes
+
+__xkb_base__/keymap
+
+__xkb_base__/rules
+
+__xkb_base__/semantics
+
+__xkb_base__/symbols
+
+__xkb_base__/types
+
+.SH SEE ALSO
+setxkbmap(__appmansuffix__)
+]]></xsl:text>
+    </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>&#9;</xsl:text><xsl:value-of select="configItem/description"/>
+            <xsl:text>&#10;</xsl:text>
+        </xsl:for-each>
+    </xsl:template>
+
+<!-- split layout/variant/description into a table like this
+
+        layout1                 description
+        layout1(variant1)       description
+        layout1(variant2)       description
+        layout2                 description
+        layout2(variant1)       description
+-->
+    <xsl:template match="layoutList">
+        <xsl:for-each select="layout">
+            <xsl:value-of select="configItem/name"/>
+            <xsl:text>&#9;</xsl:text>
+            <xsl:value-of select="configItem/description"/>
+            <xsl:text>&#10;</xsl:text>
+            <xsl:for-each select="variantList/variant">
+                <xsl:value-of select="../../configItem/name"/>
+                <xsl:text>(</xsl:text>
+                <xsl:value-of select="configItem/name"/>
+                <xsl:text>)</xsl:text>
+                <xsl:text>&#9;</xsl:text>
+                <xsl:value-of select="configItem/description"/>
+                <xsl:text>&#10;</xsl:text>
+            </xsl:for-each>
+            <xsl:text>&#10;</xsl:text>
+            <xsl:text>_&#10;</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">
+            <xsl:text><![CDATA[
+.SS]]></xsl:text>
+            <xsl:text>&#10;</xsl:text>
+            <xsl:value-of select="configItem/description"/>
+            <xsl:text><![CDATA[
+.BR
+.TS
+left,box;
+lB lB
+___
+lB l.
+Option	Description
+]]></xsl:text>
+            <xsl:for-each select="option">
+                <xsl:value-of select="configItem/name"/>
+                <xsl:text>&#9;</xsl:text>
+                <xsl:value-of select="configItem/description"/>
+                <xsl:text>&#10;</xsl:text>
+            </xsl:for-each>
+            <xsl:text><![CDATA[
+.TE
+
+]]></xsl:text>
+        </xsl:for-each>
+    </xsl:template>
+</xsl:stylesheet>
-- 
1.7.5.4

