home
sections
references
cd:s
about
links
heptagon
margins
view as white text on black backgound
(If you switched to white background just to print out this page, you can always switch back to white-on-black and normal margins.)
Listing of parse.cgi
#!/usr/local/bin/perl5 -T
$index = ($0 =~ /index.cgi/i);
$heading_two = 4;
$heading_one = 2;
$keywords = "Jens Johansson home page";
$footnotes_used = 0;
$unix = ($ENV{'COMSPEC'} eq "" );
$user_agent = $ENV{'HTTP_USER_AGENT'};
$lynx = ($user_agent =~ /lynx/i);
$msie = ($user_agent =~ /msie/i);
if ($lynx) {
$heading_two = 2;
$heading_one = 1;
}
#$smiley = "";
#$smiley = "<moronic giggle>";
$smiley = "<g>";
$hspace = 15;
$spacerzzz = "<img src=\"/stuff/2x2.gif\" alt=\"\" hspace=$hspace>";
$title = "n/a";
$fontname = "arial,helvetica";
srand; # randomize
$* = 1; # multiline string matching
if ($index) {
open (IN, "./index.par");
$in_file = "index.par";
} else {
if ($ENV{'PATH_INFO'} eq "") {
open (IN, "-");
$stdin_infile = 1;
} else {
$arguments = $ENV{'PATH_INFO'};
if ($ENV{'CONTENT_LENGTH'} !~ /^\s*0\s*$/) {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@postdata = split(/&/, $buffer);
foreach $pair (@postdata) {
($post_name, $post_value) = split(/=/, $pair);
$post_value =~ tr/+/ /;
$post_value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
if ($post_name =~ /COOKIE/i && $post_name !~ /SHOWCOOKIES/i) {
$post_arguments .= "^" . $post_value;
} else {
$post_arguments .= "^" . $post_name . "_" . $post_value;
}
}
$post_arguments =~ s/^\^//;
}
$arguments =~ s/(^[^\^]*)\^?//;
$in_file = $1;
open (IN, $in_file);
@set_cookies = (split(/\^/, $arguments), split(/\^/, $post_arguments));
foreach (@ARGV) {
push (@set_cookies, split(/\^/) );
}
foreach (@set_cookies) {if (/^fc(.+)$/) {push(@fake_cookies, $1); undef $_; }}
}
}
($in_dev, $in_ino, $in_mode, $in_nlink, $in_uid, $in_gid, $in_rdev,
$in_size, $in_atime, $in_mtime, $in_ctime, $in_blksize, $in_blocks)
= stat(IN);
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst)
= localtime($in_mtime);
$in_modtime = sprintf("%s %d, %d at %02d:%02d",
('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')[$mon],
$mday, $year+1900, $hour, $min);
$in_file =~ s/\#.*$//;
$in_file =~ s/\^.*$//;
while (<IN>) {
if (/^\s*\#\# \/omit \#\#/i) {$convert_omit = 0; next;}
if ($convert_omit) {next; }
if (/^\s*\#\# \/graphical \#\#/i) {$omit_g = 0; next;}
if ($omit_g && ($lynx) ) {next; }
if (/^\s*\#\# \/nographical \#\#/i) {$omit_ng = 0; next;}
if ($omit_ng && (!$lynx) ) {next; }
if (/\s*^\#\# fakecookies? (.*) \#\#$/) {
push(@fake_cookies, split(/\^/, $1));
next;
}
if (/^\s*\#\# polyexpand (.*)\s*\#\#/i) {
my $p = $1; my $pe = $p; my @lines;
$pe =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($&))/eg;
unless ($lynx) { #arrgghh
while ($p =~ /(.{40,80}?\|)(.+)/ or $p =~ /(.{50,100}?) (.+)/) {
push(@lines, $1); $p = $2;
}
push(@lines, $p);
$_ = "<pre>";
foreach my $line (@lines) {
foreach ($line) {s/^\s+//; s/\s+$//; }
$_ .= "\t<a href=\"/polymath.cgi?string=$pe\">$line</a>\n";
}
$_ .= "</pre>\n";
} else {
$_ = "<p><pre>\t<a href=\"/polymath.cgi?string=$pe\">$p</a>\n</pre>";
}
}
if (/^\s*\#\# body (.*)\#\#/i) {$variable_body_tag_content = $1; next;}
if (/^\s*\#\# title (.*)\#\#/i) {$title = $1; next;}
if (/^\s*\#\# (\/)?polyexpand-collect \#\#/i) {
if ($1 eq "/") {
$polyexpand_collect = 0;
} else {
$polyexpand_collect = 1;
$polyexpand_collect_string = "";
}
next;
}
if ($polyexpand_collect) {$polyexpand_collect_string .= $_; }
if (/^\s*\#\# polyexpand-emit \#\#/i) {
$polyexpand_collect_string =~ s/\#.+$//g;
$polyexpand_collect_string =~ s/\s+/ /g;
$_ = "
<form action = \"polymath.cgi\" method=post>
<input type=hidden name=string value=\"$polyexpand_collect_string\">
<input type=submit value=\"play that\"></form>
";
}
if (/^\s*\#\# literal (.*)\#\#/i) {$convert_literal = 1; $literal_opt = $1; next;}
if (/^\s*\#\# \/literal \#\#/i) {$convert_literal = 0; next;}
if (/^\s*\#\# graphical \#\#/i) {$omit_g = 1; next;}
if (/^\s*\#\# nographical \#\#/i) {$omit_ng = 1; next;}
if (/^\s*\#\# omit \#\#/i) {$convert_omit = 1; next;}
if ($convert_literal) {
s/([^A-Za-z0-9\t])/sprintf("&#%03d;", ord($&))/eg;
if ($literal_opt =~ /tab/) {s/\t/$spacerzzz/g; }
unless ($literal_opt =~ /nobr/) {s/$/<br>/;}
}
if (/^\s*\#\#/) {next; }
s/\#\#.*$//;
$page .= $_;
}
close(IN);
foreach (split (/;/, $ENV{'HTTP_COOKIE'}) ) {
/\s*(.*)=(.*)/;
$cookie{$1} = $2;
}
if ($cookie{'fontname'}) {$fontname = $cookie{'fontname'}; }
#
# headings etc
#
$hed_tag = 0; $seq_tag = 0;
$tmsgt = scalar(localtime);
if ($tmsgt =~ /2001/ && $tmsgt =~ /Sep 1[12]/) {
$tmsg = "<font size=+2><font color=red><br><br><center>
Phone and email service spotty. I am alive and OK, at least as of
21:33 local time (EDT, Sep 11). Lots of other people
here were not so fortunate.
Let's hope nothing more happens.
I appreciate your concern.
<br><br></center>
</font></font>\n";
$page = $tmsg . $page;
}
if ($tmsgt =~ /Sep 11/) {
$tmsg = "<font color=red><br><br><center>
Let's all hope for a calm and peaceful September 11 this year
<br><br></center>
</font>\n";
$page = $tmsg . $page;
}
if ($page =~ /^\/\/\/\s*(.*)\s*$/) {$title = $1;}
$page =~ s/^\/\/\/(.*)$/<h${heading_one}>$1<\/h${heading_one}>/g;
while ($page
=~ s/^\/\/\s*(.*)\s*$/<a name=\"HED_TAG_$hed_tag\"><\/a><h${heading_two}><u>$1<\/u><\/h${heading_two}>/
) {$headings[$hed_tag] = $1; $hed_tag++; $nheadings++;}
if (1) {
#Pragma: no-cache
#Cache-Control: no-cache
#Expires: Thursday, 01-Jan-1970 00:00:00 GMT
$html_head =
"Content-type: text/html
Keywords: $keywords
$doc_specific_header";
unless($html_head =~ /^Cache-control/) {
$html_head .= "Cache-Control: no-cache\n";
}
foreach (@set_cookies) {
if (/^$/) {next; }
/(.+)_(.*)/;
$c1 = $1; $c2 = $2;
if ($c1 eq "HILITE") {next; }
#
# special cookie 'timestamp' when set will aqcuire local time
# (in seconds since midnight 1/1/1970)
#
if ($_ eq "timestamp") {$c1= "timestamp"; $c2 = $timestamp = time(); }
$html_head .=
"Set-Cookie: $c1=$c2; expires=Monday, 18-Jan-2038 22:14:07 GMT; path=/\n";
if ($c1 eq 'showcookies') {
if ($c2 eq 'yes') {$showcookies = 1; } else
{$showcookies = -1; }
}
}
} else {
$html_head = "";
}
if ( (($cookie{'showcookies'} eq 'yes') + $showcookies) > 0 ) {
$toppage .= "<center><font size=-1>First, me saw cookie: ";
foreach (keys %cookie) {
$toppage .= "'$_' = '$cookie{$_}'; ";
}
$toppage .= " Then, me set cookie: ";
foreach (@set_cookies) {
if (/^$/) {next; }
/(.+)_(.*)/;
$c1 = $1; $c2 = $2;
$toppage .= "'$c1' = '$c2'; ";
}
foreach (@fake_cookies) {
/(.+)_(.*)/;
$c1 = $1; $c2 = $2;
$toppage .= "'$c1' = '$c2' (fake cookie); ";
}
$toppage .= "<br>You can turn this annoying cookie text off ";
if ($in_file) {
$toppage .= "<a href=\"$in_file^showcookies_normal\">here</a>, ";
} else {
$toppage .= "by going <a href=\"about.par?showcookies_normal\">here</a> ('about' page), ";
}
$toppage .= "if you want!<br></font></center>";
}
foreach (@set_cookies, @fake_cookies) {
if (/^VARNISH/) {
$varnish_cookie = 1;
next;
}
if (/^$/) {next; }
/(.+)_(.*)/;
$c1 = $1; $c2 = $2;
if ($_ eq "timestamp") {$c1= "timestamp"; $c2 = $timestamp; }
$cookie{$c1} = $c2;
#
# special argument "HILITE_char-string" will not set a cookie per se.
# instead, a word will be marked for subsequent highligting.
#
if ($c1 eq "HILITE") {
$hilite = $c2;
$hilite =~ s/-/\\s/;
next;
}
}
if ($cookie{'sick'} eq 'yes') {$cookie{'back'} = 'white'; }
if ($cookie{'fontname'}) {$fontname = $cookie{'fontname'}; } # again!
$titlebullet = "·"; # ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿×Ø÷ø
$bodybullet = "";
if ($lynx) {$titlebullet = "--"; $bodybullet = "*"; }
$prepage = "<html><head>
<LINK REL=\"SHORTCUT ICON\" HREF=\"http://www.panix.com/~jens/favicon.ico\">
<meta http-equiv=\"imagetoolbar\" content=\"no\" />
<title>♫Jens Johansson " . $titlebullet . " " .
$title . "</title></head>
";
#
# formatting
#
if ($varnish_cookie) {
$font_spec = "<font size=-1 face=\"$fontname\">";
} else {
$font_spec = "<font face=\"$fontname\">";
}
$font_spec_end = "</font>";
$fn_glob_open = "<font color=#004000>";
if ($in_file) { $bkg_switch_file = $in_file; }
else {$bkg_switch_file = "about.par"; }
if (! $lynx) {
if ($cookie{'marg'} eq 'wide') {
$bkg_switch = "<a href=\"/parse.cgi/$bkg_switch_file?marg_normal\">[ margins ]</a>\n";
} else {
$bkg_switch = "<a href=\"/parse.cgi/$bkg_switch_file?marg_wide\">[ no margins ]</a>\n";
}
}
if (
$variable_body_tag_content !~ /=#[0-9a-fA-F]{6,6}/ && $cookie{'sick'} ne 'yes'
&& ( ! $lynx )
) {
if ($cookie{'back'} eq 'white') {
$body_attr = " text=#000000 bgcolor=#FFFFFF";
$bkg_switch .= "<a href=\"/parse.cgi/$bkg_switch_file?back_normal\">[ view as white text on black backgound ]</a>";
} else {
$body_attr = " bgcolor=#444444 text=#FFFFFF link=#AAAAFF alink=#FFAA00 vlink=#FFAAAA";
$fn_glob_open = "<font color=#30FF30>";
$bkg_switch .= "<a href=\"/parse.cgi/$bkg_switch_file?back_white\">[ view as black text on white background ]</a>";
}
}
$bkg_switch = "<br><font size=-2>" . $bkg_switch . "</font>";
if ($cookie{'sick'} eq 'yes') {
$body_attr = " text=#000000 background=\"/stuff/sick_bkb.gif\"";
$font_spec = "<font size=+3>";
$font_spec_end = "</font>";
}
$fn_glob_close = "</font>";
$body_attr_fn = $body_attr;
$body_attr .= " " . $variable_body_tag_content;
unless ($cookie{'marg'} eq 'wide') {
if ($user_agent =~ /MSIE/i) {
$body_attr1 .= " \nbottommargin=60 topmargin=60 leftmargin=60 rightmargin=60";
} else {
$body_attr1 .= " \nmarginwidth=60 marginheight=60";
}
}
unless ($varnish_cookie) {
$toppage_header = "<center><a href=\"/parse.cgi/index.par\">[ home ]</a>
<a href=\"/parse.cgi/sect-index-brief.par\">[ sections ]</a>
<a href=\"/parse.cgi/word-index.par\">[ references ]</a>
<a href=\"/parse.cgi/records.par\">[ cd:s ]</a>
<a href=\"/parse.cgi/about.par\">[ about ]</a>
<a href=\"/parse.cgi/links.par\">[ links ]</a>
<a href=\"http://www.heptagon.se\">[ heptagon ]</a>
" . $bkg_switch . "
</center>
<br><br>";
} else {
$toppage_header = "";
}
$toppage = "<body" . $body_attr . $body_attr1 . ">\n" . $font_spec . "
<!-- pages generated with utmost pride by a suite of custom perl
scripts written by the 'great' Jens himself.. -->\n" .
$toppage_header . $toppage;
if ($cookie{'sick'} eq 'yes') {
$toppage .= "<font size=+4>
<center>THE WHOLE SITE IS BEING DISPLAYED IN UGLY MODE!!<br>
<blink><A href=\"about.par?sick_no#sick\">CLICK HERE TO RETURN TO NORMAL MODE</a><br></blink>
<A href=\"about.par?sick_no#sick\">
<img width=150 height=150 align=middle src=\"/stuff/sick.gif\" alt=\"\"></a></font></center>";
}
unless ($varnish_cookie) {
$postpage = "<p><!--endnotes--><hr><p><center> ";
unless ($stdin_infile) {
$postpage .= "Page updated " . $in_modtime . " " . $bodybullet . " ";
}
open (IN, "footer.par"); while (<IN>) {$footer .= $_; } close(IN);
$postpage .= "Email: <a href=\"mailto:jens\@panix.com\">jens\@panix.com</a></center>" .
$footer . $font_spec_end . "</body></html>";
} else {
$postpage = "<p><!--endnotes-->" . $font_spec_end . "</body></html>";
}
#
# add subheading links (only for quite long pages, maybe??)
#
# length($page) > xxxxxxx
if ((! $lynx)
&& ( ($cookie{'headings'} eq 'on')
|| ( ($cookie{'fakeheadings'} ne '') && $cookie{'headings'} ne 'off') )
) {
for ($h=0; $h < $nheadings; $h++) {
$subheadings .= "\n<a href=\"$in_file#HED_TAG_$h\">[ $headings[$h] ]</a>\n";
}
$fontsize=-1; if ($nheadings > 8) {$fontsize=-2; }
$page = "<font size=$fontsize>" . $subheadings . "</font><p>" . $page;
}
$page = $toppage . $page . $postpage;
#
# do comment clobbering first!
# in case some [] tags etc have been commented out
#
# '\#\#' comments
$page =~ s/^\#\#(.*)$//g;
$page =~ s/\#\#(.*)\#\#//g;
# '#' comments
$page =~ s/^\#(.*)$/<!-- $1 -->/g;
#
# now do repetitive mangling
#
#
# <!--#include "filename"--> like <!--#include -->
#
while (
($page =~ s/<!--#include "([^>]*)"-->/{PLACEHOLDER}/)
) {
$include = "";
open (IN, $1); while (<IN>) {$include .= $_; } close(IN);
$page =~ s/{PLACEHOLDER}/$include/;
}
#
# do freaky dynamic-page stuff:
#
# {a|b|c|d} output string a,b,c or d with equal probability
# {?0.1a|?0.3b|c|d} p(a)=0.1, p(b)=0.3, p(c)=p(d)=(1-(0.1+0.3))/2
# {@string a} output a only if string is contained in remote_host
# {@string a|b} same -- b if NOT
# {=cookie value a} output a only if cookie has value value
# the value 'normal' implies; no cookie present means 'yes'
#
# {=cookie value dummyarg} output VALUE of cookie if exists.
# ^^^^^ that is, use the *actual* string 'v a l u e'
#
# {=cookie value a|b} same -- b if NOT
#
# {=timestamp number a|b}
# output a if cookie 'timestamp' is lower than 'number'
# {=gettimestamp dummy_arg dummy_arg}
# output value of cookie 'timestamp' as text (GMT)
#
#Sat Nov 06 09:26:33 1999
#while ($page =~ s/{([^}]*)}/{PLACEHOLDER}/) {
# @curly_args = split(/\|/, $1);
while (
($status, @result) = &excise($page, "{", "}"), $status
) {
# @curly_args = split(/\|/, $result[2]);
@curly_args = split_outer($result[2], "|", "[{", "]}");
#Sat Nov 06 09:26:33 1999
foreach (@curly_args) {
s/^\\\\\t/<br><img src="\/stuff\/2x2.gif" alt=\"\" hspace=$hspace>/g ;
s/^\\\\/<br>/g ;
s/^\\\t/<p><img src="\/stuff\/2x2.gif" alt=\"\" hspace=$hspace>/g ;
s/^\\/<p>/g ;
s/\s/ /g;
}
if ($curly_args[0] =~ /^@(\S*)\s+(.*)/) { # remote_host replacement
$repl = $2;
if ($curly_args[1] ne "") {$alt = $curly_args[1]; } else {$alt = ""; }
if ($ENV{"REMOTE_HOST"} =~ /$1/)
{} else
{$repl = $alt; }
} elsif ($curly_args[0] =~ /^\=(\S+)\s+(\S+)\s+(.*)/) { # cookie stuff
$c1 = $1; $c2 = $2; $c3 = $3;
$repl = $c3;
if (($c2 eq 'normal') && ($cookie{$c1} eq "")) {
$cookie{$c1} = 'normal';
}
if ($curly_args[1] ne "") {$alt = $curly_args[1]; } else {$alt = ""; }
if (($c2 eq 'value') && ($cookie{$c1} ne "") && ($cookie{$c1} ne "normal")) {
$repl = $cookie{$c1};
} elsif ($c1 eq "gettimestamp") { # output the timestamp cookie!
if ($cookie{'lastvisit'} eq 'on')
{$repl = gmtime($cookie{'timestamp'}) . " GMT"; }
else {$repl = ""; }
} elsif ($c1 eq "timestamp") { # special case! timestamp dependent!!
if($cookie{'lastvisit'} eq 'on' && $cookie{'timestamp'} < $c2)
{} else
{$repl = $alt; }
} else {
if ($cookie{$c1} eq $c2)
{} else
{$repl = $alt; }
}
} else
# ok, probability stuff
{
undef %curly_prob; $t = 0; $n = 0; $m = 0;
foreach $arg (@curly_args) {
$m++;
if ($arg =~ /^\?([\d.]+)(.*)/) {
$arg = $2; $curly_prob{$arg} = $1;
$t += $1;
} else {
$curly_prob{$arg} = 0; $n++;
}
}
$limit = 0;
if ($t > 1) { # wrongly specified probabilities!
foreach $arg (@curly_args) { # set all equal..
$limit += 1 / $m;
$curly_prob{$arg} = $limit;
}
} else {
foreach $arg (@curly_args) {
if ($curly_prob{$arg} == 0)
{ $limit += (1-$t) / $n; } else
{ $limit += $curly_prob{$arg}; }
$curly_prob{$arg} = $limit;
}
}
$random = rand;
$repl = "";
foreach $arg (@curly_args) {
if ($random < $curly_prob{$arg} ) {
$repl = $arg; last;
}
}
}
#Sat Nov 06 09:26:33 1999
# $page =~ s/{PLACEHOLDER}/${repl}/;
$page = $result[0] . $repl . $result[1];
#Sat Nov 06 09:26:33 1999
}
#
# handle [* ] footnotes
#
while ($page =~ s/\[\*([^]]*)\]/{PLACEHOLDER}/) {
if ($cookie{'foot'} eq 'off') {
$repl = "";
goto done_footnote;
}
$footnote_text = $1;
$footnote_text =~ s/\s*([\x00-\xFF]*)\s*/$1/;
if ($footnote_text =~ /([^\|]+)\|(.*)/) {
$footnote_link = $footnote_inline = $1; $footnote_text = $2;
$fn_open = "";
$fn_close = "";
} else {
$footnote_inline = "";
if ($cookie{'foot'} eq 'bottom') {
$footnote_link = ++$footnote_count;
} else {
$footnote_link = "*";
}
$fn_open = "<font size=-1><sup>";
$fn_close = "</sup></font>";
}
$footnote_text =~ s/\s+/ /g;
# escape special chars into into $footnote_text_w
$footnote_text_w = $footnote_text;
$footnote_text_w =~ s/(.)/sprintf("%02X", ord($&))/eg;
if ($cookie{'foot'} eq 'bottom') {
$fn_open = "<font size=-1><sup>";
$fn_close = "</sup></font>";
$repl = $fn_open . "<a href=\"$in_file#FOOT_$footnote_count\"\n";
$repl .= ">" . $fn_glob_open . $footnote_link . $fn_glob_close . "</a>" . $fn_close;
$footnotes_at_end .= "<br><a name=\"FOOT_$footnote_count\"></a>$footnote_count: $footnote_text\n";
} else {
if ($cookie{'foot'} eq 'inline') {
if (length($footnote_inline != 0))
{$footnote_inline .= " "; }
$repl = " <font size=-1>$footnote_inline($footnote_text) </font>";
} else {
$repl = $fn_open . "<a href=\"/fn0.cgi?${footnote_text_w}\"\n";
unless ($cookie{'foot'} eq 'href') { # .. test onClick, maybe? return false?
$repl .= "onMouseOver=\"footnote('${footnote_text_w}', event)\"
onMouseOut=\"footnoteout()\"";
$footnotes_used = 1;
}
$repl .= ">" . $fn_glob_open . $footnote_link . $fn_glob_close . "</a>" . $fn_close;
}
}
done_footnote:
$page =~ s/{PLACEHOLDER}/${repl}/;
}
#
# handle [] special indexed link names
#
#while ($page =~ s/([^\\])\[([\S][^]]*)\]/$1{PLACEHOLDER}/) {
while ($page =~ s/\[([\S][^]]*)\]/{PLACEHOLDER}/) {
# [ xxxxxx ] not transformed, for text mode button etc
$link_text = $1;
if ($link_text =~ /^\\(.*)$/) { # [\blabla] => [\ is escape seq
$repl = "$1"; # just lose the []'s
} elsif ($link_text =~ /\?(.*)/) { # [?] search engine page quick reference
$spec = $spec0 = $1;
$spec0 =~ s/\s*(\w+)\s.*/$1/;
$spec =~ s/\s*(.*)/$1/;
$spec =~ s/([^\w\. ])/sprintf("%%%02X", ord($&))/eg;
$spec =~ tr/ /+/;
$repl = "<a href=\"/generate-web-search.cgi/$spec\" VARNISH>internet search links for '$spec0'</a>";
} else { # normal [blabla] link
# webify it into link_text_w
$link_text_w = $link_text;
$link_text_w =~ s/([^\w\. ])/sprintf("%%%02X", ord($&))/eg;
$link_text_w =~ tr/ /+/;
$repl = "<a href=\"/generate-word-index.cgi/${link_text_w}\" name=\"SEQ_TAG_$seq_tag\" VARNISH>$link_text</a>";
$seq_tag++;
}
$page =~ s/{PLACEHOLDER}/${repl}/;
}
# fix escaped [xxxxxxx xxxx ]
#$page =~ s/([\\])(\[[\S][^]]*\])/$2/g;
#
# finally do rest of one-time manglings
#
if (length($footnotes_at_end) != 0) {
$footnotes_at_end = "<font size=-3>" . $footnotes_at_end . "</font>";
$page =~ s/<!--endnotes-->/$footnotes_at_end/;
}
# records.par jpegs or gifs..
if ($cookie{'recimg'} eq 'jpg' && $in_file =~ /records\.par/i) {
$page =~ s#src="/stuff/cov/(.+)\.gif"#src="/stuff/cov/$1\.jpg"#ig;
}
# blink
if ($cookie{'blink'} eq 'off') {
$page =~ s/<\s*\/?blink\s*>//ig;
}
# not sure how lynx handles .. checked, seems OK!
if (1 || $user_agent =~ /(mozilla|msie|opera|arachne)/i) {
while($page =~ s/\[( .* )\]/{PLACEHOLDER}/) {
# while($page =~ s/\[ (.*) \]/{PLACEHOLDER}/) {
$repl = $1;
$repl =~ s/ /\ \;/g;
$page =~ s/{PLACEHOLDER}/${repl}/;
}
} else {
}
# breaks, para marks, etc.
# \\tab => <br>+hspace, \tab => <p>+hspace
# \\ => <br>, \ => <p>
$page =~ s/^\\\\(\t+)/"<br>" . ($spacerzzz x length($1)) /eg ;
$page =~ s/^\\\\/<br>/g ;
$page =~ s/^\\(\t+)/"<p>" . ($spacerzzz x length($1)) /eg ;
$page =~ s/^\\/<p>/g ;
# word emphasis
$page =~ s/\*([a-zA-Z][-0-9A-Za-z!?,.:;"'_ ]{1,50})\*/<i>$1<\/i>/g ;
# smileys
if ($cookie{'smiley'} eq 'on') {
$page =~ s/(;\)|:\)|<g>)/${smiley}/g;
} else {
$page =~ s/(;\)|:\)|<g>)//g;
}
# hey, let's change any stupid <B></B> tags to <i> !
$page =~ s/<([^b]?)b>/<$1i>/gi ;
# and as an antidote to that stupidity, let's specify <bb> to mean
# bold _really_ .. sigh
$page =~ s/<(.?)bb>/<$1b>/gi ;
# -- => typographical character
unless ($cookie{'dash'} eq 'off') {
$page =~ s/([^!])--([^>])/$1—$2/g;
}
#
# iso -> entityname translation
#
%entitymap = (
'Å', 'Å', 'Ä', 'Ä', 'Æ', 'Æ', 'É', 'É',
'Ñ', 'Ñ', 'Ö', 'Ö', 'Ø', 'Ø', 'Ü', 'Ü',
'ß', 'ß', 'å', 'å', 'ä', 'ä', 'æ', 'æ',
'é', 'é', 'ñ', 'ñ', 'ö', 'ö', 'ø', 'ø',
'ü', 'ü', '®', '®', '©', '©',
# '', '™'
'', '(tm)'
);
if ($lynx) {$entitymap{'©'} = '(c)'; }
$entity_charclass = '[' . join('', keys %entitymap) . ']';
$page =~ s/($entity_charclass)/$entitymap{$1}/eg;
#
# hey, let's waste billions of processor cycles and megabits of 'net bandwidth!
#
if ($cookie{'sick'} eq 'yes') {
$page2 = ""; $in_literal = 0; $in_tag = 0;
for ($i = 0; $i < length($page); $page2 .= $str, $i++) {
$str = substr($page, $i, 1);
if ($in_literal && $str eq ";") {$in_literal = 0; next; }
if ($in_literal) {next; }
if ($str eq "&") { $in_literal = 1; next; }
if ($in_tag && $str eq ">") {$in_tag = 0; next; }
if ($in_tag) {next; }
if ($str eq "<") { $in_tag = 1; next; }
$str = sprintf("<font color=#%2x%2x%2x size=%d>%s<\/font>", rand(255), rand(128), rand(128), rand(4)+3, $str);
}
$page = $page2;
}
# this is even more useless... :)
if ($cookie{'atarifont'} eq 'yes' && ! $lynx) {
if ($cookie{'back'} eq 'normal') {$atarifontdir = '/stuff/atari0/';}
else {$atarifontdir = '/stuff/atari1/';}
$page2 = ""; $in_literal = 0; $in_tag = 0;
for ($i = 0; $i < length($page); $page2 .= $str, $i++) {
$str = substr($page, $i, 1);
if ($in_literal && $str eq ";") {$in_literal = 0; next;
}
if ($in_literal) {next; }
if ($str eq "&") { $in_literal = 1; next; }
if ($in_tag && $str eq ">") {$in_tag = 0; next; }
if ($in_tag) {next; }
if ($str eq "<") { $in_tag = 1; next; }
$str =~ s/\s/ /;
$str = sprintf(
"<img width=8 height=16 src=\"%schar-%02x.gif\" alt=\"%s\" hspace=0 vspace=0>",
$atarifontdir, ord($str), $str);
}
$page = $page2;
}
# "hilite"
if ($hilite) {
# $page =~ s/([\s>;()])($hilite)([\s'!.?,<&()])/$1<b><blink><font color=red>$2<\/font><\/blink><\/b>$3/ig;
$page =~ s/([\s>;()])($hilite)([\s'!.?,<&()])/$1<b><font color=red>$2<\/font><\/b>$3/ig;
}
# short-hand links <http_blabla> => <a href="http_blabla">http_blabla</a>
# Sat Aug 21 14:00:51 1999 hacked to also allow <link_text|url>
while ($page =~ s/<(http:|ftp:|www\d*\.)([^>]+)>/{PLACEHOLDER}/) {
#while ($page =~ s/<(((http:|ftp:|www\d*\.)([^>]+))|(([^>]+)\.par($|\|)))>/{PLACEHOLDER}/) {
$r_url = $1 . $2;
# $r_url = $1;
$r_url =~ s/^www/http:\/\/www/;
if ($r_url =~ /(.+)\|(.*)/) {
$replace = "<a href=\"$1\">$2<\/a>";
} else {
$replace = "<a href=\"$r_url\">$r_url<\/a>";
}
$page =~ s/{PLACEHOLDER}/$replace/;
}
# bare .par links transformed to specify parse.cgi
$page =~ s/href="([#\w.-]+\.par[^"]*)"/href="\/parse.cgi\/$1"/ig;
# here we go, window madness. needs to be tidied up..
# sdfsdf. . 3.4 .23.4 23.4 2 135 34 !!!!QHTUQWYRUWEYT!!!!
# < VARNISH> -- no controls -- floating text window
# < TARNISH> -- no controls, read image data for target win size if present
#
if ($cookie{'img'} ne 'same' && (! $lynx )) {
while ($page =~ s/<a\shref=([^>]*)>/{PLACEHOLDER}/i) {
$repl = $1;
# of the form '"/stuff/img.gif"', '"mailto:jens@panix.com"' or '"http://w.a.q/~ww/" tarnish'
unless ($repl =~ /mailto/) {
if ($repl =~ /\"([^"]*)\.(gif|jpg|jpeg)\"/i) {
$tarnish_fn = $1 . "." . $2;
} else {
$tarnish_fn = 0;
}
if ($repl =~ / ([TV])ARNISH$/i
# this is not quite done so disable it...
&& 0
) {
$varnish = $1; if ($varnish =~ /v/i) {$varnish = 1; } else {$varnish = 2; }
} else {
$varnish = 0;
}
if ($tarnish_fn || $varnish) {
$tarnish_h = 0;
$tarnish_w = 0;
$tarnish_ctl = 1;
$repl =~ s/$/ target=\"newjj\" onClick=\"tarnish($tarnish_h, $tarnish_w, $tarnish_ctl)\" /i;
$imgnew_used = 1;
if ($tarnish_ctl != 0) {$tarnish_ctl_used = 1; }
}
}
$page =~ s/{PLACEHOLDER}//;
}
# oh my what a fucking kludge..
$page =~ s/</</g; $page =~ s/>/>/g;
} # else replace TARNISH with '' but who cares
# moved heavy files..
$page =~ s#src="/stuff/([^"]+)"#src="http://jens.org/stuff/$1"#ig;
$page =~ s#href="/stuff/([^"]+\.(mp3|wav|mid|gif|jpg|txt|troff|ps|zip|exe|c))"#href="http://jens.org/stuff/$1"#ig;
# Lastly f we're on panix, transform '="/' into '="/~jens/'
if ($unix) {$page =~ s/="\//="\/~jens\//g;}
#
# add whatever JavaScript that is necessary
#
if ($cookie{'img'} ne 'same') {
$javascript = "if (window.name != \"newjj\") {window.name = \"jj\";}
";
}
# stripped comment
# // open a window
if ($imgnew_used) { # JavaScript routine required
$javascript .= "var wo = new Object();
function tarnish(width, height, controls) {
var attributes, attributes1;
attributes =
'resizable=yes,scrollbars=no,location=no,menubar=no,toolbar=no,status=no';" .
($tarnish_controls_used ? "
if (controls) {attributes =
'resizable=yes,scrollbars=yes,location=yes,menubar=yes,toolbar=yes,status=yes';}"
: "" ) . "
if (width == 0) {width = screen.width*2/3; }
if (height == 0) {height = screen.height*2/3; }
attributes = attributes + ',width=' + width + ',height=' + height;
wo = window.open('', 'newjj', attributes)
" .
# // wo.document.write('<html><head><title>newjj</title></head><body
# ${body_attr_fn}>wait..</body></html>');
# // wo.document.close();
" wo.window.focus();
}
";
}
#
# stripped comments..
# // Jens J's footnote handler v 1.0. (from http://www.panix.com/~jens)
# // Free use if you leave these lines intact! What a deal!
# // winobj.moveTo(event.screenX + 10, event.screenY + 10);
# // here we decode footnote encoded by perl cgi source like:
# // s/\\s/ /g; s/(.)/sprintf('%02X', ord($1))/eg;
# // (simply set text_dec to text instead, if it's plain text)
# // user could close it
if ($footnotes_used) { # JavaScript routine required
unless ($cookie{'foot'} eq 'inline' && $cookie{'foot'} eq 'href') {
$javascript .= "defaultStatus = 'Move cursor over green link to see footnote.';
"
}
if ($msie) {
$fn_winattr_calc = "fnx = event.screenX+10; fny = event.screenY+10;";
$fn_winattr = "',left=' + fnx + ',top=' + fny";
} else {
$fn_winattr_calc = "fnx = event.screenX-window.pageXOffset+5; fny = event.screenY-window.pageYOffset+5; // NS BUG!!!?";
$fn_winattr = "',screenX=' + fnx + ',screenY=' + fny";
}
$javascript .= "var winobj = new Object();
var fn_open;
function footnote (text, event) {
var text_dec = '';
var fnx, fny;
if (fn_open) {return true; }
fn_open = 1;
window.status = '*** PLEASE WAIT, GENERATING FOOTNOTE ***';
for(i = 0; i < text.length; i+=2) {
text_dec += String.fromCharCode(parseInt(text.substr(i, 2), 16));
}
var dimension = 30 + 10 * Math.sqrt((text_dec.length + 50));
var attributes = 'resizable=yes';
hdimension = (dimension); wdimension = (dimension * 1.15);
$fn_winattr_calc
attributes = attributes + ',width=' + wdimension + ',height=' + hdimension;
attributes = attributes + ${fn_winattr};
winobj = window.open('', 'Fn', attributes);
winobj.document.write(
'<HTML><HEAD><TITLE>Fn</TITLE></HEAD><BODY${body_attr_fn}>\\n' +
'$font_spec' +
'<font size=-1><P><center>' + text_dec + '</P></font>\\n' +
'<font size=-2>(move the mouse to remove footnote)</font></center>' +
'$font_spec_end');
winobj.document.close();
window.status = '';
return true;
}
function footnoteout () {
fn_open = 0;
if (!winobj.closed)
winobj.close();
return true;
}
";
}
if ($javascript && (! $lynx )) {
$prepage .= "
<script language='JavaScript'><!--
" . $javascript .
"//--></script>
";
}
$page =~ s/(href|action)="(\/~jens)?\/parse.cgi\/([#\w.-]+\.par)\^([^"]*)"/href="$2\/$3?$4"/ig;
$page =~ s/(href|action)="(\/~jens)?\/parse.cgi\/([#\w.-]+\.par[^"]*)"/href="$2\/$3"/ig;
#$page =~ s#/parse.cgi/#/#g;
#
# Output the processed page
#
$page = $prepage . $page;
if (1) {
if ($unix) {
$html_head .= "Content-length: " . length($page) . "\n\n";
} else {
# arrrgghh fucking braindead DOS newlines use 2 bytes once it's piped!
$nlcount = length($page);
for ($i=0; $i<length($page); $i++) {if (substr($page, $i, 1) eq "\n") {$nlcount++;}}
$html_head .= "Content-length: " . $nlcount . "\n\n";
}
print $html_head;
}
print $page;
# better efficiency?? instead of regex-matching which also doesn't allow nesting..
#
# &excise($string, "{opendelim", "closedelim}") --
# returns status and $string split in 3, while tracking nested open/closedelims
#
# eg.
# &excise("aaaaaaaaaa{bla blurk plurrk {{-}} alb}zzz", "{", "}") returns
# (1, "aaaaaaaaaa",
# "zzz",
# "bla blurk plurrk {{-}} alb")
#
#
# it seems to work!?.. !
#
# but how deal with | or other delimiters in matched string?
#
sub excise() {
local($search_in, $opendelim, $closedelim) = @_;
local($i, $rlen, $llen, $opendelim_count);
$lmatch = index($search_in, $opendelim);
if ($lmatch == -1) { return (0, '', '', ''); }
$rlen = length($closedelim); $llen = length($opendelim);
$opendelim_count = 1;
for ($i=$lmatch+$llen; $i<=length($search_in)-$rlen && ($opendelim_count); ) {
if (substr($search_in, $i, $llen) eq $opendelim)
{$opendelim_count++; $i+=$llen; next; }
if (substr($search_in, $i, $rlen) eq $closedelim)
{$opendelim_count--; $rmatch = $i; $i+=$rlen; next; }
$i++;
}
if ($opendelim_count) {
# die "matching ".$opendelim."/".$closedelim." error";
return (0, "matching ".$opendelim."/".$closedelim." error", '' ,'');
}
( 1,
substr($search_in, 0, $lmatch),
substr($search_in, $rmatch + $rlen, length($search_in)-1),
substr($search_in, $lmatch + $llen, $rmatch-$lmatch-$llen)
)
}
# how to deal with | or other delimiters in matched string
#
# &split_outer($string, "split_char", "{opendelim", "closedelim}") --
# returns $string split at split_char, while tracking nested open/closedelims
#
# &split_outer("aaaaaaaaaa{bla blurk |plurrk [-lds|dd] {{-|-}} alb}zzz", "|", "{[", "}]")
# returns:
# "aaaaaaaaaa{bla blurk"
# "plurrk [-lds|dd] {{-|-}} alb}zzz"
#
# @resulu =
# &split_outer("abcdef|aaa{bla blurk |plurrk [-lds|dd] {{-|-}} alb}zzz", "|", "{[", "}]");
# print "(" . join(")<br>(", @resulu) . ")";
sub split_outer() {
local($search_in, $split_char, $opendelim, $closedelim) = @_;
local(@result, $len, $opendelim_count, $curchar, $j);
local($i) = 0;
$result[$i] = $search_in;
reloop:
$len = length($result[$i]);
for($j = 0; $j < $len; $j++) {
$curchar = substr($result[$i], $j, 1);
if ($curchar eq $split_char && !$opendelim_count) {
$result[$i+1] = substr($result[$i], $j+1);
$result[$i] = substr($result[$i], 0, $j);
$i++;
goto reloop;
}
if (index($opendelim, $curchar) != -1) {$opendelim_count++; }
if (index($closedelim, $curchar) != -1) {$opendelim_count--;}
}
#print "<br>(". join(")<br>(", @result) . ")";
@result;
}
__END__
Email: jens@panix.com
All content copyright © Jens Johansson 2024.
No unathorized duplication, copying, mirroring,
pilfering, archival, or redistribution/retransmission allowed!
Any offensively categorical statements passed off as facts herein should only be construed
as my very opinionated opinions.