📄 makedoc.perl
字号:
$desc = $1; } else { die "no <desc> in classdef $name" }; if( $str =~ s#<remark>(.*?)</remark>##si ) { $remark = $1; } else { $remark = "" }; if( $str =~ s#<overview>(.*?)</overview>##si ) { $overview = " - $1"; } else { $overview = "" }; if( $str =~ s#<see>(.*?)</see>##si ) { $see = &makeref($1); } else { $see = "" }; if( $str =~ s#<decl>(.*?)</decl>##si ) { $decl = $1; } else { $decl = "" }; if( $str =~ s#<namespace>(.*?)</namespace>##si ) { $namespace = $1; } else { $namespace = "" }; if( $str =~ s#<body>(.*?)</body>##si ) { $body = $1; $body =~ s# -->\n<!-- #\n#g;# find class header if( !( $body =~ s#^[\s\n]*<!-- \s*(([^{;&]|&[^;]+;)*)[{;]##s ) ) { die "no class header found at the top in classdef $name"; } else { $classhead = $1; $classhead =~ s#^[\s\n]+##; # Remove head spaces $classhead =~ s#[\s\n]+$##; # Remove tail spaces $classhead =~ s#\n#<br>\n#g; # Insert <br> if( $classhead =~ s/([^:])\s*:([^:].*)/$1/ ) { if( $pass == 1 ) {# make reference to parent classes $derivation = $2; while( $derivation =~ /(\w+(\s+\w+)*(\s*<([^&]|&|<([^&]|&)+>)+>)?)/g ) {# print "$1\n"; $i = $1; $i =~ s/\s+/ /g; ($t,$x,$x,$n) = ($i =~ /((virtual )?(public|private|protected)) (.*)/); if( $t eq "public" ) { $t = ""; } else { $t = " ($t)"; } push(@{$parent_info{$name}}, $n); push(@{$parent_class{$name}}, $n . $t); $n =~ s/<.*>//g; $n =~ s/\s+//g; push(@{$child_class{$n}}, $name . $t); } } } $classhead = $classhead . ";"; if( $namespace ne "" ) { $classhead = "namespace $namespace {\n<div style=\"margin-left: 2em\">$classhead</div>\n}"; } $decl = "#include \"<ref>" . $file . "</ref>\"<br><br>\n" . $classhead if( $decl eq "" ); } undef %func; $mode = "private"; $mode = "public" if( $decl =~ /struct/ ); $enums = ""; if( $decl !~ /\btypedef\b/ && $decl !~ /\benum\b/) { while(1) { if( $body =~ s/^[\s\n]*(private|public|protected):// ) { $mode = $1; next; } last if ! ($body =~ s#^[\s\n]*(([^;{}&]|&[a-z]+;)*?)([;{}])##s); ($lin, $delim) = ($1,$3); last if( $delim eq "}" ); # print "$lin <<<$delim>>>\n"; if( $delim eq "{" ) { while( $body =~ /([{}])/ ) { # print "--------\n $body"; if( $1 eq "}" ) { $body =~ s/^[^}]*\}//s; # print "--------\n"; last; } if( ! ($body =~ s/\{[^\{\}]*\}//s) ) { die "why?" } } } if( $lin ne "" ) { $fname = ""; $descr = ""; if( $lin =~ s/[\s\n]*-->(.*?)<!--[\s\n]*$//s ) { $descr = $descr . $1; } while( $body =~ s/^[\s\n]*-->(.*?)<!--[\s\n]*//s ) { $descr = $descr . $1; } if( $lin =~ /(^|\W)friend\W/ ) { $section = "friend func"; $section = "friend class" if $lin =~ /(^|\W)(class|struct)\W/; $section = "friend operator" if $lin =~ /\Woperator\W/; if( $section eq "friend func" ) { ($dummy,$fname) = ($lin =~ /^(|[^(]+[^(\w])(\w+)\(/); } elsif( $section eq "friend operator" ) { ($fname) = ($lin =~ /(operator([^(]|\(.*\))+)\(/); $fname =~ s/operator\s*/operator /; } } elsif( $lin =~ /(^|^[^\(]*)~$name\(/ ) { $section = "$mode dtor"; } elsif( $lin =~ /(^|^[^\(]*[^\(\w])$name\(/ ) { $section = "$mode ctor"; } elsif( $lin =~ /typedef/ ) { $section = "$mode typedef"; ($fname) = ($lin =~ /[^\w0-9](\w[\w0-9]+)[^\w0-9]*$/); } elsif( $lin =~ /(^|^[^\(]*[^\(\w])enum\W/ ) { $section = "$mode enum"; ($fname) = ($lin =~ /enum\s+(\w+)/); } elsif( $lin =~ /(^|^([^\(&]|&|<[^&]*>)*[^\(\w])(class|struct)\W/ ) { $section = "$mode subclass"; ($dummy,$fname) = ($lin =~ /(class|struct)\s+(\w+)/); } elsif( $lin =~ /(^|\W)operator\W/ ) { $section = "$mode operator"; ($fname) = ($lin =~ /(operator([^(]|\(.*\))+)\(/); $fname =~ s/operator\s*/operator /; } elsif( $lin =~ /^[^\(]*[A-Za-z0-9_]\(/ ) { $section = "$mode func"; $section = "$mode staticfunc" if( $lin =~ /(^|^.*\W)static\W/ ); ($dummy,$fname) = ($lin =~ /^(|[^(]+[^(\w])(\w+)\(/); } elsif( $lin =~ /(^|\W)static\W/ ) { $section = "$mode staticmember"; if( $lin =~ /(^|\W)(const\s+static|static\s+const)\W/ ) { $section = "$mode const"; } ($fname) = ($lin =~ /.*[^A-Za-z_0-9]([A-Za-z_][A-Za-z_0-9]+)/); } else { $section = "$mode member"; ($fname) = ($lin =~ /[^\w0-9](\w[\w0-9]+)[^\w0-9]*$/); } if( $fname ne "" ) { $fx = $fname; $fx =~ s/([\[\]\*\+])/\\$1/g; $fx =~ s/([A-Za-z0-9_])\s*([^A-Za-z0-9_\s])/$1\\s*$2/g; $fx =~ s/\s+/$1\\s+$2/g; $fx =~ s/^([A-Za-z_])/\\b$1/; $fx =~ s/([A-Za-z0-9_])$/$1\\b/; # print "$fx\n"; $lin =~ s#$fx#<strong>$fname</strong>#; $fname =~ s/\bconst //; } $lin =~ s/([^:]):[^:].*/$1/s; $lin =~ s/=\s*0\s*$//s; $lin =~ s/\s+$//s; $fdecl{$membercount} = $lin; $fsect{$membercount} = $section; $fdescr{$membercount} = $descr; $fname{$membercount} = $fname; $fclass{$membercount} = $name; push(@{$func{$section}}, $membercount); if( $pass == 1 ) { push( @{$classmember{$name}{$fname}}, $membercount ); } $membercount++; } } if( $pass == 2 && defined $parent_class{$name} ) { &parent_search( $name, "root", $parent_class{$name}); } } elsif( $decl =~ /\benum\b/ ) { while(1) { last if ! ($body =~ s#^[\s\n]*(([^;{}&]|&[a-z]+;)*?)([,{}])##s); ($lin, $delim) = ($1,$3); if( $lin ne "" ) { $descr = ""; if( $lin =~ s/[\s\n]*-->(.*?)<!--[\s\n]*$//s ) { $descr = $descr . $1; } while( $body =~ s/^[\s\n]*-->(.*?)<!--[\s\n]*//s ) { $descr = $descr . $1; } $enums = $enums . "<dt><strong>$lin</strong><dd>$descr\n"; } } $enums = "<dl>" . $enums . "</dl>"; } } if( $pass == 1 ) { $link{$name} = &make_filename("$name.html"); } if( $pass == 2 ) { $out = "<H1><eng>Class </eng>$name<jpn> 僋儔僗</jpn>$overview</H1>\n"; $out = $out . "<H2><jpn>愰尵</jpn><eng>Declaration</eng></H2>\n" . "<div><code>\n" . &makeref($decl, $name) . "</code></div>\n"; if( defined $parent_class{$name} ) { $out = $out . "<H2><jpn>恊僋儔僗</jpn><eng>Parent classes</eng></H2>\n<p>"; $connect = ""; foreach $i (@{$parent_class{$name}}) { $out = $out . $connect . &makeref($i, $name); $connect = ", "; } $out = $out . "</p>\n"; } if( defined $child_class{$name} ) { $out = $out . "<H2><jpn>巕僋儔僗</jpn><eng>Child classes</eng></H2>\n<p>"; $connect = ""; foreach $i (@{$child_class{$name}}) { $out = $out . $connect . &makeref($i, $name); $connect = ", "; } $out = $out . "</p>\n"; } $out = $out . "<H2><jpn>愢柧</jpn><eng>Description</eng></H2>\n$desc\n"; $member_header = 0; foreach $i (@order) { foreach $j ("public", "protected", "friend") { $secname = "$j $i"; if( defined $func{$secname} ) { if( $member_header == 0 ) { $member_header = 1; $out = $out . "<H2><jpn>儊儞僶</jpn><eng>Members</eng></H2>\n"; } $out = $out . "<H3>" . &makesecname($secname) . "</H3>\n"; $close = ""; $prevfname = "!";# print "-- " . $secname . " @{$func{$secname}}\n"; foreach $x (sort {$fname{$a} cmp $fname{$b}} @{$func{$secname}} ) { $derivestr = ""; $derivestr = " (<eng>derived from </eng>$fclass{$x}<jpn>傛傝宲彸</jpn>)" if( $fclass{$x} ne $name ); if( $prevfname ne $fname{$x} ) { $prevfname = $fname{$x}; if( $prevfname ne "" ) { $out = $out . "$close<H4>$prevfname $derivestr</H4><DL class=member>"; } else { $out = $out . "$close<DL>"; } $close = "</DL>\n"; } $out = $out ."<DT class=member>" . &makeref($fdecl{$x}, $name) . ";\n<DD class=member>" . $fdescr{$x} . "\n"; } $out = $out . "$close\n"; } } } $out = $out . "<H2><jpn>抣</jpn><eng>Values</eng></H2>\n$enums\n" if $enums ne ""; $out = $out . "<H2><jpn>拲庍</jpn><eng>Remarks</eng></H2>\n$remark\n" if $remark ne ""; $out = $out . "<H2><jpn>嶲徠</jpn><eng>See also</eng></H2>\n$see\n" if $see ne "";# 嵟廔張棟 $out =~ s#\n\n\n+#\n\n#g; &sendfile(&make_filename("$name.html"), "Class $name: $title", $out); } return "<li><ref>$name</ref>$overview";}sub funcdef{ local($str, $file, $title) = @_; local($name, $desc, $see, $decl, $namespace); if( $str =~ s#<name>(.*?)</name>##si ) { $name = $1; $name =~ s/^\s+//; $name =~ s/\s+$//; $name =~ s/\s+/ /g; } else { die "no <name> in funcdef" }; if( $str =~ s#<desc>(.*?)</desc>##si ) { $desc = $1; } else { die "no <desc> in funcdef $name" }; if( $str =~ s#<remark>(.*?)</remark>##si ) { $remark = $1; } else { $remark = "" }; if( $str =~ s#<overview>(.*?)</overview>##si ) { $overview = " - $1"; } else { $overview = "" }; if( $str =~ s#<see>(.*?)</see>##si ) { $see = &makeref($1,$name); } else { $see = "" }; if( $str =~ s#<decl>(.*?)</decl>##si ) { $decl = $1; } else { $decl = "" }; if( $str =~ s#<args>(.*?)</args>##si ) { $args = $1; } else { $args = "" }; if( $str =~ s#<retval>(.*?)</retval>##si ) { $retval = $1; } else { $retval = "" }; if( $str =~ s#<namespace>(.*?)</namespace>##si ) { $namespace = $1; } else { $namespace = "" }; if( $str =~ s#<body>(.*?)</body>##si ) { $body = $1; $body =~ s# -->\n<!-- #\n#g; if( $decl eq "" ) { ($decl) = ($body =~ /<!--\s+(.*[^\s])\s+-->/s); $decl =~ s/\binline\b//s; # cut off inline $decl =~ s/^((\s*[^&{\s]|\s*&[a-z]+;)*)\s*[;{].*/$1/s; # cut off function body $decl =~ s/(template.*<.*>)/$1<br>/s; $decl = "#include \"<ref>" . $file . "</ref>\"<br><br>\n$decl"; } } else { print $str; } if( $pass == 1 ) { $link{"$name"} = &make_filename("$name.html"); $linkstr{"$name"} = "$name()"; $link{"$name()"} = &make_filename("$name.html"); $linkstr{"$name()"} = "$name()";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -