[LON-CAPA-cvs] cvs: loncom / LONCAPA.pm /homework essayresponse.pm inputtags.pm matchresponse.pm optionresponse.pm radiobuttonresponse.pm rankresponse.pm structuretags.pm /lonnet/perl lonnet.pm

raeburn raeburn at source.lon-capa.org
Thu Aug 6 17:45:47 EDT 2026


raeburn		Thu Aug  6 21:45:47 2026 EDT

  Modified files:              
    /loncom/homework	essayresponse.pm inputtags.pm matchresponse.pm 
                    	optionresponse.pm radiobuttonresponse.pm 
                    	rankresponse.pm structuretags.pm 
    /loncom/lonnet/perl	lonnet.pm 
    /loncom	LONCAPA.pm 
  Log:
  - Don't escape underscores in form fieldnames in TeX Live 2013 and older. 
  
  
-------------- next part --------------
Index: loncom/homework/essayresponse.pm
diff -u loncom/homework/essayresponse.pm:1.130 loncom/homework/essayresponse.pm:1.131
--- loncom/homework/essayresponse.pm:1.130	Thu Mar 26 17:46:57 2026
+++ loncom/homework/essayresponse.pm	Thu Aug  6 21:45:46 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # essay (ungraded) style responses
 #
-# $Id: essayresponse.pm,v 1.130 2026/03/26 17:46:57 raeburn Exp $
+# $Id: essayresponse.pm,v 1.131 2026/08/06 21:45:46 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -146,12 +146,19 @@
                                              $udom,$uname);
             if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
                 ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) {
-
-                my $fieldname = 'uuid\_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
-                               .'\&user\_'.$digest
-                               .'\&part\_'.$part
+                my $escpart = $part;
+                my $escid = $id;
+                my $sep = '_';
+                if ($Apache::lonnet::texlive > 2013) {
+                    $sep = '\_';
+                    $escpart =~ s{_}{\\_}g;
+                    $escid =~ s{_}{\\_}g;
+                }
+                my $fieldname = 'uuid'.$sep.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                               .'\&user'.$sep.$digest
+                               .'\&part'.$sep.$escpart
                                .'\&essay'
-                               .'\&HWDRAFT\_'.$id;
+                               .'\&HWDRAFT'.$sep.$escid;
                 return "\\begin{itemize}"
                       .'\item[{'
                       .&Apache::lonxml::print_pdf_radiobutton($fieldname,'yes')
Index: loncom/homework/inputtags.pm
diff -u loncom/homework/inputtags.pm:1.376 loncom/homework/inputtags.pm:1.377
--- loncom/homework/inputtags.pm:1.376	Thu Mar 26 02:49:58 2026
+++ loncom/homework/inputtags.pm	Thu Aug  6 21:45:46 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # input definitions
 #
-# $Id: inputtags.pm,v 1.376 2026/03/26 02:49:58 raeburn Exp $
+# $Id: inputtags.pm,v 1.377 2026/08/06 21:45:46 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -549,15 +549,19 @@
                                                  $udom,$uname);
                 if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
                     ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) {
-                    my $fieldname = 'uuid\_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
-                                   .'&user\_'. $digest;
+                    my $sep = '_';
                     my $escpart = $Apache::inputtags::part;
-                    $escpart =~ s{_}{\\_}g;
                     my $escres = $Apache::inputtags::response[-1];
-                    $escres =~ s{_}{\\_}g;
                     my $escid = $input_id;
-                    $escid =~ s{_}{\\_}g;
-                    $fieldname .= '\&part\_'.$escpart.'\&text\&HWVAL\_'.$escres.'\&ID\_'.$escid;
+                    if ($Apache::lonnet::texlive > 2013) {
+                        $sep = '\_';
+                        $escpart =~ s{_}{\\_}g;
+                        $escres =~ s{_}{\\_}g;
+                        $escid =~ s{_}{\\_}g;
+                    }
+                    my $fieldname = 'uuid'.$sep.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                                   .'\&user'.$sep.$digest.'\&part'.$sep.$escpart.'\&text\&HWVAL'.$sep
+                                   .$escres.'\&ID'.$sep.$escid;
                     $result='\textField{'.$fieldname.'}{'.$size.'}{12 bp}';
                 }
             }
Index: loncom/homework/matchresponse.pm
diff -u loncom/homework/matchresponse.pm:1.100 loncom/homework/matchresponse.pm:1.101
--- loncom/homework/matchresponse.pm:1.100	Tue Mar 17 19:59:25 2026
+++ loncom/homework/matchresponse.pm	Thu Aug  6 21:45:46 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Full matching style response
 #
