--- loncom/xml/lontexconvert.pm 2008/11/24 17:17:51 1.91 +++ loncom/xml/lontexconvert.pm 2010/04/27 20:29:20 1.103 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # TeX Conversion Module # -# $Id: lontexconvert.pm,v 1.91 2008/11/24 17:17:51 jms Exp $ +# $Id: lontexconvert.pm,v 1.103 2010/04/27 20:29:20 faziophi 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 @@ -241,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.'
'; } @@ -266,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); } @@ -274,6 +326,7 @@ sub converted { sub to_convert { my ($string) = @_; + &init_tth(); $string=~s/\/ /gs; # $string=~s/\s/ /gs; $string=&HTML::Entities::decode($string); @@ -283,23 +336,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; } @@ -307,7 +374,6 @@ sub smiley { sub msgtexconverted { my ($message,$email) = @_; $errorstring=''; - &init_tth(); my $outmessage=''; my $tex=0; foreach my $fragment (split(/(?:\<\;|\<)\/*m\s*(?:\>\;|\>)/i,$message)) { @@ -328,15 +394,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;
 	}
     }
@@ -349,9 +416,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').']';