--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docgen.pl Sun Feb 01 21:28:57 2009 +0200
@@ -0,0 +1,81 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+my %docs;
+my @tags;
+my $inside;
+
+foreach my $file (@ARGV) {
+ if ( not open SOURCE, '<', $file ) {
+ print STDERR "Cannot open $file\n";
+ next;
+ }
+
+ my $chunk = 0;
+
+ while (<SOURCE>) {
+ if ( $inside ) {
+ if ( not /^\/\/\// ) {
+ $inside = 0;
+ $chunk++;
+ } else {
+ push @{$docs{$file}[$chunk]}, substr ( $_, 4 );
+ }
+ } else {
+ next if not /^\/\/\//;
+
+ $inside = 1;
+ my $tag = substr $_, 4;
+ chomp $tag;
+ push @{$docs{$file}[$chunk]}, $tag;
+ # hack to allow twoword objects be written in text with spaces
+ # now it matches "lm message" instead of "lm message node" -.-
+ # and even if tag list will be reverse sorted by length,
+ # it will produce nested links...
+ # well, that all is now solved, but in not too impressive way..
+ $tag =~ s/_/./g;
+ push @tags, $tag;
+ }
+ }
+
+ close SOURCE;
+}
+
+print <<HEADER
+<html>
+<head><title>lua-loudmouth docs</title></head>
+<body>
+HEADER
+;
+
+@tags = reverse sort { length $a <=> length $b } @tags;
+# TODO preserve original order
+foreach my $file ( sort keys %docs ) {
+ print "<hr>";
+ foreach my $chunk ( @{$docs{$file}} ) {
+ my $head = shift @$chunk;
+ my $tag = $head;
+ $tag =~ s/_/./g;
+ print "<a name='$tag'></a><h2>$head</h2><p>";
+ foreach ( @$chunk ) {
+ s/^A: /<br\/>Arguments: /;
+ s/^R: /<br\/>Return values: /;
+ s/^V: /<br\/>Values: /;
+ foreach my $tag ( @tags ) {
+ # TODO quotemeta required, but for now
+ # this bug is rather desired...
+ #s/\b$tag\b/<a href="#$tag">$&<\/a>/g;
+ s/(.)\b($tag)\b/ if ( $1 eq '#' or $1 eq '>' ) { "$1$2" } else { "$1<a href='#$tag'>$2<\/a>" } /ge;
+ }
+ print $_;
+ }
+ print "</p>"
+ }
+ print "<hr>";
+}
+
+print "</body></html>"
+
+# The end