#!/usr/bin/env perl # $Id$ our $html = ""; our $title = "Milsko GUI Toolkit Documentation"; our @pathlist = ("include"); our @notes = ("warning", "unsure", "note", "info"); our @files = (); our %files_sections = (); sub sentence { my $str = $_[0]; $str =~ s/([^\.])$/\1./g; $str =~ s/`(.+?)`/\1<\/code>/g; $str =~ s/\*{3}(.+?)\*{3}/\1<\/i><\/b>/g; $str =~ s/\*{2}(.+?)\*{2}/\1<\/b>/g; $str =~ s/\*(.+?)\*/\1<\/i>/g; return $str; } sub out { $html = $html . "$_[0]\n"; } sub arguments { my ($args) = @_; my $out = ""; my @arglist = split(/[ \t]*,[ \t]*/, $args); $out = $out . " (\n"; foreach my $str (@arglist) { $out = $out . "\t$str"; if ($str eq $arglist[ 0 + @arglist - 1 ]) { $out = $out . "\n"; } else { $out = $out . ",\n"; } } $out = $out . ")"; return $out; } sub replace_special { my $ret = $_[0]; $ret =~ s/[\r\n]+//g; $ret =~ s/[^A-Za-z0-9_]/_/g; return $ret; } sub highlight { my $txt = ""; my $app = 0; open(DOCPL, ">", "/tmp/docpl"); print(DOCPL $_[0] . "\n"); close(DOCPL); open(DOCIN, "cat /tmp/docpl | enscript -q -whtml --color -Ec -o - |"); while (my $l = ) { $l =~ s/\r?\n$//g; if ($l =~ /\/i) { $app = 1; } elsif ($l =~ /\<\/pre\>/i) { $app = 0; } elsif ($app) { $txt = $txt . "\n" . $l; } } close(DOCIN); $txt =~ s/[\r\n]+$//g; $txt =~ s/^[\r\n]+//g; return $txt; } sub scan_dir { my ($first, $path) = @_; $path =~ s/\/+$//g; if (opendir(my $dh, $path)) { print(STDERR "Scanning $path\n"); my @paths = sort(readdir($dh)); foreach my $p (@paths) { if ($p eq '.' || $p eq '..' || $p eq 'MwOO') { next; } scan_dir($first, $path . "/" . $p); } closedir($dh); } else { my $spaces = ""; my $in = 0; my $out = 0; my $file = 0; my $has_file = 0; my %kv = (); my %param = (); my @paramlist = (); my $current = ""; print(STDERR "$path is a file\n"); open(IN, "<", "$path"); while (my $l = ) { my $l2 = $l; $l =~ s/[\r\n]+$//g; $l2 =~ s/[\r\n \t]+//g; if (length($l2) == 0) { next; } if ($out) { my $para = "dt"; my $brief = $kv{brief} or ""; $brief = sentence($brief); $out = 0; if (!$has_file) { print(STDERR "Warning: missing comment with %file, ignoring\n"); next; } if (!defined($kv{brief})) { print(STDERR "Warning: comment missing %brief, ignoring\n"); next; } if (!$file && defined($kv{brief})) { my $id = ""; my $sl = ""; my $attr = ""; $para = "dd"; $l =~ s/[ \t]+/ /g; $l =~ s/[ ]*(?:\\|,[ ]*)$//g; $l =~ s/[ ]*(?:;|\{.*)[ ]*$/;/g; if (!($l =~ /^#/)) { $l =~ s/\(([^\)]+)\)/arguments($1)/ge; } $sl = $l; $sl =~ s/\n//g; $sl =~ s/=.+$//g; $sl =~ s/^.+[ \t]+([^ ]+)[ \t]*\(.+\);?$/\1/g; $sl =~ s/^.+[ \t]+([^ ]+);$/\1/g; $id = replace_special($current . "__" . $sl); $attr = " id=\"$id\""; if (!defined($files_sections{ replace_special($current) })) { @{ $files_sections{ replace_special($current) } } = (); } push(@{ $files_sections{ replace_special($current) } }, $sl); out("" . highlight($l) . ""); } out("
"); out("<$para>"); out(" $brief"); out(""); foreach my $note (@notes) { if (defined($kv{$note})) { out("
"); out( "
\"$note\"" . sentence($kv{$note}) . "
"); out("
"); } } foreach my $p (@paramlist) { out("
"); out(" Parameter $p"); out("
"); out("
"); out(" " . sentence($param{$p})); out("
"); } if (defined($kv{return})) { out("
"); out(" Returns"); out("
"); out("
"); out(" " . sentence($kv{return})); out("
"); } out("
"); out("
"); } elsif ($l =~ /^([ \t]*)\/\*\!/) { $spaces = $1; $in = 1; $file = 0; %kv = (); %param = (); @paramlist = (); } elsif ($in && ($l =~ /^$spaces \*\//)) { $in = 0; $out = 1; } elsif ($in && ($l =~ /^$spaces \*[ \t]+%([^ ]+)(?:[ \t]+(.+))?$/)) { $kv{$1} = $2; if ($1 eq "file") { if (!$has_file) { out( "

$2

"); push(@files, $2); } $file = 1; $has_file = 1; $current = $2; } elsif ($1 eq "param") { my $p = $2; $p =~ /^([^ ]+)(?:[ \t]+(.+))?$/; $param{$1} = $2; push(@paramlist, $1); } } } close(IN); } } out(""); out(" "); out(" "); out(" $title"); out(" "); out(" "); out("

$title

"); out("
"); out("

Table of Contents

"); my $old = $html; $html = ""; foreach my $f (@pathlist) { scan_dir($f, $f); } my $stuff = $html; $html = $old; out("
"); foreach my $f (@files) { out("
"); out(" $f"); out("
"); foreach my $sect (@{ $files_sections{ replace_special($f) } }) { out("
"); out( " $sect"); out("
"); } } out("
"); out("
"); $html = $html . $stuff; out(" "); out(""); open(OUT, ">", "doc/index.html"); print(OUT $html); close(OUT);