--- loncom/homework/structuretags.pm 2011/12/12 11:40:30 1.497.2.2 +++ loncom/homework/structuretags.pm 2011/12/14 11:56:08 1.497.2.4 @@ -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.497.2.4 2011/12/14 11:56:08 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -69,6 +69,86 @@ 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::latex_language($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 = "\\select_language{$language}"; + + return $babel_hyphenation; + } else { + return ''; + } +} +## +# 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') { @@ -1581,14 +1661,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 +1738,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 +1797,52 @@ 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}; } 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 +1873,8 @@ sub end_languageblock { } return ''; } -} +} # end langauge block specific tags. + sub start_instructorcomment { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;