[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