From: Daniel Vetter <daniel@ffwll.ch>
To: Danilo Cesar Lemes de Paula <danilo.cesar@collabora.co.uk>
Cc: linux-doc@vger.kernel.org, Randy Dunlap <rdunlap@infradead.org>,
Daniel Vetter <daniel.vetter@ffwll.ch>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Jonathan Corbet <corbet@lwn.net>,
Herbert Xu <herbert@gondor.apana.org.au>,
Stephan Mueller <smueller@chronox.de>,
Michal Marek <mmarek@suse.cz>,
linux-kernel@vger.kernel.org,
intel-gfx <intel-gfx@lists.freedesktop.org>,
dri-devel <dri-devel@lists.freedesktop.org>
Subject: Re: [PATCH v2] scripts/kernel-doc: Adding cross-reference links to html documentation.
Date: Tue, 30 Jun 2015 19:01:38 +0200 [thread overview]
Message-ID: <20150630170138.GC30960@phenom.ffwll.local> (raw)
In-Reply-To: <1435331337-22924-1-git-send-email-danilo.cesar@collabora.co.uk>
On Fri, Jun 26, 2015 at 12:08:57PM -0300, Danilo Cesar Lemes de Paula wrote:
> Functions, Structs and Parameters definitions on kernel documentation
> are pure cosmetic, it only highlights the element.
>
> To ease the navigation in the documentation we should use <links> inside
> those tags so readers can easily jump between methods directly.
>
> This was discussed in 2014[1] and is implemented by getting a list
> of <refentries> from the DocBook XML to generate a database. Then it looks
> for <function>,<structnames> and <paramdef> tags that matches the ones in
> the database. As it only links existent references, no broken links are
> added.
>
> [1] - lists.freedesktop.org/archives/dri-devel/2014-August/065404.html
>
> Signed-off-by: Danilo Cesar Lemes de Paula <danilo.cesar@collabora.co.uk>
> Cc: Randy Dunlap <rdunlap@infradead.org>
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Cc: Jonathan Corbet <corbet@lwn.net>
> Cc: Herbert Xu <herbert@gondor.apana.org.au>
> Cc: Stephan Mueller <smueller@chronox.de>
> Cc: Michal Marek <mmarek@suse.cz>
> Cc: linux-kernel@vger.kernel.org
> Cc: linux-doc@vger.kernel.org
> Cc: intel-gfx <intel-gfx@lists.freedesktop.org>
> Cc: dri-devel <dri-devel@lists.freedesktop.org>
I'm using this now to generate the drm docbook and I think it's a great
improvement for them. No r-b since I can't really perl.
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> ---
> To understand a bit more of what this patch is trying to acomplish you can find
> two examples of the old and new htmldocs outputs:
> OLD: https://people.collabora.com/~danilo/intel/Documentation.old/DocBook/drm/API-drm-crtc-vblank-on.html
> NEW: https://people.collabora.com/~danilo/intel/Documentation.new/DocBook/drm/API-drm-crtc-vblank-on.html
>
> Documentation/DocBook/Makefile | 34 +++++---
> scripts/kernel-doc-xml-ref | 181 +++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 202 insertions(+), 13 deletions(-)
> create mode 100755 scripts/kernel-doc-xml-ref
>
> diff --git a/Documentation/DocBook/Makefile b/Documentation/DocBook/Makefile
> index b6a6a2e..8aea45a 100644
> --- a/Documentation/DocBook/Makefile
> +++ b/Documentation/DocBook/Makefile
> @@ -64,8 +64,9 @@ installmandocs: mandocs
>
> ###
> #External programs used
> -KERNELDOC = $(srctree)/scripts/kernel-doc
> -DOCPROC = $(objtree)/scripts/docproc
> +KERNELDOCXMLREF = $(srctree)/scripts/kernel-doc-xml-ref
> +KERNELDOC = $(srctree)/scripts/kernel-doc
> +DOCPROC = $(objtree)/scripts/docproc
>
> XMLTOFLAGS = -m $(srctree)/$(src)/stylesheet.xsl
> XMLTOFLAGS += --skip-validation
> @@ -89,7 +90,7 @@ define rule_docproc
> ) > $(dir $@).$(notdir $@).cmd
> endef
>
> -%.xml: %.tmpl $(KERNELDOC) $(DOCPROC) FORCE
> +%.xml: %.tmpl $(KERNELDOC) $(DOCPROC) $(KERNELDOCXMLREF) FORCE
> $(call if_changed_rule,docproc)
>
> # Tell kbuild to always build the programs
> @@ -139,8 +140,12 @@ quiet_cmd_db2html = HTML $@
> cmd_db2html = xmlto html $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \
> echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/index.html"> \
> $(patsubst %.html,%,$(notdir $@))</a><p>' > $@
> +%.aux.xml: %.xml
> + @rm -rf $@
> + (cat $< | egrep "^<refentry id" | egrep -o "\".*\"" | cut -f 2 -d \" > $<.db)
> + $(KERNELDOCXMLREF) -db $<.db $< > $@
>
> -%.html: %.xml
> +%.html: %.aux.xml
> @(which xmlto > /dev/null 2>&1) || \
> (echo "*** You need to install xmlto ***"; \
> exit 1)
> @@ -209,15 +214,18 @@ dochelp:
> ###
> # Temporary files left by various tools
> clean-files := $(DOCBOOKS) \
> - $(patsubst %.xml, %.dvi, $(DOCBOOKS)) \
> - $(patsubst %.xml, %.aux, $(DOCBOOKS)) \
> - $(patsubst %.xml, %.tex, $(DOCBOOKS)) \
> - $(patsubst %.xml, %.log, $(DOCBOOKS)) \
> - $(patsubst %.xml, %.out, $(DOCBOOKS)) \
> - $(patsubst %.xml, %.ps, $(DOCBOOKS)) \
> - $(patsubst %.xml, %.pdf, $(DOCBOOKS)) \
> - $(patsubst %.xml, %.html, $(DOCBOOKS)) \
> - $(patsubst %.xml, %.9, $(DOCBOOKS)) \
> + $(patsubst %.xml, %.dvi, $(DOCBOOKS)) \
> + $(patsubst %.xml, %.aux, $(DOCBOOKS)) \
> + $(patsubst %.xml, %.tex, $(DOCBOOKS)) \
> + $(patsubst %.xml, %.log, $(DOCBOOKS)) \
> + $(patsubst %.xml, %.out, $(DOCBOOKS)) \
> + $(patsubst %.xml, %.ps, $(DOCBOOKS)) \
> + $(patsubst %.xml, %.pdf, $(DOCBOOKS)) \
> + $(patsubst %.xml, %.html, $(DOCBOOKS)) \
> + $(patsubst %.xml, %.9, $(DOCBOOKS)) \
> + $(patsubst %.xml, %.aux.xml, $(DOCBOOKS)) \
> + $(patsubst %.xml, %.xml.db, $(DOCBOOKS)) \
> + $(patsubst %.xml, %.xml, $(DOCBOOKS)) \
> $(index)
>
> clean-dirs := $(patsubst %.xml,%,$(DOCBOOKS)) man
> diff --git a/scripts/kernel-doc-xml-ref b/scripts/kernel-doc-xml-ref
> new file mode 100755
> index 0000000..c61cdad
> --- /dev/null
> +++ b/scripts/kernel-doc-xml-ref
> @@ -0,0 +1,181 @@
> +#!/usr/bin/perl -w
> +
> +use strict;
> +
> +## Copyright (C) 2015 Intel Corporation ##
> +# ##
> +## This software falls under the GNU General Public License. ##
> +## Please read the COPYING file for more information ##
> +#
> +#
> +# This software reads a XML file and a list of valid interal
> +# references to replace Docbook tags with links.
> +#
> +# usage:
> +# kernel-doc-xml-ref -db filename
> +# xml filename > outputfile
> +
> +# read arguments
> +if ($#ARGV != 2) {
> + usage();
> +}
> +
> +#Holds the database filename
> +my $databasefile;
> +my @database;
> +
> +#holds the inputfile
> +my $inputfile;
> +my $errors = 0;
> +
> +my %highlights = (
> + "<function>(.*?)</function>",
> + "\"<function>\" . convert_function(\$1, \$line) . \"</function>\"",
> + "<structname>(.*?)</structname>",
> + "\"<structname>\" . convert_struct(\$1) . \"</structname>\"",
> + "<funcdef>(.*?)<function>(.*?)</function></funcdef>",
> + "\"<funcdef>\" . convert_param(\$1) . \"<function>\$2</function></funcdef>\"",
> + "<paramdef>(.*?)<parameter>(.*?)</parameter></paramdef>",
> + "\"<paramdef>\" . convert_param(\$1) . \"<parameter>\$2</parameter></paramdef>\"");
> +
> +while($ARGV[0] =~ m/^-(.*)/) {
> + my $cmd = shift @ARGV;
> + if ($cmd eq "-db") {
> + $databasefile = shift @ARGV
> + }
> +}
> +$inputfile = shift @ARGV;
> +
> +sub open_database {
> + open my $handle, '<', $databasefile;
> + chomp(my @lines = <$handle>);
> + close $handle;
> +
> + @database = @lines;
> +}
> +
> +sub process_file {
> + open_database();
> +
> + my $dohighlight;
> + foreach my $pattern (keys %highlights) {
> + $dohighlight .= "\$line =~ s:$pattern:$highlights{$pattern}:eg;\n";
> + }
> +
> + open(FILE, $inputfile) or die("Could not open $inputfile");
> + foreach my $line (<FILE>) {
> + eval $dohighlight;
> + print $line;
> + }
> +}
> +
> +sub trim($_)
> +{
> + my $str = $_[0];
> + $str =~ s/^\s+|\s+$//g;
> + return $str
> +}
> +
> +sub has_key_defined($_)
> +{
> + if ( grep( /^$_[0]$/, @database)) {
> + return 1;
> + }
> + return 0;
> +}
> +
> +sub convert_function($_)
> +{
> + my $arg = $_[0];
> + my $key = $_[0];
> +
> + my $line = $_[1];
> +
> + $key = trim($key);
> +
> + $key =~ s/[^A-Za-z0-9]/-/g;
> + $key = "API-" . $key;
> +
> + # We shouldn't add links to <funcdef> prototype
> + if (!has_key_defined($key) || $line =~ m/\s+<funcdef/i) {
> + return $arg;
> + }
> +
> + my $head = $arg;
> + my $tail = "";
> + if ($arg =~ /(.*?)( ?)$/) {
> + $head = $1;
> + $tail = $2;
> + }
> + return "<link linkend=\"$key\">$head</link>$tail";
> +}
> +sub convert_struct($_)
> +{
> + my $arg = $_[0];
> + my $key = $_[0];
> + $key =~ s/(struct )?(\w)/$2/g;
> + $key =~ s/[^A-Za-z0-9]/-/g;
> + $key = "API-struct-" . $key;
> +
> + if (!has_key_defined($key)) {
> + return $arg;
> + }
> +
> + my ($head, $tail) = split_pointer($arg);
> + return "<link linkend=\"$key\">$head</link>$tail";
> +}
> +
> +sub split_pointer($_)
> +{
> + my $arg = $_[0];
> + if ($arg =~ /(.*?)( ?\* ?)/) {
> + return ($1, $2);
> + }
> + return ($arg, "");
> +}
> +
> +sub convert_param($_)
> +{
> + my $type = $_[0];
> + my $keyname = convert_key_name($type);
> +
> + if (!has_key_defined($keyname)) {
> + return $type;
> + }
> +
> + my ($head, $tail) = split_pointer($type);
> + return "<link linkend=\"$keyname\">$head</link>$tail";
> +
> +}
> +
> +sub convert_key_name($_)
> +{
> + #Pattern $2 is optional and might be uninitialized
> + no warnings 'uninitialized';
> +
> + my $str = $_[0];
> + $str =~ s/(const|static)? ?(struct)? ?([a-zA-Z0-9_]+) ?(\*|&)?/$2 $3/g ;
> +
> + # trim
> + $str =~ s/^\s+|\s+$//g;
> +
> + # spaces and _ to -
> + $str =~ s/[^A-Za-z0-9]/-/g;
> +
> + return "API-" . $str;
> +}
> +
> +sub usage {
> + print "Usage: $0 -db database filename ]\n";
> + print " xml source file(s) > outputfile\n";
> + exit 1;
> +}
> +
> +# starting point
> +process_file();
> +
> +if ($errors) {
> + print STDERR "$errors errors\n";
> +}
> +
> +exit($errors);
> --
> 2.1.4
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
next prev parent reply other threads:[~2015-06-30 17:01 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-24 19:10 [PATCH] scripts/kernel-doc: Adding cross-reference links to html documentation Danilo Cesar Lemes de Paula
2015-06-24 21:22 ` Daniel Vetter
2015-06-26 14:11 ` Danilo Cesar Lemes de Paula
2015-06-26 15:08 ` [PATCH v2] " Danilo Cesar Lemes de Paula
2015-06-26 15:08 ` Danilo Cesar Lemes de Paula
2015-06-30 17:01 ` Daniel Vetter [this message]
2015-07-09 23:56 ` Jonathan Corbet
2015-07-13 20:19 ` Danilo Cesar Lemes de Paula
2015-07-13 20:19 ` Danilo Cesar Lemes de Paula
2015-07-13 20:32 ` [PATCH v3] " Danilo Cesar Lemes de Paula
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150630170138.GC30960@phenom.ffwll.local \
--to=daniel@ffwll.ch \
--cc=corbet@lwn.net \
--cc=daniel.vetter@ffwll.ch \
--cc=danilo.cesar@collabora.co.uk \
--cc=dri-devel@lists.freedesktop.org \
--cc=herbert@gondor.apana.org.au \
--cc=intel-gfx@lists.freedesktop.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mmarek@suse.cz \
--cc=rdunlap@infradead.org \
--cc=smueller@chronox.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.