From lon-capa-cvs-allow@mail.lon-capa.org Mon Jan 28 09:40:51 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (lon-capa-cvs-allow@mail.lon-capa.org) Date: Mon, 28 Jan 2008 04:40:51 -0500 Subject: [LON-CAPA-cvs] January 71% OFF Message-ID: <20080128154052.3611.qmail@comp>
From lon-capa-cvs-allow@mail.lon-capa.org Mon Jan 28 10:32:48 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (foxr) Date: Mon, 28 Jan 2008 10:32:48 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface lonsimplepage.pm Message-ID: foxr Mon Jan 28 05:32:48 2008 EDT Modified files: /loncom/interface lonsimplepage.pm Log: BZ5548 - Don't interpret latex -> html if the output's going to be latex anyway. This prevents that sort of infinite looping. Index: loncom/interface/lonsimplepage.pm diff -u loncom/interface/lonsimplepage.pm:1.53 loncom/interface/lonsimplepage.pm:1.54 --- loncom/interface/lonsimplepage.pm:1.53 Fri Jan 18 11:41:27 2008 +++ loncom/interface/lonsimplepage.pm Mon Jan 28 05:32:47 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network # Simple Page Editor # -# $Id: lonsimplepage.pm,v 1.53 2008/01/18 16:41:27 raeburn Exp $ +# $Id: lonsimplepage.pm,v 1.54 2008/01/28 10:32:47 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -299,7 +299,11 @@ if ($allowed) { $message=&Apache::lonspeller::markeduptext($message); } - $message=&Apache::lontexconvert::msgtexconverted($message); + &Apache::lonnet::logthis("Prior to texconvert: '$message'"); + if ($target ne 'tex') { + $message=&Apache::lontexconvert::msgtexconverted($message); + } + &Apache::lonnet::logthis("After texconvert: '$message'"); if ($field eq 'abb_links' && $group ne '') { $r->print('
'); @@ -327,8 +331,10 @@ } else { if (($field ne 'bbb_content') || ($allowed)) { if ($target ne 'tex') { + &Apache::lonnet::logthis("contents in web presentation '$syllabusfields{$field}'"); $r->print('

'.$syllabusfields{$field}.'

'); } else { + &Apache::lonnet::logthis("contents in tex presentation '$syllabusfields{$field}'"); my $safeinit; $r->print(&Apache::lonxml::xmlparse($r,'tex','

'.$syllabusfields{$field}.'

')); } From lon-capa-cvs-allow@mail.lon-capa.org Mon Jan 28 10:37:35 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (foxr) Date: Mon, 28 Jan 2008 10:37:35 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface lonsimplepage.pm Message-ID: foxr Mon Jan 28 05:37:35 2008 EDT Modified files: /loncom/interface lonsimplepage.pm Log: Remove log spew. Index: loncom/interface/lonsimplepage.pm diff -u loncom/interface/lonsimplepage.pm:1.54 loncom/interface/lonsimplepage.pm:1.55 --- loncom/interface/lonsimplepage.pm:1.54 Mon Jan 28 05:32:47 2008 +++ loncom/interface/lonsimplepage.pm Mon Jan 28 05:37:33 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network # Simple Page Editor # -# $Id: lonsimplepage.pm,v 1.54 2008/01/28 10:32:47 foxr Exp $ +# $Id: lonsimplepage.pm,v 1.55 2008/01/28 10:37:33 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -299,11 +299,9 @@ if ($allowed) { $message=&Apache::lonspeller::markeduptext($message); } - &Apache::lonnet::logthis("Prior to texconvert: '$message'"); if ($target ne 'tex') { $message=&Apache::lontexconvert::msgtexconverted($message); } - &Apache::lonnet::logthis("After texconvert: '$message'"); if ($field eq 'abb_links' && $group ne '') { $r->print('
'); @@ -331,10 +329,8 @@ } else { if (($field ne 'bbb_content') || ($allowed)) { if ($target ne 'tex') { - &Apache::lonnet::logthis("contents in web presentation '$syllabusfields{$field}'"); $r->print('

'.$syllabusfields{$field}.'

'); } else { - &Apache::lonnet::logthis("contents in tex presentation '$syllabusfields{$field}'"); my $safeinit; $r->print(&Apache::lonxml::xmlparse($r,'tex','

'.$syllabusfields{$field}.'

')); } From lon-capa-cvs-allow@mail.lon-capa.org Mon Jan 28 11:24:49 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (foxr) Date: Mon, 28 Jan 2008 11:24:49 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface printout.pl Message-ID: foxr Mon Jan 28 06:24:49 2008 EDT Modified files: /loncom/interface printout.pl Log: BZ5548 - Timeout latex jobs that don't make dvi file grow after 10 seconds. Index: loncom/interface/printout.pl diff -u loncom/interface/printout.pl:1.128 loncom/interface/printout.pl:1.129 --- loncom/interface/printout.pl:1.128 Thu Oct 11 18:49:49 2007 +++ loncom/interface/printout.pl Mon Jan 28 06:24:48 2008 @@ -1,7 +1,7 @@ #!/usr/bin/perl # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc. # -# $Id: printout.pl,v 1.128 2007/10/11 22:49:49 albertel Exp $ +# $Id: printout.pl,v 1.129 2008/01/28 11:24:48 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -379,14 +379,14 @@ my $dvi_file= $name_file; $dvi_file =~ s/\.tex/$name_range\.dvi/; &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null", "for $status_statement now LaTeXing file", - \%prog_state,$dvi_file); + \%prog_state,$dvi_file, 10); if ($tableofcontents eq 'yes') { &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null", "for $status_statement First LaTeX of file for table of contents", - \%prog_state,$dvi_file); + \%prog_state,$dvi_file, 10); &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null", "for $status_statement Second LaTeX of file for table of contents", - \%prog_state,$dvi_file); + \%prog_state,$dvi_file,10); } #to create table of contents my $idxname=$name_file; $idxname=~s/\.tex$/\.idx/; @@ -396,7 +396,7 @@ \%prog_state,$idxname); &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null", "for $status_statement now LaTeXing file for index section", - \%prog_state,$dvi_file); + \%prog_state,$dvi_file,10); } #to create index #Do we have a latex error in the log file? my $logfilename = $texfile; $logfilename =~ s/\.tex$/\.log/; @@ -512,14 +512,14 @@ # &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null", "for $status_statement first latex to repaginate", - \%prog_state, $name_file); + \%prog_state, $name_file,10); if ($tableofcontents eq 'yes') { &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null", "for $status_statement second latex to repaginate", - \%prog_state, $name_file); + \%prog_state, $name_file,10); &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null", "for $status_statement third latex to repaginate", - \%prog_state, $name_file); + \%prog_state, $name_file,10); } if ($tableofindex eq 'yes') { my $idxname = $latex_file; @@ -529,7 +529,7 @@ \%prog_state, $idxname); &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null", "for $status_statement now Recreting index (latex)", - \%prog_state, $dvi_file); + \%prog_state, $dvi_file,10); } &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null", @@ -685,14 +685,14 @@ &repaginate($new_name_file, $latex_file, $numberofcolumns); &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null", "for $status_statement first latex to repaginate", - \%prog_state, $name_file); + \%prog_state, $name_file,10); if ($tableofcontents eq 'yes') { &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null", "for $status_statement second latex to repaginate", - \%prog_state, $name_file); + \%prog_state, $name_file,10); &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null", "for $status_statement third latex to repaginate", - \%prog_state, $name_file); + \%prog_state, $name_file,10); } if ($tableofindex eq 'yes') { my $idxname = $latex_file; @@ -702,7 +702,7 @@ \%prog_state, $idxname); &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null", "for $status_statement now Recreting index (latex)", - \%prog_state, $dvi_file); + \%prog_state, $dvi_file,10); } &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null", "for $status_statement dvips to repaginate", @@ -794,9 +794,17 @@ sub REAPER { $done=1; } - +# +# Execute a command updating the status window as the command's +# output file builds up (at intervals of a second). +# +# If the timeout argument defined, then if that many seconds +# elapses without an increase in the size of the output file, +# the command will be killed (this deals with the case when +# latex crawls into an infinite loop). +# sub busy_wait_command { - my ($command,$message,$progress_win,$output_file)=@_; + my ($command,$message,$progress_win,$output_file, $timeout)=@_; $SIG{CHLD} = \&REAPER; $done=0; @@ -804,12 +812,23 @@ if ($advanced_role) { &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,$message); } + my $last_size = 0; + my $unchanged_time = 0; while(!$done) { sleep 1; my $extra_msg; if ($output_file) { my $size=(stat($output_file))[7]; $extra_msg=", $size bytes generated"; + if ($size == $last_size) { + $unchanged_time++; + if ($timeout && ($unchanged_time > $timeout)) { + kill(9, $pid); # Reaper will do the rest...I hope there's errors in the log. + } + } else { + $last_size = $size; + $unchanged_time = 0; + } } if ($advanced_role) { &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win, From lon-capa-cvs-allow@mail.lon-capa.org Mon Jan 28 11:40:44 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (foxr) Date: Mon, 28 Jan 2008 11:40:44 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface lonprintout.pm Message-ID: foxr Mon Jan 28 06:40:44 2008 EDT Modified files: /loncom/interface lonprintout.pm Log: BZ5554 - Add support for ldquo, rdquo entities and their decimal equivalent entities. Index: loncom/interface/lonprintout.pm diff -u loncom/interface/lonprintout.pm:1.512 loncom/interface/lonprintout.pm:1.513 --- loncom/interface/lonprintout.pm:1.512 Mon Jan 21 05:24:23 2008 +++ loncom/interface/lonprintout.pm Mon Jan 28 06:40:42 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.512 2008/01/21 10:24:23 foxr Exp $ +# $Id: lonprintout.pm,v 1.513 2008/01/28 11:40:42 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -755,6 +755,13 @@ $result =~ s/&\#8600;/\\ensuremath\{\\searrow\}/g; $result =~ s/&\#8601;/\\ensuremath\{\\swarrow\}/g; $result =~ s/&\#8598;/\\ensuremath\{\\nwarrow\}/g; + + # Left/right quotations: + + $result =~ s/&(ldquo|#8220);/\`\`/g; + $result =~ s/&(rdquo|#8221);/\'\'/g; + + return $result; } From lon-capa-cvs-allow@mail.lon-capa.org Mon Jan 28 20:41:47 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (lon-capa-cvs-allow@mail.lon-capa.org) Date: Mon, 28 Jan 2008 15:41:47 -0500 Subject: [LON-CAPA-cvs] January 72% OFF Message-ID: <20080128104202.19208.qmail@adsl-dyn141.91-127-119.t-com.sk>
From lon-capa-cvs-allow@mail.lon-capa.org Mon Jan 28 21:42:30 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (www) Date: Mon, 28 Jan 2008 21:42:30 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /homework inputtags.pm structuretags.pm Message-ID: www Mon Jan 28 16:42:30 2008 EDT Modified files: /loncom/homework inputtags.pm structuretags.pm Log: Bug #5601: Better info that this is a practice problem Index: loncom/homework/inputtags.pm diff -u loncom/homework/inputtags.pm:1.236 loncom/homework/inputtags.pm:1.237 --- loncom/homework/inputtags.pm:1.236 Mon Jan 14 09:32:14 2008 +++ loncom/homework/inputtags.pm Mon Jan 28 16:42:28 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # input definitons # -# $Id: inputtags.pm,v 1.236 2008/01/14 14:32:14 raeburn Exp $ +# $Id: inputtags.pm,v 1.237 2008/01/28 21:42:28 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -672,7 +672,8 @@ if (($symb ne '') && ($env{'course.'.$env{'request.course.id'}. - '.disable_receipt_display'} ne 'yes')) { + '.disable_receipt_display'} ne 'yes') && + ($Apache::lonhomework::type ne 'practice')) { $message.=(($target eq 'web')?'
':' '). &mt('Your receipt is [_1]', (&Apache::lonnet::receipt($Apache::inputtags::part). @@ -844,6 +845,10 @@ $message.= $computer; $added_computer_text=1; } + if ($Apache::lonhomework::type eq 'practice') { + $message.='
'.&mt('Submissions to practice problems are not permanently recorded.'); + } + return ($button,$css_class,$message,$previousmsg); } Index: loncom/homework/structuretags.pm diff -u loncom/homework/structuretags.pm:1.416 loncom/homework/structuretags.pm:1.417 --- loncom/homework/structuretags.pm:1.416 Mon Jan 14 22:09:09 2008 +++ loncom/homework/structuretags.pm Mon Jan 28 16:42:28 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: structuretags.pm,v 1.416 2008/01/15 03:09:09 raeburn Exp $ +# $Id: structuretags.pm,v 1.417 2008/01/28 21:42:28 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -862,6 +862,10 @@ $form_tag_start.= ' />'.&mt(' Show All Foils'). ''; } + if ($Apache::lonhomework::type eq 'practice') { + $form_tag_start.='

