--- loncom/xml/londefdef.pm 2003/04/11 18:25:03 1.125 +++ loncom/xml/londefdef.pm 2003/08/27 15:00:43 1.158.4.3 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Tags Default Definition Module # -# $Id: londefdef.pm,v 1.125 2003/04/11 18:25:03 sakharuk Exp $ +# $Id: londefdef.pm,v 1.158.4.3 2003/08/27 15:00:43 albertel Exp $ # # # Copyright Michigan State University Board of Trustees @@ -25,8 +25,7 @@ # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ -# -# Copyright for TtHfunc and TtMfunc by Ian Hutchinson. +## Copyright for TtHfunc and TtMfunc by Ian Hutchinson. # TtHfunc and TtMfunc (the "Code") may be compiled and linked into # binary executable programs or libraries distributed by the # Michigan State University (the "Licensee"), but any binaries so @@ -54,7 +53,7 @@ use Apache::lonmeta(); BEGIN { - &Apache::lonxml::register('Apache::londefdef',('a','abbr','acronym','accessrule','address','allow','applet','area','b','base','basefont','bgo','bgsound','big','blink','blockquote','blankspace','body','br','button','caption','center','cite','code','col','colgroup','dd','del','dfn','dir','div','dl','dt','em','embed','externallink','fieldset','font','form','frame','frameset','h1','h2','h3','h4','h5','h6','head','hr','html','i','iframe','img','input','ins','insert','isindex','kbd','keygen','label','layer','legend','li','link','m','map','marquee','menu','meta','multicol','nobr','noembed','noframes','nolayer','noscript','object','ol','optgroup','option','output','p','param','pre','q','s','samp','select','server','small','spacer','span','strike','strong','sub','sup','table','tbody','td','textarea','tfoot','th','thead','title','tr','tt','tthoption','u','ul','var','wbr')); + &Apache::lonxml::register('Apache::londefdef',('a','abbr','acronym','accessrule','address','allow','applet','area','b','base','basefont','bgo','bgsound','big','blink','blockquote','blankspace','body','br','button','caption','center','cite','code','col','colgroup','dd','del','dfn','dir','div','dl','dt','em','embed','externallink','fieldset','font','form','frame','frameset','h1','h2','h3','h4','h5','h6','head','hr','html','i','iframe','img','input','ins','insert','isindex','kbd','keygen','label','layer','legend','li','link','m','map','marquee','menu','meta','multicol','nobr','noembed','noframes','nolayer','noscript','object','ol','optgroup','option','output','p','param','pre','q','s','samp','select','server','small','spacer','span','strike','strong','sub','sup','table','tbody','td','textarea','tfoot','th','thead','title','tr','tt','tthoption','u','ul','var','wbr','hideweboutput')); } @@ -157,9 +156,11 @@ sub start_html { &Apache::lonxml::fontsettings(); } elsif ($target eq 'tex') { @Apache::londefdef::table = (); - $currentstring .= '\documentclass[letterpaper]{article} - \newcommand{\keephidden}[1]{} + $currentstring .= '\documentclass[letterpaper]{article}'; + if ($ENV{'form.latex_type'}=~'batchmode') {$currentstring .='\batchmode';} + $currentstring .= '\newcommand{\keephidden}[1]{} \renewcommand{\deg}{$^{\circ}$} + \usepackage{longtable} \usepackage{textcomp} \usepackage[dvips]{graphicx} \usepackage{epsfig}\usepackage{calc} @@ -354,8 +355,7 @@ sub start_meta { } else { $currentstring = $token->[4]; } - } - if ($target eq 'meta') { + } elsif ($target eq 'meta') { unless (&Apache::lonxml::get_param ('http-equiv',$parstack,$safeeval,undef,1)) { my $name=$token->[2]->{'name'}; @@ -363,18 +363,38 @@ sub start_meta { $name=~s/\s/\_/gs; $name=~s/\W//gs; if ($name) { - $currentstring='<'.$name.'>'. + $currentstring='<'.$name; + my $display=&Apache::lonxml::get_param + ('display',$parstack,$safeeval,undef,1); + if ($display) { + $display=~s/\"/\'/g; + $currentstring.=' display="'.$display.'"'; + } + $currentstring.='>'. &Apache::lonxml::get_param ('content',$parstack,$safeeval,undef,1). - ''; + ''; } + my $display=&Apache::lonxml::get_param + ('display',$parstack,$safeeval,undef,1); + if ($display) { + $display=&HTML::Entities::encode($display); + $currentstring.='<'.$name.'.display>'.$display. + ''; + } + } + } elsif ($target eq 'tex') { + my $content=&Apache::lonxml::get_param('content',$parstack,$safeeval); + my $name=&Apache::lonxml::get_param('name',$parstack,$safeeval); + if ((not defined $content) && (not defined $name)) { + &Apache::lonxml::startredirection(); } } return $currentstring; } sub end_meta { - my ($target,$token,$tagstack,$parstack,$parser) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { my $args=''; @@ -382,7 +402,13 @@ sub end_meta { if ($args ne '') { $currentstring = $token->[4]; } - } + } elsif ($target eq 'tex') { + my $content=&Apache::lonxml::get_param('content',$parstack,$safeeval); + my $name=&Apache::lonxml::get_param('name',$parstack,$safeeval); + if ((not defined $content) && (not defined $name)) { + &Apache::lonxml::endredirection(); + } + } return $currentstring; } @@ -440,6 +466,29 @@ sub start_body { $currentstring.=''. &Apache::lonmenu::registerurl(undef,$target).''; } +# Accessibility + if ($ENV{'browser.imagesuppress'} eq 'on') { + delete($token->[2]->{'background'}); + } + if ($ENV{'browser.fontenhance'} eq 'on') { + my $style=''; + foreach my $key (keys(%{$token->[2]})) { + if ($key =~ /^style$/i) { + $style.=$token->[2]->{$key}.';'; + delete($token->[2]->{$key}); + } + } + $token->[2]->{'style'}=$style.'; font-size: x-large;'; + } + if ($ENV{'browser.blackwhite'} eq 'on') { + delete($token->[2]->{'font'}); + delete($token->[2]->{'link'}); + delete($token->[2]->{'alink'}); + delete($token->[2]->{'vlink'}); + delete($token->[2]->{'bgcolor'}); + delete($token->[2]->{'background'}); + } +# Overload loads my $onLoad=''; foreach my $key (keys(%{$token->[2]})) { if ($key =~ /^onload$/i) { @@ -497,9 +546,7 @@ sub start_center { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $currentstring = '\begin{center}'; - } elsif ($target eq 'latexsource') { - $currentstring = '\begin{center}'; - } + } return $currentstring; } @@ -510,9 +557,7 @@ sub end_center { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = '\end{center}'; - } elsif ($target eq 'latexsource') { - $currentstring = '\end{center}'; - } + } return $currentstring; } @@ -524,8 +569,6 @@ sub start_b { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $currentstring = '\textbf{'; - } elsif ($target eq 'latexsource') { - $currentstring = '\textbf{'; } return $currentstring; } @@ -537,8 +580,6 @@ sub end_b { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = '}'; - } elsif ($target eq 'latexsource') { - $currentstring = '}'; } return $currentstring; } @@ -551,8 +592,6 @@ sub start_strong { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $currentstring = '\textbf{'; - } elsif ($target eq 'latexsource') { - $currentstring = '\textbf{'; } return $currentstring; } @@ -565,9 +604,7 @@ sub end_strong { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = '}'; - } elsif ($target eq 'latexsource') { - $currentstring = '}'; - } + } return $currentstring; } @@ -843,9 +880,7 @@ sub start_cite { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= "\\textit{"; - } elsif ($target eq 'latexsource') { - $currentstring .= "\\textit{"; - } + } return $currentstring; } @@ -856,9 +891,7 @@ sub end_cite { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= "}"; - } elsif ($target eq 'latexsource') { - $currentstring .= "}"; - } + } return $currentstring; } @@ -870,9 +903,7 @@ sub start_i { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\textit{'; - } elsif ($target eq 'latexsource') { - $currentstring .= '\textit{'; - } + } return $currentstring; } @@ -883,8 +914,6 @@ sub end_i { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; - } elsif ($target eq 'latexsource') { - $currentstring .= '}'; } return $currentstring; } @@ -897,9 +926,7 @@ sub start_address { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= "\\textit{"; - } elsif ($target eq 'latexsource') { - $currentstring .= "\\textit{"; - } + } return $currentstring; } @@ -910,8 +937,6 @@ sub end_address { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= "}"; - } elsif ($target eq 'latexsource') { - $currentstring .= "}"; } return $currentstring; } @@ -924,8 +949,6 @@ sub start_dfn { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= "\\textit{"; - } elsif ($target eq 'latexsource') { - $currentstring .= "\\textit{"; } return $currentstring; } @@ -937,9 +960,7 @@ sub end_dfn { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= "}"; - } elsif ($target eq 'latexsource') { - $currentstring .= "}"; - } + } return $currentstring; } @@ -951,9 +972,7 @@ sub start_tt { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\texttt{'; - } elsif ($target eq 'latexsource') { - $currentstring .= '\texttt{'; - } + } return $currentstring; } @@ -964,8 +983,6 @@ sub end_tt { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; - } elsif ($target eq 'latexsource') { - $currentstring .= '}'; } return $currentstring; } @@ -978,9 +995,7 @@ sub start_kbd { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= "\\texttt"; - } elsif ($target eq 'latexsource') { - $currentstring .= "\\texttt{"; - } + } return $currentstring; } @@ -991,9 +1006,7 @@ sub end_kbd { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= "}"; - } elsif ($target eq 'latexsource') { - $currentstring .= "}"; - } + } return $currentstring; } @@ -1028,9 +1041,7 @@ sub start_em { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\emph{'; - } elsif ($target eq 'latexsource') { - $currentstring .= '\emph{'; - } + } return $currentstring; } @@ -1041,9 +1052,7 @@ sub end_em { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; - } elsif ($target eq 'latexsource') { - $currentstring .= '}'; - } + } return $currentstring; } @@ -1055,8 +1064,6 @@ sub start_q { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= "\\emph{"; - } elsif ($target eq 'latexsource') { - $currentstring .= "\\emph{"; } return $currentstring; } @@ -1068,23 +1075,21 @@ sub end_q { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= "}"; - } elsif ($target eq 'latexsource') { - $currentstring .= "}"; - } + } return $currentstring; } #--

