version 1.460, 2007/09/12 10:58:18
|
version 1.468, 2007/10/30 00:22:27
|
Line 92 use Apache::loncacc();
|
Line 92 use Apache::loncacc();
|
use Apache::lonmaxima(); |
use Apache::lonmaxima(); |
use Apache::lonlocal; |
use Apache::lonlocal; |
|
|
#================================================== Main subroutine: xmlparse |
#==================================== Main subroutine: xmlparse |
|
|
#debugging control, to turn on debugging modify the correct handler |
#debugging control, to turn on debugging modify the correct handler |
|
|
$Apache::lonxml::debug=0; |
$Apache::lonxml::debug=0; |
|
|
# keeps count of the number of warnings and errors generated in a parse |
# keeps count of the number of warnings and errors generated in a parse |
Line 135 $Apache::lonxml::request='';
|
Line 137 $Apache::lonxml::request='';
|
$Apache::lonxml::counter=1; |
$Apache::lonxml::counter=1; |
$Apache::lonxml::counter_changed=0; |
$Apache::lonxml::counter_changed=0; |
|
|
# A count of bubble lines needed for a set.. and a check on |
# Part counter hash. In analysis mode, the |
# whether or not it is ever used too: |
# problems can use this to record which parts increment the counter |
|
# by how much. The counter subs will maintain this hash via |
|
# their optional part parameters. Note that the assumption is that |
|
# analysis is done in one request and therefore it is not necessary to |
|
# save this information request-to-request. |
|
|
$Apache::lonxml::bubble_line_counter = 1; |
|
$Apache::lonxml::bubble_line_counter_changed = 0; |
|
|
|
|
%Apache::lonxml::counters_per_part = (); |
|
|
#internal check on whether to look at style defs |
#internal check on whether to look at style defs |
$Apache::lonxml::usestyle=1; |
$Apache::lonxml::usestyle=1; |
Line 365 sub xmlparse {
|
Line 370 sub xmlparse {
|
} |
} |
&do_registered_ssi(); |
&do_registered_ssi(); |
if ($Apache::lonxml::counter_changed) { &store_counter() } |
if ($Apache::lonxml::counter_changed) { &store_counter() } |
if ($Apache::lonxml::bubble_line_counter_changed) { |
|
&store_bubble_counter(); |
|
} |
|
|
|
&clean_safespace($safeeval); |
&clean_safespace($safeeval); |
|
|
Line 629 sub callsub {
|
Line 631 sub callsub {
|
return $currentstring; |
return $currentstring; |
} |
} |
|
|
|
{ |
|
my %state; |
|
|
|
sub init_state { |
|
undef(%state); |
|
} |
|
|
|
sub set_state { |
|
my ($key,$value) = @_; |
|
$state{$key} = $value; |
|
return $value; |
|
} |
|
sub get_state { |
|
my ($key) = @_; |
|
return $state{$key}; |
|
} |
|
} |
|
|
sub setup_globals { |
sub setup_globals { |
my ($request,$target)=@_; |
my ($request,$target)=@_; |
$Apache::lonxml::request=$request; |
$Apache::lonxml::request=$request; |
Line 637 sub setup_globals {
|
Line 657 sub setup_globals {
|
$Apache::lonxml::default_homework_loaded=0; |
$Apache::lonxml::default_homework_loaded=0; |
$Apache::lonxml::usestyle=1; |
$Apache::lonxml::usestyle=1; |
&init_counter(); |
&init_counter(); |
&init_bubble_counter(); |
&clear_bubble_lines_for_part(); |
|
&init_state(); |
@Apache::lonxml::pwd=(); |
@Apache::lonxml::pwd=(); |
@Apache::lonxml::extlinks=(); |
@Apache::lonxml::extlinks=(); |
@script_var_displays=(); |
@script_var_displays=(); |
Line 1020 sub get_all_text_unbalanced {
|
Line 1041 sub get_all_text_unbalanced {
|
} |
} |
} |
} |
return $result |
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.bubble_line_counter', and is modifed and handled by |
|
the following routines. |
|
|
|
The value of it is stored in $Apache:lonxml::bubble_line_counter when |
|
live and stored back to env after done. |
|
|
|
=item &increment_bubble_counter($increment) |
|
|
|
Increments the bubble line counter by the optional value |
|
$increment (defaults to 1). |
|
|
|
'bad increments' are also treated as an increment of 1. |
|
('bad' means <=0). |
|
|
|
=cut |
|
|
|
sub increment_bubble_counter { |
|
my ($increment) = @_; |
|
if (!defined($increment) || $increment le 0) { |
|
$increment = 1; |
|
} |
|
$Apache::lonxml::bubble_line_counter += $increment; |
|
$Apache::lonxml::bubble_line_counter_changed = 1; |
|
} |
} |
=pod |
|
|
|
=item &init_bubble_counter |
|
|
|
Initialize the internal counter to the env. variable |
|
or 1 if we are inconstruction space, or if the env var |
|
is not defined. |
|
|
|
=cut |
######################################################################### |
|
# # |
sub init_bubble_counter { |
# bubble line counter management # |
if ($env{'request.state'} eq 'construct') { |
# # |
$Apache::lonxml::bubble_line_counter = 1; |
######################################################################### |
$Apache::lonxml::bubble_line_counter_changed = 1; |
|
} elsif (defined($env{'form.bubble_line_counter'})) { |
|
$Apache::lonxml::bubble_line_counter = |
|
$env{'form.bubble_line_counter'}; |
|
$Aapche::lonxml::bubble_line_counter_changed = 0; |
|
} else { |
|
$Apache::lonxml::bubble_line_counter = 1; |
|
$Apache::lonxml::bubble_line_counter_changed = 1; |
|
} |
|
|
|
} |
|
|
|
=pod |
|
|
|
=item store_bubble_counter; |
|
|
|
Store the bubble line counter in its env var. The changed flag |
|
is reset indicating the env is up to date with respect to the |
|
local variable. |
|
=cut |
|
|
|
sub store_bubble_counter { |
|
&Apache::lonnet::appenv(('form.bubble.counter' => |
|
$Apache::lonxml::bubble_line_counter)); |
|
$Apache::lonnet::bubble_line_counter_changed = 0; |
|
|
|
return ''; |
|
} |
|
|
|
=pod |
|
|
|
The next set of subs allow a single level of save/restore for the |
|
bubble_line_counter. |
|
|
|
=cut |
|
|
|
{ |
|
my $bubble_counter_state; |
|
|
|
sub clear_bubble_counter { |
|
undef($bubble_counter_state); |
|
&Apache::lonnet::delenv('form.bubble_line_counter'); |
|
&Apache::lonxml::init_bubble_counter(); |
|
&Apache::lonxml::store_bubble_counter(); |
|
} |
|
|
|
sub remember_bubble_counter { |
|
&Apache::lonnet::transfer_profile_to_env(undef,undef, 1); |
|
$bubble_counter_state = $env{'form.bubble_line_counter'}; |
|
} |
|
|
|
sub restore_bubble_counter { |
|
if (defined($bubble_counter_state)) { |
|
&Apache::lonnet::appenv(('form.bubble_line_counter' => |
|
$bubble_counter_state)); |
|
} |
|
} |
|
|
|
sub get_bubble_counter { |
|
if ($Apache::lonxml::bubble_line_counter_changed) { |
|
&store_bubble_counter(); |
|
} |
|
&Apache::lonnet::transfer_profile_to_env(undef, undef, 1); |
|
return $env{'form.bubble_line_counter'}; |
|
} |
|
} |
|
|
|
=pod |
=pod |
|
|
Line 1146 Increments the internal counter environm
|
Line 1065 Increments the internal counter environm
|
|
|
Optional Arguments: |
Optional Arguments: |
$increment - amount to increment by (defaults to 1) |
$increment - amount to increment by (defaults to 1) |
|
Also 1 if the value is negative or zero. |
|
$part_response - A concatenation of the part and response id |
|
identifying exactly what is being 'answered'. |
|
|
|
|
=cut |
=cut |
|
|
sub increment_counter { |
sub increment_counter { |
my ($increment) = @_; |
my ($increment, $part_response) = @_; |
if (defined($increment) && $increment gt 0) { |
if (!defined($increment) || $increment le 0) { |
$Apache::lonxml::counter+=$increment; |
$increment = 1; |
} else { |
|
$Apache::lonxml::counter++; |
|
} |
} |
|
$Apache::lonxml::counter += $increment; |
|
|
|
# If the caller supplied the response_id parameter, |
|
# Maintain its counter.. creating if necessary. |
|
|
|
if(defined($part_response)) { |
|
if (!defined($Apache::lonxml::counters_per_part{$part_response})) { |
|
$Apache::lonxml::counters_per_part{$part_response} = 0; |
|
} |
|
$Apache::lonxml::counters_per_part{$part_response} += $increment; |
|
my $new_value = $Apache::lonxml::counters_per_part{$part_response}; |
|
} |
|
|
$Apache::lonxml::counter_changed=1; |
$Apache::lonxml::counter_changed=1; |
} |
} |
|
|
=pod |
=pod |
|
|
=item &init_counter; |
=item &init_counter($increment); |
|
|
Initialize the internal counter environment variable |
Initialize the internal counter environment variable |
|
|
Line 1205 sub store_counter {
|
Line 1139 sub store_counter {
|
&Apache::lonnet::appenv(('form.counter' => $state)); |
&Apache::lonnet::appenv(('form.counter' => $state)); |
} |
} |
} |
} |
|
|
sub get_problem_counter { |
sub get_problem_counter { |
if ($Apache::lonxml::counter_changed) { &store_counter() } |
if ($Apache::lonxml::counter_changed) { &store_counter() } |
&Apache::lonnet::transfer_profile_to_env(undef,undef,1); |
&Apache::lonnet::transfer_profile_to_env(undef,undef,1); |
return $env{'form.counter'}; |
return $env{'form.counter'}; |
} |
} |
|
} |
|
|
|
=pod |
|
|
|
=item bubble_lines_for_part(part_response) |
|
|
|
Returns the number of lines required to get a response for |
|
$part_response (this is just $Apache::lonxml::counters_per_part{$part_response} |
|
|
|
=cut |
|
|
|
sub bubble_lines_for_part { |
|
my ($part_response) = @_; |
|
|
|
if (!defined($Apache::lonxml::counters_per_part{$part_response})) { |
|
return 0; |
|
} else { |
|
return $Apache::lonxml::counters_per_part{$part_response}; |
|
} |
|
|
|
} |
|
|
|
=pod |
|
|
|
=item clear_bubble_lines_for_part |
|
|
|
Clears the hash of bubble lines per part. If a caller |
|
needs to analyze several resources this should be called between |
|
resources to reset the hash for each problem being analyzed. |
|
|
|
=cut |
|
|
|
sub clear_bubble_lines_for_part { |
|
undef(%Apache::lonxml::counters_per_part); |
} |
} |
|
|
|
=pod |
|
|
|
=item set_bubble_lines(part_response, value) |
|
|
|
If there is a problem part, that for whatever reason |
|
requires bubble lines that are not |
|
the same as the counter increment, it can call this sub during |
|
analysis to set its hash value explicitly. |
|
|
|
=cut |
|
|
|
sub set_bubble_lines { |
|
my ($part_response, $value) = @_; |
|
|
|
$Apache::lonxml::counters_per_part{$part_response} = $value; |
|
} |
|
|
|
=pod |
|
|
|
=item get_bubble_line_hash |
|
|
|
Returns the current bubble line hash. This is assumed to |
|
be small so we return a copy |
|
|
|
|
|
=cut |
|
|
|
sub get_bubble_line_hash { |
|
return %Apache::lonxml::counters_per_part; |
|
} |
|
|
|
|
|
#-------------------------------------------------- |
|
|
sub get_all_text { |
sub get_all_text { |
my($tag,$pars,$style)= @_; |
my($tag,$pars,$style)= @_; |
my $gotfullstack=1; |
my $gotfullstack=1; |
Line 1483 sub inserteditinfo {
|
Line 1483 sub inserteditinfo {
|
my $initialize=''; |
my $initialize=''; |
my $textarea_id = 'filecont'; |
my $textarea_id = 'filecont'; |
my ($add_to_onload, $add_to_onresize); |
my ($add_to_onload, $add_to_onresize); |
my $addbuttons=&Apache::lonhtmlcommon::htmlareaaddbuttons(); |
|
$initialize=&Apache::lonhtmlcommon::spellheader(); |
$initialize=&Apache::lonhtmlcommon::spellheader(); |
if ($filetype eq 'html' |
if ($filetype eq 'html' |
&& (!&Apache::lonhtmlcommon::htmlareablocked() && |
&& (!&Apache::lonhtmlcommon::htmlareablocked() && |
&Apache::lonhtmlcommon::htmlareabrowser())) { |
&Apache::lonhtmlcommon::htmlareabrowser())) { |
$textarea_id .= '_htmlarea'; |
$textarea_id .= '___Frame'; |
|
my $lang = &Apache::lonhtmlcommon::htmlarea_lang(); |
$initialize.=(<<FULLPAGE); |
$initialize.=(<<FULLPAGE); |
<script type="text/javascript"> |
<script type="text/javascript"> |
$addbuttons |
lonca |
|
|
HTMLArea.loadPlugin("FullPage"); |
|
|
|
function initDocument() { |
function initDocument() { |
var editor=new HTMLArea("filecont",config); |
var oFCKeditor = new FCKeditor('filecont'); |
editor.registerPlugin(FullPage); |
oFCKeditor.Config['CustomConfigurationsPath'] = '/fckeditor/loncapaconfig.js' ; |
editor.generate(); |
oFCKeditor.Config['FullPage'] = true |
setTimeout( |
oFCKeditor.Config['AutoDetectLanguage'] = false; |
function () { |
oFCKeditor.Config['DefaultLanguage'] = "$lang"; |
HTMLArea._addEvents(editor._doc, |
oFCKeditor.ReplaceTextarea(); |
["keypress","mousedown"], unClean); |
} |
editor._iframe.id = '$textarea_id'; |
function check_if_dirty(editor) { |
resize_textarea('$textarea_id','LC_aftertextarea'); |
if (editor.IsDirty()) { |
},300); |
unClean(); |
|
} |
|
} |
|
function FCKeditor_OnComplete(editor) { |
|
editor.Events.AttachEvent("OnSelectionChange",check_if_dirty); |
|
resize_textarea('$textarea_id','LC_aftertextarea'); |
} |
} |
</script> |
</script> |
FULLPAGE |
FULLPAGE |
} else { |
} else { |
$initialize.=(<<FULLPAGE); |
$initialize.=(<<FULLPAGE); |
<script type="text/javascript"> |
<script type="text/javascript"> |
$addbuttons |
|
function initDocument() { |
function initDocument() { |
resize_textarea('$textarea_id','LC_aftertextarea'); |
resize_textarea('$textarea_id','LC_aftertextarea'); |
} |
} |