diff options
author | Stef Walter <stefw@redhat.com> | 2013-04-09 15:26:35 +0200 |
---|---|---|
committer | Stef Walter <stefw@redhat.com> | 2013-04-09 15:29:03 +0200 |
commit | 030126689753052daa5323337c765a8b496ecb9a (patch) | |
tree | 6c58cf5efb4afd0ad4e99394f78d6ba83643f8ff | |
parent | 3fb917556b5e2ad38b5bfbafbcf2f3b60ce90f46 (diff) |
Add manual page for adcli and documentation infrastructure
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | Makefile.am | 21 | ||||
-rw-r--r-- | configure.ac | 39 | ||||
-rw-r--r-- | doc/Makefile.am | 68 | ||||
-rw-r--r-- | doc/adcli-docs.xml | 21 | ||||
-rw-r--r-- | doc/adcli.xml | 529 | ||||
-rw-r--r-- | doc/gtk-doc.xsl | 897 | ||||
-rw-r--r-- | doc/static/gtk-doc.css | 264 | ||||
-rw-r--r-- | doc/static/home.png | bin | 0 -> 654 bytes | |||
-rw-r--r-- | doc/static/left.png | bin | 0 -> 459 bytes | |||
-rw-r--r-- | doc/static/right.png | bin | 0 -> 472 bytes | |||
-rw-r--r-- | doc/static/style.css | 114 | ||||
-rw-r--r-- | doc/static/up.png | bin | 0 -> 406 bytes | |||
-rw-r--r-- | doc/version-greater-or-equal.xsl | 54 | ||||
-rw-r--r-- | tools/computer.c | 28 |
15 files changed, 2023 insertions, 14 deletions
@@ -39,6 +39,8 @@ Makefile.in /build/coverage.info /build/m4/*.m4 +/doc/adcli.8 +/doc/html/ /doc/version.xml /po/POTFILES diff --git a/Makefile.am b/Makefile.am index bdabd04..1f634cc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -8,7 +8,8 @@ SUBDIRS = \ ACLOCAL_AMFLAGS = -I build/m4 DISTCHECK_CONFIGURE_FLAGS = \ - --disable-coverage + --disable-coverage \ + --enable-doc dist-hook: @if test -d "$(srcdir)/.git"; \ @@ -34,4 +35,22 @@ memcheck: leakcheck: make -C library leakcheck +if ENABLE_DOC +SUBDIRS += doc + +upload: all + rsync -Hvax doc/html/./ anarchy.freedesktop.org:/srv/www.freedesktop.org/www/software/realmd/docs/adcli/./ + +distcheck-hook: + @true + +else +upload-doc: + @echo "*** doc must be enabled (with --enable-doc) in order to make upload-doc" + @false +distcheck-hook: + @echo "*** doc must be enabled (with --enable-doc) in order to make distcheck" + @false +endif + EXTRA_DIST = config.rpath diff --git a/configure.ac b/configure.ac index 7e9a4d5..d8ff662 100644 --- a/configure.ac +++ b/configure.ac @@ -120,6 +120,43 @@ if test "$sasl_invalid" = "yes"; then fi # -------------------------------------------------------------------- +# Documentation options + +AC_MSG_CHECKING([whether to build documentation]) +AC_ARG_ENABLE(doc, + AC_HELP_STRING([--enable-doc], + [Disable building documentation]) + ) + +if test "$enable_doc" = "no"; then + AC_MSG_RESULT($enable_doc) + +else + if test "$enable_doc" = ""; then + disable_msg="(perhaps --disable-doc)" + fi + + enable_doc="yes" + AC_MSG_RESULT($enable_doc) + + AC_PATH_PROG([XSLTPROC], [xsltproc], [no]) + if test "$XSLTPROC" = "no"; then + AC_MSG_ERROR([the xsltproc command was not found $disable_msg]) + fi + + AC_PATH_PROG([XMLTO], [xmlto], [no]) + if test "$XMLTO" = "no"; then + AC_MSG_ERROR([the xmlto command was not found $disable_msg]) + fi + + AC_SUBST(XSLTPROC) + AC_SUBST(XMLTO) +fi + +AM_CONDITIONAL([ENABLE_DOC], [test "$enable_doc" = "yes"]) +doc_status=$enable_doc + +# -------------------------------------------------------------------- # Compilation and linking options AC_MSG_CHECKING([for debug mode]) @@ -229,6 +266,7 @@ AC_SUBST(ADCLI_LT_RELEASE) AC_CONFIG_FILES([Makefile build/Makefile + doc/Makefile doc/version.xml library/Makefile tools/Makefile @@ -239,4 +277,5 @@ AC_MSG_NOTICE([build options: Host: $host Debug build: $debug_status Strict build: $strict_status + Documentation: $doc_status ]) diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..8943583 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,68 @@ +include $(top_srcdir)/Makefile.decl + +man8_MANS = \ + adcli.8 \ + $(NULL) + +MAN_IN_FILES = \ + $(man8_MANS:.8=.xml) + +DOCBOOK_FILE = adcli-docs.xml + +CONTENT_INCLUDES = \ + $(NULL) + +STATIC_FILES = \ + static/gtk-doc.css \ + static/style.css \ + $(NULL) + +XSLT_FILES = \ + gtk-doc.xsl \ + version-greater-or-equal.xsl \ + $(NULL) + +EXTRA_DIST = \ + $(DOCBOOK_FILE) \ + $(CONTENT_INCLUDES) \ + $(MAN_IN_FILES) \ + $(XSLT_FILES) \ + static \ + version.xml.in \ + version.xml \ + $(NULL) + +CLEANFILES = \ + $(man8_MANS) \ + $(NULL) + +XSLTPROC_FLAGS = \ + --nonet \ + --stringparam man.output.quietly 1 \ + --stringparam funcsynopsis.style ansi \ + --stringparam man.th.extra1.suppress 1 \ + --stringparam man.authors.section.enabled 0 \ + --stringparam man.copyright.section.enabled 0 + +XSLTPROC_MAN = \ + $(XSLTPROC) $(XSLTPROC_FLAGS) http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl + +.xml.8: + $(AM_V_GEN) $(XSLTPROC_MAN) $< + +$(builddir)/html/index.html: $(DOCBOOK_FILE) $(CONTENT_INCLUDES) $(MAN_IN_FILES) $(STATIC_FILES) + $(AM_V_GEN) mkdir -p $(builddir)/html && cp $(srcdir)/static/* $(builddir)/html/ + $(AM_V_GEN) $(XMLTO) html -m $(srcdir)/gtk-doc.xsl -o $(builddir)/html \ + --searchpath $(builddir):$(srcdir) $(srcdir)/$(DOCBOOK_FILE) + +all-local: $(builddir)/html/index.html + +clean-local: + @rm -rf *.tmp $(builddir)/html + +install-data-local: + $(MKDIR_P) $(DESTDIR)$(htmldir) + $(INSTALL_DATA) $(builddir)/html/* $(DESTDIR)$(htmldir) + +uninstall-local: + rm -rf $(DESTDIR)$(htmldir) diff --git a/doc/adcli-docs.xml b/doc/adcli-docs.xml new file mode 100644 index 0000000..83ffcc2 --- /dev/null +++ b/doc/adcli-docs.xml @@ -0,0 +1,21 @@ +<?xml version="1.0"?> +<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" + "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" +[ + <!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'"> + <!ENTITY version SYSTEM "version.xml"> +]> +<book id="index"> + <bookinfo> + <title>adcli</title> + <releaseinfo>for &version;</releaseinfo> + </bookinfo> + + <part id="guide"> + <title>User Guide</title> + <chapter id="adcli-manual"> + <title>Manual pages</title> + <xi:include href="adcli.xml"/> + </chapter> + </part> +</book> diff --git a/doc/adcli.xml b/doc/adcli.xml new file mode 100644 index 0000000..f01ad27 --- /dev/null +++ b/doc/adcli.xml @@ -0,0 +1,529 @@ +<?xml version='1.0'?> +<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" + "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"> + +<refentry id="adcli"> + +<refentryinfo> + <title>adcli</title> + <productname>realmd</productname> + <authorgroup> + <author> + <contrib>Maintainer</contrib> + <firstname>Stef</firstname> + <surname>Walter</surname> + <email>stefw@redhat.com</email> + </author> + </authorgroup> +</refentryinfo> + +<refmeta> + <refentrytitle>adcli</refentrytitle> + <manvolnum>8</manvolnum> + <refmiscinfo class="manual">System Commands</refmiscinfo> +</refmeta> + +<refnamediv> + <refname>adcli</refname> + <refpurpose>Tool for performing actions on an Active Directory domain</refpurpose> +</refnamediv> + +<refsynopsisdiv> + <cmdsynopsis> + <command>adcli info</command> + <arg choice="plain">domain.example.com</arg> + </cmdsynopsis> + <cmdsynopsis> + <command>adcli join</command> + <arg choice="plain">domain.example.com</arg> + </cmdsynopsis> + <cmdsynopsis> + <command>adcli create-user</command> + <arg choice="opt">--domain=domain.example.com</arg> + <arg choice="plain">user</arg> + </cmdsynopsis> + <cmdsynopsis> + <command>adcli delete-user</command> + <arg choice="opt">--domain=domain.example.com</arg> + <arg choice="plain">user</arg> + </cmdsynopsis> + <cmdsynopsis> + <command>adcli create-group</command> + <arg choice="opt">--domain=domain.example.com</arg> + <arg choice="plain">user</arg> + </cmdsynopsis> + <cmdsynopsis> + <command>adcli delete-group</command> + <arg choice="opt">--domain=domain.example.com</arg> + <arg choice="plain">user</arg> + </cmdsynopsis> + <cmdsynopsis> + <command>adcli add-member</command> + <arg choice="opt">--domain=domain.example.com</arg> + <arg choice="plain">group</arg> + <arg choice="plain" rep="repeat">user</arg> + </cmdsynopsis> + <cmdsynopsis> + <command>adcli remove-member</command> + <arg choice="opt">--domain=domain.example.com</arg> + <arg choice="plain">group</arg> + <arg choice="plain" rep="repeat">user</arg> + </cmdsynopsis> + <cmdsynopsis> + <command>adcli preset-computer</command> + <arg choice="opt">--domain=domain.example.com</arg> + <arg choice="plain" rep="repeat">computer</arg> + </cmdsynopsis> + <cmdsynopsis> + <command>adcli reset-computer</command> + <arg choice="opt">--domain=domain.example.com</arg> + <arg choice="plain">computer</arg> + </cmdsynopsis> + <cmdsynopsis> + <command>adcli delete-computer</command> + <arg choice="opt">--domain=domain.example.com</arg> + <arg choice="plain">computer</arg> + </cmdsynopsis> +</refsynopsisdiv> + +<refsect1> + <title>Description</title> + <para><command>adcli</command> is a command line tool that + can perform actions in an Active Directory domain. Among other things + it can be used to join a computer to a domain.</para> + + <para>See the various sub commands below. The following global options + can be used:</para> + + <variablelist> + <varlistentry> + <term><option>-D, --domain=<parameter>domain</parameter></option></term> + <listitem><para>The domain to connect to. If a domain is + not specified then the domain part of the local computer's + host name is used.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>-R, --domain-realm=<parameter>REALM</parameter></option></term> + <listitem><para>Kerberos realm for the domain. If not + specified then the upper cased domain name is + used.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>-S, --domain-controller=<parameter>server</parameter></option></term> + <listitem><para>Connect to a specific domain controller. + If not specified then an appropriate domain controller + is automatically discovered.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>-C, --login-ccache=<parameter>/path/to/file</parameter></option></term> + <listitem><para>Use the specified kerberos credential + cache to authenticate with the domain.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>-U, --login-user=<parameter>User</parameter></option></term> + <listitem><para>Use the specified user account to + authenticate with the domain. If not specified then + the name 'Administrator' will be used.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>--no-password</option></term> + <listitem><para>Don't show prompts for or read a + password from input.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>-W, --prompt-password</option></term> + <listitem><para>Prompt for a password if necessary. + This is the default.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>--stdin-password</option></term> + <listitem><para>Read a password from stdin input instead + of prompting for a password.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>-v, --verbose</option></term> + <listitem><para>Run in verbose mode with debug + output.</para></listitem> + </varlistentry> + </variablelist> + +</refsect1> + +<refsect1> + <title>Querying Domain Information</title> + + <para><command>adcli info</command> displays discovered information + about an Active Directory domain or an Active Directory domain + controller.</para> + +<programlisting> +$ adcli info domain.example.com +... +</programlisting> + +<programlisting> +$ adcli info --domain-controller=dc.domain.example.com +... +</programlisting> + + <para><command>adcli info</command> will output as much information as + it can about the domain. The information is designed to be both machine + and human readable. The command will exit with a non-zero exit code + if the domain does note exist or cannot be reached.</para> + + <para>To show domain info for a specific domain controller use the + <option>--domain-controller</option> option to specify which domain + controller to query.</para> + + <para>Use the <option>--verbose</option> option to show details of how + the domain is discovered and queried. Many of the global options, in + particular authentication options, are not usable with the + <command>adcli info</command> command.</para> +</refsect1> + +<refsect1> + <title>Joining the Local Machine to a Domain</title> + + <para><command>adcli join</command> creates a computer account in the + domain for the local machine, and sets up a keytab for the machine. + It does not configure an authentication service (such as + <command>sssd</command>).</para> + +<programlisting> +$ adcli join domain.example.com +Password for Administrator: +</programlisting> + + <para>In addition to the global options, you can specify the following + options to control how this operation is done.</para> + + <variablelist> + <varlistentry> + <term><option>-N, --computer-name=<parameter>computer</parameter></option></term> + <listitem><para>The short non-dotted name of the computer + account that will be created in the domain. If not specified + then the first portion of the <option>--host-fqdn</option> + is used.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>-O, --domain-ou=<parameter>OU=xxx</parameter></option></term> + <listitem><para>The full distinguished name of the OU in + which to create the computer account. If not specified + then the computer account will be created in a default + location.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>-H, --host-fqdn=<parameter>host</parameter></option></term> + <listitem><para>Override the local machine's fully qualified + domain name. If not specified the local machine's hostname + will be retrieved via <function>gethostname()</function>.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>-K, --host-keytab=<parameter>/path/to/keytab</parameter></option></term> + <listitem><para>Specify the path to the host keytab where + host credentials will be written after a successful join + operation. If not specified the default location will be + used, usually <filename>/etc/krb5.keytab</filename>.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>--login-type=<parameter>{computer|user}</parameter></option></term> + <listitem><para>Specify the type of authentication that + will be performed before creating the machine account in + the domain. If set to 'computer' then the computer must + already have a preset account in the domain. If not + specified and none of the other <option>--login-xxx</option> + arguments have been specified, then will try both + 'computer' and 'user' authentication.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>--service-name=<parameter>service</parameter></option></term> + <listitem><para>Additional service name for a kerberos + principal to be created on the computer account. This + option may be specified multiple times.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>--show-details</option></term> + <listitem><para>After a successful join print out information + about join operation. This is output in a format that should + be both human and machine readable.</para></listitem> + </varlistentry> + </variablelist> + +</refsect1> + +<refsect1> + <title>Creating a User</title> + + <para><command>adcli create-user</command> creates a new user account + in the domain.</para> + +<programlisting> +$ adcli create-user Fry --domain=domain.example.com \ + --display-name="Philip J. Fry" --mail=fry@domain.example.com +</programlisting> + + <para>In addition to the global options, you can specify the following + options to control how the user is created.</para> + + <variablelist> + <varlistentry> + <term><option>--display-name=<parameter>"Name"</parameter></option></term> + <listitem><para>Set the <code>displayName</code> attribute + of the new created user account.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>-O, --domain-ou=<parameter>OU=xxx</parameter></option></term> + <listitem><para>The full distinguished name of the OU in + which to create the user account. If not specified + then the computer account will be created in a default + location.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>--mail=<parameter>email@domain.com</parameter></option></term> + <listitem><para>Set the <code>mail</code> attribute of + the new created user account. This attribute may be + specified multiple times.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>--unix-home=<parameter>/home/user</parameter></option></term> + <listitem><para>Set the <code>unixHomeDirectory</code> attribute of + the new created user account, which should be an absolute + path to the user's home directory.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>--unix-gid=<parameter>111</parameter></option></term> + <listitem><para>Set the <code>gidNumber</code> attribute of + the new created user account, which should be the user's + numeric primary group id.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>--unix-shell=<parameter>/bin/shell</parameter></option></term> + <listitem><para>Set the <code>pos</code> attribute of + the new created user account, which should be the user's + numeric primary user id.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>--unix-uid=<parameter>111</parameter></option></term> + <listitem><para>Set the <code>loginShell</code> attribute of + the new created user account, which should be a path to + a valid shell.</para></listitem> + </varlistentry> + </variablelist> + +</refsect1> + +<refsect1> + <title>Deleting a User</title> + + <para><command>adcli delete-user</command> deletes a user account from + the domain.</para> + +<programlisting> +$ adcli delete-user Fry --domain=domain.example.com +</programlisting> + + <para>The various global options can be used.</para> + +</refsect1> + + +<refsect1> + <title>Creating a Group</title> + + <para><command>adcli create-group</command> creates a new group in the + domain.</para> + +<programlisting> +$ adcli create-group Pilots --domain=domain.example.com \ + --description="Group for all pilots" +</programlisting> + + <para>In addition to the global options, you can specify the following + options to control how the group is created.</para> + + <variablelist> + <varlistentry> + <term><option>--description=<parameter>"text"</parameter></option></term> + <listitem><para>Set the <code>description</code> attribute + of the new created group.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>-O, --domain-ou=<parameter>OU=xxx</parameter></option></term> + <listitem><para>The full distinguished name of the OU in + which to create the group. If not specified + then the computer account will be created in a default + location.</para></listitem> + </varlistentry> + </variablelist> + +</refsect1> + +<refsect1> + <title>Deleting a Group</title> + + <para><command>adcli delete-group</command> deletes a group from + the domain.</para> + +<programlisting> +$ adcli delete-group Pilots --domain=domain.example.com +</programlisting> + + <para>The various global options can be used.</para> + +</refsect1> + +<refsect1> + <title>Adding a Member to a Group</title> + + <para><command>adcli add-member</command> adds one or more users to a + group in the domain. The group is specified first, and then the various + users to be added.</para> + +<programlisting> +$ adcli add-member --domain=domain.example.com Pilots Leela Scruffy +</programlisting> + + <para>The various global options can be used.</para> + + <para></para> + +</refsect1> + +<refsect1> + <title>Removing a Member from a Group</title> + + <para><command>adcli remove-member</command> removes a user from a group + in the domain. The group is specified first, and then the various users + to be removed.</para> + +<programlisting> +$ adcli remove-member --domain=domain.example.com Pilots Scruffy +</programlisting> + + <para>The various global options can be used.</para> + +</refsect1> + +<refsect1> + <title>Preset Computer Accounts</title> + + <para><command>adcli preset-computer</command> pre-creates one or more + computer accounts in the domain for machines to later use when joining + the domain. By doing this machines can join using a one time password + or automatically without a password.</para> + +<programlisting> +$ adcli preset-computer --domain=domain.example.com \ + host1.example.com host2 +Password for Administrator: +</programlisting> + + <para>If the computer names specified contain dots, then they are + treated as fully qualified host names, otherwise they are treated + as short computer names. The computer accounts must not already + exist.</para> + + <para>In addition to the global options, you can specify the following + options to control how this operation is done.</para> + + <variablelist> + <varlistentry> + <term><option>-O, --domain-ou=<parameter>OU=xxx</parameter></option></term> + <listitem><para>The full distinguished name of the OU in + which to create the computer accounts. If not specified + then the computer account will be created in a default + location.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>--one-time-password</option></term> + <listitem><para>Specify a one time password to use when + presetting the computer accounts. If not specified then + a default password will be used, which allows for later + automatic joins.</para></listitem> + </varlistentry> + <varlistentry> + <term><option>--service-name=<parameter>service</parameter></option></term> + <listitem><para>Additional service name for a kerberos + principal to be created on the computer account. This + option may be specified multiple times.</para></listitem> + </varlistentry> + </variablelist> + +</refsect1> + +<refsect1> + <title>Reset Computer Account</title> + + <para><command>adcli reset-computer</command> resets a computer account + in the domain. If a the appropriate machien is currently joined to the + domain, then it's membership will be broken. The account must already + exist.</para> + +<programlisting> +$ adcli reset-computer --domain=domain.example.com host2 +</programlisting> + + <para>If the computer names specified contain dots, then they are + treated as fully qualified host names, otherwise they are treated + as short computer names.</para> + + <para>In addition to the global options, you can specify the following + options to control how this operation is done.</para> + + <variablelist> + <varlistentry> + <term><option>--login-type=<parameter>{computer|user}</parameter></option></term> + <listitem><para>Specify the type of authentication that + will be performed before creating the machine account in + the domain. If set to 'computer' then the computer must + already have a preset account in the domain. If not + specified and none of the other <option>--login-xxx</option> + arguments have been specified, then will try both + 'computer' and 'user' authentication.</para></listitem> + </varlistentry> + </variablelist> + +</refsect1> + +<refsect1> + <title>Delete Computer Account</title> + + <para><command>adcli delete-computer</command> deletes a computer account + in the domain. The account must already exist.</para> + +<programlisting> +$ adcli delete-computer --domain=domain.example.com host2 +Password for Administrator: +</programlisting> + + <para>If the computer name contains a dot, then it is + treated as fully qualified host name, otherwise it is treated + as short computer name.</para> + + <para>The various global options can be used.</para> + +</refsect1> + +<refsect1> + <title>Bugs</title> + <para> + Please send bug reports to either the distribution bug tracker + or the upstream bug tracker at + <ulink url="https://bugs.freedesktop.org/enter_bug.cgi?product=realmd&component=adcli">https://bugs.freedesktop.org/enter_bug.cgi?product=realmd&component=adcli</ulink> + </para> +</refsect1> + +<refsect1> + <title>See also</title> + <simplelist type="inline"> + <member><citerefentry><refentrytitle>realmd</refentrytitle><manvolnum>8</manvolnum></citerefentry></member> + <member><citerefentry><refentrytitle>net</refentrytitle><manvolnum>8</manvolnum></citerefentry></member> + <member><citerefentry><refentrytitle>sssd</refentrytitle><manvolnum>8</manvolnum></citerefentry></member> + </simplelist> + <para> + Further details available in the p11-kit online documentation at + <ulink url="http://www.freedesktop.org/software/realmd/">http://www.freedesktop.org/software/realmd/</ulink> + </para> +</refsect1> + +</refentry> diff --git a/doc/gtk-doc.xsl b/doc/gtk-doc.xsl new file mode 100644 index 0000000..6ca4b53 --- /dev/null +++ b/doc/gtk-doc.xsl @@ -0,0 +1,897 @@ +<?xml version='1.0'?> <!--*- mode: xml -*--> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" + exclude-result-prefixes="l" + version="1.0"> + + <!-- import the chunked XSL stylesheet --> + <!-- http://www.sagehill.net/docbookxsl/Chunking.html says we should use + "chunkfast.xsl", but I can see a difference --> + <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl"/> + <xsl:include href="version-greater-or-equal.xsl"/> + + <xsl:key name="acronym.key" + match="glossentry/glossterm" + use="."/> + <xsl:key name="gallery.key" + match="para[@role='gallery']/link" + use="@linkend"/> + + <!-- change some parameters --> + <!-- http://docbook.sourceforge.net/release/xsl/current/doc/html/index.html --> + <xsl:param name="toc.section.depth">2</xsl:param> + <xsl:param name="generate.toc"> + book toc + chapter toc + glossary toc + index toc + part toc + reference toc + </xsl:param> + + <xsl:param name="chunker.output.encoding" select="'UTF-8'"/> + <xsl:param name="chunker.output.indent" select="'yes'"/> + <xsl:param name="chunker.output.doctype-public" select="'-//W3C//DTD HTML 4.01 Transitional//EN'"/> + <xsl:param name="chunk.fast" select="1"/> + + <xsl:param name="default.encoding" select="'UTF-8'"/> + <xsl:param name="chapter.autolabel" select="0"/> + <xsl:param name="use.id.as.filename" select="1"/> + <xsl:param name="html.ext" select="'.html'"/> + <xsl:param name="refentry.generate.name" select="0"/> + <xsl:param name="refentry.generate.title" select="1"/> + <!-- don't generate all those link tags (very slow and hardly used) + it does not show much effect as we have a user.head.content template + <xsl:param name="html.extra.head.links" select="0" /> + --> + + <!-- use index filtering (if available) --> + <xsl:param name="index.on.role" select="1"/> + + <!-- display variablelists as tables --> + <xsl:param name="variablelist.as.table" select="1"/> + + <!-- new things to consider + <xsl:param name="glossterm.auto.link" select="0"></xsl:param> + --> + + <!-- this gets set on the command line ... --> + <xsl:param name="gtkdoc.version" select="''"/> + <xsl:param name="gtkdoc.bookname" select="''"/> + + <!-- ========================================================= --> + + <!-- l10n is slow, we don't ue it, so we'd like to turn it off + this atleast avoid the re-evaluation --> + <xsl:template name="l10n.language">en</xsl:template> + + <xsl:param name="gtkdoc.l10n.xml" select="document('http://docbook.sourceforge.net/release/xsl/current/common/en.xml')"/> + + <xsl:key name="gtkdoc.gentext.key" + match="l:gentext[@key]" + use="@key"/> + <xsl:key name="gtkdoc.context.key" + match="l:context[@name]" + use="@name"/> + + <xsl:template name="gentext"> + <xsl:param name="key" select="local-name(.)"/> + + <xsl:for-each select="$gtkdoc.l10n.xml"> + <xsl:variable name="l10n.gentext" select="key('gtkdoc.gentext.key', $key)"/> + + <xsl:choose> + <xsl:when test="$l10n.gentext"> + <xsl:value-of select="$l10n.gentext/@text"/> + </xsl:when> + <xsl:otherwise> + <xsl:message> + <xsl:text>No "en" localization of "</xsl:text> + <xsl:value-of select="$key"/> + <xsl:text>" exists.</xsl:text> + </xsl:message> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + </xsl:template> + + <xsl:template name="gentext.dingbat"> + <xsl:param name="dingbat">bullet</xsl:param> + + <xsl:variable name="l10n.dingbat" + select="($gtkdoc.l10n.xml/l:l10n/l:dingbat[@key=$dingbat])[1]"/> + + <xsl:choose> + <xsl:when test="$l10n.dingbat"> + <xsl:value-of select="$l10n.dingbat/@text"/> + </xsl:when> + <xsl:otherwise> + <xsl:message> + <xsl:text>No "en" localization of dingbat </xsl:text> + <xsl:value-of select="$dingbat"/> + <xsl:text> exists; using "en".</xsl:text> + </xsl:message> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template name="gentext.template"> + <xsl:param name="context" select="'default'"/> + <xsl:param name="name" select="'default'"/> + <xsl:param name="origname" select="$name"/> + + <!-- cut leading / if any to avoid one recursion --> + <xsl:variable name="rname"> + <xsl:choose> + <xsl:when test="starts-with($name, '/')"> + <xsl:value-of select="substring-after($name, '/')"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$name"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <!-- this is called with context="title|title-numbered|title-unnumbered> + <xsl:message> + <xsl:text>context:</xsl:text><xsl:value-of select="$context"/> + <xsl:text>;name:</xsl:text><xsl:value-of select="$rname"/> + <xsl:text>;origname:</xsl:text><xsl:value-of select="$origname"/> + </xsl:message> + + see html/html.xsl:<xsl:template match="*" mode="html.title.attribute"> + --> + + <xsl:for-each select="$gtkdoc.l10n.xml"> + <xsl:variable name="context.node" select="key('gtkdoc.context.key', $context)"/> + <xsl:variable name="template.node" + select="($context.node/l:template[@name=$rname])[1]"/> + + <xsl:choose> + <xsl:when test="$template.node/@text"> + <xsl:value-of select="$template.node/@text"/> + <!-- debug + <xsl:message> + <xsl:text>=</xsl:text><xsl:value-of select="$template.node/@text"/> + </xsl:message> + --> + </xsl:when> + <xsl:otherwise> + <xsl:choose> + <xsl:when test="contains($rname, '/')"> + <xsl:call-template name="gentext.template"> + <xsl:with-param name="context" select="$context"/> + <xsl:with-param name="name" select="substring-after($rname, '/')"/> + <xsl:with-param name="origname" select="$origname"/> + </xsl:call-template> + </xsl:when> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + </xsl:template> + + <!-- silently test whether a gentext template exists --> + <xsl:template name="gentext.template.exists"> + <xsl:param name="context" select="'default'"/> + <xsl:param name="name" select="'default'"/> + <xsl:param name="origname" select="$name"/> + + <xsl:variable name="template"> + <xsl:call-template name="gentext.template"> + <xsl:with-param name="context" select="$context"/> + <xsl:with-param name="name" select="$name"/> + <xsl:with-param name="origname" select="$origname"/> + </xsl:call-template> + </xsl:variable> + + <xsl:choose> + <xsl:when test="string-length($template) != 0">1</xsl:when> + <xsl:otherwise>0</xsl:otherwise> + </xsl:choose> + </xsl:template> + + <!-- shortcut version --> + <!-- @bug: https://bugzilla.gnome.org/show_bug.cgi?id=617478 --> + <xsl:template name="generate.html.title"/> + <!--xsl:template name="generate.html.title"> + <xsl:variable name="has.title.markup"> + <xsl:apply-templates select="." mode="title.markup"> + <xsl:with-param name="verbose" select="0"/> + </xsl:apply-templates> + </xsl:variable> + <xsl:if test="$has.title.markup != '???TITLE???'"> + <xsl:variable name="gentext.title"> + <xsl:apply-templates select="." mode="object.title.markup.textonly"/> + </xsl:variable> + <xsl:choose> + <xsl:when test="string-length($gentext.title) != 0"> + <xsl:attribute name="title"> + <xsl:value-of select="$gentext.title"/> + </xsl:attribute> + </xsl:when> + <xsl:when test="alt"> + <xsl:attribute name="title"> + <xsl:value-of select="normalize-space(alt)"/> + </xsl:attribute> + </xsl:when> + </xsl:choose> + </xsl:if> + </xsl:template--> + + <!-- Generate a title attribute for the context node (e.g. links) --> + <xsl:template match="*" mode="html.title.attribute"> + <xsl:variable name="has.title.markup"> + <xsl:apply-templates select="." mode="title.markup"> + <xsl:with-param name="verbose" select="0"/> + </xsl:apply-templates> + </xsl:variable> + <xsl:if test="$has.title.markup != '???TITLE???'"> + <xsl:variable name="is.title"> + <xsl:call-template name="gentext.template.exists"> + <xsl:with-param name="context" select="'title'"/> + <xsl:with-param name="name" select="local-name(.)"/> + <xsl:with-param name="lang"> + <xsl:call-template name="l10n.language"/> + </xsl:with-param> + </xsl:call-template> + </xsl:variable> + + <xsl:variable name="is.title-numbered"> + <xsl:if test="$is.title = 0"> + <xsl:call-template name="gentext.template.exists"> + <xsl:with-param name="context" select="'title-numbered'"/> + <xsl:with-param name="name" select="local-name(.)"/> + <xsl:with-param name="lang"> + <xsl:call-template name="l10n.language"/> + </xsl:with-param> + </xsl:call-template> + </xsl:if> + </xsl:variable> + + + <xsl:variable name="is.title-unnumbered"> + <xsl:if test="$is.title = 0 and $is.title-numbered = 0"> + <xsl:call-template name="gentext.template.exists"> + <xsl:with-param name="context" select="'title-unnumbered'"/> + <xsl:with-param name="name" select="local-name(.)"/> + <xsl:with-param name="lang"> + <xsl:call-template name="l10n.language"/> + </xsl:with-param> + </xsl:call-template> + </xsl:if> + </xsl:variable> + + <xsl:variable name="gentext.title"> + <xsl:if test="$is.title != 0 or + $is.title-numbered != 0 or + $is.title-unnumbered != 0"> + <xsl:apply-templates select="." + mode="object.title.markup.textonly"/> + </xsl:if> + </xsl:variable> + + <xsl:choose> + <xsl:when test="string-length($gentext.title) != 0"> + <xsl:attribute name="title"> + <xsl:value-of select="$gentext.title"/> + </xsl:attribute> + </xsl:when> + <xsl:when test="alt"> + <xsl:attribute name="title"> + <xsl:value-of select="normalize-space(alt)"/> + </xsl:attribute> + </xsl:when> + </xsl:choose> + </xsl:if> + </xsl:template> + + + + + <!-- ========================================================= --> + <!-- template to create the index.sgml anchor index --> + + <xsl:template match="book|article"> + <xsl:variable name="tooldver"> + <xsl:call-template name="version-greater-or-equal"> + <xsl:with-param name="ver1" select="$VERSION" /> + <xsl:with-param name="ver2">1.36</xsl:with-param> + </xsl:call-template> + </xsl:variable> + <xsl:if test="$tooldver = 0"> + <xsl:message terminate="yes"> +FATAL-ERROR: You need the DocBook XSL Stylesheets version 1.36 or higher +to build the documentation. +Get a newer version at http://docbook.sourceforge.net/projects/xsl/ + </xsl:message> + </xsl:if> + <xsl:apply-imports/> + + <!-- generate the index.sgml href index --> + <xsl:call-template name="generate.index"/> + </xsl:template> + + <xsl:template name="generate.index"> + <xsl:call-template name="write.text.chunk"> + <xsl:with-param name="filename" select="'index.sgml'"/> + <xsl:with-param name="content"> + <xsl:apply-templates select="/book/bookinfo/releaseinfo/ulink" + mode="generate.index.mode"/> + <!-- check all anchor and refentry elements --> + <!-- + The obvious way to write this is //anchor|//refentry|etc... + The obvious way is slow because it causes multiple traversals + in libxslt. This take about half the time. + --> + <xsl:apply-templates select="//*[name()='anchor' or name()='refentry' or name()='refsect1' or + name() = 'refsect2' or name()='refsynopsisdiv' or + name()='varlistentry']" + mode="generate.index.mode"/> + </xsl:with-param> + <xsl:with-param name="default.encoding" select="'UTF-8'"/> + <xsl:with-param name="chunker.output.indent" select="'no'"/> + </xsl:call-template> + </xsl:template> + + <xsl:template match="*" mode="generate.index.mode"> + <xsl:if test="not(@href) and count(@id) > 0"> + <xsl:text><ANCHOR id="</xsl:text> + <xsl:value-of select="@id"/> + <xsl:text>" href="</xsl:text> + <xsl:if test="$gtkdoc.bookname"> + <xsl:value-of select="$gtkdoc.bookname"/> + <xsl:text>/</xsl:text> + </xsl:if> + <xsl:call-template name="href.target"/> + <xsl:text>"> </xsl:text> + </xsl:if> + </xsl:template> + + <xsl:template match="/book/bookinfo/releaseinfo/ulink" mode="generate.index.mode"> + <xsl:if test="@role='online-location'"> + <xsl:text><ONLINE href="</xsl:text> + <xsl:value-of select="@url"/> + <xsl:text>"> </xsl:text> + </xsl:if> + </xsl:template> + + <!-- ========================================================= --> + <!-- template to output gtkdoclink elements for the unknown targets --> + + <xsl:template match="link"> + <xsl:choose> + <xsl:when test="id(@linkend)"> + <xsl:apply-imports/> + </xsl:when> + <xsl:otherwise> + <GTKDOCLINK HREF="{@linkend}"> + <xsl:apply-templates/> + </GTKDOCLINK> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <!-- ========================================================= --> + <!-- Below are the visual portions of the stylesheet. They provide + the normal gtk-doc output style. --> + + <xsl:param name="shade.verbatim" select="0"/> + <xsl:param name="refentry.separator" select="0"/> + + <xsl:template match="refsect2"> + <xsl:if test="preceding-sibling::refsect2"> + <hr/> + </xsl:if> + <xsl:apply-imports/> + </xsl:template> + + <xsl:template name="user.head.content"> + <xsl:if test="$gtkdoc.version"> + <meta name="generator" content="GTK-Doc V{$gtkdoc.version} (XML mode)"/> + </xsl:if> + <link rel="stylesheet" href="style.css" type="text/css"/> + </xsl:template> + + <xsl:template name="user.footer.content"> + <div class="footer"> + <hr /> + <xsl:choose> + <xsl:when test="$gtkdoc.version"> + Generated by GTK-Doc V<xsl:copy-of select="$gtkdoc.version" /> + </xsl:when> + <xsl:otherwise> + Generated by GTK-Doc + </xsl:otherwise> + </xsl:choose> + </div> + </xsl:template> + + <xsl:template match="title" mode="book.titlepage.recto.mode"> + <table class="navigation" id="top" width="100%" + cellpadding="2" cellspacing="0"> + <tr> + <th valign="middle"> + <p class="{name(.)}"> + <xsl:value-of select="."/> + </p> + </th> + </tr> + </table> + </xsl:template> + + <xsl:template name="header.navigation"> + <xsl:param name="prev" select="/foo"/> + <xsl:param name="next" select="/foo"/> + <xsl:variable name="home" select="/*[1]"/> + <xsl:variable name="up" select="parent::*"/> + <xsl:variable name="refsections" select="./refsect1[@role]"/> + <xsl:variable name="glssections" select="./glossdiv/title"/> + <xsl:variable name="idxsections" select="./indexdiv/indexdiv/title"/> + <xsl:variable name="section_id" select="./@id"/> + <xsl:variable name="sect_object_hierarchy" select="./refsect1[@role='object_hierarchy']"/> + <xsl:variable name="sect_impl_interfaces" select="./refsect1[@role='impl_interfaces']"/> + <xsl:variable name="sect_prerequisites" select="./refsect1[@role='prerequisites']"/> + <xsl:variable name="sect_derived_interfaces" select="./refsect1[@role='derived_interfaces']"/> + <xsl:variable name="sect_implementations" select="./refsect1[@role='implementations']"/> + <xsl:variable name="sect_properties" select="./refsect1[@role='properties']"/> + <xsl:variable name="sect_child_properties" select="./refsect1[@role='child_properties']"/> + <xsl:variable name="sect_style_properties" select="./refsect1[@role='style_properties']"/> + <xsl:variable name="sect_signal_proto" select="./refsect1[@role='signal_proto']"/> + <xsl:variable name="sect_desc" select="./refsect1[@role='desc']"/> + <xsl:variable name="sect_synopsis" select="./refsynopsisdiv[@role='synopsis']"/> + <!-- + <xsl:variable name="sect_details" select="./refsect1[@id='details']"/> + <xsl:variable name="sect_property_details" select="./refsect1[@id='property_details']"/> + <xsl:variable name="sect_child_property_details" select="./refsect1[@id='child_property_details']"/> + <xsl:variable name="sect_style_property_details" select="./refsect1[@id='style_property_details']"/> + <xsl:variable name="sect_signals" select="./refsect1[@id='signals']"/> + --> + + <xsl:if test="$suppress.navigation = '0' and $home != ."> + <table class="navigation" id="top" width="100%" + summary = "Navigation header" cellpadding="2" cellspacing="2"> + <tr valign="middle"> + <xsl:choose> + <xsl:when test="count($prev) > 0"> + <td> + <a accesskey="p"> + <xsl:attribute name="href"> + <xsl:call-template name="href.target"> + <xsl:with-param name="object" select="$prev"/> + </xsl:call-template> + </xsl:attribute> + <img src="left.png" width="24" height="24" border="0"> + <xsl:attribute name="alt"> + <xsl:call-template name="gentext"> + <xsl:with-param name="key">nav-prev</xsl:with-param> + </xsl:call-template> + </xsl:attribute> + </img> + </a> + </td> + </xsl:when> + <xsl:otherwise> + <td> </td> + </xsl:otherwise> + </xsl:choose> + <xsl:choose> + <xsl:when test="count($up) > 0 and $up != $home"> + <td> + <a accesskey="u"> + <xsl:attribute name="href"> + <xsl:call-template name="href.target"> + <xsl:with-param name="object" select="$up"/> + </xsl:call-template> + </xsl:attribute> + <img src="up.png" width="24" height="24" border="0"> + <xsl:attribute name="alt"> + <xsl:call-template name="gentext"> + <xsl:with-param name="key">nav-up</xsl:with-param> + </xsl:call-template> + </xsl:attribute> + </img> + </a> + </td> + </xsl:when> + <xsl:otherwise> + <td> </td> + </xsl:otherwise> + </xsl:choose> + <xsl:choose> + <xsl:when test="$home != ."> + <td> + <a accesskey="h"> + <xsl:attribute name="href"> + <xsl:call-template name="href.target"> + <xsl:with-param name="object" select="$home"/> + </xsl:call-template> + </xsl:attribute> + <img src="home.png" width="24" height="24" border="0"> + <xsl:attribute name="alt"> + <xsl:call-template name="gentext"> + <xsl:with-param name="key">nav-home</xsl:with-param> + </xsl:call-template> + </xsl:attribute> + </img> + </a> + </td> + </xsl:when> + <xsl:otherwise> + <td> </td> + </xsl:otherwise> + </xsl:choose> + <th width="100%" align="center"> + <xsl:apply-templates select="$home" mode="object.title.markup"/> + </th> + <xsl:choose> + <xsl:when test="count($next) > 0"> + <td> + <a accesskey="n"> + <xsl:attribute name="href"> + <xsl:call-template name="href.target"> + <xsl:with-param name="object" select="$next"/> + </xsl:call-template> + </xsl:attribute> + <img src="right.png" width="24" height="24" border="0"> + <xsl:attribute name="alt"> + <xsl:call-template name="gentext"> + <xsl:with-param name="key">nav-next</xsl:with-param> + </xsl:call-template> + </xsl:attribute> + </img> + </a> + </td> + </xsl:when> + <xsl:otherwise> + <td> </td> + </xsl:otherwise> + </xsl:choose> + </tr> + <!--<xsl:if test="name()='refentry'"--> + <xsl:choose> + <xsl:when test="count($refsections) > 0"> + <tr> + <td colspan="5" class="shortcuts"> + <xsl:if test="count($sect_synopsis) > 0"> + <a href="#{$section_id}.synopsis" class="shortcut">Top</a> + </xsl:if> + <xsl:if test="count($sect_desc) > 0"> +  |  + <a href="#{$section_id}.description" class="shortcut"> + <xsl:value-of select="./refsect1[@role='desc']/title"/> + </a> + </xsl:if> + <xsl:if test="count($sect_object_hierarchy) > 0"> +  |  + <a href="#{$section_id}.object-hierarchy" class="shortcut"> + <xsl:value-of select="./refsect1[@role='object_hierarchy']/title"/> + </a> + </xsl:if> + <xsl:if test="count($sect_impl_interfaces) > 0"> +  |  + <a href="#{$section_id}.implemented-interfaces" class="shortcut"> + <xsl:value-of select="./refsect1[@role='impl_interfaces']/title"/> + </a> + </xsl:if> + <xsl:if test="count($sect_prerequisites) > 0"> +  |  + <a href="#{$section_id}.prerequisites" class="shortcut"> + <xsl:value-of select="./refsect1[@role='prerequisites']/title"/> + </a> + </xsl:if> + <xsl:if test="count($sect_derived_interfaces) > 0"> +  |  + <a href="#{$section_id}.derived-interfaces" class="shortcut"> + <xsl:value-of select="./refsect1[@role='derived_interfaces']/title"/> + </a> + </xsl:if> + <xsl:if test="count($sect_implementations) > 0"> +  |  + <a href="#{$section_id}.implementations" class="shortcut"> + <xsl:value-of select="./refsect1[@role='implementations']/title"/> + </a> + </xsl:if> + <xsl:if test="count($sect_properties) > 0"> +  |  + <a href="#{$section_id}.properties" class="shortcut"> + <xsl:value-of select="./refsect1[@role='properties']/title"/> + </a> + </xsl:if> + <xsl:if test="count($sect_child_properties) > 0"> +  |  + <a href="#{$section_id}.child-properties" class="shortcut"> + <xsl:value-of select="./refsect1[@role='child_properties']/title"/> + </a> + </xsl:if> + <xsl:if test="count($sect_style_properties) > 0"> +  |  + <a href="#{$section_id}.style-properties" class="shortcut"> + <xsl:value-of select="./refsect1[@role='style_properties']/title"/> + </a> + </xsl:if> + <xsl:if test="count($sect_signal_proto) > 0"> +  |  + <a href="#{$section_id}.signals" class="shortcut"> + <xsl:value-of select="./refsect1[@role='signal_proto']/title"/> + </a> + </xsl:if> + <!-- + <xsl:if test="count($sect_details) > 0"> + <a href="#details" class="shortcut"> + <xsl:value-of select="./refsect1[@id='details']/title"/> + </a> +  |  + </xsl:if> + <xsl:if test="count($sect_property_details) > 0"> + <a href="#property_details" class="shortcut"> + <xsl:value-of select="./refsect1[@id='property_details']/title"/> + </a> +  |  + </xsl:if> + <xsl:if test="count($sect_child_property_details) > 0"> + <a href="#child_property_details" class="shortcut"> + <xsl:value-of select="./refsect1[@id='property_child_details']/title"/> + </a> +  |  + </xsl:if> + <xsl:if test="count($sect_style_property_details) > 0"> + <a href="#style_property_details" class="shortcut"> + <xsl:value-of select="./refsect1[@id='style_property_details']/title"/> + </a> +  |  + </xsl:if> + <xsl:if test="count($sect_signals) > 0"> + <a href="#signals" class="shortcut"> + <xsl:value-of select="./refsect1[@id='signals']/title"/> + </a> +  |  + </xsl:if> + --> + </td> + </tr> + </xsl:when> + <!-- this is not yet very nice, as it requires all glossdic/indexdiv + elements having a anchor element. maybe we can customize the xsl + to automaticaly create local anchors + --> + <xsl:when test="count($glssections) > 0"> + <tr> + <td colspan="5" class="shortcuts"> + <xsl:for-each select="./glossdiv"> + <xsl:if test="position() > 1"> +  |  + </xsl:if> + <a class="shortcut"> + <xsl:attribute name="href">#gls<xsl:value-of select="./title"/></xsl:attribute> + <xsl:value-of select="./title"/> + </a> + </xsl:for-each> + </td> + </tr> + </xsl:when> + <xsl:when test="count($idxsections) > 0"> + <tr> + <td colspan="5" class="shortcuts"> + <xsl:for-each select="./indexdiv/indexdiv"> + <xsl:if test="position() > 1"> +  |  + </xsl:if> + <a class="shortcut"> + <xsl:attribute name="href">#idx<xsl:value-of select="./title"/></xsl:attribute> + <xsl:value-of select="./title"/> + </a> + </xsl:for-each> + </td> + </tr> + </xsl:when> + </xsl:choose> + </table> + </xsl:if> + </xsl:template> + + <xsl:template name="footer.navigation"> + </xsl:template> + + <!-- avoid creating multiple identical indices + if the stylesheets don't support filtered indices + --> + <xsl:template match="index"> + <xsl:variable name="has-filtered-index"> + <xsl:call-template name="version-greater-or-equal"> + <xsl:with-param name="ver1" select="$VERSION" /> + <xsl:with-param name="ver2">1.66</xsl:with-param> + </xsl:call-template> + </xsl:variable> + <xsl:if test="($has-filtered-index = 1) or (count(@role) = 0)"> + <xsl:apply-imports/> + </xsl:if> + </xsl:template> + + <xsl:template match="index" mode="toc"> + <xsl:variable name="has-filtered-index"> + <xsl:call-template name="version-greater-or-equal"> + <xsl:with-param name="ver1" select="$VERSION" /> + <xsl:with-param name="ver2">1.66</xsl:with-param> + </xsl:call-template> + </xsl:variable> + <xsl:if test="($has-filtered-index = 1) or (count(@role) = 0)"> + <xsl:apply-imports/> + </xsl:if> + </xsl:template> + + <xsl:template match="para"> + <xsl:choose> + <xsl:when test="@role = 'gallery'"> + <div class="container"> + <div class="gallery-spacer"> </div> + <xsl:apply-templates mode="gallery.mode"/> + <div class="gallery-spacer"> </div> + </div> + </xsl:when> + <xsl:otherwise> + <xsl:apply-imports/> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + <!-- FIXME: try if that works too --> + <!--xsl:template match="para[@role='gallery']"> + <div class="container"> + <div class="gallery-spacer"> </div> + <xsl:apply-templates mode="gallery.mode"/> + <div class="gallery-spacer"> </div> + </div> + </xsl:template--> + + + + <xsl:template match="link" mode="gallery.mode"> + <div class="gallery-float"> + <xsl:apply-templates select="."/> + </div> + </xsl:template> + + <!-- add gallery handling to refnamediv template --> + <xsl:template match="refnamediv"> + <div class="{name(.)}"> + <table width="100%"> + <tr><td valign="top"> + <xsl:call-template name="anchor"/> + <xsl:choose> + <xsl:when test="$refentry.generate.name != 0"> + <h2> + <xsl:call-template name="gentext"> + <xsl:with-param name="key" select="'RefName'"/> + </xsl:call-template> + </h2> + </xsl:when> + <xsl:when test="$refentry.generate.title != 0"> + <h2> + <xsl:choose> + <xsl:when test="../refmeta/refentrytitle"> + <xsl:apply-templates select="../refmeta/refentrytitle"/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="refname[1]"/> + </xsl:otherwise> + </xsl:choose> + </h2> + </xsl:when> + </xsl:choose> + <p> + <xsl:apply-templates/> + </p> + </td> + <td valign="top" align="right"> + <xsl:choose> + <xsl:when test="../refmeta/refmiscinfo/inlinegraphic"> + <xsl:apply-templates select="../refmeta/refmiscinfo/inlinegraphic"/> + </xsl:when> + <xsl:otherwise> + <!-- find the gallery image to use here + - determine the id of the enclosing refentry + - look for an inlinegraphic inside a link with linkend == refentryid inside a para with role == gallery + - use it here + --> + <xsl:variable name="refentryid" select="../@id"/> + <xsl:apply-templates select="key('gallery.key', $refentryid)/inlinegraphic"/> + </xsl:otherwise> + </xsl:choose> + </td></tr> + </table> + </div> + </xsl:template> + + <!-- add anchors for index sections --> + <xsl:template match="indexdiv"> + <a><xsl:attribute name="name">idx<xsl:value-of select="./title"/></xsl:attribute></a> + <xsl:apply-templates/> + </xsl:template> + + <!-- add anchors for glossary sections --> + <xsl:template match="glossdiv"> + <a><xsl:attribute name="name">gls<xsl:value-of select="./title"/></xsl:attribute></a> + <xsl:apply-templates/> + </xsl:template> + + <!-- Exterminate any trace of indexterms in the main flow --> + <xsl:template match="indexterm"> + </xsl:template> + + <!-- Extra link on the right side of doc-blobs --> + <xsl:template name="user.format.extralinks"> + <xsl:if test="../ulink[@role='extralinks']"> + <span class="extralinks"> + <xsl:for-each select="../ulink[@role='extralinks']"> + <xsl:if test="position() = 1">[ </xsl:if> + <xsl:if test="position() > 1"> | </xsl:if> + <a> + <xsl:attribute name="href"><xsl:value-of select="@url"/></xsl:attribute> + <xsl:copy-of select="text()" /> + </a> + <xsl:if test="position() = last()"> ]</xsl:if> + </xsl:for-each> + </span> + </xsl:if> + <!--xsl:copy-of select="text()" /--> + <xsl:apply-templates/> + </xsl:template> + + <!-- this is not in use yet (see gtkdoc-mkdb + <xsl:template match="//refsect2/ulink[@role='extralinks']"/> + <xsl:template match="//refsect1/ulink[@role='extralinks']"/> + + <xsl:template match="//refsect2/title"> + <h3><xsl:call-template name="user.format.extralinks"/></h3> + </xsl:template> + + <xsl:template match="//refsect1/title"> + <h2><xsl:call-template name="user.format.extralinks"/></h2> + </xsl:template> + --> + + <!-- ==================================================================== --> + + <xsl:template match="acronym"> + <xsl:call-template name="generate.acronym.link"/> + </xsl:template> + + <xsl:template name="generate.acronym.link"> + <xsl:param name="acronym"> + <xsl:apply-templates/> + </xsl:param> + <!-- + We use for-each to change context to the database document because key() + only locates elements in the same document as the context node! + --> + + <xsl:param name="value" > + <xsl:value-of select="key('acronym.key', $acronym)/../glossdef/para[1]" /> + </xsl:param> + <xsl:choose> + <xsl:when test="$value=''"> + <!-- debug --> + <xsl:message> + In gtk-doc.xsl: For acronym (<xsl:value-of select="$acronym"/>) no value found! + </xsl:message> + <a> + <xsl:attribute name="href"> + <xsl:text>http://foldoc.org/</xsl:text> + <xsl:value-of select="$acronym"/> + </xsl:attribute> + <xsl:call-template name="inline.charseq"/> + </a> + </xsl:when> + <xsl:otherwise> + <!-- found --> + <acronym> + <xsl:attribute name="title"> + <xsl:value-of select="$value"/> + </xsl:attribute> + <xsl:call-template name="inline.charseq"/> + </acronym> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + +</xsl:stylesheet> diff --git a/doc/static/gtk-doc.css b/doc/static/gtk-doc.css new file mode 100644 index 0000000..5618926 --- /dev/null +++ b/doc/static/gtk-doc.css @@ -0,0 +1,264 @@ +.synopsis, .classsynopsis +{ + /* tango:aluminium 1/2 */ + background: #eeeeec; + border: solid 1px #d3d7cf; + padding: 0.5em; +} +.programlisting +{ + /* tango:sky blue 0/1 */ + background: #e6f3ff; + border: solid 1px #729fcf; + padding: 0.5em; +} +.variablelist +{ + padding: 4px; + margin-left: 3em; +} +.variablelist td:first-child +{ + vertical-align: top; +} + +@media screen { + sup a.footnote + { + position: relative; + top: 0em ! important; + } + /* this is needed so that the local anchors are displayed below the naviagtion */ + div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] + { + display: inline-block; + position: relative; + top:-5em; + } + /* this seems to be a bug in the xsl style sheets when generating indexes */ + div.index div.index + { + top: 0em; + } + /* make space for the fixed navigation bar and add space at the bottom so that + * link targets appear somewhat close to top + */ + body + { + padding-top: 3.2em; + padding-bottom: 20em; + } + /* style and size the navigation bar */ + table.navigation#top + { + position: fixed; + /* tango:scarlet red 0/1 */ + background: #ffe6e6; + border: solid 1px #ef2929; + margin-top: 0; + margin-bottom: 0; + top: 0; + left: 0; + height: 3em; + z-index: 10; + } + .navigation a, .navigation a:visited + { + /* tango:scarlet red 3 */ + color: #a40000; + } + .navigation a:hover + { + /* tango:scarlet red 1 */ + color: #ef2929; + } + td.shortcuts + { + /* tango:scarlet red 1 */ + color: #ef2929; + font-size: 80%; + white-space: nowrap; + } +} +@media print { + table.navigation { + visibility: collapse; + display: none; + } + div.titlepage table.navigation { + visibility: visible; + display: table; + /* tango:scarlet red 0/1 */ + background: #ffe6e6; + border: solid 1px #ef2929; + margin-top: 0; + margin-bottom: 0; + top: 0; + left: 0; + height: 3em; + } +} + +.navigation .title +{ + font-size: 200%; +} + +div.gallery-float +{ + float: left; + padding: 10px; +} +div.gallery-float img +{ + border-style: none; +} +div.gallery-spacer +{ + clear: both; +} + +a, a:visited +{ + text-decoration: none; + /* tango:sky blue 2 */ + color: #3465a4; +} +a:hover +{ + text-decoration: underline; + /* tango:sky blue 1 */ + color: #729fcf; +} + +div.table table +{ + border-collapse: collapse; + border-spacing: 0px; + /* tango:aluminium 3 */ + border: solid 1px #babdb6; +} + +div.table table td, div.table table th +{ + /* tango:aluminium 3 */ + border: solid 1px #babdb6; + padding: 3px; + vertical-align: top; +} + +div.table table th +{ + /* tango:aluminium 2 */ + background-color: #d3d7cf; +} + +hr +{ + /* tango:aluminium 3 */ + color: #babdb6; + background: #babdb6; + border: none 0px; + height: 1px; + clear: both; +} + +.footer +{ + padding-top: 3.5em; + /* tango:aluminium 3 */ + color: #babdb6; + text-align: center; + font-size: 80%; +} + +.warning +{ + /* tango:orange 0/1 */ + background: #ffeed9; + border-color: #ffb04f; +} +.note +{ + /* tango:chameleon 0/0.5 */ + background: #d8ffb2; + border-color: #abf562; +} +.note, .warning +{ + padding: 0.5em; + border-width: 1px; + border-style: solid; +} +.note h3, .warning h3 +{ + margin-top: 0.0em +} +.note p, .warning p +{ + margin-bottom: 0.0em +} + +/* blob links */ +h2 .extralinks, h3 .extralinks +{ + float: right; + /* tango:aluminium 3 */ + color: #babdb6; + font-size: 80%; + font-weight: normal; +} + +.annotation +{ + /* tango:aluminium 5 */ + color: #555753; + font-size: 80%; + font-weight: normal; +} + +/* code listings */ + +.listing_code .programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ +.listing_code .programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ +.listing_code .programlisting .function { color: #000000; font-weight: bold; } +.listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ +.listing_code .programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ +.listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ +.listing_code .programlisting .normal { color: #000000; } +.listing_code .programlisting .number { color: #75507b; } /* tango: plum 2 */ +.listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ +.listing_code .programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ +.listing_code .programlisting .type { color: #000000; } +.listing_code .programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ +.listing_code .programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */ + +.listing_frame { + /* tango:sky blue 1 */ + border: solid 1px #729fcf; + padding: 0px; +} + +.listing_lines, .listing_code { + margin-top: 0px; + margin-bottom: 0px; + padding: 0.5em; +} +.listing_lines { + /* tango:sky blue 0.5 */ + background: #a6c5e3; + /* tango:aluminium 6 */ + color: #2e3436; +} +.listing_code { + /* tango:sky blue 0 */ + background: #e6f3ff; +} +.listing_code .programlisting { + /* override from previous */ + border: none 0px; + padding: 0px; +} +.listing_lines pre, .listing_code pre { + margin: 0px; +} diff --git a/doc/static/home.png b/doc/static/home.png Binary files differnew file mode 100644 index 0000000..1700361 --- /dev/null +++ b/doc/static/home.png diff --git a/doc/static/left.png b/doc/static/left.png Binary files differnew file mode 100644 index 0000000..2d05b3d --- /dev/null +++ b/doc/static/left.png diff --git a/doc/static/right.png b/doc/static/right.png Binary files differnew file mode 100644 index 0000000..92832e3 --- /dev/null +++ b/doc/static/right.png diff --git a/doc/static/style.css b/doc/static/style.css new file mode 100644 index 0000000..700d011 --- /dev/null +++ b/doc/static/style.css @@ -0,0 +1,114 @@ +@import url("gtk-doc.css"); + +TABLE.navigation { + background-color: #238b49 !important; + border-width: 0 !important; + color: white; + font-family: Georgia, "Times New Roman", Times, serif; + height: 4em !important; +} + +TABLE.navigation TH { + font-size: 30pt !important; + font-weight: normal; + text-align: left !important; + padding-left: 10pt; +} + +TABLE.navigation TH:first-child { + padding-left: 40pt; +} + +.shortcuts { + color: white !important; +} + +.shortcuts a { + color: white !important; + font-family: Verdana, Arial, 'Bitstream Vera Sans', Helvetica, sans-serif; +} + +P.title { + font-size: 30pt !important; +} + +BODY { + padding-top: 5.5em !important; + margin: 0px; +} + + +/* Target all Firefox, since firefox has bug wrt TABLE + position: fixed */ +@-moz-document url-prefix() { + TABLE.navigation { position: static !important; } + BODY { padding-top: 0 !important; } +} + +DIV.book, +DIV.refentry, +DIV.chapter, +DIV.index, +DIV.footer, +DIV.section, +DIV.part { + font-family: Verdana, Arial, 'Bitstream Vera Sans', Helvetica, sans-serif; + font-size: 9.5pt; + line-height: 150%; +} + +BODY > DIV.book, +BODY > DIV.footer, +BODY > DIV.part { + margin-left: 1em; + margin-right: 1em; +} + +BODY > DIV.refentry, +BODY > DIV.chapter, +BODY > DIV.index, +BODY > DIV.section { + margin-left: 3em; + margin-right: 1em; +} + +DIV.variablelist TABLE { + font-size: 9.5pt; + line-height: 150%; +} + +DIV.refsect1, +DIV.refsect2, +DIV.refsynopsisdiv { + margin-bottom: 3em !important; +} + +H2 { + position: relative; + left: -1em; + font-weight: normal !important; +} + +H3 { + position: relative; + left: -1em; + font-weight: normal !important; +} + +DD > DL { + margin-top: 0.3em; + margin-bottom: 0.3em; +} + +PRE.screen { + border: solid 1px #729fcf; + padding: 0.5em; + background: #e6f3ff; +} + +CODE.option { + white-space: nowrap; +} + +SPAN.term { + padding-right: 1em; +}
\ No newline at end of file diff --git a/doc/static/up.png b/doc/static/up.png Binary files differnew file mode 100644 index 0000000..85b3e2a --- /dev/null +++ b/doc/static/up.png diff --git a/doc/version-greater-or-equal.xsl b/doc/version-greater-or-equal.xsl new file mode 100644 index 0000000..8edcd81 --- /dev/null +++ b/doc/version-greater-or-equal.xsl @@ -0,0 +1,54 @@ +<?xml version='1.0'?> <!--*- mode: xml -*--> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + version="1.0" + xmlns="http://www.w3.org/TR/xhtml1/transitional" + exclude-result-prefixes="#default"> + <xsl:template name="version-greater-or-equal"> + <xsl:param name="ver1"></xsl:param> + <xsl:param name="ver2"></xsl:param> + <xsl:variable name="vp1"> + <xsl:choose> + <xsl:when test="contains($ver1, '.')"> + <xsl:value-of select="substring-before($ver1, '.')"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$ver1"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:variable name="vp2"> + <xsl:choose> + <xsl:when test="contains($ver2, '.')"> + <xsl:value-of select="substring-before($ver2, '.')"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$ver2"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:choose> + <xsl:when test="$vp1 > $vp2"> + 1 + </xsl:when> + <xsl:when test="$vp1 < $vp2"> + 0 + </xsl:when> + <xsl:when test="$vp1 = $vp2"> + <xsl:choose> + <xsl:when test="contains($ver1, '.') and contains($ver2, '.')"> + <xsl:call-template name="version-greater-or-equal"> + <xsl:with-param name="ver1" select="substring-after($ver1, '.')"/> + <xsl:with-param name="ver2" select="substring-after($ver2, '.')"/> + </xsl:call-template> + </xsl:when> + <xsl:when test="contains($ver2, '.')"> + 0 + </xsl:when> + <xsl:otherwise> + 1 + </xsl:otherwise> + </xsl:choose> + </xsl:when> + </xsl:choose> +</xsl:template> +</xsl:stylesheet> diff --git a/tools/computer.c b/tools/computer.c index 359136a..42c3110 100644 --- a/tools/computer.c +++ b/tools/computer.c @@ -59,7 +59,7 @@ typedef enum { opt_domain_controller = 'S', opt_domain_ou = 'O', opt_host_fqdn = 'H', - opt_host_netbios = 'N', + opt_computer_name = 'N', opt_host_keytab = 'K', opt_login_user = 'U', opt_login_ccache = 'C', @@ -82,8 +82,8 @@ static adcli_tool_desc common_usages[] = { { opt_host_fqdn, "override the fully qualified domain name of the\n" "local machine" }, { opt_host_keytab, "filename for the host kerberos keytab" }, - { opt_host_netbios, "override the netbios short name of the local\n" - "machine" }, + { opt_computer_name, "override the netbios short name of the local\n" + "machine" }, { opt_login_ccache, "kerberos credential cache file which contains\n" "ticket to used to connect to the domain" }, { opt_login_user, "user (usually administrative) login name of\n" @@ -147,7 +147,7 @@ parse_option (Option opt, case opt_host_keytab: adcli_enroll_set_keytab_name (enroll, optarg); return; - case opt_host_netbios: + case opt_computer_name: adcli_conn_set_computer_name (conn, optarg); adcli_enroll_set_computer_name (enroll, optarg); return; @@ -209,8 +209,8 @@ parse_option (Option opt, } static void -parse_fqdn_or_netbios (adcli_enroll *enroll, - const char *arg) +parse_fqdn_or_name (adcli_enroll *enroll, + const char *arg) { if (strchr (arg, '.') != NULL) { adcli_enroll_set_host_fqdn (enroll, arg); @@ -235,20 +235,20 @@ adcli_tool_computer_join (adcli_conn *conn, struct option options[] = { { "domain", required_argument, NULL, opt_domain }, { "domain-realm", required_argument, NULL, opt_domain_realm }, - { "domain-server", required_argument, NULL, opt_domain_controller }, /* compat */ { "domain-controller", required_argument, NULL, opt_domain_controller }, - { "user", required_argument, NULL, opt_login_user }, /* compat */ + { "domain-server", required_argument, NULL, opt_domain_controller }, /* compat */ { "login-user", required_argument, NULL, opt_login_user }, + { "user", required_argument, NULL, opt_login_user }, /* compat */ { "login-ccache", required_argument, NULL, opt_login_ccache }, { "login-type", required_argument, NULL, opt_login_type }, { "host-fqdn", required_argument, 0, opt_host_fqdn }, - { "host-netbios", required_argument, 0, opt_host_netbios }, + { "computer-name", required_argument, 0, opt_computer_name }, { "host-keytab", required_argument, 0, opt_host_keytab }, { "no-password", no_argument, 0, opt_no_password }, { "stdin-password", no_argument, 0, opt_stdin_password }, { "prompt-password", no_argument, 0, opt_prompt_password }, - { "computer-ou", required_argument, NULL, opt_domain_ou }, /* compat */ { "domain-ou", required_argument, NULL, opt_domain_ou }, + { "computer-ou", required_argument, NULL, opt_domain_ou }, /* compat */ { "service-name", required_argument, NULL, opt_service_name }, { "show-details", no_argument, NULL, opt_show_details }, { "verbose", no_argument, NULL, opt_verbose }, @@ -354,10 +354,12 @@ adcli_tool_computer_preset (adcli_conn *conn, switch (opt) { case 'h': adcli_tool_usage (options, usages); + adcli_tool_usage (options, common_usages); return 0; case '?': case ':': adcli_tool_usage (options, usages); + adcli_tool_usage (options, common_usages); return 2; default: parse_option ((Option)opt, optarg, conn, enroll); @@ -382,7 +384,7 @@ adcli_tool_computer_preset (adcli_conn *conn, } for (i = 0; i < argc; i++) { - parse_fqdn_or_netbios (enroll, argv[i]); + parse_fqdn_or_name (enroll, argv[i]); if (reset_password) adcli_enroll_reset_computer_password (enroll); @@ -468,7 +470,7 @@ adcli_tool_computer_reset (adcli_conn *conn, adcli_get_last_error ()); } - parse_fqdn_or_netbios (enroll, argv[0]); + parse_fqdn_or_name (enroll, argv[0]); adcli_enroll_reset_computer_password (enroll); res = adcli_enroll_password (enroll, 0); @@ -543,7 +545,7 @@ adcli_tool_computer_delete (adcli_conn *conn, adcli_get_last_error ()); } - parse_fqdn_or_netbios (enroll, argv[0]); + parse_fqdn_or_name (enroll, argv[0]); res = adcli_enroll_delete (enroll, 0); if (res != ADCLI_SUCCESS) { |