-# $Id: matchresponse.pm,v 1.100 2026/03/17 19:59:25 raeburn Exp $
+# $Id: matchresponse.pm,v 1.101 2026/08/06 21:45:46 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -679,7 +679,7 @@
         } else {
             $numrows = 1;
         }
-        my ($fieldname,$escpart);
+        my ($fieldname,$escpart,$sep);
         if (($Apache::lonhomework::type ne 'exam') &&
             ($target eq 'tex' and $env{'form.pdfFormFields'} eq 'yes'
              && $Apache::inputtags::status[-1] eq 'CAN_ANSWER')) {
@@ -690,13 +690,16 @@
                                                  $udom,$uname);
                 if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
                     ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}} ne '')) {
-                    $fieldname = 'uuid\_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}.
-                                 '\&user\_'. $digest;
                     $escpart = $Apache::inputtags::part;
-                    $escpart =~ s{_}{\\_}g;
                     my $escres = $Apache::inputtags::response['-1'];
-                    $escres =~ s{_}{\\_}g;
-                    $fieldname .= '\&part\_'.$escpart.'\&match\&HWVAL\_'.$escres.':';
+                    $sep = '_';
+                    if ($Apache::lonnet::texlive > 2013) {
+                        $sep = '\_';
+                        $escpart =~ s{_}{\\_}g;
+                        $escres =~ s{_}{\\_}g;
+                    }
+                    $fieldname = 'uuid'.$sep.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                                .'\&user'.$sep.$digest.'\&part'.$sep.$escpart.'\&match\&HWVAL'.$sep.$escres.':';
                 }
             }
         }
@@ -710,7 +713,7 @@
 		if ($Apache::lonhomework::type ne 'exam') {
                     if($env{'form.pdfFormFields'} eq 'yes'
                        && $Apache::inputtags::status['-1'] eq 'CAN_ANSWER' && $fieldname ne '') {
-                        $optionlist = &Apache::lonxml::print_pdf_start_combobox($fieldname.$temp.'\&submit\_'.$escpart.'\&');
+                        $optionlist = &Apache::lonxml::print_pdf_start_combobox($fieldname.$temp.'\&submit'.$sep.$escpart.'\&');
                     } else {
                         $optionlist='\framebox[10 mm][s]{\tiny\strut}';
                     }
Index: loncom/homework/optionresponse.pm
diff -u loncom/homework/optionresponse.pm:1.210 loncom/homework/optionresponse.pm:1.211
--- loncom/homework/optionresponse.pm:1.210	Sat Mar 28 18:10:33 2026
+++ loncom/homework/optionresponse.pm	Thu Aug  6 21:45:46 2026
@@ -1,7 +1,7 @@
 # LearningOnline Network with CAPA
 # option list style responses
 #
-# $Id: optionresponse.pm,v 1.210 2026/03/28 18:10:33 raeburn Exp $
+# $Id: optionresponse.pm,v 1.211 2026/08/06 21:45:46 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -750,7 +750,7 @@
                      &mt('Select all that are [_1].','<b>'.$checkboxopt.'</b>');
         }
     }
-    my ($fieldname,$checkboxoff,$hiddennum);
+    my ($fieldname,$checkboxoff,$hiddennum,$sep);
     if ($target eq 'tex' and $env{'form.pdfFormFields'} eq 'yes'
          && $Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
         my ($uname,$udom,$digest) = &Apache::lonxml::get_user_digest();
@@ -761,13 +761,16 @@
                                              $udom,$uname);
             if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
                 ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}} ne '')) {
-                $fieldname = 'uuid\_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
-                            .'\&user\_'.$digest;
                 my $escpart = $Apache::inputtags::part;
-                $escpart =~ s{_}{\\_}g;
-                $escres = $Apache::inputtags::response['-1'];
-                $escres =~ s{_}{\\_}g;
-                $fieldname .= '\&part\_'.$escpart.'\&option';
+                $escres = $Apache::inputtags::response['-1']; 
+                $sep = '_';
+                if ($Apache::lonnet::texlive > 2013) {
+                    $sep = '\_';
+                    $escpart =~ s{_}{\\_}g;
+                    $escres =~ s{_}{\\_}g;
+                }
+                $fieldname = 'uuid'.$sep.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                            .'\&user'.$sep.$digest.'\&part'.$sep.$escpart.'\&option';
             }
         }
         ($checkboxopt,$checkboxoff)=&check_box_opt($target,$checkboxvalue, at opt);
