version 1.379, 2007/10/15 19:40:53
|
version 1.400, 2009/04/11 01:11:02
|
Line 42 package Apache::londefdef;
|
Line 42 package Apache::londefdef;
|
use Apache::lonnet; |
use Apache::lonnet; |
use strict; |
use strict; |
use Apache::lonxml; |
use Apache::lonxml; |
|
use Apache::lontable; |
use Apache::File(); |
use Apache::File(); |
use Image::Magick; |
use Image::Magick; |
use Apache::lonmenu(); |
use Apache::lonmenu(); |
use Apache::lonmeta(); |
use Apache::lonmeta(); |
|
use Apache::lonlocal; |
use Apache::Constants qw(:common); |
use Apache::Constants qw(:common); |
use File::Basename; |
use File::Basename; |
use LONCAPA(); |
use LONCAPA(); |
Line 57 BEGIN {
|
Line 59 BEGIN {
|
|
|
} |
} |
|
|
# |
|
# Dumps all elements of the table structure. |
|
# Need this 'cause evidently when given an array, Data::Dumper only seems |
|
# to dump element 0. |
|
# |
|
#sub debug_dump_table { |
|
# my $lastrow = $#Apache::londefdef::table; |
|
# &Apache::lonnet::logthis("Dumping table: Last row index: $lastrow"); |
|
# my $row; |
|
# for ($row =0; $row <= $lastrow; $row++ ) { |
|
# my $text = Dumper($Apache::londefdef::table[$row]); |
|
# &Apache::lonnet::logthis("table [ $row ]".$text); |
|
# } |
|
#} |
|
sub initialize_londefdef { |
sub initialize_londefdef { |
$Apache::londefdef::TD_redirection=0; |
$Apache::londefdef::TD_redirection=0; |
@Apache::londefdef::table = (); |
@Apache::londefdef::table = (); |
Line 106 sub start_m {
|
Line 95 sub start_m {
|
my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval); |
my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval); |
if ($eval eq 'on') { |
if ($eval eq 'on') { |
$inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]); |
$inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]); |
#&Apache::lonxml::debug("M is evaulated to:$inside:"); |
#&Apache::lonxml::debug("M is evaluated to:$inside:"); |
} |
} |
my $tex = $inside; |
my $tex = $inside; |
my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval); |
my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval); |
$currentstring = &Apache::lontexconvert::converted(\$inside,$display); |
$currentstring = &Apache::lontexconvert::converted(\$inside,$display); |
if ($Apache::lontexconvert::errorstring) { |
if ($Apache::lontexconvert::errorstring) { |
my $errormsg='<pre>'.&HTML::Entities::encode($Apache::lontexconvert::errorstring,'<>&"').'</pre> occured while attempting to convert this TeX: <pre>'; |
my $errormsg='<pre>'.&HTML::Entities::encode($Apache::lontexconvert::errorstring,'<>&"').'</pre> occurred while attempting to convert this TeX: <pre>'; |
$tex = &HTML::Entities::encode($tex,'<>&"'); |
$tex = &HTML::Entities::encode($tex,'<>&"'); |
my ($linenumber) = |
my ($linenumber) = |
($Apache::lontexconvert::errorstring =~ /Line (\d+)/); |
($Apache::lontexconvert::errorstring =~ /Line (\d+)/); |
Line 138 sub start_m {
|
Line 127 sub start_m {
|
# detect simple math mode entry exits, and convert them |
# detect simple math mode entry exits, and convert them |
# to use \ensuremath ... unless there's a \verb inside. |
# to use \ensuremath ... unless there's a \verb inside. |
if (! ($currentstring=~/\\verb/)) { |
if (! ($currentstring=~/\\verb/)) { |
if ($currentstring=~/^\s*\$[^\$].*[^\$]\$\s*$/) { |
if ($currentstring=~/^\s*\$[^\$].*\$\s*$/) { |
$currentstring=~s/^(\s*)\$/$1/; |
$currentstring=~s/^(\s*)\$/$1/; |
$currentstring=~s/\$(\s*)$/$1/; |
$currentstring=~s/\$(\s*)$/$1/; |
$currentstring='\ensuremath{'.$currentstring.'}'; |
$currentstring='\ensuremath{'.$currentstring.'}'; |
Line 187 sub start_html {
|
Line 176 sub start_html {
|
if ($target eq 'web' || $target eq 'edit' || $target eq 'webgrade' ) { |
if ($target eq 'web' || $target eq 'edit' || $target eq 'webgrade' ) { |
# start_body() takes care of emitting the <html> |
# start_body() takes care of emitting the <html> |
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
$currentstring .= |
|
'\documentclass[letterpaper,twoside]{article}\raggedbottom'; |
$currentstring .= &latex_header(); |
if (($env{'form.latex_type'}=~'batchmode') || |
|
(!$env{'request.role.adv'})) {$currentstring .='\batchmode';} |
|
$currentstring .= '\newcommand{\keephidden}[1]{}'. |
|
'\renewcommand{\deg}{$^{\circ}$}'. |
|
'\usepackage{multirow}'. |
|
'\usepackage{longtable}'. |
|
'\usepackage{textcomp}'. |
|
'\usepackage{makeidx}'. |
|
'\usepackage[dvips]{graphicx}'. |
|
'\usepackage{wrapfig}'. |
|
'\usepackage{picins}'. |
|
'\usepackage{epsfig}'. |
|
'\usepackage{calc}'. |
|
'\usepackage{amsmath}'. |
|
'\usepackage{amssymb}'. |
|
'\usepackage{amsfonts}'. |
|
'\usepackage{amsthm}'. |
|
'\usepackage{amscd}'. |
|
'\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'. |
|
'\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large\textbf{Index}} \newline \setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}'; |
|
} |
} |
return $currentstring; |
return $currentstring; |
} |
} |
Line 589 sub start_body {
|
Line 558 sub start_body {
|
} |
} |
|
|
sub edit_controls { |
sub edit_controls { |
my $result .= (<<EDITBUTTON); |
my $result .= ' |
<form method="post"> |
<form method="post"> |
<input type="submit" name="editmode" accesskey="e" value="Edit" /> |
<div class="LC_edit_problem_header"> |
|
<div class="LC_edit_problem_header_row1">'. |
|
&Apache::lonxml::renderingoptions().' |
|
<input type="submit" name="changeproblemmode" value="'.&mt('Change View').'" /> |
|
</div> |
|
<div class="LC_edit_problem_header_edit_row"><input type="submit" name="editmode" accesskey="e" value="'.&mt('Edit').'" /></div></div> |
</form> |
</form> |
<br /> |
<br />'; |
EDITBUTTON |
|
return $result; |
return $result; |
} |
} |
|
|
Line 1585 sub start_div {
|
Line 1558 sub start_div {
|
} |
} |
if ($target eq 'tex') { |
if ($target eq 'tex') { |
# 4 possible alignments: left, right, center, and -missing-. |
# 4 possible alignments: left, right, center, and -missing-. |
|
# If inside a table row, we must let the table logic |
|
# do the alignment, however. |
|
# |
|
|
my $endstring = ''; |
my $endstring = ''; |
|
|
Line 1595 sub start_div {
|
Line 1571 sub start_div {
|
$endstring = '\end{center}'; |
$endstring = '\end{center}'; |
if (&is_inside_of($tagstack, "table")) { |
if (&is_inside_of($tagstack, "table")) { |
$currentstring = ¢er_correction().$currentstring; |
$currentstring = ¢er_correction().$currentstring; |
|
$endstring .= ¢er_end_correction(); |
} |
} |
} |
} |
elsif ($align eq 'right') { |
elsif ($align eq 'right') { |
Line 1635 sub start_a {
|
Line 1612 sub start_a {
|
my $href=&Apache::lonxml::get_param('href',$parstack,$safeeval, |
my $href=&Apache::lonxml::get_param('href',$parstack,$safeeval, |
undef,1); |
undef,1); |
$currentstring=&Apache::lonenc::encrypt_ref($token,{'href'=>$href}); |
$currentstring=&Apache::lonenc::encrypt_ref($token,{'href'=>$href}); |
|
if ($href =~ /\S/) { |
|
if ($href !~ m{^https?://}) { |
|
my $url=&Apache::lonnet::hreflocation('',$env{'request.filename'}); |
|
my $linkurl; |
|
if ($href =~ m{^/uploaded/}) { |
|
$linkurl = $href; |
|
} elsif ($href =~ m{^[^/]}) { |
|
my $path = $url; |
|
$path =~ s{[^/]*$}{}; |
|
$linkurl = $path.$href; |
|
} |
|
if ($linkurl =~ m{^/uploaded/}) { |
|
if (!&Apache::lonnet::allowed('bre',$linkurl)) { |
|
if (&Apache::lonnet::is_on_map($url)) { |
|
&Apache::lonxml::extlink($linkurl); |
|
} |
|
} |
|
} |
|
} |
|
} |
} |
} |
return $currentstring; |
return $currentstring; |
} |
} |
Line 1650 sub end_a {
|
Line 1647 sub end_a {
|
&Apache::lonxml::get_param('href',$parstack,$safeeval,undef,1); |
&Apache::lonxml::get_param('href',$parstack,$safeeval,undef,1); |
my $name = |
my $name = |
&Apache::lonxml::get_param('name',$parstack,$safeeval,undef,1); |
&Apache::lonxml::get_param('name',$parstack,$safeeval,undef,1); |
if ($href =~ /\S/) { |
my $uriprint = |
|
&Apache::lonxml::get_param('uriprint',$parstack,$safeeval,undef,1); |
|
my $anchorprint = |
|
&Apache::lonxml::get_param('anchorprint',$parstack,$safeeval,undef,1); |
|
if (($href =~ /\S/) && ($uriprint=~/^on|uriprint|yes|1$/i)) { |
$href =~ s/([^\\])%/$1\\\%/g; |
$href =~ s/([^\\])%/$1\\\%/g; |
# Substitute special symbols... and allow line breaks at each / |
# Substitute special symbols... and allow line breaks at each / |
# |
# |
$href = &Apache::lonxml::latex_special_symbols($href); |
$href = &Apache::lonxml::latex_special_symbols($href); |
$href =~ s/\//\/\\-/g; # Map / to /\- to allow hyphenation. |
$href =~ s/\//\/\\-/g; # Map / to /\- to allow hyphenation. |
$currentstring .= ' ({\tt URI:'.$href.'})'; |
$currentstring .= ' ({\tt URI:'.$href.'})'; |
} elsif ($name =~ /\S/) { |
} elsif (($name =~ /\S/) && ($anchorprint=~/^on|anchorprint|yes|1$/i)) { |
$currentstring .= ' ({\tt Anchor:'.&Apache::lonxml::latex_special_symbols($name).'})'; |
$currentstring .= ' ({\tt Anchor:'.&Apache::lonxml::latex_special_symbols($name).'})'; |
} else { |
} else { |
$currentstring.=''; |
$currentstring.=''; |
Line 1992 sub end_dd {
|
Line 1993 sub end_dd {
|
# only way I could think of to allow <p> in |
# only way I could think of to allow <p> in |
# <tr> <th> bodies |
# <tr> <th> bodies |
# |
# |
#list of supported attributes: border,width,TeXwidth |
#list of supported attributes: border,width,TeXwidth,TeXtheme |
|
# align |
sub start_table { |
sub start_table { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; |
my $textwidth = ''; |
my $textwidth = ''; |
Line 2000 sub start_table {
|
Line 2002 sub start_table {
|
if ($target eq 'web' || $target eq 'webgrade') { |
if ($target eq 'web' || $target eq 'webgrade') { |
$currentstring .= $token->[4]; |
$currentstring .= $token->[4]; |
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
|
&disable_para(); # Can't have paras in a table. |
|
|
|
|
|
# New table code: |
|
|
|
# Get the parameters that we can do something about: |
|
|
|
my $border = &Apache::lonxml::get_param('border', $parstack, $safeeval, undef, 0); |
|
my $width = &Apache::lonxml::get_param('TeXwidth', $parstack, $safeeval, undef, 0); |
|
my $theme = &Apache::lonxml::get_param('TeXtheme', $parstack, $safeeval, undef, 0); |
|
my $align = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 0); |
|
|
|
# The only thing that needs any figuring out is the width.. and then only if it is |
|
# a percent. If not it's assumed to be some valid TeX measurement unit e.g. 3.0cm |
|
# |
|
|
|
my $table = new Apache::lontable(); |
|
if ($border ne '') { |
|
$table->table_border(1); |
|
$table->cell_border(1); |
|
} |
|
if ($theme ne '') { |
|
$table->theme($theme); |
|
} |
|
if ($align ne '') { |
|
$table->alignment($align); |
|
} |
|
|
|
# Missing width is most of page width |
|
|
|
if ($width eq "") { |
|
$width = '70%'; |
|
} |
|
|
|
# If a percentage, need to calculate what this means in terms of |
|
# page width: |
|
|
|
if ($width =~ /%$/) { |
|
my $textwidth = &recalc($env{'form.textwidth'}); # Page width in mm. |
|
$width =~ s/%//; |
|
$width = $width * $textwidth / 100.0; |
|
$width .= " mm"; |
|
$table->width($width); |
|
} |
|
|
|
push(@Apache::londefdef::table, $table); |
|
$currentstring.=' \keephidden{NEW TABLE ENTRY}'; |
|
|
|
#-------------------------------------------------------- |
|
# Old table code here. |
|
#-------------------------------------------------------- |
|
|
|
|
|
if (0) { |
push(@Apache::londefdef::table, {}); |
push(@Apache::londefdef::table, {}); |
$Apache::londefdef::table[-1]{'row_number'} = -1; |
$Apache::londefdef::table[-1]{'row_number'} = -1; |
#maximum table's width (default coincides with text line length) |
#maximum table's width (default coincides with text line length) |
Line 2074 sub start_table {
|
Line 2130 sub start_table {
|
$Apache::londefdef::table[-1]{'content'}=[]; |
$Apache::londefdef::table[-1]{'content'}=[]; |
$Apache::londefdef::table[-1]{'align'}=[]; |
$Apache::londefdef::table[-1]{'align'}=[]; |
$currentstring.=' \keephidden{NEW TABLE ENTRY}'; |
$currentstring.=' \keephidden{NEW TABLE ENTRY}'; |
|
} |
|
|
} |
} |
return $currentstring; |
return $currentstring; |
Line 2086 sub end_table {
|
Line 2142 sub end_table {
|
if ($target eq 'web' || $target eq 'webgrade') { |
if ($target eq 'web' || $target eq 'webgrade') { |
$currentstring = $token->[2]; |
$currentstring = $token->[2]; |
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
|
|
|
|
|
# New table code: |
|
|
|
my $table = pop(@Apache::londefdef::table); |
|
my $t = $table->generate(); |
|
$currentstring = $t->generate_string(); |
|
&enable_para(); |
|
#-------------------------------------------------------------- |
|
# Old table code: |
|
#-------------------------------------------------------------- |
|
|
|
if (0) { |
|
|
my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval); |
my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval); |
my $inmemory = ''; |
my $inmemory = ''; |
my $output = ''; |
my $output = ''; |
my $WARNING=''; |
my $WARNING=''; |
#width of columns from TeXwidth attributes |
#width of columns from TeXwidth attributes |
|
|
|
# Protect against unbalanced </table> tag. |
|
|
|
if (scalar(@Apache::londefdef::table) > 0) { |
|
|
for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { |
for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { |
for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) { |
for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) { |
if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]<$Apache::londefdef::table[-1]{'TeXlen'}[$in][$jn]) { |
if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]<$Apache::londefdef::table[-1]{'TeXlen'}[$in][$jn]) { |
Line 2494 sub end_table {
|
Line 2568 sub end_table {
|
pop @Apache::londefdef::table; |
pop @Apache::londefdef::table; |
undef @Apache::londefdef::table; |
undef @Apache::londefdef::table; |
} |
} |
|
} |
|
&enable_para(); |
|
} |
} |
} |
return $currentstring; |
return $currentstring; |
} |
} |
Line 2505 sub start_tr {
|
Line 2582 sub start_tr {
|
if ($target eq 'web' || $target eq 'webgrade') { |
if ($target eq 'web' || $target eq 'webgrade') { |
$currentstring = $token->[4]; |
$currentstring = $token->[4]; |
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
|
|
|
my $align = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 1); |
|
$Apache::londefdef::table[-1]->start_row(); |
|
|
|
if ($align ne '') { |
|
$Apache::londefdef::table[-1]->configure_row({default_halign => $align}); |
|
} |
|
|
|
#--------------------------------------------------------------- |
|
# Old table code. |
|
#--------------------------------------------------------------- |
|
|
|
if (0) { |
$Apache::londefdef::table[-1]{'row_number'}++; |
$Apache::londefdef::table[-1]{'row_number'}++; |
my $alignchar=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); |
my $alignchar=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); |
if ($alignchar ne '') { |
if ($alignchar ne '') { |
Line 2523 sub start_tr {
|
Line 2613 sub start_tr {
|
push @ {$Apache::londefdef::table[-1]{'minlen'}}, []; |
push @ {$Apache::londefdef::table[-1]{'minlen'}}, []; |
push @ {$Apache::londefdef::table[-1]{'maxlen'}}, []; |
push @ {$Apache::londefdef::table[-1]{'maxlen'}}, []; |
push @ {$Apache::londefdef::table[-1]{'content'}}, []; |
push @ {$Apache::londefdef::table[-1]{'content'}}, []; |
|
} |
} |
} |
return $currentstring; |
return $currentstring; |
} |
} |
Line 2533 sub end_tr {
|
Line 2624 sub end_tr {
|
if ($target eq 'web' || $target eq 'webgrade') { |
if ($target eq 'web' || $target eq 'webgrade') { |
$currentstring .= $token->[2]; |
$currentstring .= $token->[2]; |
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
|
|
|
# In case the user is missing a </td> or </th> tag: |
|
|
|
if ($Apache::londefdef::TD_redirection) { |
|
&end_td_tex($parstack,$parser,$safeeval); |
|
} |
|
$Apache::londefdef::table[-1]->end_row(); |
|
|
|
#----------------------------------------------- |
|
# Old table code |
|
#----------------------------------------------- |
|
|
|
if (0) { |
if ($Apache::londefdef::TD_redirection) { |
if ($Apache::londefdef::TD_redirection) { |
&end_td_tex($parstack,$parser,$safeeval); |
&end_td_tex($parstack,$parser,$safeeval); |
} |
} |
Line 2541 sub end_tr {
|
Line 2645 sub end_tr {
|
if ($Apache::londefdef::table[-1]{'prior_columns'} > $Apache::londefdef::table[-1]{'counter_columns'}) { |
if ($Apache::londefdef::table[-1]{'prior_columns'} > $Apache::londefdef::table[-1]{'counter_columns'}) { |
$Apache::londefdef::table[-1]{'counter_columns'} = $Apache::londefdef::table[-1]{'prior_columns'}; |
$Apache::londefdef::table[-1]{'counter_columns'} = $Apache::londefdef::table[-1]{'prior_columns'}; |
} |
} |
|
} |
|
|
|
|
} |
} |
Line 2577 sub tag_check {
|
Line 2681 sub tag_check {
|
} |
} |
return ''; |
return ''; |
} |
} |
|
|
|
# |
|
# Factor out cell configuration hash generation: |
|
# |
|
|
|
sub cell_config_hash { |
|
my ($align, $rowspan, $colspan) = @_; |
|
my %config; |
|
if ($align ne '') { |
|
$config{'halign'} = $align; |
|
} |
|
if ($colspan ne "") { |
|
$config{'colspan'} = $colspan; |
|
} |
|
if ($rowspan ne '') { |
|
$config{'rowspan'} = $rowspan; |
|
} |
|
return \%config; |
|
} |
|
|
sub start_td_tex { |
sub start_td_tex { |
my ($parstack,$parser,$safeeval) = @_; |
my ($parstack,$parser,$safeeval) = @_; |
|
|
|
# At this stage, an empty cell is created with the |
|
# appropriate rowspan/colspan and alignment |
|
# attributes, but empty of text. end_td_tex will |
|
# fetch the contents from the recursive parse and |
|
# fill the cell with them: |
|
my $align = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 1); |
|
my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 1); |
|
my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 1); |
|
|
|
my $config = &cell_config_hash($align, $rowspan, $colspan); |
|
|
|
my $table = $Apache::londefdef::table[-1]; |
|
$table->add_cell('', $config); |
|
|
|
|
|
#------------------------------------------------ |
|
# Old table code. |
|
#------------------------------------------------ |
|
|
|
if (0) { |
|
|
my $alignchar = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1); |
my $alignchar = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1); |
if ($alignchar eq '') { |
if ($alignchar eq '') { |
$alignchar = $Apache::londefdef::table[-1]{'rows'}[-1]; |
$alignchar = $Apache::londefdef::table[-1]{'rows'}[-1]; |
Line 2592 sub start_td_tex {
|
Line 2737 sub start_td_tex {
|
$current_length=~/(\d+\.?\d*)/; |
$current_length=~/(\d+\.?\d*)/; |
push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$1; |
push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$1; |
} |
} |
|
} |
&Apache::lonxml::startredirection(); |
&Apache::lonxml::startredirection(); |
return ''; |
return ''; |
} |
} |
|
|
sub end_td_tex { |
sub end_td_tex { |
|
|
|
my $text = &Apache::lonxml::endredirection(); |
|
my $table = $Apache::londefdef::table[-1]; |
|
$table->append_cell_text($text); |
|
|
|
#------------------------------------------------- |
|
# Old table code |
|
#------------------------------------------------- |
|
|
|
if (0) { |
my ($parstack,$parser,$safeeval) = @_; |
my ($parstack,$parser,$safeeval) = @_; |
my $current_row = $Apache::londefdef::table[-1]{'row_number'}; |
my $current_row = $Apache::londefdef::table[-1]{'row_number'}; |
my $current_column = $Apache::londefdef::table[-1]{'counter_columns'}; |
my $current_column = $Apache::londefdef::table[-1]{'counter_columns'}; |
Line 2761 sub end_td_tex {
|
Line 2917 sub end_td_tex {
|
|
|
} |
} |
|
|
|
} |
|
|
return ''; |
return ''; |
} |
} |
Line 2810 sub tagg_check {
|
Line 2966 sub tagg_check {
|
|
|
sub start_th_tex { |
sub start_th_tex { |
my ($parstack,$parser,$safeeval) = @_; |
my ($parstack,$parser,$safeeval) = @_; |
|
|
|
my $alignment = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef,1); |
|
my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 1); |
|
my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 1); |
|
|
|
my $config = cell_config_hash($alignment, $rowspan, $colspan); |
|
my $table = $Apache::londefdef::table[-1]; |
|
$table->add_cell('\textbf{', $config); |
|
|
|
#------------------------------------------------------------------------------------- |
|
# |
|
# Old table code. |
|
# |
|
#-------------------------------------------------------------------------------------- |
|
|
|
if (0) { |
|
|
|
|
my $alignchar = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1); |
my $alignchar = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1); |
if ($alignchar eq '') { |
if ($alignchar eq '') { |
$alignchar = $Apache::londefdef::table[-1]{'rows'}[-1]; |
$alignchar = $Apache::londefdef::table[-1]{'rows'}[-1]; |
Line 2822 sub start_th_tex {
|
Line 2996 sub start_th_tex {
|
$current_length=~/(\d+\.?\d*)/; |
$current_length=~/(\d+\.?\d*)/; |
push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$1; |
push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$1; |
} |
} |
|
} |
|
|
|
# Accept xml until the </th> tag. |
|
|
&Apache::lonxml::startredirection(); |
&Apache::lonxml::startredirection(); |
return ''; |
return ''; |
} |
} |
|
|
sub end_th_tex { |
sub end_th_tex { |
my ($parstack,$parser,$safeeval) = @_; |
my ($parstack,$parser,$safeeval) = @_; |
|
|
|
my $table = $Apache::londefdef::table[-1]; |
|
my $text = &Apache::lonxml::endredirection(); |
|
$table->append_cell_text($text.'}'); |
|
|
|
#----------------------------------------------------------------------------- |
|
# Old table code: |
|
#----------------------------------------------------------------------------- |
|
|
|
if (0) { |
my $current_row = $Apache::londefdef::table[-1]{'row_number'}; |
my $current_row = $Apache::londefdef::table[-1]{'row_number'}; |
my $data=&Apache::lonxml::endredirection(); |
my $data=&Apache::lonxml::endredirection(); |
my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); |
my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); |
Line 2892 sub end_th_tex {
|
Line 3080 sub end_th_tex {
|
#make data bold |
#make data bold |
$data='\textbf{'.$data.'}'; |
$data='\textbf{'.$data.'}'; |
push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data; |
push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data; |
|
} |
return''; |
return''; |
} |
} |
|
|
Line 2993 sub start_img {
|
Line 3182 sub start_img {
|
|
|
# &Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src"); |
# &Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src"); |
|
|
#if original gif/jpg/png file exist do following: |
#if original bmp/gif/jpg/png file exist do following: |
my $origsrc=$src; |
my $origsrc=$src; |
my ($path,$file) = &get_eps_image($src); |
my ($path,$file) = &get_eps_image($src); |
# &Apache::lonnet::logthis("Image source: $src result: $path $file"); |
# &Apache::lonnet::logthis("Image source: $src result: $path $file"); |
Line 3059 sub start_img {
|
Line 3248 sub start_img {
|
my $width= &Apache::lonxml::get_param('width',$parstack,$safeeval); |
my $width= &Apache::lonxml::get_param('width',$parstack,$safeeval); |
my $height= &Apache::lonxml::get_param('height',$parstack,$safeeval); |
my $height= &Apache::lonxml::get_param('height',$parstack,$safeeval); |
|
|
|
if ($token->[2]{'src'}=~/\$/) { |
$currentstring .= '<img src="'.$src.'" alt="'.$alt.'" '; |
$currentstring.='Variable image source'; |
if ($width) { $currentstring.=' width="'.$width.'" '; } |
} else { |
if ($height) { $currentstring.=' height="'.$height.'" '; } |
$currentstring .= '<img src="'.$src.'" alt="'.$alt.'" '; |
$currentstring .= ' />'; |
if ($width) { $currentstring.=' width="'.$width.'" '; } |
|
if ($height) { $currentstring.=' height="'.$height.'" '; } |
|
$currentstring .= ' />'; |
|
} |
} elsif ($target eq 'modified') { |
} elsif ($target eq 'modified') { |
my ($osrc,$owidth,$oheight)= |
my ($osrc,$owidth,$oheight)= |
($token->[2]{'src'},$token->[2]{'width'},$token->[2]{'height'}); |
($token->[2]{'src'},$token->[2]{'width'},$token->[2]{'height'}); |
Line 4268 sub image_replication {
|
Line 4460 sub image_replication {
|
} |
} |
return ''; |
return ''; |
} |
} |
# |
|
# Get correct sizing parameter for an image given |
|
# it's initial ht. and wid. This allows sizing of |
|
# images that are generated on-the-fly (e.g. gnuplot) |
|
# as well as serving as a utility for image_size. |
|
# |
|
# Parameter: |
|
# height_param |
|
# width_param - Initial picture dimensions. |
|
# scaling - A scale factor. |
|
# parstack, - the current stack of tag attributes |
|
# from the xml parser |
|
# safeeval, - pointer to the safespace |
|
# depth, - from what level in the stack to look for attributes |
|
# (assumes -1 if unspecified) |
|
# cis - look for attrubutes case insensitively |
|
# (assumes false) |
|
# |
|
# Returns: |
|
# height, width - new dimensions. |
|
# |
|
sub resize_image { |
sub resize_image { |
my ($height_param, $width_param, $scaling, |
my ($height_param, $width_param, $scaling, |
$parstack, $safeeval, $depth, $cis) = @_; |
$parstack, $safeeval, $depth, $cis) = @_; |
Line 4391 sub get_eps_image {
|
Line 4565 sub get_eps_image {
|
&Apache::lonnet::repcopy($orig_src); # Failure is not completely fatal. |
&Apache::lonnet::repcopy($orig_src); # Failure is not completely fatal. |
} |
} |
&Apache::lonxml::debug("get_eps_image: Original image: $orig_src"); |
&Apache::lonxml::debug("get_eps_image: Original image: $orig_src"); |
my ($spath, $sname, $sext) = &fileparse($src, qr/\.(gif|png|jpg|jpeg)/i); |
my ($spath, $sname, $sext) = &fileparse($src, qr/\.(bmp|gif|png|jpg|jpeg)/i); |
$src=~s/\.(gif|png|jpg|jpeg)$/\.eps/i; |
$src=~s/\.(bmp|gif|png|jpg|jpeg)$/\.eps/i; |
$src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src); |
$src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src); |
&Apache::lonxml::debug("Filelocation gives: $src"); |
&Apache::lonxml::debug("Filelocation gives: $src"); |
if (! -e $src) { |
if (! -e $src) { |
Line 4453 sub eps_generation {
|
Line 4627 sub eps_generation {
|
my $temp_file = Apache::File->new('>>'.$filename); |
my $temp_file = Apache::File->new('>>'.$filename); |
print $temp_file "$src\n"; |
print $temp_file "$src\n"; |
my $newsrc = $src; |
my $newsrc = $src; |
$newsrc =~ s/(\.gif|\.jpg|\.jpeg)$/\.eps/i; |
$newsrc =~ s/(\.bmp|\.gif|\.jpg|\.jpeg)$/\.eps/i; |
$newsrc=~s{/home/httpd/html/res}{}; |
$newsrc=~s{/home/httpd/html/res}{}; |
$newsrc=~s{/home/($LONCAPA::username_re)/public_html/}{/$1/}; |
$newsrc=~s{/home/($LONCAPA::username_re)/public_html/}{/$1/}; |
$newsrc=~s{/\./}{/}; |
$newsrc=~s{/\./}{/}; |
Line 4478 sub file_path {
|
Line 4652 sub file_path {
|
} |
} |
return $file,$path; |
return $file,$path; |
} |
} |
# Converts a measurement in to mm from any of |
|
# the other valid LaTeX units of measure. |
|
# If the units of measure are missing from the |
|
# parameter, it is assumed to be in and returned |
|
# with mm units of measure |
|
sub recalc { |
sub recalc { |
my $argument = shift; |
my $argument = shift; |
if (not $argument=~/(mm|cm|in|pc|pt)/) {return $argument.' mm';} |
if (not $argument=~/(mm|cm|in|pc|pt)/) {return $argument.' mm';} |
Line 4526 sub LATEX_length {
|
Line 4697 sub LATEX_length {
|
return $value; |
return $value; |
} |
} |
|
|
# Wrap image 'stuff' inside of the LaTeX required to implement |
|
# alignment: |
|
# align_tex_image(align, latex_rendering, image) |
|
# Where: |
|
# align - The HTML alignment specification. |
|
# latex_rendering - rendering hint for latex. |
|
# image - The LaTeX needed to insert the image itsef. |
|
# width,height - dimensions of the image. |
|
# Returns: |
|
# The 1/2 wrapped image and the stuff required to close the |
|
# wrappage. This allows e.g. randomlabel to insert more stuff |
|
# into the closure. |
|
# |
|
sub align_latex_image { |
sub align_latex_image { |
my ($align, $latex_rendering, $image, $width, $height) = @_; |
my ($align, $latex_rendering, $image, $width, $height) = @_; |
my $currentstring; # The 1/2 wrapped image. |
my $currentstring; # The 1/2 wrapped image. |
Line 4605 sub align_latex_image {
|
Line 4764 sub align_latex_image {
|
return ($currentstring, $closure); |
return ($currentstring, $closure); |
} |
} |
|
|
# is_inside_of $tagstack $tag |
|
# This sub returns true if the current state of Xml processing |
|
# is inside of the tag. |
|
# Parameters: |
|
# tagstack - The tagstack from the parser. |
|
# tag - The tag (without the <>'s.). |
|
# Sample usage: |
|
# if (is_inside_of($tagstack "table")) { |
|
# # I'm in a table.... |
|
# } |
|
sub is_inside_of { |
sub is_inside_of { |
my ($tagstack, $tag) = @_; |
my ($tagstack, $tag) = @_; |
my @stack = @$tagstack; |
my @stack = @$tagstack; |
Line 4627 sub is_inside_of {
|
Line 4777 sub is_inside_of {
|
} |
} |
|
|
|
|
|
# |
|
# This sub provides the typical LaTeX prefix matter for tex output: |
|
# |
|
sub latex_header |
|
{ |
|
my $currentstring = ''; |
|
|
|
$currentstring .= |
|
'\documentclass[letterpaper,twoside]{article}\raggedbottom'; |
|
if (($env{'form.latex_type'}=~'batchmode') || |
|
(!$env{'request.role.adv'})) {$currentstring .='\batchmode';} |
|
$currentstring .= '\newcommand{\keephidden}[1]{}'. |
|
'\renewcommand{\deg}{$^{\circ}$}'. |
|
'\usepackage{multirow}'. |
|
'\usepackage{longtable}'. |
|
'\usepackage{textcomp}'. |
|
'\usepackage{makeidx}'. |
|
'\usepackage[dvips]{graphicx}'. |
|
'\usepackage{wrapfig}'. |
|
'\usepackage{picins}'. |
|
'\usepackage[T1]{fontenc}'."\n". |
|
'\usepackage{lmodern}'."\n". |
|
'\usepackage[postscript]{ucs}'."\n". |
|
'\usepackage[utf8x]{inputenc}'."\n". |
|
'\usepackage{pifont}' ."\n". |
|
'\usepackage{latexsym}'."\n". |
|
'\usepackage{epsfig}'. |
|
"\\usepackage{xtab}\n". |
|
"\\usepackage{tabularx}\n". |
|
"\\usepackage{booktabs}\n". |
|
"\\usepackage{array}\n". |
|
"\\usepackage{colortbl}\n". |
|
"\\usepackage{xcolor}\n". |
|
'\usepackage{calc}'. |
|
'\usepackage{amsmath}'. |
|
'\usepackage{amssymb}'. |
|
'\usepackage{amsfonts}'. |
|
'\usepackage{amsthm}'. |
|
'\usepackage{amscd}'; |
|
|
|
if($env{'form.pdfFormFields'} eq 'yes') { |
|
$currentstring .= '\usepackage{hyperref}'. |
|
'\usepackage{eforms}'. |
|
'\usepackage{tabularx}'; |
|
} |
|
|
|
$currentstring .= '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'. |
|
'\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large\textbf{Index}} \newline \setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}'; |
|
|
|
return $currentstring; |
|
|
|
} |
|
|
|
=pod |
|
|
|
=head1 NAME |
|
|
|
Apache::londefdef.pm |
|
|
|
=head1 SYNOPSIS |
|
|
|
Tags Default Definition Module |
|
|
|
This is part of the LearningOnline Network with CAPA project |
|
described at http://www.lon-capa.org. |
|
|
|
|
|
=head1 NOTABLE SUBROUTINES |
|
|
|
=over |
|
|
|
=item start_hideweboutput() |
|
|
|
=item end_hideweboutput() |
|
|
|
=item image_replication() |
|
|
|
=item resize_image() |
|
|
|
Get correct sizing parameter for an image given |
|
it's initial ht. and wid. This allows sizing of |
|
images that are generated on-the-fly (e.g. gnuplot) |
|
as well as serving as a utility for image_size. |
|
|
|
Parameter: |
|
height_param |
|
width_param - Initial picture dimensions. |
|
scaling - A scale factor. |
|
parstack, - the current stack of tag attributes |
|
from the xml parser |
|
safeeval, - pointer to the safespace |
|
depth, - from what level in the stack to look for attributes |
|
(assumes -1 if unspecified) |
|
cis - look for attrubutes case insensitively |
|
(assumes false) |
|
|
|
Returns: |
|
height, width - new dimensions. |
|
|
|
=item image_size() |
|
|
|
=item image_width() |
|
|
|
=item image_height() |
|
|
|
=item get_eps_image() |
|
|
|
=item eps_generation() |
|
|
|
=item file_path() |
|
|
|
=item recalc() |
|
|
|
Converts a measurement in to mm from any of |
|
the other valid LaTeX units of measure. |
|
If the units of measure are missing from the |
|
parameter, it is assumed to be in and returned |
|
with mm units of measure |
|
|
|
=item LATEX_length() |
|
|
|
=item align_latex_image() |
|
|
|
Wrap image 'stuff' inside of the LaTeX required to implement |
|
alignment: |
|
align_tex_image(align, latex_rendering, image) |
|
Where: |
|
align - The HTML alignment specification. |
|
latex_rendering - rendering hint for latex. |
|
image - The LaTeX needed to insert the image itsef. |
|
width,height - dimensions of the image. |
|
Returns: |
|
The 1/2 wrapped image and the stuff required to close the |
|
wrappage. This allows e.g. randomlabel to insert more stuff |
|
into the closure. |
|
|
|
|
|
=item is_inside_of($tagstack, $tag) |
|
This sub returns true if the current state of Xml processing is inside of the tag. |
|
Parameters: |
|
tagstack - The tagstack from the parser. |
|
tag - The tag (without the <>'s.). |
|
Sample usage: |
|
if (is_inside_of($tagstack "table")) { |
|
I'm in a table.... |
|
} |
|
|
|
|
|
|
|
=back |
|
|
|
=cut |
|
|
|
|
1; |
1; |
__END__ |
__END__ |