--- loncom/xml/lontexconvert.pm 2008/01/29 11:18:06 1.86
+++ loncom/xml/lontexconvert.pm 2011/02/10 20:07:00 1.98.2.1
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# TeX Conversion Module
#
-# $Id: lontexconvert.pm,v 1.86 2008/01/29 11:18:06 foxr Exp $
+# $Id: lontexconvert.pm,v 1.98.2.1 2011/02/10 20:07:00 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -47,7 +47,8 @@ use Apache::lonlocal;
use Apache::lonnet;
use lib '/home/httpd/lib/perl/';
use LONCAPA;
-
+use URI::Escape;
+use IO::Socket::INET;
# ====================================================================== Header
@@ -79,10 +80,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);
@@ -113,7 +111,8 @@ sub convert_real {
# reasonably well to ⇔. If we get many more of these,
# we're going to need to have a translation sub.
#
- $xmlstring=~s/\\rightleftharpoons/\&\#8660;/g;
+ my $lrharpoon = pack("U", 0x21cc);
+ $xmlstring=~s/\\rightleftharpoons/$lrharpoon/g;
&Apache::lonxml::end_alarm();
return ($xmlstring,$errorstring);
@@ -218,7 +217,9 @@ sub jsMath_converted {
sub tex_engine {
if (exists($env{'form.texengine'})) {
- return $env{'form.texengine'};
+ if ($env{'form.texengine'} ne '') {
+ return $env{'form.texengine'};
+ }
}
if ($env{'request.course.id'}
&& exists($env{'course.'.$env{'request.course.id'}.'.texengine'})) {
@@ -241,16 +242,52 @@ 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 $path = '/cgi-bin/mimetex.cgi?'.$esc_texstring;
+ my $socket;
+ &Apache::lonxml::start_alarm();
+ my $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;
+ }
+ }
+ $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='
';
+ my $esc_texstring = &uri_escape($$texstring);
+ my $valign = &mimetex_valign($esc_texstring);
+ my $result='
';
if ($displaystyle) {
$result='
'.$result.'';
}
@@ -266,6 +303,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);
}
@@ -350,7 +389,7 @@ sub msgtexconverted {
sub algebra {
use AlgParser;
- my ($string,$target,$style)=@_;
+ my ($string,$target,$style,$parstack,$safeeval)=@_;
my $parser = new AlgParserWithImplicitExpand;
$string=&prepare_algebra($string);
my $ret = $parser->parse($string);
@@ -367,7 +406,9 @@ sub algebra {
$latex='\\ensuremath{'.$latex.'}';
}
if ($target eq 'web' || $target eq 'analyze') {
- $result = &converted(\$latex);
+ my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval);
+ $result = &converted(\$latex,$display);
+# $result = &converted(\$latex);
} else {
$result = $latex;
}
@@ -414,8 +455,111 @@ 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_valign()
+
+ Makes a HEAD call to /cgi-bin/mimetex.cgi via IO:: to retrieve the
+ vertical alignment, before the subsequent call to mimetex_converted()
+ which generates the
tag and the corresponding image.
+
+ Input: 1. $esc_texstring (escaped TeX to be rendered by mimetex).
+ Output: 1. $valign - number of pixels: positive or negative integer
+ which will be included in
tag for mimetex image to
+ support vertical alignment of image within a line of text.
+
+ If a server is running SSL, and Apache rewrite rules are in place
+ to rewrite requests for http to https, modification will most likely
+ be needed for pass through for HEAD requests for /cgi-bin/mimetex.cgi.
+
+ Example rewrite rules which rewrite all http traffic to https,
+ except HEAD requests for /cgi-bin/mimetex.cgi are:
+
+
+ RewriteEngine On
+ RewriteLogLevel 0
+
+ RewriteCond %{HTTPS} off
+ RewriteCond %{HTTP:Host} (.*)
+ RewriteCond %{REQUEST_METHOD} !HEAD
+ RewriteRule ^/(.*) https://%1/$1 [R=301,L]
+
+ RewriteCond %{HTTPS} off
+ RewriteCond %{HTTP:Host} (.*)
+ RewriteCond %{REQUEST_METHOD} HEAD
+ RewriteCond %{REQUEST_URI} !^/cgi-bin/mimetex.cgi
+ RewriteRule ^/(.*) https://%1/$1 [R=301,L]
+
+
+=item mimetex_converted()
+
+
+=item converted()
+
+
+=item to_convert()
+
+message display
+
+=item smiley()
+
+???
+
+=item msgtexconverted()
+
+=item algebra()
+
+=item prepare_algebra()
+
+=item postprocess_algebra()
+=back
+=cut