tag sub start_p { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { - $currentstring .= '{\par '; - } elsif ($target eq 'latexsource') { - $currentstring .= '{\par '; - } + my $signal=1; + foreach my $tag (@$tagstack) {if (lc($tag) eq 'b') {$signal=0;}} + if ($signal) {$currentstring .= '\par ';} + } return $currentstring; } @@ -1093,10 +1098,6 @@ sub end_p { my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; - } elsif ($target eq 'tex') { - $currentstring .= '}'; - } elsif ($target eq 'latexsource') { - $currentstring .= '}'; } return $currentstring; } @@ -1109,11 +1110,9 @@ sub start_br { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { if ($$tagstack[-2] ne 'sub' && $$tagstack[-2] ne 'sup') { - $currentstring .= '\vskip 0.2 mm'; + $currentstring .= '\vskip 0.2 mm '; } - } elsif ($target eq 'latexsource') { - $currentstring .= '\\'; - } + } return $currentstring; } @@ -1133,10 +1132,8 @@ sub start_big { if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { - $currentstring .= '\large{'; - } elsif ($target eq 'latexsource') { - $currentstring .= '{\Large '; - } + $currentstring .= '{\large '; + } return $currentstring; } @@ -1147,8 +1144,6 @@ sub end_big { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; - } elsif ($target eq 'latexsource') { - $currentstring .= '}'; } return $currentstring; } @@ -1161,9 +1156,7 @@ sub start_small { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '{\footnotesize '; - } elsif ($target eq 'latexsource') { - $currentstring .= '{\footnotesize '; - } + } return $currentstring; } @@ -1174,28 +1167,36 @@ sub end_small { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; - } elsif ($target eq 'latexsource') { - $currentstring .= '}'; } return $currentstring; } #-- tag sub start_basefont { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; - } + } elsif ($target eq 'tex') { + my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval); + if (defined $basesize) { + $currentstring = '{\\'.$basesize.' '; + } + } return $currentstring; } sub end_basefont { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; - } + } elsif ($target eq 'tex') { + my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval); + if (defined $basesize) { + $currentstring = '}'; + } + } return $currentstring; } @@ -1205,9 +1206,19 @@ sub start_font { my $currentstring = ''; if ($target eq 'web') { my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval); - if ($face=~/symbol/i) {$Apache::lonxml::prevent_entity_encode++;} + if ($face=~/symbol/i) { + $Apache::lonxml::prevent_entity_encode++; + } else { + if (($ENV{'browser.fontenhance'} eq 'on') || + ($ENV{'browser.blackwhite'} eq 'on')) { return ''; } + } $currentstring = $token->[4]; - } + } elsif ($target eq 'tex') { + my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval); + if (defined $fontsize) { + $currentstring = '{\\'.$fontsize.' '; + } + } return $currentstring; } @@ -1218,7 +1229,12 @@ sub end_font { my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval); if ($face=~/symbol/i) {$Apache::lonxml::prevent_entity_encode--;} $currentstring = $token->[2]; - } + } elsif ($target eq 'tex') { + my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval); + if (defined $fontsize) { + $currentstring = '}'; + } + } return $currentstring; } @@ -1327,14 +1343,14 @@ sub start_hr { if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { - my $LaTeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,0); + my $LaTeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); if (defined $LaTeXwidth) { if ($LaTeXwidth=~/^%/) { substr($LaTeXwidth,0,1)=''; $LaTeXwidth=($LaTeXwidth/100).'\textwidth'; } } else { - $LaTeXwidth ='0.95\textwidth'; + $LaTeXwidth ='0.9\textwidth'; } my ($pre,$post); my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); @@ -1345,7 +1361,7 @@ sub start_hr { } elsif ($align eq 'right') { $pre=' \hfill \llap{'; $post='}'; } - $currentstring .= ' \vskip 0 mm \noindent\makebox[\textwidth]{'.$pre.'\makebox['. + $currentstring .= ' \vskip 0 mm \noindent\makebox['.$LaTeXwidth.']{'.$pre.'\makebox['. $LaTeXwidth.'][b]{\hrulefill}'.$post.'}\vskip 0 mm '; } return $currentstring; @@ -1356,8 +1372,7 @@ sub end_hr { my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; - } elsif ($target eq 'tex') { - } + } return $currentstring; } @@ -1382,50 +1397,43 @@ sub end_div { #-- tag sub start_a { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { + my $a=&Apache::lonxml::get_param('href',$parstack,$safeeval,undef,1); + $a=~s/([^\\])%/$1\\\%/g; + $currentstring .= '\ref{'.$a.'}'; } return $currentstring; } sub end_a { - my ($target,$token,$tagstack,$stackref) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; - } elsif ($target eq 'tex') { - my $tempor_var = $stackref->[$#$stackref]; - if (index($tempor_var,'name') != -1 ) { - $tempor_var =~ s/name=([^,]*),/$1/g; - } elsif (index($tempor_var,'href') != -1 ) { - $tempor_var =~ s/href=([^,]*),/$1/g; - $currentstring .= " \\ref{$tempor_var}"; - } } return $currentstring; } #--

  • tag sub start_li { - my ($target,$token,$tagstack,$stackref) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { - my $tempor_var = $stackref->[$#$stackref]; - if (index($tempor_var,'circle') != -1 ) { - $currentstring .= " \\item[o] "; - } elsif (index($tempor_var,'square') != -1 ) { - $currentstring .= " \\item[$\Box$] "; - } elsif ($tempor_var ne '') { - $_ = $tempor_var; - m/my\s*([^=]*)=/; - $currentstring .= " \\item[$1] "; + my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,1); + if ($type=~/circle/) { + $currentstring .= ' \item[o] '; + } elsif ($type=~/square/) { + $currentstring .= ' \item[$\Box$] '; + } elsif ($type ne '') { + $currentstring .= ' \item['.$type.'] '; } else { - $currentstring .= " \\item "; + $currentstring .= ' \item '; } } return $currentstring; @@ -1656,10 +1664,16 @@ sub end_dt { #--
    tag sub start_dd { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; + } elsif ($target eq 'tex') { + if ($$tagstack[-2] eq 'dl') { + $currentstring = ' \item [] '; + } elsif ($$tagstack[-2] eq 'dt') { + $currentstring = ']'; + } } return $currentstring; } @@ -1676,6 +1690,14 @@ sub end_dd { #-- tag sub start_table { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; + my $textwidth=''; + if (not defined @Apache::londefdef::table) { + $textwidth=&recalc($ENV{'form.textwidth'}); + $textwidth=~/(\d+\.?\d*)/; + $textwidth=0.95*$1; + } else { + $textwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); + } my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; @@ -1683,7 +1705,25 @@ sub start_table { my $aa = {}; push @Apache::londefdef::table, $aa; $Apache::londefdef::table[-1]{'row_number'} = -1; - $Apache::londefdef::table[-1]{'output'} = ' \noindent \begin{tabular} '; + #table's width + my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); + if (not defined $TeXwidth) { + my $htmlwidth = &Apache::lonxml::get_param('width',$parstack,$safeeval,undef,1); + if ($htmlwidth=~/%/) { + $htmlwidth=~/(\d+)/; + my $value=$1*$textwidth/100; + $Apache::londefdef::table[-1]{'width'}=$value; + } else { + $Apache::londefdef::table[-1]{'width'}=$textwidth; + } + } elsif ($TeXwidth=~/%/) { + $TeXwidth=~/(\d+)/; + my $value=$1*$textwidth/100; + $Apache::londefdef::table[-1]{'width'}=$value; + } else { + $Apache::londefdef::table[-1]{'width'}=$textwidth; + } + #table's border my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval,undef,1); unless (defined $border) { $border = 0; } if ($border) { @@ -1695,13 +1735,8 @@ sub start_table { $Apache::londefdef::table[-1]{'vinc'} = '&'; $Apache::londefdef::table[-1]{'vvinc'} = ''; } - my $width; - foreach my $key (keys(%{$token->[2]})) { - if ($key =~ /^width$/i) { - $width = &Apache::lonxml::get_param($key,$parstack,$safeeval,undef,1); - } - } - if (defined($width)) { $Apache::londefdef::table[-1]{'width'}=$width; } + $Apache::londefdef::table[-1]{'output'} = ' \noindent \begin{tabular} '; + $currentstring = '\keephidden{NEW TABLE ENTRY}'; } return $currentstring; } @@ -1716,107 +1751,70 @@ sub end_table { my $output = ''; #construct header of the table my $header_of_table = '{'.$Apache::londefdef::table[-1]{'vvinc'}; - my $in; - for ($in=0;$in<=$Apache::londefdef::table[-1]{'counter_columns'};$in++) { + for (my $in=0;$in<=$Apache::londefdef::table[-1]{'counter_columns'};$in++) { $header_of_table .= $Apache::londefdef::table[-1]{'columns'}[$in].$Apache::londefdef::table[-1]{'vvinc'}; } $header_of_table .= '}'; - #fill the table - for ($in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { - $output .= $Apache::londefdef::table[-1]{'rowdata'}[$in]; - chop $output; - $output .= ' \\\\ '; - } #define the length of the table cells - my @lengthforoutput = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[0]); - my $how_many_columns = $#lengthforoutput + 1; #total number of columns in the table - my $filled_columns = 0; #number of columns with information about width - my $available_space = ' '; - foreach my $tempo_length (@{ $Apache::londefdef::table[-1]{'lengthrow'} }) { - my @length = split(/,/,$tempo_length); - for (my $ico=0;$ico<=$#lengthforoutput;$ico++) { - $lengthforoutput[$ico] =~ m/(\d*\.?\d*)\s*(\w+)/; - my $old_value = $1; - my $old_unit = $2; - if ($old_unit eq 'cm') { - $old_value = $old_value * 10; - } elsif ($old_unit eq 'in') { - $old_value = $old_value * 25.4; - } elsif ($old_unit eq 'pt') { - $old_value = $old_value * 25.4/72.27; - } elsif ($old_unit eq 'pc') { - $old_value = $old_value * 25.4/6.022; - } - $old_unit = 'mm'; - $length[$ico] =~ m/(\d*\.?\d*)\s*(\w+)/; - my $new_value = $1; - my $new_unit = $2; - if ($new_unit eq 'cm') { - $new_value = $new_value * 10; - } elsif ($old_unit eq 'in') { - $new_value = $new_value * 25.4; - } elsif ($old_unit eq 'pt') { - $new_value = $new_value * 25.4/72.27; - } elsif ($old_unit eq 'pc') { - $new_value = $new_value * 25.4/6.022; - } - $new_unit = 'mm'; - if ($old_value < $new_value) { - $lengthforoutput[$ico] = $new_value.' mm'; - } else { - $lengthforoutput[$ico] = $old_value.' mm'; + #always starts with TeXwidth (if defined everything else is ignored) + my @length_row_final = split(/,/,$Apache::londefdef::table[-1]{'TeXlengthrow'}[0]); + for (my $in=1;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { + my @length_row = split(/,/,$Apache::londefdef::table[-1]{'TeXlengthrow'}[$in]); + for (my $jn=0;$jn<=$#length_row;$jn++) { + if ($length_row_final[$jn]<$length_row[$jn]) {$length_row_final[$jn]=$length_row[$jn];} + } + } + #continues trying estimate the width of raw data + my @length_raw_row = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[0]); + for (my $in=1;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { + my @length_row = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[$in]); + for (my $jn=0;$jn<=$#length_row;$jn++) { + if ($length_raw_row[$jn]<$length_row[$jn]) {$length_raw_row[$jn]=$length_row[$jn];} + } + } + #comparing of TeXwidth and raw data width + my $available_length=$Apache::londefdef::table[-1]{'width'}; + my $needed=0; + for (my $jn=0;$jn<=$#length_row_final;$jn++) { + if ($length_row_final[$jn]!=0) { + $available_length=$available_length-$length_row_final[$jn]; + $needed++; + } + } + $needed=$#length_row_final-$needed+1; + for (my $jn=0;$jn<=$#length_row_final;$jn++) { + if ($length_row_final[$jn]==0) { + if ($length_raw_row[$jn]<$available_length/3) { + $length_row_final[$jn]=$length_raw_row[$jn]; + $available_length=$available_length-$length_raw_row[$jn]; + $needed--; } } } - for (my $ico=0;$ico<=$#lengthforoutput;$ico++) { - if (not $lengthforoutput[$ico]=~m/^\s*0\s*\w*\s*$/) { - $filled_columns++; - $available_space = $available_space.' - '.$lengthforoutput[$ico]; + for (my $jn=0;$jn<=$#length_row_final;$jn++) { + if ($length_row_final[$jn]==0) { + $length_row_final[$jn]=0.9*$available_length/$needed; } } - my $temp_file; - my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.tbl"; - if (-e $filename) { - $temp_file = Apache::File->new($filename); - my @tbl_file_content = <$temp_file>; - my ($one,$two,$three) = split(/,/,$tbl_file_content[0]); - $how_many_columns+=$one-1; - $filled_columns+=$two; - if($three=~/\S/) {$available_space = $available_space.' - '.$three;} - } else { - $temp_file = Apache::File->new('>>'.$filename); - } - print $temp_file "$how_many_columns,$filled_columns,$available_space\n"; - $output =~ s/\\parbox{TOBECHANGEDONNUMBER}{}/\\parbox{1 mm}{}/g; - $output =~ s/\\parbox{TOBECHANGEDONNUMBER}/\\parbox{\$SpacePerColumn}/g; - my @tagar = @$tagstack; - my $signature = 1; - for (my $ico=0;$ico<$#tagar;$ico++) { - if ($tagar[$ico] eq 'table') { $signature = 0; } - } - if ($signature) { - my $NumberEmptyLength = $how_many_columns - $filled_columns; - my $SpacePerColumn = '(\textwidth '.$available_space.')/'.$NumberEmptyLength; - my $shorthand = ($filled_columns+1)*4; - $output =~ s/\$SpacePerColumn/$SpacePerColumn - $shorthand mm/g; - } - if ($how_many_columns==1) { - #start of block with width correction for one column table - $output=~s/^\s*\\parbox\{([^\}]*)\}/\\parbox\{\\textwidth - 1 cm\}/; - #end of block with width correction for one column table + #fill the table + for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { + for (my $jn=0;$jn<=$#length_row_final;$jn++) { + my $substituted=$length_row_final[$jn]; + $Apache::londefdef::table[-1]{'rowdata'}[$in]=~s/TOBECHANGEDONNUMBER/$substituted mm/; + } + $output .= $Apache::londefdef::table[-1]{'rowdata'}[$in]; + chop $output; + $output .= ' \\\\ '; } $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$output.$Apache::londefdef::table[-1]{'hinc'}.'\end{tabular}\vskip 0 mm '; - if ($#Apache::londefdef::table > 0) { - $inmemory = $Apache::londefdef::table[-1]{'output'}; + if ($#Apache::londefdef::table > 0) { + my $inmemory = $Apache::londefdef::table[-1]{'output'}; pop @Apache::londefdef::table; - $Apache::londefdef::table[-1]{'rowdata'}[$Apache::londefdef::table[-1]{'row_number'}] .= $inmemory + push @{$Apache::londefdef::table[-1]{'include'}}, $inmemory; } else { - $currentstring = $Apache::londefdef::table[-1]{'output'}; - $currentstring =~ s/\\\\\s+\\\\/\\\\/g; + $currentstring .= $Apache::londefdef::table[-1]{'output'}; pop @Apache::londefdef::table; - if (-e $filename) { - unlink $filename; - } + undef @Apache::londefdef::table; } } return $currentstring; @@ -1838,7 +1836,8 @@ sub start_tr { } push ( @{ $Apache::londefdef::table[-1]{'rowdata'} }, $Apache::londefdef::table[-1]{'hinc'}); $Apache::londefdef::table[-1]{'counter_columns'} = -1; - $Apache::londefdef::table[-1]{'length'} = ''; + $Apache::londefdef::table[-1]{'TeXlength'} = ''; + $Apache::londefdef::table[-1]{'length'} = ''; } return $currentstring; } @@ -1849,8 +1848,8 @@ sub end_tr { if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { + push @{ $Apache::londefdef::table[-1]{'TeXlengthrow'} },$Apache::londefdef::table[-1]{'TeXlength'}; push @{ $Apache::londefdef::table[-1]{'lengthrow'} },$Apache::londefdef::table[-1]{'length'}; - } return $currentstring; } @@ -1874,27 +1873,37 @@ sub start_td { } sub end_td { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; - my $tempolen = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { my $current_row = $Apache::londefdef::table[-1]{'row_number'}; my $data=&Apache::lonxml::endredirection(); - if ($data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt))/) { - $Apache::londefdef::table[-1]{'length'} .= $1.','; - $tempolen = $1; + my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); + if (defined $TeXwidth) { + my $current_length=&recalc($TeXwidth); + $current_length=~/(\d+)/; + $Apache::londefdef::table[-1]{'TeXlength'} .= $1.','; + $Apache::londefdef::table[-1]{'length'} .= '0,'; } else { - if (length($data)<5) { - $Apache::londefdef::table[-1]{'length'} .= '0 mm,'; - $tempolen = '6 mm'; - } else { - $Apache::londefdef::table[-1]{'length'} .= '0 mm,'; - $tempolen = 'TOBECHANGEDONNUMBER'; - } - } - @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{'.$tempolen.'}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'}; + if ($data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) { + my $current_length=&recalc($1); + $current_length=~/(\d+\.?\d*)/; + $Apache::londefdef::table[-1]{'TeXlength'} .= $1.','; + $Apache::londefdef::table[-1]{'length'} .= '0,'; + } else { + $data=~s/^\s+(\S.*)/$1/; + $data=~s/(.*\S)\s+$/$1/; + my $current_length=2*length($data); + $Apache::londefdef::table[-1]{'length'} .= $current_length.','; + $Apache::londefdef::table[-1]{'TeXlength'} .= '0,'; + } + } + for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) { + $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/; + } + @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{TOBECHANGEDONNUMBER}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'}; } return $currentstring; } @@ -1913,29 +1922,48 @@ sub start_th { push @{ $Apache::londefdef::table[-1]{'columns'} }, $what_to_push; $Apache::londefdef::table[-1]{'counter_columns'}++; &Apache::lonxml::startredirection(); - ; } return $currentstring; -} - +} + sub end_th { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { my $current_row = $Apache::londefdef::table[-1]{'row_number'}; my $data=&Apache::lonxml::endredirection(); - if ($data=~m/width\s*=\s*(\d+\.*\d*\s*(mm|cm))/) { - $Apache::londefdef::table[-1]{'length'} .= $1.','; + my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); + if (defined $TeXwidth) { + my $current_length=&recalc($TeXwidth); + $current_length=~/(\d+)/; + $Apache::londefdef::table[-1]{'TeXlength'} .= $1.','; + $Apache::londefdef::table[-1]{'length'} .= '0,'; } else { - $Apache::londefdef::table[-1]{'length'} .= '0 mm,'; - } - @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{'.$1.'}{\textbf{'.$data.'}} '.$Apache::londefdef::table[-1]{'vinc'}; + if ($data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) { + my $current_length=&recalc($1); + $current_length=~/(\d+)/; + $Apache::londefdef::table[-1]{'TeXlength'} .= $1.','; + $Apache::londefdef::table[-1]{'length'} .= '0,'; + } else { + $data=~/^\s*(\S.*)/; + $data=$1; + $data=~/(.*\S)\s*$/; + $data=$1; + my $current_length=2*length($data); + $Apache::londefdef::table[-1]{'length'} .= $current_length.','; + $Apache::londefdef::table[-1]{'TeXlength'} .= '0,'; + } + } + for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) { + $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/; + } + $data='\textbf{'.$data.'}'; + @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{TOBECHANGEDONNUMBER}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'}; } return $currentstring; } - #-- tag sub start_img { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; @@ -1946,10 +1974,9 @@ sub start_img { my $width_param = ''; my $height_param = ''; my $scaling = .3; - if ($target eq 'web') { if ($ENV{'browser.imagesuppress'} ne 'on') { - $currentstring = $token->[4]; + $currentstring.= $token->[4]; } else { my $alttag= &Apache::lonxml::get_param ('alt',$parstack,$safeeval,undef,1); @@ -1957,12 +1984,11 @@ sub start_img { $alttag=&Apache::lonmeta::alttag ($Apache::lonxml::pwd[-1],$src); } - $currentstring='[IMAGE: '.$alttag.']'; + $currentstring.='[IMAGE: '.$alttag.']'; } } elsif ($target eq 'tex') { $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src); &image_replication($src); - #if original gif/jpg/png file exist do following: if (-e $src) { #defines the default size of image @@ -1987,6 +2013,7 @@ sub start_img { } elsif ($width ne '') { $width_param = $width*$scaling; } + if ($width_param > $ENV{'form.textwidth'}) {$width_param =0.95*$ENV{'form.textwidth'}} my $file; my $path; if ($src =~ m!(.*)/([^/]*)$!) { @@ -2159,7 +2186,8 @@ sub start_allow { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1); $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src); - $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$src; + $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]= + &Apache::lonnet::clutter($src); &image_replication($src); my $result; if ($target eq 'edit') { @@ -2189,7 +2217,29 @@ sub start_frameset { $currentstring.=''. &Apache::lonmenu::registerurl(undef,$target).''; } - $currentstring .= $token->[4]; + my $onLoad=''; + foreach my $key (keys(%{$token->[2]})) { + if ($key =~ /^onload$/i) { + $onLoad.=$token->[2]->{$key}.';'; + delete($token->[2]->{$key}); + } + } + $token->[2]->{'onload'}=&Apache::lonmenu::loadevents().';'.$onLoad; + my $onUnload=''; + foreach my $key (keys(%{$token->[2]})) { + if ($key =~ /^onunload$/i) { + $onUnload.=$token->[2]->{$key}.';'; + delete($token->[2]->{$key}); + } + } + $token->[2]->{'onunload'}=&Apache::lonmenu::unloadevents(). + ';'.$onUnload; + + $currentstring .= '<'.$token->[1]; + foreach (keys %{$token->[2]}) { + $currentstring.=' '.$_.'="'.$token->[2]->{$_}.'"'; + } + $currentstring.='>'; } return $currentstring; } @@ -2205,7 +2255,7 @@ sub end_frameset { #--
     sub start_pre {
    -    my ($target,$token) = @_;
    +    my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
         my $currentstring = '';
         if ($target eq 'web') {
     	$currentstring .= $token->[4];
    @@ -3065,6 +3115,26 @@ sub end_wbr {
         return $currentstring;
     }
     
    +
    +#--  tag
    +sub start_hideweboutput {
    +    my ($target,$token) = @_;
    +    if ($target eq 'web') {
    +	&Apache::lonxml::startredirection();     
    +    } 
    +    return '';
    +}
    +
    +sub end_hideweboutput {
    +    my ($target,$token) = @_;
    +    my $currentstring = '';
    +    if ($target eq 'web') {
    +	$currentstring = &Apache::lonxml::endredirection();    
    +    } 
    +    return '';
    +}
    +
    +
     sub image_replication {
         my $src = shift;
         if (not -e $src) {
    @@ -3083,5 +3153,23 @@ sub image_replication {
         return '';
     }
     
    +sub recalc {
    +    my $argument = shift;
    +    if (not $argument=~/(mm|cm|in|pc|pt)/) {return $argument.' mm';}
    +    $argument=~/\s*(\d+\.?\d*)\s*(mm|cm|in|pc|pt)/;
    +    my $value=$1;
    +    my $units=$2;
    +    if ($units eq 'cm') {
    +	$value*=10;
    +    } elsif ($units eq 'in') {
    +	$value*=25.4;
    +    } elsif ($units eq 'pc') {
    +	$value*=(25.4*12/72.27);
    +    } elsif ($units eq 'pt') {
    +	$value*=(25.4/72.27);
    +    }
    +    return $value.' mm';
    +}
    +
     1;
     __END__