Diff for /loncom/xml/londefdef.pm between versions 1.447 and 1.456.2.6.2.3

version 1.447, 2013/09/26 22:03:36 version 1.456.2.6.2.3, 2023/12/29 23:33:43
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 [_1].','<m>'));
           } elsif (($env{'browser.type'} eq 'safari') && ($env{'form.editxmltext'}) &&
                    (($env{'form.problemmode'} eq 'view') || ($env{'form.problemmode'} eq 'discard'))) {
               my $delimiter;
               if ($inside =~ /\$$/) {
                   $delimiter = '$';
               } elsif ($inside =~ /\\([)\]])$/) {
                   $delimiter = $1;
               }
               if ($delimiter) {
                   &Apache::lonxml::warning(&mt('Insert a space between [_1] and [_2].',
                                                $delimiter,'</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 347  sub start_title { Line 367  sub start_title {
  $Apache::londefdef::title =    $Apache::londefdef::title = 
     &Apache::lonxml::get_all_text('/title',$parser,$style);      &Apache::lonxml::get_all_text('/title',$parser,$style);
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\keephidden{Title of the document:  '    $currentstring .= '\keephidden{Title of the document:  '; 
     }      }
     if ($target eq 'meta') {      if ($target eq 'meta') {
  $currentstring='<title>';   $currentstring='<title>';
Line 585  sub start_body { Line 605  sub start_body {
         # FIXME Where are we?          # 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'};
               }
               if ($env{'form.only_body'}) {
                   $args->{'only_body'} = 1;
               }
           }
  $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],  
 #    'no_title'       => 1,  
     'force_register' => 1});  
   
         my $header = '';          my $header = '';
         if ($env{'request.state'} ne 'published' &&          if ($env{'request.state'} ne 'published' &&
             $env{'request.state'} ne 'construct') {              $env{'request.state'} ne 'construct') {
Line 622  sub start_body { Line 649  sub start_body {
   
 sub edit_controls {  sub edit_controls {
     my ($nochgview) = @_;      my ($nochgview) = @_;
     my $result .= '      my $result = &Apache::lonxml::seteditor_javascript().'
 <form method="post" action="">  <form method="post" action="">
 <div class="LC_edit_problem_header">';  <div class="LC_edit_problem_header">'."\n";
     unless ($nochgview) {      unless ($nochgview) {
         $result .= '          $result .= '
 <div class="LC_edit_problem_header_row1">'.  <div class="LC_edit_problem_header_row1">'.
Line 633  sub edit_controls { Line 660  sub edit_controls {
 </div>';  </div>';
     }      }
     $result .= '      $result .= '
 <div><input type="submit" name="editmode" accesskey="e" value="'.&mt('Edit').'" />';  <div>
   <input type="hidden" name="editmode" value="" />
   <input type="button" name="editordefault" accesskey="e" value="'.&mt('Edit').
   '" onclick="seteditmode(this.form,'."'edit'".');" />'."\n";
     if (($env{'request.course.id'}) && ($env{'form.forceedit'})) {      if (($env{'request.course.id'}) && ($env{'form.forceedit'})) {
         my $url=&Apache::lonnet::hreflocation('',$env{'request.filename'});          my $url=&Apache::lonnet::hreflocation('',$env{'request.filename'});
         if ($url =~ /\.html?$/i) {          if ($url =~ /\.html?$/i) {
Line 808  sub end_h1 { Line 838  sub end_h1 {
  $currentstring .= $token->[2];   $currentstring .= $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $post='\vskip 0 mm ';   my $post='\vskip 0 mm ';
  my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);   my $align=lc(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1));
  if ($align eq 'center') {   if ($align eq 'center') {
     $post='\end{center}';      $post='\end{center}';
  } elsif ($align eq 'left') {   } elsif ($align eq 'left') {
Line 1731  sub start_a { Line 1761  sub start_a {
                         } elsif ($env{'request.course.id'}) {                          } elsif ($env{'request.course.id'}) {
                             my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};                              my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                             my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};                              my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                             if ($linkurl =~ m{^([^/]|/uploaded/$cdom/$cnum/docs/)}) {                              if ($linkurl =~ m{^([^/]|/uploaded/$cdom/$cnum/(docs|supplemental)/)}) {
                                 my $cleanhref = &Apache::londefdef::clean_docs_httpref($linkurl,$url,$cdom,$cnum);                                  my $cleanhref = &clean_docs_httpref($linkurl,$url,$cdom,$cnum);
                                 if ($cleanhref) {                                  if ($cleanhref) {
                                     &Apache::lonxml::extlink($cleanhref);                                      &Apache::lonxml::extlink($cleanhref);
                                 }                                  }
Line 2059  sub end_dt { Line 2089  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 2749  sub start_img { Line 2779  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;
   
Line 2759  sub start_img { Line 2791  sub start_img {
         my $enc = ('yes' eq           my $enc = ('yes' eq 
                    lc(&Apache::lonxml::get_param('encrypturl',$parstack,                     lc(&Apache::lonxml::get_param('encrypturl',$parstack,
                       $safeeval)));                        $safeeval)));
         $currentstring.=&Apache::lonenc::encrypt_ref($token,{'src'=>$src},          unless ($src =~ m{^data\:image/gif;base64,}) {
                          $enc);              $currentstring.=&Apache::lonenc::encrypt_ref($token,{'src'=>$src},
                               $enc);
           }
   
     # and render unto TeX that which is LaTeX      # and render unto TeX that which is LaTeX
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
Line 2803  sub start_img { Line 2837  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 3239  sub end_externallink { Line 3273  sub end_externallink {
     return $currentstring;      return $currentstring;
 }  }
   
 #-- <blankspace heigth="">  #-- <blankspace height="">
 sub start_blankspace {  sub start_blankspace {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = &end_p(); # closes off any unclosed <p>      my $currentstring = &end_p(); # closes off any unclosed <p>
     if ($target eq 'tex') {      if ($target eq 'tex') {
  my $howmuch = &Apache::lonxml::get_param('heigth',$parstack,$safeeval,undef,1);   my $howmuch = &Apache::lonxml::get_param('height',$parstack,$safeeval,undef,1);
  $currentstring .= '\vskip '.$howmuch.' ';   $currentstring .= '\vskip '.$howmuch.' ';
     }      }
     return $currentstring;      return $currentstring;
Line 3442  sub start_caption { Line 3476  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 3450  sub end_caption { Line 3484  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 3615  sub start_iframe { Line 3649  sub start_iframe {
                         }                          }
                     }                      }
                     $currentstring =~ s/\s+$//;                      $currentstring =~ s/\s+$//;
                     $currentstring .= '>';                      if ($token->[4] =~ m{/>$}) {
                           $currentstring .= ' />';
                       } else {
                           $currentstring .= '>';
                       }
                 } else {                  } else {
                     $currentstring = $token->[4];                      $currentstring = $token->[4];
                 }                  }
                 if (($url !~ m{^https?://}) && ($env{'request.course.id'})) {              }
                     my $docuri = &Apache::lonnet::hreflocation('',$env{'request.filename'});              if (($url !~ m{^https?://}) && ($env{'request.course.id'})) {
                     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};                  my $docuri = &Apache::lonnet::hreflocation('',$env{'request.filename'});
                     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};                  my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                     if ($url =~ m{^([^/]|/uploaded/)}) {                  my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                         my $cleanhref = &Apache::londefdef::clean_docs_httpref($url,$docuri,$cdom,$cnum);                  if ($url =~ m{^([^/]|/uploaded/)}) {
                         if ($cleanhref) {                      my $cleanhref = &clean_docs_httpref($url,$docuri,$cdom,$cnum);
                             &Apache::lonxml::extlink($cleanhref);                      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)) {                  } elsif (($url =~ m{/res/$LONCAPA::domain_re/}) && ($docuri =~ m{^\Q/uploaded/$cdom/$cnum/docs/\E})) {
                             if (&Apache::lonnet::is_on_map($url)) {                      if (!&Apache::lonnet::allowed('bre',$url)) {
                                 &Apache::lonxml::extlink($url);                          if (&Apache::lonnet::is_on_map($url)) {
                             }                              &Apache::lonxml::extlink($url);
                         }                          }
                     }                      }
                 }                  }
Line 4246  sub resize_image { Line 4284  sub resize_image {
     $height_param=$TeXwidth/$old_width_param*$height_param;      $height_param=$TeXwidth/$old_width_param*$height_param;
  }   }
     } elsif ($TeXheight) {      } elsif ($TeXheight) {
  $height_param = $TeXheight;  
  if ($height_param) {   if ($height_param) {
     $width_param  = $TeXheight/$height_param*$width_param;      $width_param  = $TeXheight/$height_param*$width_param;
  }   }
    $height_param = $TeXheight;
     } elsif ($width) {      } elsif ($width) {
  my $old_width_param=$width_param;   my $old_width_param=$width_param;
  $width_param = $width*$scaling;   $width_param = $width*$scaling;
Line 4313  sub get_eps_image { Line 4351  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 4428  sub LATEX_length { Line 4466  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 4540  sub latex_header { Line 4578  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{soul}'.   '\usepackage{soul}'."\n".
  '\usepackage{amssymb}'.   '\usepackage{amssymb}'."\n".
  '\usepackage{amsfonts}'.   '\usepackage{amsfonts}'."\n".
  '\usepackage{amsthm}'.   '\usepackage{amsthm}'."\n".
  '\usepackage{amscd}'   '\usepackage{amscd}'."\n".
         .'\usepackage{picins}\usepackage{calc}'."\n". # From lonprintout.pm   '\usepackage{actuarialangle}'."\n";
  '\usepackage[T1]{fontenc}'."\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 4591  sub latex_header { Line 4623  sub latex_header {
 sub clean_docs_httpref {  sub clean_docs_httpref {
     my ($href,$docuri,$cdom,$cnum) = @_;      my ($href,$docuri,$cdom,$cnum) = @_;
     if ($docuri eq '') {      if ($docuri eq '') {
         &Apache::lonnet::hreflocation('',$env{'request.filename'});          $docuri = &Apache::lonnet::hreflocation('',$env{'request.filename'});
     }      }
     if ($cdom eq '') {      if ($cdom eq '') {
         $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};          $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
Line 4600  sub clean_docs_httpref { Line 4632  sub clean_docs_httpref {
         $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     }      }
     my $cleanhref;      my $cleanhref;
     if ($docuri =~ m{^(\Q/uploaded/$cdom/$cnum/docs/\E)(.+/)[^/]+$}) {      if ($docuri =~ m{^(\Q/uploaded/$cdom/$cnum/\E(?:docs|supplemental)/)(.+/)[^/]+$}) {
         my $prefix = $1;          my $prefix = $1;
         my $relpath = $2;          my $relpath = $2;
         my ($hrefpath,$fname);          my ($hrefpath,$fname);
Line 4612  sub clean_docs_httpref { Line 4644  sub clean_docs_httpref {
                 return $cleanhref;                  return $cleanhref;
             }              }
         } else {          } else {
             (my $path,$fname) = ($href =~ m{^(.+)/([^/]*)$});              if ($href =~ m{/}) {  
             $hrefpath = $relpath.$path;                  (my $path,$fname) = ($href =~ m{^(.*)/([^/]*)$});
                   $hrefpath = $relpath.$path;
                   if ($path eq '') {
                       $hrefpath =~ s{/$}{};
                   }
               } else {
                   $fname = $href;
                   $hrefpath = $relpath;
                   $hrefpath =~ s{/$}{};
               }
         }          }
         if ($fname ne '') {          if ($fname ne '') {
             my $cleanrelpath;              my $cleanrelpath;
Line 4625  sub clean_docs_httpref { Line 4666  sub clean_docs_httpref {
                     $cleanrelpath .= $dir.'/';                      $cleanrelpath .= $dir.'/';
                 }                  }
             }              }
             $cleanrelpath =~ s{/$}{};  
             if ($cleanrelpath ne '') {              if ($cleanrelpath ne '') {
                 $cleanhref = $prefix.'/'.$cleanrelpath.'/'.$fname;                  $cleanhref = $prefix.$cleanrelpath.$fname;
             } else {              } else {
                 $cleanhref = $prefix.'/'.$fname;                  $cleanhref = $prefix.$fname;
             }              }
         }          }
     }      }
Line 4745  described at http://www.lon-capa.org. Line 4785  described at http://www.lon-capa.org.
   
         Output:          Output:
         returns an absolute URL constructed from the href provided, and the calling context.          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/).          (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.447  
changed lines
  Added in v.1.456.2.6.2.3


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