--- loncom/homework/structuretags.pm 2011/12/12 11:40:30 1.497.2.2
+++ loncom/homework/structuretags.pm 2011/12/27 20:13:22 1.500
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# definition of tags that give a structure to a document
#
-# $Id: structuretags.pm,v 1.497.2.2 2011/12/12 11:40:30 foxr Exp $
+# $Id: structuretags.pm,v 1.500 2011/12/27 20:13:22 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -61,6 +61,7 @@ use Apache::lonlocal;
use Apache::lonxml;
use Apache::londefdef;
use Apache::lonenc();
+use Apache::loncommon();
use Time::HiRes qw( gettimeofday tv_interval );
use lib '/home/httpd/lib/perl/';
use LONCAPA;
@@ -69,6 +70,105 @@ BEGIN {
&Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startpartmarker','startouttext','endpartmarker','endouttext','simpleeditbutton','definetag'));
}
+
+#---------------------------------------------------------------------------------
+#
+# This section of code deals with hyphenation management.
+# We must do three things:
+# - keep track fo the desired languages to alter the header.
+# - provide hyphenation selection as needed by each language that appears in the
+# text.
+# - Provide the header text needed to make available the desired hyphenations.
+#
+#
+
+# Hash whose keys are the languages encountered in the document/resource.
+#
+
+my %languages_required;
+##
+# Given a language selection as input returns a chunk of LaTeX that
+# selects the required hyphenator.
+#
+# @param language - the language being selected.
+# @return string
+# @retval The LaTeX needed to select the hyphenation appropriate to the language.
+#
+sub select_hyphenation {
+ my $language = shift;
+
+ $language = &Apache::loncommon::latexlanguage($language); # Translate -> latex language.
+
+ # If there is no latex language there's not much we can do:
+
+ if ($language) {
+ &require_language($language);
+ my $babel_hyphenation = "\\selectlanguage{$language}";
+
+ return $babel_hyphenation;
+ } else {
+ return '';
+ }
+}
+##
+# Selects hyphenation based on the current problem metadata.
+# This requires that
+# - There is a language metadata item set for the problem.
+# - The language has a latex/babel hyphenation.
+#
+# @note: Uses &Apache::lonxml::request to locate the Uri associated with
+# this problem.
+# @return string (possibly empty).
+# @retval If not empty an appropriate \selectlanguage{} directive.
+#
+sub select_metadata_hyphenation {
+ my $uri = $Apache::lonxml::request->uri;
+ my $language = &Apache::lonnet::metadata($uri, 'language');
+ my $latex_language = &Apache::loncommon::latexhyphenation($language);
+ if ($latex_language) {
+ return '\selectlanguage{'.$latex_language."}\n";
+ }
+ return ''; # no latex hyphenation or no lang metadata.
+}
+
+
+##
+# Clears the set of languages required by the document being rendered.
+#
+sub clear_required_languages {
+ %languages_required = ();
+}
+##
+# Allows an external client of this module to register a need for a language:
+#
+# @param LaTeX language required:
+#
+sub require_language {
+ my $language = shift;
+ $languages_required{$language} = 1;
+}
+
+##
+# Provides the header for babel that indicates the languages
+# the document requires.
+# @return string
+# @retval \usepackage[lang1,lang2...]{babel}
+# @retval '' if there are no languages_required.
+sub languages_header {
+ my $header ='';
+ my @languages = (keys(%languages_required));
+
+ # Only generate the header if there are languages:
+
+ if (scalar @languages) {
+ my $language_list = join(',', (@languages));
+ $header = '\usepackage['.$language_list."]{babel}\n";
+ }
+ return $header;
+}
+
+#----------------------------------------------------------------------------------
+
sub start_web {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
if ($target ne 'edit' && $target ne 'modified') {
@@ -960,6 +1060,9 @@ sub reset_problem_globals {
undef(%Apache::lonhomework::history);
undef(%Apache::lonhomework::results);
undef($Apache::inputtags::part);
+ if ($type eq 'Task') {
+ undef($Apache::inputtags::slot_name);
+ }
#don't undef this, lonhomework.pm takes care of this, we use this to
#detect if we try to do 2 problems in one file
# undef($Apache::lonhomework::parsing_a_problem);
@@ -1129,6 +1232,9 @@ sub start_problem {
( $status eq 'BANNED') ||
( $status eq 'UNAVAILABLE') ||
( $status eq 'NOT_IN_A_SLOT') ||
+ ( $status eq 'NOTRESERVABLE') ||
+ ( $status eq 'RESERVABLE') ||
+ ( $status eq 'RESERVABLE_LATER') ||
( $status eq 'INVALID_ACCESS')) {
my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
$style);
@@ -1138,9 +1244,12 @@ sub start_problem {
$msg.='
'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'
';
} elsif ($status eq 'NOT_IN_A_SLOT') {
$msg.=''.&mt('You are not currently signed up to work at this time and/or place.').'
';
+ } elsif (($status eq 'RESERVABLE') || ($status eq 'RESERVABLE_LATER') ||
+ ($status eq 'NOTRESERVABLE')) {
+ $msg.=''.&mt('Access requires reservation to work at specific time/place.').'
';
} elsif ($status ne 'NOT_YET_VIEWED') {
$msg.=''.&mt('Not open to be viewed').'
';
- }
+ }
if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
$msg.=&mt('The problem ').$accessmsg;
} elsif ($status eq 'UNCHECKEDOUT') {
@@ -1149,6 +1258,16 @@ sub start_problem {
$msg.=&firstaccess_msg($accessmsg,$symb);
} elsif ($status eq 'NOT_IN_A_SLOT') {
$msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");
+ } elsif ($status eq 'RESERVABLE') {
+ $msg.=&mt('Available to make a reservation.').' '.&mt('Reservation window closes [_1].',
+ &Apache::lonnavmaps::timeToHumanString($accessmsg,'end')).
+ '
'.
+ &Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");
+ } elsif ($status eq 'RESERVABLE_LATER') {
+ $msg.=&mt('Window to make a reservation will open [_1].',
+ &Apache::lonnavmaps::timeToHumanString($accessmsg,'start'));
+ } elsif ($status eq 'NOTRESERVABLE') {
+ $msg.=&mt('Not available to make a reservation.');
}
$result.=$msg.'
';
} elsif ($target eq 'tex') {
@@ -1209,6 +1328,8 @@ sub start_problem {
}
} elsif ($target eq 'tex') {
$result .= 'INSERTTEXFRONTMATTERHERE';
+ $result .= &select_metadata_hyphenation();
+
}
} elsif ($target eq 'edit') {
@@ -1265,6 +1386,7 @@ sub end_problem {
}
my $name_of_resourse= &Apache::lonxml::latex_special_symbols(&get_resource_name($parstack,$safeeval),'header');
my $begin_doc=' \typeout{STAMPOFPASSEDRESOURCESTART Resource "'.$name_of_resourse.'"
located in
'.$env{'request.uri'}.'
STAMPOFPASSEDRESOURCEEND} \noindent ';
+ &clear_required_languages();
my $toc_line='\vskip 1 mm\noindent '.$startminipage.
'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';
@@ -1581,14 +1703,15 @@ sub start_languageblock {
# Now loop over all languages in order of preference
+ my $render;
foreach my $preferred_language (@preferred_languages) {
# If neither include/nor exlude is present the block is going
# to get rendered.
- my $render=1;
my $found=0;
-
+ $render=1;
+
# If include is specified, don't render the block
# unless the preferred language is included in the set.
@@ -1657,7 +1780,7 @@ sub end_languageblock {
}
return $result;
}
-
+# languagblock specific tags:
{
# For chunks of a resource that has translations, this hash contains
# the translations available indexed by language name.
@@ -1716,14 +1839,55 @@ sub end_languageblock {
my @possibilities = keys(%available_texts);
my $which =
&Apache::loncommon::languages(\@possibilities) || 'default';
- $result = $available_texts{$which};
+ if ($target eq 'tex') {
+ $result = &select_hyphenation($which);
+ }
+ $result .= $available_texts{$which};
+ if ($target eq 'tex') {
+ $result .= &select_metadata_hyphenation(); # Restore original language.
+ }
}
undef(%available_texts);
&Apache::lonxml::deregister('Apache::structuretags',('lang'));
return $result;
}
-
+ #
+ # Specifies that the block contained within it is a translation
+ # for a specific language specified by the 'which' attribute. The
+ # 'other' attribute can be used by itself or in conjunction with
+ # which to specify this tag _may_ be used as a translation for some
+ # list of languages. e.g.:
+ # specifying that the block provides a translation for US (primary)
+ # Canadian, Australian and UK Englush.
+ #
+ # Comment: this seems a bit silly why not just support a list of languages
+ # e.g. and ditch the other attribute?
+ #
+ # Effect:
+ # The material within the .. block is stored in the
+ # specified set of $available_texts hash entries, the appropriate one
+ # is selected at time.
+ #
+ # Pathalogical case handling:
+ # If a language occurs multiple times within a block,
+ # only the last one is rendered e.g.:
+ #
+ #
+ #
+ # Red green color blindness is quite common affecting about 7.8% of
+ # the male population, but onloy about .65% of the female population.
+ #
+ # Red green colour blindness is quite common affecting about 7.8% of
+ # the male population, but onloy about .65% of the female population.
+ #
+ #
+ #
+ # renders the correct spelling of color (colour) for people who have specified
+ # a preferred language that is one of the British Commonwealth languages
+ # even though those are also listed as valid selections for the US english
+ # block.
+ #
sub start_lang {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
@@ -1754,7 +1918,8 @@ sub end_languageblock {
}
return '';
}
-}
+} # end langauge block specific tags.
+
sub start_instructorcomment {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;