Modify accents to use better characters in some circumstances (basically the right arrow at the moment)

This commit is contained in:
Davide P. Cervone 2012-01-15 15:26:36 -05:00
parent db55f22ba7
commit 9a092fe68b
14 changed files with 119 additions and 14 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -114,6 +114,12 @@
0x2758: 0x2223 // VerticalSeparator 0x2758: 0x2223 // VerticalSeparator
}, },
REMAPACCENT: {
"\u2192": "\u20D7"
},
REMAPACCENTUNDER: {
},
DELIMITERS: { DELIMITERS: {
0x0028: // ( 0x0028: // (
{ {

View File

@ -162,6 +162,12 @@
0x2057: "\u2032\u2032\u2032\u2032" // quadruple prime 0x2057: "\u2032\u2032\u2032\u2032" // quadruple prime
}, },
REMAPACCENT: {
"\u2192":"\u20D7"
},
REMAPACCENTUNDER: {
},
PLANE1MAP: [ PLANE1MAP: [
[0x1D400,0x1D419, 0x41, MML.VARIANT.BOLD], [0x1D400,0x1D419, 0x41, MML.VARIANT.BOLD],
[0x1D41A,0x1D433, 0x61, MML.VARIANT.BOLD], [0x1D41A,0x1D433, 0x61, MML.VARIANT.BOLD],

View File

@ -1854,24 +1854,47 @@
span = this.HTMLhandleSize(this.HTMLcreateSpan(span)); span = this.HTMLhandleSize(this.HTMLcreateSpan(span));
if (this.data.length == 0) {return span} else {span.bbox = null} if (this.data.length == 0) {return span} else {span.bbox = null}
var text = this.data.join(""); var text = this.data.join("");
//
// Get the variant, and check for operator size
//
var variant = this.HTMLgetVariant(); var variant = this.HTMLgetVariant();
var values = this.getValues("largeop","displaystyle"); var values = this.getValues("largeop","displaystyle");
if (values.largeop) if (values.largeop)
{variant = HTMLCSS.FONTDATA.VARIANT[values.displaystyle ? "-largeOp" : "-smallOp"]} {variant = HTMLCSS.FONTDATA.VARIANT[values.displaystyle ? "-largeOp" : "-smallOp"]}
var parent = this.Parent(), //
isScript = (parent.isa(MML.msubsup) && this !== parent.data[0]), // Get character translation for superscript and accents
//
var parent = this.CoreParent(),
isScript = (parent && parent.isa(MML.msubsup) && this !== parent.data[parent.base]),
mapchars = (isScript?this.HTMLremapChars:null); mapchars = (isScript?this.HTMLremapChars:null);
if (text.length === 1 && parent && parent.isa(MML.munderover) &&
this.CoreText(parent.data[parent.base]).length === 1) {
var over = parent.data[parent.over], under = parent.data[parent.under];
if (over && this === over.CoreMO() && parent.Get("accent")) {mapchars = HTMLCSS.FONTDATA.REMAPACCENT}
else if (under && this === under.CoreMO() && parent.Get("accentunder")) {mapchars = HTMLCSS.FONTDATA.REMAPACCENTUNDER}
}
//
// STIX fonts need quotes from variant font
//
if (isScript && HTMLCSS.fontInUse === "STIX" && text.match(/['`"\u00B4]/)) if (isScript && HTMLCSS.fontInUse === "STIX" && text.match(/['`"\u00B4]/))
{variant = HTMLCSS.FONTDATA.VARIANT["-STIX-variant"]} {variant = HTMLCSS.FONTDATA.VARIANT["-STIX-variant"]}
//
// Typeset contents
//
for (var i = 0, m = this.data.length; i < m; i++) for (var i = 0, m = this.data.length; i < m; i++)
{if (this.data[i]) {this.data[i].toHTML(span,variant,this.HTMLremap,mapchars)}} {if (this.data[i]) {this.data[i].toHTML(span,variant,this.HTMLremap,mapchars)}}
if (!span.bbox) {span.bbox = {w:0, h:0, d:0, rw:0, lw:0}} if (!span.bbox) {span.bbox = {w:0, h:0, d:0, rw:0, lw:0}}
if (text.length !== 1) {delete span.bbox.skew} if (text.length !== 1) {delete span.bbox.skew}
if (HTMLCSS.AccentBug && span.bbox.w === 0 && text.length === 1 && span.firstChild) { //
// Handle combining characters by adding a non-breaking space and removing that width // Handle combining characters by adding a non-breaking space and removing that width
//
if (HTMLCSS.AccentBug && span.bbox.w === 0 && text.length === 1 && span.firstChild) {
span.firstChild.nodeValue += HTMLCSS.NBSP; span.firstChild.nodeValue += HTMLCSS.NBSP;
HTMLCSS.createSpace(span,0,0,-span.offsetWidth/HTMLCSS.em); HTMLCSS.createSpace(span,0,0,-span.offsetWidth/HTMLCSS.em);
} }
//
// Handle large operator centering
//
if (values.largeop) { if (values.largeop) {
var p = (span.bbox.h - span.bbox.d)/2 - HTMLCSS.TeX.axis_height*span.scale; var p = (span.bbox.h - span.bbox.d)/2 - HTMLCSS.TeX.axis_height*span.scale;
if (HTMLCSS.safariVerticalAlignBug && span.lastChild.nodeName === "IMG") { if (HTMLCSS.safariVerticalAlignBug && span.lastChild.nodeName === "IMG") {
@ -1891,10 +1914,26 @@
span.bbox.w = span.bbox.rw; span.bbox.w = span.bbox.rw;
} }
} }
//
// Finish up
//
this.HTMLhandleSpace(span); this.HTMLhandleSpace(span);
this.HTMLhandleColor(span); this.HTMLhandleColor(span);
return span; return span;
}, },
CoreParent: function () {
var parent = this;
while (parent && parent.isEmbellished() &&
parent.CoreMO() === this && !parent.isa(MML.math)) {parent = parent.Parent()}
return parent;
},
CoreText: function (parent) {
if (!parent) {return ""}
if (parent.isEmbellished()) {return parent.CoreMO().data.join("")}
while (parent.isa(MML.mrow) && parent.data.length === 1 && parent.data[0])
{parent = parent.data[0]}
if (!parent.isToken) {return ""} else {return parent.data.join("")}
},
HTMLremapChars: { HTMLremapChars: {
'*':"\u2217", '*':"\u2217",
'"':"\u2033", '"':"\u2033",
@ -1916,6 +1955,13 @@
if (!this.Get("stretchy")) {return false} if (!this.Get("stretchy")) {return false}
var c = this.data.join(""); var c = this.data.join("");
if (c.length > 1) {return false} if (c.length > 1) {return false}
var parent = this.CoreParent();
if (parent && parent.isa(MML.munderover) &&
this.CoreText(parent.data[parent.base]).length === 1) {
var over = parent.data[parent.over], under = parent.data[parent.under];
if (over && this === over.CoreMO() && parent.Get("accent")) {c = HTMLCSS.FONTDATA.REMAPACCENT[c]||c}
else if (under && this === under.CoreMO() && parent.Get("accentunder")) {c = HTMLCSS.FONTDATA.REMAPACCENTUNDER[c]||c}
}
c = HTMLCSS.FONTDATA.DELIMITERS[c.charCodeAt(0)]; c = HTMLCSS.FONTDATA.DELIMITERS[c.charCodeAt(0)];
return (c && c.dir == direction.substr(0,1)); return (c && c.dir == direction.substr(0,1));
}, },

View File

@ -161,6 +161,12 @@
0x2057: "\u2032\u2032\u2032\u2032" // quadruple prime 0x2057: "\u2032\u2032\u2032\u2032" // quadruple prime
}, },
REMAPACCENT: {
"\u2192":"\u20D7"
},
REMAPACCENTUNDER: {
},
PLANE1MAP: [ PLANE1MAP: [
[0x1D400,0x1D419, 0x41, MML.VARIANT.BOLD], [0x1D400,0x1D419, 0x41, MML.VARIANT.BOLD],
[0x1D41A,0x1D433, 0x61, MML.VARIANT.BOLD], [0x1D41A,0x1D433, 0x61, MML.VARIANT.BOLD],

View File

@ -1220,13 +1220,28 @@
this.SVGgetStyles(); this.SVGgetStyles();
var svg = this.svg = this.SVG(); this.SVGhandleSpace(svg); var svg = this.svg = this.SVG(); this.SVGhandleSpace(svg);
if (this.data.length == 0) {svg.Clean(); this.SVGsaveData(svg); return svg} if (this.data.length == 0) {svg.Clean(); this.SVGsaveData(svg); return svg}
//
// Get the variant, and check for operator size
//
var scale = this.SVGgetScale(), variant = this.SVGgetVariant(); var scale = this.SVGgetScale(), variant = this.SVGgetVariant();
var values = this.getValues("largeop","displaystyle"); var values = this.getValues("largeop","displaystyle");
if (values.largeop) if (values.largeop)
{variant = SVG.FONTDATA.VARIANT[values.displaystyle ? "-largeOp" : "-smallOp"]} {variant = SVG.FONTDATA.VARIANT[values.displaystyle ? "-largeOp" : "-smallOp"]}
var parent = this.Parent(), //
isScript = (parent.isa(MML.msubsup) && this !== parent.data[0]), // Get character translation for superscript and accents
//
var parent = this.CoreParent(),
isScript = (parent && parent.isa(MML.msubsup) && this !== parent.data[0]),
mapchars = (isScript?this.SVGremapChars:null); mapchars = (isScript?this.SVGremapChars:null);
if (this.data.join("").length === 1 && parent && parent.isa(MML.munderover) &&
this.CoreText(parent.data[parent.base]).length === 1) {
var over = parent.data[parent.over], under = parent.data[parent.under];
if (over && this === over.CoreMO() && parent.Get("accent")) {mapchars = SVG.FONTDATA.REMAPACCENT}
else if (under && this === under.CoreMO() && parent.Get("accentunder")) {mapchars = SVG.FONTDATA.REMAPACCENTUNDER}
}
//
// Typeset contents
//
for (var i = 0, m = this.data.length; i < m; i++) { for (var i = 0, m = this.data.length; i < m; i++) {
if (this.data[i]) { if (this.data[i]) {
var text = this.data[i].toSVG(variant,scale,this.SVGremap,mapchars), x = svg.w; var text = this.data[i].toSVG(variant,scale,this.SVGremap,mapchars), x = svg.w;
@ -1237,14 +1252,33 @@
} }
svg.Clean(); svg.Clean();
if (this.data.join("").length !== 1) {delete svg.skew} if (this.data.join("").length !== 1) {delete svg.skew}
//
// Handle large operator centering
//
if (values.largeop) { if (values.largeop) {
svg.y = (svg.h - svg.d)/2/scale - SVG.TeX.axis_height; svg.y = (svg.h - svg.d)/2/scale - SVG.TeX.axis_height;
if (svg.r > svg.w) {svg.ic = svg.r - svg.w; svg.w = svg.r} if (svg.r > svg.w) {svg.ic = svg.r - svg.w; svg.w = svg.r}
} }
//
// Finish up
//
this.SVGhandleColor(svg); this.SVGhandleColor(svg);
this.SVGsaveData(svg); this.SVGsaveData(svg);
return svg; return svg;
}, },
CoreParent: function () {
var parent = this;
while (parent && parent.isEmbellished() &&
parent.CoreMO() === this && !parent.isa(MML.math)) {parent = parent.Parent()}
return parent;
},
CoreText: function (parent) {
if (!parent) {return ""}
if (parent.isEmbellished()) {return parent.CoreMO().data.join("")}
while (parent.isa(MML.mrow) && parent.data.length === 1 && parent.data[0])
{parent = parent.data[0]}
if (!parent.isToken) {return ""} else {return parent.data.join("")}
},
SVGremapChars: { SVGremapChars: {
'*':"\u2217", '*':"\u2217",
'"':"\u2033", '"':"\u2033",
@ -1266,6 +1300,13 @@
if (!this.Get("stretchy")) {return false} if (!this.Get("stretchy")) {return false}
var c = this.data.join(""); var c = this.data.join("");
if (c.length > 1) {return false} if (c.length > 1) {return false}
var parent = this.CoreParent();
if (parent && parent.isa(MML.munderover) &&
this.CoreText(parent.data[parent.base]).length === 1) {
var over = parent.data[parent.over], under = parent.data[parent.under];
if (over && this === over.CoreMO() && parent.Get("accent")) {c = SVG.FONTDATA.REMAPACCENT[c]||c}
else if (under && this === under.CoreMO() && parent.Get("accentunder")) {c = SVG.FONTDATA.REMAPACCENTUNDER[c]||c}
}
c = SVG.FONTDATA.DELIMITERS[c.charCodeAt(0)]; c = SVG.FONTDATA.DELIMITERS[c.charCodeAt(0)];
var can = (c && c.dir == direction.substr(0,1)); var can = (c && c.dir == direction.substr(0,1));
if (!can) {delete this.svg} if (!can) {delete this.svg}