public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
* [PATCH] scripts/kernel-doc: Adding cross-reference links to html documentation.
@ 2015-06-24 19:10 Danilo Cesar Lemes de Paula
  2015-06-24 21:22 ` Daniel Vetter
  0 siblings, 1 reply; 8+ messages in thread
From: Danilo Cesar Lemes de Paula @ 2015-06-24 19:10 UTC (permalink / raw)
  To: linux-doc
  Cc: Danilo Cesar Lemes de Paula, Randy Dunlap, Daniel Vetter,
	Laurent Pinchart, intel-gfx, dri-devel

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

 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


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] scripts/kernel-doc: Adding cross-reference links to html documentation.
  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
  0 siblings, 1 reply; 8+ messages in thread
From: Daniel Vetter @ 2015-06-24 21:22 UTC (permalink / raw)
  To: Danilo Cesar Lemes de Paula
  Cc: linux-doc, Daniel Vetter, intel-gfx, Randy Dunlap, dri-devel,
	Laurent Pinchart

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?
-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
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] scripts/kernel-doc: Adding cross-reference links to html documentation.
  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
  0 siblings, 1 reply; 8+ messages in thread
From: Danilo Cesar Lemes de Paula @ 2015-06-26 14:11 UTC (permalink / raw)
  To: Daniel Vetter
  Cc: linux-doc, Randy Dunlap, Daniel Vetter, Laurent Pinchart,
	intel-gfx, dri-devel

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
>>
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2] scripts/kernel-doc: Adding cross-reference links to html documentation.
  2015-06-26 14:11   ` Danilo Cesar Lemes de Paula
@ 2015-06-26 15:08     ` Danilo Cesar Lemes de Paula
  2015-06-30 17:01       ` Daniel Vetter
  2015-07-09 23:56       ` Jonathan Corbet
  0 siblings, 2 replies; 8+ messages in thread
From: Danilo Cesar Lemes de Paula @ 2015-06-26 15:08 UTC (permalink / raw)
  To: linux-doc
  Cc: Michal Marek, Herbert Xu, Danilo Cesar Lemes de Paula,
	Jonathan Corbet, Stephan Mueller, Daniel Vetter, intel-gfx,
	Randy Dunlap, linux-kernel, dri-devel, Laurent Pinchart

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>
---
 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

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] scripts/kernel-doc: Adding cross-reference links to html documentation.
  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
  1 sibling, 0 replies; 8+ messages in thread
From: Daniel Vetter @ 2015-06-30 17:01 UTC (permalink / raw)
  To: Danilo Cesar Lemes de Paula
  Cc: linux-doc, Randy Dunlap, Daniel Vetter, Laurent Pinchart,
	Jonathan Corbet, Herbert Xu, Stephan Mueller, Michal Marek,
	linux-kernel, intel-gfx, dri-devel

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

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] scripts/kernel-doc: Adding cross-reference links to html documentation.
  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
  1 sibling, 1 reply; 8+ messages in thread
From: Jonathan Corbet @ 2015-07-09 23:56 UTC (permalink / raw)
  To: Danilo Cesar Lemes de Paula
  Cc: linux-doc, Randy Dunlap, Daniel Vetter, Laurent Pinchart,
	Herbert Xu, Stephan Mueller, Michal Marek, linux-kernel,
	intel-gfx, dri-devel

On Fri, 26 Jun 2015 12:08:57 -0300
Danilo Cesar Lemes de Paula <danilo.cesar@collabora.co.uk> wrote:

> 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.

So I put a lot more time into this today than I really had available.  I
think it's cool stuff, and we definitely want it.  But can I ask for one
more pass?  In particular:

 - It makes the docs build a lot more noisy, that would be nice to fix.

 - A bit more documentation in the script would be nice.  It also is happy
   to run with silly arguments; a detail since nobody will run it
   directly, but still...

 - Most importantly, it breaks "make htmldocs"; in particular, vast
   amounts of error spew results when it gets around to media_api.html.  I
   spent a while trying to figure out what was going on but didn't come up
   with anything conclusive; my suspicion is that it has to do with the
   separate makefile in Documentation/DocBook/media/.

Thanks,

jon

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] scripts/kernel-doc: Adding cross-reference links to html documentation.
  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
  0 siblings, 1 reply; 8+ messages in thread
From: Danilo Cesar Lemes de Paula @ 2015-07-13 20:19 UTC (permalink / raw)
  To: Jonathan Corbet
  Cc: Michal Marek, Herbert Xu, linux-doc, Stephan Mueller,
	Daniel Vetter, intel-gfx, Randy Dunlap, linux-kernel, dri-devel,
	Laurent Pinchart

On 07/09/2015 08:56 PM, Jonathan Corbet wrote:
> On Fri, 26 Jun 2015 12:08:57 -0300
> Danilo Cesar Lemes de Paula <danilo.cesar@collabora.co.uk> wrote:
> 
>> 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.
> 
> So I put a lot more time into this today than I really had available.  I

Thanks, I really appreciate that.

> think it's cool stuff, and we definitely want it.  But can I ask for one
> more pass?  In particular:
> 
>  - It makes the docs build a lot more noisy, that would be nice to fix.

Fair enough. It was showing all the commands. I did change that to a
fancy "XMLREF  Documentation/DocBook/FooBar.xml" message.

> 
>  - A bit more documentation in the script would be nice.  It also is happy
>    to run with silly arguments; a detail since nobody will run it
>    directly, but still...

I did improve the documentation and also fixed the silly argument thing.

> 
>  - Most importantly, it breaks "make htmldocs"; in particular, vast
>    amounts of error spew results when it gets around to media_api.html.  I
>    spent a while trying to figure out what was going on but didn't come up
>    with anything conclusive; my suspicion is that it has to do with the
>    separate makefile in Documentation/DocBook/media/.

I'm not sure about this.
media-api is spitting lots of warnings with or without the documentation
patch.
I compared the number of files and they're the same (excepting those
auxiliary db files). For me, both builds actually spits 2825 lines on
STDERR...

I also did a smoke check in the media-api html documentation and it
looks fine.

Would you mind to check again if it happens with the v3 of my patch I'm
sending next?

Danilo
> 
> Thanks,
> 
> jon
> 
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v3] scripts/kernel-doc: Adding cross-reference links to html documentation.
  2015-07-13 20:19         ` Danilo Cesar Lemes de Paula