@@ -791,10 +794,10 @@
 # the the HWHDNOFF form field assigned to each item.
 #
         if (($checkboxopt ne '') && ($fieldname ne '')) {
-            $hiddennum = $fieldname.'\&HWHDNNUM\_'.$escres.':';
-            my $hiddenoff = $fieldname.'\&HWHDNOFF\_'.$escres.':';
+            $hiddennum = $fieldname.'\&HWHDNNUM'.$sep.$escres.':';
+            my $hiddenoff = $fieldname.'\&HWHDNOFF'.$sep.$escres.':';
             $result .= &Apache::lonxml::print_pdf_hidden_textfield($hiddenoff.'0',$checkboxoff).' ';
-            my $hiddenon = $fieldname.'\&HWHDNON\_'.$escres.':';
+            my $hiddenon = $fieldname.'\&HWHDNON'.$sep.$escres.':';
             $result .= &Apache::lonxml::print_pdf_hidden_textfield($hiddenon.'0',$checkboxopt).' ';
             if (!$no_tfprompt) {
                 $result .= ($checkboxchoices?&mt('Choices: ').
@@ -804,7 +807,7 @@
             }
         }
         if ($fieldname ne '') {
-            $fieldname .= '\&HWVAL\_'.$escres.':';
+            $fieldname .= '\&HWVAL'.$sep.$escres.':';
         }
     }
     foreach $name (@whichopt) {
Index: loncom/homework/radiobuttonresponse.pm
diff -u loncom/homework/radiobuttonresponse.pm:1.167 loncom/homework/radiobuttonresponse.pm:1.168
--- loncom/homework/radiobuttonresponse.pm:1.167	Sun Jun 21 19:46:33 2026
+++ loncom/homework/radiobuttonresponse.pm	Thu Aug  6 21:45:46 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # multiple choice style responses
 #
-# $Id: radiobuttonresponse.pm,v 1.167 2026/06/21 19:46:33 raeburn Exp $
+# $Id: radiobuttonresponse.pm,v 1.168 2026/08/06 21:45:46 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1142,13 +1142,16 @@
                                         $udom,$uname);
         if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
             ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}} ne '')) {
-            my $fieldname = 'uuid\_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}.
-                            '\&user\_'. $digest;
             my $escpart = $Apache::inputtags::part;
-            $escpart =~ s{_}{\\_}g;
             my $escres = $Apache::inputtags::response['-1'];
-            $escres =~ s{_}{\\_}g;
-            $fieldname .= '\&part\_'.$escpart.'\&radiobutton\&HWVAL\_'.$escres;
+            my $sep = '_';
+            if ($Apache::lonnet::texlive > 2013) {
+                $sep = '\_';
+                $escpart =~ s{_}{\\_}g;
+                $escres =~ s{_}{\\_}g;
+            }
+            my $fieldname = 'uuid'.$sep.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                           .'\&user'.$sep.$digest.'\&part'.$sep.$escpart.'\&radiobutton\&HWVAL'.$sep.$escres;
             $result = "\\begin{$venv}";
             foreach my $name ( @{$whichfoils} ) {
 	        $result .= '\item[{'
Index: loncom/homework/rankresponse.pm
diff -u loncom/homework/rankresponse.pm:1.79 loncom/homework/rankresponse.pm:1.80
--- loncom/homework/rankresponse.pm:1.79	Tue Mar 17 19:59:25 2026
+++ loncom/homework/rankresponse.pm	Thu Aug  6 21:45:46 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # rank style response
 #
-# $Id: rankresponse.pm,v 1.79 2026/03/17 19:59:25 raeburn Exp $
+# $Id: rankresponse.pm,v 1.80 2026/08/06 21:45:46 raeburn Exp $
 # Copyright Michigan State University Board of Trustees
 #
 # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
@@ -412,13 +412,16 @@
                                                  $udom,$uname);
                 if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
                     ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}} ne '')) {
-                    $fieldname = 'uuid\_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}.
-                                 '\&user\_'.$digest;
-                    my $escres = $id;
-                    $escres =~ s{_}{\\_}g;
                     my $escpart = $part;
-                    $escpart =~ s{_}{\\_}g;
-                    $fieldname .= '\&part\_'.$escpart.'\&rank\&HWVAL\_'.$escres.':';
+                    my $escres = $id;
+                    my $sep = '_';
+                    if ($Apache::lonnet::texlive > 2013) {
+                        $sep = '\_';
+                        $escpart =~ s{_}{\\_}g;
+                        $escres =~ s{_}{\\_}g;
+                    }
+                    $fieldname = 'uuid'.$sep.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                                .'\&user'.$sep.$digest.'\&part'.$sep.$escpart.'\&rank\&HWVAL'.$sep.$escres.':';
                     $result .= '\strut \\\\ \strut \\\\' ;
                 }
             }
