#!/usr/bin/env perl # # $NetBSD: act2html.pl,v 1.11 2007/07/31 13:45:38 kano Exp $ # # # Process index.act file into index.html for the in-Action # gallery. Customized version of DKBrownlee's list2html.pl. # # Tags: # name Link to port home page # <([-\w.]+@[-\w.]+)> -> email address eg: # category/name -> link to pkgsrc README.html # path -> link to source file/dir in -current # # ([a-zA-Z_][-\w.+]*[\w+])\((\d)(|\.(\w+))(|\+(\W+))\) # -> man pages: Default collection is NetBSD-current. # Available collections are "1.3.3", # "1.4.3", "1.5", "current" # # Usage examples: ls(1), ls(1.i386) # ls(1+1.4.3), ls(1.i386+1.4.3) use strict; use Getopt::Std; $^W=1; my($verbose,%extras,$months_previous); my($version,%opt,%pkgname); # List of pkgsrc names to 'human preferred' forms %pkgname = qw(kde KDE gimp GIMP gnome GNOME xsane XSane); $months_previous=9; # previous months to display for DATE entries $version='$Revision: 1.11 $'; $version =~ /([\d.]+)/ && ($version=$1); if (!&getopts('a:c:m:hV',\%opt) || $opt{'h'} || ( !$opt{'V'} && @ARGV != 2) ) { print "act2html.pl [opts] infile outfile [opts] -a xxx Define 'arch=xxx' when linking to manpages -c xxx Define 'collection=xxx' when linking to manpages -h This help. -V Display version and exit ($version - David Brownlee/abs) act2html.pl processes the index.act file into index.html for the in-Action gallery. It is a customized version of David Brownlee's list2html.pl. "; exit; } if ($opt{'V'}) { print "$version\n"; exit; } $verbose=1; %extras=( '     ' ); # XXX Should DTRT with faqs not under Documentation &makeact(@ARGV,&extras_generate(%extras)); exit; sub extract_tags { my($file,@tags)=@_; my($tag,%map); if (!open(FILE,$file)) { return; } while () { foreach $tag (@tags) { if ( /($tag)/ ) { $map{$tag}=$1; } } } close(FILE); %map; } sub extras_generate { my(%extras)=@_; my($pathtodoc,$str); if ($0 !~ m#(.*)/[^/]+.pl#) { &fail("Unable to extract path from '$0'"); } $pathtodoc="$1/docs"; foreach $str ( keys %extras ) { $extras{$str} =~ s#\$HOME#$pathtodoc/..#g; $extras{$str} =~ s#\$DOCUMENTATION#$pathtodoc#g; } (%extras); } sub extras_process { my($data,%extras)=@_; my($key,$title,$value); foreach $key ( keys %extras ) { $value=$extras{$key}; if ($data =~ /$key/) { if (defined($1)) { $title=$1; $value=~s#\$TITLE#$title#g; } $data=~s/$key.*/$value/; } } $data; } sub fail { print STDERR "ABORTING: ",@_,"\n"; exit 3 } # Collect $act containing forward links as we go. In general each entry will # generate something in $act and some expanded data in the main $data. # sub makeact { my($infile,$outfile,%extras)=@_; my($data,$section,$href,$header,$act,$pre,%tags,$date_month); my($date_num,$date_num_used,$entry_num,$ignore,$in_entry,$in_section); my($endact); my($title_font) = ""; my($end_title_font) = ""; my(%rcsmap)=&extract_tags($outfile,'\$NetBSD.*\$'); my($rcstag); $act=''; $data=$date_month=''; $entry_num=$date_num=$date_num_used=0; open(FILE,$infile) || die("Unable to open '$infile': $!"); foreach( ) { foreach $rcstag (%rcsmap) { s/$rcstag/$rcsmap{$rcstag}/; } if (defined($pre)) # Handle continuation lines { $_=$pre.$_; $pre=undef; } if (substr($_,-2) eq "\\\n") # Handle continuation lines { s/\\\n$//; $pre=$_; next; } if (! $ignore) { $data.=&sub_external_links($_); } } close(FILE); $act.="\n"; $_="\n\n\n"; if ($data !~ s/(]*>)/$1$_/i) { &fail("Unable to locate tag"); } open(FILE,"|cat >$outfile") || die("Unable to write '$outfile': $!"); print FILE &extras_process($data,%extras); close(FILE); if ($date_num) { print "$date_num date entr",($date_num==1)?'y':'ies'; if ($date_num_used != $date_num) { print " ($date_num_used used)"; } print ".\n"; } if ($entry_num) { print "$entry_num entr",($entry_num==1)?'y':'ies',".\n"; } } sub sub_external_links { my($text) = @_; # Man page references. As of 1.4 matches every page except '[' and 'w'. # $_ = $text; # Output text include match string, so handle in sections $text = ''; while ( m#([a-zA-Z_][-\w.+]*[\w+])\((\d)(|\.(\w+))(|\+(\W+))\)# ) { my($page, $section, $arch, $collection) = ($1, $2, $4, $6); my($link); $link = 'http://man.NetBSD.org/man/'; $link .= "$page+$section"; if (defined($arch)) { $link .= ".$arch"; } elsif ($opt{'a'}) { $link .= ".$opt{'a'}"; } if (defined($collection)) { $link .= "+NetBSD-$collection"; } elsif ($opt{'c'}) { $link .= "+$opt{'c'}"; } else { $link .= "+NetBSD-current"; } $text .= $` . "$page($section)"; $_ = $'; } $text .= $_; # Expand path # if ($text =~ m#([^\s<>]+\w)#) { my($path); $path = $1; $path =~ s#^/##; $path =~ s#^usr/##; $path =~ s#^src/##; if ($path =~ m#^(sys|share|gnu)#) { $path = $1."src/$path"; } elsif ($path !~ m#^(doc|xsrc)#) { $path = "basesrc/$path"; } $text =~ s#([^\s<>]+\w)#$1#; } # Expand category/name entries # while ( $text =~ m#(([-\w.]+/|)([-\w_.+]+[\w+]))#) { my($n) = $3; if (defined($pkgname{$n})) { $n = $pkgname{$n}; } $text =~ s#(([-\w.]+/|)([-\w_.+]+[\w+]))#$n#; } # Expand portname entries $text =~ s#([^\s<]+[^<\s.]+\w)#NetBSD/$1#g; # Expand email addresses # $text =~ s#<([-\w.]+@[-\w.]+)>#<$1>#g; $text; } sub verbose { $verbose && print @_; } sub warn { print "WARNING: ",@_; }