--- loncom/xml/lonxml.pm 2002/12/09 22:40:18 1.220 +++ loncom/xml/lonxml.pm 2003/02/14 15:14:37 1.233 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # XML Parser Module # -# $Id: lonxml.pm,v 1.220 2002/12/09 22:40:18 albertel Exp $ +# $Id: lonxml.pm,v 1.233 2003/02/14 15:14:37 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -41,7 +41,6 @@ # 6/1/1 Gerd Kortemeyer # 2/21,3/13 Guy # 3/29,5/4 Gerd Kortemeyer -# 5/10 Scott Harrison # 5/26 Gerd Kortemeyer # 5/27 H. K. Ng # 6/2,6/3,6/8,6/9 Gerd Kortemeyer @@ -146,7 +145,7 @@ $Apache::lonxml::registered=0; $Apache::lonxml::request=''; # a problem number counter, and check on ether it is used -$Apache::lonxml::counter=1; +$Apache::lonxml::counter=4; $Apache::lonxml::counter_changed=0; #internal check on whether to look at style defs @@ -192,7 +191,8 @@ sub xmlend { my $idx; for ($idx=1;$idx<=$contrib{'version'};$idx++) { my $hidden=($contrib{'hidden'}=~/\.$idx\./); - unless (($hidden) && (!$seeid)) { + my $deleted=($contrib{'deleted'}=~/\.$idx\./); + unless ((($hidden) && (!$seeid)) || ($deleted)) { my $message=$contrib{$idx.':message'}; $message=~s/\n/\<br \/\>/g; $message=&Apache::lontexconvert::msgtexconverted($message); @@ -226,8 +226,10 @@ sub xmlend { } else { $sender.=' <a href="/adm/feedback?hide='. $symb.':::'.$idx.'">Hide</a>'; - } - } + } + $sender.=' <a href="/adm/feedback?deldisc='. + $symb.':::'.$idx.'">Delete</a>'; + } } else { if ($screenname) { $sender='<i>'.$screenname.'</i>'; @@ -268,7 +270,7 @@ sub tokeninputfield { my $defhost=$Apache::lonnet::perlvar{'lonHostID'}; $defhost=~tr/a-z/A-Z/; return (<<ENDINPUTFIELD) -<script> +<script type="text/javascript"> function updatetoken() { var comp=new Array; var barcode=unescape(document.tokeninput.barcode.value); @@ -352,7 +354,7 @@ sub printtokenheader { if ($target eq 'web') { my %idhash=&Apache::lonnet::idrget($tudom,($tuname)); return - '<img align="right" src="/cgi-bin/barcode.gif?encode='.$token.'" />'. + '<img align="right" src="/cgi-bin/barcode.png?encode='.$token.'" />'. 'Checked out for '.$plainname. '<br />User: '.$tuname.' at '.$tudom. '<br />ID: '.$idhash{$tuname}. @@ -374,62 +376,50 @@ sub fontsettings() { return $headerstring; } - -## -## switchmenu - modeled on lonmenu::switchmenu, but better. -## Helper function for registerurl -## -sub switchmenu { - my ($row,$col,$imgsrc,$texttop,$textbot,$action,$description)=@_; - return(<<ENDSMENU); - menu.switchbutton($row,$col,'$imgsrc','$texttop','$textbot','$action','$description'); -ENDSMENU -} - sub registerurl { my $forcereg=shift; my $target = shift; my $result = ''; if ($target eq 'edit') { - $result .="<script>\n". - "if (typeof menu != 'undefined') {menu.currentURL=null;}\n". + $result .="<script type=\"text/javascrtipt\">\n". + "if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n". &Apache::loncommon::browser_and_searcher_javascript(). "\n</script>\n"; } - if ((($ENV{'request.publicaccess'}) || + if (($ENV{'browser.interface'} eq 'textual') || + ((($ENV{'request.publicaccess'}) || (!&Apache::lonnet::is_on_map($ENV{'REQUEST_URI'}))) && - (!$forcereg)) { + (!$forcereg))) { return $result. - '<script>function LONCAPAreg(){} function LONCAPAstale(){}</script>'; + '<script type="text/javascript">function LONCAPAreg(){;} function LONCAPAstale(){}</script>'; } if ($Apache::lonxml::registered && !$forcereg) { return ''; } $Apache::lonxml::registered=1; - my $nothing=''; - if ($ENV{'browser.type'} eq 'explorer') { $nothing='javascript:void(0);'; } + my $reopen=&Apache::lonmenu::reopenmenu(); my $newmail=''; if (&Apache::lonmsg::newmail()) { - $newmail='menu.setstatus("you have","messages");'; + $newmail='swmenu.setstatus("you have","messages");'; } - my $timesync='menu.syncclock(1000*'.time.');'; + my $timesync='swmenu.syncclock(1000*'.time.');'; if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) { my $hwkadd=''; if ($ENV{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form)$/) { if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) { $hwkadd.=(<<ENDSUBM); - menu.switchbutton(7,1,'subm.gif','view sub','missions','gocmd("/adm/grades","submission")', + swmenu.switchbutton(7,1,'subm.gif','view sub','missions','gocmd("/adm/grades","submission")', 'View user submissions for this assessment resource'); ENDSUBM } if (&Apache::lonnet::allowed('mgr',$ENV{'request.course.id'})) { $hwkadd.=(<<ENDGRDS); - menu.switchbutton(7,2,'pgrd.gif','problem','grades','gocmd("/adm/grades","gradingmenu")', + swmenu.switchbutton(7,2,'pgrd.gif','problem','grades','gocmd("/adm/grades","gradingmenu")', 'Modify user grades for this assessment resource'); ENDGRDS } if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { $hwkadd.=(<<ENDPARM); - menu.switchbutton(7,3,'pparm.gif','problem','parms','gocmd("/adm/parmset","set")', + swmenu.switchbutton(7,3,'pparm.gif','problem','parms','gocmd("/adm/parmset","set")', 'Modify deadlines, etc, for this assessment resource'); ENDPARM } @@ -451,14 +441,14 @@ ENDPARM if ($ENV{'request.role'} =~ /^ca/) { ($cadom,$caname)=($ENV{'request.role'}=~/(\w+)\/(\w+)$/); ($top,$bottom) = ('co con-','struct'); - $action = 'go("/priv/'.$caname.'");'; + $action = "go('/priv/".$caname."');"; $desc = "Enter construction space as co-author"; } # Check that we are on the correct machine my $home = &Apache::lonnet::homeserver($caname,$cadom); if ($home eq $Apache::lonnet::perlvar{'lonHostID'}) { - $editbutton=&switchmenu - (6,1,$top,,$bottom,$action,$desc); + $editbutton=&Apache::lonmenu::switch + ('','',6,1,$top,,$bottom,$action,$desc); } } ## @@ -481,11 +471,11 @@ ENDPARM } # Finally, turn the button on or off if ($cfile) { - $editbutton=&switchmenu - (6,1,'cstr.gif','edit','resource', - 'go("'.$cfile.'");',"Edit this resource"); + $editbutton=&Apache::lonmenu::switch + ('','',6,1,'cstr.gif','edit','resource', + "go('".$cfile."');","Edit this resource"); } elsif ($editbutton eq '') { - $editbutton = ' menu.clearbut(6,1);'; + $editbutton = ' swmenu.clearbut(6,1);'; } } ### @@ -496,49 +486,49 @@ ENDPARM // BEGIN LON-CAPA Internal function LONCAPAreg() { - menu=window.open("$nothing","LONCAPAmenu","",false); - menu.clearTimeout(menu.menucltim); + swmenu=$reopen; + swmenu.clearTimeout(swmenu.menucltim); $timesync $newmail - menu.currentURL=window.location.pathname; - menu.reloadURL=window.location.pathname; - menu.currentSymb="$ENV{'request.symb'}"; - menu.reloadSymb="$ENV{'request.symb'}"; - menu.currentStale=0; - menu.clearbut(3,1); - menu.switchbutton - (6,3,'catalog.gif','catalog','info','catalog_info()'); - menu.switchbutton + swmenu.currentURL=window.location.pathname; + swmenu.reloadURL=window.location.pathname; + swmenu.currentSymb="$ENV{'request.symb'}"; + swmenu.reloadSymb="$ENV{'request.symb'}"; + swmenu.currentStale=0; + swmenu.clearbut(3,1); + swmenu.switchbutton + (6,3,'catalog.gif','catalog','info','catalog_info()','Show catalog information'); + swmenu.switchbutton (8,1,'eval.gif','evaluate','this','gopost("/adm/evaluate",currentURL)','Provide my evaluation of this resource'); - menu.switchbutton + swmenu.switchbutton (8,2,'fdbk.gif','feedback','discuss','gopost("/adm/feedback",currentURL)','Provide feedback messages or contribute to the course discussion about this resource'); - menu.switchbutton + swmenu.switchbutton (8,3,'prt.gif','prepare','printout','gopost("/adm/printout",currentURL)','Prepare a printable document'); - menu.switchbutton + swmenu.switchbutton (2,1,'back.gif','backward','','gopost("/adm/flip","back:"+currentURL)','Go to the previous resource in the course sequence'); - menu.switchbutton + swmenu.switchbutton (2,3,'forw.gif','forward','','gopost("/adm/flip","forward:"+currentURL)','Go to the next resource in the course sequence'); - menu.switchbutton + swmenu.switchbutton (9,1,'sbkm.gif','set','bookmark','set_bookmark()','Set a bookmark for this resource'); - menu.switchbutton + swmenu.switchbutton (9,2,'vbkm.gif','view','bookmark','edit_bookmarks()','Use or edit my bookmark collection'); - menu.switchbutton + swmenu.switchbutton (9,3,'anot.gif','anno-','tations','annotate()','Make notes and annotations about this resource'); $hwkadd $editbutton } function LONCAPAstale() { - menu=window.open("$nothing","LONCAPAmenu","",false); - menu.currentStale=1; - if (menu.reloadURL!='' && menu.reloadURL!= null) { - menu.switchbutton + swmenu=$reopen + swmenu.currentStale=1; + if (swmenu.reloadURL!='' && swmenu.reloadURL!= null) { + swmenu.switchbutton (3,1,'reload.gif','return','location','go(reloadURL)','Return to the last known location in the course sequence'); } - menu.clearbut(7,1); - menu.clearbut(7,2); - menu.clearbut(7,3); - menu.menucltim=menu.setTimeout( + swmenu.clearbut(7,1); + swmenu.clearbut(7,2); + swmenu.clearbut(7,3); + swmenu.menucltim=swmenu.setTimeout( 'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+ 'clearbut(9,1);clearbut(9,2);clearbut(9,3);clearbut(6,3);clearbut(6,1)', 2000); @@ -556,19 +546,19 @@ ENDREGTHIS // BEGIN LON-CAPA Internal function LONCAPAreg() { - menu=window.open("$nothing","LONCAPAmenu","",false); + swmenu=$reopen $timesync - menu.currentStale=1; - menu.clearbut(2,1); - menu.clearbut(2,3); - menu.clearbut(8,1); - menu.clearbut(8,2); - menu.clearbut(8,3); - if (menu.currentURL) { - menu.switchbutton + swmenu.currentStale=1; + swmenu.clearbut(2,1); + swmenu.clearbut(2,3); + swmenu.clearbut(8,1); + swmenu.clearbut(8,2); + swmenu.clearbut(8,3); + if (swmenu.currentURL) { + swmenu.switchbutton (3,1,'reload.gif','return','location','go(currentURL)'); } else { - menu.clearbut(3,1); + swmenu.clearbut(3,1); } } @@ -602,6 +592,9 @@ sub xmlparse { my ($request,$target,$content_file_string,$safeinit,%style_for_target) = @_; &setup_globals($request,$target); + &Apache::inputtags::initialize_inputtags(); + &Apache::outputtags::initialize_outputtags(); + &Apache::edit::initialize_edit(); # # do we have a course style file? # @@ -667,18 +660,24 @@ sub htmlclean { } sub latex_special_symbols { - my ($current_token,$stack,$parstack)=@_; - $current_token=~s/\\ /\\char92 /g; - $current_token=~s/\^/\\char94 /g; - $current_token=~s/\~/\\char126 /g; - $current_token=~s/(&[^a-z\#])/\\$1/g; - $current_token=~s/([^&])\#/$1\\#/g; - $current_token=~s/(\$|_|{|})/\\$1/g; - $current_token=~s/\\char92 /\\texttt{\\char92}/g; - $current_token=~s/>/\$>\$/g; #more - $current_token=~s/</\$<\$/g; #less - if ($current_token=~m/\d%/) {$current_token =~ s/(\d)%/$1\\%/g;} #percent after digit - if ($current_token=~m/\s%/) {$current_token =~ s/(\s)%/$1\\%/g;} #persent after space + my ($current_token,$stack,$parstack,$where)=@_; + if ($where=='header') { + $current_token =~ s/_/ /g; + $current_token =~ s/\^/ /g; + $current_token =~ s/&/\\&/g; + } else { + $current_token=~s/\\ /\\char92 /g; + $current_token=~s/\^/\\char94 /g; + $current_token=~s/\~/\\char126 /g; + $current_token=~s/(&[^a-z\#])/\\$1/g; + $current_token=~s/([^&])\#/$1\\#/g; + $current_token=~s/(\$|_|{|})/\\$1/g; + $current_token=~s/\\char92 /\\texttt{\\char92}/g; + $current_token=~s/>/\$>\$/g; #more + $current_token=~s/</\$<\$/g; #less + if ($current_token=~m/\d%/) {$current_token =~ s/(\d)%/$1\\%/g;} #percent after digit + if ($current_token=~m/\s%/) {$current_token =~ s/(\s)%/$1\\%/g;} #persent after space + } return $current_token; } @@ -771,7 +770,7 @@ sub inner_xmlparse { if ($token->[0] eq 'E') { &end_tag($stack,$parstack,$token); } - } + } if ($#$pars > -1) { pop @$pars; pop @Apache::lonxml::pwd; @@ -1113,7 +1112,9 @@ sub store_counter { sub get_all_text { my($tag,$pars)= @_; &Apache::lonxml::debug("Got a ".ref($pars)); + my $gotfullstack=1; if (ref($pars) ne 'ARRAY') { + $gotfullstack=0; $pars=[$pars]; } my $depth=0; @@ -1122,7 +1123,8 @@ sub get_all_text { if ( $tag =~ m:^/: ) { my $tag=substr($tag,1); #&Apache::lonxml::debug("have:$tag:"); - while (($depth >=0) && ($#$pars > -1)) { + my $top_empty=0; + while (($depth >=0) && ($#$pars > -1) && (!$top_empty)) { while (($depth >=0) && ($token = $$pars[-1]->get_token)) { #&Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]:".$#$pars.":".$#Apache::lonxml::pwd); if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) { @@ -1140,11 +1142,21 @@ sub get_all_text { } } } + if (($depth >=0) && ($#$pars == 0) ) { $top_empty=1; } if (($depth >=0) && ($#$pars > 0) ) { pop(@$pars); pop(@Apache::lonxml::pwd); } } + if ($top_empty && $depth >= 0) { + #never found the end tag ran out of text, throw error send back blank + &error('Never found end tag for <'.$tag.'>'); + if ($gotfullstack) { + my $newstring='</'.$tag.'>'.$result; + &Apache::lonxml::newparser($pars,\$newstring); + } + $result=''; + } } else { while ($#$pars > -1) { while ($token = $$pars[-1]->get_token) { @@ -1196,7 +1208,7 @@ sub parstring { foreach (@{$token->[3]}) { unless ($_=~/\W/) { my $val=$token->[2]->{$_}; - $val =~ s/([\%\@\\\"])/\\$1/g; + $val =~ s/([\%\@\\\"\'])/\\$1/g; #if ($val =~ m/^[\%\@]/) { $val="\\".$val; } $temp .= "my \$$_=\"$val\";" } @@ -1250,7 +1262,7 @@ sub afterburn { $matchthis=~s/\_+/\\s\+/g; $result=~s/($matchthis)/\<a name=\"$anchorname\"\>$1\<\/a\>/s; $result.=(<<"ENDSCRIPT"); -<script> +<script type="text/javascript"> document.location.hash='$anchorname'; </script> ENDSCRIPT @@ -1486,14 +1498,22 @@ sub get_param_var { if ( ! $context ) { $context = -1; } my $args =''; if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } + &Apache::lonxml::debug("Args are $args param is $param"); if ($case_insensitive) { if (! ($args=~s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei)) { return undef; } } elsif ( $args !~ /my \$\Q$param\E=\"/ ) { return undef; } my $value=&Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #' - if ($value =~ /^[\$\@\%]/) { - return &Apache::run::run("return $value",$safeeval,1); + &Apache::lonxml::debug("first run is $value"); + if ($value =~ /^[\$\@\%]\w+$/) { + &Apache::lonxml::debug("doing second"); + my @result=&Apache::run::run("return $value",$safeeval,1); + if (!defined($result[0])) { + return $value + } else { + if (wantarray) { return @result; } else { return $result[0]; } + } } else { return $value; }