--- loncom/xml/lontexconvert.pm 2011/12/06 16:10:53 1.109
+++ loncom/xml/lontexconvert.pm 2014/06/18 06:06:47 1.114
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# TeX Conversion Module
#
-# $Id: lontexconvert.pm,v 1.109 2011/12/06 16:10:53 dseaton Exp $
+# $Id: lontexconvert.pm,v 1.114 2014/06/18 06:06:47 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -50,6 +50,78 @@ use LONCAPA;
use URI::Escape;
use IO::Socket::INET;
+
+#
+# Table of substitutions to unicode characters.
+#
+
+my %unicode_harpoons = (
+ '\rightleftharpoons' => 0x21cc,
+ );
+
+my %unicode_translations = (
+
+# Brackets - unicode for browsers/OS which support it.
+
+ '' => 0x23a1,
+ '' => 0x23a2,
+ '' => 0x23a3, # when unicode catches up with browsers
+ '' => 0x23a4, # use these instead of the cheesey brackets below
+ '' => 0x23a5,
+ '' => 0x23a6,
+
+# Parens - unicode for browsers/OS which support it
+
+ '' => 0x239b,
+ '' => 0x239c,
+ '' => 0x239d,
+ '' => 0x239e,
+ '' => 0x239f,
+ '' => 0x23a0,
+
+);
+
+my %ascii_8bit_translations = (
+
+# Brackets - pure 8-bit ascii ugliness for browsers/OS which can't handle unicode
+
+ '' => 0x5b,
+ '' => 0x5b, # '['
+ '' => 0x5b,
+ '' => 0x5d, # ']'
+ '' => 0x5d,
+ '' => 0x5d,
+
+# Parens - pure 8-bit ascii ugliness for browsers/OS which can't handle unicode
+
+ '' => 0x28,
+ '' => 0x28, # '('
+ '' => 0x28,
+ '' => 0x29,
+ '' => 0x29, # '('
+ '' => 0x29,
+
+);
+
+##
+# Utility to convert elements of a string to unicode:
+#
+# @param input - Input string
+# @param pattern - Pattern to convert
+# @param unicode - Unicode to substitute for pattern.
+#
+# @return string - resulting string.
+#
+sub unicode_subst {
+ my ($input, $pattern, $unicode) = @_;
+
+ my $char = pack('U', $unicode);
+
+ $input =~ s/$pattern/$char/g;
+
+ return $input;
+}
+
# ====================================================================== Header
sub init_tth {
@@ -106,15 +178,37 @@ sub convert_real {
$xmlstring=~s/^\s*\
unicode equivalents to render reliably
+ # in browsers. %unicode_translations and %unicode_harpoons are tables of
+ # string->substitution which we now apply. (%ascii_8bit_translations used
+ # instead for Windows XP and mobile devices.
+
+ my $use_ascii;
+ if ($env{'browser.os'} eq 'win') {
+ if (($env{'browser.osversion'}) && ($env{'browser.osversion'} < 6.0)) {
+ $use_ascii = 1;
+ }
+ }
+ if ($env{'browser.mobile'}) {
+ $use_ascii = 1;
+ }
+
+ foreach my $pattern (keys(%unicode_translations)) {
+ my $unicode = $unicode_translations{$pattern};
+ if ($use_ascii) {
+ $unicode = $ascii_8bit_translations{$pattern};
+ }
+ $xmlstring = &unicode_subst($xmlstring, $pattern, $unicode);
+ }
+
+ foreach my $pattern (keys(%unicode_harpoons)) {
+ $xmlstring = &unicode_subst($xmlstring, $pattern, $unicode_harpoons{$pattern});
+ }
- &Apache::lonxml::end_alarm();
return ($xmlstring,$errorstring);
}
@@ -428,7 +522,7 @@ sub msgtexconverted {
foreach my $fragment (split(/(?:\<\;|\<)\/*algebra\s*(?:\>\;|\>)/i,
$message)) {
if ($tex) {
- my $algebra = &algebra($fragment, 'web', undef, undef, undef, undef, 'tth');
+ my $algebra = &algebra($fragment, 'web', undef, undef, undef, 'tth');
if ($email) {
$outmessage.=''.$algebra.'
'; $tex=0; @@ -513,6 +607,8 @@ sub postprocess_algebra { $string =~s/\\lim\\left\((.+?),(.+?),(.+?)\\right\)/\\lim_{$2\\to $3}$1/gs; return $string; } + + 1; __END__