sub Wrequire ($);
sub Wuse ($@);
our $W;
-our @EXPORT=qw(&Wrequire &Wuse &a_href &a_href_cz &vskip &img ¢erimg &rightimg $W &top_dir &top_dir_disk);
+our @EXPORT=qw(&Wrequire &Wuse &a_href &a_href_cz &vskip &img ¢erimg &rightimg $W &top_dir &top_dir_disk &Wprint);
our @ISA=qw(Exporter);
BEGIN
{
+ $W->{"__My::Web_init"}=1;
+
sub Wrequire ($)
{
my($file)=@_;
my $class=$file;
$file=~s#::#/#g;
$file.=".pm";
- my $aref=($W->{"packages_used"}{$Apache::Registry::curstash}||=[]);
+ my $who=$W->{"__PACKAGE__"};
+ $who||="__My::Web" if $W->{"__My::Web_init"};
+ my $aref=($W->{"packages_used"}{$who}||=[]);
push @$aref,$class
if !{ map(($_=>1),@$aref) }->{$class}; # Prevent duplicated entries.
CORE::require $file;
use URI::Escape;
require HTTP::BrowserDetect;
require HTTP::Negotiate;
-require Geo::IP;
-require CGI;
-
-
-# Undo 'www/engine/httpd-restart' as it may use obsolete Perl for 'mod_perl'
-delete $ENV{"PERLLIB"};
-delete $ENV{"LD_LIBRARY_PATH"};
+my $have_Geo_IP; BEGIN { $have_Geo_IP=eval { require Geo::IP; 1; }; }
+use ModPerl::Util qw(exit);
#our $W;
# $W->{"head"}
# $W->{"head_css"}
# $W->{"force_charset"}
- # %{$W->{"packages_used"}
# $W->{"heading_done"}
# $W->{"footer_passed"}
# %{$W->{"headers"}}
# %{$W->{"headers_lc"}} # maps lc($headers_key)=>$headers_key
- # @{$W->{"packages_used"}{$Apache::Registry::curstash}}}
+ # @{$W->{"packages_used"}{$W->{"__PACKAGE__"}}}
+ # @{$W->{"packages_used"}{"__My::Web"}}
# %{$W->{"args"}}
sub init ($%)
{
my($class,%args)=@_;
- print STDERR "$class->init ".$ENV{"REQUEST_URI"}."\n";
+ print STDERR "$class->init ".Apache->request()->unparsed_uri()."\n";
my $packages_used_save=$W->{"packages_used"};
$W={ %WebConfig,%args }; # override %WebConfig settings
$W->{"packages_used"}=$packages_used_save;
- $W->{"__PACKAGE__"}||="Apache::ROOT".$Apache::Registry::curstash;
+ # {"__PACKAGE__"} is mandatory for mod_perl-2.0;
+ # $Apache::Registry::curstash is no longer supported.
+ do { cluck "No $_" if !$W->{$_}; } for "__PACKAGE__";
$W->{"top_dir"}||=eval '$'.$W->{"__PACKAGE__"}.'::top_dir';
}
$W->{"QUERY_STRING"}=~s/([&])amp;/$1/g;
$W->{"r"}->args($W->{"QUERY_STRING"});
- $ENV{"QUERY_STRING"}=$W->{"QUERY_STRING"};
# Do not: $W->{"r"}->args()
# as it parses only QUERY_STRING (not POST data).
- $W->{"args"}={ CGI->new()->Vars() };
+ $W->{"args"}={ CGI->new($W->{"r"})->Vars() };
for (keys(%{$W->{"args"}})) {
my @vals=split /\x00/,$W->{"args"}{$_};
next if @vals<=1;
$W->{"args"}{$_}=[@vals];
}
- do { $W->{$_}=$ENV{"HTTP_ACCEPT"} if !defined $W->{$_}; } for ("accept");
- do { $W->{$_}=$ENV{"HTTP_USER_AGENT"} if !defined $W->{$_}; } for ("user_agent");
+ do { $W->{$_}=$W->{"r"}->headers_in()->{"Accept"} if !defined $W->{$_}; } for ("accept");
+ do { $W->{$_}=$W->{"r"}->headers_in()->{"User-Agent"} if !defined $W->{$_}; } for ("user_agent");
$W->{"browser"}=HTTP::BrowserDetect->new($W->{"user_agent"});
do { args_check(%$_) if $_; } for ($W->{"args_check"});
+ $ENV{"HOSTNAME"}||=&{$W->{"web_hostname_sub"}}();
+
return $W;
}
+sub Wprint($)
+{
+my($text)=@_;
+
+ $W->{"r"}->print($text);
+}
+
sub top_dir_disk ()
{
do { return $_ if $_; } for ($W->{"top_dir"});
{
my($in)=@_;
- if (my $uri=$ENV{"REQUEST_URI"}) {
+ if (my $uri=$W->{"r"}->unparsed_uri()) {
if ($W->{"args"}{"Wabs"}) {
+ # FIXME: $in may not be defined here!
+ # to prevent: Use of uninitialized value in ...
if ($in=~m#^/#) {
$in=~s#^/*##;
}
else {
- $in=$ENV{"REQUEST_URI"}."/".$in;
+ $in=$uri."/".$in;
$in=~tr#/#/#s;
1 while $in=~s#/(?:[^/]+)/\Q..\E/#/#g
}
$W->{"args"}{$name}=[ $W->{"args"}{$name} ] if !ref $W->{"args"}{$name} && ref $regex;
fatal "$name_html passed as multivar although singlevar expected"
if ref $W->{"args"}{$name} && !ref $regex;
- $regex=${$regex}[0] if ref $regex;
+ $regex=$regex->[0] if ref $regex;
for my $val (!ref $W->{"args"}{$name} ? $W->{"args"}{$name} : @{$W->{"args"}{$name}}) {
$val="" if !defined $val;
fatal "$name_html <span class=\"quote\">".CGI::escapeHTML($val)."</span>"
$W->{"indexme"}=0; # For the case no heading was sent yet.
My::Web->heading();
- print "\n".vskip("3ex")."<hr /><h1 class=\"error\">FATAL ERROR: $msg!</h1>\n"
+ Wprint "\n".vskip("3ex")."<hr /><h1 class=\"error\">FATAL ERROR: $msg!</h1>\n"
."<p>You can report this problem's details to"
." ".a_href("mailto:".$W->{"admin_mail"},"admin of this website").".</p>\n";
footer();
{
exit 1 if $W->{"footer_passed"}++; # deadlock prevention:
- print vskip if $W->{"footer_delimit"};
+ Wprint vskip if $W->{"footer_delimit"};
if ($W->{"heading"}) {
do { &{$_}() if $_; } for ($W->{"footing_delimit"});
}
- print "<hr />\n" if $W->{"footer"};
+ Wprint "<hr />\n" if $W->{"footer"};
if ($W->{"footer_mailme"}) {
- print '<form action="'.top_dir('/SendMsg.pl').'" method="post" onsubmit="'
+ Wprint '<form action="'.top_dir('/SendMsg.pl').'" method="post" onsubmit="'
."this.elements['msgscript'].value=this.elements['msghtml'].value;"
."this.elements['msghtml'].value='';"
."this.submit();"
.'">'."\n";
- print '<p align="right">'."\n";
- print '<input name="msgscript" type="hidden" />'."\n";
- print '<input name="msghtml" type="text" size="32" alt="Message" />'."\n";
- print '<input name="submit" type="submit" value="Quick Note" />'."\n";
- print '</p>'."\n";
- print '</form>'."\n";
+ Wprint '<p align="right">'."\n";
+ Wprint '<input name="msgscript" type="hidden" />'."\n";
+ Wprint '<input name="msghtml" type="text" size="32" alt="Message" />'."\n";
+ Wprint '<input name="submit" type="submit" value="Quick Note" />'."\n";
+ Wprint '</p>'."\n";
+ Wprint '</form>'."\n";
}
+ my @packages_used=(
+ $W->{"__PACKAGE__"},
+ __PACKAGE__,
+ @{$W->{"packages_used"}{"__My::Web"}},
+ map((!$_ ? () : @$_),$W->{"packages_used"}{$W->{"__PACKAGE__"}}),
+ );
+ my %packages_used;
+ @packages_used=grep((!$packages_used{$_}++),@packages_used);
if ($W->{"footer_ids"}) {
- print '<p class="cvs-id">';
- print join("<br />\n",map({ my $package=$_;
+ Wprint '<p class="cvs-id">';
+ Wprint join("<br />\n",map({ my $package=$_;
my $cvs_id=(eval('$'.$package."::CVS_ID")
# || $package # debug
);
my $file=$package;
$file=~s#::#/#g;
my $ext;
+ my @tried;
for (qw(.html.pl .pl .pm),"") {
$ext=$_;
- last if -r top_dir_disk()."/$file$ext";
- cluck "Class file $file not found" if !$ext;
+ my $pathname=top_dir_disk()."/$file$ext";
+ push @tried,$pathname;
+ last if -r $pathname;
+ cluck "Class file $file not found; tried: ".join(" ",@tried) if !$ext;
}
$file.=$ext;
$cvs_id_split[2]=""
}
join " ",@cvs_id_split;
}
- } (
- $W->{"__PACKAGE__"},
- __PACKAGE__,
- @{$W->{"packages_used"}{$Apache::Registry::curstash}},
- )));
- print "</p>\n";
+ } @packages_used));
+ Wprint "</p>\n";
}
- for my $package (
- $W->{"__PACKAGE__"},
- __PACKAGE__,
- @{$W->{"packages_used"}{$Apache::Registry::curstash}},
- ) {
+ for my $package (@packages_used) {
my $cvs_id=(eval('$'.$package."::CVS_ID")
# || $package # debug
);
- print '<!-- '.$package.' - $'.$cvs_id.'$ -->'."\n" if $cvs_id;
+ Wprint '<!-- '.$package.' - $'.$cvs_id.'$ -->'."\n" if $cvs_id;
}
if ($W->{"heading"}) {
do { &{$_}() if $_; } for ($W->{"footing"});
}
- print "</body></html>\n";
+ Wprint "</body></html>\n";
exit(0);
}
my($url,$contents,%args)=@_;
do { $$_=1 if !defined $$_; } for (\$args{"size"});
- $contents=CGI::escapeHTML($url) if !defined $contents;
+ if (!defined $contents) {
+ $contents=$url;
+ $contents=File::Basename::basename($contents) if $args{"basename"};
+ $contents=CGI::escapeHTML($contents);
+ }
$contents=~s#<a\b[^>]*>##gi;
$contents=~s#</a>##gi;
$r.='"';
do { $r.=" $_" if $_; } for ($args{"attr"});
$r.='>'.$contents.'</a>';
- if ($args{"size"} && url_is_local($url) && $url=~/[.](?:gz|Z|rpm|zip|deb|lha)/) { # Downloadable?
+ if ($args{"size"} && url_is_local($url) && ($args{"size"}>=2 || $url=~/[.](?:gz|Z|rpm|zip|deb|lha)/)) { # Downloadable?
$url=top_dir_disk().$url if $url=~m#^/#;
if (!-r $url)
{ cluck "File not readable: $url"; }
# As 'Apache::ForwardedFor' takes the first of $ENV{"HTTP_X_FORWARDED_FOR"}
# while the contents is '127.0.0.1, 213.220.195.171' if client has its own proxy.
# We must take the last item ourselves.
- my $r=$ENV{"HTTP_X_FORWARDED_FOR"} || $W->{"r"}->get_remote_host();
+ my $r=$W->{"r"}->headers_in()->{"X-Forwarded-For"} || $W->{"r"}->get_remote_host();
$r=~s/^.*,\s*//;
return $r;
}
sub is_cz ()
{
+ return 0 if !$have_Geo_IP;
return "CZ" eq Geo::IP->new()->country_code_by_addr(remote_ip());
}
exit if $W->{"r"}->header_only();
if (1) { # || !$msie_major || $msie_major>=4) # TODO:dyn
- print '<?xml version="1.0" encoding="'.$client_charset.'"?>'."\n";
+ Wprint '<?xml version="1.0" encoding="'.$client_charset.'"?>'."\n";
}
- print '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'."\n";
- print '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">'."\n";
+ Wprint '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'."\n";
+ Wprint '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">'."\n";
my $title=$W->{"title_prefix"}.join("",map({ ': '.$_; } ($W->{"title"} || ())));
$title=~s#<[^>]*>##g;
- print "<head>";
- print "<title>$title</title>\n";
+ Wprint "<head>";
+ Wprint "<title>$title</title>\n";
if ($W->{"have_css"}) {
- print <<'HERE';
+ Wprint <<'HERE';
<style type="text/css"><!--
.cvs-id { font-family: monospace; }
.error { color: red; background-color: transparent; }
.nowrap { white-space: nowrap; }
.centered { text-align: center; }
.tab-bold { font-weight: bold; }
+.tab-head { font-weight: bold; }
+/*
.tab-head { font-weight: bold; color: yellow; background-color: transparent; }
body {
background-color: black;
:link { color: aqua; background-color: transparent; }
:visited { color: teal; background-color: transparent; }
h1,h2 { color: yellow; background-color: transparent; }
+*/
td { padding: 2px; }
caption { caption-side: bottom; }
.footer img { vertical-align: middle; }
HERE
- print $W->{"head_css"}."\n";
- print "--></style>\n";
+ Wprint $W->{"head_css"}."\n";
+ Wprint "--></style>\n";
}
- print '<meta name="robots" content="'.($W->{"indexme"} ? "" : "no" ).'index,follow" />'."\n";
- print $W->{"head"};
+ Wprint '<meta name="robots" content="'.($W->{"indexme"} ? "" : "no" ).'index,follow" />'."\n";
+ Wprint $W->{"head"};
for my $type (qw(prev next index contents start up)) {
- do { print '<link rel="'.$type.'" href="'.$_.'" />'."\n" if $_; } for ($W->{"rel_$type"});
+ do { Wprint '<link rel="'.$type.'" href="'.$_.'" />'."\n" if $_; } for ($W->{"rel_$type"});
}
- print "</head><body";
- print ' bgcolor="black" text="white" link="aqua" vlink="teal"'
- if $W->{"browser"}->netscape() && (!$W->{"browser"}->major() || $W->{"browser"}->major()<=4);
- print ">\n";
+ Wprint "</head><body";
+# Wprint ' bgcolor="black" text="white" link="aqua" vlink="teal"'
+# if $W->{"browser"}->netscape() && (!$W->{"browser"}->major() || $W->{"browser"}->major()<=4);
+ do { &{$_}($W) if $_; } for $W->{"body_attr_sub"};
+ Wprint ">\n";
if ($W->{"heading"}) {
do { &{$_}() if $_; } for ($W->{"heading"});
}
}
+BEGIN {
+ delete $W->{"__My::Web_init"};
+ }
+
1;