Diff for /loncom/xml/londefdef.pm between versions 1.375.2.1 and 1.408

version 1.375.2.1, 2007/10/15 20:00:12 version 1.408, 2009/05/28 12:39:12
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 569  sub start_body { Line 538  sub start_body {
   
  my $extra_head = &generate_css_links();   my $extra_head = &generate_css_links();
   
       # Breadcrumbs
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       &Apache::lonhtmlcommon::add_breadcrumb({
           'text'  => 'Construction Space',
           'href'  => '', # FIXME Add link to /priv/[user]
       });
       &Apache::lonhtmlcommon::add_breadcrumb({
           'text'  => 'HTML Editor',
           'href'  => '',
       });    
   
  $currentstring =    $currentstring = 
     &Apache::loncommon::start_page($Apache::londefdef::title,      &Apache::loncommon::start_page($Apache::londefdef::title,
    $Apache::londefdef::head     $Apache::londefdef::head
       .$extra_head,        .$extra_head,
    {'add_entries'    => $token->[2],     {'add_entries'    => $token->[2],
     'no_title'       => 1,  #    'no_title'       => 1,
     'force_register' => 1});      'force_register' => 1});
   
  if ($env{'request.state'} ne 'published') {      $currentstring .= &Apache::lonhtmlcommon::breadcrumbs();
     $currentstring.=&Apache::lonmenu::constspaceform();  
     $currentstring.=(<<EDITBUTTON);          my $header = '';
 <form method="post">          if ($env{'request.state'} ne 'published') {
 <input type="submit" name="editmode" accesskey="e" value="Edit" />              $header=&Apache::lonmenu::constspaceform()
 </form>                     .&Apache::londefdef::edit_controls();
 <br />          }
 EDITBUTTON          $currentstring.=&Apache::loncommon::head_subbox(
  }                              &Apache::loncommon::CSTR_pageheader()
  $currentstring.=&Apache::lonxml::message_location();                             .$header);
           $currentstring.=&Apache::lonxml::message_location();
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring = '\begin{document}';            $currentstring = '';   #  '\begin{document}' is in header.
     }       }
   
     return $currentstring;      return $currentstring;
 }  }
   
   sub edit_controls {
       my ($nochgview) = @_;
       my $result .= '
   <form method="post">
   <div class="LC_edit_problem_header">';
       unless ($nochgview) {
           $result .= '
   <div class="LC_edit_problem_header_row1">'.
   &Apache::lonxml::renderingoptions().'
   <input type="submit" name="changeproblemmode" value="'.&mt('Change View').'" />
   </div>';
       }
       $result .= '
   <div><input type="submit" name="editmode" accesskey="e" value="'.&mt('Edit').'" /></div>
   </div>
   </form>
   ';
       return $result;
   }
   
 sub end_body {  sub end_body {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = &end_p(); # Close off unclosed <p>      my $currentstring = &end_p(); # Close off unclosed <p>
Line 1366  sub start_font { Line 1368  sub start_font {
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);   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];        $currentstring = $token->[4];     
     }  elsif ($target eq 'tex') {      }  elsif ($target eq 'tex') {
  my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);   my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
Line 1580  sub start_div { Line 1578  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 1590  sub start_div { Line 1591  sub start_div {
     $endstring      = '\end{center}';      $endstring      = '\end{center}';
     if (&is_inside_of($tagstack, "table")) {      if (&is_inside_of($tagstack, "table")) {
  $currentstring = &center_correction().$currentstring;   $currentstring = &center_correction().$currentstring;
    $endstring    .= &center_end_correction(); 
     }      }
  }   }
  elsif ($align eq 'right') {   elsif ($align eq 'right') {
Line 1630  sub start_a { Line 1632  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 1645  sub end_a { Line 1667  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 1987  sub end_dd { Line 2013  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 1995  sub start_table { Line 2022  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 2069  sub start_table { Line 2150  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 2081  sub end_table { Line 2162  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 2489  sub end_table { Line 2588  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 2500  sub start_tr { Line 2602  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 2518  sub start_tr { Line 2633  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 2528  sub end_tr { Line 2644  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 2536  sub end_tr { Line 2665  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 2572  sub tag_check { Line 2701  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 2587  sub start_td_tex { Line 2757  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 2756  sub end_td_tex { Line 2937  sub end_td_tex {
   
     }      }
   
       }
   
     return '';      return '';
 }  }
Line 2805  sub tagg_check { Line 2986  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 2817  sub start_th_tex { Line 3016  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 2887  sub end_th_tex { Line 3100  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 2988  sub start_img { Line 3202  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 3054  sub start_img { Line 3268  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 3306  sub start_frameset { Line 3523  sub start_frameset {
     &Apache::loncommon::start_page($Apache::londefdef::title,      &Apache::loncommon::start_page($Apache::londefdef::title,
    $Apache::londefdef::head,     $Apache::londefdef::head,
    {'add_entries'    => $token->[2],     {'add_entries'    => $token->[2],
     'no_title'       => 1,  #    'no_title'       => 1,
     'force_register' => 1,      'force_register' => 1,
     'frameset'       => 1,});      'frameset'       => 1,});
   
Line 4263  sub image_replication { Line 4480  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 4386  sub get_eps_image { Line 4585  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 4448  sub eps_generation { Line 4647  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 4473  sub file_path { Line 4672  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 4521  sub LATEX_length { Line 4717  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 4600  sub align_latex_image { Line 4784  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 4622  sub is_inside_of { Line 4797  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;  1;
 __END__  __END__

Removed from v.1.375.2.1  
changed lines
  Added in v.1.408


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>