#! /usr/bin/perl # this is the perl variant of the mksite script. It based directly on a # copy of mksite.sh which is derived from snippets that I was using to # finish doc pages for website publishing. Using only sh/sed along with # files has a great disadvantage: it is very slow process atleast. The # perl language in contrast has highly optimized string, replace, search # functions as well as data structures to store intermediate values. As # an advantage large parts of the syntax are similar to the sh/sed variant. # # http://zziplib.sf.net/mksite/ # THE MKSITE.SH (ZLIB/LIBPNG) LICENSE # Copyright (c) 2004 Guido Draheim # This software is provided 'as-is', without any express or implied warranty # In no event will the authors be held liable for any damages arising # from the use of this software. # Permission is granted to anyone to use this software for any purpose, # including commercial applications, and to alter it and redistribute it # freely, subject to the following restrictions: # 1. The origin of this software must not be misrepresented; you must not # claim that you wrote the original software. If you use this software # in a product, an acknowledgment in the product documentation would be # appreciated but is not required. # 2. Altered source versions must be plainly marked as such, and must not # be misrepresented as being the original software. # 3. This notice may not be removed or altered from any source distribution. # $Id: mksite.pl,v 1.1 2005/12/13 00:27:06 guidod Exp $ use strict; use warnings; no warnings "uninitialized"; use File::Basename qw(basename); use POSIX qw(strftime); # initialize some defaults my $SITEFILE=""; $SITEFILE="site.htm" if not $SITEFILE and -f "site.htm"; $SITEFILE="site.html" if not $SITEFILE and -f "site.html"; $SITEFILE="site.htm" if not $SITEFILE; # my $MK="-mksite"; # note the "-" at the start my $SED="sed"; my $INFO="~~"; # extension for meta data files my $HEAD="~head~"; # extension for head sed script my $BODY="~body~"; # extension for body sed script my $FOOT="~foot~"; # append to body text (non sed) my $SED_LONGSCRIPT="$SED -f"; my $az="a-z"; # for perl my $AZ="A-Z"; # we may assume there are my $NN="0-9"; # char-ranges available my $AA="_$NN$AZ$az"; # that makes the resulting my $AX="$AA.+-"; # script more readable my $n = "\n"; # LANG="C" ; LANGUAGE="C" ; LC_COLLATE="C" # these are needed for proper # export LANG LANGUAGE LC_COLLATE # lowercasing as some collate # treat A-Z to include a-z # ========================================================================== # reading options from the command line GETOPT my %o = (); # to store option variables $o{variables}="files"; $o{fileseparator}="?"; $o{files}=""; $o{main_file}=""; $o{formatter}="$0"; my $opt=""; for my $arg (@ARGV) { # this variant should allow to embed spaces in $arg if ($opt) { $o{$opt}=$arg; $opt=""; } else { $_=$arg; if (/^-.*=.*$/) { $opt=$arg; $opt =~ s/-*([$AA][$AA-]*).*/$1/; $opt =~ y/-/_/; if (not $opt) { print STDERR "ERROR: invalid option $arg$n"; } else { $arg =~ s/^[^=]*=//; $o{$opt} = $arg; $o{variables} .= " ".$opt; } $opt="";; } elsif (/^-.*-.*$/) { $opt=$arg; $opt =~ s/-*([$AA][$AA-]*).*/$1/; $opt =~ y/-/_/; if (not $opt) { print STDERR "ERROR: invalid option $arg$n"; $opt=""; } else { # keep the option for next round } ;; } elsif (/^-.*/) { $opt=$arg; $opt =~ s/^-*([$AA][$AA-]*).*/$1/; $opt =~ y/-/_/; if (not $opt) { print STDERR "ERROR: invalid option $arg$n"; } else { $arg =~ s/^[^=]*=//; $o{$opt} = ' '; } $opt="" ;; } else { if (not $o{main_file}) { $o{main_file} = $arg; } else { $o{files} .= $o{fileseparator} if $o{files}; $o{files} .= $arg; }; $opt="" ;; }; } } ; if ($opt) { $o{$opt}=" "; $opt=""; } ### env | grep ^opt $SITEFILE=$o{main_file} if $o{main_file} and -f $o{main_file}; $SITEFILE=$o{site_file} if $o{site_file} and -f $o{site_file}; if ($o{help}) { $_=$SITEFILE; print "$0 [sitefile]$n"; print " default sitefile = $_$n"; print "options:$n" . " --filelist : show list of target files as ectracted from $_$n" . " --src xx : if source files are not where mksite is executed$n"; exit; print " internal:$n" ."--fileseparator=x : for building the internal filelist (def. '?')$n" ."--files xx : for list of additional files to be processed$n" ."--main-file xx : for the main sitefile to take file list from$n"; } if (not $SITEFILE) { print STDERR "error: no SITEFILE found (default would be 'site.htm')$n"; exit 1; } else { print STDERR "NOTE: sitefile: ",`ls -s $SITEFILE`,"$n"; } # we use internal hashes to store mappings - kind of relational tables my @MK_TAGS= (); # "./$MK.tags.tmp" my @MK_VARS= (); # "./$MK.vars.tmp" my @MK_META= (); # "./$MK.meta.tmp" my @MK_METT= (); # "./$MK.mett.tmp" my @MK_TEST= (); # "./$MK.test.tmp" my @MK_FAST= (); # "./$MK.fast.tmp" my @MK_GETS= (); # "./$MK.gets.tmp" my @MK_PUTS= (); # "./$MK.puts.tmp" my @MK_OLDS= (); # "./$MK.olds.tmp" my @MK_SITE= (); # "./$MK.site.tmp" my @MK_SECT1= (); # "./$MK.sect1.tmp" my @MK_SECT2= (); # "./$MK.sect2.tmp" my @MK_SECT3= (); # "./$MK.sect3.tmp" my @MK_INFO= (); # "./$MK~~" my %INFO= (); # used for $F.$PARTs my %FAST= (); # ======================================================================== # ======================================================================== # ======================================================================== # MAGIC VARS # IN $SITEFILE my $printerfriendly=""; my $sectionlayout="list"; my $sitemaplayout="list"; my $simplevars="warn"; # default my $attribvars=" "; # my $updatevars=" "; # default my $expandvars=" "; # my $commentvars=" "; # $updatevars && $expandsvars && $simplevars my $sectiontab=" "; # highlight ^...href="$section" my $currenttab=" "; # highlight ^
.. my $headsection="no"; my $tailsection="no"; my $sectioninfo="no"; # using

title

