--- loncom/xml/lonxml.pm 2007/04/07 00:02:31 1.441 +++ loncom/xml/lonxml.pm 2007/08/22 19:02:06 1.453 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # XML Parser Module # -# $Id: lonxml.pm,v 1.441 2007/04/07 00:02:31 albertel Exp $ +# $Id: lonxml.pm,v 1.453 2007/08/22 19:02:06 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,6 +42,7 @@ package Apache::lonxml; use vars qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace $errorcount $warningcount); use strict; +use LONCAPA; use HTML::LCParser(); use HTML::TreeBuilder(); use HTML::Entities(); @@ -124,6 +125,9 @@ $evaluate = 1; # stores the list of active tag namespaces @namespace=(); +# stores all Scrit Vars displays for later showing +my @script_var_displays=(); + # a pointer the the Apache request object $Apache::lonxml::request=''; @@ -315,13 +319,14 @@ sub xmlparse { } } } - } elsif ($env{'construct.style'} && ($env{'request.state'} eq 'construct')) { + } elsif ($env{'construct.style'} + && ($env{'request.state'} eq 'construct')) { my $location=&Apache::lonnet::filelocation('',$env{'construct.style'}); my $styletext=&Apache::lonnet::getfile($location); - if ($styletext ne '-1') { - %style_for_target = (%style_for_target, - &Apache::style::styleparser($target,$styletext)); - } + if ($styletext ne '-1') { + %style_for_target = (%style_for_target, + &Apache::style::styleparser($target,$styletext)); + } } #&printalltags(); my @pars = (); @@ -356,6 +361,11 @@ sub xmlparse { &clean_safespace($safeeval); + if (@script_var_displays) { + $finaloutput .= join('',@script_var_displays); + undef(@script_var_displays); + } + if ($env{'form.return_only_error_and_warning_counts'}) { return "$errorcount:$warningcount"; } @@ -598,9 +608,9 @@ sub callsub { } } if ($token->[0] eq 'S') { - $currentstring.=&Apache::edit::handle_insert(); + $currentstring.=&Apache::edit::handle_insert(); } elsif ($token->[0] eq 'E') { - $currentstring.=&Apache::edit::handle_insertafter($token->[1]); + $currentstring.=&Apache::edit::handle_insertafter($token->[1]); } } } @@ -619,6 +629,7 @@ sub setup_globals { &init_counter(); @Apache::lonxml::pwd=(); @Apache::lonxml::extlinks=(); + @script_var_displays=(); @Apache::lonxml::ssi_info=(); $Apache::lonxml::post_evaluate=1; $Apache::lonxml::warnings_error_header=''; @@ -957,8 +968,8 @@ sub decreasedepth { sub get_id { my ($parstack,$safeeval)=@_; my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval); - if ($env{'request.state'} eq 'construct' && $id =~ /(\.|_)/) { - &error(&mt("IDs are not allowed to contain "_" or "."")); + if ($env{'request.state'} eq 'construct' && $id =~ /([._]|[^\w\d\s[:punct:]])/) { + &error(&mt("ID "[_1]" contains invalid characters, IDs are only allowed to contain letters, numbers, spaces and -",''.$id.'')); } if ($id =~ /^\s*$/) { $id = $Apache::lonxml::curdepth; } return $id; @@ -996,6 +1007,24 @@ sub get_all_text_unbalanced { return $result } +=pod + +For bubble grading mode and exam bubble printing mode, the tracking of +the current 'bubble line number' is stored in the %env element +'form.counter', and is modifed and handled by the following routines. + +The value of it is stored in $Apache:lonxml::counter when live and +stored back to env after done. + +=item &increment_counter($increment); + +Increments the internal counter environment variable a specified amount + +Optional Arguments: + $increment - amount to increment by (defaults to 1) + +=cut + sub increment_counter { my ($increment) = @_; if (defined($increment) && $increment gt 0) { @@ -1006,6 +1035,14 @@ sub increment_counter { $Apache::lonxml::counter_changed=1; } +=pod + +=item &init_counter($increment); + +Initialize the internal counter environment variable + +=cut + sub init_counter { if ($env{'request.state'} eq 'construct') { $Apache::lonxml::counter=1; @@ -1208,7 +1245,7 @@ sub writeallows { my %httpref=(); foreach (@extlinks) { $httpref{'httpref.'. - &Apache::lonnet::hreflocation($thisdir,$_)}=$thisurl; + &Apache::lonnet::hreflocation($thisdir,&unescape($_))}=$thisurl; } @extlinks=(); &Apache::lonnet::appenv(%httpref); @@ -1227,6 +1264,12 @@ sub do_registered_ssi { &Apache::lonnet::ssi($url,%form); } } + +sub add_script_result { + my ($display) = @_; + push(@script_var_displays, $display); +} + # # Afterburner handles anchors, highlights and links # @@ -1307,16 +1350,19 @@ SIMPLECONTENT sub inserteditinfo { - my ($result,$filecontents,$filetype)=@_; + my ($filecontents,$filetype)=@_; $filecontents = &HTML::Entities::encode($filecontents,'<>&"'); # my $editheader='Edit below
'; my $xml_help = ''; my $initialize=''; + my $textarea_id = 'filecont'; + my ($add_to_onload, $add_to_onresize); if ($filetype eq 'html') { my $addbuttons=&Apache::lonhtmlcommon::htmlareaaddbuttons(); $initialize=&Apache::lonhtmlcommon::spellheader(); if (!&Apache::lonhtmlcommon::htmlareablocked() && &Apache::lonhtmlcommon::htmlareabrowser()) { + $textarea_id .= '_htmlarea'; $initialize.=(< $addbuttons @@ -1327,6 +1373,13 @@ $addbuttons var editor=new HTMLArea("filecont",config); editor.registerPlugin(FullPage); editor.generate(); + setTimeout( + function () { + HTMLArea._addEvents(editor._doc, + ["keypress","mousedown"], unClean); + editor._iframe.id = '$textarea_id'; + resize_textarea('$textarea_id','LC_aftertextarea'); + },300); } FULLPAGE @@ -1335,13 +1388,16 @@ FULLPAGE FULLPAGE } - $result=~s/\]*)\>/\/i; + $add_to_onload = 'initDocument();'; + $add_to_onresize = "resize_textarea('$textarea_id','LC_aftertextarea');"; $xml_help=&Apache::loncommon::helpLatexCheatsheet(); } + my $cleanbut = ''; my $titledisplay=&display_title(); @@ -1358,24 +1414,26 @@ $cleanbut BUTTONS $buttons.=&Apache::lonhtmlcommon::spelllink('xmledit','filecont'); + my $textarea_events = &Apache::edit::element_change_detection(); + my $form_events = &Apache::edit::form_change_detection(); my $editfooter=(< -
+ $xml_help $buttons
- + +

