Skip to content

Commit f46952e

Browse files
committed
Count multi-character glyphs properly in SVG
1 parent e30f5f1 commit f46952e

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

unpacked/jax/output/SVG/autoload/mmultiscripts.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ MathJax.Hub.Register.StartupHook("SVG Jax Ready",function () {
4646
if (base.ic) {delta = base.ic}
4747
if (this.data[this.base] &&
4848
(this.data[this.base].type === "mi" || this.data[this.base].type === "mo")) {
49-
if (this.data[this.base].data.join("").length === 1 && base.scale === 1 &&
49+
if (SVG.isChar(this.data[this.base].data.join("")) && base.scale === 1 &&
5050
!base.stretched && !this.data[this.base].Get("largeop")) {u = v = 0}
5151
}
5252
var min = this.getValues("subscriptshift","superscriptshift"), mu = this.SVGgetMu(svg);

unpacked/jax/output/SVG/jax.js

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,7 @@
709709
HUB.signal.Post(["SVG Jax - unknown char",n,variant]);
710710
}
711711
}
712-
if (text.length == 1 && font.skew && font.skew[n]) {svg.skew = font.skew[n]*1000}
712+
if (SVG.isChar(text) && font.skew && font.skew[n]) {svg.skew = font.skew[n]*1000}
713713
if (svg.element.childNodes.length === 1 && !svg.element.firstChild.getAttribute("x")) {
714714
svg.element = svg.element.firstChild;
715715
svg.removeable = false; svg.scale = scale;
@@ -737,6 +737,13 @@
737737
return {id:"unknown"};
738738
},
739739

740+
isChar: function (text) {
741+
if (text.length === 1) return true;
742+
if (text.length !== 2) return false;
743+
var n = text.charCodeAt(0);
744+
return (n >= 0xD800 && n < 0xDBFF);
745+
},
746+
740747
findBlock: function (font,c) {
741748
if (font.Ranges) {
742749
// FIXME: do binary search?
@@ -1154,8 +1161,8 @@
11541161
}
11551162
}
11561163
svg.Clean(); var text = this.data.join("");
1157-
if (svg.skew && text.length !== 1) {delete svg.skew}
1158-
if (svg.r > svg.w && text.length === 1 && !variant.noIC)
1164+
if (svg.skew && !SVG.isChar(text)) {delete svg.skew}
1165+
if (svg.r > svg.w && SVG.isChar(text) && !variant.noIC)
11591166
{svg.ic = svg.r - svg.w; svg.w = svg.r}
11601167
this.SVGhandleColor(svg);
11611168
this.SVGsaveData(svg);
@@ -1542,8 +1549,8 @@
15421549
var parent = this.CoreParent(),
15431550
isScript = (parent && parent.isa(MML.msubsup) && this !== parent.data[0]),
15441551
mapchars = (isScript?this.remapChars:null);
1545-
if (this.data.join("").length === 1 && parent && parent.isa(MML.munderover) &&
1546-
this.CoreText(parent.data[parent.base]).length === 1) {
1552+
if (SVG.isChar(this.data.join("")) && parent && parent.isa(MML.munderover) &&
1553+
SVG.isChar(this.CoreText(parent.data[parent.base]))) {
15471554
var over = parent.data[parent.over], under = parent.data[parent.under];
15481555
if (over && this === over.CoreMO() && parent.Get("accent")) {mapchars = SVG.FONTDATA.REMAPACCENT}
15491556
else if (under && this === under.CoreMO() && parent.Get("accentunder")) {mapchars = SVG.FONTDATA.REMAPACCENTUNDER}
@@ -1565,7 +1572,7 @@
15651572
}
15661573
}
15671574
svg.Clean();
1568-
if (this.data.join("").length !== 1) {delete svg.skew}
1575+
if (!SVG.isChar(this.data.join(""))) {delete svg.skew}
15691576
//
15701577
// Handle large operator centering
15711578
//
@@ -1586,7 +1593,7 @@
15861593
if (c.length > 1) {return false}
15871594
var parent = this.CoreParent();
15881595
if (parent && parent.isa(MML.munderover) &&
1589-
this.CoreText(parent.data[parent.base]).length === 1) {
1596+
SVG.isChar(this.CoreText(parent.data[parent.base]))) {
15901597
var over = parent.data[parent.over], under = parent.data[parent.under];
15911598
if (over && this === over.CoreMO() && parent.Get("accent")) {c = SVG.FONTDATA.REMAPACCENT[c]||c}
15921599
else if (under && this === under.CoreMO() && parent.Get("accentunder")) {c = SVG.FONTDATA.REMAPACCENTUNDER[c]||c}
@@ -1653,8 +1660,8 @@
16531660
}
16541661
}
16551662
svg.Clean(); var text = this.data.join("");
1656-
if (svg.skew && text.length !== 1) {delete svg.skew}
1657-
if (svg.r > svg.w && text.length === 1 && !variant.noIC)
1663+
if (svg.skew && !SVG.isChar(text)) {delete svg.skew}
1664+
if (svg.r > svg.w && SVG.isChar(text) && !variant.noIC)
16581665
{svg.ic = svg.r - svg.w; svg.w = svg.r}
16591666
this.SVGhandleColor(svg);
16601667
this.SVGsaveData(svg);
@@ -2101,7 +2108,7 @@
21012108
}
21022109
if (this.data[this.base] &&
21032110
(this.data[this.base].type === "mi" || this.data[this.base].type === "mo")) {
2104-
if (this.data[this.base].data.join("").length === 1 && base.scale === 1 &&
2111+
if (SVG.isChar(this.data[this.base].data.join("")) && base.scale === 1 &&
21052112
!base.stretched && !this.data[this.base].Get("largeop")) {u = v = 0}
21062113
}
21072114
var min = this.getValues("subscriptshift","superscriptshift");

0 commit comments

Comments
 (0)