[LON-CAPA-cvs] cvs: loncom /homework essayresponse.pm inputtags.pm matchresponse.pm optionresponse.pm radiobuttonresponse.pm rankresponse.pm structuretags.pm /xml lonxml.pm

raeburn raeburn at source.lon-capa.org
Fri Aug 7 15:41:00 EDT 2026


raeburn		Fri Aug  7 19:41:00 2026 EDT

  Modified files:              
    /loncom/homework	essayresponse.pm inputtags.pm matchresponse.pm 
                    	optionresponse.pm radiobuttonresponse.pm 
                    	rankresponse.pm structuretags.pm 
    /loncom/xml	lonxml.pm 
  Log:
  - Better solution for underscores in fieldnames in PDF forms in SLES12.
    Instead of conditionally escaping underscores based on TeX Live version,
    simply leave all underscores and ampersands unescaped in fieldnames and
    use \detokenize{$fieldname} for all distros.
  
  
-------------- next part --------------
Index: loncom/homework/essayresponse.pm
diff -u loncom/homework/essayresponse.pm:1.131 loncom/homework/essayresponse.pm:1.132
--- loncom/homework/essayresponse.pm:1.131	Thu Aug  6 21:45:46 2026
+++ loncom/homework/essayresponse.pm	Fri Aug  7 19:41:00 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # essay (ungraded) style responses
 #
-# $Id: essayresponse.pm,v 1.131 2026/08/06 21:45:46 raeburn Exp $
+# $Id: essayresponse.pm,v 1.132 2026/08/07 19:41:00 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -146,19 +146,11 @@
                                              $udom,$uname);
             if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
                 ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) {
-                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'.$sep.$escid;
+                my $fieldname = 'uuid_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                               .'&user_'.$digest
+                               .'&part_'.$part
+                               .'&essay'
+                               .'&HWDRAFT_'.$id;
                 return "\\begin{itemize}"
                       .'\item[{'
                       .&Apache::lonxml::print_pdf_radiobutton($fieldname,'yes')
Index: loncom/homework/inputtags.pm
diff -u loncom/homework/inputtags.pm:1.377 loncom/homework/inputtags.pm:1.378
--- loncom/homework/inputtags.pm:1.377	Thu Aug  6 21:45:46 2026
+++ loncom/homework/inputtags.pm	Fri Aug  7 19:41:00 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # input definitions
 #
-# $Id: inputtags.pm,v 1.377 2026/08/06 21:45:46 raeburn Exp $
+# $Id: inputtags.pm,v 1.378 2026/08/07 19:41:00 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -549,20 +549,11 @@
                                                  $udom,$uname);
                 if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
                     ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) {
-                    my $sep = '_';
-                    my $escpart = $Apache::inputtags::part;
-                    my $escres = $Apache::inputtags::response[-1];
-                    my $escid = $input_id;
-                    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}';
+                    my $resp = $Apache::inputtags::response[-1];
+                    my $fieldname = 'uuid_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                                   .'&user_'.$digest.'&part_'.$Apache::inputtags::part.'&text&HWVAL_'
+                                   .$resp.'&ID_'.$input_id;
+                    $result='\textField{\detokenize{'.$fieldname.'}}{'.$size.'}{12 bp}';
                 }
             }
         }
Index: loncom/homework/matchresponse.pm
diff -u loncom/homework/matchresponse.pm:1.101 loncom/homework/matchresponse.pm:1.102
--- loncom/homework/matchresponse.pm:1.101	Thu Aug  6 21:45:46 2026
+++ loncom/homework/matchresponse.pm	Fri Aug  7 19:41:00 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Full matching style response
 #
-# $Id: matchresponse.pm,v 1.101 2026/08/06 21:45:46 raeburn Exp $
+# $Id: matchresponse.pm,v 1.102 2026/08/07 19:41:00 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -679,7 +679,7 @@
         } else {
             $numrows = 1;
         }
-        my ($fieldname,$escpart,$sep);
+        my $fieldname;
         if (($Apache::lonhomework::type ne 'exam') &&
             ($target eq 'tex' and $env{'form.pdfFormFields'} eq 'yes'
              && $Apache::inputtags::status[-1] eq 'CAN_ANSWER')) {
@@ -690,16 +690,9 @@
                                                  $udom,$uname);
                 if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
                     ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}} ne '')) {
-                    $escpart = $Apache::inputtags::part;
-                    my $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.'\&match\&HWVAL'.$sep.$escres.':';
+                    my $resp = $Apache::inputtags::response['-1'];
+                    $fieldname = 'uuid_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                                .'&user_'.$digest.'&part_'.$Apache::inputtags::part.'&match&HWVAL_'.$resp.':';
                 }
             }
         }