$buttons
- $titledisplay +
+ ENDFOOTER -# $result=~s/(\]*\>)/$1$editheader/is; - $result=~s/(\<\/body\>)/$editfooter/is; - return $result; + return ($editfooter,$add_to_onload,$add_to_onresize);; } sub get_target { @@ -1485,24 +1543,35 @@ ENDNOTFOUND # unless ($env{'request.state'} eq 'published') { if ($env{'form.editmode'} && (!($env{'form.viewmode'})) && (!($env{'form.discardview'}))) - { + { + my ($edit_info, $add_to_onload, $add_to_onresize)= + &inserteditinfo($filecontents,$filetype); + my $displayfile=$request->uri; $displayfile=~s/^\/[^\/]*//; - my %options = (); + my %options = + ('add_entries' => + {'onresize' => $add_to_onresize, + 'onload' => $add_to_onload, }); + if ($env{'environment.remote'} ne 'off') { $options{'bgcolor'} = '#FFFFFF'; + $options{'only_body'} = 1; } - my $start_page = &Apache::loncommon::start_page(undef,undef, + my $js = + &Apache::edit::js_change_detection(). + &Apache::loncommon::resize_textarea_js(); + my $start_page = &Apache::loncommon::start_page(undef,$js, \%options); $result=$start_page. &Apache::lonxml::message_location().'

