version 1.331, 2006/04/11 20:00:44
|
version 1.345, 2006/04/21 20:45:42
|
Line 61 use POSIX qw(strftime mktime);
|
Line 61 use POSIX qw(strftime mktime);
|
use Apache::lonmenu(); |
use Apache::lonmenu(); |
use Apache::lonlocal; |
use Apache::lonlocal; |
use HTML::Entities; |
use HTML::Entities; |
|
use Apache::lonhtmlcommon(); |
|
use Apache::loncoursedata(); |
|
use Apache::lontexconvert(); |
|
|
my $readit; |
my $readit; |
|
|
Line 2751 Inputs:
|
Line 2754 Inputs:
|
=item * $notopbar, if true, keep the 'what is this' info but remove the |
=item * $notopbar, if true, keep the 'what is this' info but remove the |
navigational links |
navigational links |
|
|
=item * $bgcolor, used to override the bg coor on a webpage to a specific value |
=item * $bgcolor, used to override the bgcolor on a webpage to a specific value |
|
|
|
=item * $notitle, if true keep the nav controls, but remove the title bar |
|
|
|
|
=back |
=back |
|
|
Line 2764 other decorations will be returned.
|
Line 2770 other decorations will be returned.
|
|
|
sub bodytag { |
sub bodytag { |
my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,$customtitle, |
my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,$customtitle, |
$notopbar,$bgcolor)=@_; |
$notopbar,$bgcolor,$notitle)=@_; |
|
|
$title=&mt($title); |
$title=&mt($title); |
|
|
$function = &get_users_function() if (!$function); |
$function = &get_users_function() if (!$function); |
my $img=&designparm($function.'.img',$domain); |
my $img = &designparm($function.'.img',$domain); |
my $pgbg= $bgcolor || &designparm($function.'.pgbg',$domain); |
my $tabbg = &designparm($function.'.tabbg',$domain); |
my $tabbg=&designparm($function.'.tabbg',$domain); |
my $font = &designparm($function.'.font',$domain); |
my $font=&designparm($function.'.font',$domain); |
my $sidebg = &designparm($function.'.sidebg',$domain); |
my $link=&designparm($function.'.link',$domain); |
my $pgbg = $bgcolor || &designparm($function.'.pgbg',$domain); |
my $alink=&designparm($function.'.alink',$domain); |
|
my $vlink=&designparm($function.'.vlink',$domain); |
my %design = ( 'style' => 'margin-top: 0px', |
my $sidebg=&designparm($function.'.sidebg',$domain); |
'bgcolor' => $pgbg, |
# Accessibility font enhance |
'text' => $font, |
my $addstyle=''; |
'alink' => &designparm($function.'.alink',$domain), |
if ($env{'browser.fontenhance'} eq 'on') { |
'vlink' => &designparm($function.'.vlink',$domain), |
$addstyle=' font-size: x-large;'; |
'link' => &designparm($function.'.link',$domain),); |
} |
@$addentries{keys(%design)} = @design{keys(%design)}; |
|
|
# role and realm |
# role and realm |
my ($role,$realm) |
my ($role,$realm) |
=&Apache::lonnet::plaintext((split(/\./,$env{'request.role'}))[0]); |
=&Apache::lonnet::plaintext((split(/\./,$env{'request.role'}))[0]); |
Line 2799 sub bodytag {
|
Line 2808 sub bodytag {
|
|
|
# construct main body tag |
# construct main body tag |
my $bodytag = <<END; |
my $bodytag = <<END; |
<style type="text/css"> |
<body $extra_body_attr> |
h1, h2, h3, th { font-family: Arial, Helvetica, sans-serif } |
|
a:focus { color: red; background: yellow } |
|
table.thinborder { border-collapse: collapse; } |
|
table.thinborder tr th, table.thinborder tr td { border-style: solid; border-width: 1px} |
|
form, .inline { display: inline; } |
|
.center { text-align: center; } |
|
.filename {font-family: monospace;} |
|
</style> |
|
<body bgcolor="$pgbg" text="$font" alink="$alink" vlink="$vlink" link="$link" |
|
style="margin-top: 0px;$addstyle" $extra_body_attr> |
|
END |
END |
|
|
$bodytag .= &Apache::lontexconvert::init_math_support(); |
$bodytag .= &Apache::lontexconvert::init_math_support(); |
|
|
my $upperleft='<img src="http://'.$ENV{'HTTP_HOST'}.':'. |
my $upperleft='<img src="http://'.$ENV{'HTTP_HOST'}.':'. |
$lonhttpdPort.$img.'" alt="'.$function.'" />'; |
$lonhttpdPort.$img.'" alt="'.$function.'" />'; |
if ($bodyonly) { |
if ($bodyonly |
|
|| ($env{'request.state'} eq 'construct' |
|
&& $env{'environment.remote'} ne 'off' )) { |
return $bodytag; |
return $bodytag; |
} elsif ($env{'browser.interface'} eq 'textual') { |
} elsif ($env{'browser.interface'} eq 'textual') { |
# Accessibility |
# Accessibility |
|
|
return $bodytag.&Apache::lonmenu::menubuttons($forcereg,'web', |
$bodytag.=&Apache::lonmenu::menubuttons($forcereg,$forcereg); |
$forcereg). |
if (!$notitle) { |
'<h1>LON-CAPA: '.$title.'</h1>'; |
$bodytag.='<h1>LON-CAPA: '.$title.'</h1>'; |
|
} |
|
return $bodytag; |
} elsif ($env{'environment.remote'} eq 'off') { |
} elsif ($env{'environment.remote'} eq 'off') { |
# No Remote |
# No Remote |
my $roleinfo=(<<ENDROLE); |
my $roleinfo=(<<ENDROLE); |
Line 2872 ENDROLE
|
Line 2875 ENDROLE
|
} |
} |
$forcereg=1; |
$forcereg=1; |
} |
} |
my $titletable = '<table bgcolor="'.$pgbg.'" width="100%" border="0" '. |
my $titletable; |
|
if (!$notitle) { |
|
$titletable = |
|
'<table bgcolor="'.$pgbg.'" width="100%" border="0" '. |
'cellspacing="3" cellpadding="3">'. |
'cellspacing="3" cellpadding="3">'. |
'<tr><td bgcolor="'.$tabbg.'">'. |
'<tr><td bgcolor="'.$tabbg.'">'. |
$titleinfo.'</td>'.$roleinfo.'</tr></table>'; |
$titleinfo.'</td>'.$roleinfo.'</tr></table>'; |
if ($env{'request.state'} eq 'construct') { |
} |
|
if ($env{'request.state'} eq 'construct') { |
if ($notopbar) { |
if ($notopbar) { |
$bodytag .= $titletable; |
$bodytag .= $titletable; |
} else { |
} else { |
$bodytag .= &Apache::lonmenu::menubuttons($forcereg,'web',$forcereg,$titletable); |
$bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg, |
|
$titletable); |
} |
} |
} else { |
} else { |
if ($notopbar) { |
if ($notopbar) { |
$bodytag .= $titletable; |
$bodytag .= $titletable; |
} else { |
} else { |
$bodytag .= &Apache::lonmenu::menubuttons($forcereg,'web',$forcereg). |
$bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg). |
$titletable; |
$titletable; |
} |
} |
} |
} |
Line 2913 ENDROLE
|
Line 2921 ENDROLE
|
# Explicit link to get inline menu |
# Explicit link to get inline menu |
my $menu='<br /><font size="2" face="Arial, Helvetica, sans-serif"> <a href="/adm/remote?action=collapse">'.&mt('Switch to Inline Menu Mode').'</a></font>'; |
my $menu='<br /><font size="2" face="Arial, Helvetica, sans-serif"> <a href="/adm/remote?action=collapse">'.&mt('Switch to Inline Menu Mode').'</a></font>'; |
# |
# |
|
if ($notitle) { |
|
return $bodytag; |
|
} |
return(<<ENDBODY); |
return(<<ENDBODY); |
$bodytag |
$bodytag |
<table width="100%" cellspacing="0" border="0" cellpadding="0"> |
<table width="100%" cellspacing="0" border="0" cellpadding="0"> |
Line 2951 sub make_attr_string {
|
Line 2962 sub make_attr_string {
|
} |
} |
|
|
if ($register) { |
if ($register) { |
$attr_ref->{'onload'} = &Apache::lonmenu::loadevents(). |
my ($on_load,$on_unload); |
$attr_ref->{'onload'}; |
foreach my $key (keys(%{$attr_ref})) { |
$attr_ref->{'onunload'} = &Apache::lonmenu::unloadevents(). |
if (lc($key) eq 'onload') { |
$attr_ref->{'onunload'}; |
$on_load.=$attr_ref->{$key}.';'; |
|
delete($attr_ref->{$key}); |
|
|
|
} elsif (lc($key) eq 'onunload') { |
|
$on_unload.=$attr_ref->{$key}.';'; |
|
delete($attr_ref->{$key}); |
|
} |
|
} |
|
$attr_ref->{'onload'} = |
|
&Apache::lonmenu::loadevents(). $on_load; |
|
$attr_ref->{'onunload'}= |
|
&Apache::lonmenu::unloadevents().$on_unload; |
|
} |
|
|
|
# Accessibility font enhance |
|
if ($env{'browser.fontenhance'} eq 'on') { |
|
my $style; |
|
foreach my $key (keys(%{$attr_ref})) { |
|
if (lc($key) eq 'style') { |
|
$style.=$attr_ref->{$key}.';'; |
|
delete($attr_ref->{$key}); |
|
} |
|
} |
|
$attr_ref->{'style'}=$style.'; font-size: x-large;'; |
|
} |
|
|
|
if ($env{'browser.blackwhite'} eq 'on') { |
|
delete($attr_ref->{'font'}); |
|
delete($attr_ref->{'link'}); |
|
delete($attr_ref->{'alink'}); |
|
delete($attr_ref->{'vlink'}); |
|
delete($attr_ref->{'bgcolor'}); |
|
delete($attr_ref->{'background'}); |
} |
} |
|
|
my $attr_string; |
my $attr_string; |
foreach my $attr (keys(%$attr_ref)) { |
foreach my $attr (keys(%$attr_ref)) { |
$attr_string .= " $attr=\"".$attr_ref->{$attr}.'" '; |
$attr_string .= " $attr=\"".$attr_ref->{$attr}.'" '; |
Line 2997 sub endbodytag {
|
Line 3041 sub endbodytag {
|
return $endbodytag; |
return $endbodytag; |
} |
} |
|
|
|
sub standard_css { |
|
my ($function,$domain,$bgcolor) = @_; |
|
my $function = &get_users_function() if (!$function); |
|
my $img = &designparm($function.'.img',$domain); |
|
my $tabbg = &designparm($function.'.tabbg',$domain); |
|
my $font = &designparm($function.'.font',$domain); |
|
my $sidebg = &designparm($function.'.sidebg',$domain); |
|
my $pgbg = $bgcolor || &designparm($function.'.pgbg',$domain); |
|
|
|
my $alink = &designparm($function.'.alink',$domain); |
|
my $vlink = &designparm($function.'.vlink',$domain); |
|
my $link = &designparm($function.'.link',$domain); |
|
my $sans = 'Arial,Helvetica,sans-serif'; |
|
return <<END; |
|
<style type="text/css"> |
|
h1, h2, h3, th { font-family: $sans } |
|
a:focus { color: red; background: yellow } |
|
table.thinborder { border-collapse: collapse; } |
|
table.thinborder tr th, table.thinborder tr td { border-style: solid; border-width: 1px} |
|
form, .inline { display: inline; } |
|
.center { text-align: center; } |
|
.filename {font-family: monospace;} |
|
table#LC_top_nav { |
|
width: 100%; |
|
background: $pgbg; |
|
border: 0px; |
|
border-spacing: 1px; |
|
padding: 0px; |
|
margin: 0px; |
|
border-collapse: separate; |
|
} |
|
table#LC_top_nav td { |
|
background: $tabbg; |
|
} |
|
table#LC_top_nav td a, div#LC_top_nav a { |
|
color: $font; |
|
font-family: $sans; |
|
} |
|
</style> |
|
END |
|
} |
|
|
=pod |
=pod |
|
|
=over 4 |
=over 4 |
Line 3010 Inputs: $title - optional title for the
|
Line 3096 Inputs: $title - optional title for the
|
$args - optional arguments |
$args - optional arguments |
force_register - if is true call registerurl so the remote is |
force_register - if is true call registerurl so the remote is |
informed |
informed |
|
|
redirect - array ref of seconds before redirect occurs |
redirect - array ref of seconds before redirect occurs |
url to redirect to |
url to redirect to |
(side effect of setting |
(side effect of setting |
Line 3025 sub headtag {
|
Line 3110 sub headtag {
|
|
|
my $result = |
my $result = |
'<head>'. |
'<head>'. |
&Apache::lonxml::fontsettings(). |
&standard_css(). |
|
&font_settings(). |
&Apache::lonhtmlcommon::htmlareaheaders(); |
&Apache::lonhtmlcommon::htmlareaheaders(); |
|
|
if ($args->{'force_register'}) { |
if ($args->{'force_register'}) { |
Line 3038 sub headtag {
|
Line 3124 sub headtag {
|
$env{'internal.head.redirect'} = $url; |
$env{'internal.head.redirect'} = $url; |
$result.=<<ADDMETA |
$result.=<<ADDMETA |
<meta http-equiv="pragma" content="no-cache" /> |
<meta http-equiv="pragma" content="no-cache" /> |
<meta HTTP-EQUIV="Refresh" CONTENT="$time; url=$url" /> |
<meta http-equiv="Refresh" content="$time; url=$url" /> |
ADDMETA |
ADDMETA |
} |
} |
if (!defined($title)) { |
if (!defined($title)) { |
Line 3053 ADDMETA
|
Line 3139 ADDMETA
|
|
|
=over 4 |
=over 4 |
|
|
|
=item * &font_settings() |
|
|
|
Returns neccessary <meta> to set the proper encoding |
|
|
|
Inputs: none |
|
|
|
=back |
|
|
|
=cut |
|
|
|
sub font_settings { |
|
my $headerstring=''; |
|
if (($env{'browser.os'} eq 'mac') && (!$env{'browser.mathml'})) { |
|
$headerstring.= |
|
'<meta Content-Type="text/html; charset=x-mac-roman" />'; |
|
} elsif (!$env{'browser.mathml'} && $env{'browser.unicode'}) { |
|
$headerstring.= |
|
'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'; |
|
} |
|
return $headerstring; |
|
} |
|
|
|
=pod |
|
|
|
=over 4 |
|
|
|
=item * &xml_begin() |
|
|
|
Returns the needed doctype and <html> |
|
|
|
Inputs: none |
|
|
|
=back |
|
|
|
=cut |
|
|
|
sub xml_begin { |
|
my $output=''; |
|
|
|
&Apache::lonhtmlcommon::init_htmlareafields(); |
|
|
|
if ($env{'browser.mathml'}) { |
|
$output='<?xml version="1.0"?>' |
|
#.'<?xml-stylesheet type="text/css" href="/adm/MathML/mathml.css"?>'."\n" |
|
# .'<!DOCTYPE html SYSTEM "/adm/MathML/mathml.dtd" ' |
|
|
|
# .'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [<!ENTITY mathns "http://www.w3.org/1998/Math/MathML">] >' |
|
.'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">' |
|
.'<html xmlns:math="http://www.w3.org/1998/Math/MathML" ' |
|
.'xmlns="http://www.w3.org/1999/xhtml">'; |
|
} else { |
|
$output='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>'; |
|
} |
|
return $output; |
|
} |
|
|
|
=pod |
|
|
|
=over 4 |
|
|
=item * &endheadtag() |
=item * &endheadtag() |
|
|
Returns a uniform </head> for LON-CAPA web pages. |
Returns a uniform </head> for LON-CAPA web pages. |
Line 3118 Inputs: $title - optional title for the
|
Line 3264 Inputs: $title - optional title for the
|
is not auto translated like the $title is |
is not auto translated like the $title is |
frameset -> if true will start with a <frameset> |
frameset -> if true will start with a <frameset> |
rather than <body> |
rather than <body> |
|
no_title -> if true the title bar won't be shown |
|
skip_phases -> hash ref of |
|
head -> skip the <html><head> generation |
|
body -> skip all <body> generation |
|
|
=back |
=back |
|
|
=cut |
=cut |
Line 3133 sub start_page {
|
Line 3284 sub start_page {
|
} |
} |
|
|
$env{'internal.start_page'}++; |
$env{'internal.start_page'}++; |
my $result = |
my $result; |
&Apache::lonxml::xmlbegin(). |
if (! exists($args->{'skip_phases'}{'head'}) ) { |
&headtag($title,$head_extra,\%head_args).&endheadtag(); |
$result.= |
if ($args->{'frameset'}) { |
&xml_begin(). |
my $attr_string = &make_attr_string($args->{'force_register'}, |
&headtag($title,$head_extra,\%head_args).&endheadtag(); |
$args->{'add_entries'}); |
|
$result .= "\n<frameset $attr_string>\n"; |
|
} else { |
|
$result .= |
|
&bodytag($title, |
|
$args->{'function'}, $args->{'add_entries'}, |
|
$args->{'only_body'}, $args->{'domain'}, |
|
$args->{'force_register'}, $args->{'body_title'}, |
|
$args->{'no_nav_bar'}, $args->{'bgcolor'}); |
|
} |
} |
|
|
|
if (! exists($args->{'skip_phases'}{'body'}) ) { |
|
if ($args->{'frameset'}) { |
|
my $attr_string = &make_attr_string($args->{'force_register'}, |
|
$args->{'add_entries'}); |
|
$result .= "\n<frameset $attr_string>\n"; |
|
} else { |
|
$result .= |
|
&bodytag($title, |
|
$args->{'function'}, $args->{'add_entries'}, |
|
$args->{'only_body'}, $args->{'domain'}, |
|
$args->{'force_register'}, $args->{'body_title'}, |
|
$args->{'no_nav_bar'}, $args->{'bgcolor'}, |
|
$args->{'no_title'}); |
|
} |
|
} |
|
|
if ($args->{'js_ready'}) { |
if ($args->{'js_ready'}) { |
$result = &js_ready($result); |
$result = &js_ready($result); |
} |
} |
Line 3182 sub end_page {
|
Line 3341 sub end_page {
|
#&Apache::lonnet::logthis("end_page ".join(':',caller(0))); |
#&Apache::lonnet::logthis("end_page ".join(':',caller(0))); |
$env{'internal.end_page'}++; |
$env{'internal.end_page'}++; |
my $result; |
my $result; |
|
if ($args->{'discussion'}) { |
|
my ($target,$parser); |
|
if (ref($args->{'discussion'})) { |
|
($target,$parser) =($args->{'discussion'}{'target'}, |
|
$args->{'discussion'}{'parser'}); |
|
} |
|
$result .= &Apache::lonxml::xmlend($target,$parser); |
|
} |
|
|
if ($args->{'frameset'}) { |
if ($args->{'frameset'}) { |
$result .= '</frameset>'; |
$result .= '</frameset>'; |
} else { |
} else { |
Line 3192 sub end_page {
|
Line 3360 sub end_page {
|
if ($args->{'js_ready'}) { |
if ($args->{'js_ready'}) { |
$result = &js_ready($result); |
$result = &js_ready($result); |
} |
} |
|
|
if ($args->{'html_encode'}) { |
if ($args->{'html_encode'}) { |
$result = &html_encode($result); |
$result = &html_encode($result); |
} |
} |
|
|
return $result; |
return $result; |
} |
} |
|
|
Line 3671 sub get_user_info {
|
Line 3841 sub get_user_info {
|
return; |
return; |
} |
} |
|
|
############################################### |
|
|
|
sub get_posted_cgi { |
|
my $r=shift; |
|
|
|
my $buffer; |
|
if ($r->header_in('Content-length')) { |
|
$r->read($buffer,$r->header_in('Content-length'),0); |
|
} |
|
unless ($buffer=~/^(\-+\w+)\s+Content\-Disposition\:\s*form\-data/si) { |
|
my @pairs=split(/&/,$buffer); |
|
my $pair; |
|
foreach $pair (@pairs) { |
|
my ($name,$value) = split(/=/,$pair); |
|
$value =~ tr/+/ /; |
|
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; |
|
$name =~ tr/+/ /; |
|
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; |
|
&add_to_env("form.$name",$value); |
|
} |
|
} else { |
|
my $contentsep=$1; |
|
my @lines = split (/\n/,$buffer); |
|
my $name=''; |
|
my $value=''; |
|
my $fname=''; |
|
my $fmime=''; |
|
my $i; |
|
for ($i=0;$i<=$#lines;$i++) { |
|
if ($lines[$i]=~/^$contentsep/) { |
|
if ($name) { |
|
chomp($value); |
|
if ($fname) { |
|
$env{"form.$name.filename"}=$fname; |
|
$env{"form.$name.mimetype"}=$fmime; |
|
} else { |
|
$value=~s/\s+$//s; |
|
} |
|
&add_to_env("form.$name",$value); |
|
} |
|
if ($i<$#lines) { |
|
$i++; |
|
$lines[$i]=~ |
|
/Content\-Disposition\:\s*form\-data\;\s*name\=\"([^\"]+)\"/i; |
|
$name=$1; |
|
$value=''; |
|
if ($lines[$i]=~/filename\=\"([^\"]+)\"/i) { |
|
$fname=$1; |
|
if |
|
($lines[$i+1]=~/Content\-Type\:\s*([\w\-\/]+)/i) { |
|
$fmime=$1; |
|
$i++; |
|
} else { |
|
$fmime=''; |
|
} |
|
} else { |
|
$fname=''; |
|
$fmime=''; |
|
} |
|
$i++; |
|
} |
|
} else { |
|
$value.=$lines[$i]."\n"; |
|
} |
|
} |
|
} |
|
# |
|
# Digested POSTed values |
|
# |
|
# Remember the way this was originally done (GET or POST) |
|
# |
|
$env{'request.method'}=$ENV{'REQUEST_METHOD'}; |
|
# |
|
# There may also be stuff in the query string |
|
# Tell subsequent handlers that this was GET, not POST, so they can access query string. |
|
# Also, unset POSTed content length to cover all tracks. |
|
# |
|
|
|
# This does not work, because M_GET is not defined (if it's defined, it is just 0). |
|
# Commenting out for now ... not sure if harm is done. |
|
# $r->method_number(M_GET); |
|
|
|
$r->method('GET'); |
|
$r->headers_in->unset('Content-length'); |
|
} |
|
|
|
=pod |
=pod |
|
|
=item * get_unprocessed_cgi($query,$possible_names) |
=item * get_unprocessed_cgi($query,$possible_names) |