Diff for /loncom/xml/londefdef.pm between versions 1.403.4.4 and 1.462

version 1.403.4.4, 2010/11/18 18:07:02 version 1.462, 2016/08/13 19:39:40
Line 43  use Apache::lonnet; Line 43  use Apache::lonnet;
 use strict;  use strict;
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::lontable;  use Apache::lontable;
 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::lonlocal;
   use Apache::loncommon();
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use File::Basename;  use File::Basename;
 use LONCAPA();  use LONCAPA();
Line 55  use LONCAPA(); Line 55  use LONCAPA();
   
 BEGIN {  BEGIN {
   
     &Apache::lonxml::register('Apache::londefdef',('a','abbr','acronym','accessrule','address','allow','applet','area','b','base','basefont','bgo','bgsound','big','blink','blockquote','blankspace','body','br','button','caption','center','cite','code','col','colgroup','dd','del','dfn','dir','div','dl','dt','em','embed','externallink','fieldset','font','form','frame','frameset','h1','h2','h3','h4','h5','h6','head','hr','html','i','iframe','img','input','ins','insert','isindex','kbd','keygen','label','layer','legend','li','link','m','map','marquee','menu','meta','multicol','nobr','noembed','noframes','nolayer','noscript','object','ol','optgroup','option','output','p','param','pre','q','s','samp','select','server','small','spacer','span','strike','strong','sub','sup','table','tbody','td','textarea','tfoot','th','thead','title','tr','tt','tthoption','u','ul','var','wbr','hideweboutput'));      &Apache::lonxml::register('Apache::londefdef',('a','abbr','acronym','accessrule','address','allow','applet','area','b','base','basefont','bgo','bgsound','big','blink','blockquote','blankspace','body','br','button','caption','center','cite','code','col','colgroup','dd','del','dfn','dir','div','dl','dt','em','embed','externallink','fieldset','font','form','frame','frameset','h1','h2','h3','h4','h5','h6','head','hr','html','i','iframe','img','input','ins','insert','isindex','kbd','keygen','label','layer','legend','li','link','m','map','marquee','menu','meta','multicol','nobr','noembed','noframes','nolayer','noscript','object','ol','optgroup','option','output','p','param','pre','q','s','samp','select','server','small','spacer','span','strike','strong','style','sub','sup','table','tbody','td','textarea','tfoot','th','thead','title','tr','tt','tthoption','u','ul','var','wbr','hideweboutput'));
   
 }  }
   
