+ '(yen|#165)' => {'tex' => '{/Text \245}', 'web' => "\x{a5}"}, # Yen currency.
+ '(brvbar|#166)' => {'tex' => '{/Symbol \174}', 'web' => "\x{a6}"}, # Broken vert bar no print.
+ '(sect|#167)' => {'tex' => '{\247}', 'web' => "\x{a7}"}, # Section symbol.
+ '(uml|#168)' => {'tex' => '{\250}', 'web' => "\x{a8}"}, # 'naked' umlaut.
+ '(copy|#169)' => {'tex' => '{/Symbol \343}', 'web' => "\x{a9}"}, # Copyright symbol.
+ '(ordf|#170)' => {'tex' => '{/Text \343}', 'web' => "\x{aa}"}, # Feminine ordinal.
+ '(laquo|#171)' => {'tex' => '{/Text \253}', 'web' => "\x{ab}"}, # << quotes.
+ '(not|#172)' => {'tex' => '\254', 'web' => "\x{ac}"}, # Logical not.
+ '(shy|#173)' => {'tex' => '\255', 'web' => "\x{ad}"}, # soft hyphen.
+ '(reg|#174)' => {'tex' => '{/Symbol \342}', 'web' => "\x{ae}"}, # Registered tm.
+ '(macr|#175)' => {'tex' => '^{\255}', 'web' => "\x{af}"}, # 'naked' macron (overbar).
+ '(deg|#176)' => {'tex' => '{/Text \260}', 'web' => "\x{b0}"}, # Degree symbo..`
+ '(plusmn|#177)' => {'tex' => '{/Symbol \261}', 'web' => "\x{b1}"}, # +/- symbol.
+ '(sup2|#178)' => {'tex' => '^2', 'web' => "\x{b2}"}, # Superscript 2.
+ '(sup3|#179)' => {'tex' => '^3', 'web' => "\x{b3}"}, # Superscript 3.
+ '(acute|#180)' => {'tex' => '{/Text \222}', 'web' => "\x{b4}"}, # 'naked' acute accent.
+ '(micro|#181)' => {'tex' => '{/Symbol \155}', 'web' => "\x{b5}"}, # Micro (small mu).
+ '(para|#182)' => {'tex' => '{/Text \266}', 'web' => "\x{b6}"}, # Paragraph symbol.
+ '(middot|#183)' => {'tex' => '\267', 'web' => "\x{b7}"}, # middle dot
+ '(cedil|#184)' => {'tex' => '\233', 'web' => "\x{b8}"}, # 'naked' cedilla.
+ '(sup1|#185)' => {'tex' => '^1', 'web' => "\x{b9}"}, # superscript 1.
+ '(ordm|#186)' => {'tex' => '{\260}', 'web' => "\x{ba}"}, # masculine ordinal.
+ '(raquo|#187)', => {'tex' => '\273', 'web' => "\x{bb}"}, # Right angle quotes.
+ '(frac14|#188)' => {'tex' => '\274', 'web' => "\x{bc}"}, # 1/4.
+ '(frac12|#189)' => {'tex' => '\275', 'web' => "\x{bd}"}, # 1/2.
+ '(frac34|#190)' => {'tex' => '\276', 'web' => "\x{be}"}, # 3/4
+ '(iquest|#191)' => {'tex' => '{/Text \277}', 'web' => "\x{bf}"}, # Inverted ?
+ '(Agrave|#192)' => {'tex' => '\300', 'web' => "\x{c0}"}, # A Grave.
+ '(Aacute|#193)' => {'tex' => '\301', 'web' => "\x{c1}"}, # A Acute.
+ '(Acirc|#194)' => {'tex' => '\302', 'web' => "\x{c2}"}, # A Circumflex.
+ '(Atilde|#195)' => {'tex' => '\303', 'web' => "\x{c3}"}, # A tilde.
+ '(Auml|#196)' => {'tex' => '\304', 'web' => "\x{c4}"}, # A umlaut.
+ '(Aring|#197)' => {'tex' => '\305', 'web' => "\x{c5}"}, # A ring.
+ '(AElig|#198)' => {'tex' => '\306', 'web' => "\x{c6}"}, # AE ligature.
+ '(Ccedil|#199)' => {'tex' => '\307', 'web' => "\x{c7}"}, # C cedilla
+ '(Egrave|#200)' => {'tex' => '\310', 'web' => "\x{c8}"}, # E Accent grave.
+ '(Eacute|#201)' => {'tex' => '\311', 'web' => "\x{c9}"}, # E acute accent.
+ '(Ecirc|#202)' => {'tex' => '\312', 'web' => "\x{ca}"}, # E Circumflex.
+ '(Euml|#203)' => {'tex' => '\313', 'web' => "\x{cb}"}, # E umlaut.
+ '(Igrave|#204)' => {'tex' => '\314', 'web' => "\x{cc}"}, # I grave accent.
+ '(Iacute|#205)' => {'tex' => '\315', 'web' => "\x{cd}"}, # I acute accent.
+ '(Icirc|#206)' => {'tex' => '\316', 'web' => "\x{ce}"}, # I circumflex.
+ '(Iuml|#207)' => {'tex' => '\317', 'web' => "\x{cf}"}, # I umlaut.
+ '(ETH|#208)' => {'tex' => '\320', 'web' => "\x{d0}"}, # Icelandic Cap eth.
+ '(Ntilde|#209)' => {'tex' => '\321', 'web' => "\x{d1}"}, # Ntilde (enyan).
+ '(Ograve|#210)' => {'tex' => '\322', 'web' => "\x{d2}"}, # O accent grave.
+ '(Oacute|#211)' => {'tex' => '\323', 'web' => "\x{d3}"}, # O accent acute.
+ '(Ocirc|#212)' => {'tex' => '\324', 'web' => "\x{d4}"}, # O circumflex.
+ '(Otilde|#213)' => {'tex' => '\325', 'web' => "\x{d5}"}, # O tilde.
+ '(Ouml|#214)' => {'tex' => '\326', 'web' => "\x{d6}"}, # O umlaut.
+ '(times|#215)' => {'tex' => '\327', 'web' => "\x{d7}"}, # Times symbol.
+ '(Oslash|#216)' => {'tex' => '\330', 'web' => "\x{d8}"}, # O slash.
+ '(Ugrave|#217)' => {'tex' => '\331', 'web' => "\x{d9}"}, # U accent grave.
+ '(Uacute|#218)' => {'tex' => '\332', 'web' => "\x{da}"}, # U accent acute.
+ '(Ucirc|#219)' => {'tex' => '\333', 'web' => "\x{db}"}, # U circumflex.
+ '(Uuml|#220)' => {'tex' => '\334', 'web' => "\x{dc}"}, # U umlaut.
+ '(Yacute|#221)' => {'tex' => '\335', 'web' => "\x{dd}"}, # Y accent acute.
+ '(THORN|#222)' => {'tex' => '\336', 'web' => "\x{de}"}, # Icelandic thorn.
+ '(szlig|#223)' => {'tex' => '\337', 'web' => "\x{df}"}, # German sharfes s.
+ '(agrave|#224)' => {'tex' => '\340', 'web' => "\x{e0}"}, # a accent grave.
+ '(aacute|#225)' => {'tex' => '\341', 'web' => "\x{e1}"}, # a grave.
+ '(acirc|#226)' => {'tex' => '\342', 'web' => "\x{e2}"}, # a circumflex.
+ '(atilde|#227)' => {'tex' => '\343', 'web' => "\x{e3}"}, # a tilde.
+ '(auml|#228)' => {'tex' => '\344', 'web' => "\x{e4}"}, # a umlaut
+ '(aring|#229)' => {'tex' => '\345', 'web' => "\x{e5}"}, # a ring on top.
+ '(aelig|#230)' => {'tex' => '\346', 'web' => "\x{e6}"}, # ae ligature.
+ '(ccedil|#231)' => {'tex' => '\347', 'web' => "\x{e7}"}, # C cedilla
+ '(egrave|#232)' => {'tex' => '\350', 'web' => "\x{e8}"}, # e accent grave.
+ '(eacute|#233)' => {'tex' => '\351', 'web' => "\x{e9}"}, # e accent acute.
+ '(ecirc|#234)' => {'tex' => '\352', 'web' => "\x{ea}" }, # e circumflex.
+ '(euml|#235)' => {'tex' => '\353', 'web' => "\x{eb}"}, # e umlaut.
+ '(igrave|#236)' => {'tex' => '\354', 'web' => "\x{ec}"}, # i grave.
+ '(iacute|#237)' => {'tex' => '\355', 'web' => "\x{ed}"}, # i acute.
+ '(icirc|#238)' => {'tex' => '\356', 'web' => "\x{ee}"}, # i circumflex.
+ '(iuml|#239)' => {'tex' => '\357', 'web' => "\x{ef}"}, # i umlaut.
+ '(eth|#240)' => {'tex' => '\360', 'web' => "\x{f0}"}, # Icelandic eth.
+ '(ntilde|#241)' => {'tex' => '\361', 'web' => "\x{f1}"}, # n tilde.
+ '(ograve|#242)' => {'tex' => '\362', 'web' => "\x{f2}"}, # o grave.
+ '(oacute|#243)' => {'tex' => '\363', 'web' => "\x{f3}"}, # o acute.
+ '(ocirc|#244)' => {'tex' => '\364', 'web' => "\x{f4}"}, # o circumflex.
+ '(otilde|#245)' => {'tex' => '\365', 'web' => "\x{f5}"}, # o tilde.
+ '(ouml|#246)' => {'tex' => '\366', 'web' => "\x{f6}"}, # o umlaut.
+ '(divide|#247)' => {'tex' => '\367', 'web' => "\x{f7}"}, # division symbol
+ '(oslash|#248)' => {'tex' => '\370', 'web' => "\x{f8}"}, # o slashed.
+ '(ugrave|#249)' => {'tex' => '\371', 'web' => "\x{f9}"}, # u accent grave.
+ '(uacute|#250)' => {'tex' => '\372', 'web' => "\x{fa}"}, # u acute.
+ '(ucirc|#251)' => {'tex' => '\373', 'web' => "\x{fb}"}, # u circumflex.
+ '(uuml|#252)' => {'tex' => '\374', 'web' => "\x{fc}"}, # u umlaut.
+ '(yacute|#253)' => {'tex' => '\375', 'web' => "\x{fd}"}, # y acute accent.
+ '(thorn|#254)' => {'tex' => '\376', 'web' => "\x{fe}"}, # small thorn (icelandic).
+ '(yuml|#255)' => {'tex' => '\377', 'web' => "\x{ff}"}, # y umlaut.
+
+ # Latin extended A entities:
+
+ '(OElig|#338)' => {'tex' => '{/Text \326}', 'web' => "\x{152}"}, # OE ligature.
+ '(oelig|#339)' => {'tex' => '{/Text \366}', 'web' => "\x{153}"}, # oe ligature.
+ '(Scaron|#352)' => {'tex' => 'S', 'web' => "\x{160}"}, # S caron no printable.
+ '(scaron|#353)' => {'tex' => 's', 'web' => "\x{161}"}, # s caron no printable.
+ '(Yuml|#376)' => {'tex' => 'Y', 'web' => "\x{178}"}, # Y umlaut - no printable.
+
+ # Latin extended B.
+
+ '(fnof|#402)' => {'tex' =>'{/Symbol \246}', 'web' => "\x{192}"}, # f with little hook.
+
+ # Standalone accents:
+
+ '(circ|#710)' => {'tex' => '^', 'web' => '^'}, # circumflex.
+ '(tilde|#732)' => {'tex' => '~', 'web' => '~'}, # tilde.
+
+ # General punctuation. We're not able to make a distinction between
+ # the various length spacings in the print version. (e.g. en/em/thin).
+ # the various joiners will be empty strings in the print version too.
+
+
+ '(ensp|#8194)' => {'tex' => ' ', 'web' => "\x{2002}"}, # en space.
+ '(emsp|#8195)' => {'tex' => ' ', 'web' => "\x{2003}"}, # em space.
+ '(thinsp|#8201)' => {'tex' => ' ', 'web' => "\x{2009}"}, # thin space.
+ '(zwnj|#8204)' => {'tex' => '', 'web' => "\x{200c}"}, # Zero width non joiner.
+ '(zwj|#8205)' => {'tex' => '', 'web' => "\x{200d}"}, # Zero width joiner.
+ '(lrm|#8206)' => {'tex' => '', 'web' => "\x{200e}"}, # Left to right mark
+ '(rlm|#8207)' => {'tex' => '', 'web' => "\x{200f}"}, # right to left mark.
+ '(ndash|#8211)' => {'tex' => '{/Text \55}', 'web' => "\x{2013}"}, # en dash.
+ '(mdash|#8212)' => {'tex' => '{/Symbol \55}', 'web' => "\x{2014}"}, # em dash.
+ '(lsquo|#8216)' => {'tex' => '{/Text \140}', 'web' => "\x{2018}"}, # Left single quote.
+ '(rsquo|#8217)' => {'tex' => '{/Symbol \242}', 'web' => "\x{2019}"}, # Right single quote.
+ '(sbquo|#8218)' => {'tex' => ',', 'web' => "\x{201a}"}, # Single low-9 quote.
+ '(ldquo|#8220)' => {'tex' => '{/Text \252}', 'web' => "\x{201c}"}, # Left double quote.
+ '(rdquo|#8221)' => {'tex' => '{/Text \272}', 'web' => "\x{201d}"}, # Right double quote.
+ '(bdquo|#8222)' => {'tex' => '{/Text \271}', 'web' => "\x{201e}"}, # Double low-9 quote.
+ '(dagger|#8224)' => {'tex' => '{/Text \262}', 'web' => "\x{2020}"}, # Is this a dagger I see before me now?
+ '(Dagger|#8225)' => {'tex' => '{/Text \263}', 'web' => "\x{2021}"}, # it's handle pointing towards my heart?
+ '(bull|#8226)' => {'tex' => '\267', 'web' => "\x{2022}"}, # Bullet.
+ '(hellep|#8230)' => {'tex' => '{/Text \274}', 'web' => "\x{2026}"}, # Ellipses.
+ '(permil|#8240)' => {'tex' => '{/Text \275}', 'web' => "\x{2031}"}, # Per mille.
+ '(prime|#8242)' => {'tex' => '\264', 'web' => "\x{2032}"}, # Prime.
+ '(Prime|#8243)' => {'tex' => '{/Symbol \262}', 'web' => "\x{2033}"}, # double prime.
+ '(lsaquo|#8249)' => {'tex' => '{/Text \254}', 'web' => "\x{2039}"}, # < quote.
+ '(rsaquo|#8250)' => {'tex' => '{/Text \255}', 'web' => "\x{2040}"}, # > quote.
+ '(oline|#8254)' => {'tex' => '{/Symbol \140}', 'web' => "\x{203e}"}, # Overline.
+ '(frasl|#8260)' => {'tex' => '/', 'web' => "\x{2044}"}, # Fraction slash.
+ '(euro|#8364)' => {'tex' => '{/Symbol \240}', 'web' => "\x{20a0}"}, # Euro currency.
+
+ # Letter like symbols.
+
+ '(weierp|#8472)' => {'tex' => '{/Symbol \303}', 'web' => "\x{2118}"}, # Power set symbol
+ '(image|#8465)' => {'tex' => '{/Symbol \301}', 'web' => "\x{2111}"}, # Imaginary part
+ '(real|#8476)' => {'tex' => '{/Symbol \302}', 'web' => "\x{211c}"}, # Real part.
+ '(trade|#8482)' => {'tex' => '{/Symbol \344}', 'web' => "\x{2122}"}, # trademark symbol.
+ '(alefsym|#8501)' => {'tex' => '{/Symbol \300}', 'web' => "\x{2135}"}, # Hebrew alef.
+
+ # Arrows of various types and directions.
+ '(larr|#8592)' => {'tex' => '{/Symbol \254}', 'web' => "\x{2190}"}, # <--
+ '(uarr|#8593)' => {'tex' => '{/Symbol \255}', 'web' => "\x{2191}"}, # up arrow.
+ '(rarr|#8594)' => {'tex' => '{/Symbol \256}', 'web' => "\x{2192}"}, # -->
+ '(darr|#8595)' => {'tex' => '{/Symbol \257}', 'web' => "\x{2193}"}, # down arrow.
+ '(harr|#8596)' => {'tex' => '{/Symbol \253}', 'web' => "\x{2194}"}, # <-->
+ '(crarr|#8629)' => {'tex' => '{/Symbol \277}', 'web' => "\x{21b5}"}, # corner arrow down and right.
+ '(lArr|#8656)' => {'tex' => '{/Symbol \334}', 'web' => "\x{21d0}"}, # <==
+ '(uArr|#8657)' => {'tex' => '{/Symbol \335}', 'web' => "\x{21d1}"}, # Up double arrow.
+ '(rArr|#8658)' => {'tex' => '{/Symbol \336}', 'web' => "\x{21d2}"}, # ==>
+ '(dArr|#8659)' => {'tex' => '{/Symbol \337}', 'web' => "\x{21d3}"}, # Down double arrow.
+ '(hArr|#8660)' => {'tex' => '{/Symbol \333}', 'web' => "\x{21d4}"}, # <==>
+
+ # Mathematical operators. For some of these we do the best we can in printing.
+
+ '(forall|#8704)' => {'tex' => '{/Symbol \42}', 'web' => "\x{2200}"}, # For all.
+ '(part|#8706)' => {'tex' => '{/Symbol d}', 'web' => "\x{2202}"}, # partial derivative
+ '(exist|#8707)' => {'tex' => '{/Symbol \44}', 'web' => "\x{2203}"}, # There exists.
+ '(empty|#8709)' => {'tex' => '{/Symbol \306}', 'web' => "\x{2205}"}, # Null set.
+ '(nabla|#8711)' => {'tex' => '{/Symbol \321}', 'web' => "\x{2207}"}, # Gradient e.g.
+ '(isin|#8712)' => {'tex' => '{/Symbol \316}', 'web' => "\x{2208}"}, # Element of the set.
+ '(ni|#8715)' => {'tex' => '{/Symbol \47}', 'web' => "\x{220b}"}, # Contains as a member
+ '(prod|#8719)' => {'tex' => '{/Symbol \325}', 'web' => "\x{220f}"}, # Product
+ '(sum|#8721)' => {'tex' => '{/Symbol \345}', 'web' => "\x{2211}"}, # Sum of.
+ '(minus|#8722)' => {'tex' => '-', 'web' => "\x{2212}"}, # - sign.
+ '(lowast|#8727)' => {'tex' => '*', 'web' => "\x{2217}"}, # *
+ '(radic|#8730)' => {'tex' => '{/Symbol \326}', 'web' => "\x{221a}"}, # Square root.
+ '(prop|#8733)' => {'tex' => '{/Symbol \265}', 'web' => "\x{221d}"}, # Proportional to.
+ '(infin|#8734)' => {'tex' => '{/Symbol \245}', 'web' => "\x{221e}"}, # Infinity.
+ '(ang|#8736)' => {'tex' => '{/Symbol \320}', 'web' => "\x{2220}"}, # Angle .
+ '(and|#8743)' => {'tex' => '{/Symbol \331}', 'web' => "\x{2227}"}, # Logical and.
+ '(or|#8744)' => {'tex' => '{/Symbol \332}', 'web' => "\x{2228}"}, # Logical or.
+ '(cap|#8745)' => {'tex' => '{/Symbol \307}', 'web' => "\x{2229}"}, # Set intersection.
+ '(cup|#8746)' => {'tex' => '{/Symbol \310}', 'web' => "\x{222a}"}, # Set union.
+ '(int|8747)' => {'tex' => '{/Symbol \362}', 'web' => "\x{222b}"}, # Integral.
+ '(there4|#8756)' => {'tex' => '{/Symbol \134}', 'web' => "\x{2234}"}, # Therefore triple dots.
+ '(sim|#8764)' => {'tex' => '~', 'web' => "\x{223c}"}, # Simlar to.
+ '(cong|#8773)' => {'tex' => '{/Symbol \100}', 'web' => "\x{2245}"}, # Congruent to/with.
+ '(asymp|#8776)' => {'tex' => '{/Symbol \278}', 'web' => "\x{2248}"}, # Asymptotic to.
+ '(ne|#8800)' => {'tex' => '{/Symbol \271}', 'web' => "\x{2260}"}, # not equal to.
+ '(equiv|#8801)' => {'tex' => '{/Symbol \272}', 'web' => "\x{2261}"}, # Equivalent to.
+ '(le|8804)' => {'tex' => '{/Symbol \243}', 'web' => "\x{2264}"}, # Less than or equal to.
+ '(ge|8805)' => {'tex' => '{/Symbol \263}', 'web' => "\x{2265}"}, # Greater than or equal to
+ '(sub|8834)' => {'tex' => '{/Symbol \314}', 'web' => "\x{2282}"}, # Subset of.
+ '(sup|8835)' => {'tex' => '{/Symbol \311}', 'web' => "\x{2283}"}, # Super set of.
+ '(nsub|8836)' => {'tex' => '{/Symbol \313}', 'web' => "\x{2284}"}, # not subset of.
+ '(sube|8838)' => {'tex' => '{/Symbol \315}', 'web' => "\x{2286}"}, # Subset or equal.
+ '(supe|8839)' => {'tex' => '{/Symbol \312}', 'web' => "\x{2287}"}, # Superset or equal
+ '(oplus|8853)' => {'tex' => '{/Symbol \305}', 'web' => "\x{2295}"}, # O with plus inside
+ '(otimes|8855)' => {'tex' => '{/Symbol \304}', 'web' => "\x{2297}"}, # O with times.
+ '(perp|8869)' => {'tex' => '{/Symbol \136}', 'web' => "\x{22a5}"}, # Perpendicular.
+ '(sdot|8901)' => {'tex' => '{/Symbol \227}', 'web' => "\x{22c5}"}, # Dot operator.
+
+ # Misc. technical symbols:
+
+ '(lceil|8698)' => {'tex' => '{/Symbol \351}', 'web' => "\x{2308}"}, # Left ceiling.
+ '(rceil|8969)' => {'tex' => '{/Symbol \371}', 'web' => "\x{2309}"}, # Right ceiling.
+ '(lfloor|8970)' => {'tex' => '{/Symbol \353}', 'web' => "\x{230a}"}, # Left floor.
+ '(rfloor|8971)' => {'tex' => '{/Symbol \373}', 'web' => "\x{230b}"}, # Right floor.
+ '(lang|9001)' => {'tex' => '{/Symbol \341}', 'web' => "\x{2329}"}, # Left angle bracket.
+ '(rang|9002)' => {'tex' => '{/Symbol \361}', 'web' => "\x{232a}"}, # Right angle bracket.
+
+ # Gemoetric shapes.
+
+ '(loz|9674)' => {'tex' => '{/Symbol \340}', 'web' => "\x{25ca}"}, # Lozenge.
+
+ # Misc. symbols
+
+ '(spades|9824)' => {'tex' => '{/Symbol \252}', 'web' => "\x{2660}"},
+ '(clubs|9827)' => {'tex' => '{/Symbol \247}', 'web' => "\x{2663}"},
+ '(hearts|9829)' => {'tex' => '{/Symbol \251}', 'web' => "\x{2665}"},
+ '(diams|9830)' => {'tex' => '{/Symbol \250}', 'web' => "\x{2666}"}
+
+ );
+
+
+sub replace_entities {
+ my ($target,$text) = @_;
+ $text =~ s{([_^~\{\}]|\\\\)}{\\\\$1}g;
+ while (my ($re, $replace) = each(%lookup)) {
+ my $repl = $replace->{$target};
+ $text =~ s/&$re;/$replace->{$target}/g;
+ }
+ $text =~ s{(&)}{\\\\$1}g;
+ return $text;
+}
+
##------------------------------------------------------------------- title
sub start_title {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
my $result='';
if ($target eq 'web' || $target eq 'tex') {
- $title = &Apache::lonxml::get_all_text("/title",$parser);
+ $title = &Apache::lonxml::get_all_text("/title",$parser,$style);
$title=&Apache::run::evaluate($title,$safeeval,$$parstack[-1]);
$title =~ s/\n/ /g;
if (length($title) > $max_str_len) {
$title = substr($title,0,$max_str_len);
}
+ $title = &parse_label($target,$title);
} elsif ($target eq 'edit') {
$result.=&Apache::edit::tag_start($target,$token,'Plot Title');
- my $text=&Apache::lonxml::get_all_text("/title",$parser);
- $result.=&Apache::edit::end_row().
- &Apache::edit::start_spanning_row().
- &Apache::edit::editline('',$text,'',60);
+ my $text=&Apache::lonxml::get_all_text("/title",$parser,$style);
+ $result.=&Apache::edit::editline('',$text,'',60);
} elsif ($target eq 'modified') {
$result.=&Apache::edit::rebuild_tag($token);
$result.=&Apache::edit::modifiedfield("/title",$parser);
@@ -671,18 +1194,17 @@ sub start_xlabel {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
my $result='';
if ($target eq 'web' || $target eq 'tex') {
- $xlabel = &Apache::lonxml::get_all_text("/xlabel",$parser);
+ $xlabel = &Apache::lonxml::get_all_text("/xlabel",$parser,$style);
$xlabel=&Apache::run::evaluate($xlabel,$safeeval,$$parstack[-1]);
$xlabel =~ s/\n/ /g;
if (length($xlabel) > $max_str_len) {
$xlabel = substr($xlabel,0,$max_str_len);
}
+ $xlabel = &parse_label($target,$xlabel);
} elsif ($target eq 'edit') {
$result.=&Apache::edit::tag_start($target,$token,'Plot Xlabel');
- my $text=&Apache::lonxml::get_all_text("/xlabel",$parser);
- $result.=&Apache::edit::end_row().
- &Apache::edit::start_spanning_row().
- &Apache::edit::editline('',$text,'',60);
+ my $text=&Apache::lonxml::get_all_text("/xlabel",$parser,$style);
+ $result.=&Apache::edit::editline('',$text,'',60);
} elsif ($target eq 'modified') {
$result.=&Apache::edit::rebuild_tag($token);
$result.=&Apache::edit::modifiedfield("/xlabel",$parser);
@@ -705,18 +1227,17 @@ sub start_ylabel {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
my $result='';
if ($target eq 'web' || $target eq 'tex') {
- $ylabel = &Apache::lonxml::get_all_text("/ylabel",$parser);
+ $ylabel = &Apache::lonxml::get_all_text("/ylabel",$parser,$style);
$ylabel = &Apache::run::evaluate($ylabel,$safeeval,$$parstack[-1]);
$ylabel =~ s/\n/ /g;
if (length($ylabel) > $max_str_len) {
$ylabel = substr($ylabel,0,$max_str_len);
}
+ $ylabel = &parse_label($target,$ylabel);
} elsif ($target eq 'edit') {
$result .= &Apache::edit::tag_start($target,$token,'Plot Ylabel');
- my $text = &Apache::lonxml::get_all_text("/ylabel",$parser);
- $result .= &Apache::edit::end_row().
- &Apache::edit::start_spanning_row().
- &Apache::edit::editline('',$text,'',60);
+ my $text = &Apache::lonxml::get_all_text("/ylabel",$parser,$style);
+ $result .= &Apache::edit::editline('',$text,'',60);
} elsif ($target eq 'modified') {
$result.=&Apache::edit::rebuild_tag($token);
$result.=&Apache::edit::modifiedfield("/ylabel",$parser);
@@ -742,16 +1263,16 @@ sub start_label {
my %label;
&get_attributes(\%label,\%label_defaults,$parstack,$safeeval,
$tagstack->[-1]);
- my $text = &Apache::lonxml::get_all_text("/label",$parser);
+ my $text = &Apache::lonxml::get_all_text("/label",$parser,$style);
$text = &Apache::run::evaluate($text,$safeeval,$$parstack[-1]);
$text =~ s/\n/ /g;
$text = substr($text,0,$max_str_len) if (length($text) > $max_str_len);
- $label{'text'} = $text;
+ $label{'text'} = &parse_label($target,$text);
push(@labels,\%label);
} elsif ($target eq 'edit') {
$result .= &Apache::edit::tag_start($target,$token,'Plot Label');
$result .= &edit_attributes($target,$token,\%label_defaults);
- my $text = &Apache::lonxml::get_all_text("/label",$parser);
+ my $text = &Apache::lonxml::get_all_text("/label",$parser,$style);
$result .= &Apache::edit::end_row().
&Apache::edit::start_spanning_row().
&Apache::edit::editline('',$text,'',60);
@@ -788,13 +1309,15 @@ sub start_curve {
} elsif ($target eq 'edit') {
$result .= &Apache::edit::tag_start($target,$token,'Curve');
$result .= &edit_attributes($target,$token,\%curve_defaults,
- \@curve_edit_order);
+ \@curve_edit_order)
+ .&Apache::edit::end_row()
+ .&Apache::edit::start_spanning_row();
+
} elsif ($target eq 'modified') {
my $constructtag=&Apache::edit::get_new_args
($token,$parstack,$safeeval,keys(%curve_defaults));
if ($constructtag) {
$result = &Apache::edit::rebuild_tag($token);
- $result.= &Apache::edit::handle_insert();
}
}
return $result;
@@ -825,15 +1348,14 @@ sub start_function {
'curve function declaration.');
delete $curves[-1]->{'data'} ;
}
- my $function = &Apache::lonxml::get_all_text("/function",$parser);
+ my $function = &Apache::lonxml::get_all_text("/function",$parser,
+ $style);
$function = &Apache::run::evaluate($function,$safeeval,$$parstack[-1]);
$curves[-1]->{'function'} = $function;
} elsif ($target eq 'edit') {
$result .= &Apache::edit::tag_start($target,$token,'Gnuplot compatible curve function');
- my $text = &Apache::lonxml::get_all_text("/function",$parser);
- $result .= &Apache::edit::end_row().
- &Apache::edit::start_spanning_row().
- &Apache::edit::editline('',$text,'',60);
+ my $text = &Apache::lonxml::get_all_text("/function",$parser,$style);
+ $result .= &Apache::edit::editline('',$text,'',60);
} elsif ($target eq 'modified') {
$result.=&Apache::edit::rebuild_tag($token);
$result.=&Apache::edit::modifiedfield("/function",$parser);
@@ -864,7 +1386,7 @@ sub start_data {
'curve data declaration.');
delete($curves[-1]->{'function'});
}
- my $datatext = &Apache::lonxml::get_all_text("/data",$parser);
+ my $datatext = &Apache::lonxml::get_all_text("/data",$parser,$style);
$datatext=&Apache::run::evaluate($datatext,$safeeval,$$parstack[-1]);
# Deal with cases where we're given an array...
if ($datatext =~ /^\@/) {
@@ -907,10 +1429,8 @@ sub start_data {
push @{$curves[-1]->{'data'}},\@data;
} elsif ($target eq 'edit') {
$result .= &Apache::edit::tag_start($target,$token,'Comma or space deliminated curve data');
- my $text = &Apache::lonxml::get_all_text("/data",$parser);
- $result .= &Apache::edit::end_row().
- &Apache::edit::start_spanning_row().
- &Apache::edit::editline('',$text,'',60);
+ my $text = &Apache::lonxml::get_all_text("/data",$parser,$style);
+ $result .= &Apache::edit::editline('',$text,'',60);
} elsif ($target eq 'modified') {
$result.=&Apache::edit::rebuild_tag($token);
$result.=&Apache::edit::modifiedfield("/data",$parser);
@@ -1004,9 +1524,9 @@ sub get_attributes{
##------------------------------------------------------- write_gnuplot_file
sub write_gnuplot_file {
my ($tmpdir,$filename,$target)= @_;
+ my ($fontsize, $font_properties) = &get_font($target);
my $gnuplot_input = '';
my $curve;
- my $pt = $plot{'texfont'};
#
# Check to be sure we do not have any empty curves
my @curvescopy;
@@ -1027,68 +1547,117 @@ sub write_gnuplot_file {
@curves = @curvescopy;
# Collect all the colors
my @Colors;
- push @Colors, $plot{'bgcolor'};
- push @Colors, $plot{'fgcolor'};
- push @Colors, (defined($axis{'color'})?$axis{'color'}:$plot{'fgcolor'});
+ push @Colors, $Apache::lonplot::plot{'bgcolor'};
+ push @Colors, $Apache::lonplot::plot{'fgcolor'};
+ push @Colors, (defined($axis{'color'})?$axis{'color'}:$Apache::lonplot::plot{'fgcolor'});
foreach $curve (@curves) {
push @Colors, ($curve->{'color'} ne '' ?
$curve->{'color'} :
- $plot{'fgcolor'} );
+ $Apache::lonplot::plot{'fgcolor'} );
}
# set term
if ($target eq 'web') {
- $gnuplot_input .= 'set term '.$weboutputformat .' ';
- $gnuplot_input .= 'transparent ' if ($plot{'transparent'} eq 'on');
- $gnuplot_input .= $plot{'font'} . ' ';
- $gnuplot_input .= 'size '.$plot{'width'}.','.$plot{'height'}.' ';
+ $gnuplot_input .= 'set terminal png enhanced nocrop ';
+ $gnuplot_input .= 'transparent ' if ($Apache::lonplot::plot{'transparent'} eq 'on');
+ $gnuplot_input .= 'font "'.$Apache::lonnet::perlvar{'lonFontsDir'}.
+ '/'.$font_properties->{'file'}.'.ttf" ';
+ $gnuplot_input .= $fontsize;
+ $gnuplot_input .= ' size '.$Apache::lonplot::plot{'width'}.','.$Apache::lonplot::plot{'height'}.' ';
$gnuplot_input .= "@Colors\n";
# set output
$gnuplot_input .= "set output\n";
} elsif ($target eq 'tex') {
- $gnuplot_input .= "set term postscript eps $plot{'plotcolor'} solid \"Helvetica\" $pt \n";
- $gnuplot_input .= "set output \"/home/httpd/perl/tmp/".
- &Apache::lonnet::unescape($filename).".eps\"\n";
+ $gnuplot_input .= "set term postscript eps enhanced $Apache::lonplot::plot{'plotcolor'} solid ";
+ if (!$font_properties->{'tex_no_file'}) {
+ $gnuplot_input .=
+ 'fontfile "'.$Apache::lonnet::perlvar{'lonFontsDir'}.
+ '/'.$font_properties->{'file'}.'.pfb" ';
+ }
+ $gnuplot_input .= ' "'.$font_properties->{'printname'}.'" ';
+ $gnuplot_input .= $fontsize;
+ $gnuplot_input .= "\nset output \"/home/httpd/perl/tmp/".
+ &unescape($filename).".eps\"\n";
+ $gnuplot_input .= "set encoding iso_8859_1\n"; # Get access to extended font.
+
}
- # cartesian or polar?
- if (lc($plot{'plottype'}) eq 'polar') {
+ # cartesian or polar plot?
+ if (lc($Apache::lonplot::plot{'plottype'}) eq 'polar') {
$gnuplot_input .= 'set polar'.$/;
} else {
# Assume Cartesian
}
+ # cartesian or polar grid?
+ if (lc($Apache::lonplot::plot{'gridtype'}) eq 'polar') {
+ $gnuplot_input .= 'set grid polar'.$/;
+ } elsif (lc($Apache::lonplot::plot{'gridtype'}) eq 'linear-log') {
+ $gnuplot_input .= 'set logscale x'.$/;
+ } elsif (lc($Apache::lonplot::plot{'gridtype'}) eq 'log-linear') {
+ $gnuplot_input .= 'set logscale y'.$/;
+ } elsif (lc($Apache::lonplot::plot{'gridtype'}) eq 'log-log') {
+ $gnuplot_input .= 'set logscale x'.$/;
+ $gnuplot_input .= 'set logscale y'.$/;
+ } else {
+ # Assume Cartesian
+ }
+ # solid or pattern for boxes?
+ if (lc($Apache::lonplot::plot{'fillstyle'}) eq 'solid') {
+ $gnuplot_input .= 'set style fill solid '.
+ $Apache::lonplot::plot{'solid'}.$Apache::lonplot::plot{'box_border'}.$/;
+ } elsif (lc($Apache::lonplot::plot{'fillstyle'}) eq 'pattern') {
+ $gnuplot_input .= 'set style fill pattern '.$Apache::lonplot::plot{'pattern'}.$Apache::lonplot::plot{'box_border'}.$/;
+ } elsif (lc($Apache::lonplot::plot{'fillstyle'}) eq 'empty') {
+ }
# margin
- if (lc($plot{'lmargin'}) ne 'default') {
- $gnuplot_input .= 'set lmargin '.$plot{'lmargin'}.$/;
+ if (lc($Apache::lonplot::plot{'lmargin'}) ne 'default') {
+ $gnuplot_input .= 'set lmargin '.$Apache::lonplot::plot{'lmargin'}.$/;
}
- if (lc($plot{'rmargin'}) ne 'default') {
- $gnuplot_input .= 'set rmargin '.$plot{'rmargin'}.$/;
+ if (lc($Apache::lonplot::plot{'rmargin'}) ne 'default') {
+ $gnuplot_input .= 'set rmargin '.$Apache::lonplot::plot{'rmargin'}.$/;
}
- if (lc($plot{'tmargin'}) ne 'default') {
- $gnuplot_input .= 'set tmargin '.$plot{'tmargin'}.$/;
+ if (lc($Apache::lonplot::plot{'tmargin'}) ne 'default') {
+ $gnuplot_input .= 'set tmargin '.$Apache::lonplot::plot{'tmargin'}.$/;
}
- if (lc($plot{'bmargin'}) ne 'default') {
- $gnuplot_input .= 'set bmargin '.$plot{'bmargin'}.$/;
+ if (lc($Apache::lonplot::plot{'bmargin'}) ne 'default') {
+ $gnuplot_input .= 'set bmargin '.$Apache::lonplot::plot{'bmargin'}.$/;
}
+
# tic scales
- $gnuplot_input .= 'set ticscale '.
- $plot{'major_ticscale'}.' '.$plot{'minor_ticscale'}.$/;
+ if ($version > 4) {
+ $gnuplot_input .= 'set tics scale '.
+ $Apache::lonplot::plot{'major_ticscale'}.', '.$Apache::lonplot::plot{'minor_ticscale'}.$/;
+ } else {
+ $gnuplot_input .= 'set ticscale '.
+ $Apache::lonplot::plot{'major_ticscale'}.' '.$Apache::lonplot::plot{'minor_ticscale'}.$/;
+ }
+ #boxwidth
+ if (lc($Apache::lonplot::plot{'boxwidth'}) ne '') {
+ $gnuplot_input .= 'set boxwidth '.$Apache::lonplot::plot{'boxwidth'}.$/;
+ }
+ # gridlayer
+ $gnuplot_input .= 'set grid noxtics noytics front '.$/
+ if ($Apache::lonplot::plot{'gridlayer'} eq 'on');
+
# grid
- $gnuplot_input .= 'set grid'.$/ if ($plot{'grid'} eq 'on');
+ $gnuplot_input .= 'set grid'.$/ if ($Apache::lonplot::plot{'grid'} eq 'on');
# border
- $gnuplot_input .= ($plot{'border'} eq 'on'?
+ $gnuplot_input .= ($Apache::lonplot::plot{'border'} eq 'on'?
'set border'.$/ :
'set noborder'.$/ );
# sampling rate for non-data curves
- $gnuplot_input .= "set samples $plot{'samples'}\n";
+ $gnuplot_input .= "set samples $Apache::lonplot::plot{'samples'}\n";
# title, xlabel, ylabel
# titles
+ my $extra_space_x = ($xtics{'location'} eq 'axis') ? ' 0, -0.5 ' : '';
+ my $extra_space_y = ($ytics{'location'} eq 'axis') ? ' -0.5, 0 ' : '';
+
if ($target eq 'tex') {
- $gnuplot_input .= "set title \"$title\" font \"Helvetica,".$pt."pt\"\n" if (defined($title)) ;
- $gnuplot_input .= "set xlabel \"$xlabel\" font \"Helvetica,".$pt."pt\" \n" if (defined($xlabel));
- $gnuplot_input .= "set ylabel \"$ylabel\" font \"Helvetica,".$pt."pt\"\n" if (defined($ylabel));
+ $gnuplot_input .= "set title \"$title\" font \"".$font_properties->{'printname'}.",".$fontsize."pt\"\n" if (defined($title)) ;
+ $gnuplot_input .= "set xlabel \"$xlabel\" $extra_space_x font \"".$font_properties->{'printname'}.",".$fontsize."pt\"\n" if (defined($xlabel));
+ $gnuplot_input .= "set ylabel \"$ylabel\" $extra_space_y font \"".$font_properties->{'printname'}.",".$fontsize."pt\"\n" if (defined($ylabel));
} else {
- $gnuplot_input .= "set title \"$title\" \n" if (defined($title)) ;
- $gnuplot_input .= "set xlabel \"$xlabel\" \n" if (defined($xlabel));
- $gnuplot_input .= "set ylabel \"$ylabel\" \n" if (defined($ylabel));
+ $gnuplot_input .= "set title \"$title\" \n" if (defined($title)) ;
+ $gnuplot_input .= "set xlabel \"$xlabel\" $extra_space_x \n" if (defined($xlabel));
+ $gnuplot_input .= "set ylabel \"$ylabel\" $extra_space_y \n" if (defined($ylabel));
}
# tics
if (%xtics) {
@@ -1113,6 +1682,22 @@ sub write_gnuplot_file {
}
# axis
if (%axis) {
+ if ($axis{'xformat'} ne 'on') {
+ $gnuplot_input .= "set format x ";
+ if ($axis{'xformat'} eq 'off') {
+ $gnuplot_input .= "\"\"\n";
+ } else {
+ $gnuplot_input .= "\"\%.".$axis{'xformat'}."\"\n";
+ }
+ }
+ if ($axis{'yformat'} ne 'on') {
+ $gnuplot_input .= "set format y ";
+ if ($axis{'yformat'} eq 'off') {
+ $gnuplot_input .= "\"\"\n";
+ } else {
+ $gnuplot_input .= "\"\%.".$axis{'yformat'}."\"\n";
+ }
+ }
$gnuplot_input .= "set xrange \[$axis{'xmin'}:$axis{'xmax'}\]\n";
$gnuplot_input .= "set yrange \[$axis{'ymin'}:$axis{'ymax'}\]\n";
}
@@ -1130,27 +1715,35 @@ sub write_gnuplot_file {
my $label;
foreach $label (@labels) {
$gnuplot_input .= 'set label "'.$label->{'text'}.'" at '.
- $label->{'xpos'}.','.$label->{'ypos'}.' '.$label->{'justify'};
+ $label->{'xpos'}.','.$label->{'ypos'};
+ if ($label->{'rotate'} ne '') {
+ $gnuplot_input .= ' rotate by '.$label->{'rotate'};
+ }
+ $gnuplot_input .= ' '.$label->{'justify'};
+
if ($target eq 'tex') {
- $gnuplot_input .=' font "Helvetica,'.$pt.'pt"' ;
+ $gnuplot_input .=' font "'.$font_properties->{'printname'}.','.$fontsize.'pt"' ;
}
$gnuplot_input .= $/;
}
if ($target eq 'tex') {
- $gnuplot_input .="set size 1,".$plot{'height'}/$plot{'width'}*1.38;
+ $gnuplot_input .="set size 1,".$Apache::lonplot::plot{'height'}/$Apache::lonplot::plot{'width'}*1.38;
$gnuplot_input .="\n";
- }
+ }
# curves
$gnuplot_input .= 'plot ';
for (my $i = 0;$i<=$#curves;$i++) {
$curve = $curves[$i];
$gnuplot_input.= ', ' if ($i > 0);
+ if ($target eq 'tex') {
+ $curve->{'linewidth'} *= 2;
+ }
if (exists($curve->{'function'})) {
$gnuplot_input.=
$curve->{'function'}.' title "'.
$curve->{'name'}.'" with '.
$curve->{'linestyle'};
- $gnuplot_input.= ' linewidth 4 ' if ($target eq 'tex');
+
if (($curve->{'linestyle'} eq 'points') ||
($curve->{'linestyle'} eq 'linespoints') ||
($curve->{'linestyle'} eq 'errorbars') ||
@@ -1159,7 +1752,19 @@ sub write_gnuplot_file {
($curve->{'linestyle'} eq 'xyerrorbars')) {
$gnuplot_input.=' pointtype '.$curve->{'pointtype'};
$gnuplot_input.=' pointsize '.$curve->{'pointsize'};
+ } elsif ($curve->{'linestyle'} eq 'filledcurves') {
+ $gnuplot_input.= ' '.$curve->{'limit'};
+ } elsif ($curve->{'linetype'} ne '' &&
+ $curve->{'linestyle'} eq 'lines') {
+ $gnuplot_input.= ' linetype ';
+ $gnuplot_input.= $linetypes{$curve->{'linetype'}};
+ $gnuplot_input.= ' linecolor rgb "';
+ # convert color from xaaaaaa to #aaaaaa
+ $curve->{'color'} =~ s/^x/#/;
+ $gnuplot_input.= $curve->{'color'}.'"';
}
+ $gnuplot_input.= ' linewidth '.$curve->{'linewidth'};
+
} elsif (exists($curve->{'data'})) {
# Store data values in $datatext
my $datatext = '';
@@ -1178,12 +1783,11 @@ sub write_gnuplot_file {
}
# write file
print $fh $datatext;
- close ($fh);
+ close($fh);
# generate gnuplot text
$gnuplot_input.= '"'.$datafilename.'" title "'.
$curve->{'name'}.'" with '.
$curve->{'linestyle'};
- $gnuplot_input.= ' linewidth 4 ' if ($target eq 'tex');
if (($curve->{'linestyle'} eq 'points') ||
($curve->{'linestyle'} eq 'linespoints') ||
($curve->{'linestyle'} eq 'errorbars') ||
@@ -1192,11 +1796,23 @@ sub write_gnuplot_file {
($curve->{'linestyle'} eq 'xyerrorbars')) {
$gnuplot_input.=' pointtype '.$curve->{'pointtype'};
$gnuplot_input.=' pointsize '.$curve->{'pointsize'};
+ } elsif ($curve->{'linestyle'} eq 'filledcurves') {
+ $gnuplot_input.= ' '.$curve->{'limit'};
+ } elsif ($curve->{'linetype'} ne '' &&
+ $curve->{'linestyle'} eq 'lines') {
+ $gnuplot_input.= ' linetype ';
+ $gnuplot_input.= $linetypes{$curve->{'linetype'}};
+ $gnuplot_input.= ' linecolor rgb "';
+ # convert color from xaaaaaa to #aaaaaa
+ $curve->{'color'} =~ s/^x/#/;
+ $gnuplot_input.= $curve->{'color'}.'"';
}
+ $gnuplot_input.= ' linewidth '.$curve->{'linewidth'};
}
}
# Write the output to a file.
- my $fh=Apache::File->new(">$tmpdir$filename.data");
+ open (my $fh,">$tmpdir$filename.data");
+ binmode($fh, ":utf8");
print $fh $gnuplot_input;
close($fh);
# That's all folks.
@@ -1207,7 +1823,7 @@ sub write_gnuplot_file {
sub check_inputs {
## Note: no inputs, no outputs - this acts only on global variables.
## Make sure we have all the input we need:
- if (! %plot) { &set_defaults(\%plot,\%gnuplot_defaults); }
+ if (! %Apache::lonplot::plot) { &set_defaults(\%Apache::lonplot::plot,\%gnuplot_defaults); }
if (! %key ) {} # No key for this plot, thats okay
# if (! %axis) { &set_defaults(\%axis,\%axis_defaults); }
if (! defined($title )) {} # No title for this plot, thats okay
500 Internal Server Error
Internal Server Error
The server encountered an internal error or
misconfiguration and was unable to complete
your request.
Please contact the server administrator at
root@localhost to inform them of the time this error occurred,
and the actions you performed just before this error.
More information about this error may be available
in the server error log.