docgen.pl
author Myhailo Danylenko <isbear@ukrpost.net>
Fri, 27 Mar 2009 01:46:53 +0200
changeset 64 bf7521ed96eb
parent 1 7d87d323c889
child 70 e43e386c8a33
permissions -rwxr-xr-x
Rewrite of ibb in object style
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
#! /usr/bin/perl
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
use strict;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
use warnings;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
my %docs;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
my @tags;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
my $inside;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
my $harvest;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
my @values;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
foreach my $file (@ARGV) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
	if ( not open SOURCE, '<', $file ) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
		print STDERR "Cannot open $file\n";
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
		next;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
	}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
	my $chunk = 0;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
	while (<SOURCE>) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
		if ( $inside ) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
			if ( not /^\/\/\// ) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
				$inside = 0;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
				$chunk++;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
			} elsif ( /^\/\/\/ G:/ ) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
				$inside = 0;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
				$harvest = 'V: ' . substr ( $_, 6 );
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
			} else {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
				push @{$docs{$file}[$chunk]}, substr ( $_, 4 );
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
			}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
		} elsif ( $harvest ) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
			if ( /\{\s*NULL.*\}/ ) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
				push @{$docs{$file}[$chunk]}, $harvest . ' ' . join ( ', ', @values );
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
				$harvest = undef;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
				@values  = ();
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
				$chunk++;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
			} elsif ( /\{\s*"(.+)".*\}/ ) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
				push @values, $1;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    39
			}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
		} else {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
			next if not /^\/\/\//;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
			$inside = 1;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
			my $tag = substr $_, 4;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
			chomp $tag;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    46
			push @{$docs{$file}[$chunk]}, $tag;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    47
			# hack to allow twoword objects be written in text with spaces
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
			# now it matches "lm message" instead of "lm message node" -.-
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    49
			# and even if tag list will be reverse sorted by length,
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
			# it will produce nested links...
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    51
			# well, that all is now solved, but in not too impressive way..
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
			$tag =~ s/_/./g;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
			push @tags, $tag;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
		}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
	}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    56
	
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
	close SOURCE;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    58
}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    59
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    60
print <<HEADER
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    61
<html>
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
<head><title>lua-loudmouth docs</title></head>
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    63
<body>
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    64
HEADER
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    66
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    67
@tags = reverse sort { length $a <=> length $b } @tags;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    68
# TODO preserve original order
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    69
foreach my $file ( sort keys %docs ) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    70
	print "<hr>";
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    71
	foreach my $chunk ( @{$docs{$file}} ) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    72
		my $head = shift @$chunk;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    73
		my $tag  = $head;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    74
		my $list = undef;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    75
		$tag =~ s/_/./g;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    76
		print "<a name='$tag'></a><h2>$head</h2><p>";
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    77
		foreach ( @$chunk ) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
			s/^A: /<br\/>Arguments: /;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    79
			s/^R: /<br\/>Return values: /;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
			s/^V: /<br\/>Values: /;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    81
			if ( $list ) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
				if ( /^\* / ) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
					s/^\* /<\/li><li>/;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    84
				} else {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
					s/^/<\/li><\/ul> /;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
					$list = undef;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    87
				}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
			} elsif ( /^\* / ) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    89
				s/^\* /<ul><li>/;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    90
				$list = 1;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    91
			}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    92
			foreach my $tag ( @tags ) {
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    93
				# TODO quotemeta required, but for now
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    94
				# this bug is rather desired...
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
				#s/\b$tag\b/<a href="#$tag">$&<\/a>/g;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
				s/(.)\b($tag)\b/ if ( $1 eq '#' or $1 eq '>' ) { "$1$2" } else { "$1<a href='#$tag'>$2<\/a>" } /ge;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    97
			}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
			print $_;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    99
		}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   100
		print "</li></ul>" if $list;
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   101
		print "</p>"
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   102
	}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   103
	print "<hr>";
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   104
}
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   105
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   106
print "</body></html>"
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   107
7d87d323c889 Fixes and improvement
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
# The end