@ 2015-07-13 20:32           ` Danilo Cesar Lemes de Paula
  0 siblings, 0 replies; 8+ messages in thread
From: Danilo Cesar Lemes de Paula @ 2015-07-13 20:32 UTC (permalink / raw)
  To: linux-doc
  Cc: Danilo Cesar Lemes de Paula, Randy Dunlap, Daniel Vetter,
	Laurent Pinchart, Jonathan Corbet, Herbert Xu, Stephan Mueller,
	Michal Marek, linux-kernel, intel-gfx, dri-devel

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>
---
 CHANGELOG
 v3:
   * Add a "XMLREF FooBar.xml" as build output to reduce build noise.
   * Make kernel-doc-xml-ref ignore invalid arguments.
   * Improve kernel-doc-xml-ref documentation.


 Documentation/DocBook/Makefile |  42 ++++++---
 scripts/kernel-doc-xml-ref     | 198 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 227 insertions(+), 13 deletions(-)
 create mode 100755 scripts/kernel-doc-xml-ref

diff --git a/Documentation/DocBook/Makefile b/Documentation/DocBook/Makefile
index b6a6a2e..16a6d94 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
@@ -140,7 +141,19 @@ quiet_cmd_db2html = HTML    $@
 		echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/index.html"> \
 		$(patsubst %.html,%,$(notdir $@))</a><p>' > $@
 
-%.html:	%.xml
+###
+# Rules to create an aux XML and .db, and use them to re-process the DocBook XML
+# to fill internal hyperlinks
+       gen_aux_xml = :
+ quiet_gen_aux_xml = echo '  XMLREF  $@'
+silent_gen_aux_xml = :
+%.aux.xml: %.xml
+	@$($(quiet)gen_aux_xml)
+	@rm -rf $@
+	@(cat $< | egrep "^<refentry id" | egrep -o "\".*\"" | cut -f 2 -d \" > $<.db)
+	@$(KERNELDOCXMLREF) -db $<.db $< > $@
+
+%.html:	%.aux.xml
 	@(which xmlto > /dev/null 2>&1) || \
 	 (echo "*** You need to install xmlto ***"; \
 	  exit 1)
@@ -209,15 +222,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..104a5a5
--- /dev/null
+++ b/scripts/kernel-doc-xml-ref
@@ -0,0 +1,198 @@
+#!/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.
+#
+# The list of "valid internal references" must be one-per-line in the following format:
+#      API-struct-foo
+#      API-enum-bar
+#      API-my-function
+#
+# The software walks over the XML file looking for xml tags representing possible references
+# to the Document. Each reference will be cross checked against the "Valid Internal Reference" list. If
+# the referece is found it replaces its content by a <link> tag.
+#
+# 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
+	} else {
+		usage();
+	}
+}
+$inputfile = shift @ARGV;
+
+sub open_database {
+	open (my $handle, '<', $databasefile) or die "Cannot open $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") or die ("Cannot 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;
+}
+
+# Gets a <function> content and add it a hyperlink if possible.
+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";
+}
+
+# Converting a struct text to link
+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";
+}
+
+# Identify "object *" elements
+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";
+
+}
+
+# DocBook links are in the API-<TYPE>-<STRUCT-NAME> format
+# This method gets an element and returns a valid DocBook reference for it.
+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


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-07-13 20:32 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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-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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox