Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753614AbbF3Q73 (ORCPT ); Tue, 30 Jun 2015 12:59:29 -0400 Received: from mail-wi0-f179.google.com ([209.85.212.179]:35083 "EHLO mail-wi0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752976AbbF3Q7V (ORCPT ); Tue, 30 Jun 2015 12:59:21 -0400 Date: Tue, 30 Jun 2015 19:01:38 +0200 From: Daniel Vetter To: Danilo Cesar Lemes de Paula Cc: linux-doc@vger.kernel.org, Randy Dunlap , Daniel Vetter , Laurent Pinchart , Jonathan Corbet , Herbert Xu , Stephan Mueller , Michal Marek , linux-kernel@vger.kernel.org, intel-gfx , dri-devel Subject: Re: [PATCH v2] scripts/kernel-doc: Adding cross-reference links to html documentation. Message-ID: <20150630170138.GC30960@phenom.ffwll.local> Mail-Followup-To: Danilo Cesar Lemes de Paula , linux-doc@vger.kernel.org, Randy Dunlap , Laurent Pinchart , Jonathan Corbet , Herbert Xu , Stephan Mueller , Michal Marek , linux-kernel@vger.kernel.org, intel-gfx , dri-devel References: <558D5D91.8090301@collabora.co.uk> <1435331337-22924-1-git-send-email-danilo.cesar@collabora.co.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1435331337-22924-1-git-send-email-danilo.cesar@collabora.co.uk> X-Operating-System: Linux phenom 4.0.0-rc3+ User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 9320 Lines: 310 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 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 from the DocBook XML to generate a database. Then it looks > for , and 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 > Cc: Randy Dunlap > Cc: Daniel Vetter > Cc: Laurent Pinchart > Cc: Jonathan Corbet > Cc: Herbert Xu > Cc: Stephan Mueller > Cc: Michal Marek > Cc: linux-kernel@vger.kernel.org > Cc: linux-doc@vger.kernel.org > Cc: intel-gfx > Cc: dri-devel 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 > --- > 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 ' \ > $(patsubst %.html,%,$(notdir $@))

' > $@ > +%.aux.xml: %.xml > + @rm -rf $@ > + (cat $< | egrep "^ $<.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 = ( > + "(.*?)", > + "\"\" . convert_function(\$1, \$line) . \"\"", > + "(.*?)", > + "\"\" . convert_struct(\$1) . \"\"", > + "(.*?)(.*?)", > + "\"\" . convert_param(\$1) . \"\$2\"", > + "(.*?)(.*?)", > + "\"\" . convert_param(\$1) . \"\$2\""); > + > +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 () { > + 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 prototype > + if (!has_key_defined($key) || $line =~ m/\s+ + return $arg; > + } > + > + my $head = $arg; > + my $tail = ""; > + if ($arg =~ /(.*?)( ?)$/) { > + $head = $1; > + $tail = $2; > + } > + return "$head$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 "$head$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 "$head$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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/