'.&mt('Practice Problem').'

'. + ''.&mt('Submissions are not permanently recorded').''; + } $form_tag_start.='
'; } From lon-capa-cvs-allow@mail.lon-capa.org Tue Jan 29 06:20:47 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (lon-capa-cvs-allow@mail.lon-capa.org) Date: Tue, 29 Jan 2008 01:20:47 -0500 Subject: [LON-CAPA-cvs] January 73% OFF Message-ID: <20080129102049.7970.qmail@st>
From lon-capa-cvs-allow@mail.lon-capa.org Tue Jan 29 11:04:11 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (foxr) Date: Tue, 29 Jan 2008 11:04:11 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /xml lontexconvert.pm Message-ID: foxr Tue Jan 29 06:04:11 2008 EDT Modified files: /loncom/xml lontexconvert.pm Log: BZ5593 - postprocess converted latex so that \rightleftharpoons -> ⇔ which is a double left/right arrow and is going to have to be close enough. Index: loncom/xml/lontexconvert.pm diff -u loncom/xml/lontexconvert.pm:1.84 loncom/xml/lontexconvert.pm:1.85 --- loncom/xml/lontexconvert.pm:1.84 Tue Aug 14 15:32:35 2007 +++ loncom/xml/lontexconvert.pm Tue Jan 29 06:04:10 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # TeX Conversion Module # -# $Id: lontexconvert.pm,v 1.84 2007/08/14 19:32:35 albertel Exp $ +# $Id: lontexconvert.pm,v 1.85 2008/01/29 11:04:10 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -85,6 +85,7 @@ # into the safe space since opcode checks only occur at compile time sub convert_real { my ($texstring)=@_; + &Apache::lonnet::logthis("convert_real converting '$$texstring"); my ($xmlstring,$errorstring); local $SIG{SEGV}=sub { $Apache::lontexconvert::messedup=1; die; }; local $SIG{ALRM}=sub { @@ -95,12 +96,14 @@ }; &Apache::lonxml::start_alarm(); if ($env{'browser.mathml'}) { + &Apache::lonnet::logthis("mathml translation"); $xmlstring=&tth::ttm($$texstring); $xmlstring=~s/\/\/g; $xmlstring=~s/\/\/g; $xmlstring=~s/\/\\<\/p\>/g; $errorstring.=&tth::ttmerror(); } else { + &Apache::lonnet::logthis("tth translation"); $xmlstring=&tth::tth($$texstring); $errorstring.=&tth::ttherror(); $xmlstring=~s---g; @@ -108,6 +111,14 @@ $xmlstring=~s/^\s*\
foxr Tue Jan 29 06:18:07 2008 EDT Modified files: /loncom/xml lontexconvert.pm Log: As usual forgot to remove the debug logging Index: loncom/xml/lontexconvert.pm diff -u loncom/xml/lontexconvert.pm:1.85 loncom/xml/lontexconvert.pm:1.86 --- loncom/xml/lontexconvert.pm:1.85 Tue Jan 29 06:04:10 2008 +++ loncom/xml/lontexconvert.pm Tue Jan 29 06:18:06 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # TeX Conversion Module # -# $Id: lontexconvert.pm,v 1.85 2008/01/29 11:04:10 foxr Exp $ +# $Id: lontexconvert.pm,v 1.86 2008/01/29 11:18:06 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -85,7 +85,6 @@ # into the safe space since opcode checks only occur at compile time sub convert_real { my ($texstring)=@_; - &Apache::lonnet::logthis("convert_real converting '$$texstring"); my ($xmlstring,$errorstring); local $SIG{SEGV}=sub { $Apache::lontexconvert::messedup=1; die; }; local $SIG{ALRM}=sub { @@ -96,14 +95,12 @@ }; &Apache::lonxml::start_alarm(); if ($env{'browser.mathml'}) { - &Apache::lonnet::logthis("mathml translation"); $xmlstring=&tth::ttm($$texstring); $xmlstring=~s/\/\/g; $xmlstring=~s/\/\/g; $xmlstring=~s/\/\\<\/p\>/g; $errorstring.=&tth::ttmerror(); } else { - &Apache::lonnet::logthis("tth translation"); $xmlstring=&tth::tth($$texstring); $errorstring.=&tth::ttherror(); $xmlstring=~s---g; @@ -118,7 +115,6 @@ # $xmlstring=~s/\\rightleftharpoons/\&\#8660;/g; - &Apache::lonnet::logthis("Final result: $xmlstring"); &Apache::lonxml::end_alarm(); return ($xmlstring,$errorstring); } From lon-capa-cvs-allow@mail.lon-capa.org Tue Jan 29 11:21:20 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (foxr) Date: Tue, 29 Jan 2008 11:21:20 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface lonprintout.pm Message-ID: foxr Tue Jan 29 06:21:20 2008 EDT Modified files: /loncom/interface lonprintout.pm Log: BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ551 8 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Mak e legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Let ter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5 518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - M ake legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make leg al column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal colu mn width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column widt h sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter.BZ5518 - Make legal column width sme as for Letter. Index: loncom/interface/lonprintout.pm diff -u loncom/interface/lonprintout.pm:1.513 loncom/interface/lonprintout.pm:1.514 --- loncom/interface/lonprintout.pm:1.513 Mon Jan 28 06:40:42 2008 +++ loncom/interface/lonprintout.pm Tue Jan 29 06:21:18 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.513 2008/01/28 11:40:42 foxr Exp $ +# $Id: lonprintout.pm,v 1.514 2008/01/29 11:21:18 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -781,7 +781,7 @@ 'legal' => { 'book' => { '1' => ['7.1 in','13 in',,'-0.57 in','-0.57 in','-0.5 in'], - '2' => ['3.16 in','13 in','-0.57 in','-0.57 in','-0.5 in'] + '2' => ['3.66 in','13 in','-0.57 in','-0.57 in','-0.5 in'] }, 'album' => { '1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'], From lon-capa-cvs-allow@mail.lon-capa.org Tue Jan 29 13:26:13 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (www) Date: Tue, 29 Jan 2008 13:26:13 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /localize lonlocal.pm Message-ID: www Tue Jan 29 08:26:13 2008 EDT Modified files: /loncom/localize lonlocal.pm Log: Bug #5609: In America, the week starts with Sunday. But elsewhere ... Index: loncom/localize/lonlocal.pm diff -u loncom/localize/lonlocal.pm:1.42 loncom/localize/lonlocal.pm:1.43 --- loncom/localize/lonlocal.pm:1.42 Thu Oct 18 17:08:31 2007 +++ loncom/localize/lonlocal.pm Tue Jan 29 08:26:09 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Localization routines # -# $Id: lonlocal.pm,v 1.42 2007/10/18 21:08:31 albertel Exp $ +# $Id: lonlocal.pm,v 1.43 2008/01/29 13:26:09 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -289,7 +289,8 @@ my $day = $dt->day_of_month(); my $mon = $dt->month()-1; my $year = $dt->year(); - my $wday = $dt->wday()-1; + my $wday = $dt->wday(); + if ($wday==7) { $wday=0; } my $month =(split(/\,/,$lh->maketext('date_months')))[$mon]; my $weekday=(split(/\,/,$lh->maketext('date_days')))[$wday]; if ($seconds<10) { From lon-capa-cvs-allow@mail.lon-capa.org Tue Jan 29 17:36:58 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (bisitz) Date: Tue, 29 Jan 2008 17:36:58 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface lonsupportreq.pm Message-ID: bisitz Tue Jan 29 12:36:58 2008 EDT Modified files: /loncom/interface lonsupportreq.pm Log: Localization: - Added missing &mt() - Optimized some &mt() calls Index: loncom/interface/lonsupportreq.pm diff -u loncom/interface/lonsupportreq.pm:1.46 loncom/interface/lonsupportreq.pm:1.47 --- loncom/interface/lonsupportreq.pm:1.46 Sun Jan 13 11:53:46 2008 +++ loncom/interface/lonsupportreq.pm Tue Jan 29 12:36:56 2008 @@ -1,5 +1,5 @@ # -# $Id: lonsupportreq.pm,v 1.46 2008/01/13 16:53:46 raeburn Exp $ +# $Id: lonsupportreq.pm,v 1.47 2008/01/29 17:36:56 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -762,17 +762,20 @@ login => 'Log-in help', ask => 'Ask helpdesk', getst => 'Getting started guide', - back => 'Back to last location' + back => 'Back to last location', + headline => 'help/support', ); - my ($getstartlink,$getstarttext); + my ($getstartlink,$reviewtext); if (-e $Apache::lonnet::perlvar{'lonDocRoot'}.'/adm/gettingstarted.html') { $getstartlink = qq| 
$lt{'getst'}|; - $getstarttext = ' '.&mt('and the "Getting started" guide').' '; + $reviewtext = &mt('Please review the information in "Log-in help" and the "Getting started" guide if you are unable to log-in.'); + } else { + $reviewtext = &mt('Please review the information in "Log-in help" if you are unable to log-in.'); } $r->print(<   -
  LON-CAPA help/support +
  LON-CAPA $lt{'headline'} @@ -791,8 +794,11 @@ if ($command ne 'process') { $r->print(' - '); } From lon-capa-cvs-allow@mail.lon-capa.org Tue Jan 29 21:00:31 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (lon-capa-cvs-allow@mail.lon-capa.org) Date: Tue, 29 Jan 2008 16:00:31 -0500 Subject: [LON-CAPA-cvs] January 70% OFF Message-ID: <20080130150041.2969.qmail@numberone>
From lon-capa-cvs-allow@mail.lon-capa.org Wed Jan 30 01:18:58 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (www) Date: Wed, 30 Jan 2008 01:18:58 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /auth lonroles.pm Message-ID: www Tue Jan 29 20:18:58 2008 EDT Modified files: /loncom/auth lonroles.pm Log: Don't go to non-exising authorspaces Index: loncom/auth/lonroles.pm diff -u loncom/auth/lonroles.pm:1.182 loncom/auth/lonroles.pm:1.183 --- loncom/auth/lonroles.pm:1.182 Sat Jan 26 16:12:32 2008 +++ loncom/auth/lonroles.pm Tue Jan 29 20:18:58 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # User Roles Screen # -# $Id: lonroles.pm,v 1.182 2008/01/26 21:12:32 www Exp $ +# $Id: lonroles.pm,v 1.183 2008/01/30 01:18:58 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -134,10 +134,12 @@ last; } # Is this a recent ad-hoc CA-role? - if (my ($domain,$coursenum) = - ($envkey =~ m-^form\.ca\./($match_domain)/($match_courseid)$-)) { - if ($dcroles{$domain}) { - &check_privs($domain,$coursenum,$then,$now,'ca'); + if (my ($domain,$user) = + ($envkey =~ m-^form\.ca\./($match_domain)/($match_username)$-)) { + if (($dcroles{$domain}) && (&is_author_homeserver($user,$domain))) { + &check_privs($domain,$user,$then,$now,'ca'); + } else { + delete($env{$envkey}); } last; } @@ -147,7 +149,7 @@ if ($dcroles{$domain}) { my $user=$env{'form.adhoccauname.'.$domain}; if (!$user) { $user=$env{'form.adhoccaunamerecent.'.$domain} }; - if (($user) && ($user=~/$match_username/)) { + if (($user) && ($user=~/$match_username/) && (&is_author_homeserver($user,$domain))) { &check_privs($domain,$user,$then,$now,'ca'); $env{'form.ca./'.$domain.'/'.$user}=1; } @@ -905,6 +907,20 @@ return $roletext; } +sub is_author_homeserver { + my ($uname,$udom)=@_; + my $home = &Apache::lonnet::homeserver($uname,$udom); + my @ids=&Apache::lonnet::current_machine_ids(); + foreach my $id (@ids) { + if ($id eq $home) { + if (-e "/home/".$uname."/public_html") { + return 1; + } + } + } + return 0; +} + sub check_privs { my ($cdom,$cnum,$then,$now,$checkrole) = @_; my $cckey = 'user.role.'.$checkrole.'./'.$cdom.'/'.$cnum; From lon-capa-cvs-allow@mail.lon-capa.org Wed Jan 30 01:50:56 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (www) Date: Wed, 30 Jan 2008 01:50:56 -0000 Subject: [LON-CAPA-cvs] cvs: loncom / production_dns_domain.tab production_dns_hosts.tab Message-ID: www Tue Jan 29 20:50:56 2008 EDT Modified files: /loncom production_dns_domain.tab production_dns_hosts.tab Log: University of Puerto Rico, Mayaguez Campus Index: loncom/production_dns_domain.tab diff -u loncom/production_dns_domain.tab:1.28 loncom/production_dns_domain.tab:1.29 --- loncom/production_dns_domain.tab:1.28 Fri Dec 14 10:47:50 2007 +++ loncom/production_dns_domain.tab Tue Jan 29 20:50:55 2008 @@ -58,6 +58,7 @@ ufm:Johann Wolfgang Goethe Universitaet Frankfurt am Main:::de::::ufml1 binghamton:Binghamton University:::en-US::::binghamtonl1 itu:Istanbul Technical University:::en-US::::itul1 +uprm:University of Puerto Rico, Mayaguez Campus:::en-US::::uprml1 #Community College wscc:Westshore Community College:::en-US:Scottville, MI:-86.279:43.955:wsccl1 Index: loncom/production_dns_hosts.tab diff -u loncom/production_dns_hosts.tab:1.28 loncom/production_dns_hosts.tab:1.29 --- loncom/production_dns_hosts.tab:1.28 Fri Dec 14 10:47:50 2007 +++ loncom/production_dns_hosts.tab Tue Jan 29 20:50:55 2008 @@ -93,6 +93,7 @@ ufml1:ufm:library:konfuzius.rz.uni-frankfurt.de binghamtonl1:binghamton:library:loncapa.chem.binghamton.edu itul1:itu:library:www.fizikodev.itu.edu.tr +uprml1:uprm:library:loncapa.hep.uprm.edu #Community Colleges tmcc1:tmcc:library:schubert.tmcc.edu From lon-capa-cvs-allow@mail.lon-capa.org Wed Jan 30 17:50:13 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (raeburn) Date: Wed, 30 Jan 2008 17:50:13 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /homework matchresponse.pm Message-ID: raeburn Wed Jan 30 12:50:13 2008 EDT Modified files: /loncom/homework matchresponse.pm Log: - Fix typos. Index: loncom/homework/matchresponse.pm diff -u loncom/homework/matchresponse.pm:1.67 loncom/homework/matchresponse.pm:1.68 --- loncom/homework/matchresponse.pm:1.67 Mon Oct 15 05:47:29 2007 +++ loncom/homework/matchresponse.pm Wed Jan 30 12:50:13 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Full matching style response # -# $Id: matchresponse.pm,v 1.67 2007/10/15 09:47:29 foxr Exp $ +# $Id: matchresponse.pm,v 1.68 2008/01/30 17:50:13 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -71,7 +71,7 @@ } elsif ($target eq 'analyze') { my $part_id="$Apache::inputtags::part.$id"; push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); - push (@{ $Apache::lonhomework::anaylze{"$part_id.bubble_lines"} }, + push (@{ $Apache::lonhomework::analyze{"$part_id.bubble_lines"} }, 1); } return $result; @@ -262,7 +262,7 @@ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; my $part = $Apache::inputtags::part; - my $response_id = $Apache::inputtages::response[-1]; + my $response_id = $Apache::inputtags::response[-1]; if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || $target eq 'tex' || $target eq 'analyze') { my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2'); From lon-capa-cvs-allow@mail.lon-capa.org Thu Jan 31 05:14:08 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (raeburn) Date: Thu, 31 Jan 2008 05:14:08 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /homework optionresponse.pm Message-ID: raeburn Thu Jan 31 00:14:08 2008 EDT Modified files: /loncom/homework optionresponse.pm Log: Typo. Index: loncom/homework/optionresponse.pm diff -u loncom/homework/optionresponse.pm:1.147 loncom/homework/optionresponse.pm:1.148 --- loncom/homework/optionresponse.pm:1.147 Mon Oct 15 05:47:29 2007 +++ loncom/homework/optionresponse.pm Thu Jan 31 00:14:06 2008 @@ -1,7 +1,7 @@ # LearningOnline Network with CAPA # option list style responses # -# $Id: optionresponse.pm,v 1.147 2007/10/15 09:47:29 foxr Exp $ +# $Id: optionresponse.pm,v 1.148 2008/01/31 05:14:06 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -71,7 +71,7 @@ } elsif ($target eq 'analyze') { my $part_id="$Apache::inputtags::part.$id"; push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); - push (@{ $Apache::lonhomeowrk::analyze{"$part_id.bubble_lines"} }, 1); + push (@{ $Apache::lonhomework::analyze{"$part_id.bubble_lines"} }, 1); } return $result; From lon-capa-cvs-allow@mail.lon-capa.org Thu Jan 31 15:10:13 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (www) Date: Thu, 31 Jan 2008 15:10:13 -0000 Subject: [LON-CAPA-cvs] cvs: loncom / production_dns_domain.tab production_dns_hosts.tab Message-ID: www Thu Jan 31 10:10:13 2008 EDT Modified files: /loncom production_dns_domain.tab production_dns_hosts.tab Log: McNeese State University Index: loncom/production_dns_domain.tab diff -u loncom/production_dns_domain.tab:1.29 loncom/production_dns_domain.tab:1.30 --- loncom/production_dns_domain.tab:1.29 Tue Jan 29 20:50:55 2008 +++ loncom/production_dns_domain.tab Thu Jan 31 10:10:10 2008 @@ -95,6 +95,7 @@ ohiouk12:Ohio University - K12:::en-US:Athens, OH:-82.1:39.329:ohiouk12l1 #Hosted +mcneese:McNeese State University:::en-US::::mcneesel1 case:Case Western Reserve University:::en-US::::casel1 ou:The University of Oklahoma:::en-US::::oul1 ZIS:Zurich International School:::en-US::::ZISl1 Index: loncom/production_dns_hosts.tab diff -u loncom/production_dns_hosts.tab:1.29 loncom/production_dns_hosts.tab:1.30 --- loncom/production_dns_hosts.tab:1.29 Tue Jan 29 20:50:55 2008 +++ loncom/production_dns_hosts.tab Thu Jan 31 10:10:10 2008 @@ -122,6 +122,7 @@ #Hosted - educogs library server +mcneesel1:mcneese:library:educog.com southfieldl1:southfield:library:educog.com longwoodl1:longwood:library:educog.com bcccl1:bccc:library:educog.com From lon-capa-cvs-allow@mail.lon-capa.org Fri Feb 1 22:05:47 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (raeburn) Date: Fri, 01 Feb 2008 22:05:47 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /homework chemresponse.pm essayresponse.pm externalresponse.pm imageresponse.pm matchresponse.pm optionresponse.pm radiobuttonresponse.pm rankresponse.pm response.pm Message-ID: raeburn Fri Feb 1 17:05:47 2008 EDT Modified files: /loncom/homework chemresponse.pm essayresponse.pm externalresponse.pm imageresponse.pm matchresponse.pm optionresponse.pm radiobuttonresponse.pm rankresponse.pm response.pm Log: When the target is 'analyze', include the responsetype of the current item in the lonhomework::analyze hash, for use later on, e.g., for scantron grading. Index: loncom/homework/chemresponse.pm diff -u loncom/homework/chemresponse.pm:1.75 loncom/homework/chemresponse.pm:1.76 --- loncom/homework/chemresponse.pm:1.75 Mon Oct 15 05:47:29 2007 +++ loncom/homework/chemresponse.pm Fri Feb 1 17:05:45 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # chemical equation style response # -# $Id: chemresponse.pm,v 1.75 2007/10/15 09:47:29 foxr Exp $ +# $Id: chemresponse.pm,v 1.76 2008/02/01 22:05:45 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -337,6 +337,7 @@ &Apache::lonxml::increment_counter(&Apache::response::repetition(), "$partid.$id"); # part.response if ($target eq 'analyze') { + $Apache::lonhomework::analyze{"$partid.$id.type"} = 'organicresponse'; &Apache::lonhomework::set_bubble_lines(); } } Index: loncom/homework/essayresponse.pm diff -u loncom/homework/essayresponse.pm:1.86 loncom/homework/essayresponse.pm:1.87 --- loncom/homework/essayresponse.pm:1.86 Mon Oct 15 05:47:29 2007 +++ loncom/homework/essayresponse.pm Fri Feb 1 17:05:45 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # essay (ungraded) style responses # -# $Id: essayresponse.pm,v 1.86 2007/10/15 09:47:29 foxr Exp $ +# $Id: essayresponse.pm,v 1.87 2008/02/01 22:05:45 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -187,6 +187,7 @@ &Apache::lonxml::increment_counter($increment, "$part.$id"); if ($target eq 'analyze') { + $Apache::lonhomework::analyze{"$part.$id.type"} = 'essayresponse'; &Apache::lonhomework::set_bubble_lines(); } } Index: loncom/homework/externalresponse.pm diff -u loncom/homework/externalresponse.pm:1.12 loncom/homework/externalresponse.pm:1.13 --- loncom/homework/externalresponse.pm:1.12 Mon Oct 15 05:47:29 2007 +++ loncom/homework/externalresponse.pm Fri Feb 1 17:05:45 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # external style responses # -# $Id: externalresponse.pm,v 1.12 2007/10/15 09:47:29 foxr Exp $ +# $Id: externalresponse.pm,v 1.13 2008/02/01 22:05:45 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -125,6 +125,7 @@ &Apache::lonxml::increment_counter($increment, "$part.$id"); if ($target eq 'analyze') { + $Apache::lonhomework::analyze{"$part.$id.type"} = 'externalresponse'; &Apache::lonhomework::set_bubble_lines(); } } Index: loncom/homework/imageresponse.pm diff -u loncom/homework/imageresponse.pm:1.91 loncom/homework/imageresponse.pm:1.92 --- loncom/homework/imageresponse.pm:1.91 Mon Oct 15 16:20:49 2007 +++ loncom/homework/imageresponse.pm Fri Feb 1 17:05:45 2008 @@ -2,7 +2,7 @@ # The LearningOnline Network with CAPA # image click response style # -# $Id: imageresponse.pm,v 1.91 2007/10/15 20:20:49 albertel Exp $ +# $Id: imageresponse.pm,v 1.92 2008/02/01 22:05:45 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -59,6 +59,7 @@ $result=&Apache::response::meta_package_write('imageresponse'); } elsif ($target eq 'analyze') { my $part_id="$Apache::inputtags::part.$id"; + $Apache::lonhomework::analyze{"$part_id.type"} = 'imageresponse'; push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); push (@{ $Apache::lonhomework::analyze{"$part_id.bubble_lines"} }, 1); Index: loncom/homework/matchresponse.pm diff -u loncom/homework/matchresponse.pm:1.68 loncom/homework/matchresponse.pm:1.69 --- loncom/homework/matchresponse.pm:1.68 Wed Jan 30 12:50:13 2008 +++ loncom/homework/matchresponse.pm Fri Feb 1 17:05:45 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Full matching style response # -# $Id: matchresponse.pm,v 1.68 2008/01/30 17:50:13 raeburn Exp $ +# $Id: matchresponse.pm,v 1.69 2008/02/01 22:05:45 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -70,6 +70,7 @@ if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } } elsif ($target eq 'analyze') { my $part_id="$Apache::inputtags::part.$id"; + $Apache::lonhomework::analyze{"$part_id.type"} = 'matchresponse'; push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); push (@{ $Apache::lonhomework::analyze{"$part_id.bubble_lines"} }, 1); Index: loncom/homework/optionresponse.pm diff -u loncom/homework/optionresponse.pm:1.148 loncom/homework/optionresponse.pm:1.149 --- loncom/homework/optionresponse.pm:1.148 Thu Jan 31 00:14:06 2008 +++ loncom/homework/optionresponse.pm Fri Feb 1 17:05:45 2008 @@ -1,7 +1,7 @@ # LearningOnline Network with CAPA # option list style responses # -# $Id: optionresponse.pm,v 1.148 2008/01/31 05:14:06 raeburn Exp $ +# $Id: optionresponse.pm,v 1.149 2008/02/01 22:05:45 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -70,6 +70,7 @@ $result=&Apache::response::meta_package_write('optionresponse'); } elsif ($target eq 'analyze') { my $part_id="$Apache::inputtags::part.$id"; + $Apache::lonhomework::analyze{"$part_id.type"} = 'optionresponse'; push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); push (@{ $Apache::lonhomework::analyze{"$part_id.bubble_lines"} }, 1); Index: loncom/homework/radiobuttonresponse.pm diff -u loncom/homework/radiobuttonresponse.pm:1.130 loncom/homework/radiobuttonresponse.pm:1.131 --- loncom/homework/radiobuttonresponse.pm:1.130 Mon Oct 22 05:29:58 2007 +++ loncom/homework/radiobuttonresponse.pm Fri Feb 1 17:05:45 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # mutliple choice style responses # -# $Id: radiobuttonresponse.pm,v 1.130 2007/10/22 09:29:58 foxr Exp $ +# $Id: radiobuttonresponse.pm,v 1.131 2008/02/01 22:05:45 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -103,6 +103,7 @@ $result .= '\begin{enumerate}'; } elsif ($target eq 'analyze') { my $part_id="$Apache::inputtags::part.$id"; + $Apache::lonhomework::analyze{"$part_id.type"} = 'radiobuttonresponse'; push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); } return $result; Index: loncom/homework/rankresponse.pm diff -u loncom/homework/rankresponse.pm:1.55 loncom/homework/rankresponse.pm:1.56 --- loncom/homework/rankresponse.pm:1.55 Mon Oct 15 05:47:29 2007 +++ loncom/homework/rankresponse.pm Fri Feb 1 17:05:45 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # rank style response # -# $Id: rankresponse.pm,v 1.55 2007/10/15 09:47:29 foxr Exp $ +# $Id: rankresponse.pm,v 1.56 2008/02/01 22:05:45 raeburn Exp $ # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). @@ -66,6 +66,7 @@ if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } } elsif ($target eq 'analyze') { my $part_id="$Apache::inputtags::part.$id"; + $Apache::lonhomework::analyze{"$part_id.type"} = 'rankresponse'; push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); push (@{ $Apache::lonhomework::analyze{"$part_id.bubble_lines"} }, 1); Index: loncom/homework/response.pm diff -u loncom/homework/response.pm:1.186 loncom/homework/response.pm:1.187 --- loncom/homework/response.pm:1.186 Sat Jan 19 09:56:54 2008 +++ loncom/homework/response.pm Fri Feb 1 17:05:45 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # various response type definitons response definition # -# $Id: response.pm,v 1.186 2008/01/19 14:56:54 raeburn Exp $ +# $Id: response.pm,v 1.187 2008/02/01 22:05:45 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -454,6 +454,7 @@ &Apache::lonxml::increment_counter(&Apache::response::repetition(), "$part.$id"); if ($target eq 'analyze') { + $Apache::lonhomework::analyze{"$part.$id.type"} = 'customresponse'; &Apache::lonhomework::set_bubble_lines(); } } From lon-capa-cvs-allow@mail.lon-capa.org Fri Feb 1 22:50:46 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (raeburn) Date: Fri, 01 Feb 2008 22:50:46 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /homework grades.pm Message-ID: This is a MIME encoded message --raeburn1201906246 Content-Type: text/plain raeburn Fri Feb 1 17:50:46 2008 EDT Modified files: /loncom/homework grades.pm Log: Bug 5589 In exam mode, optionresponse and matchresponse problems in a single part are divided into sub-questions, each one with its own scantron bubble line(s). In exam mode, essayresponse, formularesponse and stringresponse can have multiple bubble lines associated with a single part, and bubbles in more than one of these lines, if the weight assigned to the part exceeds 10. These two cases are addressed. The first, by passing scantron data lines to the validator for each of the sub-questions in turn, and the second by performing the occurrence_count check on each line in turn. Some bookkeeping code has been added to keep track of data for each subquestion. - %subdivided_bubble_lines hash provides a place to store bubble lines per subquestion for optionresponse and matchresponse. - %responsetype_per_response provides a place to store the responsetype for each response. - In the case of essayresponse problems, items are not included in $analysis{'parts'} from lonnet::ssi, so possible part IDs need to be retrieved from the $resource object. - When preserving information about missingbubbles, use questionnum (which includes subquestion) instead of question. - Validation for the different scantron formats - letter/number or positional moved to two subroutines - &scantron_validator_lettnum(), and &scantron_validator_positional(). - &prompt_for_corrections() can return an array containing numbers of lines with missingbubble or doublebubble. - This array is passed to &verify_bubbles_checked() which provides a javascript function to alert the user if any lines are without a choice of bubble or 'No bubble' for the current validation screen, for missingbubble or doublebubble cases only. - Data tabling the validation tables for missing or double bubbles. - Fix some typos and expand the documentation for bubbling multiple lines for essayresponse, formularesponse or string response (where more than 1 line may contain a bubble). --raeburn1201906246 Content-Type: text/plain Content-Disposition: attachment; filename="raeburn-20080201175046.txt" Index: loncom/homework/grades.pm diff -u loncom/homework/grades.pm:1.502 loncom/homework/grades.pm:1.503 --- loncom/homework/grades.pm:1.502 Wed Jan 9 09:16:52 2008 +++ loncom/homework/grades.pm Fri Feb 1 17:50:43 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.502 2008/01/09 14:16:52 www Exp $ +# $Id: grades.pm,v 1.503 2008/02/01 22:50:43 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -4681,6 +4681,12 @@ my %first_bubble_line; # First bubble line no. for each bubble. +my %subdivided_bubble_lines; # no. bubble lines for optionresponse + # or matchresponse where an individual + # response can have multiple lines + +my %responsetype_per_response; # responsetype for each response + # Save and restore the bubble lines array to the form env. @@ -4689,6 +4695,10 @@ $env{"form.scantron.bubblelines.$line"} = $bubble_lines_per_response{$line}; $env{"form.scantron.first_bubble_line.$line"} = $first_bubble_line{$line}; + $env{"form.scantron.sub_bubblelines.$line"} = + $subdivided_bubble_lines{$line}; + $env{"form.scantron.responsetype.$line"} = + $responsetype_per_response{$line}; } } @@ -4701,6 +4711,10 @@ $bubble_lines_per_response{$line} = $value; $first_bubble_line{$line} = $env{"form.scantron.first_bubble_line.$line"}; + $subdivided_bubble_lines{$line} = + $env{"form.scantron.sub_bubblelines.$line"}; + $responsetype_per_response{$line} = + $env{"form.scantron.responsetype.$line"}; $line++; } @@ -5139,6 +5153,8 @@ - 'answer' 'response' - new answer or 'none' if blank 'question' - the bubble line to change + 'questionnum' - the question identifier, + may include subquestion. Returns: $line - the modified scanline @@ -5187,7 +5203,7 @@ my $answer=${off}x$length; if ($args->{'response'} eq 'none') { &scan_data($scan_data, - "$whichline.no_bubble.".$args->{'question'},'1'); + "$whichline.no_bubble.".$args->{'questionnum'},'1'); } else { if ($on eq 'letter') { my @alphabet=('A'..'Z'); @@ -5199,7 +5215,7 @@ substr($answer,$args->{'response'},1)=$on; } &scan_data($scan_data, - "$whichline.no_bubble.".$args->{'question'},undef,'1'); + "$whichline.no_bubble.".$args->{'questionnum'},undef,'1'); } my $where=$length*($args->{'question'}-1)+$scantron_config->{'Qstart'}; substr($line,$where-1,$length)=$answer; @@ -5371,166 +5387,208 @@ $questions =~ s/\r$//; # Get rid of trailing \r too (MAC or Win uploads). while (length($questions)) { my $answers_needed = $bubble_lines_per_response{$questnum}; - my $answer_length = ($$scantron_config{'Qlength'} * $answers_needed) - || 1; - - $questnum++; - my $currentquest = substr($questions,0,$answer_length); - $questions = substr($questions,$answer_length); - if (length($currentquest) < $answer_length) { next; } - - # Qon letter implies for each slot in currentquest we have: - # ? or * for doubles a letter in A-Z for a bubble and - # about anything else (esp. a value of Qoff for missing - # bubbles. - - - if ($$scantron_config{'Qon'} eq 'letter') { - if ($currentquest =~ /\?/ - || $currentquest =~ /\*/ - || (&occurence_count($currentquest, "[A-Z]") > 1)) { - push(@{$record{'scantron.doubleerror'}},$questnum); - for (my $ans = 0; $ans < $answers_needed; $ans++) { - my $bubble = substr($currentquest, $ans, 1); - if ($bubble =~ /[A-Z]/ ) { - $record{"scantron.$ansnum.answer"} = $bubble; - } else { - $record{"scantron.$ansnum.answer"}=''; - } - $ansnum++; - } - - } elsif (!defined($currentquest) - || (&occurence_count($currentquest, $$scantron_config{'Qoff'}) == length($currentquest)) - || (&occurence_count($currentquest, "[A-Z]") == 0)) { - for (my $ans = 0; $ans < $answers_needed; $ans++ ) { - $record{"scantron.$ansnum.answer"}=''; - $ansnum++; - - } - if (!&scan_data($scan_data,"$whichline.no_bubble.$questnum")) { - push(@{$record{"scantron.missingerror"}},$questnum); - # $ansnum += $answers_needed; - } - } else { - for (my $ans = 0; $ans < $answers_needed; $ans++) { - my $bubble = substr($currentquest, $ans, 1); - $record{"scantron.$ansnum.answer"} = $bubble; - $ansnum++; - } - } - - # Qon 'number' implies each slot gives a digit that indexes the - # the bubbles filled or Qoff or a non number for unbubbled lines. - # and *? for double bubbles on a line. - # these answers are also stored as letters. - - } elsif ($$scantron_config{'Qon'} eq 'number') { - if ($currentquest =~ /\?/ - || $currentquest =~ /\*/ - || (&occurence_count($currentquest, '\d') > 1)) { - push(@{$record{'scantron.doubleerror'}},$questnum); - for (my $ans = 0; $ans < $answers_needed; $ans++) { - my $bubble = substr($currentquest, $ans, 1); - if ($bubble =~ /\d/) { - $record{"scantron.$ansnum.answer"} = $alphabet[$bubble]; - } else { - $record{"scantron.$ansnum.answer"}=' '; - } - $ansnum++; - } - - } elsif (!defined($currentquest) - || (&occurence_count($currentquest,$$scantron_config{'Qoff'}) == length($currentquest)) - || (&occurence_count($currentquest, '\d') == 0)) { - for (my $ans = 0; $ans < $answers_needed; $ans++ ) { - $record{"scantron.$ansnum.answer"}=''; - $ansnum++; - - } - if (!&scan_data($scan_data,"$whichline.no_bubble.$questnum")) { - push(@{$record{"scantron.missingerror"}},$questnum); - $ansnum += $answers_needed; - } - - } else { - $currentquest = &digits_to_letters($currentquest); - for (my $ans =0; $ans < $answers_needed; $ans++) { - $record{"scantron.$ansnum.answer"} = substr($currentquest, $ans, 1); - $ansnum++; - } - } - } else { - - # Otherwise there's a positional notation; - # each bubble line requires Qlength items, and there are filled in - # bubbles for each case where there 'Qon' characters. - # + my $answer_length = ($$scantron_config{'Qlength'} * $answers_needed) + || 1; + $questnum++; + my $quest_id = $questnum; + my $currentquest = substr($questions,0,$answer_length); + $questions = substr($questions,$answer_length); + if (length($currentquest) < $answer_length) { next; } + + if ($subdivided_bubble_lines{$questnum-1} =~ /,/) { + my $subquestnum = 1; + my $subquestions = $currentquest; + my @subanswers_needed = + split(/,/,$subdivided_bubble_lines{$questnum-1}); + foreach my $subans (@subanswers_needed) { + my $subans_length = + ($$scantron_config{'Qlength'} * $subans) || 1; + my $currsubquest = substr($subquestions,0,$subans_length); + $subquestions = substr($subquestions,$subans_length); + $quest_id = "$questnum.$subquestnum"; + if (($$scantron_config{'Qon'} eq 'letter') || + ($$scantron_config{'Qon'} eq 'number')) { + $ansnum = &scantron_validator_lettnum($ansnum, + $questnum,$quest_id,$subans,$currsubquest,$whichline, + \@alphabet,\%record,$scantron_config,$scan_data); + } else { + $ansnum = &scantron_validator_positional($ansnum, + $questnum,$quest_id,$subans,$currsubquest,$whichline, \@alphabet,\%record,$scantron_config,$scan_data); + } + $subquestnum ++; + } + } else { + if (($$scantron_config{'Qon'} eq 'letter') || + ($$scantron_config{'Qon'} eq 'number')) { + $ansnum = &scantron_validator_lettnum($ansnum,$questnum, + $quest_id,$answers_needed,$currentquest,$whichline, + \@alphabet,\%record,$scantron_config,$scan_data); + } else { + $ansnum = &scantron_validator_positional($ansnum,$questnum, + $quest_id,$answers_needed,$currentquest,$whichline, + \@alphabet,\%record,$scantron_config,$scan_data); + } + } + } + $record{'scantron.maxquest'}=$questnum; + return \%record; +} - my @array=split($$scantron_config{'Qon'},$currentquest,-1); +sub scantron_validator_lettnum { + my ($ansnum,$questnum,$quest_id,$answers_needed,$currquest,$whichline, + $alphabet,$record,$scantron_config,$scan_data) = @_; + + # Qon 'letter' implies for each slot in currquest we have: + # ? or * for doubles, a letter in A-Z for a bubble, and + # about anything else (esp. a value of Qoff) for missing + # bubbles. + # + # Qon 'number' implies each slot gives a digit that indexes the + # bubbles filled, or Qoff, or a non-number for unbubbled lines, + # and * or ? for double bubbles on a single line. + # - # If the split only giveas us one element.. the full length of the - # answser string, no bubbles are filled in: + my $matchon; + if ($$scantron_config{'Qon'} eq 'letter') { + $matchon = '[A-Z]'; + } elsif ($$scantron_config{'Qon'} eq 'number') { + $matchon = '\d'; + } + my $occurrences = 0; + if (($responsetype_per_response{$questnum-1} eq 'essayresponse') || + ($responsetype_per_response{$questnum-1} eq 'formularesponse') || + ($responsetype_per_response{$questnum-1} eq 'stringresponse')) { + my @singlelines = split('',$currquest); + foreach my $entry (@singlelines) { + $occurrences = &occurence_count($entry,$matchon); + if ($occurrences > 1) { + last; + } + } + } else { + $occurrences = &occurence_count($currquest,$matchon); + } + if (($currquest =~ /\?/ || $currquest =~ /\*/) || ($occurrences > 1)) { + push(@{$record->{'scantron.doubleerror'}},$quest_id); + for (my $ans=0; $ans<$answers_needed; $ans++) { + my $bubble = substr($currquest,$ans,1); + if ($bubble =~ /$matchon/ ) { + if ($$scantron_config{'Qon'} eq 'number') { + if ($bubble == 0) { + $bubble = 10; + } + $record->{"scantron.$ansnum.answer"} = + $alphabet->[$bubble-1]; + } else { + $record->{"scantron.$ansnum.answer"} = $bubble; + } + } else { + $record->{"scantron.$ansnum.answer"}=''; + } + $ansnum++; + } + } elsif (!defined($currquest) + || (&occurence_count($currquest, $$scantron_config{'Qoff'}) == length($currquest)) + || (&occurence_count($currquest,$matchon) == 0)) { + for (my $ans=0; $ans<$answers_needed; $ans++ ) { + $record->{"scantron.$ansnum.answer"}=''; + $ansnum++; + } + if (!&scan_data($scan_data,"$whichline.no_bubble.$quest_id")) { + push(@{$record->{'scantron.missingerror'}},$quest_id); + } + } else { + if ($$scantron_config{'Qon'} eq 'number') { + $currquest = &digits_to_letters($currquest); + } + for (my $ans=0; $ans<$answers_needed; $ans++) { + my $bubble = substr($currquest,$ans,1); + $record->{"scantron.$ansnum.answer"} = $bubble; + $ansnum++; + } + } + return $ansnum; +} - if (length($array[0]) eq $$scantron_config{'Qlength'}*$answers_needed) { - for (my $ans = 0; $ans < $answers_needed; $ans++ ) { - $record{"scantron.$ansnum.answer"}=''; - $ansnum++; +sub scantron_validator_positional { + my ($ansnum,$questnum,$quest_id,$answers_needed,$currquest, + $whichline,$alphabet,$record,$scantron_config,$scan_data) = @_; - } - if (!&scan_data($scan_data,"$whichline.no_bubble.$questnum")) { - push(@{$record{"scantron.missingerror"}},$questnum); - } - + # Otherwise there's a positional notation; + # each bubble line requires Qlength items, and there are filled in + # bubbles for each case where there 'Qon' characters. + # + my @array=split($$scantron_config{'Qon'},$currquest,-1); - } elsif (scalar(@array) eq 2) { + # If the split only gives us one element.. the full length of the + # answer string, no bubbles are filled in: - my $location = length($array[0]); - my $line_num = int($location / $$scantron_config{'Qlength'}); - my $bubble = $alphabet[$location % $$scantron_config{'Qlength'}]; - + if (length($array[0]) eq $$scantron_config{'Qlength'}*$answers_needed) { + for (my $ans=0; $ans<$answers_needed; $ans++ ) { + $record->{"scantron.$ansnum.answer"}=''; + $ansnum++; + } + if (!&scan_data($scan_data,"$whichline.no_bubble.$quest_id")) { + push(@{$record->{"scantron.missingerror"}},$quest_id); + } + } elsif (scalar(@array) == 2) { + my $location = length($array[0]); + my $line_num = int($location / $$scantron_config{'Qlength'}); + my $bubble = $alphabet->[$location % $$scantron_config{'Qlength'}]; + for (my $ans=0; $ans<$answers_needed; $ans++) { + if ($ans eq $line_num) { + $record->{"scantron.$ansnum.answer"} = $bubble; + } else { + $record->{"scantron.$ansnum.answer"} = ' '; + } + $ansnum++; + } + } else { + # If there's more than one instance of a bubble character + # That's a double bubble; with positional notation we can + # record all the bubbles filled in as well as the + # fact this response consists of multiple bubbles. + # + if (($responsetype_per_response{$questnum-1} eq 'essayresponse') || + ($responsetype_per_response{$questnum-1} eq 'formularesponse') || + ($responsetype_per_response{$questnum-1} eq 'stringresponse')) { + my $doubleerror = 0; + while (($currquest >= $$scantron_config{'Qlength'}) && + (!$doubleerror)) { + my $currline = substr($currquest,0,$$scantron_config{'Qlength'}); + $currquest = substr($currquest,$$scantron_config{'Qlength'}); + my @currarray = split($$scantron_config{'Qon'},$currline,-1); + if (length(@currarray) > 2) { + $doubleerror = 1; + } + } + if ($doubleerror) { + push(@{$record->{'scantron.doubleerror'}},$quest_id); + } + } else { + push(@{$record->{'scantron.doubleerror'}},$quest_id); + } + my $item = $ansnum; + for (my $ans=0; $ans<$answers_needed; $ans++) { + $record->{"scantron.$item.answer"} = ''; + $item ++; + } - for (my $ans = 0; $ans < $answers_needed; $ans++) { - if ($ans eq $line_num) { - $record{"scantron.$ansnum.answer"} = $bubble; - } else { - $record{"scantron.$ansnum.answer"} = ' '; - } - $ansnum++; - } - } - # If there's more than one instance of a bubble character - # That's a double bubble; with positional notation we can - # record all the bubbles filled in as well as the - # fact this response consists of multiple bubbles. - # - else { - push(@{$record{'scantron.doubleerror'}},$questnum); - - my $first_answer = $ansnum; - for (my $ans =0; $ans < $answers_needed; $ans++) { - my $item = $first_answer+$ans; - $record{"scantron.$item.answer"} = ''; - } - - my @ans=@array; - my $i=0; - my $increment = 0; - while ($#ans) { - $i+=length($ans[0]) + $increment; - my $line = int($i/$$scantron_config{'Qlength'} + $first_answer); - my $bubble = $i%$$scantron_config{'Qlength'}; - $record{"scantron.$line.answer"}.=$alphabet[$bubble]; - shift(@ans); - $increment = 1; - } - $ansnum += $answers_needed; - } - } + my @ans=@array; + my $i=0; + my $increment = 0; + while ($#ans) { + $i+=length($ans[0]) + $increment; + my $line = int($i/$$scantron_config{'Qlength'} + $ansnum); + my $bubble = $i%$$scantron_config{'Qlength'}; + $record->{"scantron.$line.answer"}.=$alphabet->[$bubble]; + shift(@ans); + $increment = 1; + } + $ansnum += $answers_needed; } - $record{'scantron.maxquest'}=$questnum; - return \%record; + return $ansnum; } =pod @@ -5670,7 +5728,8 @@ &scantron_fixup_scanline(\%scantron_config,$scan_data,$line, $which,'answer', { 'question'=>$question, - 'response'=>$env{"form.scantron_correct_Q_$question"}}); + 'response'=>$env{"form.scantron_correct_Q_$question"}, + 'questionnum'=>$env{"form.scantron_questionnum_Q_$question"}}); if ($err) { last; } } } @@ -5889,6 +5948,8 @@ ''."\n"; $chunk .= ''."\n"; + $chunk .= + ''."\n"; $result .= $chunk; $line++; } @@ -5933,7 +5994,7 @@ if ($env{'form.scantron_corrections'}) { &scantron_process_corrections($r); } - $r->print('

