From: Danilo Cesar Lemes de Paula <danilo.cesar@collabora.co.uk>
To: Daniel Vetter <daniel@ffwll.ch>
Cc: linux-doc@vger.kernel.org, Randy Dunlap <rdunlap@infradead.org>,
Daniel Vetter <daniel.vetter@ffwll.ch>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
intel-gfx <intel-gfx@lists.freedesktop.org>,
dri-devel <dri-devel@lists.freedesktop.org>
Subject: Re: [PATCH] scripts/kernel-doc: Adding cross-reference links to html documentation.
Date: Fri, 26 Jun 2015 11:11:29 -0300 [thread overview]
Message-ID: <558D5D91.8090301@collabora.co.uk> (raw)
In-Reply-To: <20150624212216.GK25769@phenom.ffwll.local>
On 06/24/2015 06:22 PM, Daniel Vetter wrote:
> On Wed, Jun 24, 2015 at 04:10:24PM -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: linux-doc@vger.kernel.org
>> Cc: intel-gfx <intel-gfx@lists.freedesktop.org>
>> Cc: dri-devel <dri-devel@lists.freedesktop.org>
>> ---
>> 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
>
> Already discussed on irc With Danilo but here for the record: I really
> like this since it massively improves the usefulness of the docbooks we
> have. One small thing I noticed though while clicking a bit more through
> the generated html: It also generates selflinks, i.e. drm_crtc_vblank_on
> links to itself. That one is a bit confusing. Could we filter out
> self-links somehow on the reference sections?
Yes we could! I'm sending a reviewed patch in a few minutes.
- Danilo Cesar
> -Daniel
>
>>
>> Documentation/DocBook/Makefile | 34 +++++---
>> scripts/kernel-doc-xml-ref | 176 +++++++++++++++++++++++++++++++++++++++++
>> 2 files changed, 197 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..756e897
>> --- /dev/null
>> +++ b/scripts/kernel-doc-xml-ref
>> @@ -0,0 +1,176 @@
>> +#!/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) . \"</function>\"",
>> + "<structname>(.*?)</structname>",
>> + "\"<structname>\" . convert_struct(\$1) . \"</structname>\"",
>> + "<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];
>> +
>> + $key = trim($key);
>> +
>> + $key =~ s/[^A-Za-z0-9]/-/g;
>> + $key = "API-" . $key;
>> +
>> + if (!has_key_defined($key)) {
>> + 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
>>
>
next prev parent reply other threads:[~2015-06-26 14:11 UTC|newest]
Thread overview: 8+ 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 [this message]
2015-06-26 15:08 ` [PATCH v2] " Danilo Cesar Lemes de Paula
2015-06-30 17:01 ` Daniel Vetter
2015-07-09 23:56 ` Jonathan Corbet
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=558D5D91.8090301@collabora.co.uk \
--to=danilo.cesar@collabora.co.uk \
--cc=daniel.vetter@ffwll.ch \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-doc@vger.kernel.org \
--cc=rdunlap@infradead.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox