Diff for /loncom/xml/lonxml.pm between versions 1.531.2.24.2.2 and 1.559

version 1.531.2.24.2.2, 2024/02/28 18:33:00 version 1.559, 2017/11/12 23:10:33
Line 70  use Safe::Hole(); Line 70  use Safe::Hole();
 use Math::Cephes();  use Math::Cephes();
 use Math::Random();  use Math::Random();
 use Math::Calculus::Expression();  use Math::Calculus::Expression();
 use Number::FormatEng();  
 use Opcode();  use Opcode();
 use POSIX qw(strftime);  use POSIX qw(strftime);
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
Line 230  sub xmlend { Line 229  sub xmlend {
     return $discussion;      return $discussion;
 }  }
   
 sub tokeninputfield {  
     my $defhost=$Apache::lonnet::perlvar{'lonHostID'};  
     $defhost=~tr/a-z/A-Z/;  
     return (<<ENDINPUTFIELD)  
 <script type="text/javascript">  
     function updatetoken() {  
         var comp=new Array;  
         var barcode=unescape(document.tokeninput.barcode.value);  
         comp=barcode.split('*');  
         if (typeof(comp[0])!="undefined") {  
             document.tokeninput.codeone.value=comp[0];  
         }  
         if (typeof(comp[1])!="undefined") {  
             document.tokeninput.codetwo.value=comp[1];  
         }  
         if (typeof(comp[2])!="undefined") {  
             comp[2]=comp[2].toUpperCase();  
             document.tokeninput.codethree.value=comp[2];  
         }  
         document.tokeninput.barcode.value='';  
     }  
 </script>  
 <form method="post" name="tokeninput" action="">  
 <table border="2" bgcolor="#FFFFBB">  
 <tr><th>DocID Checkin</th></tr>  
 <tr><td>  
 <table>  
 <tr>  
 <td>Scan in Barcode</td>  
 <td><input type="text" size="22" name="barcode"  
 onchange="updatetoken()"/></td>  
 </tr>  
 <tr><td><i>or</i> Type in DocID</td>  
 <td>  
 <input type="text" size="5" name="codeone" />  
 <b><font size="+2">*</font></b>  
 <input type="text" size="5" name="codetwo" />  
 <b><font size="+2">*</font></b>  
 <input type="text" size="10" name="codethree" value="$defhost"  
 onchange="this.value=this.value.toUpperCase()" />  
 </td></tr>  
 </table>  
 </td></tr>  
 <tr><td><input type="submit" value="Check in DocID" /></td></tr>  
 </table>  
 </form>  
 ENDINPUTFIELD  
 }  
   
 sub maketoken {  
     my ($symb,$tuname,$tudom,$tcrsid)=@_;  
     unless ($symb) {  
         $symb=&Apache::lonnet::symbread();  
     }  
     unless ($tuname) {  
         $tuname=$env{'user.name'};  
         $tudom=$env{'user.domain'};  
         $tcrsid=$env{'request.course.id'};  
     }  
     return &Apache::lonnet::checkout($symb,$tuname,$tudom,$tcrsid);  
 }  
   
 sub printtokenheader {  
     my ($target,$token,$tsymb,$tcrsid,$tudom,$tuname)=@_;  
     unless ($token) { return ''; }  
   
     my ($symb,$courseid,$domain,$name) = &Apache::lonnet::whichuser();  
     unless ($tsymb) {  
         $tsymb=$symb;  
     }  
     unless ($tuname) {  
         $tuname=$name;  
         $tudom=$domain;  
         $tcrsid=$courseid;  
     }  
   
     my $plainname=&Apache::loncommon::plainname($tuname,$tudom);  
   
     if ($target eq 'web') {  
         my %idhash=&Apache::lonnet::idrget($tudom,($tuname));  
         return  
  '<img align="right" src="/cgi-bin/barcode.png?encode='.$token.'" />'.  
                &mt('Checked out for').' '.$plainname.  
                '<br />'.&mt('User').': '.$tuname.' at '.$tudom.  
                '<br />'.&mt('ID').': '.$idhash{$tuname}.  
                '<br />'.&mt('CourseID').': '.$tcrsid.  
                '<br />'.&mt('Course').': '.$env{'course.'.$tcrsid.'.description'}.  
                '<br />'.&mt('DocID').': '.$token.  
                '<br />'.&mt('Time').': '.&Apache::lonlocal::locallocaltime().'<hr />';  
     } else {  
         return $token;  
     }  
 }  
   
 sub printalltags {  sub printalltags {
     my $temp;      foreach my $temp (sort(keys(%Apache::lonxml::alltags))) {
     foreach $temp (sort keys %Apache::lonxml::alltags) {  
         &Apache::lonxml::debug("$temp -- ".          &Apache::lonxml::debug("$temp -- ".
                                join(',',@{ $Apache::lonxml::alltags{$temp} }));                                 join(',',@{ $Apache::lonxml::alltags{$temp} }));
     }      }
Line 564  sub inner_xmlparse { Line 468  sub inner_xmlparse {
   
       if ($token->[0] eq 'E') {        if ($token->[0] eq 'E') {
           if ($dontpop) {            if ($dontpop) {
               $lastdontpop = $token;                $lastdontpop = $token; 
           } else {            } else {
               $lastendtag = $token->[1];                $lastendtag = $token->[1];
               &end_tag($stack,$parstack,$token);                &end_tag($stack,$parstack,$token);
Line 578  sub inner_xmlparse { Line 482  sub inner_xmlparse {
     }      }
   }    }
   
   if (($#$stack == 0) && ($stack->[0] eq 'physnet') && ($target eq 'web') &&    if (($#$stack == 0) && ($stack->[0] eq 'physnet') && ($target eq 'web') && 
       ($lastendtag eq 'LONCAPA_INTERNAL_TURN_STYLE_ON')) {        ($lastendtag eq 'LONCAPA_INTERNAL_TURN_STYLE_ON')) {
        if ((ref($lastdontpop) eq 'ARRAY') && ($lastdontpop->[1] eq 'physnet')) {         if ((ref($lastdontpop) eq 'ARRAY') && ($lastdontpop->[1] eq 'physnet')) {
            &end_tag($stack,$parstack,$lastdontpop);             &end_tag($stack,$parstack,$lastdontpop);
Line 917  sub init_safespace { Line 821  sub init_safespace {
   $safehole->wrap(\&Apache::functionplotresponse::fpr_vectorlength,$safeeval,'&fpr_vectorlength');    $safehole->wrap(\&Apache::functionplotresponse::fpr_vectorlength,$safeeval,'&fpr_vectorlength');
   $safehole->wrap(\&Apache::functionplotresponse::fpr_vectorangle,$safeeval,'&fpr_vectorangle');    $safehole->wrap(\&Apache::functionplotresponse::fpr_vectorangle,$safeeval,'&fpr_vectorangle');
   $safehole->wrap(\&Math::Calculus::Expression::math_calculus_expression,$safeeval,'&math_calculus_expression');    $safehole->wrap(\&Math::Calculus::Expression::math_calculus_expression,$safeeval,'&math_calculus_expression');
   $safehole->wrap(\&Number::FormatEng::format_eng,$safeeval,'&number_format_eng');  
   $safehole->wrap(\&Number::FormatEng::format_pref,$safeeval,'&number_format_pref');  
   
 #  use Data::Dumper;  #  use Data::Dumper;
 #  $safehole->wrap(\&Data::Dumper::Dumper,$safeeval,'&LONCAPA_INTERNAL_Dumper');  #  $safehole->wrap(\&Data::Dumper::Dumper,$safeeval,'&LONCAPA_INTERNAL_Dumper');
Line 1091  sub decreasedepth { Line 993  sub decreasedepth {
 sub get_id {  sub get_id {
     my ($parstack,$safeeval)=@_;      my ($parstack,$safeeval)=@_;
     my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);      my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);
     if ($env{'request.state'} eq 'construct' && $id =~ /([._]|[^\w\s\-])/) {       if ($env{'request.state'} eq 'construct' && $id =~ /([._]|[^\w\s\-])/) {
  &error(&mt('ID [_1] contains invalid characters. IDs are only allowed to contain letters, numbers, spaces and -','"<tt>'.$id.'</tt>"'));   &error(&mt('ID [_1] contains invalid characters. IDs are only allowed to contain letters, numbers, spaces and -','"<tt>'.$id.'</tt>"'));
     }      }
     if ($id =~ /^\s*$/) { $id = $Apache::lonxml::curdepth; }      if ($id =~ /^\s*$/) { $id = $Apache::lonxml::curdepth; }
Line 1686  FULLPAGE Line 1588  FULLPAGE
               }                }
           } elsif ($symb || $folderpath) {            } elsif ($symb || $folderpath) {
               $deps_button = &Apache::lonhtmlcommon::dependencies_button()."\n";                $deps_button = &Apache::lonhtmlcommon::dependencies_button()."\n";
               $initialize .=                $initialize .= 
                   &Apache::lonhtmlcommon::dependencycheck_js($symb,$itemtitle,                    &Apache::lonhtmlcommon::dependencycheck_js($symb,$itemtitle,
                                                              undef,$folderpath,$uri)."\n";                                                               undef,$folderpath,$uri)."\n";
           }            }
Line 1708  FULLPAGE Line 1610  FULLPAGE
       my %lt=&Apache::lonlocal::texthash('st' => 'Save and Edit',        my %lt=&Apache::lonlocal::texthash('st' => 'Save and Edit',
  'vi' => 'Save and View',   'vi' => 'Save and View',
  'dv' => 'Discard Edits and View',   'dv' => 'Discard Edits and View',
  'un' => 'Undo',   'un' => 'undo',
  'ed' => 'Edit',   'ed' => 'Edit');
  'ew' => 'Edit with Daxe');  
       my $spelllink = &Apache::lonhtmlcommon::spelllink('xmledit','filecont');        my $spelllink = &Apache::lonhtmlcommon::spelllink('xmledit','filecont');
       my $textarea_events = &Apache::edit::element_change_detection();        my $textarea_events = &Apache::edit::element_change_detection();
       my $form_events     = &Apache::edit::form_change_detection();        my $form_events     = &Apache::edit::form_change_detection();
Line 1718  FULLPAGE Line 1619  FULLPAGE
       if ($filetype eq 'html') {        if ($filetype eq 'html') {
           $htmlerror=&verify_html($filecontents);            $htmlerror=&verify_html($filecontents);
           if ($htmlerror) {            if ($htmlerror) {
               $htmlerror=('&nbsp;'x3).' <span class="LC_error">'.$htmlerror.'</span>';                $htmlerror='<span class="LC_error">'.$htmlerror.'</span>';
           }            }
           if (&Apache::lonhtmlcommon::htmlareabrowser()) {            if (&Apache::lonhtmlcommon::htmlareabrowser()) {
               unless ($textareaclass) {                unless ($textareaclass) {
Line 1726  FULLPAGE Line 1627  FULLPAGE
               }                }
           }            }
       }        }
       my ($undo,$daxebutton,%onclick);        my $undo;
       foreach my $item ('discard','undo','daxe') {  
           $onclick{$item} = 'onclick="still_ask=true;setmode(this.form,'."'$item'".')"';  
       }  
       foreach my $item ('saveedit','saveview') {  
           $onclick{$item} = 'onclick="is_submit=true;setmode(this.form,'."'$item'".')"';  
       }  
       unless ($uri =~ m{^/uploaded/}) {        unless ($uri =~ m{^/uploaded/}) {
           $undo = '<input type="button" name="Undo" accesskey="u" value="'.$lt{'un'}.'" '.            $undo = '<input type="submit" name="Undo" accesskey="u" value="'.$lt{'un'}.'" />'."\n";
                   $onclick{'undo'}.' />'."\n";  
       }  
       $initialize .= &setmode_javascript();  
       if ($filetype eq 'html') {  
           my %editors = &Apache::loncommon::permitted_editors();  
           if ($editors{'daxe'}) {  
               $daxebutton = '<input type="button" name="editwithdaxe" accesskey="w" value="'.$lt{'ew'}.'" '.  
                             $onclick{'daxe'}.' />'."\n";  
           }  
       }        }
       my $editfooter=(<<ENDFOOTER);        my $editfooter=(<<ENDFOOTER);
 $initialize  $initialize
 <a name="editsection" />  <a name="editsection" />
 <form $form_events method="post" name="xmledit" action="$action">  <form $form_events method="post" name="xmledit" action="$action">
   <input type="hidden" name="problemmode" value="edit" />  
   <div class="LC_edit_problem_editxml_header">    <div class="LC_edit_problem_editxml_header">
     <table class="LC_edit_problem_header_title"><tr><td>      <table class="LC_edit_problem_header_title"><tr><td>
         $filename          $filename
Line 1757  $initialize Line 1642  $initialize
         $xml_help          $xml_help
       </td></tr>        </td></tr>
     </table>      </table>
     <div style="float:right">  
       <input type="button" name="savethisfile" accesskey="s" value="$lt{'st'}" $onclick{'saveedit'} />  
       <input type="button" name="viewmode" accesskey="v" value="$lt{'vi'}" $onclick{'saveview'} />  
     </div>  
     <div>      <div>
       <input type="button" name="discardview" accesskey="d" value="$lt{'dv'}" $onclick{'discard'} />        <input type="submit" name="discardview" accesskey="d" value="$lt{'dv'}" />
       $undo $deps_button $daxebutton $dragmath_button $htmlerror        $undo $htmlerror $deps_button $dragmath_button
       </div>
       <div style="float:right">
         <input type="submit" name="savethisfile" accesskey="s" value="$lt{'st'}" />
         <input type="submit" name="viewmode" accesskey="v" value="$lt{'vi'}" />
     </div>      </div>
   </div>    </div>
   <textarea $textarea_events style="width:100%" cols="80" rows="44" name="filecont" id="filecont" $textareaclass>$filecontents</textarea><br />$spelllink    <textarea $textarea_events style="width:100%" cols="80" rows="44" name="filecont" id="filecont" $textareaclass>$filecontents</textarea><br />$spelllink
Line 1773  $initialize Line 1658  $initialize
   </div>    </div>
 </form>  </form>
 ENDFOOTER  ENDFOOTER
       return ($editfooter,$add_to_onload,$add_to_onresize);        return ($editfooter,$add_to_onload,$add_to_onresize);;
 }  
   
 sub setmode_javascript {  
     return <<"ENDSCRIPT";  
 <script type="text/javascript">  
 // <![CDATA[  
 function setmode(form,probmode) {  
     if (probmode == 'daxe') {  
         var url = new URL(document.location.href);  
         window.location = url.protocol+'//'+url.hostname+'/daxepage'+url.pathname;  
     } else {  
         var initial = form.problemmode.value;  
         form.problemmode.value = probmode;  
         form.submit();  
         form.problemmode.value = initial;  
     }  
 }  
 // ]]>  
 </script>  
 ENDSCRIPT  
 }  
   
 sub seteditor_javascript {  
     return <<"ENDSCRIPT";  
 <script type="text/javascript">  
 // <![CDATA[  
 function seteditmode(form,editor) {  
     if (editor == 'daxe') {  
         var url = new URL(document.location.href);  
         window.location = url.protocol+'//'+url.hostname+'/daxepage'+url.pathname;  
     } else {  
         form.editmode.value = editor;  
         form.submit();  
     }  
 }  
 // ]]>  
 </script>  
 ENDSCRIPT  
 }  }
   
 sub get_target {  sub get_target {
Line 1916  sub handler { Line 1763  sub handler {
 # Edit action? Save file.  # Edit action? Save file.
 #  #
     if (!($env{'request.state'} eq 'published')) {      if (!($env{'request.state'} eq 'published')) {
         if (($env{'form.problemmode'} eq 'saveedit') ||   if ($env{'form.savethisfile'} || $env{'form.viewmode'} || $env{'form.Undo'}) {
             ($env{'form.problemmode'} eq 'saveview') ||  
             ($env{'form.problemmode'} eq 'undo')) {  
     my $html_file=&Apache::lonnet::getfile($file);      my $html_file=&Apache::lonnet::getfile($file);
     my $error = &Apache::lonhomework::handle_save_or_undo($request, \$html_file, \$env{'form.filecont'});      my $error = &Apache::lonhomework::handle_save_or_undo($request, \$html_file, \$env{'form.filecont'});
             if ($env{'form.problemmode'} eq 'saveedit') {              if ($env{'form.savethisfile'}) {
                 $env{'form.editmode'}='edit'; #force edit mode                  $env{'form.editmode'}='Edit'; #force edit mode
             }              }
  }   }
     }      }
Line 1951  ENDNOTFOUND Line 1796  ENDNOTFOUND
             } elsif ($filetype ne 'css' && $filetype ne 'txt' && $filetype ne 'tex') {              } elsif ($filetype ne 'css' && $filetype ne 'txt' && $filetype ne 'tex') {
  $filecontents=&createnewhtml();   $filecontents=&createnewhtml();
     }      }
     $env{'form.editmode'}='edit'; #force edit mode      $env{'form.editmode'}='Edit'; #force edit mode
  }   }
     } else {      } else {
  unless ($env{'request.state'} eq 'published') {   unless ($env{'request.state'} eq 'published') {
Line 1963  ENDNOTFOUND Line 1808  ENDNOTFOUND
             &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},              &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
     ['editmode']);      ['editmode']);
  }   }
  if ((!$env{'form.editmode'}) ||   if (!$env{'form.editmode'} || $env{'form.viewmode'} || $env{'form.discardview'}) {
             ($env{'form.problemmode'} eq 'saveview') ||  
             ($env{'form.problemmode'} eq 'discard')) {  
             if ($filetype eq 'html' || $filetype eq 'sty') {              if ($filetype eq 'html' || $filetype eq 'sty') {
         &Apache::structuretags::reset_problem_globals();          &Apache::structuretags::reset_problem_globals();
         $result = &Apache::lonxml::xmlparse($request,$target,          $result = &Apache::lonxml::xmlparse($request,$target,
Line 2033  ENDNOTFOUND Line 1876  ENDNOTFOUND
 # Edit action? Insert editing commands  # Edit action? Insert editing commands
 #  #
     unless (($env{'request.state'} eq 'published') || ($inhibit_menu)) {      unless (($env{'request.state'} eq 'published') || ($inhibit_menu)) {
  if (($env{'form.editmode'}) &&   if ($env{'form.editmode'} && (!($env{'form.viewmode'})) && (!($env{'form.discardview'})))
             (!($env{'form.problemmode'} eq 'saveview')) &&   {
             (!($env{'form.problemmode'} eq 'discard'))) {  
             my ($displayfile,$url,$symb,$itemtitle,$action);              my ($displayfile,$url,$symb,$itemtitle,$action);
     $displayfile=$request->uri;      $displayfile=$request->uri;
             if ($request->uri =~ m{^/uploaded/}) {              if ($request->uri =~ m{^/uploaded/}) {
Line 2303  sub add_messages { Line 2145  sub add_messages {
   
 sub get_param {  sub get_param {
     my ($param,$parstack,$safeeval,$context,$case_insensitive, $noelide) = @_;      my ($param,$parstack,$safeeval,$context,$case_insensitive, $noelide) = @_;
   
     if ( ! $context ) { $context = -1; }      if ( ! $context ) { $context = -1; }
     my $args ='';      my $args ='';
     if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; }      if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; }
Line 2310  sub get_param { Line 2153  sub get_param {
  $args=$Apache::lonxml::style_values.$args;   $args=$Apache::lonxml::style_values.$args;
     }      }
   
   
     if ($noelide) {      if ($noelide) {
         $args =~ s/'\$/'\\\$/g;  # $args =~ s/\\'/'/g;
    $args =~ s/'\$/'\\\$/g;
     }      }
   
     if ( ! $args ) { return undef; }      if ( ! $args ) { return undef; }
     if ( $case_insensitive ) {      if ( $case_insensitive ) {
  if ($args =~ s/(my (?:.*))(\$\Q$param\E[,\)])/$1.lc($2)/ei) {   if ($args =~ s/(my (?:.*))(\$\Q$param\E[,\)])/$1.lc($2)/ei) {
   
     return &Apache::run::run("{$args;".'return $'.$param.'}',      return &Apache::run::run("{$args;".'return $'.$param.'}',
                                      $safeeval); #'                                       $safeeval); #'
  } else {   } else {
Line 2324  sub get_param { Line 2170  sub get_param {
  }   }
     } else {      } else {
  if ( $args =~ /my .*\$\Q$param\E[,\)]/ ) {   if ( $args =~ /my .*\$\Q$param\E[,\)]/ ) {
       
     return &Apache::run::run("{$args;".'return $'.$param.'}',      return &Apache::run::run("{$args;".'return $'.$param.'}',
                                      $safeeval); #'                                       $safeeval); #'
  } else {   } else {

Removed from v.1.531.2.24.2.2  
changed lines
  Added in v.1.559


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