--- loncom/xml/lontexconvert.pm 2008/11/18 10:02:56 1.90 +++ loncom/xml/lontexconvert.pm 2010/06/10 15:54:06 1.104 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # TeX Conversion Module # -# $Id: lontexconvert.pm,v 1.90 2008/11/18 10:02:56 hauer Exp $ +# $Id: lontexconvert.pm,v 1.104 2010/06/10 15:54:06 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -47,7 +47,9 @@ use Apache::lonlocal; use Apache::lonnet; use lib '/home/httpd/lib/perl/'; use LONCAPA; - +use URI::Escape; +use IO::Socket::INET; +use IO::Socket::SSL; # ====================================================================== Header @@ -79,10 +81,7 @@ sub init_tth { $Apache::lontexconvert::messedup=0; -# we need this routine because &converted can get called from inside -# of the safespace (through &xmlparse('stuff') which doesn't -# allow the opcode for alarm, so we need to compile this before we get -# into the safe space since opcode checks only occur at compile time + sub convert_real { my ($texstring)=@_; my ($xmlstring,$errorstring); @@ -244,16 +243,64 @@ sub init_math_support { return; } +sub mimetex_valign { + my ($esc_texstring)=@_; + my $valign = 0; + my $lonhost = $Apache::lonnet::perlvar{'lonHostID'}; + my $hostname = &Apache::lonnet::hostname($lonhost); + my $protocol = $Apache::lonnet::protocol{$lonhost}; + my $path = '/cgi-bin/mimetex.cgi?'.$esc_texstring; + my $socket; + &Apache::lonxml::start_alarm(); + if ($protocol eq 'https') { + $socket = IO::Socket::SSL->new(PeerAddr => $hostname, + PeerPort => 'https(443)', + Proto => 'tcp'); + } else { + $socket = IO::Socket::INET->new(PeerAddr => $hostname, + PeerPort => 'http(80)', + Proto => 'tcp'); + } + if ($socket) { + my $headreq = "HEAD $path HTTP/1.0\r\n\r\n"; + print $socket $headreq; + while (<$socket>) { + if (/Vertical\-Align\:\s*?([\-\d]+)/) { + $valign = $1; + } + } + if ($protocol eq 'https') { + $socket->close(SSL_no_shutdown => 1, + SSL_ctx_free => 1); + } else { + $socket->close(); + } + } + &Apache::lonxml::end_alarm(); + return $valign; +} + sub mimetex_converted { my $texstring=shift; + +# Alt-Argument for screen readers + my $alt_string=$$texstring; + $alt_string=~s/\"/\'\'/g; + +# Is this displaystyle? + my $displaystyle=&displaystyle($texstring); +# Remove math environment delimiters + &clean_out_math_mode($texstring); if ($displaystyle) { $$texstring='\\displaystyle \\Large '.$$texstring; } - my $result='$'.$$texstring.'$'; + my $esc_texstring = &uri_escape($$texstring); + my $valign = &mimetex_valign($esc_texstring); + my $result=''.$alt_string.''; if ($displaystyle) { $result='
'.$result.'
'; } @@ -269,6 +316,8 @@ sub converted { return &jsMath_converted($string); } elsif ($mode =~ /mimetex/i) { return &mimetex_converted($string); + } elsif ($mode =~ /raw/i) { + return $$string; } return &tth_converted($string); } @@ -277,6 +326,7 @@ sub converted { sub to_convert { my ($string) = @_; + &init_tth(); $string=~s/\/ /gs; # $string=~s/\s/ /gs; $string=&HTML::Entities::decode($string); @@ -285,24 +335,37 @@ sub to_convert { sub smiley { my $expression=shift; - if ($env{'browser.imagesuppress'} eq 'on') { return $expression; } - my %smileys=('\:\-\)' => 'smiley', - '8\-\)' => 'coolsmile', - '8\-(I|\|)' => 'coolindiff', - ':\-(I|\|)' => 'neutral', - '\:\-(o|O|\(\))' => 'shocked', - ':\-\(' => 'frowny', - '\;\-\)' => 'wink', - '\:\-P' => 'baeh', - '\:\-(\\\|\\/)' => 'hrrm', - '\:\-D' => 'bigsmile', - '\:\-C' => 'angry', - '\:(\'|\`)\-\(' => 'cry', - '\:\-(X|\#)' => 'lipsrsealed', - '\:\-S' => 'huh'); + my %smileys=( + '\:\-*\)' => 'face-smile.png', + '8\-\)' => 'face-cool.png', + '8\-(I|\|)' => 'face-glasses.png', + '\:\-(I|\|)' => 'face-plain.png', + '\:\-(o|O|\(\))' => 'face-surprise.png', + ':\-\(' => 'face-sad.png', + '\;\-\)' => 'face-wink.png', + '\:\-(P|p)' => 'face-raspberry.png', + '\:\-(\\\|\\/)' => 'face-uncertain.png', + '\:\-D' => 'face-smile-big.png', + '\:\-(C|\@)' => 'face-angry.png', + '\:(\'|\`)\-*\(' => 'face-crying.png', + '\:\-(X|x|\#)' => 'face-quiet.png', + '\:\-(s|S)' => 'face-uncertain.png', + '\:\-\$' => 'face-embarrassed.png', + '\:\-\*' => 'face-kiss.png', + '\+O\(' => 'face-sick.png', + '(\<\;3|\(heart\))' => 'heart.png', + '\(rose\)' => 'rose.png', + '\(pizza\)' => 'food-pizza.png', + '\(cake\)' => 'food-cake.png', + '\(ninja\)' => 'face-ninja.png', + '\(pirate\)' => 'face-pirate.png', + '\((agree|yes)\)' => 'opinion-agree.png', + '\((disagree|nay)\)' => 'opinion-disagree.png', + '(o|O)\-\)' => 'face-angel.png', + ); my $iconpath=$Apache::lonnet::perlvar{'lonIconsURL'}; foreach my $smiley (keys(%smileys)) { - $expression=~s/$smiley/\/gs; + $expression=~s/$smiley/\/gs; } return $expression; } @@ -310,7 +373,6 @@ sub smiley { sub msgtexconverted { my ($message,$email) = @_; $errorstring=''; - &init_tth(); my $outmessage=''; my $tex=0; foreach my $fragment (split(/(?:\<\;|\<)\/*m\s*(?:\>\;|\>)/i,$message)) { @@ -331,15 +393,16 @@ sub msgtexconverted { foreach my $fragment (split(/(?:\<\;|\<)\/*algebra\s*(?:\>\;|\>)/i, $message)) { if ($tex) { + my $algebra = &algebra($fragment, 'web', undef, undef, undef, undef, 'tth'); if ($email) { - $outmessage.=''.&algebra($fragment,'web').'
';
+		$outmessage.='
'.$algebra.'
';
 		$tex=0;
 	    } else {
-		$outmessage.=&algebra($fragment,'web');
+		$outmessage.=$algebra;
 		$tex=0;
 	    }
 	} else {
-            $outmessage.=$fragment;
+        $outmessage.=$fragment;
 	    $tex=1;
 	}
     }
@@ -352,9 +415,9 @@ sub msgtexconverted {
 
 sub algebra {
     use AlgParser;
-
-    my ($string,$target,$style,$parstack,$safeeval)=@_;
+    my ($string,$target,$style,$parstack,$safeeval,$tth)=@_;
     my $parser = new AlgParserWithImplicitExpand;
+    if ($tth eq 'tth') {&init_tth();}
     $string=&prepare_algebra($string);
     my $ret = $parser->parse($string);
     my $result='['.&mt('Algebra unconverted due to previous errors').']';
@@ -419,8 +482,78 @@ sub postprocess_algebra {
 __END__
 
 
+=pod
+
+=head1 NAME
+
+Apache::lontexconvert;
+
+=head1 SYNOPSIS
+
+Access to tth/ttm
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+
+=head1 SUBROUTINES
+
+=over
+
+=item init_tth()
+
+Header
+
+=item convert_real()
+
+ we need this routine because &converted can get called from inside
+ of the safespace (through &xmlparse('stuff') which doesn't
+ allow the opcode for alarm, so we need to compile this before we get
+ into the safe space since opcode checks only occur at compile time
+
+=item tth_converted()
+
+
+=item clean_out_math_mode()
+
+
+=item displaystyle()
+
+
+=item jsMath_converted()
+
+
+=item tex_engine()
+
+
+=item init_math_support()
+
+
+=item mimetex_converted()
+
+
+=item converted()
+
+
+=item to_convert()
+
+message display
+
+=item smiley()
+
+???
+
+=item msgtexconverted()
+
+=item algebra()
+
+=item prepare_algebra()
+
+=item postprocess_algebra()
 
+=back
 
+=cut