Handle sub/super-scripts in rich text
- it aims to fix #14317; - change the fontSize and the verticalAlign properties according to the position of the text.
This commit is contained in:
parent
e439f4d620
commit
cfdaa57353
@ -107,13 +107,14 @@ const StyleMapping = new Map([
|
|||||||
["margin-top", value => measureToString(getMeasurement(value))],
|
["margin-top", value => measureToString(getMeasurement(value))],
|
||||||
["text-indent", value => measureToString(getMeasurement(value))],
|
["text-indent", value => measureToString(getMeasurement(value))],
|
||||||
["font-family", value => value],
|
["font-family", value => value],
|
||||||
|
["vertical-align", value => measureToString(getMeasurement(value))],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const spacesRegExp = /\s+/g;
|
const spacesRegExp = /\s+/g;
|
||||||
const crlfRegExp = /[\r\n]+/g;
|
const crlfRegExp = /[\r\n]+/g;
|
||||||
const crlfForRichTextRegExp = /\r\n?/g;
|
const crlfForRichTextRegExp = /\r\n?/g;
|
||||||
|
|
||||||
function mapStyle(styleStr, node) {
|
function mapStyle(styleStr, node, richText) {
|
||||||
const style = Object.create(null);
|
const style = Object.create(null);
|
||||||
if (!styleStr) {
|
if (!styleStr) {
|
||||||
return style;
|
return style;
|
||||||
@ -158,6 +159,29 @@ function mapStyle(styleStr, node) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
richText &&
|
||||||
|
style.verticalAlign &&
|
||||||
|
style.verticalAlign !== "0px" &&
|
||||||
|
style.fontSize
|
||||||
|
) {
|
||||||
|
// A non-zero verticalAlign means that we've a sub/super-script and
|
||||||
|
// consequently the font size must be decreased.
|
||||||
|
// https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf#G11.2097514
|
||||||
|
// And the two following factors to position the scripts have been
|
||||||
|
// found here:
|
||||||
|
// https://en.wikipedia.org/wiki/Subscript_and_superscript#Desktop_publishing
|
||||||
|
const SUB_SUPER_SCRIPT_FACTOR = 0.583;
|
||||||
|
const VERTICAL_FACTOR = 0.333;
|
||||||
|
const fontSize = getMeasurement(style.fontSize);
|
||||||
|
style.fontSize = measureToString(fontSize * SUB_SUPER_SCRIPT_FACTOR);
|
||||||
|
style.verticalAlign = measureToString(
|
||||||
|
Math.sign(getMeasurement(style.verticalAlign)) *
|
||||||
|
fontSize *
|
||||||
|
VERTICAL_FACTOR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
fixTextIndent(style);
|
fixTextIndent(style);
|
||||||
return style;
|
return style;
|
||||||
}
|
}
|
||||||
@ -333,7 +357,7 @@ class XhtmlObject extends XmlObject {
|
|||||||
name: this[$nodeName],
|
name: this[$nodeName],
|
||||||
attributes: {
|
attributes: {
|
||||||
href: this.href,
|
href: this.href,
|
||||||
style: mapStyle(this.style, this),
|
style: mapStyle(this.style, this, this[$richText]),
|
||||||
},
|
},
|
||||||
children,
|
children,
|
||||||
value,
|
value,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user