'. $displayfile. - '

'.&Apache::loncommon::end_page(); - $result=&inserteditinfo($result,$filecontents,$filetype); + ''. + $edit_info. + &Apache::loncommon::end_page(); } } if ($filetype eq 'html') { &writeallows($request->uri); } - &Apache::lonxml::add_messages(\$result); $request->print($result); @@ -1698,50 +1767,11 @@ sub get_param_var { } } -sub register_insert_tab { - my @data = split /\n/, &Apache::lonnet::getfile('/home/httpd/lonTabs/insertlist.tab'); - my $i; - my $tagnum=0; - my @order; - for ($i=0;$i < $#data; $i++) { - my $line = $data[$i]; - if ( $line =~ /^\#/ || $line =~ /^\s*\n/) { next; } - if ( $line =~ /TABLE/ ) { last; } - my ($tag,$descrip,$color,$function,$show,$helpfile,$helpdesc) = split(/,/, $line); - if ($tag) { - $insertlist{"$tagnum.tag"} = $tag; - $insertlist{"$tag.description"} = $descrip; - $insertlist{"$tag.color"} = $color; - $insertlist{"$tag.function"} = $function; - if (!defined($show)) { $show='yes'; } - $insertlist{"$tag.show"}= $show; - $insertlist{"$tag.helpfile"} = $helpfile; - $insertlist{"$tag.helpdesc"} = $helpdesc; - $insertlist{"$tag.num"}=$tagnum; - $tagnum++; - } - } - $i++; #skipping TABLE line - $tagnum = 0; - for (;$i < $#data;$i++) { - my $line = $data[$i]; - my ($mnemonic,@which) = split(/ +/,$line); - my $tag = $insertlist{"$tagnum.tag"}; - for (my $j=0;$j <=$#which;$j++) { - if ( $which[$j] eq 'Y' ) { - if ($insertlist{"$j.show"} ne 'no') { - push(@{ $insertlist{"$tag.which"} },$insertlist{"$j.tag"}); - } - } - } - $tagnum++; - } -} - sub register_insert_xml { my $parser = HTML::LCParser->new($Apache::lonnet::perlvar{'lonTabDir'} .'/insertlist.xml'); my ($tagnum,$in_help)=(0,0); + my @alltags; my $tag; while (my $token = $parser->get_token()) { if ($token->[0] eq 'S') { @@ -1750,6 +1780,7 @@ sub register_insert_xml { $tag = $token->[2]{'name'}; $insertlist{"$tagnum.tag"} = $tag; $insertlist{"$tag.num"} = $tagnum; + push(@alltags,$tag); } elsif ($in_help && $token->[1] eq 'file') { $key = $tag.'.helpfile'; } elsif ($in_help && $token->[1] eq 'description') { @@ -1763,11 +1794,7 @@ sub register_insert_xml { } elsif ($token->[1] eq 'help') { $in_help=1; } elsif ($token->[1] eq 'allow') { - my $allow = $parser->get_text(); - foreach my $element (split(',',$allow)) { - $element =~ s/(^\s*|\s*$ )//gx; - push(@{ $insertlist{$tag.'.which'} },$element); - } + $key = $tag.'.allow'; } if (defined($key)) { $insertlist{$key} = $parser->get_text(); @@ -1782,12 +1809,22 @@ sub register_insert_xml { } } } + + # parse the allows and ignore tags set to no + foreach my $tag (@alltags) { + next if (!exists($insertlist{"$tag.allow"})); + my $allow = $insertlist{"$tag.allow"}; + foreach my $element (split(',',$allow)) { + $element =~ s/(^\s*|\s*$ )//gx; + if (!exists($insertlist{"$element.show"}) + || $insertlist{"$element.show"} ne 'no') { + push(@{ $insertlist{$tag.'.which'} },$element); + } + } + } } sub register_insert { -# ®ister_insert_tab(@_); -# &dump_insertlist('1'); -# undef(%insertlist); return ®ister_insert_xml(@_); # &dump_insertlist('2'); }