--- loncom/xml/londefdef.pm 2009/04/11 01:12:58 1.396.2.2 +++ loncom/xml/londefdef.pm 2009/05/28 17:08:43 1.409 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Tags Default Definition Module # -# $Id: londefdef.pm,v 1.396.2.2 2009/04/11 01:12:58 raeburn Exp $ +# $Id: londefdef.pm,v 1.409 2009/05/28 17:08:43 bisitz Exp $ # # # Copyright Michigan State University Board of Trustees @@ -42,6 +42,7 @@ package Apache::londefdef; use Apache::lonnet; use strict; use Apache::lonxml; +use Apache::lontable; use Apache::File(); use Image::Magick; use Apache::lonmenu(); @@ -58,20 +59,7 @@ 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 { $Apache::londefdef::TD_redirection=0; @Apache::londefdef::table = (); @@ -188,34 +176,8 @@ sub start_html { if ($target eq 'web' || $target eq 'edit' || $target eq 'webgrade' ) { # start_body() takes care of emitting the } elsif ($target eq 'tex') { - $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{calc}'. - '\usepackage{amsmath}'. - '\usepackage{amssymb}'. - '\usepackage{amsfonts}'. - '\usepackage{amsthm}'; - $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}}'; + $currentstring .= &latex_header(); } return $currentstring; } @@ -576,36 +538,60 @@ sub start_body { my $extra_head = &generate_css_links(); + # Breadcrumbs + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb({ + 'text' => 'Construction Space', + 'href' => &Apache::loncommon::authorspace(), + }); + &Apache::lonhtmlcommon::add_breadcrumb({ + 'text' => 'HTML Editor', + 'href' => '', + }); + $currentstring = &Apache::loncommon::start_page($Apache::londefdef::title, $Apache::londefdef::head .$extra_head, {'add_entries' => $token->[2], - 'no_title' => 1, +# 'no_title' => 1, 'force_register' => 1}); - if ($env{'request.state'} ne 'published') { - $currentstring.=&Apache::lonmenu::constspaceform(); - $currentstring.=&Apache::londefdef::edit_controls(); - } - $currentstring.=&Apache::lonxml::message_location(); + $currentstring .= &Apache::lonhtmlcommon::breadcrumbs(); + + my $header = ''; + if ($env{'request.state'} ne 'published') { + $header=&Apache::lonmenu::constspaceform() + .&Apache::londefdef::edit_controls(); + } + $currentstring.=&Apache::loncommon::head_subbox( + &Apache::loncommon::CSTR_pageheader() + .$header); + $currentstring.=&Apache::lonxml::message_location(); } elsif ($target eq 'tex') { - $currentstring = '\begin{document}'; - } + $currentstring = ''; # '\begin{document}' is in header. + } + return $currentstring; } sub edit_controls { + my ($nochgview) = @_; my $result .= '
-
+
'; + unless ($nochgview) { + $result .= '
'. &Apache::lonxml::renderingoptions().' +
'; + } + $result .= ' +
-
-
'; +'; return $result; } @@ -1382,10 +1368,6 @@ sub start_font { my $currentstring = ''; if ($target eq 'web' || $target eq 'webgrade') { my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval); - if ($face!~/symbol/i) { - 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); @@ -2031,7 +2013,8 @@ sub end_dd { # only way I could think of to allow

in # bodies # -#list of supported attributes: border,width,TeXwidth +#list of supported attributes: border,width,TeXwidth,TeXtheme +# align sub start_table { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $textwidth = ''; @@ -2040,6 +2023,59 @@ sub start_table { $currentstring .= $token->[4]; } 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, {}); $Apache::londefdef::table[-1]{'row_number'} = -1; #maximum table's width (default coincides with text line length) @@ -2114,7 +2150,7 @@ sub start_table { $Apache::londefdef::table[-1]{'content'}=[]; $Apache::londefdef::table[-1]{'align'}=[]; $currentstring.=' \keephidden{NEW TABLE ENTRY}'; - + } } return $currentstring; @@ -2126,6 +2162,20 @@ sub end_table { if ($target eq 'web' || $target eq 'webgrade') { $currentstring = $token->[2]; } 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 $inmemory = ''; my $output = ''; @@ -2541,6 +2591,7 @@ sub end_table { } &enable_para(); } + } return $currentstring; } @@ -2551,6 +2602,19 @@ sub start_tr { if ($target eq 'web' || $target eq 'webgrade') { $currentstring = $token->[4]; } 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'}++; my $alignchar=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($alignchar ne '') { @@ -2569,6 +2633,7 @@ sub start_tr { push @ {$Apache::londefdef::table[-1]{'minlen'}}, []; push @ {$Apache::londefdef::table[-1]{'maxlen'}}, []; push @ {$Apache::londefdef::table[-1]{'content'}}, []; + } } return $currentstring; } @@ -2579,6 +2644,19 @@ sub end_tr { if ($target eq 'web' || $target eq 'webgrade') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { + + # In case the user is missing a or 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) { &end_td_tex($parstack,$parser,$safeeval); } @@ -2587,7 +2665,7 @@ sub end_tr { 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'}; } - + } } @@ -2623,9 +2701,50 @@ sub tag_check { } 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 { 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); if ($alignchar eq '') { $alignchar = $Apache::londefdef::table[-1]{'rows'}[-1]; @@ -2638,11 +2757,22 @@ sub start_td_tex { $current_length=~/(\d+\.?\d*)/; push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$1; } + } &Apache::lonxml::startredirection(); return ''; } 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 $current_row = $Apache::londefdef::table[-1]{'row_number'}; my $current_column = $Apache::londefdef::table[-1]{'counter_columns'}; @@ -2807,7 +2937,7 @@ sub end_td_tex { } - + } return ''; } @@ -2856,6 +2986,24 @@ sub tagg_check { sub start_th_tex { 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); if ($alignchar eq '') { $alignchar = $Apache::londefdef::table[-1]{'rows'}[-1]; @@ -2868,12 +3016,26 @@ sub start_th_tex { $current_length=~/(\d+\.?\d*)/; push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$1; } + } + + # Accept xml until the tag. + &Apache::lonxml::startredirection(); return ''; } sub end_th_tex { 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 $data=&Apache::lonxml::endredirection(); my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); @@ -2938,6 +3100,7 @@ sub end_th_tex { #make data bold $data='\textbf{'.$data.'}'; push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data; + } return''; } @@ -3360,7 +3523,7 @@ sub start_frameset { &Apache::loncommon::start_page($Apache::londefdef::title, $Apache::londefdef::head, {'add_entries' => $token->[2], - 'no_title' => 1, +# 'no_title' => 1, 'force_register' => 1, 'frameset' => 1,}); @@ -4317,27 +4480,9 @@ sub image_replication { } 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 { my ($height_param, $width_param, $scaling, $parstack, $safeeval, $depth, $cis) = @_; @@ -4527,11 +4672,8 @@ sub 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 { my $argument = shift; if (not $argument=~/(mm|cm|in|pc|pt)/) {return $argument.' mm';} @@ -4575,19 +4717,7 @@ sub LATEX_length { 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 { my ($align, $latex_rendering, $image, $width, $height) = @_; my $currentstring; # The 1/2 wrapped image. @@ -4654,16 +4784,7 @@ sub align_latex_image { 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 { my ($tagstack, $tag) = @_; my @stack = @$tagstack; @@ -4676,5 +4797,169 @@ sub is_inside_of { } +# +# This sub provides the typical LaTeX prefix matter for tex output: +# +sub latex_header +{ + my ($mode) = @_; + my $currentstring = ''; + + $currentstring .= + "\n% &Apache::lonxml::londefdef \n" . + '\documentclass[letterpaper,twoside]{article}\raggedbottom'; + if (($env{'form.latex_type'}=~'batchmode') || + (!$env{'request.role.adv'}) || + ($mode eq 'batchmode')) {$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}' + .'\usepackage{picins}\usepackage{calc}'."\n". # From lonprintout.pm + '\usepackage[T1]{fontenc}'."\n". + '\usepackage{lmodern}'."\n". + '\usepackage[postscript]{ucs}'."\n". + '\usepackage[utf8x]{inputenc}'."\n". + '\usepackage{pifont}' . "\n"; + + 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}}'; + $currentstring .= '\begin{document}'; + + 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; __END__ 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.