'.&mt('Gathering necessary info.').'

');$r->rflush(); + $r->print('

'.&mt('Gathering necessary information.').'

');$r->rflush(); #get the student pick code ready $r->print(&Apache::loncommon::studentbrowser_javascript()); my $max_bubble=&scantron_get_maxbubble(); @@ -5953,7 +6014,7 @@ my $stop=0; while (!$stop && $currentphase < scalar(@validate_phases)) { - $r->print('

'.&mt('Validating '.$validate_phases[$currentphase]).'

'); + $r->print(&mt('Validating '.$validate_phases[$currentphase]).'
'); $r->rflush(); my $which="scantron_validate_".$validate_phases[$currentphase]; { @@ -5964,7 +6025,7 @@ if (!$stop) { my $warning=&scantron_warning_screen('Start Grading'); $r->print(' -'.&mt('Validation process complete.').'
+'.&mt('Validation process complete.').'
'.$warning.' @@ -5981,7 +6042,11 @@ $r->print("

".&mt("Or click the 'Grading Menu' button to start over.")."

"); } else { - $r->print(''); + if ($validate_phases[$currentphase] eq 'doublebubble' || $validate_phases[$currentphase] eq 'missingbubbles') { + $r->print(''); + } else { + $r->print(''); + } $r->print(' '.&mt('using corrected info').'
'); $r->print(""); $r->print(" ".&mt("this scanline saving it for later.")); @@ -6463,7 +6528,6 @@ sub scantron_get_correction { my ($r,$i,$scan_record,$scan_config,$line,$error,$arg)=@_; - #FIXME in the case of a duplicated ID the previous line, probably need #to show both the current line and the previous one and allow skipping #the previous one or the current one @@ -6485,6 +6549,10 @@ $r->print(''."\n"); $r->print(''."\n"); + # Array populated for doublebubble or + my @lines_to_correct; # missingbubble errors to build javascript + # to validate radio button checking + if ($error =~ /ID$/) { if ($error eq 'incorrectID') { $r->print("

".&mt("The encoded ID is not in the classlist"). @@ -6580,7 +6648,7 @@ "")); $r->print("\n

"); } elsif ($error eq 'doublebubble') { - $r->print("

".&mt("There have been multiple bubbles scanned for a some question(s)")."

\n"); + $r->print("

".&mt("There have been multiple bubbles scanned for some question(s)")."

\n"); # The form field scantron_questions is acutally a list of line numbers. # represented by this form so: @@ -6592,15 +6660,18 @@ $r->print($message); $r->print("

".&mt("Please indicate which bubble should be used for grading")."

"); foreach my $question (@{$arg}) { - &prompt_for_corrections($r, $question, $scan_config, $scan_record); + my @linenums = &prompt_for_corrections($r,$question,$scan_config, + $scan_record, $error); + push (@lines_to_correct,@linenums); } + $r->print(&verify_bubbles_checked(@lines_to_correct)); } elsif ($error eq 'missingbubble') { $r->print("

".&mt("There have been no bubbles scanned for some question(s)")."

\n"); $r->print($message); $r->print("

".&mt("Please indicate which bubble should be used for grading.")."

"); - $r->print(&mt("Some questions have no scanned bubbles")."\n"); + $r->print(&mt("Some questions have no scanned bubbles.")."\n"); - # The form field scantron_questinos is actually a list of line numbers not + # The form field scantron_questions is actually a list of line numbers not # a list of question numbers. Therefore: # @@ -6609,14 +6680,50 @@ $r->print(''); foreach my $question (@{$arg}) { - &prompt_for_corrections($r, $question, $scan_config, $scan_record); + my @linenums = &prompt_for_corrections($r,$question,$scan_config, + $scan_record, $error); + push (@lines_to_correct,@linenums); } + $r->print(&verify_bubbles_checked(@lines_to_correct)); } else { $r->print("\n
    "); } $r->print("\n
"); } +sub verify_bubbles_checked { + my (@ansnums) = @_; + my $ansnumstr = join('","',@ansnums); + my $warning = &mt("A bubble or 'No bubble' selection has not been made for one or more lines."); + my $output = (< +function verify_bubble_radio(form) { + var ansnumArray = new Array ("$ansnumstr"); + var need_bubble_count = 0; + for (var i=0; i 1) { + var bubble_picked = 0; + for (var j=0; j +ENDSCRIPT + return $output; +} + =pod =item questions_to_line_list @@ -6635,11 +6742,26 @@ my ($questions) = @_; my @lines; - foreach my $question (@{$questions}) { - my $first = $first_bubble_line{$question-1} + 1; - my $count = $bubble_lines_per_response{$question-1}; - my $last = $first+$count-1; - push(@lines, ($first..$last)); + foreach my $item (@{$questions}) { + my $question = $item; + my ($first,$count,$last); + if ($item =~ /^(\d+)\.(\d+)$/) { + $question = $1; + my $subquestion = $2; + $first = $first_bubble_line{$question-1} + 1; + my @subans = split(/,/,$subdivided_bubble_lines{$question-1}); + my $subcount = 1; + while ($subcount<$subquestion) { + $first += $subans[$subcount-1]; + $subcount ++; + } + $count = $subans[$subquestion-1]; + } else { + $first = $first_bubble_line{$question-1} + 1; + $count = $bubble_lines_per_response{$question-1}; + } + my $last = $first+$count-1; + push(@lines, ($first..$last)); } return join(',', @lines); } @@ -6657,33 +6779,70 @@ $question - The question number to prompt for. $scan_config - The scantron file configuration hash. $scan_record - Reference to the hash that has the the parsed scanlines. + $error - Type of error Implicit inputs: %bubble_lines_per_response - Starting line numbers for each question. Numbered from 0 (but question numbers are from 1. %first_bubble_line - Starting bubble line for each question. + %subdivided_bubble_lines - optionresponse and matchresponse type + problems render as separate sub-questions, + in exam mode. This hash contains a + comma-separated list of the lines per + sub-question. + %responsetype_per_response - essayresponse, forumalaresponse, and + stringresponse type problem parts can have + multiple lines per response if the weight + assigned exceeds 10. In this case, only + one bubble per line is permitted, but more + than one line might contain bubbles, e.g. + bubbling of: line 1 - J, line 2 - J, + line 3 - B would assign 22 points. =cut sub prompt_for_corrections { - my ($r, $question, $scan_config, $scan_record) = @_; - - my $lines = $bubble_lines_per_response{$question-1}; - my $current_line = $first_bubble_line{$question-1} + 1 ; - + my ($r, $question, $scan_config, $scan_record, $error) = @_; + my ($current_line,$lines); + my @linenums; + my $questionnum = $question; + if ($question =~ /^(\d+)\.(\d+)$/) { + $question = $1; + $current_line = $first_bubble_line{$question-1} + 1 ; + my $subquestion = $2; + my @subans = split(/,/,$subdivided_bubble_lines{$question-1}); + my $subcount = 1; + while ($subcount<$subquestion) { + $current_line += $subans[$subcount-1]; + $subcount ++; + } + $lines = $subans[$subquestion-1]; + } else { + $current_line = $first_bubble_line{$question-1} + 1 ; + $lines = $bubble_lines_per_response{$question-1}; + } if ($lines > 1) { - $r->print(&mt("The group of bubble lines below responds to a single question. Select at most one bubble in a single line and select 'No Bubble' in all the other lines. ")."
"); + $r->print(&mt('The group of bubble lines below responds to a single question.').'
'); + if (($responsetype_per_response{$question-1} eq 'essayresponse') || + ($responsetype_per_response{$question-1} eq 'formularesponse') || + ($responsetype_per_response{$question-1} eq 'stringresponse')) { + $r->print(&mt("Although this particular question type requires handgrading, the instructions for this question in the exam directed students to leave [quant,_1,line] blank on their scantron sheets.",$lines).'

'.&mt('A non-zero score can be assigned to the student during scantron grading by selecting a bubble in at least one line.').'
'.&mt('The score for this question will be a sum of the numeric values for the selected bubbles from each line, where A=1 point, B=2 points etc.').'
'.&mt("To assign a score of zero for this question, mark all lines as 'No bubble'.").'

'); + } else { + $r->print(&mt("Select at most one bubble in a single line and select 'No Bubble' in all the other lines. ")."
"); + } } for (my $i =0; $i < $lines; $i++) { - my $selected = $$scan_record{"scantron.$current_line.answer"}; - &scantron_bubble_selector($r, $scan_config, $current_line, - split('', $selected)); + my $selected = $$scan_record{"scantron.$current_line.answer"}; + &scantron_bubble_selector($r,$scan_config,$current_line, + $questionnum,$error,split('', $selected)); + push (@linenums,$current_line); $current_line++; } if ($lines > 1) { $r->print("

"); } + return @linenums; } =pod @@ -6697,34 +6856,46 @@ $r - Apache request object $scan_config - hash from &get_scantron_config() $line - Number of the line being displayed. + $questionnum - Question number (may include subquestion) + $error - Type of error. @selected - Array of bubbles picked on this line. =cut sub scantron_bubble_selector { - my ($r,$scan_config,$line,@selected)=@_; + my ($r,$scan_config,$line,$questionnum,$error,@selected)=@_; my $max=$$scan_config{'Qlength'}; my $scmode=$$scan_config{'Qon'}; if ($scmode eq 'number' || $scmode eq 'letter') { $max=10; } my @alphabet=('A'..'Z'); - $r->print("
"); + $r->print(&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_row()); + $r->print(''); for (my $i=0;$i<$max+1;$i++) { $r->print("\n".''); } - $r->print(''); + $r->print(&Apache::loncommon::end_data_table_row(). + &Apache::loncommon::start_data_table_row()); for (my $i=0;$i<$max;$i++) { $r->print("\n". '"); } - $r->print(''); - $r->print('
$line'.$line.''); if ($selected[0] eq $alphabet[$i]) { $r->print('X'); shift(@selected) } else { $r->print(' '); } $r->print('
'); + my $nobub_checked = ' '; + if ($error eq 'missingbubble') { + $nobub_checked = ' checked = "checked" '; + } + $r->print("\n".''."\n".''); + $r->print(&Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table()); } =pod @@ -6904,7 +7075,6 @@ #get scantron line setup my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); my ($scanlines,$scan_data)=&scantron_getfile(); - &scantron_get_maxbubble(); # parse needs the bubble line array. for (my $i=0;$i<=$scanlines->{'count'};$i++) { @@ -6931,14 +7101,17 @@ for what the current value of the problem counter is. Caches the results to $env{'form.scantron_maxbubble'}, - $env{'form.scantron.bubble_lines.n'} and - $env{'form.scantron.first_bubble_line.n'} + $env{'form.scantron.bubble_lines.n'}, + $env{'form.scantron.first_bubble_line.n'} and + $env{"form.scantron.sub_bubblelines.n"} which are the total number of bubble, lines, the number of bubble - lines for reponse n and number of the first bubble line for response n. + lines for response n and number of the first bubble line for response n, + and a comma separated list of numbers of bubble lines for sub-questions + (for optionresponse items only), for response n. =cut -sub scantron_get_maxbubble { +sub scantron_get_maxbubble { if (defined($env{'form.scantron_maxbubble'}) && $env{'form.scantron_maxbubble'}) { &restore_bubble_lines(); @@ -6960,12 +7133,23 @@ my $total_lines = 0; %bubble_lines_per_response = (); %first_bubble_line = (); - + %subdivided_bubble_lines = (); + %responsetype_per_response = (); my $response_number = 0; my $bubble_line = 0; foreach my $resource (@resources) { - my $symb = $resource->symb(); + # Need to retrieve part IDs and response IDs because essayresponse + # items are not included in $analysis{'parts'} from lonnet::ssi. + my %possible_part_ids; + if (ref($resource->parts()) eq 'ARRAY') { + foreach my $part (@{$resource->parts()}) { + my @resp_ids = $resource->responseIds($part); + foreach my $id (@resp_ids) { + $possible_part_ids{$part.'.'.$id} = 1; + } + } + } my $result=&Apache::lonnet::ssi($resource->src(), ('symb' => $resource->symb()), ('grade_target' => 'analyze'), @@ -6975,21 +7159,60 @@ my (undef, $an) = split(/_HASH_REF__/,$result, 2); - my %analysis = &Apache::lonnet::str2hash($an); - - + my @parts; - foreach my $part_id (@{$analysis{'parts'}}) { - - my $lines = $analysis{"$part_id.bubble_lines"};; + my %analysis = &Apache::lonnet::str2hash($an); + if (ref($analysis{'parts'}) eq 'ARRAY') { + @parts = @{$analysis{'parts'}}; + } + # Add part_ids for any essayresponse items. + foreach my $part_id (keys(%possible_part_ids)) { + if ($analysis{$part_id.'.type'} eq 'essayresponse') { + if (!grep(/^\Q$part_id\E$/,@parts)) { + push (@parts,$part_id); + } + } + } + foreach my $part_id (@parts) { + my $lines = $analysis{"$part_id.bubble_lines"}; # TODO - make this a persistent hash not an array. + # optionresponse and matchresponse type items render as + # separate sub-questions in exam mode. + if (($analysis{$part_id.'.type'} eq 'optionresponse') || + ($analysis{$part_id.'.type'} eq 'matchresponse')) { + my ($numbub,$numshown); + if ($analysis{$part_id.'.type'} eq 'optionresponse') { + if (ref($analysis{$part_id.'.options'}) eq 'ARRAY') { + $numbub = scalar(@{$analysis{$part_id.'.options'}}); + } + } elsif ($analysis{$part_id.'.type'} eq 'matchresponse') { + if (ref($analysis{$part_id.'.items'}) eq 'ARRAY') { + $numbub = scalar(@{$analysis{$part_id.'.items'}}); + } + } + if (ref($analysis{$part_id.'.shown'}) eq 'ARRAY') { + $numshown = scalar(@{$analysis{$part_id.'.shown'}}); + } + my $bubbles_per_line = 10; + my $inner_bubble_lines = int($numshown/$bubbles_per_line); + if (($numshown % $bubbles_per_line) != 0) { + $inner_bubble_lines++; + } + for (my $i=0; $i<$numshown; $i++) { + $subdivided_bubble_lines{$response_number} .= + $inner_bubble_lines.','; + } + $subdivided_bubble_lines{$response_number} =~ s/,$//; + } - $first_bubble_line{$response_number} = $bubble_line; - $bubble_lines_per_response{$response_number} = $lines; + $first_bubble_line{$response_number} = $bubble_line; + $bubble_lines_per_response{$response_number} = $lines; + $responsetype_per_response{$response_number} = + $analysis{$part_id.'.type'}; $response_number++; $bubble_line += $lines; --raeburn1201906246-- From lon-capa-cvs-allow@mail.lon-capa.org Fri Feb 1 23:00:57 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (raeburn) Date: Fri, 01 Feb 2008 23:00:57 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /homework/caparesponse caparesponse.pm Message-ID: raeburn Fri Feb 1 18:00:57 2008 EDT Modified files: /loncom/homework/caparesponse caparesponse.pm Log: When target is 'analysze', before calling lonhomework::set_bubble_lines() need to update the value of $increment if the tag is formularesponse, and this is exam mode. Otherwise the number of bubble lines will be wrong for scantron grading a formularesponse item with a weight > 10. Index: loncom/homework/caparesponse/caparesponse.pm diff -u loncom/homework/caparesponse/caparesponse.pm:1.220 loncom/homework/caparesponse/caparesponse.pm:1.221 --- loncom/homework/caparesponse/caparesponse.pm:1.220 Fri Nov 16 03:44:37 2007 +++ loncom/homework/caparesponse/caparesponse.pm Fri Feb 1 18:00:56 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # caparesponse definition # -# $Id: caparesponse.pm,v 1.220 2007/11/16 08:44:37 albertel Exp $ +# $Id: caparesponse.pm,v 1.221 2008/02/01 23:00:56 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -787,6 +787,12 @@ } if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || $target eq 'tex' || $target eq 'analyze') { + if (($tag eq 'formularesponse') && ($target eq 'analyze')) { + my $type = &Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.type'); + if ($type eq 'exam') { + $increment = &Apache::response::repetition(); + } + } &Apache::lonxml::increment_counter($increment,"$partid.$id"); if ($target eq 'analyze') { &Apache::lonhomework::set_bubble_lines(); From lon-capa-cvs-allow@mail.lon-capa.org Fri Feb 1 23:03:14 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (raeburn) Date: Fri, 01 Feb 2008 23:03:14 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface loncommon.pm Message-ID: raeburn Fri Feb 1 18:03:14 2008 EDT Modified files: /loncom/interface loncommon.pm Log: - LC_leftcol_header td css class added to &standard_css. - Used in left column of scantron validator display (missingbubble and doublebubble). Index: loncom/interface/loncommon.pm diff -u loncom/interface/loncommon.pm:1.638 loncom/interface/loncommon.pm:1.639 --- loncom/interface/loncommon.pm:1.638 Tue Jan 22 19:37:34 2008 +++ loncom/interface/loncommon.pm Fri Feb 1 18:03:13 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.638 2008/01/23 00:37:34 www Exp $ +# $Id: loncommon.pm,v 1.639 2008/02/01 23:03:13 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -4498,6 +4498,10 @@ table.LC_data_table tr.LC_data_table_highlight td { background-color: $data_table_darker; } +table.LC_data_table tr td.LC_leftcol_header { + background-color: $data_table_head; + font-weight: bold; +} table.LC_data_table tr.LC_empty_row td, table.LC_nested tr.LC_empty_row td { background-color: #FFFFFF; From lon-capa-cvs-allow@mail.lon-capa.org Sat Feb 2 02:28:05 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (raeburn) Date: Sat, 02 Feb 2008 02:28:05 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /homework grades.pm Message-ID: raeburn Fri Feb 1 21:28:05 2008 EDT Modified files: /loncom/homework grades.pm Log: Store value of scantron.responsetype in a hidden form element, for future use correcting bubble errors in subsequent scanlines. Index: loncom/homework/grades.pm diff -u loncom/homework/grades.pm:1.503 loncom/homework/grades.pm:1.504 --- loncom/homework/grades.pm:1.503 Fri Feb 1 17:50:43 2008 +++ loncom/homework/grades.pm Fri Feb 1 21:28:02 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.503 2008/02/01 22:50:43 raeburn Exp $ +# $Id: grades.pm,v 1.504 2008/02/02 02:28:02 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -5950,6 +5950,8 @@ ''."\n"; $chunk .= ''."\n"; + $chunk .= + ''."\n"; $result .= $chunk; $line++; } From lon-capa-cvs-allow@mail.lon-capa.org Sat Feb 2 21:45:52 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (raeburn) Date: Sat, 02 Feb 2008 21:45:52 -0000 Subject: [LON-CAPA-cvs] cvs: loncom(version_2_6_X) /interface loncommon.pm Message-ID: raeburn Sat Feb 2 16:45:52 2008 EDT Modified files: (Branch: version_2_6_X) /loncom/interface loncommon.pm Log: Backport 1.638. Index: loncom/interface/loncommon.pm diff -u loncom/interface/loncommon.pm:1.636 loncom/interface/loncommon.pm:1.636.2.1 --- loncom/interface/loncommon.pm:1.636 Sun Jan 20 19:35:58 2008 +++ loncom/interface/loncommon.pm Sat Feb 2 16:45:47 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.636 2008/01/21 00:35:58 raeburn Exp $ +# $Id: loncommon.pm,v 1.636.2.1 2008/02/02 21:45:47 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -8088,14 +8088,21 @@ $cenv{'url'}=$oldcenv{'url'}; # Restore title $cenv{'description'}=$oldcenv{'description'}; -# restore grading mode - if (defined($oldcenv{'grading'})) { - $cenv{'grading'}=$oldcenv{'grading'}; - } # Mark as cloned $cenv{'clonedfrom'}=$cloneid; - delete($cenv{'default_enrollment_start_date'}); - delete($cenv{'default_enrollment_end_date'}); +# Need to clone grading mode + my %newenv=&Apache::lonnet::get('environment',['grading'],$$crsudom,$$crsunum); + $cenv{'grading'}=$newenv{'grading'}; +# Do not clone these environment entries + &Apache::lonnet::del('environment', + ['default_enrollment_start_date', + 'default_enrollment_end_date', + 'question.email', + 'policy.email', + 'comment.email', + 'pch.users.denied', + 'plc.users.denied'], + $$crsudom,$$crsunum); } # From lon-capa-cvs-allow@mail.lon-capa.org Sat Feb 2 22:10:22 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (raeburn) Date: Sat, 02 Feb 2008 22:10:22 -0000 Subject: [LON-CAPA-cvs] cvs: loncom(version_2_6_X) /interface loncommon.pm Message-ID: raeburn Sat Feb 2 17:10:22 2008 EDT Modified files: (Branch: version_2_6_X) /loncom/interface loncommon.pm Log: Backport 1.639. Index: loncom/interface/loncommon.pm diff -u loncom/interface/loncommon.pm:1.636.2.1 loncom/interface/loncommon.pm:1.636.2.2 --- loncom/interface/loncommon.pm:1.636.2.1 Sat Feb 2 16:45:47 2008 +++ loncom/interface/loncommon.pm Sat Feb 2 17:10:22 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.636.2.1 2008/02/02 21:45:47 raeburn Exp $ +# $Id: loncommon.pm,v 1.636.2.2 2008/02/02 22:10:22 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -4498,6 +4498,10 @@ table.LC_data_table tr.LC_data_table_highlight td { background-color: $data_table_darker; } +table.LC_data_table tr td.LC_leftcol_header { + background-color: $data_table_head; + font-weight: bold; +} table.LC_data_table tr.LC_empty_row td, table.LC_nested tr.LC_empty_row td { background-color: #FFFFFF; From lon-capa-cvs-allow@mail.lon-capa.org Sun Feb 3 00:05:23 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (www) Date: Sun, 03 Feb 2008 00:05:23 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface lonnavmaps.pm Message-ID: www Sat Feb 2 19:05:23 2008 EDT Modified files: /loncom/interface lonnavmaps.pm Log: Mark practice problems in table of contents as "not graded." Use green color for higher satisfaction. Index: loncom/interface/lonnavmaps.pm diff -u loncom/interface/lonnavmaps.pm:1.411 loncom/interface/lonnavmaps.pm:1.412 --- loncom/interface/lonnavmaps.pm:1.411 Thu Jan 24 17:12:02 2008 +++ loncom/interface/lonnavmaps.pm Sat Feb 2 19:05:23 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.411 2008/01/24 22:12:02 raeburn Exp $ +# $Id: lonnavmaps.pm,v 1.412 2008/02/03 00:05:23 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -854,7 +854,10 @@ if (!$resource->condval()) { $nonLinkedText .= ' ('.&mt('conditionally hidden').') '; } - + if ($resource->is_practice()) { + $nonLinkedText .=' '.&mt('not graded').''; + } + # We're done preparing and finally ready to start the rendering my $result = ""; From lon-capa-cvs-allow@mail.lon-capa.org Sun Feb 3 01:11:01 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (raeburn) Date: Sun, 03 Feb 2008 01:11:01 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /publisher lonconstruct.pm Message-ID: raeburn Sat Feb 2 20:11:01 2008 EDT Modified files: /loncom/publisher lonconstruct.pm Log: Bug 5607 Index: loncom/publisher/lonconstruct.pm diff -u loncom/publisher/lonconstruct.pm:1.33 loncom/publisher/lonconstruct.pm:1.34 --- loncom/publisher/lonconstruct.pm:1.33 Tue Apr 11 14:58:22 2006 +++ loncom/publisher/lonconstruct.pm Sat Feb 2 20:11:01 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Construction Space Page Wrapper for Construction # -# $Id: lonconstruct.pm,v 1.33 2006/04/11 18:58:22 albertel Exp $ +# $Id: lonconstruct.pm,v 1.34 2008/02/03 01:11:01 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -92,12 +92,12 @@ &Apache::loncommon::get_unprocessed_cgi ($ENV{'QUERY_STRING'},['forceedit']); if ($env{'form.forceedit'}) { - $lowerframe.='?editmode=Edit&problemmode=EditXML'; + $lowerframe.='?editmode=Edit&problemmode=editxml'; } &Apache::loncommon::get_unprocessed_cgi ($ENV{'QUERY_STRING'},['forceColoredit']); if ($env{'form.forceColoredit'}) { - $lowerframe.='?editmode=Edit&problemmode=Edit'; + $lowerframe.='?editmode=Edit&problemmode=edit'; } # From lon-capa-cvs-allow@mail.lon-capa.org Sun Feb 3 05:08:10 2008 From: lon-capa-cvs-allow@mail.lon-capa.org (raeburn) Date: Sun, 03 Feb 2008 05:08:10 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface lonmenu.pm mydesk.tab /lonnet/perl lonnet.pm Message-ID: raeburn Sun Feb 3 00:08:10 2008 EDT Modified files: /loncom/interface lonmenu.pm mydesk.tab /loncom/lonnet/perl lonnet.pm Log: bug 5608. CSTR icon/button/link in Main Menu for Assistant Co-author. Index: loncom/interface/lonmenu.pm diff -u loncom/interface/lonmenu.pm:1.233 loncom/interface/lonmenu.pm:1.234 --- loncom/interface/lonmenu.pm:1.233 Tue Jan 15 11:53:27 2008 +++ loncom/interface/lonmenu.pm Sun Feb 3 00:07:58 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.233 2008/01/15 16:53:27 www Exp $ +# $Id: lonmenu.pm,v 1.234 2008/02/03 05:07:58 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -415,7 +415,7 @@ ### my $editbutton = ''; if ($env{'user.author'}) { - if ($env{'request.role'}=~/^(ca|au)/) { + if ($env{'request.role'}=~/^(aa|ca|au)/) { # Set defaults for authors my ($top,$bottom) = ('con-','struct'); my $action = "go('/priv/".$env{'user.name'}."');"; @@ -428,6 +428,11 @@ ($top,$bottom) = ('co con-','struct'); $action = "go('/priv/".$caname."');"; $desc = "Enter construction space as co-author"; + } elsif ($env{'request.role'} =~ /^aa/) { + ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/); + ($top,$bottom) = ('co con-','struct'); + $action = "go('/priv/".$caname."');"; + $desc = "Enter construction space as assistant co-author"; } # Check that we are on the correct machine my $home = &Apache::lonnet::homeserver($caname,$cadom); @@ -1087,11 +1092,12 @@ } elsif ($pro eq 'author') { if ($author) { if ((($prt eq 'rca') && ($env{'request.role'}=~/^ca/)) || + (($prt eq 'raa') && ($env{'request.role'}=~/^aa/)) || (($prt eq 'rau') && ($env{'request.role'}=~/^au/))) { # Check that we are on the correct machine my $cadom=$requested_domain; my $caname=$env{'user.name'}; - if ($prt eq 'rca') { + if (($prt eq 'rca') || ($prt eq 'raa')) { ($cadom,$caname)= ($env{'request.role'}=~/($match_domain)\/($match_username)$/); } Index: loncom/interface/mydesk.tab diff -u loncom/interface/mydesk.tab:1.90 loncom/interface/mydesk.tab:1.91 --- loncom/interface/mydesk.tab:1.90 Sun Dec 30 18:22:41 2007 +++ loncom/interface/mydesk.tab Sun Feb 3 00:07:58 2008 @@ -73,6 +73,7 @@ 6:1:clear 6:1:author:rau:cstr.gif:con-[_1]:struct[_1]:go('/priv/$uname/');:Enter my resource construction space:set 6:1:author:rca:cstr.gif:co con-[_1]:struct[_2]:go('/priv/$caname/');:Enter construction space as a co-author:set +6:1:author:raa:cstr.gif:co con-[_1]:struct[_2]:go('/priv/$caname/');:Enter construction space as an assistant co-author:set 6:1:pmau:$requested_domain:conf.gif:domain[_1]:config[_1]:go('/adm/domainprefs');:Set domain configuration:dom 6:2:clear 6:2:pbre:$requested_domain:res.gif:resource[_1]:space[_1]:go('/res/$udom/?launch=1');:Browse published resources:cnt Index: loncom/lonnet/perl/lonnet.pm diff -u loncom/lonnet/perl/lonnet.pm:1.940 loncom/lonnet/perl/lonnet.pm:1.941 --- loncom/lonnet/perl/lonnet.pm:1.940 Tue Jan 22 18:12:02 2008 +++ loncom/lonnet/perl/lonnet.pm Sun Feb 3 00:08:05 2008 @@ -1,7 +1,7 @@ # The LearningOnline Network # TCP networking package # -# $Id: lonnet.pm,v 1.940 2008/01/22 23:12:02 raeburn Exp $ +# $Id: lonnet.pm,v 1.941 2008/02/03 05:08:05 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -3527,7 +3527,7 @@ } foreach my $role (keys(%{$allroles})) { my %thesepriv; - if (($role=~/^au/) || ($role=~/^ca/)) { $author=1; } + if (($role=~/^au/) || ($role=~/^ca/) || ($role=~/^aa/)) { $author=1; } foreach my $item (split(/:/,$$allroles{$role})) { if ($item ne '') { my ($privilege,$restrictions)=split(/&/,$item);