#!/usr/bin/perl if ($ARGV[0] eq "-h"){ $sourcedir = $ARGV[1]; $dir = $sourcedir; $html = 1; shift @ARGV; shift @ARGV; } if ($ARGV[0] eq "-t"){ $dir = $ARGV[1]; shift @ARGV; } if ($html){ opendir (D, "$sourcedir/sources/") || die "Can not open $dir"; while ($n = readdir (D)){ if ($n =~ /mono-api-.*\.html$/){ open (IN, "$sourcedir/sources/$n") || die "Can not open $n"; $files[$filecount] = $n; while (){ @files_content[$filecount] .= $_; if (/name="api:(.*?)"/){ $_ =~ s/.*name="api:(\w+?)".*/\1/; $apis[$filecount] .= "$_"; } } $filecount++; close IN; } } } while (){ if (/\/\*\* *\n/){ &process_doc; } else { #print "IGNORING: $_"; } } if ($html){ for ($f = 0; $f < $filecount; $f++){ $name = $files[$f]; open (OUT, "> $dir/html/$name") || die "Can not create $dir/html/$name"; print "Merging: $name\n"; print OUT< $name EOF @a = split (/\n/, $files_content[$f]); for ($ai = 0; $ai < $#a; $ai++){ $line = $a[$ai]; ($api,$caption) = $line =~ /

(\w+)<\/a><\/h4>/; if ($api ne ""){ if ($api_shown == 1){ print OUT ""; } $api_shown = 1; $proto = $prototype{$api}; if ($proto eq ""){ $proto = "Prototype: $api"; } print OUT<
$api
$proto

EOF &opt_print ("Parameters", $arguments{$api}, 1); &opt_print ("Returns", $returns{$api}, 1); &opt_print ("Remarks", $bodies{$api}, 0); print OUT "\n"; } else { if ($line =~ /@API_IDX@/){ $apis_toc = &create_toc ($apis[$f]); $line =~ s/\@API_IDX\@/$apis_toc/; } if ($line =~ /^"; $api_shown = 0; } print OUT "$line\n"; } } print OUT< EOF close OUT; system ("$ENV{runtimedir}/mono-wrapper convert.exe $dir/html/$name $dir/html/x-$name"); # clean up the mess that AgilityPack does, it CDATAs our CSS open HACK, "$dir/html/x-$name" || die "Could not open $dir/html/x-$name"; open HACKOUT, ">$dir/deploy/$name" || die "Could not open output"; while (){ s/^\/\/\/\///; print HACKOUT $_; } #system ("cp.exe $dir/html/$name $dir/deploy/$name"); } } sub process_doc { $doc = ""; $func = <>; chop $func; $func =~ s/^ \* //; $func =~ s/:$//; print "Function: $func\n" if (!$html); $args = ""; $inbody = 0; $returns = ""; $body = ""; $functions[$fn++] = $func; # Process arguments while (<>){ if (/^ \*\*?\//){ $body =~ s/[@#](\w+)/\1<\/i>/g; $returns =~ s/[@#](\w+)/\1<\/i>/g; $args =~ s/@(\w+)/\1<\/i>/g; $body =~ s/\n/ /; $bodies{$func} = $body; $arguments{$func} = $args; $returns{$func} = $returns; $proto = ""; while (<>){ $proto .= $_; last if (/\{/); } $proto =~ s/{//; # clean it up a little, remove newlines, empty space at end $proto =~ s/ +$//; # Turn "Type * xxx" into "Type* xxx" $proto =~ s/^(\w+)\W+\*/\1\*/; $prototype{$func} = $proto; return; } chop; s/^\ \*//; $_ = "\n

" if (/^\s+$/); if ($inbody == 0){ if (/\s*(\w+):(.*)/){ $args .= "

$1:
$2
"; } else { $body = "\t$_\n"; $inbody = 1; } } elsif ($inbody == 1) { if (/Returns?:/){ s/Returns?://; $returns = "\t$_\n"; $inbody = 2; } else { $body .= "\n\t$_"; } } else { $returns .= "\n\t$_"; } } } sub create_toc { my ($apis_listed) = @_; my $type_size = 0; my $name_size = 0; my $ret, $xname, $args, $line; $apis_toc = ""; # Try to align things, so compute type size, method size, and arguments foreach $line (split /\n/, $apis_listed){ $p = $prototype{$line}; ($ret, $xname, $args) = $p =~ /(.*)\n(\w+)[ \t](.*)/; $tl = length ($ret); $pl = length ($xname); $type_size = $tl if ($tl > $type_size); $name_size = $pl if ($pl > $name_size); } $type_size++; $name_size++; foreach $line (split /\n/, $apis_listed){ chop; $p = $prototype{$line}; ($ret, $xname, $args) = $p =~ /(.*)\n(\w+)[ \t](.*)/; $rspace = " " x ($type_size - length ($ret)); $nspace = " " x ($name_size - length ($xname)); $args = &format ($args, length ($ret . $rspace . $xname . $nspace), 60); $apis_toc .= "$ret$rspace$xname$nspace$args\n"; } return $apis_toc; } # # Formats the rest of the arguments in a way that will fit in N columns # sub format { my ($args, $size, $limit) = @_; my $sret = ""; # return $args if ((length (args) + size) < $limit); $remain = $limit - $size; @sa = split /,/, $args; $linelen = $size; foreach $arg (@sa){ if ($sret eq ""){ $sret = $arg . ", "; $linelen += length ($sret); } else { if ($linelen + length ($arg) < $limit){ $sret .= "FITS" . $arg . ", "; } else { $newline = " " x ($size) . $arg . ", "; $linelen = length ($newline); $sret .= "\n" . $newline; } } } $sret =~ s/, $/;/; return $sret; } sub opt_print { my ($caption, $opttext, $quote) = @_; if ($opttext ne "" && (!($opttext =~ /^[ \t]+$/))){ print OUT "$caption\n"; if ($quote == 1){ print OUT "
$opttext
\n"; } else { print OUT "

$opttext\n"; } } }