Index: loncom/homework/structuretags.pm
diff -u loncom/homework/structuretags.pm:1.600 loncom/homework/structuretags.pm:1.601
--- loncom/homework/structuretags.pm:1.600	Mon May 11 11:49:47 2026
+++ loncom/homework/structuretags.pm	Thu Aug  6 21:45:46 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA 
 # definition of tags that give a structure to a document
 #
-# $Id: structuretags.pm,v 1.600 2026/05/11 11:49:47 raeburn Exp $
+# $Id: structuretags.pm,v 1.601 2026/08/06 21:45:46 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -2193,11 +2193,14 @@
                                                       $udom,$uname);
                     if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
                         ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) {
-                        my $fieldname = 'uuid\_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
-                                       .'&user\_'. $digest;
                         my $escpart = $Apache::inputtags::part;
-                        $escpart =~ s{_}{\\_}g;
-                        $fieldname .= '\&part\_'.$escpart.'\&text\&HWRNDSEED';
+                        my $sep = '_';
+                        if ($Apache::lonnet::texlive > 2013) {
+                            $sep = '\_';
+                            $escpart =~ s{_}{\\_}g;
+                        }
+                        my $fieldname = 'uuid'.$sep.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                                       .'\&user'.$sep.$digest.'\&part'.$sep.$escpart.'\&text\&HWRNDSEED';
                         $result .= &Apache::lonxml::print_pdf_hidden_textfield($fieldname,$practice_rndseed);
                     }
                 }
Index: loncom/lonnet/perl/lonnet.pm
diff -u loncom/lonnet/perl/lonnet.pm:1.1545 loncom/lonnet/perl/lonnet.pm:1.1546
--- loncom/lonnet/perl/lonnet.pm:1.1545	Fri Jun 12 17:46:14 2026
+++ loncom/lonnet/perl/lonnet.pm	Thu Aug  6 21:45:46 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # TCP networking package
 #
-# $Id: lonnet.pm,v 1.1545 2026/06/12 17:46:14 raeburn Exp $
+# $Id: lonnet.pm,v 1.1546 2026/08/06 21:45:46 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -79,7 +79,7 @@
 
 use vars qw(%perlvar %spareid %pr %prp $memcache %packagetab $tmpdir $deftex
             $_64bit %env %protocol %loncaparevs %serverhomeIDs %needsrelease
-            %managerstab $passwdmin);
+            %managerstab $passwdmin $texlive);
 
 my (%badServerCache, $memcache, %courselogs, %accesshash, %domainrolehash,
     %userrolehash, $processmarker, $dumpcount, %coursedombuf,
@@ -16864,6 +16864,11 @@
     $passwdmin = LONCAPA::passwd_min();
 }
 
+# ------------- get TeXLive version
+{
+    $texlive = LONCAPA::texlive_year();
+}
+
 $memcache=new Cache::Memcached({'servers'           => ['127.0.0.1:11211'],
 				'compress_threshold'=> 20_000,
  			        });
Index: loncom/LONCAPA.pm
diff -u loncom/LONCAPA.pm:1.36 loncom/LONCAPA.pm:1.37
--- loncom/LONCAPA.pm:1.36	Sun Aug 25 02:43:33 2019
+++ loncom/LONCAPA.pm	Thu Aug  6 21:45:47 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Base routines
 #
-# $Id: LONCAPA.pm,v 1.36 2019/08/25 02:43:33 raeburn Exp $
+# $Id: LONCAPA.pm,v 1.37 2026/08/06 21:45:47 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -37,6 +37,7 @@
 use Fcntl qw(:flock);
 use GDBM_File;
 use POSIX;
+use IPC::Cmd qw(can_run);
 #use Apache::lonnet;
 
 my $loncapa_max_wait_time = 13;
@@ -163,6 +164,23 @@
     return 7;
 }
 
+# Return the year of the TeX Live available on this server.
+
+sub texlive_year {
+    my ($latex,$year);
+    $latex = can_run('latex');
+    if ($latex ne '') {
+        my @args = ($latex,'--version','2>&1');
+        if (open(my $pipe,'-|', at args)) {
+            my $line = <$pipe>;
+            chomp($line);
+            ($year) = ($line =~ /\QTeX Live\E\s+(\d+)/);
+            close($pipe);
+        }
+    }
+    return $year;
+}
+
 #----------------------------------------------------------------------
 #
 #  some of these subs need a bit of documentation


More information about the LON-CAPA-cvs mailing list