📄 scandoc.pl
字号:
elsif ((($valid, $token) = &matchAny) && $valid) { # Comment in for debugging # print STDERR "token: $token \n"; } else { return 0; } return 1;}# read a file into a string ( filename, default-value )sub readFile { local ( $filename, $result ) = @_; if ($filename && open( FILE, $filename )) { $result = ""; while (<FILE>) { $result .= $_; } close( FILE ); } return $result;}# Read the entire document template and translate into PERL code.sub readTemplate { local ( $filename ) = @_; $docTemplate = ''; $indent = ''; $literal = 1; # We're in literal mode. if (!-e $filename) { if (-e "./templates/$filename") { $filename = "./templates/$filename"; } elsif (-e "../templates/$filename") { $filename = "../templates/$filename"; } else { die "Could not find template '$filename'.\n"; } } open( FILE, $filename ) || die "Error opening '$filename'.\n"; while (<FILE>) { last if (/END/); # if we found a code entry. for (;;) { &expandTabs( $_ ); if ($literal) { # Check for beginning of code block. if (s/^(.*)\<\<//) { $line = $1; if (substr( $line, 0, length( $indent ) ) eq $indent) { substr( $line, 0, length( $indent ) ) = ''; } if ($line ne '') { $line =~ s/\"/\\\"/g; $line =~ s/\$\((\w+)\.(\w+)\)/\" \. \$$1->$2() \. \"/g; $docTemplate .= "${indent}print\"$line\";"; } # else { $docTemplate .= "\n"; } $literal = 0; } else { if (substr( $_, 0, length( $indent ) ) eq $indent) { substr( $_, 0, length( $indent ) ) = ""; } chop; s/\"/\\\"/g; s/\$\((\w+)\.(\w+)\)/\" \. \$$1->$2() \. \"/g; $_ = $indent . "print \"" . $_ . "\\n\";\n"; last; } } else { # Check for beginning of literal block. if (s/^(\s*)\>\>//) { $indent = $1; $literal = 1; } elsif (s/^(\s*)(.*)\>\>//) { $docTemplate .= "$indent$2"; $literal = 1; } else { last; } } } $docTemplate .= $_; } close( FILE ); # print $docTemplate;}# Functions intended to be called from doc template file.# Open a new output filesub file { my $mfile = $_[ 0 ]; open( STDOUT, ">$destPath$mfile" ) || die "Error writing to '$mfile'\n";}# return list of package objectssub packages { my ($p, @r); @r = (); foreach $p (sort keys %packages) { push @r, $packages{ $p }; } return @r;}# return list of source files which have to-do listssub todolistFiles { my ($p, @r); @r = (); foreach $p (sort keys %todolist) { push @r, $p; } return @r;}# return list of tab-delimited to-do-list texts.sub todolistEntries { local $_ = $todolist{ $_[0] }; s/^\s+//; # Remove whitespace from beginning s/\s+$/\n/; # Remove whitespace from end return split( /\n/, $_ );}# Convert package name to URL.sub packageURL { my $p = $_[0]; if ($p eq 'General') { $p = '.general'; } if ($p eq '') { $p = '.general'; } if (ref $packages{ $p }) { return $packages{ $p }->url(); } return 0;}# Get the see-also list for an objectsub seealsoList { my $self = shift; my ($see, $name, $url, $p, @r); @r = (); if (defined ($self->{ 'see' })) { foreach $_ (split(/\n/,$self->{ 'see' })) { if (/^\<a\s+href/) { # if already an HREF. $name = $_; $url = 0; } elsif (/([^\#]*)\#(.*)/) { # If a package name is present $url = &packageURL( $1 ) . '#' . $2; $name = $2; } else { $name = $_; $url = "#$_"; # This doesn't appear to do anything - so I commented it. (james) # Look up the package in the index and use it to construct the html filename. #if (/^([^\:]*)\:\:(.*)/) { # $className = ($1 eq '') ? '' : $classToPackage{ $1 }; # $p = $packageToFile{ $className }; # if ($p ne '') { # $url = &packageURL( $1 ) . '#' . $_; # } #} } $url =~ s/^\:*//; # Remove leading colons from name $url =~ s/::/-/g; # Replace :: with dash my $entry = { 'name' => $name, 'url' => $url }; bless $entry, DocReference; push @r, $entry; } } return @r;}sub removeApacheMacros {# print "removing from $_"; s|AP_DECLARE\((.*?)\)|$1|;}# Class for parsed packagepackage PackageRecord;sub classes { my $self = shift; my $classes = $self->{ 'classes' }; return map $classes->{ $_ }, (sort keys %$classes);}sub globals { my $self = shift; my $globals = $self->{ 'globals' }; return map $globals->{ $_ }, (sort keys %$globals);}sub globalvars { my $self = shift; my $globals = $self->{ 'globals' }; my ($p, @r); @r = (); foreach $p (sort keys %$globals) { my $m = $globals->{ $p }; if ($m->{ 'type' } ne 'func') { push @r, $m; } } return @r;}sub globalfuncs { my $self = shift; my $globals = $self->{ 'globals' }; my ($p, @r); @r = (); foreach $p (sort keys %$globals) { my $m = $globals->{ $p }; if ($m->{ 'type' } eq 'func') { push @r, $m; } } return @r;}sub name { my $self = shift; return $self->{ 'name' };}sub url { my $self = shift; return "default-pkg.html" if ($self->{ 'name' } eq '.general'); return $self->{ 'name' } . '.html';}sub anchor { my $self = shift; my $url = $self->{ 'name' }; return $url;}# Class for parsed classpackage ClassRecord;sub keywords { return ${$_[0]}{ 'keywords' }; }sub author { return ${$_[0]}{ 'author' }; }sub version { return ${$_[0]}{ 'version' }; }sub name { return ${$_[0]}{ 'name' }; }sub longname { return ${$_[0]}{ 'longname' }; }sub fullname { return ${$_[0]}{ 'fullname' }; }sub scopename { return ${$_[0]}{ 'scopename' }; }sub sourcefile { return ${$_[0]}{ 'sourcefile' }; }#sub description { return &::processDescription( ${$_[0]}{ 'description' } ); }sub description { return ${$_[0]}{ 'description' }; }sub seealso { &::seealsoList( $_[0] ); }sub url { my $self = shift; return 0 unless $self->{ 'package' }; my $pname = ::packageURL( $self->{ 'package' } ); my $url = $self->{ 'uname' }; $url =~ s/::/-/g; return "$pname#$url";}sub anchor { my $self = shift; my $url = $self->{ 'uname' }; $url =~ s/::/-/g; return $url;}sub members { my $self = shift; my $members = $self->{ 'members' }; my ($p, @r); @r = (); foreach $p (sort keys %$members) { push @r, $members->{ $p }; } return @r;}sub membervars { my $self = shift; my $members = $self->{ 'members' }; my ($p, @r); @r = (); foreach $p (sort keys %$members) { my $m = $members->{ $p }; if ($m->{ 'type' } ne 'func') { push @r, $m; } } return @r;}sub memberfuncs { my $self = shift; my $members = $self->{ 'members' }; my ($p, @r); @r = (); foreach $p (sort keys %$members) { my $m = $members->{ $p }; if ($m->{ 'type' } eq 'func') { push @r, $m; } } return @r;}sub baseclasses { my $self = shift; my $bases = $self->{ 'bases' }; my ($p, $class, @r); @r = (); foreach $p (@$bases) { unless ($class = $::classList{ $p }) { # It's one we don't know about, so just make something up $class = { 'name' => $p, 'longname'=> "class $p", 'fullname'=> "class $p", 'scopename'=>"class $p", 'uname' => $p, 'members' => {} }; if ($::classToPackage{ $p }) { $class->{ 'package' } = $::classToPackage{ $p }; } bless $class, ClassRecord; } push @r, $class; } return @r;}sub subclasses { my $self = shift; my $subs; my ($p, $class, @r); @r = (); if (defined ($self->{ 'subs' })) { $subs = $self->{ 'subs' }; foreach $p (sort @$subs) { $class = $::classList{ $p }; push @r, $class; } } return @r;}# Class for parsed class member or globalpackage MemberRecord;sub type { return ${$_[0]}{ 'type' }; }sub keywords { return ${$_[0]}{ 'keywords' }; }sub author { return ${$_[0]}{ 'author' }; }sub version { return ${$_[0]}{ 'version' }; }sub name { return ${$_[0]}{ 'name' }; }sub longname { return ${$_[0]}{ 'longname' }; }sub fullname { return ${$_[0]}{ 'fullname' }; }sub scopename { return ${$_[0]}{ 'scopename' }; }sub returnValue { return ${$_[0]}{ 'return' }; }sub sourcefile { return ${$_[0]}{ 'sourcefile' }; }sub description { return ${$_[0]}{ 'description' }; }sub seealso { &::seealsoList( $_[0] ); }sub url { my $self = shift; return 0 unless $self->{ 'package' }; my $pname = ::packageURL( $self->{ 'package' } ); my $url = $self->{ 'uname' }; $url =~ s/::/-/g; return "$pname#$url";}sub anchor { my $self = shift; my $url = $self->{ 'uname' }; $url =~ s/::/-/g; $url;}sub params { my $self = shift; my $params = $self->{ 'param' }; my @r; @r = (); return 0 unless ($params); my @paramList = split( /\t/, $params ); for ($i = 1; $i < $#paramList; $i += 2) { my $entry = { 'name' => $paramList[ $i ], 'description' => $paramList[ $i + 1 ] }; bless $entry, ArgRecord; push @r, $entry; } return @r;}sub exceptions { my $self = shift; my $params = $self->{ 'exception' }; my @r; @r = (); return 0 unless ($params); my @paramList = split( /\t/, $params ); for ($i = 1; $i < $#paramList; $i += 2) { my $entry = { 'name' => $paramList[ $i ], 'description' => $paramList[ $i + 1 ] }; bless $entry, ArgRecord; push @r, $entry; } return @r;}package ArgRecord;sub name { return ${$_[0]}{ 'name' }; }sub description { return ${$_[0]}{ 'description' }; }package DocReference;sub name { return ${$_[0]}{ 'name' }; }sub url { return ${$_[0]}{ 'url' }; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -