--- loncom/build/lpml_parse.pl 2001/09/08 17:45:09 1.5 +++ loncom/build/lpml_parse.pl 2001/12/19 21:26:52 1.33 @@ -1,10 +1,43 @@ #!/usr/bin/perl -# Scott Harrison +# The LearningOnline Network with CAPA +# lpml_parse.pl - Linux Packaging Markup Language parser +# +# $Id: lpml_parse.pl,v 1.33 2001/12/19 21:26:52 harris41 Exp $ +# +# Written by Scott Harrison, harris41@msu.edu +# +# Copyright Michigan State University Board of Trustees +# +# This file is part of the LearningOnline Network with CAPA (LON-CAPA). +# +# LON-CAPA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LON-CAPA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LON-CAPA; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# /home/httpd/html/adm/gpl.txt +# +# http://www.lon-capa.org/ +# # YEAR=2001 # May 2001 # 06/19/2001,06/20,06/24 - Scott Harrison # 9/5/2001,9/6,9/7,9/8 - Scott Harrison +# 9/17,9/18 - Scott Harrison +# 11/4,11/5,11/6,11/7,11/16,11/17 - Scott Harrison +# 12/2,12/3,12/4,12/5,12/6,12/13 - Scott Harrison +# +### ############################################################################### ## ## @@ -14,6 +47,8 @@ ## 3. First pass through (grab distribution-specific information) ## ## 4. Second pass through (parse out what is not necessary) ## ## 5. Third pass through (translate markup according to specified mode) ## +## 6. Functions (most all just format contents of different markup tags) ## +## 7. POD (plain old documentation, CPAN style) ## ## ## ############################################################################### @@ -42,7 +77,7 @@ Only the 1st argument is mandatory for t Example: cat ../../doc/loncapafiles.lpml |\\ -perl lpml_parse.pl html default /home/sherbert/loncapa /tmp/install +perl lpml_parse.pl html development default /home/sherbert/loncapa /tmp/install END # ------------------------------------------------- Grab command line arguments @@ -70,6 +105,8 @@ if (@ARGV) { my $targetroot; my $sourceroot; +my $targetrootarg; +my $sourcerootarg; if (@ARGV) { $sourceroot = shift @ARGV; } @@ -78,10 +115,14 @@ if (@ARGV) { } $sourceroot=~s/\/$//; $targetroot=~s/\/$//; +$sourcerootarg=$sourceroot; +$targetrootarg=$targetroot; + +my $logcmd='| tee -a WARNINGS'; my $invocation; # --------------------------------------------------- Record program invocation -if ($mode eq 'install') { +if ($mode eq 'install' or $mode eq 'configinstall' or $mode eq 'build') { $invocation=(<get_token()) { } } $cleanstring=&trim($cleanstring); -$cleanstring=~s/\s*\n\s*//g; +$cleanstring=~s/\>\s*\n\s*\\new(\$cleans $parser->xml_mode('1'); # Define handling methods for mode-dependent text rendering + $parser->{textify}={ + specialnotices => \&format_specialnotices, + specialnotice => \&format_specialnotice, targetroot => \&format_targetroot, sourceroot => \&format_sourceroot, categories => \&format_categories, category => \&format_category, + abbreviation => \&format_abbreviation, targetdir => \&format_targetdir, chown => \&format_chown, chmod => \&format_chmod, @@ -271,6 +337,7 @@ $parser->{textify}={ build => \&format_build, status => \&format_status, dependencies => \&format_dependencies, + buildlink => \&format_buildlink, glob => \&format_glob, sourcedir => \&format_sourcedir, filenames => \&format_filenames, @@ -295,9 +362,65 @@ while ($token = $parser->get_tag('lpml') } exit; +# ---------- Functions (most all just format contents of different markup tags) + +# ------------------------ Final output at end of markup parsing and formatting sub end { if ($mode eq 'html') { - return "THE END\n"; + # START TEMP WAY +# my $totallinecount; +# my $totalbytecount; +# map {$totallinecount+=$linecount{$_}; +# $totalbytecount+=$bytecount{$_}} +# @categorynamelist; + # END TEMP WAY + return "
 
". + "Summary of Source Repository". + "". + "
 
". + "". + "". + "". + "". + "". + "". + "". + "". + "". + "". + "". + "". + "". + "". + "". + "". + "". + "". + "". + "
Files, Directories, and Symbolic Links
Files (not referenced by globs)$file_count
Files (referenced by globs)$fileglobnames_count
Total Files".($fileglobnames_count+$file_count)."
File globs".$fileglob_count."
Directories".$directory_count."
Symbolic links".$link_count."
". + "". + "". + "". + "". + "". + join("\n",(map {"". + "". + ""} + @categorynamelist)). + "
File Category Count
IconNameNumber of OccurrencesNumber of Incorrect Counts
$_$categorycount{$_}
". + "\n"; + +# START TEMP WAY +# join("\n",(map {"". +# "$_$categorycount{$_}$linecount{$_}$bytecount{$_}"} +# @categorynamelist)). +# "
 
". +# "Total Lines of Code: $totallinecount". +# "
 
". +# "Total Bytes: $totalbytecount". +# END TEMP WAY } if ($mode eq 'install') { return ''; @@ -316,13 +439,79 @@ sub format_lpml { my (@tokeninfo)=@_; my $date=`date`; chop $date; if ($mode eq 'html') { - $lpml = "LPML BEGINNING: $date"; + $lpml=< + +LPML Description Page +(dist=$dist, categorytype=$categorytype, $date) + + +END + $lpml .= "
LPML Description Page (dist=$dist, ". + "categorytype=$categorytype, $date)". + ""; + $lpml .=< +
  • About this file
  • +
  • File Type Ownership and Permissions +Descriptions
  • +
  • Software Package Description
  • +
  • Directory Structure
  • +
  • Files
  • +
  • Summary of Source Repository
  • + +END + $lpml .=< 
    +About this file +

    +This file is generated dynamically by lpml_parse.pl as +part of a development compilation process.

    +

    LPML written by Scott Harrison (harris41\@msu.edu). +

    +END + } + elsif ($mode eq 'text') { + $lpml = "LPML Description Page (dist=$dist, $date)"; + $lpml .=<get_tag('/targetroot'); if ($mode eq 'html') { - return $targetroot="\nTARGETROOT: $text"; + return $targetroot="\n
    TARGETROOT: $text"; } - elsif ($mode eq 'install') { + elsif ($mode eq 'install' or $mode eq 'build' or + $mode eq 'configinstall') { return '# TARGET INSTALL LOCATION is "'.$targetroot."\"\n"; } else { @@ -349,9 +539,10 @@ sub format_sourceroot { $text=$sourceroot if $sourceroot; $parser->get_tag('/sourceroot'); if ($mode eq 'html') { - return $sourceroot="\nSOURCEROOT: $text"; + return $sourceroot="\n
    SOURCEROOT: $text"; } - elsif ($mode eq 'install') { + elsif ($mode eq 'install' or $mode eq 'build' or + $mode eq 'configinstall') { return '# SOURCE CODE LOCATION IS "'.$sourceroot."\"\n";; } else { @@ -363,7 +554,28 @@ sub format_categories { my $text=&trim($parser->get_text('/categories')); $parser->get_tag('/categories'); if ($mode eq 'html') { - return $categories="\nBEGIN CATEGORIES\n$text\nEND CATEGORIES\n"; + return $categories="\n
     
    ". + "\n
    ". + "\nFile Type Ownership and Permissions". + " Descriptions". + "\n

    This table shows what permissions and ownership settings ". + "correspond to each category.

    ". + "\n\n". + "". + "". + "". + "". + "". + "\n$text\n". + "
    IconCategory NamePermissions ". + "($categorytype)
    \n"; + } + elsif ($mode eq 'text') { + return $categories="\n". + "\nFile Type Ownership and Permissions". + " Descriptions". + "\n$text". + "\n"; } else { return ''; @@ -374,12 +586,24 @@ sub format_category { my (@tokeninfo)=@_; $category_att_name=$tokeninfo[2]->{'name'}; $category_att_type=$tokeninfo[2]->{'type'}; - $chmod='';$chown=''; + $abbreviation=''; $chmod='';$chown=''; $parser->get_text('/category'); $parser->get_tag('/category'); + $fab{$category_att_name}=$abbreviation; if ($mode eq 'html') { - return $category="\nCATEGORY $category_att_name $category_att_type ". - "$chmod $chown"; + if ($category_att_type eq $categorytype) { + push @categorynamelist,$category_att_name; + $categoryhash{$category_att_name}="$chmod $chown"; + return $category="". + "\n". + "${category_att_name}\n". + "$chmod $chown\n". + "". + "\n"; +# return $category="\n
    CATEGORY $category_att_name ". +# "$category_att_type $chmod $chown"; + } } else { if ($category_att_type eq $categorytype) { @@ -390,6 +614,17 @@ sub format_category { return ''; } } +# --------------------------------------------------- Format categories section +sub format_abbreviation { + my @tokeninfo=@_; + $abbreviation=''; + my $text=&trim($parser->get_text('/abbreviation')); + if ($text) { + $parser->get_tag('/abbreviation'); + $abbreviation=$text; + } + return ''; +} # -------------------------------------------------------- Format chown section sub format_chown { my @tokeninfo=@_; @@ -417,7 +652,24 @@ sub format_rpm { my $text=&trim($parser->get_text('/rpm')); $parser->get_tag('/rpm'); if ($mode eq 'html') { - return $rpm="\nBEGIN RPM\n$text\nEND RPM"; + return $rpm=< 
    +
    +Software Package Description +

    + + +
    +$text
    +
    +END + } + elsif ($mode eq 'text') { + return $rpm=<get_text('/rpmSummary')); $parser->get_tag('/rpmSummary'); if ($mode eq 'html') { - return $rpmSummary="\nRPMSUMMARY $text"; + return $rpmSummary="\nSummary : $text"; + } + elsif ($mode eq 'text') { + return $rpmSummary="\nSummary : $text"; } else { return ''; @@ -439,7 +694,10 @@ sub format_rpmName { my $text=&trim($parser->get_text('/rpmName')); $parser->get_tag('/rpmName'); if ($mode eq 'html') { - return $rpmName="\nRPMNAME $text"; + return $rpmName="\nName : $text"; + } + elsif ($mode eq 'text') { + return $rpmName="\nName : $text"; } else { return ''; @@ -450,7 +708,10 @@ sub format_rpmVersion { my $text=$parser->get_text('/rpmVersion'); $parser->get_tag('/rpmVersion'); if ($mode eq 'html') { - return $rpmVersion="\nRPMVERSION $text"; + return $rpmVersion="\nVersion : $text"; + } + elsif ($mode eq 'text') { + return $rpmVersion="\nVersion : $text"; } else { return ''; @@ -461,7 +722,10 @@ sub format_rpmRelease { my $text=$parser->get_text('/rpmRelease'); $parser->get_tag('/rpmRelease'); if ($mode eq 'html') { - return $rpmRelease="\nRPMRELEASE $text"; + return $rpmRelease="\nRelease : $text"; + } + elsif ($mode eq 'text') { + return $rpmRelease="\nRelease : $text"; } else { return ''; @@ -472,7 +736,10 @@ sub format_rpmVendor { my $text=$parser->get_text('/rpmVendor'); $parser->get_tag('/rpmVendor'); if ($mode eq 'html') { - return $rpmVendor="\nRPMVENDOR $text"; + return $rpmVendor="\nVendor : $text"; + } + elsif ($mode eq 'text') { + return $rpmVendor="\nVendor : $text"; } else { return ''; @@ -483,7 +750,10 @@ sub format_rpmBuildRoot { my $text=$parser->get_text('/rpmBuildRoot'); $parser->get_tag('/rpmBuildRoot'); if ($mode eq 'html') { - return $rpmBuildRoot="\nRPMBUILDROOT $text"; + return $rpmBuildRoot="\nBuild Root : $text"; + } + elsif ($mode eq 'text') { + return $rpmBuildRoot="\nBuild Root : $text"; } else { return ''; @@ -494,7 +764,10 @@ sub format_rpmCopyright { my $text=$parser->get_text('/rpmCopyright'); $parser->get_tag('/rpmCopyright'); if ($mode eq 'html') { - return $rpmCopyright="\nRPMCOPYRIGHT $text"; + return $rpmCopyright="\nLicense : $text"; + } + elsif ($mode eq 'text') { + return $rpmCopyright="\nLicense : $text"; } else { return ''; @@ -505,7 +778,10 @@ sub format_rpmGroup { my $text=$parser->get_text('/rpmGroup'); $parser->get_tag('/rpmGroup'); if ($mode eq 'html') { - return $rpmGroup="\nRPMGROUP $text"; + return $rpmGroup="\nGroup : $text"; + } + elsif ($mode eq 'text') { + return $rpmGroup="\nGroup : $text"; } else { return ''; @@ -516,7 +792,10 @@ sub format_rpmSource { my $text=$parser->get_text('/rpmSource'); $parser->get_tag('/rpmSource'); if ($mode eq 'html') { - return $rpmSource="\nRPMSOURCE $text"; + return $rpmSource="\nSource : $text"; + } + elsif ($mode eq 'text') { + return $rpmSource="\nSource : $text"; } else { return ''; @@ -527,7 +806,10 @@ sub format_rpmAutoReqProv { my $text=$parser->get_text('/rpmAutoReqProv'); $parser->get_tag('/rpmAutoReqProv'); if ($mode eq 'html') { - return $rpmAutoReqProv="\nRPMAUTOREQPROV $text"; + return $rpmAutoReqProv="\nAutoReqProv : $text"; + } + if ($mode eq 'text') { + return $rpmAutoReqProv="\nAutoReqProv : $text"; } else { return ''; @@ -538,7 +820,14 @@ sub format_rpmdescription { my $text=$parser->get_text('/rpmdescription'); $parser->get_tag('/rpmdescription'); if ($mode eq 'html') { - return $rpmdescription="\nRPMDESCRIPTION $text"; + $text=~s/\n//g; + $text=~s/\\n/\n/g; + return $rpmdescription="\nDescription : $text"; + } + elsif ($mode eq 'text') { + $text=~s/\n//g; + $text=~s/\\n/\n/g; + return $rpmdescription="\nDescription : $text"; } else { return ''; @@ -549,7 +838,8 @@ sub format_rpmpre { my $text=$parser->get_text('/rpmpre'); $parser->get_tag('/rpmpre'); if ($mode eq 'html') { - return $rpmpre="\nRPMPRE $text"; +# return $rpmpre="\n
    RPMPRE $text"; + return ''; } else { return ''; @@ -560,7 +850,22 @@ sub format_directories { my $text=$parser->get_text('/directories'); $parser->get_tag('/directories'); if ($mode eq 'html') { - return $directories="\nBEGIN DIRECTORIES\n$text\nEND DIRECTORIES\n"; + $text=~s/\[\{\{\{\{\{DPATHLENGTH\}\}\}\}\}\]/$dpathlength/g; + return $directories="\n
     
    ". + "
    ". + "Directory Structure". + "\n
     
    ". + "\n". + "". + "\n". + "\n". + "\n". + "\n$text\n
    CategoryStatusExpected Permissions & OwnershipTarget Directory ". + "Path

    "."\n"; + } + elsif ($mode eq 'text') { + return $directories="\nDirectory Structure\n$text\n". + "\n"; } elsif ($mode eq 'install') { return "\n".'directories:'."\n".$text; @@ -575,12 +880,31 @@ sub format_directory { $targetdir='';$categoryname='';$description=''; $parser->get_text('/directory'); $parser->get_tag('/directory'); + $directory_count++; + $categorycount{$categoryname}++; if ($mode eq 'html') { - return $directory="\nDIRECTORY $targetdir $categoryname $description"; + my @a; + @a=($targetdir=~/\//g); + my $d=scalar(@a)+1; + $dpathlength=$d if $d>$dpathlength; + my $thtml=$targetdir; + $thtml=~s/\//\<\/td\>\/g; + my ($chmod,$chown)=split(/\s/,$categoryhash{$categoryname}); + return $directory="\n". + "$categoryname". + " ". + "$chmod
    $chown". + "$thtml". + "". + "$description"; + } + if ($mode eq 'text') { + return $directory="\nDIRECTORY $targetdir $categoryname ". + "$description"; } elsif ($mode eq 'install') { - return "\t".'install '.$categoryhash{$categoryname}.' -d /'. - $targetroot.$targetdir."\n"; + return "\t".'install '.$categoryhash{$categoryname}.' -d '. + $targetroot.'/'.$targetdir."\n"; } else { return ''; @@ -612,7 +936,7 @@ sub format_categoryname { sub format_description { my @tokeninfo=@_; $description=''; - my $text=&trim($parser->get_text('/description')); + my $text=&htmlsafe(&trim($parser->get_text('/description'))); if ($text) { $parser->get_tag('/description'); $description=$text; @@ -624,12 +948,86 @@ sub format_files { my $text=$parser->get_text('/files'); $parser->get_tag('/files'); if ($mode eq 'html') { - return $directories="\nBEGIN FILES\n$text\nEND FILES\n"; + return $directories="\n
     
    ". + "
    ". + "Files
     
    ". + "

    All source and target locations are relative to the ". + "sourceroot and targetroot values at the beginning of this ". + "document.

    ". + "\n". + "". + "". + "". + "$text
    StatusCategoryName/LocationDescriptionNotes
    \n". + "\n"; + } + elsif ($mode eq 'text') { + return $directories="\n". + "File and Directory Structure". + "\n$text\n". + "\n"; } elsif ($mode eq 'install') { return "\n".'files:'."\n".$text. "\n".'links:'."\n".join('',@links); } + elsif ($mode eq 'configinstall') { + return "\n".'configfiles: '. + join(' ',@configall). + "\n\n".$text. + "\n\nalwaysrun:\n\n"; + } + elsif ($mode eq 'build') { + my $binfo; + my $tword; + my $command2; + my @deps; + foreach my $bi (@buildinfo) { + my ($target,$source,$command,$trigger,@deps)=split(/\;/,$bi); + $tword=''; $tword=' alwaysrun' if $trigger eq 'always run'; + if ($command!~/\s/) { + $command=~s/\/([^\/]*)$//; + $command2="cd $command; sh ./$1;\\"; + } + else { + $command=~s/(.*?\/)([^\/]+\s+.*)$/$1/; + $command2="cd $command; sh ./$2;\\"; + } + my $depstring; + my $depstring2="\t\t\@echo '';\\\n"; + my $olddep; + foreach my $dep (@deps) { + unless ($olddep) { + $olddep=$deps[$#deps]; + } + $depstring.="\telif !(test -r $command/$dep);\\\n"; + $depstring.="\t\tthen echo ". + "\"**** WARNING **** missing the file: ". + "$command/$dep\"$logcmd;\\\n"; + $depstring.="\t\ttest -e $source || test -e $target || echo ". + "'**** ERROR **** neither source=$source nor target=". + "$target exist and they cannot be built'$logcmd;\\\n"; + $depstring.="\t\tmake -f Makefile.build ${source}___DEPS;\\\n"; + if ($olddep) { + $depstring2.="\t\tECODE=0;\\\n"; + $depstring2.="\t\t! test -e $source && test -r $command/$olddep &&". + " { perl filecompare.pl -b2 $command/$olddep $target || ECODE=\$\$?; } && { [ \$\$ECODE != \"2\" ] || echo \"**** WARNING **** dependency $command/$olddep is newer than target file $target; SOMETHING MAY BE WRONG\"$logcmd; };\\\n"; + } + $olddep=$dep; + } + $binfo.="$source: $tword\n". + "\t\@if !(echo \"\");\\\n\t\tthen echo ". + "\"**** WARNING **** Strange shell. ". + "Check your path settings.\"$logcmd;\\\n". + $depstring. + "\telse \\\n\t\t$command2\n\tfi\n\n"; + $binfo.="${source}___DEPS:\n".$depstring2."\t\tECODE=0;\n\n"; + } + return 'all: '.join(' ',@buildall)."\n\n". + $text. + $binfo."\n". + "alwaysrun:\n\n"; + } else { return ''; } @@ -644,7 +1042,7 @@ sub format_links { my $text=$parser->get_text('/links'); $parser->get_tag('/links'); if ($mode eq 'html') { - return $links="\nBEGIN LINKS\n$text\nEND LINKS\n"; + return $links="\n
    BEGIN LINKS\n$text\n
    END LINKS\n"; } elsif ($mode eq 'install') { return "\n".'links:'."\n\t".$text; @@ -659,23 +1057,129 @@ sub format_file { $file=''; $source=''; $target=''; $categoryname=''; $description=''; $note=''; $build=''; $status=''; $dependencies=''; my $text=&trim($parser->get_text('/file')); + my $buildtest; + $file_count++; + $categorycount{$categoryname}++; + # START TEMP WAY +# if (-T "$sourcerootarg/$source") { +# $linecount{$categoryname}+=`wc -l $sourcerootarg/$source`; +# } +# my $bytesize=(-s "$sourcerootarg/$source"); +# $bytecount{$categoryname}+=$bytesize; + # END TEMP WAY if ($source) { $parser->get_tag('/file'); if ($mode eq 'html') { - return ($file="\nBEGIN FILE\n". - "$source $target $categoryname $description $note " . - "$build $status $dependencies" . - "\nEND FILE"); + return ($file="\n". + "". + " ". + "". + "$categoryname
    ". + $categoryhash{$categoryname}."". + "SOURCE: $source
    TARGET: $target". + "$description". + "$note". + ""); +# return ($file="\n
    BEGIN FILE\n". +# "$source $target $categoryname $description $note " . +# "$build $status $dependencies" . +# "\nEND FILE"); } elsif ($mode eq 'install' && $categoryname ne 'conf') { - return "\t".'@test -e '.$sourceroot.$source. - ' && install '. - $categoryhash{$categoryname}.' '. - $sourceroot.$source.' '. - $targetroot.$target. - ' || echo "**** LON-CAPA WARNING '. - '**** CVS source file does not exist: "'.$sourceroot.$source. - '"'."\n"; + if ($build) { + my $bi=$sourceroot.'/'.$source.';'.$build.';'. + $dependencies; + my ($source2,$command,$trigger,@deps)=split(/\;/,$bi); + $tword=''; $tword=' alwaysrun' if $trigger eq 'always run'; + $command=~s/\/([^\/]*)$//; + $command2="cd $command; sh ./$1;\\"; + my $depstring; + foreach my $dep (@deps) { + $depstring.=<get_text('/link')); + my @links; if ($linkto) { $parser->get_tag('/link'); if ($mode eq 'html') { - return $link="\nBEGIN LINK\n". - "$linkto $target $categoryname $description $note " . - "$build $status $dependencies" . - "\nEND LINK"; + my @targets=map {s/^\s*//;s/\s$//;$_} split(/\;/,$target); + $link_count+=scalar(@targets); + foreach my $tgt (@targets) { + $categorycount{$categoryname}++; + push @links,("\n". + "". + " ". + "". + "$categoryname". + "LINKTO: $linkto
    TARGET: $tgt". + "$description". + "$note". + ""); +# push @links,"\t".'ln -fs /'.$linkto.' /'.$targetroot.$tgt. +# "\n"; + } + return join('',@links); +# return ($link="\n". +# "". +# " ". +# "$categoryname". +# "LINKTO: $linkto
    TARGET: $target". +# "$description". +# "$note". +# ""); +# return $link="\nBEGIN LINK\n". +# "$linkto $target $categoryname $description $note " . +# "$build $status $dependencies" . +# "\nEND LINK"; } elsif ($mode eq 'install') { - my @targets=split(/\;/,$target); + my @targets=map {s/^\s*//;s/\s$//;$_} split(/\;/,$target); foreach my $tgt (@targets) { push @links,"\t".'ln -fs /'.$linkto.' /'.$targetroot.$tgt. "\n"; @@ -719,18 +1253,56 @@ sub format_fileglob { $note=''; $build=''; $status=''; $dependencies=''; $filenames=''; my $text=&trim($parser->get_text('/fileglob')); + my $filenames2=$filenames;$filenames2=~s/\s//g; + $fileglob_count++; + my @semi=($filenames2=~/(\;)/g); + $fileglobnames_count+=scalar(@semi)+1; + $categorycount{$categoryname}+=scalar(@semi)+1; + # START TEMP WAY +# for my $f (split(/\;/,$filenames2)) { +# if (-T "$sourcerootarg/$sourcedir/$f") { +# $linecount{$categoryname}+=`wc -l $sourcerootarg/$sourcedir/$f`; +# open OUT,">>/tmp/junk123"; +# print OUT "$linecount{$categoryname} $categoryname $sourcerootarg/$sourcedir/$f\n"; +# close OUT; +# } +# my $bytesize=(-s "$sourcerootarg/$sourcedir/$f"); +# $bytecount{$categoryname}+=$bytesize; +# } + # END TEMP WAY if ($sourcedir) { $parser->get_tag('/fileglob'); if ($mode eq 'html') { - return $fileglob="\nBEGIN FILEGLOB\n". - "$glob sourcedir $targetdir $categoryname $description $note ". - "$build $status $dependencies $filenames" . - "\nEND FILEGLOB"; + return $fileglob="\n". + " ". + ""."". + "$categoryname
    ". + "".$categoryhash{$categoryname}."". + "SOURCEDIR: $sourcedir
    ". + "TARGETDIR: $targetdir
    ". + "GLOB: $glob
    ". + "FILENAMES: $filenames". + "". + "$description". + "$note". + ""; +# return $fileglob="\nBEGIN FILEGLOB\n". +# "$glob sourcedir $targetdir $categoryname $description $note ". +# "$build $status $dependencies $filenames" . +# "\nEND FILEGLOB"; } elsif ($mode eq 'install') { + my $eglob=$glob; + if ($glob eq '*') { + $eglob='[^C][^V][^S]'.$glob; + } return "\t".'install '. $categoryhash{$categoryname}.' '. - $sourceroot.'/'.$sourcedir.$glob.' '. + $sourceroot.'/'.$sourcedir.$eglob.' '. $targetroot.'/'.$targetdir.'.'."\n"; } else { @@ -776,9 +1348,25 @@ sub format_source { sub format_note { my @tokeninfo=@_; $note=''; - my $text=&trim($parser->get_text('/note')); +# my $text=&trim($parser->get_text('/note')); + my $aref; + my $text; + while ($aref=$parser->get_token()) { + if ($aref->[0] eq 'E' && $aref->[1] eq 'note') { + last; + } + elsif ($aref->[0] eq 'S') { + $text.=$aref->[4]; + } + elsif ($aref->[0] eq 'E') { + $text.=$aref->[2]; + } + else { + $text.=$aref->[1]; + } + } if ($text) { - $parser->get_tag('/note'); +# $parser->get_tag('/note'); $note=$text; } return ''; @@ -791,7 +1379,18 @@ sub format_build { my $text=&trim($parser->get_text('/build')); if ($text) { $parser->get_tag('/build'); - $build=$text; + $build=$sourceroot.'/'.$text.';'.$tokeninfo[2]{'trigger'}; + } + return ''; +} +# -------------------------------------------------------- Format build section +sub format_buildlink { + my @tokeninfo=@_; + $buildlink=''; + my $text=&trim($parser->get_text('/buildlink')); + if ($text) { + $parser->get_tag('/buildlink'); + $buildlink=$sourceroot.'/'.$text; } return ''; } @@ -813,7 +1412,8 @@ sub format_dependencies { my $text=&trim($parser->get_text('/dependencies')); if ($text) { $parser->get_tag('/dependencies'); - $dependencies=$text; + $dependencies=join(';', + (map {s/^\s*//;s/\s$//;$_} split(/\;/,$text))); } return ''; } @@ -838,6 +1438,16 @@ sub format_filenames { } return ''; } +# ------------------------------------------------ Format specialnotice section +sub format_specialnotices { + $parser->get_tag('/specialnotices'); + return ''; +} +# ------------------------------------------------ Format specialnotice section +sub format_specialnotice { + $parser->get_tag('/specialnotice'); + return ''; +} # ------------------------------------------------------- Format linkto section sub format_linkto { my @tokeninfo=@_; @@ -848,7 +1458,85 @@ sub format_linkto { } return ''; } +# ------------------------------------- Render less-than and greater-than signs +sub htmlsafe { + my $text=@_[0]; + $text =~ s//>/g; + return $text; +} # --------------------------------------- remove starting and ending whitespace sub trim { my ($s)=@_; $s=~s/^\s*//; $s=~s/\s*$//; return $s; } + +# ----------------------------------- POD (plain old documentation, CPAN style) + +=head1 NAME + +lpml_parse.pl - This is meant to parse files meeting the lpml document type. +See lpml.dtd. LPML=Linux Packaging Markup Language. + +=head1 SYNOPSIS + +Usage is for lpml file to come in through standard input. + +=over 4 + +=item * + +1st argument is the mode of parsing. + +=item * + +2nd argument is the category permissions to use (runtime or development) + +=item * + +3rd argument is the distribution +(default,redhat6.2,debian2.2,redhat7.1,etc). + +=item * + +4th argument is to manually specify a sourceroot. + +=item * + +5th argument is to manually specify a targetroot. + +=back + +Only the 1st argument is mandatory for the program to run. + +Example: + +cat ../../doc/loncapafiles.lpml |\\ +perl lpml_parse.pl html default /home/sherbert/loncapa /tmp/install + +=head1 DESCRIPTION + +I am using a multiple pass-through approach to parsing +the lpml file. This saves memory and makes sure the server +will never be overloaded. + +=head1 README + +I am using a multiple pass-through approach to parsing +the lpml file. This saves memory and makes sure the server +will never be overloaded. + +=head1 PREREQUISITES + +HTML::TokeParser + +=head1 COREQUISITES + +=head1 OSNAMES + +linux + +=head1 SCRIPT CATEGORIES + +Packaging/Administrative + +=cut