@@ -713,7 +706,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'.$sep.$escpart.'\&');
+                        $optionlist = &Apache::lonxml::print_pdf_start_combobox($fieldname.$temp.'&submit_'.$Apache::inputtags::part.'&');
                     } else {
                         $optionlist='\framebox[10 mm][s]{\tiny\strut}';
                     }
Index: loncom/homework/optionresponse.pm
diff -u loncom/homework/optionresponse.pm:1.211 loncom/homework/optionresponse.pm:1.212
--- loncom/homework/optionresponse.pm:1.211	Thu Aug  6 21:45:46 2026
+++ loncom/homework/optionresponse.pm	Fri Aug  7 19:41:00 2026
@@ -1,7 +1,7 @@
 # LearningOnline Network with CAPA
 # option list style responses
 #
-# $Id: optionresponse.pm,v 1.211 2026/08/06 21:45:46 raeburn Exp $
+# $Id: optionresponse.pm,v 1.212 2026/08/07 19:41:00 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -750,27 +750,20 @@
                      &mt('Select all that are [_1].','<b>'.$checkboxopt.'</b>');
         }
     }
-    my ($fieldname,$checkboxoff,$hiddennum,$sep);
+    my ($fieldname,$checkboxoff,$hiddennum);
     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();
-        my $escres;
+        my $resp;
         if (($env{'request.symb'}) && ($env{'request.course.id'})) {
             my %uuids = &Apache::lonnet::get('nohist_formfields',
                                              [$env{'request.course.id'}.':'.$env{'request.symb'}],
                                              $udom,$uname);
             if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
                 ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}} ne '')) {
-                my $escpart = $Apache::inputtags::part;
-                $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';
+                $resp = $Apache::inputtags::response['-1']; 
+                $fieldname = 'uuid_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                            .'&user_'.$digest.'&part_'.$Apache::inputtags::part.'\&option';
             }
         }
         ($checkboxopt,$checkboxoff)=&check_box_opt($target,$checkboxvalue, at opt);
@@ -794,10 +787,10 @@
 # the the HWHDNOFF form field assigned to each item.
 #
         if (($checkboxopt ne '') && ($fieldname ne '')) {
-            $hiddennum = $fieldname.'\&HWHDNNUM'.$sep.$escres.':';
-            my $hiddenoff = $fieldname.'\&HWHDNOFF'.$sep.$escres.':';
+            $hiddennum = $fieldname.'&HWHDNNUM_'.$resp.':';
+            my $hiddenoff = $fieldname.'&HWHDNOFF_'.$resp.':';
             $result .= &Apache::lonxml::print_pdf_hidden_textfield($hiddenoff.'0',$checkboxoff).' ';
-            my $hiddenon = $fieldname.'\&HWHDNON'.$sep.$escres.':';
+            my $hiddenon = $fieldname.'&HWHDNON_'.$resp.':';
             $result .= &Apache::lonxml::print_pdf_hidden_textfield($hiddenon.'0',$checkboxopt).' ';
             if (!$no_tfprompt) {
                 $result .= ($checkboxchoices?&mt('Choices: ').
@@ -807,7 +800,7 @@
             }
         }
         if ($fieldname ne '') {
-            $fieldname .= '\&HWVAL'.$sep.$escres.':';
+            $fieldname .= '&HWVAL_'.$resp.':';
         }
     }
     foreach $name (@whichopt) {
Index: loncom/homework/radiobuttonresponse.pm
diff -u loncom/homework/radiobuttonresponse.pm:1.168 loncom/homework/radiobuttonresponse.pm:1.169
--- loncom/homework/radiobuttonresponse.pm:1.168	Thu Aug  6 21:45:46 2026
+++ loncom/homework/radiobuttonresponse.pm	Fri Aug  7 19:41:00 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # multiple choice style responses
 #
-# $Id: radiobuttonresponse.pm,v 1.168 2026/08/06 21:45:46 raeburn Exp $
+# $Id: radiobuttonresponse.pm,v 1.169 2026/08/07 19:41:00 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1142,16 +1142,9 @@
                                         $udom,$uname);
         if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
             ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}} ne '')) {
-            my $escpart = $Apache::inputtags::part;
-            my $escres = $Apache::inputtags::response['-1'];
-            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;
+            my $resp = $Apache::inputtags::response['-1'];
+            my $fieldname = 'uuid_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                           .'&user_'.$digest.'&part_'.$Apache::inputtags::part.'&radiobutton&HWVAL_'.$resp;
             $result = "\\begin{$venv}";
             foreach my $name ( @{$whichfoils} ) {
 	        $result .= '\item[{'
Index: loncom/homework/rankresponse.pm
diff -u loncom/homework/rankresponse.pm:1.80 loncom/homework/rankresponse.pm:1.81
--- loncom/homework/rankresponse.pm:1.80	Thu Aug  6 21:45:46 2026
+++ loncom/homework/rankresponse.pm	Fri Aug  7 19:41:00 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # rank style response
 #
-# $Id: rankresponse.pm,v 1.80 2026/08/06 21:45:46 raeburn Exp $
+# $Id: rankresponse.pm,v 1.81 2026/08/07 19:41:00 raeburn Exp $
 # Copyright Michigan State University Board of Trustees
 #
 # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
@@ -412,16 +412,8 @@
                                                  $udom,$uname);
                 if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
                     ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}} ne '')) {
-                    my $escpart = $part;
-                    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.':';
+                    $fieldname = 'uuid_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                                .'&user_'.$digest.'&part_'.$part.'&rank&HWVAL_'.$id.':';
                     $result .= '\strut \\\\ \strut \\\\' ;
                 }
             }