= info text my $emailfooter="no"; for (source($SITEFILE)) { if (//) { warn("WARNING: do not use ," ." change to $SITEFILE" ."warning: or" ." " ." "); $sectionlayout="multi"; $sitemaplayout="multi"; } if (//) { $sectionlayout="multi"; $sitemaplayout="multi"; } if (//) { $sectionlayout="multi"; $sitemaplayout="multi"; } } sub mksite_magic_option { # $1 is word/option to check for my ($U,$INP,$Z) = @_; $INP=$SITEFILE if not $INP; for (source($INP)) { s/(/$1$2: -->/g; s/(/$1$3:$2-->/g; /.*/$1/; s/.*.*/$1/; /||g;"; push @MK_TAGS, "s|||g;"; push @MK_TAGS, "s|||g;"; push @MK_TAGS, "s|||g;"; push @MK_TAGS, "s|(<[^<>]*)\\\${[$AX]*:[?=]([^<{}>]*)}([^<>]*>)|\$1\$2\$3|g;"; my $TRIMM=" -e 's:^ *::' -e 's: *\$::'"; # trimm away leading/trailing spaces sub trimm { my ($T,$Z) = @_; $T =~ s:\A\s*::s; $T =~ s:\s*\Z::s; return $T; } sub trimmm { my ($T,$Z) = @_; $T =~ s:\A\s*::s; $T =~ s:\s*\Z::s; $T =~ s:\s+: :g; return $T; } sub timezone { # +%z is an extension while +%Z is supposed to be posix my $tz; eval { $tz = strftime("%z", localtime()) }; return $tz if $tz =~ /[+]/; return $tz if $tz =~ /[-]/; return strftime("%Z", localtime()); } sub timetoday { return strftime("%Y-%m-%d", localtime()); } sub timetodays { return strftime("%Y-%m%d", localtime()); } sub esc { my ($TXT,$XXX) = @_; $TXT =~ s|&|\\\\&|g; return $TXT; } my %SOURCE; sub source # $file : @lines { my ($FILE,$Z) = @_; if (exists $SOURCE{$FILE}) { return @{$SOURCE{$FILE}}; } my @TEXT = (); open FILE, "<$FILE" or die "could not open $FILE: $!"; for my $line () { push @TEXT, $line; } close FILE; @{$SOURCE{$FILE}} = @TEXT; return @{$SOURCE{$FILE}}; } sub savesource # $file \@lines { my ($FILE,$LINES,$Z) = @_; @{$SOURCE{$FILE}} = @{$LINES}; } my $F; # current file during loop <<<<<<<<< my $i = 100; sub savelist { if (-d "DEBUG") { my $X = "$F._$i"; $i++; $X =~ s|/|:|g; open X, ">DEBUG/$X" or die "could not open $X: $!"; print X "#! /usr/bin/perl -".$#_."$n"; print X join("$n", @{$_[0]}),$n; close X; } } sub eval_MK_LIST # $str @list { my $result = $_[0]; shift @_; my $extra = ""; my $script = "\$_ = \$result; my \$Z;"; $script .= join(";$n ", @_); $script .= "$n;\$result = \$_;$n"; eval $script; return $result.$extra; } sub eval_MK_FILE { my $FILENAME = $_[0]; shift @_; my $result = ""; my $script = "my \$FILE; my \$extra = ''; my \$Z; $n"; $script.= "for (source('$FILENAME')) { $n"; $script.= join(";$n ", @_); $script.= "$n; \$result .= \$_; "; $script.= "$n if(\$extra){\$result.=\$extra;\$extra='';\$result.=\"\\n\"}"; $script.= "$n} if(\$extra){\$result.=\$extra;}$n"; savelist([$script,""]); eval $script; return $result; } my $sed_add = "\$extra .= "; # "/r "; sub foo { print " '$F'$n"; } sub ls_s { my $result = `ls -s @_`; chomp($result); return $result; } # ====================================================================== # FUNCS my $SOURCEFILE; # current file <<<<<<<< my @FILELIST; # <<<<<<< sub sed_slash_key # helper to escape chars special in /anchor/ regex { # currently escaping "/" "[" "]" "." my $R = $_[0]; $R =~ s|[\"./[-]|\\$&|g; $R =~ s|\]|\\\\$&|g; return $R; } sub sed_piped_key # helper to escape chars special in s|anchor|| regex { # currently escaping "|" "[" "]" "." my $R = $_[0]; $R =~ s/[\".|[-]/\\$&/g; $R =~ s/\]/\\\\$&/g; return $R; } sub back_path # helper to get the series of "../" for a given path { my ($R,$Z) = @_; if ($R !~ /\//) { return ""; } $R =~ s|/[^/]*$|/|; $R =~ s|[^/]*/|../|g; return $R; } sub dir_name { my $R = $_[0]; $R =~ s:/[^/][^/]*\$::; return $R; } sub info2test_sed # \@ \@ # cut out all old-style usages { my ($INP,$XXX) = @_; $INP = \@{$INFO{$F}} if not $INP; my @OUT = (); my $V8=" *([^ ][^ ]*) (.*)"; my $V9=" *DC[.]([^ ][^ ]*) (.*)"; my $q="\\\$"; my ($_x_,$_y_,$_X_,$_Y_); my $W = "WARNING:"; $_x_= sub {"$W: assumed simplevar changed to " }; $_y_= sub {"$W: assumed simplevar changed to " }; $_X_= sub {"$W: assumed tailvar changed to " }; $_Y_= sub {"$W: assumed tailvar changed to " }; push @OUT, "s/^/ /;"; for (@$INP) { if (/^=....=formatter /) { next; }; if (/=[Tt]ext=$V9%/){ push @OUT, esc("s|.*.*|".&$_x_."|;");} if (/=[Nn]ame=$V9%/){ push @OUT, esc("s|.*.*|".&$_y_."|;");} if (/=[Tt]ext=$V8%/){ push @OUT, esc("s|.*.*|".&$_x_."|;");} if (/=[Nn]ame=$V8%/){ push @OUT, esc("s|.*.*|".&$_y_."|;");} } for (@$INP) { if (/^=....=formatter /) { next; }; if (/=[Tt]ext=$V9%/){ push @OUT, esc("s|.*.*|".&$_X_."|;");} if (/=[Nn]ame=$V9%/){ push @OUT, esc("s|.*.*|".&$_Y_."|;");} if (/=[Tt]ext=$V8%/){ push @OUT, esc("s|.*.*|".&$_X_."|;");} if (/=[Nn]ame=$V8%/){ push @OUT, esc("s|.*.*|".&$_Y_."|;");} } push @OUT, "/^WARNING:/ || next;"; return @OUT; } sub info2vars_sed # generate substition sed addon script { my ($INP,$Z) = @_; $INP = \@{$INFO{$F}} if not $INP; my @OUT = (); my $V8=" *([^ ][^ ]*) +(.*)"; my $V9=" *DC[.]([^ ][^ ]*) +(.*)"; my $N8=" *([^ ][^ ]*) ([$NN].*)"; my $N9=" *DC[.]([^ ][^ ]*) ([$NN].*)"; my $V0="([<]*)\\\$"; my $V1="([^<>]*)\\\$"; my $V2="([^{<>}]*)"; my $V3="([^<>]*)"; my $SS="<"."<>".">"; # spacer so value="2004" dont make for s|\(...\)|\12004| $Z="\$Z="; $updatevars = "no" if $commentvars eq "no"; # duplicated from $expandvars = "no" if $commentvars eq "no"; # option handling $simplevars = "no" if $commentvars eq "no"; # tests below my @_INP = (); for (@{$INP}) { my $x=$_; $x =~ s/'/\\'/; push @_INP, $x; } if ($expandvars ne "no") { for (@_INP) { if (/^=....=formatter /) { next; } elsif (/^=name=$V9/){push @OUT, "\$Z='$2';s||- \$Z|;"} elsif (/^=Name=$V9/){push @OUT, "\$Z='$2';s||(\$Z)|;"} elsif (/^=name=$V8/){push @OUT, "\$Z='$2';s||- \$Z|;"} elsif (/^=Name=$V8/){push @OUT, "\$Z='$2';s||(\$Z)|;"} } } if ($expandvars ne "no") { for (@_INP) { if (/^=....=formatter /) { next; } elsif (/^=text=$V9/){push @OUT, "\$Z='$2';s||\$1$SS\$Z|;"} elsif (/^=Text=$V9/){push @OUT, "\$Z='$2';s||\$1$SS\$Z|;"} elsif (/^=name=$V9/){push @OUT, "\$Z='$2';s||\$1$SS\$Z|;"} elsif (/^=Name=$V9/){push @OUT, "\$Z='$2';s||\$1$SS\$Z|;"} elsif (/^=text=$V8/){push @OUT, "\$Z='$2';s||\$1$SS\$Z|;"} elsif (/^=Text=$V8/){push @OUT, "\$Z='$2';s||\$1$SS\$Z|;"} elsif (/^=name=$V8/){push @OUT, "\$Z='$2';s||\$1$SS\$Z|;"} elsif (/^=Name=$V8/){push @OUT, "\$Z='$2';s||\$1$SS\$Z|;"} } } if ($simplevars ne "no" && $updatevars ne "no") { for (@_INP) { my $Q = "[$AX]*"; if (/^=....=formatter /) { next; } elsif (/^=text=$V9/){push @OUT, "\$Z='$2';s|$Q|\$Z|;"} elsif (/^=Text=$V9/){push @OUT, "\$Z='$2';s|$Q|\$Z|;"} elsif (/^=name=$V9/){push @OUT, "\$Z='$2';s|$Q|- \$Z|;"} elsif (/^=Name=$V9/){push @OUT, "\$Z='$2';s|$Q|(\$Z)|;"} elsif (/^=text=$V8/){push @OUT, "\$Z='$2';s|$Q|\$Z|;"} elsif (/^=Text=$V8/){push @OUT, "\$Z='$2';s|$Q|\$Z|;"} elsif (/^=name=$V8/){push @OUT, "\$Z='$2';s|$Q|- \$Z|;"} elsif (/^=Name=$V8/){push @OUT, "\$Z='$2';s|$Q|(\$Z)|;"} } } if ($updatevars ne "no") { for (@_INP) { my $Q = "[^<>]*"; if (/^=....=formatter /) { next; } elsif (/^=name=$V9/){push @OUT, "\$Z='$2';s|$Q|- \$Z|;"} elsif (/^=Name=$V9/){push @OUT, "\$Z='$2';s|$Q|(\$Z)|;"} elsif (/^=name=$V8/){push @OUT, "\$Z='$2';s|$Q|- \$Z|;"} elsif (/^=Name=$V8/){push @OUT, "\$Z='$2';s|$Q|(\$Z)|;"} } } if ($updatevars ne "no") { for (@_INP) { my $Q = "[^<>]*"; if (/^=....=formatter /) { next; } elsif (/^=text=$V9/){push @OUT,"\$Z='$2';s|$Q|\$1$SS\$Z|;"} elsif (/^=Text=$V9/){push @OUT,"\$Z='$2';s|$Q|\$1$SS\$Z|;"} elsif (/^=name=$V9/){push @OUT,"\$Z='$2';s|$Q|\$1$SS\$Z|;"} elsif (/^=Name=$V9/){push @OUT,"\$Z='$2';s|$Q|\$1$SS\$Z|;"} elsif (/^=text=$V8/){push @OUT,"\$Z='$2';s|$Q|\$1$SS\$Z|;"} elsif (/^=Text=$V8/){push @OUT,"\$Z='$2';s|$Q|\$1$SS\$Z|;"} elsif (/^=name=$V8/){push @OUT,"\$Z='$2';s|$Q|\$1$SS\$Z|;"} elsif (/^=Name=$V8/){push @OUT,"\$Z='$2';s|$Q|\$1$SS\$Z|;"} } } if ($attribvars ne "no") { for (@_INP) { my $Q = "[^<>]*"; if (/^=....=formatter /) { next; } elsif (/^=text=$V9/){push @OUT,"\$Z='$2';s|<$V1\{$1:[=]$V2}$V3>|<\$1$SS\$Z\$3>|;"} elsif (/^=Text=$V9/){push @OUT,"\$Z='$2';s|<$V1\{$1:[=]$V2}$V3>|<\$1$SS\$Z\$3>|;"} elsif (/^=name=$V9/){push @OUT,"\$Z='$2';s|<$V1\{$1:[?]$V2}$V3>|<\$1$SS\$Z\$3>|;"} elsif (/^=Name=$V9/){push @OUT,"\$Z='$2';s|<$V1\{$1:[?]$V2}$V3>|<\$1$SS\$Z\$3>|;"} elsif (/^=text=$V8/){push @OUT,"\$Z='$2';s|<$V1\{$1:[=]$V2}$V3>|<\$1$SS\$Z\$3>|;"} elsif (/^=Text=$V8/){push @OUT,"\$Z='$2';s|<$V1\{$1:[=]$V2}$V3>|<\$1$SS\$Z\$3>|;"} elsif (/^=name=$V8/){push @OUT,"\$Z='$2';s|<$V1\{$1:[?]$V2}$V3>|<\$1$SS\$Z\$3>|;"} elsif (/^=Name=$V8/){push @OUT,"\$Z='$2';s|<$V1\{$1:[?]$V2}$V3>|<\$1$SS\$Z\$3>|;"} } for (split / /, $o{variables}) { {push @OUT,"\$Z='$o{$_}';s|<$V1\{$_:[?]$V2}$V3>|<\$1$SS\$Z\$3>|;"} } } if ($simplevars ne "no") { for (@_INP) { my $Q = "[$AX]*"; if (/^=....=formatter /) { next; } elsif (/^=text=$V9/){push @OUT, "\$Z='$2';s|$Q|\$Z|;"} elsif (/^=Text=$V9/){push @OUT, "\$Z='$2';s|$Q|\$Z|;"} elsif (/^=name=$V9/){push @OUT, "\$Z='$2';s|$Q| - \$Z|;"} elsif (/^=Name=$V9/){push @OUT, "\$Z='$2';s|$Q| (\$Z)|;"} elsif (/^=text=$V8/){push @OUT, "\$Z='$2';s|$Q|\$Z|;"} elsif (/^=Text=$V8/){push @OUT, "\$Z='$2';s|$Q|\$Z|;"} elsif (/^=name=$V8/){push @OUT, "\$Z='$2';s|$Q| - \$Z|;"} elsif (/^=Name=$V8/){push @OUT, "\$Z='$2';s|$Q| (\$Z)|;"} } } # if value="2004" then generated sed might be "\\12004" which is bad # instead we generate an edited value of "\\1$SS$value" and cut out # the spacer now after expanding the variable values: push @OUT, "s|$SS||g;"; return @OUT; } sub info2meta_sed # generate text portion { my ($INP,$XXX) = @_; $INP = \@{$INFO{$F}} if not $INP; my @OUT = (); # http://www.metatab.de/meta_tags/DC_type.htm my $V6=" *HTTP[.]([^ ]+) (.*)"; my $V7=" *DC[.]([^ ]+) (.*)"; my $V8=" *([^ ]+) (.*)" ; sub __TYPE_SCHEME { "name=\"DC.type\" content=\"$2\" scheme=\"$1\"" }; sub __DCMI { "name=\"$1\" content=\"$2\" scheme=\"DCMIType\"" }; sub __NAME { "name=\"$1\" content=\"$2\"" }; sub __NAME_TZ { "name=\"$1\" content=\"$2 ".&timezone()."\"" }; sub __HTTP { "http-equiv=\"$1\" content=\"$2\"" }; for (@$INP) { if (/=....=today /) { next; } if (/=meta=HTTP[.]/ && /=meta=$V6/) { push @OUT, " " if $2; next; } if (/=meta=DC[.]DCMIType / && /=meta=$V7/) { push @OUT, " " if $2; next; } if (/=meta=DC[.]type Collection$/ && /=meta=$V8/) { push @OUT, " " if $2; next; } if (/=meta=DC[.]type Dataset$/ && /=meta=$V8/) { push @OUT, " " if $2; next; } if (/=meta=DC[.]type Event$/ && /=meta=$V8/) { push @OUT, " " if $2; next; } if (/=meta=DC[.]type Image$/ && /=meta=$V8/) { push @OUT, " " if $2; next; } if (/=meta=DC[.]type Service$/ && /=meta=$V8/) { push @OUT, " " if $2; next; } if (/=meta=DC[.]type Software$/ && /=meta=$V8/) { push @OUT, " " if $2; next; } if (/=meta=DC[.]type Sound$/ && /=meta=$V8/) { push @OUT, " " if $2; next; } if (/=meta=DC[.]type Text$/ && /=meta=$V8/) { push @OUT, " " if $2; next; } if (/=meta=DC[.]date[.].*[+]/ && /=meta=$V8/) { push @OUT, " " if $2; next; } if (/=meta=DC[.]date[.].*[:]/ && /=meta=$V8/) { push @OUT, " " if $2; next; } if (/=meta=/ && /=meta=$V8/) { push @OUT, " " if $2; next; } } return @OUT; } sub info_get_entry # get the first value known so far { my ($TXT,$INP,$XXX) = @_; $TXT = "sect" if not $TXT; $INP = \@{$INFO{$F}} if not $INP; for (grep {/=text=$TXT /} @$INP) { my $info = $_; $info =~ s/=text=$TXT //; chomp($info); chomp($info); return $info; } } sub info1grep # test for a substition to be already present { my ($TXT,$INP,$XXX) = @_; $TXT = "sect" if not $TXT; $INP = \@{$INFO{$F}} if not $INP; return scalar(grep {/^=text=$TXT /} @$INP); # returning the count } sub dx_init { @{$INFO{$F}} = (); &dx_meta ("formatter", basename($o{formatter})); for (split / /, $o{variables}) { # commandline --def=value if (/_/) { my $u=$_; $u =~ y/_/-/; # makes for override &dx_meta ($u, $o{$_}); } else { &dx_text ($_, $o{$_}); } } } sub dx_line { my ($U,$V,$W,$Z) = @_; chomp($U); chomp($V); push @{$INFO{$F}}, $U.$V." ".trimmm($W); } sub DX_line { my ($U,$V,$W,$Z) = @_; $W =~ s/<[^<>]*>//g; &dx_line ($U,$V,$W); } sub dx_text { my ($U,$V,$Z) = @_; &dx_line ("=text=",$U,$V); } sub DX_text # add a substition includings format variants { my ($N, $T,$XXX) = @_; $N = trimm($N); $T = trimm($T); if ($N) { if ($T) { my $text=lc("$T"); $text =~ s/<[^<>]*>//g; &dx_line ("=text=",$N,$T); &dx_line ("=name=",$N,$text); my $varname=$N; $varname =~ s/.*[.]//; # cut out front part if ($N ne $varname and $varname) { $text=lc("$varname $T"); $text =~ s/<[^<>]*>//g; &dx_line ("=Text=",$varname,$T); &dx_line ("=Name=",$varname,$text); } } } } sub dx_meta { my ($U,$V,$Z) = @_; &DX_line ("=meta=",$U,$V); } sub DX_meta # add simple meta entry and its subsitution { my ($U,$V,$Z) = @_; &DX_line ("=meta=",$U,$V); &DX_text ("$U", $V); } sub DC_meta # add new DC.meta entry plus two substitutions { my ($U,$V,$Z) = @_; &DX_line ("=meta=","DC.$U",$V); &DX_text ("DC.$U", $V); &DX_text ("$U", $V); } sub HTTP_meta # add new HTTP.meta entry plus two substitutions { my ($U,$V,$Z) = @_; &DX_line ("=meta=","HTTP.$U",$V); &DX_text ("HTTP.$U", $V); &DX_text ("$U", $V); } sub DC_VARS_Of # check DC vars as listed in $DC_VARS global/generate DC_meta { # the results will be added to .meta.tmp and .vars.tmp later my ($FILENAME,$Z)= @_; $FILENAME=$SOURCEFILE if not $FILENAME; for my $M (@DC_VARS, "title") { # scan for a of this name FIXME my ($part,$text); for (source($FILENAME)) { /<$M>/ or next; s|.*<$M>||; s|.*||; $part = trimm($_); last; } $text=$part; $text =~ s|^\w*:||; $text = trimm($text); next if not $text; # will be if ($text ne $part) { my $N=$part; $N =~ s/:.*//; &DC_meta ("$M.$N", $text); } elsif ($M eq "date") { &DC_meta ("$M.issued", $text); # "" -> "issued:" } else { &DC_meta ("$M", $text); } } } sub HTTP_VARS_Of # check HTTP-EQUIVs as listed in $_EQUIV global then { # generate meta tags that are http-equiv= instead of name= my ($FILENAME,$Z)= @_; $FILENAME=$SOURCEFILE if not $FILENAME; for my $M (@_EQUIVS) { # scan for a of this name FIXME my ($part,$text); for (source($FILENAME)) { /<$M>/ or next; s|.*<$M>||; s|.*||; $part = trimm($_); last; } $text=$part; $text =~ s|^\w*:||; $text = trimm($text); next if not $text; if ($M eq "redirect") { &HTTP_meta ("refresh", "5; url=$text"); &DX_text ("$M", $text); } elsif ($M eq "charset") { &HTTP_meta ("content-type", "text/html; charset=$text"); } else { &HTTP_meta ("$M", $text); } } } sub DC_isFormatOf # make sure there is this DC.relation.isFormatOf tag { # choose argument for a fallback (usually $SOURCEFILE) my ($NAME,$Z) = @_; $NAME=$SOURCEFILE if not $NAME; if (not &info1grep ("DC.relation.isFormatOf")) { &DC_meta ("relation.isFormatOf", "$NAME"); } } sub DC_publisher # make sure there is this DC.publisher meta tag { # choose argument for a fallback (often $USER) my ($NAME,$Z) = @_; $NAME=$ENV{"USER"} if not $NAME; if (not &info1grep ("DC.publisher")) { &DC_meta ("publisher", "$NAME"); } } sub DC_modified # make sure there is a DC.date.modified meta tag { # maybe choose from filesystem dates if possible my ($Q,$Z) = @_; # target file if (not &info1grep ("DC.date.modified")) { my @stats = stat($Q); my $text = strftime("%Y-%m-%d", localtime($stats[9])); &DC_meta ("date.modified", $text); } } sub DC_date # make sure there is this DC.date meta tag { # choose from one of the available DC.date.* specials my ($Q,$Z) = @_; # source file if (&info1grep ("DC.date")) { &DX_text ("issue", "dated ".&info_get_entry("DC.date")); &DX_text ("updated", &info_get_entry("DC.date")); } else { my $text=""; my $kind; for $kind (qw/available issued modified created/) { $text=&info_get_entry("DC.date.$kind"); # test ".$text" != "." && echo "$kind = date = $text ($Q)" last if $text; } if (not $text) { my $part; my $M="date"; for (source($Q)) { /<$M>/ or next; s|.*<$M>||; s|.*||; $part=trimm($_); last; } $text=$part; $text =~ s|^[$AA]*:||; $text = &trimm ($text); } if (not $text) { my $part; my $M="!--date:*=*--"; # takeover updateable variable... for (source($Q)) { /<$M>/ or next; s|.*<$M>||; s|/ or next; s|.*<$M>||; s|.*||; $text = trimm($_); last; } last if $text; for (source($Q)) { /<$M [^<>]*>/ or next; s|.*<$M [^<>]*>||; s|.*||; $text = trimm($_); last; } last if $text; } if (not $text) { $text=basename($Q,".html"); $text=basename($text,".htm"); $text =~ y/_/ /; $text =~ s/$/ info/; $text=~ s/\n/ /g; } $term=$text; $term =~ s/.*[\(]//; $term =~ s/[\)].*//; $text =~ s/[\(][^\(\)]*[\)]//; if (not $term or $term eq $text) { &DC_meta ("title", "$text"); } else { &DC_meta ("title", "$term - $text"); } } } sub site_get_section # return parent section page of given page { my $_F_ = &sed_slash_key(@_); for my $x (grep {/=sect=$_F_ /} @MK_INFO) { my $info = $x; $info =~ s/=sect=[^ ]* //; return $info; } } sub DC_section # not really a DC relation (shall we use isPartOf ?) { # each document should know its section father my $sectn = &site_get_section($F); if ($sectn) { &DC_meta ("relation.section", $sectn); } } sub info_get_entry_section { return &info_get_entry("DC.relation.section"); } sub site_get_selected # return section of given page { my $_F_ = &sed_slash_key(@_); for my $x (grep {/=[u]se.=$_F_ /} @MK_INFO) { my $info = $x; $info =~ s/=[u]se.=[^ ]* //; return $info; } } sub DC_selected # not really a DC title (shall we use alternative ?) { # each document might want to highlight the currently selected item my $short=&site_get_selected($F); if ($short) { &DC_meta ("title.selected", $short); } } sub info_get_entry_selected { return &info_get_entry("DC.title.selected"); } sub site_get_rootsections # return all sections from root of nav tree { my @OUT; for (grep {/=[u]se1=/} @MK_INFO) { my $x = $_; $x =~ s/=[u]se.=([^ ]*) .*/$1/; push @OUT, $x; } return @OUT; } sub site_get_sectionpages # return all children pages in the given section { my $_F_=&sed_slash_key(@_); my @OUT = (); for (grep {/^=sect=[^ ]* $_F_$/} @MK_INFO) { my $x = $_; $x =~ s/^=sect=//; $x =~ s/ .*//; push @OUT, $x; } return @OUT; } sub site_get_subpages # return all page children of given page { my $_F_=&sed_slash_key(@_); my @OUT = (); for (grep {/^=node=[^ ]* $_F_$/} @MK_INFO) { my $x = $_; $x =~ s/^=node=//; $x =~ s/ .*//; push @OUT, $x; } return @OUT; } sub site_get_parentpage # ret parent page for given page (".." for sections) { my $_F_=&sed_slash_key(@_); for (grep {/^=node=$_F_ /} @MK_INFO) { my $x = $_; $x =~ s/^=node=[^ ]* //; return $x; } } sub DX_alternative # detect wether page asks for alternative style { # which is generally a shortpage variant my ($U,$Z) = @_; my $x=&mksite_magic_option("alternative",$U); $x =~ s/^ *//; $x =~s/ .*//; if ($x) { &DX_text ("alternative", $x); } } sub info2head_sed # append alternative handling script to $HEAD { my @OUT = (); my $have=&info_get_entry("alternative"); if ($have) { push @OUT, "// && do {"; push @OUT, "s//\$1/"; push @OUT, "$sed_add \$_; last; };"; } return @OUT; } sub info2body_sed # append alternative handling script to $BODY { my @OUT = (); my $have=&info_get_entry("alternative"); if ($have) { push @OUT, "s//\$1/"; } return @OUT; } sub bodymaker_for_sectioninfo { if ($sectioninfo eq "no") { return ""; } my $_x_=""; my $_q_="([^<>]*[$AX][^<>]*)"; $_q_="[ ][ ]*$sectioninfo([ ])" if $sectioninfo ne " "; my @OUT = (); push @OUT, "s|(^<[hH][$NN][ >].*)$_q_|\$1$_x_\$2|"; push @OUT, "/$_x_/ and s|^|
|"; push @OUT, "/$_x_/ and s||&|"; push @OUT, "/$_x_/ and s|\$|
|"; push @OUT, "s|$_x_||"; return @OUT; } sub fast_href # args "$FILETOREFERENCE" "$FROMCURRENTFILE:$F" { # prints path to $FILETOREFERENCE href-clickable in $FROMCURRENTFILE # if no subdirectoy then output is the same as input $FILETOREFERENCE my ($T,$R,$Z) = @_; my $S=&back_path ($R); if (not $S) { return $T; } else { my $t=$T; $t =~ s/^ *$//; $t =~ s/^\/.*//; $t =~ s/^[.][.].*//; $t =~ s/^\w*:.*//; if (not $t) { # don't move any in the pattern above return $T; } else { return "$S$T"; # prefixed with backpath } } } sub make_fast # experimental - make a FAST file that can be applied { # to htm sourcefiles in a subdirectory of the sitefile. # R="$1" ; test ".$R" = "." && R="$F" my ($R,$Z) = @_; my $S=&back_path ($R); my @OUT = (); if (not $S) { # echo "backpath '$F' = none needed" return @OUT; } else { # print "backpath '$F' -> '$S'$n"; my @hrefs = (); for (source($SITEFILE)) { /href=\"[^\"]*\"/ or next; s/.*href=\"//; s/\".*//; chomp; if (/^ *$/ || /^\// || /^[.][.]/ || /^[\w]*:/) { next; } push @hrefs, $_; } for (source($SOURCEFILE)) { /href=\"[^\"]*\"/ or next; s/.*href=\"//; s/\".*//; chomp; if (/^ *$/ || /^\// || /^[.][.]/ || /^[\w]*:/) { next; } push @hrefs, $_; } my $ref = ""; for (sort(@hrefs)) { next if /\$/; # some href="${...}" is problematic next if $ref eq $_; $ref = $_; # uniq push @OUT, "s|href=\\\"$ref\\\"|href=\\\"$S$ref\\\"|;"; } return @OUT; } } # ============================================================== SITE MAP INFO # each entry needs atleast a list-title, a long-title, and a list-date # these are the basic information to be printed in the sitemap file # where it is bound the hierarchy of sect/subsect of the entries. sub site_map_list_title # $file $text { my ($U,$V,$Z) = @_; chomp($U); push @MK_INFO, "=list=$U ".trimm($V); } sub info_map_list_title # $file $text { my ($U,$V,$Z) = @_; chomp($U); push @{$INFO{$U}}, "=list=".trimm($V); } sub site_map_long_title # $file $text { my ($U,$V,$Z) = @_; chomp($U); push @MK_INFO, "=long=$U ".trimm($V); } sub info_map_long_title # $file $text { my ($U,$V,$Z) = @_; chomp($U); push @{$INFO{$U}}, "=long=".trimm($V); } sub site_map_list_date # $file $text { my ($U,$V,$Z) = @_; chomp($U); push @MK_INFO, "=date=$U ".trimm($V); } sub info_map_list_date # $file $text { my ($U,$V,$Z) = @_; chomp($U); push @{$INFO{$U}}, "=date=".trimm($V); } sub site_get_list_title { my ($U,$V,$Z) = @_; for (@MK_INFO) { if (m|^=list=$U (.*)|) { return $1; } } return ""; } sub site_get_long_title { my ($U,$V,$Z) = @_; for (@MK_INFO) { if (m|^=long=$U (.*)|) { return $1; } } return ""; } sub site_get_list_date { my ($U,$V,$Z) = @_; for (@MK_INFO) { if (m|^=date=$U (.*)|) { return $1; } } return ""; } sub siteinfo2sitemap# generate addon sed scriptlet { # the resulting script will act on each item/line # containing and expand any following # reference of or or my ($INP,$Z) = @_ ; $INP= \@MK_INFO if not $INP; my @OUT = (); my $_list_= sub{"s|.*|\$\&$2|"}; my $_date_= sub{"s|.*|\$\&$2|"}; my $_long_= sub{"s|.*|\$\&$2|"}; for (@$INP) { my $info = $_; $info =~ s:=list=([^ ]*) (.*):&$_list_:e; $info =~ s:=date=([^ ]*) (.*):&$_date_:e; $info =~ s:=long=([^ ]*) (.*):&$_long_:e; $info =~ /^s\|/ || next; push @OUT, $info; } return @OUT; } sub make_multisitemap { # each category gets its own column along with the usual entries my ($INPUTS,$Z)= @_ ; $INPUTS=\@MK_INFO if not $INPUTS; @MK_SITE = &siteinfo2sitemap(); # have addon-sed my @OUT = (); my $_form_= sub{"" ."
" }; my $_tiny_="small> ".$n; for (grep {/=[u]se.=/} @$INPUTS) { my $x = $_; $x =~ s|=[u]se(.)=([^ ]*) .*|&$_form_|e; $x = &eval_MK_LIST($x, @MK_SITE); $x =~ /||; $x =~ s|||; $x =~ s||
|; $x =~ s||
|; $x =~ s// /g; $x =~ s|||; $x =~ s|||; $x =~ s|
||; $x =~ s|| |; $x =~ s||
|; push @OUT, $x.$n; } push @OUT, "".$n; return @OUT; } sub make_listsitemap { # traditional - the body contains a list with date and title extras my ($INPUTS,$Z)= @_ ; $INPUTS=\@MK_INFO if not $INPUTS; @MK_SITE = &siteinfo2sitemap(); # have addon-sed my @OUT = (); my $_form_=sub{ ""}; my $_tabb_="\ \;"; push @OUT, "".$n; my $xx; for $xx (grep {/=[u]se.=/} @$INPUTS) { my $x = "".$xx; $x =~ s|=[u]se(.)=([^ ]*) .*|&$_form_|e; $x = &eval_MK_LIST($x, @MK_SITE); $x =~ /||; $x =~ s|||; $x =~ s|||; $x =~ // and $x =~ s|]*>|$&- |; $x =~ s|| |g; $x =~ s||$_tabb_|; $x =~ s||$_tabb_|; $x =~ s|||; push @OUT, $x; } for $xx (grep {/=[u]se.=/} @$INPUTS) { my $x = $xx; $x =~ s/=[u]se.=name:sitemap://; $x =~ s:\s*::gs; if (-f $x) { for (grep {//} source($x)) { push @OUT, $_; } } } push @OUT, "
*
-
|; $x =~ s|||; $x =~ s||
".$n; return @OUT; } sub print_extension { my ($ARG,$Z)= @_ ; $ARG=$o{print} if not $ARG; if ($ARG =~ /^([.-])/) { return $ARG; } else { return ".print"; } } sub html_sourcefile # generally just cut away the trailing "l" (ell) { # making "page.html" argument into "page.htm" return my ($U,$Z) = @_; my $_SRCFILE_=$U; $_SRCFILE_ =~ s/l$//; if (-f $_SRCFILE_) { return $_SRCFILE_; } elsif (-f "$o{src_dir}/$_SRCFILE_") { return "$o{src_dir}/$_SRCFILE_"; } else { return ".//$_SRCFILE_"; } } sub html_printerfile_sourcefile { my ($U,$Z) = @_; if (not $printerfriendly) { $U =~ s/l\$//; return $U; } else { my $_ext_=&sed_slash_key(&print_extension($printerfriendly)); $U =~ s/l\$//; $U =~ s/$_ext_([.][\w]*)$/$1/; return $U; } } sub fast_html_printerfile { my ($U,$V,$Z) = @_; my $x=&html_printerfile($U) ; return basename($x); # my $x=&html_printerfile($U) ; return &fast_href($x,$V); } sub html_printerfile # generate the printerfile for a given normal output { my ($U,$Z) = @_; my $_ext_=&esc(&print_extension($printerfriendly)); $U =~ s/([.][\w]*)$/$_ext_$1/; return $U; # index.html -> index.print.html } sub make_printerfile_fast # generate s/file.html/file.print.html/ for hrefs { # we do that only for the $FILELIST my ($U,$Z) = @_; my $ALLPAGES=$U; my @OUT = (); for my $p (@$ALLPAGES) { my $a=&sed_slash_key($p); my $b=&html_printerfile($p); if ($b ne $p) { $b =~ s:/:\\/:g; push @OUT, "s/])*>//;"; } } return @OUT; } sub echo_printsitefile_style { my $_bold_="text-decoration : none ; font-weight : bold ; "; return " " ."$n"; } sub make_printsitefile_head # $sitefile { my $MK_STYLE = &echo_printsitefile_style(); my @OUT = (); for (source($SITEFILE)) { if (//) { push @OUT, $_; push @OUT, $MK_STYLE; next; } if (//) { push @OUT, $_; next; } if (/<\/head>/) { push @OUT, $_; next; } if (/<body>/) { push @OUT, $_; next; } if (/<link [^<>]*rel=\"shortcut icon\"[^<>]*>/) { push @OUT, $_; next; } } return @OUT; } # ------------------------------------------------------------------------ # The printsitefile is a long text containing html href markups where # each of the href lines in the file is being prefixed with the section # relation. During a secondary call the printsitefile can grepp'ed for # those lines that match a given output fast-file. The result is a # navigation header with 1...3 lines matching the nesting level # these alt-texts will be only visible in with a text-mode browser: my $printsitefile_square="width=\"8\" height=\"8\" border=\"0\""; my $printsitefile_img_1="<img alt=\"|go text:\" $printsitefile_square />"; my $printsitefile_img_2="<img alt=\"||topics:\" $printsitefile_square />"; my $printsitefile_img_3="<img alt=\"|||pages:\" $printsitefile_square />"; my $_SECT="mksite:sect:"; sub echo_current_line # $sect $extra { # add the prefix which is used by select_in_printsitefile to cut out things my ($N,$M,$Z) = @_; return "<!--$_SECT\"$N\"-->$M"; } sub make_current_entry # $sect $file ## requires $MK_SITE { my ($S,$R,$Z) = @_; my $RR=&sed_slash_key($R); my $sep=" - " ; my $_left_=" [ " ; my $_right_=" ] "; my $name = site_get_list_title($R); $_ = &echo_current_line ("$S", "<a href=\"$R\">$name</a>$sep"); if ($R eq $S) { s/<a href/$_left_$&/; s/<\/a>/$&$_right_/; } return $_; } sub echo_subpage_line # $sect $extra { my ($N,$M,$Z) = @_; return "<!--$_SECT*:\"$N\"-->$M"; } sub make_subpage_entry { my ($S,$R,$Z) = @_; my $RR=&sed_slash_key($R); my $sep=" - " ; my $name = site_get_list_title($R); $_ = &echo_subpage_line ("$S", "<a href=\"$R\">$name</a>$sep"); return $_; } sub make_printsitefile { # building the printsitefile looks big but its really a loop over sects my ($INPUTS,$Z) = @_; $INPUTS=\@MK_INFO if not $INPUTS; @MK_SITE = &siteinfo2sitemap(); # have <name><long><date> addon-sed savelist(\@MK_SITE); my @OUT = &make_printsitefile_head ($SITEFILE); my $sep=" - " ; my $_sect1= "<a href=\"#.\" title=\"section\">$printsitefile_img_1</a> ||$sep"; my $_sect2= "<a href=\"#.\" title=\"topics\">$printsitefile_img_2</a> ||$sep"; my $_sect3= "<a href=\"#.\" title=\"pages\">$printsitefile_img_3</a> ||$sep"; my $_SECT1="mksite:sect1"; my $_SECT2="mksite:sect2"; my $_SECT3="mksite:sect3"; @MK_SECT1 = &site_get_rootsections(); # round one - for each root section print a current menu for my $r (@MK_SECT1) { push @OUT, &echo_current_line ("$r", "<!--$_SECT1:A--><br>$_sect1"); for my $s (@MK_SECT1) { push @OUT, &make_current_entry ("$r", "$s"); } push @OUT, &echo_current_line ("$r", "<!--$_SECT1:Z-->"); } # round two - for each subsection print a current and subpage menu for my $r (@MK_SECT1) { @MK_SECT2 = &site_get_subpages ("$r"); for my $s (@MK_SECT2) { push @OUT, &echo_current_line ("$s", "<!--$_SECT2:A--><br>$_sect2"); for my $t (@MK_SECT2) { push @OUT, &make_current_entry ("$s", "$t"); } # "$t" push @OUT, &echo_current_line ("$s", "<!--$_SECT2:Z-->"); } # "$s" my $_have_children_=""; for my $t (@MK_SECT2) { if (not $_have_children_) { push @OUT, &echo_subpage_line ("$r", "<!--$_SECT2:A--><br>$_sect2"); } $_have_children_ .= "1"; push @OUT, &make_subpage_entry ("$r", "$t"); } if ($_have_children_) { push @OUT, &echo_subpage_line ("$r", "<!--$_SECT2:Z-->"); } } # "$r" # round three - for each subsubsection print a current and subpage menu for my $r (@MK_SECT1) { @MK_SECT2 = &site_get_subpages ("$r"); for my $s (@MK_SECT2) { @MK_SECT3 = &site_get_subpages ("$s"); for my $t (@MK_SECT3) { push @OUT, &echo_current_line ("$t", "<!--$_SECT3:A--><br>$_sect3"); for my $u (@MK_SECT3) { push @OUT, &make_current_entry ("$t", "$u"); } # "$t" push @OUT, &echo_current_line ("$t", "<!--$_SECT3:Z-->"); } # "$t" my $_have_children_=""; for my $u (@MK_SECT3) { if (not $_have_children_) { push @OUT, &echo_subpage_line ("$s", "<!--$_SECT3:A--><br>$_sect3"); } $_have_children_ .= "1"; push @OUT, &make_subpage_entry ("$s", "$u"); } if ($_have_children_) { push @OUT, &echo_subpage_line ("$s", "<!--$_SECT3:Z-->"); } } # "$s" } # "$r" push @OUT, "<a name=\".\"></a>"; push @OUT, "</body></html>"; return @OUT; } # create a selector that can grep a printsitefile for the matching entries sub select_in_printsitefile # arg = "page" : return to stdout >> $P.$HEAD { my ($N,$Z) = @_; my $_selected_="$N" ; $_selected_="$F" if not $_selected_; my $_section_=&sed_slash_key($_selected_); my @OUT = (); push @OUT, "s/^<!--$_SECT\\\"$_section_\\\"-->//;"; # sect3 push @OUT, "s/^<!--$_SECT\[*\]:\\\"$_section_\\\"-->//;"; # children $_selected_=&site_get_parentpage($_selected_); if ($F =~ /testscript/) { print "($F)parent=$_selected_$n"; } $_section_=&sed_slash_key($_selected_); push @OUT, "s/^<!--$_SECT\\\"$_section_\\\"-->//;"; # sect2 $_selected_=&site_get_parentpage($_selected_); $_section_=&sed_slash_key($_selected_); push @OUT, "s/^<!--$_SECT\\\"$_section_\\\"-->//;"; # sect1 push @OUT, "/^<!--$_SECT\\\"[^\\\"]*\\\"-->/ and next;"; push @OUT, "/^<!--$_SECT\[*\]:\\\"[^\\\"]*\\\"-->/ and next;"; push @OUT, "s/^<!--mksite:sect[$NN]:[$AZ]-->//;"; return @OUT; } sub body_for_emailfooter { return "" if $emailfooter eq "no"; my $_email_=$emailfooter; $_email_ =~ s|[?].*||; my $_dated_=&info_get_entry("updated"); return "<hr><table border=\"0\" width=\"100%\"><tr><td>" ."$n"."<a href=\"mailto:$emailfooter\">$_email_</a>" ."$n"."</td><td align=\"right\">" ."$n"."$_dated_</td></tr></table>" ."$n"; } # ========================================================================== # # During processing we will create a series of intermediate files that # store relations. They all have the same format being # =relationtype=key value # where key is usually s filename or an anchor. For mere convenience # we assume that the source html text does not have lines that start # off with =xxxx= (btw, ye remember perl section notation...). Of course # any other format would be usuable as well. # # we scan the SITEFILE for href references to be converted # - in the new variant we use a ".gets.tmp" sed script that SECTS # marks all interesting lines so they can be checked later # with an sed anchor of <!--sect[$NN]--> (or <!--sect[$AZ]-->) my $S="\\ \\;"; # S="[&]nbsp[;]" # HR and EM style markups must exist in input - BR sometimes left out # these routines in(ter)ject hardspace before, between, after markups # note that "<br>" is sometimes used with HR - it must exist in input sub echo_HR_EM_PP { my ($U,$V,$W,$X,$Z) = @_; my @list = ( "/^$U$V$W*<a href=/ and s/^/$X/;", "/^<>$U$V$W*<a href=/ and s/^/$X/;", "/^$S$U$V$W*<a href=/ and s/^/$X/;", "/^$U<>$V$W*<a href=/ and s/^/$X/;", "/^$U$S$V$W*<a href=/ and s/^/$X/;", "/^$U$V<>$W*<a href=/ and s/^/$X/;", "/^$U$V$S$W*<a href=/ and s/^/$X/;" ); return @list; } sub echo_br_EM_PP { my ($U,$V,$W,$X,$Z) = @_; my @list = &echo_HR_EM_PP ("$U", "$V", "$W", "$X"); my @listt = ( "/^$V$W*<a href=/ and s/^/$X/;", "/^<>$V$W*<a href=/ and s/^/$X/;", "/^$S$V$W*<a href=/ and s/^/$X/;", "/^$V<>$W*<a href=/ and s/^/$X/;", "/^$V$S$W*<a href=/ and s/^/$X/;" ); push @list, @listt; return @list; } sub echo_HR_PP { my ($U,$V,$W,$Z) = @_; my @list = ( "/^$U$V*<a href=/ and s/^/$W/;", "/^<>$U$V*<a href=/ and s/^/$W/;", "/^$S$U$V*<a href=/ and s/^/$W/;", "/^$U<>$V*<a href=/ and s/^/$W/;", "/^$U$S$V*<a href=/ and s/^/$W/;" ); return @list; } sub echo_br_PP { my ($U,$V,$W,$Z) = @_; my @list = &echo_HR_PP ("$U", "$V", "$W"); my @listt = ( "/^$V*<a href=/ and s/^/$W/;", "/^<>$V*<a href=/ and s/^/$W/;", "/^$S$V*<a href=/ and s/^/$W/;" ); push @list, @listt; return @list; } sub echo_sp_PP { my ($U,$V,$Z) = @_; my @list = ( "/^<>$U*<a href=/ and s/^/$V/;", "/^$S$U*<a href=/ and s/^/$V/;", "/^<><>$U*<a href=/ and s/^/$V/;", "/^$S$S$U*<a href=/ and s/^/$V/;", "/^<>$U<>*<a href=/ and s/^/$V/;", "/^$S$U$S*<a href=/ and s/^/$V/;", "/^$U<><>*<a href=/ and s/^/$V/;", "/^$U$S$S*<a href=/ and s/^/$V/;", "/^$U<>*<a href=/ and s/^/$V/;", "/^$U$S*<a href=/ and s/^/$V/;" ); return @list; } sub echo_sp_sp { my ($U,$V,$Z) = @_; my @list = ( "/^$U*<a name=/ and s/^/$V/;", "/^<>$U*<a name=/ and s/^/$V/;", "/^$S$U*<a name=/ and s/^/$V/;", "/^<><>$U*<a name=/ and s/^/$V/;", "/^$S$S$U*<a name=/ and s/^/$V/;", "/^<>$U<>*<a name=/ and s/^/$V/;", "/^$S$U$S*<a name=/ and s/^/$V/;", "/^$U<><>*<a name=/ and s/^/$V/;", "/^$U$S$S*<a name=/ and s/^/$V/;", "/^$U<>*<a name=/ and s/^/$V/;", "/^$U$S*<a name=/ and s/^/$V/;" ); return @list; } sub make_sitemap_init { # build a list of detectors that map site.htm entries to a section table # note that the resulting .gets.tmp / .puts.tmp are real sed-script my $h1="[-|[]"; my $b1="[*=]"; my $b2="[-|[]"; my $b3="[\\/:]"; my $q3="[\\/:,[]"; @MK_GETS = (); push @MK_GETS, &echo_HR_PP ("<hr>", "$h1", "<!--sect1-->"); push @MK_GETS, &echo_HR_EM_PP("<hr>","<em>", "$h1", "<!--sect1-->"); push @MK_GETS, &echo_HR_EM_PP("<hr>","<strong>", "$h1", "<!--sect1-->"); push @MK_GETS, &echo_HR_PP ("<br>", , "$b1$b1", "<!--sect1-->"); push @MK_GETS, &echo_HR_PP ("<br>", , "$b2$b2", "<!--sect2-->"); push @MK_GETS, &echo_HR_PP ("<br>", , "$b3$b3", "<!--sect3-->"); push @MK_GETS, &echo_br_PP ("<br>", , "$b2$b2", "<!--sect2-->"); push @MK_GETS, &echo_br_PP ("<br>", , "$b3$b3", "<!--sect3-->"); push @MK_GETS, &echo_br_EM_PP("<br>","<small>" , "$q3" , "<!--sect3-->"); push @MK_GETS, &echo_br_EM_PP("<br>","<em>" , "$q3" , "<!--sect3-->"); push @MK_GETS, &echo_br_EM_PP("<br>","<u>" , "$q3" , "<!--sect3-->"); push @MK_GETS, &echo_HR_PP ("<br>", , "$q3" , "<!--sect3-->"); push @MK_GETS, &echo_sp_PP ( "$q3" , "<!--sect3-->"); push @MK_GETS, &echo_sp_sp ( "$q3" , "<!--sect9-->"); @MK_PUTS = map { my $x=$_; $x =~ s/(>)(\[)/$1 *$2/; $x } @MK_GETS; # the .puts.tmp variant is used to <b><a href=..></b> some hrefs which # shall not be used otherwise for being generated - this is nice for # some quicklinks somewhere. The difference: a whitspace "<hr> <a...>" } my $_uses_= sub{"=use$1=$2 $3" }; my $_name_= sub{"=use$1=name:$2 $3" }; my $_getW_="<!--sect([$NN])-->"; my $_getX_="<!--sect([$NN])--><[^<>]*>[^<>]*"; my $_getY_="<!--sect([$NN])--><[^<>]*>[^<>]*<[^<>]*>[^<>]*"; sub make_sitemap_list { # scan sitefile for references pages - store as "=use+=href+ anchortext" for (source($SITEFILE)) { # print join("$n;",@MK_GETS),$n; $_ = &eval_MK_LIST($_, @MK_GETS); /^<!--sect[$NN]-->/ or next; s{^$_getX_<a href=\"([^\"]*)\"[^<>]*>(.*)</a>.*}{&$_uses_}e; s{^$_getY_<a href=\"([^\"]*)\"[^<>]*>(.*)</a>.*}{&$_uses_}e; s{^$_getW_<a name=\"([^\"]*)\"[^<>]*>(.*)</a>.*}{&$_name_}e; s{^$_getX_<a name=\"([^\"]*)\"[^<>]*>(.*)</a>.*}{&$_name_}e; s{^$_getY_<a name=\"([^\"]*)\"[^<>]*>(.*)</a>.*}{&$_name_}e; /^=....=/ or next; push @MK_INFO, $_; } } sub make_sitemap_sect { # scan used pages and store prime section group relation =sect= and =node= # (A) each "use1" creates "=sect=href+ href1" for all following non-"use1" # (B) each "use1" creates "=node=href2 href1" for all following "use2" my $sect = ""; for (grep {/=[u]se.=/} @MK_INFO) { if (/=[u]se1=([^ ]*) .*/) { $sect = $1; } my $x = $_; $x =~ s/=[u]se.=([^ ]*) .*/=sect=$1/; chomp $x; push @MK_INFO, "$x $sect"; } for (grep {/=[u]se.=/} @MK_INFO) { if (/=[u]se1=([^ ]*) .*/) { $sect = $1; } /=[u]se[13456789]=/ and next; my $x = $_; $x =~ s/=[u]se.=([^ ]*) .*/=node=$1/; chomp $x; push @MK_INFO, "$x $sect"; } } sub make_sitemap_page { # scan used pages and store secondary group relation =page= and =node= # the parenting =node= for use3 is usually a use2 (or use1 if none there) my $sect = ""; for (grep {/=[u]se.=/} @MK_INFO) { if (/=[u]se1=([^ ]*) .*/) { $sect = $1; } if (/=[u]se2=([^ ]*) .*/) { $sect = $1; } /=[u]se[1]=/ and next; my $x = $_; $x =~ s/=[u]se.=([^ ]*) .*/=page=$1/; chomp $x; push @MK_INFO, "$x $sect"; } for (grep {/=[u]se.=/} @MK_INFO) { if (/=[u]se1=([^ ]*) .*/) { $sect = $1; } if (/=[u]se2=([^ ]*) .*/) { $sect = $1; } /=[u]se[12456789]=/ and next; my $x = $_; $x =~ s/=[u]se.=([^ ]*) .*/=node=$1/; chomp $x; push @MK_INFO, "$x $sect"; print "(",$_,")","$x $sect", $n; } # and for the root sections we register ".." as the parenting group for (grep {/=[u]se1=/} @MK_INFO) { my $x = $_; $x =~ s/=[u]se.=([^ ]*) .*/=node=$1/; chomp $x; push @MK_INFO, trimm("$x .."); } } sub echo_site_filelist { my @OUT = (); for (grep {/=[u]se.=/} @MK_INFO) { my $x = $_; $x =~ s/=[u]se.=//; $x =~ s/ .*[\n]*//; push @OUT, $x; } return @OUT; } # ========================================================================== # originally this was a one-pass compiler but the more information # we were scanning out the more slower the system ran - since we # were rescanning files for things like section information. Now # we scan the files first for global information. # 1.PASS sub scan_sitefile # $F { $SOURCEFILE=&html_sourcefile($F); if ($SOURCEFILE ne $F) { dx_init "$F"; dx_text ("today", &timetoday()); my $short=$F; $short =~ s:.*/::; $short =~ s:[.].*::; # basename for all exts $short .=" ~"; DC_meta ("title", "$short"); DC_meta ("date.available", &timetoday()); DC_meta ("subject", "sitemap"); DC_meta ("DCMIType", "Collection"); DC_VARS_Of ($SOURCEFILE) ; HTTP_VARS_Of ($SOURCEFILE) ; DC_modified ($SOURCEFILE) ; DC_date ($SOURCEFILE); DC_section ($F); DX_text ("date.formatted", &timetoday()); if ($printerfriendly) { DX_text ("printerfriendly", fast_html_printerfile($F)); } if ($ENV{USER}) { DC_publisher ($ENV{USER}); } print "'$SOURCEFILE': $short (sitemap)$n"; site_map_list_title ($F, "$short"); site_map_long_title ($F, "generated sitemap index"); site_map_list_date ($F, &timetoday()); } } sub scan_htmlfile # "$F" { my ($FF,$Z) = @_; $SOURCEFILE=&html_sourcefile($F); # SCAN : if ($SOURCEFILE ne $F) { # HTML : if ( -f $SOURCEFILE) { @{$FAST{$F}} = &make_fast ($F); dx_init "$F"; dx_text ("today", &timetoday()); dx_text ("todays", &timetodays()); DC_VARS_Of ($SOURCEFILE); HTTP_VARS_Of ($SOURCEFILE); DC_title ($SOURCEFILE); DC_isFormatOf ($SOURCEFILE); DC_modified ($SOURCEFILE); DC_date ($SOURCEFILE); DC_date ($SITEFILE); DC_section ($F); DC_selected ($F); DX_alternative ($SOURCEFILE); if ($ENV{USER}) { DC_publisher ($ENV{USER}); } DX_text ("date.formatted", &timetoday()); if ($printerfriendly) { DX_text ("printerfriendly", fast_html_printerfile($F)); } my $sectn=&info_get_entry("DC.relation.section"); my $short=&info_get_entry("DC.title.selected"); &site_map_list_title ($F, "$short"); &info_map_list_title ($F, "$short"); my $title=&info_get_entry("DC.title"); &site_map_long_title ($F, "$title"); &info_map_long_title ($F, "$title"); my $edate=&info_get_entry("DC.date"); my $issue=&info_get_entry("issue"); &site_map_list_date ($F, "$edate"); &info_map_list_date ($F, "$edate"); print "'$SOURCEFILE': '$title' ('$short') @ '$issue' ('$sectn')$n"; }else { print "'$SOURCEFILE': does not exist$n"; site_map_list_title ($F, "$F"); site_map_long_title ($F, "$F (no source)"); } } else { print "<$F> - skipped - ($SOURCEFILE)$n"; } } sub scan_namespec { # nothing so far # my ($F,$ZZZ) = @_; if ($F =~ /^name:sitemap:/) { my $short=$F; $short =~ s:.*/::; $short =~ s:[.].*::; # basename for all exts $short =~ s/name:sitemap://; $short .=" ~"; site_map_list_title ($F, "$short"); site_map_long_title ($F, "external sitemap index"); site_map_list_date ($F, &timetoday()); print "'$F' external sitemap index$n"; } } sub scan_httpspec { # nothing so far } sub skip_namespec { # nothing so far } sub skip_httpspec { # nothing so far } # ========================================================================== # and now generate the output pages # 2.PASS sub head_sed_sitemap # $filename $section { my ($U,$V,$Z) = @_; my $FF=&sed_slash_key($U); my $SECTION=&sed_slash_key($V); my $SECTS="<!--sect[$NN$AZ]-->" ; my $SECTN="<!--sect[$NN]-->"; # lines with hrefs my @OUT = (); push @OUT, "/^$SECTS.*<a href=\\\"$FF\\\">/ and s|</a>|</a></b>|;"; push @OUT, "/^$SECTS.*<a href=\\\"$FF\\\">/ and s|<a href=|<b><a href=|;"; push @OUT, "/ href=\\\"$SECTION\\\"/ " ."and s|^<td class=\\\"[^\\\"]*\\\"|<td |;" if $sectiontab ne "no"; return @OUT; } sub head_sed_listsection # $filename $section { # traditional.... the sitefile is the full navigation bar my ($U,$V,$Z) = @_; my $FF=&sed_slash_key($U); my $SECTION=&sed_slash_key($V); my $SECTS="<!--sect[$NN$AZ]-->" ; my $SECTN="<!--sect[$NN]-->"; # lines with hrefs my @OUT = (); push @OUT, "/^$SECTS.*<a href=\\\"$FF\\\">/ and s|</a>|</a></b>|;"; push @OUT, "/^$SECTS.*<a href=\\\"$FF\\\">/ and s|<a href=|<b><a href=|;"; push @OUT, "/ href=\\\"$SECTION\\\"/ " ."and s|^<td class=\\\"[^\\\"]*\\\"|<td |;" if $sectiontab ne "no"; return @OUT; } sub head_sed_multisection # $filename $section { # sitefile navigation bar is split into sections my ($U,$V,$Z) = @_; my $FF=&sed_slash_key($U); my $SECTION=&sed_slash_key($V); my $SECTS="<!--sect[$NN$AZ]-->" ; my $SECTN="<!--sect[$NN]-->"; # lines with hrefs my @OUT = (); # grep all pages with a =sect= relation to current $SECTION and # build foreach an sed line "s|$SECTS\(<a href=$F>\)|<!--sectX-->\1|" # after that all the (still) numeric SECTNs are deactivated / killed. for my $section ($SECTION, $headsection, $tailsection) { next if $section eq "no"; for (grep {/^=sect=[^ ]* $section/} @MK_INFO) { my $x = $_; $x =~ s, .*,\\\"\)|<!--sectX-->\$1|,; $x =~ s,^=sect=,s|^$SECTS\(.*<a href=\\\",; push @OUT, $x.";"; } } push @OUT, "s|^$SECTN\[^ \]*(<a href=[^<>]*>).*|<!-- \$1 -->|;"; push @OUT, "/^$SECTS.*<a href=\\\"$FF\\\">/ and s|</a>|</a></b>|;"; push @OUT, "/^$SECTS.*<a href=\\\"$FF\\\">/ and s|<a href=|<b><a href=|;"; push @OUT, "/ href=\\\"$SECTION\\\"/ " ."and s|^<td class=\\\"[^\\\"]*\\\"|<td |;" if $sectiontab ne "no"; return @OUT; } sub make_sitefile # "$F" { $SOURCEFILE=&html_sourcefile($F); if ($SOURCEFILE ne $F) { if (-f $SOURCEFILE) { # remember that in this case "${SITEFILE}l" = "$F" = "${SOURCEFILE}l" @MK_VARS = &info2vars_sed(); # have <!--title--> vars substituted @MK_META = &info2meta_sed(); # add <meta name="DC.title"> values if ( $simplevars eq "warn") { @MK_TEST = &info2test_sed(); # check <!--title--> vars old-style ## $SED_LONGSCRIPT ./$MK_TEST $SOURCEFILE | tee -a ./$MK_OLDS ; fi } my @F_HEAD = (); my @F_FOOT = (); push @F_HEAD, @MK_PUTS; push @F_HEAD, &head_sed_sitemap ($F, &info_get_entry_section()); push @F_HEAD, "/<head>/ and $sed_add join(\"\\n\", \@MK_META);"; push @F_HEAD, @MK_VARS; push @F_HEAD, @MK_TAGS; push @F_HEAD, "/<\\/body>/ and next;"; #cut lastline if ( $sitemaplayout eq "multi") { push @F_FOOT, &make_multisitemap(); # here we use ~foot~ to } else { push @F_FOOT, &make_listsitemap(); # hold the main text } my $html = ""; # $html .= &eval_MK_FILE($SITEFILE, @F_HEAD); $html .= join("", @F_FOOT); for (source($SITEFILE)) { /<\/body>/ or next; $html .= &eval_MK_LIST($_, @MK_VARS); } open F, ">$F"; print F $html; close F; print "'$SOURCEFILE': ",ls_s($SOURCEFILE)," >-> ",ls_s($F),"$n"; savesource("$F.~head~", \@F_HEAD); savesource("$F.~foot~", \@F_FOOT); } else { print "'$SOURCEFILE': does not exist$n"; } } } sub make_htmlfile # "$F" { $SOURCEFILE=&html_sourcefile($F); # 2.PASS if ("$SOURCEFILE" ne "$F") { if (-f "$SOURCEFILE") { if (grep {/<meta name="formatter"/} source($SOURCEFILE)) { print "$SOURCEFILE: SKIP, this sourcefile looks like a formatted file$n"; print "$SOURCEFILE: (may be a sourcefile in place of a targetfile?)$n"; return; } @MK_VARS = &info2vars_sed(); # have <!--title--> vars substituted @MK_META = &info2meta_sed(); # add <meta name="DC.title"> values if ( $simplevars eq "warn") { @MK_TEST = &info2test_sed(); # check <!--title--> vars old-style ## $SED_LONGSCRIPT ./$MK_TEST $SOURCEFILE | tee -a ./$MK_OLDS ; fi } my @F_HEAD = (); my @F_BODY = (); my $F_FOOT = ""; push @F_HEAD, @MK_PUTS; if ( $sectionlayout eq "multi") { push @F_HEAD, &head_sed_multisection ($F, &info_get_entry_section()); } else { push @F_HEAD, &head_sed_listsection ($F, &info_get_entry_section()); } push @F_HEAD, @MK_VARS; push @F_HEAD, @MK_TAGS; #tag and vars push @F_HEAD, "/<\\/body>/ and next;"; #cut lastline push @F_HEAD, "/<head>/ and $sed_add join(\"\\n\",\@MK_META);"; #add metatags push @F_BODY, "/<title>/ and next;"; #not that line push @F_BODY, @MK_VARS; push @F_BODY, @MK_TAGS; #tag and vars push @F_BODY, &bodymaker_for_sectioninfo(); #if sectioninfo push @F_BODY, &info2body_sed(); #cut early push @F_HEAD, &info2head_sed(); push @F_HEAD, @{$FAST{$F}}; if ($emailfooter ne "no") { $F_FOOT = &body_for_emailfooter(); } my $html = ""; $html .= eval_MK_FILE($SITEFILE, @F_HEAD); $html .= eval_MK_FILE($SOURCEFILE, @F_BODY); $html .= $F_FOOT; for (source($SITEFILE)) { /<\/body>/ or next; $_ = &eval_MK_LIST($_, @MK_VARS); $html .= $_; } savelist(\@{$INFO{$F}}); open F, ">$F" or die "could not write $F: $!"; print F $html; close F; print "'$SOURCEFILE': ",&ls_s($SOURCEFILE)," -> ",&ls_s($F),"$n"; savesource("$F.~head~", \@F_HEAD); savesource("$F.~body~", \@F_BODY); } else { print "'$SOURCEFILE': does not exist$n"; }} else { print "<$F> - skipped$n"; } } my $PRINTSITEFILE; sub make_printerfriendly # "$F" { # PRINTER my $printsitefile="0"; # FRIENDLY my @F_FAST = (); my $BODY_TXT; my $BODY_SED; my $P=&html_printerfile ($F); my @P_HEAD = (); my @P_BODY = (); if ("$F" =~ /^(${SITEFILE}|${SITEFILE}l)$/) { @F_FAST = &make_fast ("$F"); $printsitefile=">=>" ; $BODY_TXT="$F.~foot~" ; } elsif ("$F" =~ /^(.*[.]html)$/) { $printsitefile="=>" ; $BODY_TXT="$SOURCEFILE"; } if (grep {/<meta name="formatter"/} source($BODY_TXT)) { return; } if ($printsitefile ne "0" and -f $SOURCEFILE) { @MK_FAST = &make_printerfile_fast (\@FILELIST); push @P_HEAD, @MK_VARS; push @P_HEAD, @MK_TAGS; push @P_HEAD, @MK_FAST; @MK_METT = map { my $x = $_; $x =~ /DC.relation.isFormatOf/ and $x =~ s|content=\"[^\"]*\"|content=\"$F\"| ; $x } @MK_META; push @P_HEAD, "/<head>/ and $sed_add join(\"\\n\", \@MK_METT);"; push @P_HEAD, "/<\\/body>/ and next;"; push @P_HEAD, &select_in_printsitefile ("$F"); my $_ext_=&print_extension($printerfriendly); push @P_HEAD, map { my $x=$_; $x =~ s/[.]html\"|/$_ext_$&/g; $x} @F_FAST; # my $line_=&sed_slash_key($printsitefile_img_2); push @P_HEAD, "/\\|\\|topics:/" ." and s| href=\\\"\\#\\.\\\"| href=\\\"$F\\\"|;"; push @P_HEAD, "/\\|\\|\\|pages:/" ." and s| href=\\\"\\#\\.\\\"| href=\\\"$F\\\"|;"; push @P_HEAD, @F_FAST; push @P_BODY, @MK_VARS; push @P_BODY, @MK_TAGS; push @P_BODY, @MK_FAST; push @P_BODY, map { my $x=$_; $x =~ s/[.]html\"|/$_ext_$&/g; $x} @F_FAST; push @P_BODY, @F_FAST; my $html = ""; $html .= eval_MK_FILE($PRINTSITEFILE, @P_HEAD); $html .= eval_MK_FILE($BODY_TXT, @P_BODY); for (source($PRINTSITEFILE)) { /<\/body>/ or next; $_ = &eval_MK_LIST($_, @MK_VARS); $html .= $_; } open P, ">$P" or die "could not write $P: $!"; print P $html; close P; print "'$SOURCEFILE': ",ls_s($SOURCEFILE)," $printsitefile ",ls_s($P),"$n"; } } # ======================================================================== # ======================================================================== # ======================================================================== # ======================================================================== # #### 0. INIT $F=$SITEFILE; &make_sitemap_init(); &make_sitemap_list(); &make_sitemap_sect(); &make_sitemap_page(); savelist(\@MK_INFO); @FILELIST=&echo_site_filelist(); if ($o{filelist} or $o{list} eq "file" or $o{list} eq "files") { for (@FILELIST) { print $_,"$n"; } exit; # --filelist } if ($o{files}) { @FILELIST=split(/ /, $o{files}); } # --files if ($#FILELIST < 0) { print STDERR "nothing to do$n"; } if ($#FILELIST == 0 and $FILELIST[0] eq $SITEFILE) { print STDERR "only '$SITEFILE'!?$n"; } for (@FILELIST) { #### 1. PASS $F = $_; if (/^(name:.*)$/) { &scan_namespec ("$F"); } elsif (/^(http:.*|.*:\/\/.*)$/) { &scan_httpspec ("$F"); } elsif (/^(${SITEFILE}|${SITEFILE}l)$/) { &scan_sitefile ("$F") ;; # ........... SCAN SITE } elsif (/^(\.\.\/.*)$/) { print "!! -> '$F' (skipping topdir build)$n"; # */*.html) # make_fast # try for later subdir build # echo "!! -> '$F' (skipping subdir build)" # ;; # */*/*/|*/*/|*/|*/index.htm|*/index.html) # echo "!! -> '$F' (skipping subdir index.html)" # ;; } elsif (/^(.*\.html)$/) { &scan_htmlfile ("$F") ;; # ........... SCAN HTML } elsif (/^(.*\/)$/) { print "'$F' : directory - skipped$n"; &site_map_list_title ("$F", &sed_slash_key($F)); &site_map_long_title ("$F", "(directory)"); } else { print "?? -> '$F'$n"; } } if ($printerfriendly) { # .......... PRINT VERSION my $_ext_=esc(&print_extension($printerfriendly)); $PRINTSITEFILE=$SITEFILE; $PRINTSITEFILE =~ s/(\.\w*)$/$_ext_$1/; $F=$PRINTSITEFILE; my @TEXT = &make_printsitefile(); print "NOTE: going to create printer-friendly sitefile '$PRINTSITEFILE'" ." $F._$i$n"; savelist(\@TEXT); my @LINES = map { chomp; $_."$n" } @TEXT; savesource($PRINTSITEFILE, \@LINES); if (1) { if (open PRINTSITEFILE, ">$PRINTSITEFILE") { print PRINTSITEFILE join("", @LINES); close PRINTSITEFILE; } } } if ($simplevars eq " ") { @MK_OLDS = (); } for (@FILELIST) { #### 2. PASS $F = $_; if (/^(name:.*)$/) { &skip_namespec ("$F") ;; } elsif (/^(http:.*|.*:\/\/.*)$/) { &skip_httpspec ("$F") ;; } elsif (/^(${SITEFILE}|${SITEFILE}l)$/) { &make_sitefile ("$F") ;; # ........ SITE FILE &make_printerfriendly ("$F") if ($printerfriendly); } elsif (/^(\.\.\/.*)$/) { print "!! -> '$F' (skipping topdir build)$n"; # */*.html) # echo "!! -> '$F' (skipping subdir build)" # ;; # */*/*/|*/*/|*/|*/index.htm|*/index.html) # echo "!! -> '$F' (skipping subdir index.html)" # ;; } elsif (/^(.*\.html)$/) { &make_htmlfile ("$F") ;; # .................. HTML FILES &make_printerfriendly ("$F") if ($printerfriendly); } elsif (/^(.*\/)$/) { print "'$F' : directory - skipped$n"; } else { print "?? -> '$F'$n"; } # .............. debug .................... ## if test -d DEBUG && test -f "./$F" ; then ## cp ./$F.$INFO DEBUG/$F.info.TMP ## for P in tags vars meta page date list html sect info ; do ## test -f ./$MK.$P.tmp && cp ./$MK.$P.tmp DEBUG/$F.$P.tmp ## test -f ./$MK.$P.TMP && cp ./$MK.$P.TMP DEBUG/$F.$P.TMP ## done ## fi } # done if ( $simplevars eq "warn") { my $oldvars = $#MK_OLDS; $oldvars ++; if (not $oldvars) { print "HINT: you have no simplevars in your htm sources, so you may want to$n"; print "hint: set the magic <!--mksite:nosimplevars--> in your $SITEFILE$n"; print "hint: which makes execution _faster_ actually in the 2. pass$n"; print "note: simplevars expansion was the oldstyle way of variable expansion$n"; } else { print "HINT: there were $oldvars simplevars found in your htm sources.$n"; print "hint: This style of variable expansion will be disabled in the near$n"; print "hint: future. If you do not want change then add the $SITEFILE magic$n"; print "hint: <!--mksite:simplevars--> somewhere to suppress this warning$n"; print "note: simplevars expansion will be an explicit option in the future.$n"; print "note: errornous simplevar detection can be suppressed with a magic$n"; print "note: hint of <!--mksite:nosimplevars--> in the $SITEFILE for now.$n"; } } ## rm ./$MK.*.tmp exit 0