Line 92  sub start_m { Line 92  sub start_m {
     my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser);      my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser);
     if ($target eq 'web' || $target eq 'analyze') {      if ($target eq 'web' || $target eq 'analyze') {
  &Apache::lonxml::debug("M is starting with:$inside:");   &Apache::lonxml::debug("M is starting with:$inside:");
           if (!($inside =~ /^\s*\$.*\$\s*$/ || $inside =~ /^\s*\\[([].*\\[)\]]\s*$/)) {
               # Non-math LaTeX will not be rendered correctly with MathJax
               # and it should be avoided anyway.
               # On top of that, MathJax will render math without $, but
               # it will fail with tth. This is worth a warning.
               # (even though some people might just use latex for printing)
               &Apache::lonxml::warning(&mt("Missing \$ in <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]);
Line 383  sub start_meta { Line 391  sub start_meta {
  } else {   } else {
     $currentstring = $token->[4];      $currentstring = $token->[4];
  }   }
           if ($env{'form.grade_imsexport'}) {
               $currentstring = '';
           }
     } elsif ($target eq 'meta') {      } elsif ($target eq 'meta') {
  unless (&Apache::lonxml::get_param   unless (&Apache::lonxml::get_param
  ('http-equiv',$parstack,$safeeval,undef,1)) {   ('http-equiv',$parstack,$safeeval,undef,1)) {
Line 455  sub insert_meta { Line 466  sub insert_meta {
     <meta />';      <meta />';
 }  }
   
   #-- <start> tag
   sub start_style {
    my ($target, $token, $tagstack, $parstack, $parser, $safeeval, $style) = @_;
    my $currentstring = '';
   
    if ($target eq 'tex') {
    Apache::lonxml::startredirection();
    } else {
    $currentstring = $token->[4];
    }
   
    return $currentstring;
   }
   
   sub end_style {
    my ($target, $token, $tagstack, $parstack, $parser, $safeeval) = @_;
    my $currentstring = '';
   
    if ($target eq 'tex') {
    Apache::lonxml::endredirection();
    } else {
    $currentstring = $token->[2];
    }
    return $currentstring;
   }
   
 # accessrule  # accessrule
 sub start_accessrule {  sub start_accessrule {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
Line 538  sub start_body { Line 575  sub start_body {
   
  my $extra_head = &generate_css_links();   my $extra_head = &generate_css_links();
   
       # Breadcrumbs
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       if ($env{'request.state'} eq 'construct') {
           my $url=&Apache::lonnet::hreflocation('',$env{'request.filename'});
           &Apache::lonhtmlcommon::add_breadcrumb({
               'text'  => 'Authoring Space',
               'href'  => &Apache::loncommon::authorspace($url),
           });
           &Apache::lonhtmlcommon::add_breadcrumb({
               'text'  => 'HTML Editor',
               'href'  => '',
           });
           # breadcrumbs (and tools) will be created 
           # in start_page->bodytag->innerregister
       } else {
           # FIXME Where are we?
       }
   
           my $args = {'add_entries'    => $token->[2],
                       'force_register' => 1,};
           if ($target eq 'web') {
               $args->{'print_suppress'} = 1;
               if ($env{'request.use_absolute'}) {
                   $args->{'use_absolute'} = $env{'request.use_absolute'};
               }
           }
  $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,$args);
    {'add_entries'    => $token->[2],          my $header = '';
     'no_title'       => 1,          if ($env{'request.state'} ne 'published' &&
     'force_register' => 1});              $env{'request.state'} ne 'construct') {
               $header=&Apache::lonmenu::constspaceform();
  if ($env{'request.state'} ne 'published') {          }
     $currentstring.=&Apache::lonmenu::constspaceform();          if ($env{'request.state'} ne 'published') {
     $currentstring.=&Apache::londefdef::edit_controls();              unless ($env{'form.inhibitmenu'} eq 'yes') {
  }                  $header.=&edit_controls();
  $currentstring.=&Apache::lonxml::message_location();              }
           }
           if ($env{'request.state'} eq 'construct') {
               unless ($env{'form.inhibitmenu'} eq 'yes') {
                   $currentstring.=&Apache::loncommon::head_subbox(
                                       &Apache::loncommon::CSTR_pageheader()
                                      .$header);
               }
           } elsif ($env{'request.state'} eq 'edit') {
               $currentstring.=&Apache::loncommon::head_subbox($header);
           }
           $currentstring.=&Apache::lonxml::message_location();
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring = '';   #  '\begin{document}' is in header.          $currentstring = '';   #  '\begin{document}' is in header.
     }       }
   
     return $currentstring;      return $currentstring;
 }  }
   
 sub edit_controls {  sub edit_controls {
     my ($nochgview) = @_;      my ($nochgview) = @_;
     my $result .= '      my $result .= '
 <form method="post">  <form method="post" action="">
 <div class="LC_edit_problem_header">';  <div class="LC_edit_problem_header">';
     unless ($nochgview) {      unless ($nochgview) {
         $result .= '          $result .= '
Line 570  sub edit_controls { Line 645  sub edit_controls {
 </div>';  </div>';
     }      }
     $result .= '      $result .= '
 <div class="LC_edit_problem_header_edit_row"><input type="submit" name="editmode" accesskey="e" value="'.&mt('Edit').'" /></div></div>  <div><input type="submit" name="editmode" accesskey="e" value="'.&mt('Edit').'" />';
       if ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9) {
           my $uri = $env{'request.uri'};
           my $daxeurl = '/daxepage'.$uri;
           $result .= '<input type="button" value="'.&mt('Edit with Daxe').'" '.
                     'onclick="window.open(\''.$daxeurl.'\',\'_blank\');" />';
       }
       if (($env{'request.course.id'}) && ($env{'form.forceedit'})) {
           my $url=&Apache::lonnet::hreflocation('',$env{'request.filename'});
           if ($url =~ /\.html?$/i) {
               my ($cdom,$cnum);
               if ($env{'request.course.id'}) {
                   $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   if ($env{'request.filename'} =~ m{/userfiles/supplemental/default|\d+/}) {
                       if (&Apache::lonnet::is_course_upload($env{'request.filename'},
                                                             $cnum,$cdom)) {
                           &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                                                   ['folderpath','title']);
                       }
                   }
               }
               my ($symb,$itemtitle,$displayfile,$caller);
               if ($url =~ m{^/uploaded/$cdom/$cnum/portfolio/syllabus/}) {
                   $itemtitle = &mt('Syllabus');
                   $caller = "/public/$cdom/$cnum/syllabus";
               } else {
                   $caller = $url;
                   ($symb,$itemtitle,$displayfile) =
                       &Apache::lonxml::get_courseupload_hierarchy($url,
                                                                   $env{'form.folderpath'},
                                                                   $env{'form.title'});
               }
               if (($symb ne '') || ($env{'httpref.'.$url} ne '') ||
                   ($url =~ m{^/uploaded/$cdom/$cnum/portfolio/syllabus/})) {
                     $result .= ('&nbsp;' x 3).
                                &Apache::lonhtmlcommon::dependencies_button()."\n".
                                &Apache::lonhtmlcommon::dependencycheck_js($symb,
                                    $itemtitle,$url,$env{'form.folderpath'},$caller)."\n";
               }
           }
       }
       $result .= '</div>
   </div>
 </form>  </form>
 <br />';  ';
     return $result;      return $result;
 }  }
   
Line 1349  sub start_font { Line 1467  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 1632  sub start_a { Line 1746  sub start_a {
                     if (!&Apache::lonnet::allowed('bre',$linkurl)) {                      if (!&Apache::lonnet::allowed('bre',$linkurl)) {
                         if (&Apache::lonnet::is_on_map($url)) {                          if (&Apache::lonnet::is_on_map($url)) {
                             &Apache::lonxml::extlink($linkurl);                              &Apache::lonxml::extlink($linkurl);
                           } elsif ($env{'request.course.id'}) {
                               my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                               my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                               if ($linkurl =~ m{^([^/]|/uploaded/$cdom/$cnum/(docs|supplemental)/)}) {
                                   my $cleanhref = &clean_docs_httpref($linkurl,$url,$cdom,$cnum);
                                   if ($cleanhref) {
                                       &Apache::lonxml::extlink($cleanhref);
                                   }
                               }
                         }                          }
                     }                      }
                 }                  }
Line 1954  sub end_dt { Line 2077  sub end_dt {
   
 sub item_cleanup {  sub item_cleanup {
     my $item=&Apache::lonxml::endredirection();      my $item=&Apache::lonxml::endredirection();
     $item=~s/\\begin{center}//g;      $item=~s/\\begin\{center}//g;
     $item=~s/\\end{center}//g;      $item=~s/\\end\{center}//g;
     return $item;      return $item;
 }  }
   
Line 2009  sub start_table { Line 2132  sub start_table {
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  &disable_para(); # Can't have paras in a table.   &disable_para(); # Can't have paras in a table.
   
   
  #  New table code:  
   
  #  Get the parameters that we can do something about:   #  Get the parameters that we can do something about:
   
  my $border = &Apache::lonxml::get_param('border', $parstack, $safeeval, undef, 0);   my $border = &Apache::lonxml::get_param('border', $parstack, $safeeval, undef, 0);
  my $width  = &Apache::lonxml::get_param('TeXwidth', $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 $theme  = &Apache::lonxml::get_param('TeXtheme', $parstack, $safeeval, undef, 0);
  my $align  = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 0);   my $align  = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 0);
         my $cell_border = &Apache::lonxml::get_param('rules', $parstack, $safeeval, undef, 0);   my $cell_border = &Apache::lonxml::get_param('rules', $parstack, $safeeval, undef, 0);
   
  # The only thing that needs any figuring out is the width.. and then only if it is   # 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   # a percent. If not it's assumed to be some valid TeX measurement unit e.g. 3.0cm
  #   #
   
  my $table = new Apache::lontable();   my $table = new Apache::lontable();
         if ((defined $border) && ($border > 0)) {   if ((defined $border) && ($border > 0)) {
         #    &Apache::lonnet::logthis("Turning on table borders: $border");   #    &Apache::lonnet::logthis("Turning on table borders: $border");
             $table->table_border(1);      $table->table_border(1);
             if ($cell_border ne 'none') {      if (!defined $cell_border) {
                 $table->cell_border(1); # html specs that border turns on both...unless rules='none'.   $table->cell_border(1); # Default for rules is all if rules not defined.
             }      }
         }   }
         # Only all or nothing for cell borders for now:  
   
         if ((defined $cell_border) && ($cell_border ne 'none')) {   if ((defined $cell_border)) {
         #    &Apache::lonnet::logthis("Turning on cell borders: $cell_border");      if ($cell_border eq 'all') {
             $table->cell_border(1);   $table->cell_border(1);
         }      } elsif ($cell_border eq 'rows') {
    $table->cell_border(2);
       } elsif ($cell_border eq 'cols') {
    $table->cell_border(3);
       } elsif($cell_border eq 'groups') {
    $table->cell_border(4);
       } else {
    $table->cell_border(0);
       }
    }
  if (defined $theme) {   if (defined $theme) {
     $table->theme($theme);      $table->theme($theme);
  }   }
Line 2065  sub start_table { Line 2193  sub start_table {
  push(@Apache::londefdef::table, $table);   push(@Apache::londefdef::table, $table);
         $currentstring.=' \keephidden{NEW TABLE ENTRY}';          $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)  
  if ($#Apache::londefdef::table==0) {  
     $textwidth=&recalc($env{'form.textwidth'}); #result is always in mm  
     $textwidth=~/(\d+\.?\d*)/;  
     $textwidth=0.85*$1; #accounts "internal" LaTeX space for table frame  
  } else {  
     if ($Apache::londefdef::table[-2]{'TeXlen'}[$Apache::londefdef::table[-2]{'row_number'}][$Apache::londefdef::table[-2]{'counter_columns'}]=~/\d/) {  
  #the maximum width of nested table is determined by LATeX width of parent cell  
  $textwidth=$Apache::londefdef::table[-2]{'TeXlen'}[$Apache::londefdef::table[-2]{'row_number'}][$Apache::londefdef::table[-2]{'counter_columns'}];   
     } else {  
               #try to use all space not used before (minus 5% for LaTeX table internal) - rather silly  
  $textwidth=$Apache::londefdef::table[-2]{'width'};  
  for (my $i=0;$i<$Apache::londefdef::table[-2]{'counter_columns'};$i++) {  
     $textwidth=$textwidth-$Apache::londefdef::table[-2]{'TeXlen'}[0][$i];  
  }  
     }  
  }  
   
  # width either comes forced from the TeXwidth or the width parameters.  
  # in either case it can be a percentage or absolute width.  
  # in the width case we ignore absolute width   
  my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);  
  if (!defined($TeXwidth)) {  
     my $htmlwidth = &Apache::lonxml::get_param('width',$parstack,  
        $safeeval,undef,1);  
     if ($htmlwidth =~ /%/) {  
  $TeXwidth = $htmlwidth;  
     } else {   
  $TeXwidth = $textwidth;  
     }  
  }  
  # if the width is specified as a % it is converted to an absolute width.  
  # otherwise.. just plugged right in the hash  
   
  if ($TeXwidth=~/%/) {  
     $TeXwidth=~/(\d+)/;  
             $Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;  
  } else {  
     $Apache::londefdef::table[-1]{'width'}=$TeXwidth;  
  }  
         #  In the end, however the table width cannot be wider than $textwidth...  
   
  if ($Apache::londefdef::table[-1]{'width'} > $textwidth) {  
     $Apache::londefdef::table[-1]{'width'} = $textwidth;  
  }  
         #table's border  
  my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval);   
         my $permission=&Apache::lonxml::get_param('TeXDropEmptyColumns',$parstack,$safeeval,undef,0);  
  unless (defined $border) { $border = 0; }  
  if ($border) {   
     $Apache::londefdef::table[-1]{'hinc'} = '\hline ';   
     $Apache::londefdef::table[-1]{'vinc'} = '&';   
     $Apache::londefdef::table[-1]{'vvinc'} = '|';  
  } else {  
     $Apache::londefdef::table[-1]{'hinc'} = '';   
     $Apache::londefdef::table[-1]{'vinc'} = '&';   
     $Apache::londefdef::table[-1]{'vvinc'} = '';  
  }  
  if ($#Apache::londefdef::table==0) {  
     #    Note that \newline seems to destroy the alignment envs.  
     # $Apache::londefdef::table[-1]{'output'}='\strut\newline\strut\setlength{\tabcolsep}{1 mm}';  
     $Apache::londefdef::table[-1]{'output'}='\strut'.'\\\\'."\n".'\strut\setlength{\tabcolsep}{1 mm}';  
  }  
  $Apache::londefdef::table[-1]{'output'}.=' \noindent \begin{tabular} ';  
         $Apache::londefdef::table[-1]{'TeXlen'}=[];  
         $Apache::londefdef::table[-1]{'objectlen'}=[];  
         $Apache::londefdef::table[-1]{'objectsignal'}=[];  
         $Apache::londefdef::table[-1]{'maxlen'}=[];  
         $Apache::londefdef::table[-1]{'minlen'}=[];  
         $Apache::londefdef::table[-1]{'content'}=[];  
         $Apache::londefdef::table[-1]{'align'}=[];  
         $currentstring.=' \keephidden{NEW TABLE ENTRY}';  
     }  
   
     }      }
     return $currentstring;      return $currentstring;
 }  }
Line 2157  sub end_table { Line 2203  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 $table = pop(@Apache::londefdef::table);
  my $t     = $table->generate();   my $t     = $table->generate();
    # &Apache::lonnet::logthis("Generating string");
  $currentstring = $t->generate_string();   $currentstring = $t->generate_string();
    # &Apache::lonnet::logthis("Generated: $currentstring");
  &enable_para();   &enable_para();
  #--------------------------------------------------------------  
  #  Old table code:  
  #--------------------------------------------------------------  
   
  if (0) {  
   
  my $border =  &Apache::lonxml::get_param('border',$parstack,$safeeval);  
  my $inmemory = '';  
  my $output = '';  
  my $WARNING='';  
         #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 $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]) {  
     $Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]=$Apache::londefdef::table[-1]{'TeXlen'}[$in][$jn];  
  }  
     }  
  }  
         #free space and number of empty columns  
  my ($available_space,$empty_columns)=($Apache::londefdef::table[-1]{'width'},0);  
  if ($#Apache::londefdef::table ne 0) {$available_space=0.9*$available_space;}   
  for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {  
     if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]==0) {  
  $empty_columns++;  
     } else {  
  $available_space=$available_space-$Apache::londefdef::table[-1]{'TeXlen'}[0][$jn];  
     }  
  }  
   
         #boundaries for contents columns  
  my @min_len=();#columns can not be narrower   
  my @max_len=();#maximum length of column  
  my $avg_max;  
  my $avg_min;  
  my $counter_cols = $Apache::londefdef::table[-1]{'counter_columns'};  
  for (my $jn=0;$jn<=$counter_cols; $jn++) {  
  my ($localmin,$localmax)=(0,0);  
  for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {  
     if ($localmin<$Apache::londefdef::table[-1]{'minlen'}[$in][$jn]) {  
  $localmin=$Apache::londefdef::table[-1]{'minlen'}[$in][$jn];  
     }  
     if ($localmax<$Apache::londefdef::table[-1]{'maxlen'}[$in][$jn]) {  
  $localmax=$Apache::londefdef::table[-1]{'maxlen'}[$in][$jn];  
     }  
  }  
  push @min_len, $localmin;  
  push @max_len, $localmax;  
  $avg_max = $localmax + $avg_max;  
  $avg_min = $localmin + $avg_min;  
  }  
  # Does not really matter what the average max/min are if there are no cols.  
  # and this prevents div 0 in that case.  
   
  if ($counter_cols != 0) {  
     $avg_max = $avg_max/$counter_cols;  
     $avg_min = $avg_min/$counter_cols;  
  }  
   
   
  #  I don't think the below is needed.. but just in case:  
   
  if ($avg_min > $avg_max) {  
     my $temp = $avg_min;  
     $avg_min = $avg_max;  
     $avg_max = $temp;  
  }  
   
   
  for (my $jn=0;$jn<=$counter_cols;$jn++) {  
     my $localmin=0,;  
     for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {  
  if ($localmin<$Apache::londefdef::table[-1]{'objectlen'}[$in][$jn]) {  
     $localmin=$Apache::londefdef::table[-1]{'objectlen'}[$in][$jn];  
  }  
     }  
     if ($max_len[$jn]<$localmin) {  
  $max_len[$jn]=$localmin;  
      $Apache::londefdef::table[-1]{'objectsignal'}[$jn]=1;  
     }#object size is bigger  
     if ($min_len[$jn]<$localmin) {  
  $min_len[$jn]=$localmin;  
  $Apache::londefdef::table[-1]{'objectsignal'}[$jn]=1;  
     }#object size is bigger  
     if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]!=0) {  
  $min_len[$jn]=0;  
  $max_len[$jn]=0;  
     }  
     #  Spans seem to be really bothered by max/min = 0.  So if we have one  
     #  make it an average joe max/min.  
       
     if ($max_len[$jn] == 0) {  
  $max_len[$jn] = $avg_max;  
     }  
     if ($min_len[$jn] == 0) {  
  $min_len[$jn] = $avg_min;  
     }  
   
  }  
        #final adjustment of column width  
  my @fwidth=@{$Apache::londefdef::table[-1]{'TeXlen'}[0]};#final width array  
  my @adjust=();  
         #step 1. adjustment by maximum value  
  my $space_needed=0;  
  for (my $jn=0;$jn<=$#max_len;$jn++) {  
     $space_needed=$space_needed+$max_len[$jn];  
  }  
  if ($space_needed<=$available_space) {  
   
     for (my $jn=0;$jn<=$#max_len;$jn++) {  
  if ($fwidth[$jn]==0) {  
     $fwidth[$jn]=$max_len[$jn];  
  }  
     }  
  } else {  
         #step 2. adjustment by minimum value (estimation)  
     $space_needed=0;  
     for (my $jn=0;$jn<=$#min_len;$jn++) {  
  $space_needed+=$min_len[$jn];  
     }  
     if ($space_needed>$available_space) {  
  $WARNING=' \textbf{NOT ENOUGH SPACE FOR TABLE} ';  
  for (my $jn=0;$jn<=$#max_len;$jn++) {  
     if ($fwidth[$jn]==0) {  
  $fwidth[$jn]=$min_len[$jn];  
     }  
  }  
  #check if we have objects which can be scaled  
  my $how_many_to_scale=0;  
  my @to_scale=();  
  for (my $jn=0;$jn<=$#max_len;$jn++) {  
     if ($Apache::londefdef::table[-1]{'objectsignal'}[$jn] eq '1') {  
  $how_many_to_scale++;  
  push @to_scale, $jn;  
     }  
  }  
  if ($how_many_to_scale>0) {  
     my $space_to_adjust=($space_needed-$available_space)/$how_many_to_scale;  
     foreach my $jn (@to_scale) {  
  for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {  
     $Apache::londefdef::table[-1]{'content'}[$in][$jn]=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/;  
     if ($1 ne '') {  
  my $current_length=&recalc($1);  
  $current_length=~/(\d+\.?\d*)/;  
  $current_length=$current_length-$space_to_adjust;  
  $Apache::londefdef::table[-1]{'content'}[$in][$jn]=~s/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/width=$current_length mm/;  
     }  
     $Apache::londefdef::table[-1]{'content'}[$in][$jn]=~m/\[(\d+\.?\d*)\s*mm\]/;  
     if ($1 ne '') {  
  my $current_length=$1;  
  $current_length=$current_length-$space_to_adjust;  
  $Apache::londefdef::table[-1]{'content'}[$in][$jn]=~s/\[(\d+\.?\d*)\s*mm\]/\[$current_length mm\]/;  
     }  
  }  
  $fwidth[$jn]=$fwidth[$jn]-$space_to_adjust;  
     }  
  }  
     } else {  
       #step 3. adjustment over minimal + corrections  
  my $enlarge_coef=$available_space/$space_needed;  
  my $acsessive=0;  
  for (my $jn=0;$jn<=$#min_len;$jn++) {  
     $adjust[$jn]=$min_len[$jn]*$enlarge_coef;  
     if ($adjust[$jn]>$max_len[$jn]) {  
  $fwidth[$jn]=$max_len[$jn];  
  $acsessive=$acsessive+$adjust[$jn]-$max_len[$jn];  
  $adjust[$jn]=0;  
   
     }  
  }  
  if ($acsessive>0) {  
  #we have an excess of space and can redistribute it  
     my $notempty_columns=0;  
     for (my $jn=0;$jn<=$#min_len;$jn++) {  
  if ($adjust[$jn]!=0) {  
     $notempty_columns++;  
  }  
     }  
     my $per_column=$acsessive/$notempty_columns;  
     for (my $jn=0;$jn<=$#min_len;$jn++) {  
  if ($adjust[$jn]!=0) {  
     $adjust[$jn]+=$per_column;  
     $fwidth[$jn]=$adjust[$jn];  
  }  
     }  
  } else {  
     for (my $jn=0;$jn<=$#min_len;$jn++) {  
  $fwidth[$jn]=$adjust[$jn];  
     }  
  }  
     }  
  }  
         # use all available width or specified width as if not specified,  
  # the specified width gets defaulted to the available width.  
   
  my $current=0;   
  for (my $i=0;$i<=$#fwidth;$i++) {    
     $current+=$fwidth[$i];  
  }  
  if ($current == 0) {  
             $current = $Apache::londefdef::table[-1]{'width'};  
         }  
  my $coef=$Apache::londefdef::table[-1]{'width'}/$current;  
  for (my $i=0;$i<=$#fwidth;$i++) {    
     $fwidth[$i]*=$coef;  
  }  
         #removing of empty columns if allowed  
         my $permission=&Apache::lonxml::get_param('TeXDropEmptyColumns',$parstack,$safeeval,undef,0);  
  if ($permission eq 'yes') {  
     my @cleaned_table=();  
             my @cleaned_header=();  
     my $colind=0;  
     for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {  
  if ($fwidth[$jn]!=0) {  
     #we need to copy column  
     for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {  
  $cleaned_table[$in][$colind]=$Apache::londefdef::table[-1]{'content'}[$in][$jn];  
  $cleaned_header[$colind]=$fwidth[$jn];  
     }  
     $colind++;  
  }  
     }  
     $Apache::londefdef::table[-1]{'content'}=\@cleaned_table;  
     @fwidth=@cleaned_header;  
  }  
   
   
  #construct header of the table  
  my $header_of_table = '{'.$Apache::londefdef::table[-1]{'vvinc'};  
  for (my $in=0;$in<=$#fwidth;$in++) {  
     $header_of_table.='p{'.$fwidth[$in].' mm}'.$Apache::londefdef::table[-1]{'vvinc'};  
  }  
  $header_of_table .= '}';  
   
  #fill the table  
  for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {  
     my $have_rowspan = 0;  
     for (my $jn=0;$jn<=$#fwidth;$jn++) {  
   
  #-----------------------------------------------------------  
                 #   I think this order of doing things will ensure that  
  #   single rowspan, columspan and combined row/colspans will  
                 #   work correctly.  LaTeX is delicate here.  
  #    RF.  
   
  # Start a rowspan if necessary:  
   
  my $primary_col_width = $fwidth[$jn]; # Width of primary column.  
  my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn];  
  my $colspan = $Apache::londefdef::table[-1]{'colspan'}[$in][$jn];  
  #  
  #  Do the appropriate magic if this has a colspan  
  #   
   
  my $border_char = "";  
  if ($border) {  
     $border_char = "|";  
  }  
  my $spanwidth = 0;  
  if ($colspan > 1) {  
     for (my $spancol = $jn; $spancol < $jn + $colspan; $spancol++) {  
  $spanwidth += $fwidth[$spancol];  
     }  
     $output .= '\multicolumn{'.  
  $colspan  
  ."}";  
     if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {  
  $output .= '{'.$border_char.'c'.$border_char.'}{';  
     } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {  
  $output .= '{'.$border_char.'r'.$border_char.'}{';  
     }  
     else {  
  $output .= '{'.$border_char."p{$spanwidth mm}".$border_char.'}{';  
     }  
       
  } else {  
     $spanwidth = $primary_col_width; # If no span width will be just colwidth  
  }  
   
  # Rowspan... if colspan is 1, and there's an alignment we'll need  
  # to kick in a multicolumn in order to get the alignment spec.  
  # this must precede the multirow or LaTex gets quite upset.  
  # Naturally if colspan > 1 we've already done that above ^  
  #  
  my $multirow_aligned = 0;  
  if ($rowspan > 1) {  
     if ($colspan == 1) {  
  if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {  
     $output .= '\multicolumn{1}{'.$border_char.'c'.$border_char.'}{';  
     $multirow_aligned = 1;  
  } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {  
     $output .= '\multicolumn{1}{'.$border_char.'r'.$border_char.'}{';  
     $multirow_aligned = 1;  
  }  
     }  
     $have_rowspan++;  
     if ($multirow_aligned) {  
  $output .= '\multirow{'.$rowspan.'}[0]{*}{';  
     } else {  
  $output .= '\multirow{'.$rowspan."}[0]{$spanwidth mm}{";  
     }  
       
     $Apache::londefdef::table[-1]{'content'}[$in][$jn] =~  
  s{^\s*\\par\s*}{};  
     $Apache::londefdef::table[-1]{'content'}[$in][$jn] =~  
  s{\s*\\vskip\s*0pt\s*$}{};  
     
     #  
     # If we did not throw in a multicolumn to align, then add   
     # an extra {  
     # so we close correctly without having to keep additional state  
     # around  
     #  
     if (!$multirow_aligned) {  
  $output .= '{';  
     }  
  }  
  if (($rowspan eq '^') || ($rowspan eq '_')) {  
     $have_rowspan++;  
  }  
     #--------------------------------------------------------------  
   
   
  # For right and center alignment of single cells.  
  # we are going to use a multicolumn with a span of 1 to specify alignment.  
  #  
  if ($colspan == 1  && $rowspan == 1) {  
     if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {  
  $output .= '\multicolumn{1}{'.$border_char.'c'.$border_char.'}{';  
     } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {  
  $output .= '\multicolumn{1}{'.$border_char.'r'.$border_char.'}{';  
     }  
  }  
   
  $output.=$Apache::londefdef::table[-1]{'content'}[$in][$jn];  
   
  if (($colspan == 1 && $rowspan == 1)   &&  
     (($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') ||  
      ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r'))) {  
     $output .= '}';  
  }  
   
  # Close off any open multirow:  
   
  if ($rowspan > 1) {  
     $output .= '}}';  
  }  
  #  Close off the colspan...  
  #  
  if ($colspan > 1)  {  
     $output .= '}';  
     $jn += $colspan-1; # Adjust for number of rows really left.  
  }  
                 if ($jn!=$#fwidth) {$output.=' '.$Apache::londefdef::table[-1]{'vinc'};}  
     }  
     #  If have_rowspan > 0, and borders are on, then   
     #  we need to do more than put an \hline at the bottom of row.  
     #  we need to do the appropriate \cline to ensure that  
     #  the spanned rows don't have \hlines through them.  
   
     if (($Apache::londefdef::table[-1]{'hinc'} =~ /\\hline/) && $have_rowspan) {  
  $output .= ' \\\\ ';  
  for (my $jn=0; $jn<=$#fwidth;$jn++) {  
     my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn];  
     if ($rowspan ne "^") {  
  if (($rowspan <= 1) || ($rowspan eq '_')) {  
     my $column = $jn+1;  
     $output .= '\cline{'.$column.'-'.$column.'} ';  
  }  
     }  
  }  
   
     } else {  
  $output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' ';  
     }  
  }  
  # Note that \newline destroys alignment env's produced  by e.g. <div>  
  # $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut\newline\strut ';  
  $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut'.'\\\\'."\n".'\strut ';  
  if ($#Apache::londefdef::table > 0) {      
     my $inmemory = $Apache::londefdef::table[-1]{'output'};  
     # Figure out max/and min width  by summing us and then  
     # apply that to the current column of the table we nest in  
     # if it's larger than the current width or the current width  
     # is undefined.  
     #  
     my $min_nested_width = 0;  
     my $max_nested_width = 0;  
     for (my $col = 0; $col <= $Apache::londefdef::table[-1]{'counter_columns'}; $col++) {  
  $min_nested_width +=  $min_len[$col];  
  $max_nested_width +=  $max_len[$col];  
   
     }  
     # Fudge in an extra 5 mm for borders etc:  
       
     $min_nested_width += 5;  
     $max_nested_width += 5;  
   
     my $outer_column = $Apache::londefdef::table[-2]{'counter_columns'};  
     my $outer_row    = $Apache::londefdef::table[-2]{'row_number'};  
     if ($min_nested_width > $Apache::londefdef::table[-2]{'minlen'}[$outer_row][$outer_column]) {  
  $Apache::londefdef::table[-2]{'minlen'}[$outer_row][$outer_column] = $min_nested_width;  
     }  
     if ($max_nested_width > $Apache::londefdef::table[-2]{'maxlen'}[$outer_row][$outer_column]) {  
  $Apache::londefdef::table[-2]{'maxlen'}[$outer_row][$outer_column] = $max_nested_width;  
     }  
   
     pop @Apache::londefdef::table;  
     push @{$Apache::londefdef::table[-1]{'include'}}, $inmemory;  
  } else {  
     $currentstring .= $Apache::londefdef::table[-1]{'output'};  
     pop @Apache::londefdef::table;  
     undef @Apache::londefdef::table;  
  }  
  }  
  &enable_para();  
     }  
     }      }
     return $currentstring;      return $currentstring;
 }  }
Line 2704  sub tag_check { Line 2330  sub tag_check {
 sub cell_config_hash {  sub cell_config_hash {
     my ($align, $rowspan, $colspan, $width) = @_;      my ($align, $rowspan, $colspan, $width) = @_;
     if ($rowspan ne '') {      if ($rowspan ne '') {
         $rowspan =~ s/^\s+|\s+$//g;          $rowspan =~ s/^\s+|\s+$//g; 
     }      }
     if ($colspan ne '') {      if ($colspan ne '') {
         $colspan =~ s/^\s+|\s+$//g;          $colspan =~ s/^\s+|\s+$//g;
Line 2720  sub cell_config_hash { Line 2346  sub cell_config_hash {
  $config{'rowspan'} = $rowspan;   $config{'rowspan'} = $rowspan;
     }      }
     if ($width ne '') {      if ($width ne '') {
         $config{'width'} = $width;   $config{'width'} = $width;
     }      }
     return \%config;      return \%config;
 }  }
Line 3141  sub start_img { Line 2767  sub start_img {
  my $inside = &Apache::lonxml::get_all_text("/img",$parser,$style);   my $inside = &Apache::lonxml::get_all_text("/img",$parser,$style);
  return '';   return '';
     }      }
     &Apache::lonxml::extlink($src);      unless ($src =~ m{^data\:image/gif;base64,}) {
           &Apache::lonxml::extlink($src);
       }
     my $currentstring = '';      my $currentstring = '';
     my $scaling = .3;      my $scaling = .3;
   
    # Render unto browsers that which are the browser's...     # Render unto browsers that which are the browser's...
   
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  if ($env{'browser.imagesuppress'} ne 'on') {          my $enc = ('yes' eq 
     my $enc = ('yes' eq                      lc(&Apache::lonxml::get_param('encrypturl',$parstack,
        lc(&Apache::lonxml::get_param('encrypturl',$parstack,                        $safeeval)));
      $safeeval)));          unless ($src =~ m{^data\:image/gif;base64,}) {
     $currentstring.=&Apache::lonenc::encrypt_ref($token,{'src'=>$src},              $currentstring.=&Apache::lonenc::encrypt_ref($token,{'src'=>$src},
  $enc);                              $enc);
  } else {          }
     my $alttag = &Apache::lonxml::get_param('alt',$parstack,$safeeval,  
     undef,1);  
     if (!$alttag) {  
  $alttag = &Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],  
    $src);  
     }  
     $currentstring.='[IMAGE: '.$alttag.']';  
  }  
   
  # and render unto TeX that which is LaTeX  
   
       # and render unto TeX that which is LaTeX
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  #   #
  #  The alignment will require some superstructure to be put around   #  The alignment will require some superstructure to be put around
Line 3206  sub start_img { Line 2825  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 bmp/gif/jpg/png file exist do following:   #if original bmp/gif/jpg/png/svg 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 3253  sub start_img { Line 2872  sub start_img {
         my $only = join(',',&Apache::loncommon::filecategorytypes('Pictures'));          my $only = join(',',&Apache::loncommon::filecategorytypes('Pictures'));
  $currentstring .=&Apache::edit::tag_start($target,$token);   $currentstring .=&Apache::edit::tag_start($target,$token);
  $currentstring .=&Apache::edit::text_arg('Image Url:','src',$token,70).   $currentstring .=&Apache::edit::text_arg('Image Url:','src',$token,70).
     &Apache::edit::browse('src',undef,'alt',$only).' '.                           &Apache::edit::browse_or_search('src',undef,'alt',$only,undef,1).
     &Apache::edit::search('src',undef,'alt').'<br />';                           '<br />';
  $currentstring .=&Apache::edit::text_arg('Description:','alt',$token,70).'<br />';   $currentstring .=&Apache::edit::text_arg('Description:','alt',$token,70).'<br />';
  $currentstring .=&Apache::edit::text_arg('width (pixel):','width',$token,5);   $currentstring .=&Apache::edit::text_arg('width (pixel):','width',$token,5);
  $currentstring .=&Apache::edit::text_arg('height (pixel):','height',$token,5).'<br />';   $currentstring .=&Apache::edit::text_arg('height (pixel):','height',$token,5).'<br />';
Line 3266  sub start_img { Line 2885  sub start_img {
    ['', 'none','parbox', 'parpic', 'wrapfigure'], $token, 2);     ['', 'none','parbox', 'parpic', 'wrapfigure'], $token, 2);
         my $alt=    &Apache::lonxml::get_param('alt',$parstack,$safeeval);          my $alt=    &Apache::lonxml::get_param('alt',$parstack,$safeeval);
         my $enc=    &Apache::lonxml::get_param('encrypturl',$parstack,$safeeval);          my $enc=    &Apache::lonxml::get_param('encrypturl',$parstack,$safeeval);
    
  $currentstring .=&Apache::edit::select_arg('Encrypt URL:','encrypturl',   $currentstring .=&Apache::edit::select_arg('Encrypt URL:','encrypturl',
    ['no','yes'], $token, 2);     ['no','yes'], $token, 2);
         if (($alt=~/\S/) && (lc($enc) eq 'yes')) {          if (($alt=~/\S/) && (lc($enc) eq 'yes')) {
Line 3276  sub start_img { Line 2895  sub start_img {
  my $src=    &Apache::lonxml::get_param('src',$parstack,$safeeval);   my $src=    &Apache::lonxml::get_param('src',$parstack,$safeeval);
  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);
           my $element = &Apache::edit::get_element('src'); 
           my $text;
         if ($token->[2]{'src'}=~/\$/) {          if ($token->[2]{'src'}=~/\$/) {
            $currentstring.=&mt('Variable image source');             $text = &mt('Variable image source');
         } elsif ($token->[2]{'src'}=~/\S/) {          } elsif ($token->[2]{'src'}=~/\S/) {
    $currentstring .= '<img src="'.$src.'" alt="'.$alt.'" ';     $currentstring .= '<img src="'.$src.'" alt="'.$alt.'" ';
    if ($width) { $currentstring.=' width="'.$width.'" '; }     if ($width) { $currentstring.=' width="'.$width.'" '; }
    if ($height) { $currentstring.=' height="'.$height.'" '; }     if ($height) { $currentstring.=' height="'.$height.'" '; }
    $currentstring .= ' />';     $currentstring .= ' id="previewimg_'.$element.'" />';
         } else {          } else {
            $currentstring.=&mt("No image source specified");             $text = &mt("No image source specified");
         }          }
           $currentstring .= ' <span id="showimg_'.$element.'">'.$text.'</span>';
     } 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 3354  sub start_applet { Line 2975  sub start_applet {
     &Apache::lonxml::extlink($archive);      &Apache::lonxml::extlink($archive);
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  if ($env{'browser.appletsuppress'} ne 'on') {          $currentstring = $token->[4];
     $currentstring = &Apache::lonenc::encrypt_ref($token,  
   {'code'=>$code,  
    'archive'=>$archive}  
   );  
  } else {  
     my $alttag= &Apache::lonxml::get_param('alt',$parstack,  
    $safeeval,undef,1);  
     unless ($alttag) {  
  $alttag=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],  
  $code);  
     }  
     $currentstring='[APPLET: '.$alttag.']';  
  }  
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  # Turn off some stuff we can't be inside thank you LaTeX          # Turn off some stuff we can't be inside thank you LaTeX
   
   
  my $restart_sub = 0;   my $restart_sub = 0;
  my $restart_sup = 0;   my $restart_sup = 0;
Line 3434  sub start_embed { Line 3041  sub start_embed {
     &Apache::lonxml::extlink($src);      &Apache::lonxml::extlink($src);
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  if ($env{'browser.embedsuppress'} ne 'on') {      $currentstring=&Apache::lonenc::encrypt_ref($token,{'src'=>$src}); 
     $currentstring=&Apache::lonenc::encrypt_ref($token,{'src'=>$src});  
  } else {  
     my $alttag=&Apache::lonxml::get_param  
  ('alt',$parstack,$safeeval,undef,1);  
     unless ($alttag) {  
  $alttag=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],$src);  
     }  
     $currentstring='[EMBED: '.$alttag.']';  
  }  
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
     }       } 
     return $currentstring;      return $currentstring;
Line 3453  sub end_embed { Line 3051  sub end_embed {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     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') {
     }           # ./.
       }
     return $currentstring;      return $currentstring;
 }  }
   
 #-- <param> tag (end tag forbidden)  #-- <param> tag (end tag forbidden)
 sub start_param {  sub start_param {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     if (&Apache::lonxml::get_param('name',$parstack,      my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval,
    $safeeval,undef,1)=~/^cabbase$/i) {                                            undef,1);
       if ($name =~/^cabbase$/i) {
  my $value=&Apache::lonxml::get_param('value',$parstack,   my $value=&Apache::lonxml::get_param('value',$parstack,
      $safeeval,undef,1);       $safeeval,undef,1);
  &Apache::lonxml::extlink($value);   &Apache::lonxml::extlink($value);
     }       } elsif ($name eq 'flashvars') {
             if (lc(&Apache::lonxml::get_param('type',$parstack,$safeeval,-2,1))
               eq 'application/x-shockwave-flash') {
               my $launcher =
                   &Apache::lonxml::get_param('data',$parstack,$safeeval,-2,1);
               if ($launcher) {
                   &Apache::lonxml::extlink($launcher);
               }
               my $flashvars=&Apache::lonxml::get_param('value',$parstack,
                                                        $safeeval,undef,1);
               if ($flashvars ne '') {
                   foreach my $item (split(/\&/,$flashvars)) {
                       my ($key,$value)=split(/=/,$item,2);
                       if ($key eq 'content') {
                           if ($value ne '') {
                               my ($dir) = ($launcher =~ m{(.+/)[^/]+$});
                               &Apache::lonxml::extlink($dir.$value);
                           }
                       } elsif ($key eq 'thumb') {
                           if ($value ne '') {
                               &Apache::lonxml::extlink($value);
                           }
                       }
                   }
               }
           }
       }
     my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);      my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
     &Apache::lonxml::extlink($src);      if ($src ne '') {
           &Apache::lonxml::extlink($src);
       }
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  my %toconvert;   my %toconvert;
  my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);  
  if ($src) { $toconvert{'src'}= $src; }   if ($src) { $toconvert{'src'}= $src; }
  my $name=&Apache::lonxml::get_param('name',$parstack,$safeeval,  
     undef,1);  
  if ($name=~/^cabbase$/i) {   if ($name=~/^cabbase$/i) {
     $toconvert{'value'}=&Apache::lonxml::get_param('value',$parstack,      $toconvert{'value'}=&Apache::lonxml::get_param('value',$parstack,
    $safeeval,undef,1);     $safeeval,undef,1);
Line 3534  sub start_frameset { Line 3158  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 3842  sub start_caption { Line 3466  sub start_caption {
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3850  sub end_caption { Line 3474  sub end_caption {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       } 
     return $currentstring;      return $currentstring;
 }  }
Line 3874  sub end_col { Line 3498  sub end_col {
     return $currentstring;      return $currentstring;
 }  }
   
 #-- <colgroup> tag (end tag optional)  #-- <colgroup tag (end tag optional)
 sub start_colgroup {  sub start_colgroup {
     my ($target,$token) = @_;      my ($target,$token,$tagstack, $parstack, $parser, $safeeval, $style) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
       if ($target eq 'tex') {
    # TODO: Ensure this tag is in a table:
   
    # Fetch the attributes and build the hash for the
    # call to define_colgroup.
   
    my $span    = &Apache::lonxml::get_param('span',   $parstack, $safeeval);
    my $halign  = &Apache::lonxml::get_param('halign', $parstack, $safeeval);
   
    my %colgroup_params;
    if ($span ne '') {
       $colgroup_params{'span'} = $span;
    }
    if ($halign ne '') {
       $colgroup_params{'halign'} = $halign;
    }
   
    my $table = $Apache::londefdef::table[-1];
    $table->define_colgroup(\%colgroup_params);
   
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3893  sub end_colgroup { Line 3538  sub end_colgroup {
     return $currentstring;      return $currentstring;
 }  }
   
   
 #-- <del> tag (end tag required)  #-- <del> tag (end tag required)
 sub start_del {  sub start_del {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];     
       } elsif ($target eq 'tex') {
    &disable_para();
    $currentstring .= '\st{';  
     }       } 
     return $currentstring;      return $currentstring;
 }  }
Line 3907  sub end_del { Line 3556  sub end_del {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];     
       } elsif ($target eq 'tex') {
    &enable_para();
    $currentstring = '}';
     }       } 
     return $currentstring;      return $currentstring;
 }  }
Line 3955  sub start_iframe { Line 3607  sub start_iframe {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];               my ($src,$url,$query);
     }           if ($token->[2]->{'src'}) {
               $src = $token->[2]->{'src'};
           } elsif ($token->[2]->{'SRC'}) {
               $src = $token->[2]->{'SRC'};
           }
           if ($src) {
               ($url,$query) = ($src =~ /^([^?]+)\??([^?]*)$/);
               if ($query =~ /inhibitmenu=yes/) {
                   $currentstring = $token->[4];
               } else {
                   my $inhibit;
                   if ($url =~ m{^[^/.].*\.x?html?$}) {
                       $inhibit = 1;
                   } elsif ($url =~ m{^/(uploaded|res)/.*\.x?html?$}) {
                       $inhibit = 1;
                   }
                   if ($inhibit) {
                       $currentstring = '<iframe ';
                       foreach my $attrib (@{$token->[3]}) {
                           if (lc($attrib) eq 'src') {
                               if ($query) {
                                   $query.='&amp;inhibitmenu=yes';
                               } else {
                                   $query = 'inhibitmenu=yes';
                               } 
                               $currentstring .= 'src="'.$url.'?'.$query.'" ';
                           } else {
                               $currentstring .= lc($attrib).'="'.$token->[2]->{$attrib}.'" ';
                           }
                       }
                       $currentstring =~ s/\s+$//;
                       if ($token->[4] =~ m{/>$}) {
                           $currentstring .= ' />';
                       } else {
                           $currentstring .= '>';
                       }
                   } else {
                       $currentstring = $token->[4];
                   }
               }
               if (($url !~ m{^https?://}) && ($env{'request.course.id'})) {
                   my $docuri = &Apache::lonnet::hreflocation('',$env{'request.filename'});
                   my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   if ($url =~ m{^([^/]|/uploaded/)}) {
                       my $cleanhref = &clean_docs_httpref($url,$docuri,$cdom,$cnum);
                       if ($cleanhref) {
                           &Apache::lonxml::extlink($cleanhref);
                       }
                   } elsif (($url =~ m{/res/$LONCAPA::domain_re/}) && ($docuri =~ m{^\Q/uploaded/$cdom/$cnum/docs/\E})) {
                       if (!&Apache::lonnet::allowed('bre',$url)) {
                           if (&Apache::lonnet::is_on_map($url)) {
                               &Apache::lonxml::extlink($url);
                           }
                       }
                   }
               }
           } else {
               $currentstring = $token->[4];
           }
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4367  sub start_tbody { Line 4079  sub start_tbody {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
       if ($target eq 'tex') {
    # TODO: Ensure this tag is within a table:
   
    my $table = $Apache::londefdef::table[-1];
    $table->start_body();
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4376  sub end_tbody { Line 4094  sub end_tbody {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];    
     }       } 
       if($target eq 'tex') {
    # TODO: Ensure this tag is within a table:
   
    my $table = $Apache::londefdef::table[-1];
    $table->end_body();
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4386  sub start_tfoot { Line 4110  sub start_tfoot {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
       if ($target eq 'tex') {
           # TODO: ensure this is within a table tag.
    my $table = $Apache::londefdef::table[-1];
    $table->start_foot();
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4395  sub end_tfoot { Line 4124  sub end_tfoot {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];    
     }       } 
       if ($target eq 'tex') {
    #  TODO: Ensure this is in side a table 
    my $table = $Apache::londefdef::table[-1];
    $table->end_foot();
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4405  sub start_thead { Line 4139  sub start_thead {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
       if ($target eq 'tex') {
    # Assume we're in a table... TODO: Verify that and ignore tag if not.
    my $table = $Apache::londefdef::table[-1];
    $table->start_head();
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4414  sub end_thead { Line 4153  sub end_thead {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];    
     }       } 
       if ($target eq 'tex') {
         # TODO: Verify we are in a table and ignore tag if not.
   
    my $table = $Apache::londefdef::table[-1];
    $table->end_head();
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4596  sub get_eps_image { Line 4341  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/\.(bmp|gif|png|jpg|jpeg)/i);      my ($spath, $sname, $sext) = &fileparse($src, qr/\.(bmp|gif|png|jpg|jpeg|svg)/i);
     $src=~s/\.(bmp|gif|png|jpg|jpeg)$/\.eps/i;      $src=~s/\.(bmp|gif|png|jpg|jpeg|svg)$/\.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 4616  sub get_eps_image { Line 4361  sub get_eps_image {
   
  #if replication failed try to produce eps file dynamically   #if replication failed try to produce eps file dynamically
  $src=~s/\.ps$/\.eps/;   $src=~s/\.ps$/\.eps/;
  my $temp_file;   if (open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat")) {
  open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat");      my $newsrc=$orig_src;
  my $newsrc=$orig_src;      $newsrc =~ s|(.*)/res/|/home/httpd/html/res/|;
  $newsrc =~ s|(.*)/res/|/home/httpd/html/res/|;      &Apache::lonxml::debug("queueing $newsrc for dynamic eps production.");
  &Apache::lonxml::debug("queueing $newsrc for dynamic eps production.");      print FILE ("$newsrc\n");
  print FILE ("$newsrc\n");      close(FILE);
  close(FILE);                  }
  $src=~s|/home/httpd/html/res|/home/httpd/prtspool|;   $src=~s|/home/httpd/html/res|/home/httpd/prtspool|;
  $src=~s|/home/([^/]*)/public_html/|/home/httpd/prtspool/$1/|;   $src=~s|/home/httpd/html/priv/[^/]+/([^/]*)/|/home/httpd/prtspool/$1/|;
  if ($sext ne "") { # Put the ext. back in to uniquify.   if ($sext ne "") { # Put the ext. back in to uniquify.
     $src =~ s/\.eps$/$sext.eps/;      $src =~ s/\.eps$/$sext.eps/;
  }   }
Line 4643  sub get_eps_image { Line 4388  sub get_eps_image {
  print FILE "$src\n";   print FILE "$src\n";
  close FILE;   close FILE;
  $src=~s|/home/httpd/html/res|/home/httpd/prtspool|;   $src=~s|/home/httpd/html/res|/home/httpd/prtspool|;
  $src=~s|/home/([^/]*)/public_html/|/home/httpd/prtspool/$1/|;   $src=~s|/home/httpd/html/priv/[^/]+/([^/]*)/|/home/httpd/prtspool/$1/|;
     }      }
     my ($path,$file)=($src=~m|(.*)/([^/]*)$|);      my ($path,$file)=($src=~m|(.*)/([^/]*)$|);
     $path =~ s/ /\_/g;      $path =~ s/ /\_/g;
Line 4655  sub get_eps_image { Line 4400  sub get_eps_image {
 sub eps_generation {  sub eps_generation {
     my ($src,$file,$width_param) = @_;           my ($src,$file,$width_param) = @_;     
     my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat";      my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat";
     my $temp_file = Apache::File->new('>>'.$filename);       if (open(my $tmpfile,">>$filename")) { 
     print $temp_file "$src\n";          print $tmpfile "$src\n";
           close($tmpfile);
       }
     my $newsrc = $src;      my $newsrc = $src;
     $newsrc =~ s/(\.bmp|\.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/httpd/html/priv/[^/]+/($LONCAPA::username_re)/}{/$1/};
     $newsrc=~s{/\./}{/};      $newsrc=~s{/\./}{/};
     $newsrc=~s{/([^/]+)\.(ps|eps)}{/};      $newsrc=~s{/([^/]+)\.(ps|eps)}{/};
     if ($newsrc=~m{/home/httpd/lonUsers/}) {      if ($newsrc=~m{/home/httpd/lonUsers/}) {
Line 4709  sub LATEX_length { Line 4456  sub LATEX_length {
     $garbage=~s/^\s+(\S.*)/$1/;#space before       $garbage=~s/^\s+(\S.*)/$1/;#space before 
     $garbage=~s/(.*\S)\s+$/$1/;#space after       $garbage=~s/(.*\S)\s+$/$1/;#space after 
     $garbage=~s/(\s)+/$1/;#only one space      $garbage=~s/(\s)+/$1/;#only one space
     $garbage=~s/(\\begin{([^\}]+)}|\\end{([^\}]+)})//g;#remove LaTeX \begin{...} and \end{...}      $garbage=~s/(\\begin\{([^\}]+)}|\\end\{([^\}]+)})//g;#remove LaTeX \begin{...} and \end{...}
     $garbage=~s/(\$\_\{|\$\_|\$\^{|\$\^|\}\$)//g;#remove $_{,$_,$^{,$^,}$      $garbage=~s/(\$\_\{|\$\_|\$\^\{|\$\^|\}\$)//g;#remove $_{,$_,$^{,$^,}$
     $garbage=~s/([^\\])\$/$1/g;#$      $garbage=~s/([^\\])\$/$1/g;#$
     $garbage=~s/(\\ensuremath\{\_\{|\\ensuremath\{\_|\\ensuremath\{\^{|\\ensuremath\{\^|\})//g;#remove \ensuremath{...}      $garbage=~s/(\\ensuremath\{\_\{|\\ensuremath\{\_|\\ensuremath\{\^\{|\\ensuremath\{\^|\})//g;#remove \ensuremath{...}
    $garbage=~s/(\\alpha|\\beta|\\gamma|\\delta|\\epsilon|\\verepsilon|\\zeta|\\eta|\\theta|\\vartheta|\\iota|\\kappa|\\lambda|\\mu|\\nu|\\xi|\\pi|\\varpi|\\rho|\\varrho|\\sigma|\\varsigma|\\tau|\\upsilon|\\phi|\\varphi|\\chi|\\psi|\\omega|\\Gamma|\\Delta|\\Theta|\\Lambda|\\Xi|\\Pi|\\Sigma|\\Upsilon|\\Phi|\\Psi|\\Omega)/1/g;     $garbage=~s/(\\alpha|\\beta|\\gamma|\\delta|\\epsilon|\\verepsilon|\\zeta|\\eta|\\theta|\\vartheta|\\iota|\\kappa|\\lambda|\\mu|\\nu|\\xi|\\pi|\\varpi|\\rho|\\varrho|\\sigma|\\varsigma|\\tau|\\upsilon|\\phi|\\varphi|\\chi|\\psi|\\omega|\\Gamma|\\Delta|\\Theta|\\Lambda|\\Xi|\\Pi|\\Sigma|\\Upsilon|\\Phi|\\Psi|\\Omega)/1/g;
     $garbage=~s/(\\pm|\\mp|\\times|\\div|\\cdot|\\ast|\\star|\\dagger|\\ddagger|\\amalg|\\cap|\\cup|\\uplus|\\sqcap|\\sqcup|\\vee|\\wedge|\\oplus|\\ominus|\\otimes|\\circ|\\bullet|\\diamond|\\lhd|\\rhd|\\unlhd|\\unrhd|\\oslash|\\odot|\\bigcirc|\\Box|\\Diamond|\\bigtriangleup|\\bigtriangledown|\\triangleleft|\\triangleright|\\setminus|\\wr)/1/g;      $garbage=~s/(\\pm|\\mp|\\times|\\div|\\cdot|\\ast|\\star|\\dagger|\\ddagger|\\amalg|\\cap|\\cup|\\uplus|\\sqcap|\\sqcup|\\vee|\\wedge|\\oplus|\\ominus|\\otimes|\\circ|\\bullet|\\diamond|\\lhd|\\rhd|\\unlhd|\\unrhd|\\oslash|\\odot|\\bigcirc|\\Box|\\Diamond|\\bigtriangleup|\\bigtriangledown|\\triangleleft|\\triangleright|\\setminus|\\wr)/1/g;
     $garbage=~s/(\\le|\\ll|\\leq|\\ge|\\geq|\\gg|\\neq|\\doreq|\\sim|\\simeq|\\subset|\\subseteq|\\sqsubset|\\sqsubseteq|\\in|\\vdash|\\models|\\supset|\\supseteq|\\sqsupset|\\sqsupseteq|\\ni|\\dash|\\perp|\\approx|\\cong|\\equiv|\\propto|\\prec|\\preceq|\\parallel|\\asymp|\\smile|\\frown|\\bowtie|\\succ|\\succeq|\\mid)/1/g;      $garbage=~s/(\\le|\\ll|\\leq|\\ge|\\geq|\\gg|\\neq|\\doreq|\\sim|\\simeq|\\subset|\\subseteq|\\sqsubset|\\sqsubseteq|\\in|\\vdash|\\models|\\supset|\\supseteq|\\sqsupset|\\sqsupseteq|\\ni|\\dash|\\perp|\\approx|\\cong|\\equiv|\\propto|\\prec|\\preceq|\\parallel|\\asymp|\\smile|\\frown|\\bowtie|\\succ|\\succeq|\\mid)/1/g;
     $garbage=~s/(\\not<|\\\\not\\le|\\not\\prec|\\not\\preceq|\\not\\subset|\\not\\subseteq|\\not\\sqsubseteq|\\not\\in|\\not>|\\not\\ge|\\not\\succ|\\notsucceq|\\not\\supset|\\notsupseteq|\\not\\sqsupseteq|\\notin|\\not=|\\not\\equiv|\\not\\sim|\\not\\simeq|\\not\\approx|\\not\\cong|\\not\\asymp)/1/g;      $garbage=~s/(\\not<|\\\\not\\le|\\not\\prec|\\not\\preceq|\\not\\subset|\\not\\subseteq|\\not\\sqsubseteq|\\not\\in|\\not>|\\not\\ge|\\not\\succ|\\notsucceq|\\not\\supset|\\notsupseteq|\\not\\sqsupseteq|\\notin|\\not=|\\not\\equiv|\\not\\sim|\\not\\simeq|\\not\\approx|\\not\\cong|\\not\\asymp)/1/g;
     $garbage=~s/(\\leftarrow|\\gets|\\Leftarrow|\\rightarrow|\\to|\\Rightarrow|\\leftrightarrow|\\Leftrightarrow|\\mapsto|\\hookleftarrow|\\leftharpoonup|\\leftkarpoondown|\\rightleftharpoons|\\longleftarrow|\\Longleftarrow|\\longrightarrow|\\Longrightarrow|\\longleftrightarrow|\\Longleftrightarrow|\\longmapsto|\\hookrightarrow|\\rightharpoonup|\\rightharpoondown|\\uparrow|\\Uparrow|\\downarrow|\\Downarrow|\\updownarrow|\\Updownarrow|\\nearrow|\\searrow|\\swarrow|\\nwarrow)/11/g;      $garbage=~s/(\\leftarrow|\\gets|\\Leftarrow|\\rightarrow|\\to|\\Rightarrow|\\leftrightarrow|\\Leftrightarrow|\\mapsto|\\hookleftarrow|\\leftharpoonup|\\leftkarpoondown|\\rightleftharpoons|\\longleftarrow|\\Longleftarrow|\\longrightarrow|\\Longrightarrow|\\longleftrightarrow|\\Longleftrightarrow|\\longmapsto|\\hookrightarrow|\\rightharpoonup|\\rightharpoondown|\\uparrow|\\Uparrow|\\downarrow|\\Downarrow|\\updownarrow|\\Updownarrow|\\nearrow|\\searrow|\\swarrow|\\nwarrow)/11/g;
     $garbage=~s/(\\aleph|\\hbar|\\imath|\\jmath|\\ell|\\wp|\\Re|\\Im|\\mho|\\prime|\\emptyset|\\nabla|\\surd|\\partial|\\top|\\bot|\\vdash|\\dashv|\\forall|\\exists|\\neg|\\flat|\\natural|\\sharp|\\\||\\angle|\\backslash|\\Box|\\Diamond|\\triangle|\\clubsuit|\\diamondsuit|\\heartsuit|\\spadesuit|\\Join|\\infty)/11/g;      $garbage=~s/(\\aleph|\\hbar|\\imath|\\jmath|\\ell|\\wp|\\Re|\\Im|\\mho|\\prime|\\emptyset|\\nabla|\\surd|\\partial|\\top|\\bot|\\vdash|\\dashv|\\forall|\\exists|\\neg|\\flat|\\natural|\\sharp|\\\||\\angle|\\backslash|\\Box|\\Diamond|\\triangle|\\clubsuit|\\diamondsuit|\\heartsuit|\\spadesuit|\\Join|\\infty)/11/g;
     $garbage=~s/(\\hat{([^}]+)}|\\check{([^}]+)}|\\dot{([^}]+)}|\\breve{([^}]+)}|\\acute{([^}]+)}|\\ddot{([^}]+)}|\\grave{([^}]+)}|\\tilde{([^}]+)}|\\mathring{([^}]+)}|\\bar{([^}]+)}|\\vec{([^}]+)})/$1/g;      $garbage=~s/(\\hat\{([^}]+)}|\\check\{([^}]+)}|\\dot\{([^}]+)}|\\breve\{([^}]+)}|\\acute\{([^}]+)}|\\ddot\{([^}]+)}|\\grave\{([^}]+)}|\\tilde\{([^}]+)}|\\mathring\{([^}]+)}|\\bar\{([^}]+)}|\\vec\{([^}]+)})/$1/g;
     #remove some other LaTeX command      #remove some other LaTeX command
     $garbage=~s|\\(\w+)\\|\\|g;        $garbage=~s|\\(\w+)\\|\\|g;  
     $garbage=~s|\\(\w+)(\s*)|$2|g;        $garbage=~s|\\(\w+)(\s*)|$2|g;  
Line 4821  sub latex_header { Line 4568  sub latex_header {
  ($mode eq 'batchmode')) {$currentstring .='\batchmode';}    ($mode eq 'batchmode')) {$currentstring .='\batchmode';} 
     $currentstring .= '\newcommand{\keephidden}[1]{}'.      $currentstring .= '\newcommand{\keephidden}[1]{}'.
  '\renewcommand{\deg}{$^{\circ}$}'.   '\renewcommand{\deg}{$^{\circ}$}'.
  '\usepackage{multirow}'.   '\usepackage{multirow}'."\n".
  '\usepackage{longtable}'.   '\usepackage{longtable}'."\n".
  '\usepackage{textcomp}'.   '\usepackage{textcomp}'."\n".
  '\usepackage{makeidx}'.   '\usepackage{makeidx}'."\n".
  '\usepackage[dvips]{graphicx}'.   '\usepackage[dvips]{graphicx}'."\n".
  '\usepackage{wrapfig}'.   '\usepackage{wrapfig}'."\n".
  '\usepackage{picins}'.   '\usepackage{picins}'."\n".
  '\usepackage[T1]{fontenc}'."\n".   '\usepackage[T1]{fontenc}'."\n".
  '\usepackage{lmodern}'."\n".   '\usepackage{lmodern}'."\n".
  '\usepackage[postscript]{ucs}'."\n".   '\usepackage[postscript]{ucs}'."\n".
  '\usepackage[utf8x]{inputenc}'."\n".   '\usepackage[utf8x]{inputenc}'."\n".
  '\usepackage{pifont}' ."\n".   '\usepackage{pifont}'."\n".
  '\usepackage{latexsym}'."\n".   '\usepackage{latexsym}'."\n".
  '\usepackage{epsfig}'.   '\usepackage{epsfig}'."\n".
  "\\usepackage{xtab}\n".   '\usepackage{xtab}'."\n".
  "\\usepackage{tabularx}\n".   '\usepackage{tabularx}'."\n".
  "\\usepackage{booktabs}\n".   '\usepackage{booktabs}'."\n".
  "\\usepackage{array}\n".   '\usepackage{array}'."\n".
  "\\usepackage{colortbl}\n".   '\usepackage{colortbl}'."\n".
  "\\usepackage{xcolor}\n".   '\usepackage{xcolor}'."\n".
  '\usepackage{calc}'.   '\usepackage{calc}'."\n".
  '\usepackage{amsmath}'.   '\usepackage{amsmath}'."\n".
  '\usepackage{amssymb}'.   '\usepackage{soul}'."\n".
  '\usepackage{amsfonts}'.   '\usepackage{amssymb}'."\n".
  '\usepackage{amsthm}'.   '\usepackage{amsfonts}'."\n".
  '\usepackage{amscd}'   '\usepackage{amsthm}'."\n".
         .'\usepackage{picins}\usepackage{calc}'."\n". # From lonprintout.pm   '\usepackage{amscd}'."\n".
  '\usepackage[T1]{fontenc}'."\n".   '\usepackage{actuarialangle}'."\n";
  '\usepackage{lmodern}'."\n".  
  '\usepackage[postscript]{ucs}'."\n".  
  '\usepackage[utf8x]{inputenc}'."\n".  
  '\usepackage{pifont}'  . "\n";  
   
     if($env{'form.pdfFormFields'} eq 'yes') {      if($env{'form.pdfFormFields'} eq 'yes') {
  $currentstring .= '\usepackage{hyperref}'.   $currentstring .= '\usepackage{hyperref}'.
     '\usepackage{eforms}'.      '\usepackage{eforms}'.
Line 4868  sub latex_header { Line 4610  sub latex_header {
   
 }  }
   
   sub clean_docs_httpref {
       my ($href,$docuri,$cdom,$cnum) = @_;
       if ($docuri eq '') {
           $docuri = &Apache::lonnet::hreflocation('',$env{'request.filename'});
       }
       if ($cdom eq '') {
           $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       }
       if ($cnum eq '') {
           $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       }
       my $cleanhref;
       if ($docuri =~ m{^(\Q/uploaded/$cdom/$cnum/\E(?:docs|supplemental)/)(.+/)[^/]+$}) {
           my $prefix = $1;
           my $relpath = $2;
           my ($hrefpath,$fname);
           if ($href =~ m{^/}) {
               if ($href =~ m{^\Q$prefix\E(.+/)([^/]+)$}) {
                   $hrefpath = $1;
                   $fname = $2;
               } else {
                   return $cleanhref;
               }
           } else {
               if ($href =~ m{/}) {  
                   (my $path,$fname) = ($href =~ m{^(.*)/([^/]*)$});
                   $hrefpath = $relpath.$path;
                   if ($path eq '') {
                       $hrefpath =~ s{/$}{};
                   }
               } else {
                   $fname = $href;
                   $hrefpath = $relpath;
                   $hrefpath =~ s{/$}{};
               }
           }
           if ($fname ne '') {
               my $cleanrelpath;
               foreach my $dir (split(/\//,$hrefpath)) {
                   next if ($dir eq '.');
                   if ($dir eq '..') {
                       $cleanrelpath =~ s{([^/]+/)$}{};
                   } else {
                       $cleanrelpath .= $dir.'/';
                   }
               }
               if ($cleanrelpath ne '') {
                   $cleanhref = $prefix.$cleanrelpath.$fname;
               } else {
                   $cleanhref = $prefix.$fname;
               }
           }
       }
       return $cleanhref;
   }
   
 =pod  =pod
   
 =head1 NAME  =head1 NAME
Line 4962  described at http://www.lon-capa.org. Line 4760  described at http://www.lon-capa.org.
         I'm in a table....          I'm in a table....
       }        }
   
   =item clean_docs_httpref($href,$docuri,$cdom,$cnum)
           HTML pages uploaded to a course which contain dependencies either from iframes,
           javascript files or objects (FlashPlayerSwf, MediaSrc, XMPSrc, ConfigurationSrc,
           and PosterImageSrc) for which dependency is another file uploaded to the same
           course.
   
           Required input: 
           href - dependency (either a relative URL, or an absolute URL)
           Optional inputs:
           docuri - URL of HTML page containing the dependency
           cdom - Course domain
           cnum - CourseID
   
           Output:
           returns an absolute URL constructed from the href provided, and the calling context.
           (this will be null, if the URL does not begin: /uploaded/$cdom/$cnum/docs/ or
           /uploaded/$cdom/$cnum/supplemental/).
   
 =back  =back
   

Removed from v.1.403.4.4  
changed lines
  Added in v.1.462


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