Index: loncom/homework/structuretags.pm
diff -u loncom/homework/structuretags.pm:1.601 loncom/homework/structuretags.pm:1.602
--- loncom/homework/structuretags.pm:1.601	Thu Aug  6 21:45:46 2026
+++ loncom/homework/structuretags.pm	Fri Aug  7 19:41:00 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.601 2026/08/06 21:45:46 raeburn Exp $
+# $Id: structuretags.pm,v 1.602 2026/08/07 19:41:00 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -2193,14 +2193,8 @@
                                                       $udom,$uname);
                     if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
                         ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) {
-                        my $escpart = $Apache::inputtags::part;
-                        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';
+                        my $fieldname = 'uuid_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                                       .'&user_'.$digest.'&part_'.$Apache::inputtags::part.'&text&HWRNDSEED';
                         $result .= &Apache::lonxml::print_pdf_hidden_textfield($fieldname,$practice_rndseed);
                     }
                 }
Index: loncom/xml/lonxml.pm
diff -u loncom/xml/lonxml.pm:1.583 loncom/xml/lonxml.pm:1.584
--- loncom/xml/lonxml.pm:1.583	Wed May 13 23:14:12 2026
+++ loncom/xml/lonxml.pm	Fri Aug  7 19:41:00 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # XML Parser Module
 #
-# $Id: lonxml.pm,v 1.583 2026/05/13 23:14:12 raeburn Exp $
+# $Id: lonxml.pm,v 1.584 2026/08/07 19:41:00 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -2522,8 +2522,8 @@
 =cut
 sub print_pdf_radiobutton {
     my ($fieldname, $value) = @_;
-    return '\radioButton[\symbolchoice{circle}]{'
-           .$fieldname.'}{10bp}{10bp}{'.$value.'}';
+    return '\radioButton[\symbolchoice{circle}]{\detokenize{'
+           .$fieldname.'}}{10bp}{10bp}{'.$value.'}';
 }
 
 =pod
@@ -2538,7 +2538,7 @@
 =cut
 sub print_pdf_checkbox {
     my ($fieldname, $value) = @_;
-    return '\checkBox{'.$fieldname.'}{10bp}{10bp}{'.$value.'}';
+    return '\checkBox{\detokenize{'.$fieldname.'}}{10bp}{10bp}{'.$value.'}';
 }
 
 =pod
@@ -2553,7 +2553,7 @@
 =cut
 sub print_pdf_hidden_textfield {
     my ($fieldname, $value) = @_;
-    return '\textField[\F{\FHidden}\F{-\FPrint}\BC{1 1 1}\textSize{1}\textColor{1 g}\V{'.$value.'}]{'.$fieldname.'}{0mm}{0mm}';
+    return '\textField[\F{\FHidden}\F{-\FPrint}\BC{1 1 1}\textSize{1}\textColor{1 g}\V{'.$value.'}]{\detokenize{'.$fieldname.'}}{0mm}{0mm}';
 }
 
 =pod
@@ -2569,7 +2569,7 @@
     my $result;
     my ($fieldName) = @_;
     $result .= '\begin{tabularx}{\textwidth}{p{2.5cm}X}'."\n";
-    $result .= '\comboBox[]{'.$fieldName.'}{2.3cm}{14bp}{'; #
+    $result .= '\comboBox[]{\detokenize{'.$fieldName.'}}{2.3cm}{14bp}{'; #
 
     return $result;
 }
@@ -2628,7 +2628,7 @@
     my $result;
     my ($fieldname, $user, $domain) = @_;
 
-    $result .= '\textField [\F{\FHidden}\F{-\FPrint}\V{'.$domain.'&'.$user.'}]{'.$fieldname.'}{0in}{0in}'."\n";
+    $result .= '\textField [\F{\FHidden}\F{-\FPrint}\V{'.$domain.'&'.$user.'}]{\detokenize{'.$fieldname.'}}{0in}{0in}'."\n";
 
     return $result;
 }


More information about the LON-CAPA-cvs mailing list