#! /usr/bin/perl sub print_entry; sub word_sort; while(<>) { chomp; if(!/^;/) { undef $word; next; } if(/^;;\s*(\S+)\s*-\s*(.*?)\s*$/) { $word = $1; $descr->{$word} = $2; $f_id->{$word} = sprintf "f_%04d", ++$f_id_cnt; undef $para; undef $ex; next; } if(defined($word) && s/^;\s*//) { s/\s*$//; if($ex) { push @{$example->{$word}}, $_; next; } if(s/^group:\s*//) { for $g (split /,\s*|\s+/) { $group->{$g}{$word} = 1; $group_r->{$word}{$g} = 1; } next; } if(/^\s*\(\s*((.*?)--(.*?))\s*\)\s*$/) { for $p (split ' ', "$2 $3") { $params->{$word}{$p} = 1 unless $p eq '|'; } push @{$usage->{$word}}, $1; next; } if($_ eq '') { undef $para; next; } if(!$para && /^\s*example/) { $ex = 1; next; } if(/^([A-Za-z_0-9]+):/ && $params->{$word}{$1}) { undef $para; } if(!$para) { $para = 1; push @{$paras->{$word}}, $_; next; } else { ${$paras->{$word}}[-1] .= " $_"; } } } print "\n"; for $word (sort word_sort keys %$descr) { print " \n"; print_entry $word; print " \n" } print "\n"; =head 0 for $w (sort keys %$descr) { print "$w - $descr->{$w}\n"; print "a: ", join(' ' , sort keys(%{$params->{$w}})), "\n"; for $u (@{$usage->{$w}}) { print "u: $u\n"; } for $x (@{$example->{$w}}) { print "x: $x\n"; } for $p (@{$paras->{$w}}) { print "p: $p\n"; } print "\n"; } for $g (sort keys %$group) { print "g $g: ", join(' ', sort keys(%{$group->{$g}})), "\n"; } =cut sub print_entry { local $_; my ($word, $u, $v, %g, $l, $ml); $word = shift; print " {$word}\">$word &dash1; $descr->{$word}\n"; for $u (@{$usage->{$word}}) { $u =~ s/([A-Za-z_0-9]+)/$1<\/parameter>/g; $u =~ s/--/&dash2;/; print " ( $u )\n"; } for $u (@{$paras->{$word}}) { $u =~ s/\s+/ /g; $u =~ s/^note:\s*/Note:<\/emphasis> /i; $u =~ s/([A-Za-z_0-9]+)/$params->{$word}{$1} ? "$1<\/parameter>" : $1/ge; $u =~ s/\@([A-Za-z_0-9\[\]\{\}.]+)/ $_ = $1, s#\.$##, $f_id->{$_} ? $_ eq $word ? "$_<\/function>" : "{$_}\">$_<\/link><\/function>" : $_ /ge; print " $u\n"; } for $u (keys %{$group_r->{$word}}) { for $v (keys %{$group->{$u}}) { $g{$v} = 1 if $v ne $word; } } if(%g) { print " See also: "; $v = 0; for $u (sort keys %g) { print ", " if $v++; print "{$u}\">$u"; } print "\n"; } if($v = $example->{$word}) { shift @$v while @$v && $v->[0] eq ''; pop @$v while @$v && $v->[-1] eq ''; print " <para><programlisting>\n"; for $u (@$v) { if($u =~ /^(.*?)\s*%/) { $l = length $1; } else { $l = length $u; } $ml = $l if $l > $ml; } $ml = ($ml + 7 + 4) & ~7; for $u (@$v) { if($u =~ /^(.*?)\s*%(.*)$/) { printf " %-${ml}s%%%s\n", $1, $2; } else { print " $u\n"; } } print " </programlisting></para></example>\n"; } } sub word_sort { my $x = $a eq '{' || $a eq '}' ? " $a" : $a; my $y = $b eq '{' || $b eq '}' ? " $b" : $b;; return $x cmp $y; }