File size: 3,485 Bytes
f56a29b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | import { getTextContent } from '../helpers.js'
export function getStyle(element, ancestors, previousStyle = {}) {
const elAttributes = element.attribs || {}
const color =
elAttributes.mathcolor ||
ancestors.find(
(element) => element.name === 'mstyle' && element.attribs && element.attribs.color
)?.attribs.color ||
''
// const minsize = parseFloat(elAttributes.scriptminsize || ancestors.find(element => element.name === 'mstyle' && element.attribs && element.attribs.scriptminsize)?.attribs.scriptminsize || '8pt')
// const sizemultiplier = parseFloat(elAttributes.scriptsizemultiplier || ancestors.find(element => element.name === 'mstyle' && element.attribs && element.attribs.scriptsizemultiplier)?.attribs.scriptsizemultiplier || '0.71')
const size =
elAttributes.mathsize ||
ancestors.find(
(element) => element.name === 'mstyle' && element.attribs && element.attribs.mathsize
)?.attribs.mathsize ||
''
const scriptlevel =
elAttributes.scriptlevel ||
ancestors.find(
(element) => element.name === 'mstyle' && element.attribs && element.attribs.scriptlevel
)?.attribs.scriptlevel ||
''
const background =
elAttributes.mathbackground ||
ancestors.find(
(element) => element.name === 'mstyle' && element.attribs && element.attribs.mathbackground
)?.attribs.mathbackground ||
''
let variant =
elAttributes.mathvariant ||
ancestors.find(
(element) => element.name === 'mstyle' && element.attribs && element.attribs.mathvariant
)?.attribs.mathvariant ||
''
if (variant === 'b-i') {
variant = 'bold-italic'
}
const fontweight =
elAttributes.fontweight ||
ancestors.find(
(element) => element.name === 'mstyle' && element.attribs && element.attribs.fontweight
)?.attribs.fontweight ||
''
if (fontweight === 'bold' && !['bold', 'bold-italic'].includes(variant)) {
if (variant.includes('italic')) {
variant = 'bold-italic'
} else {
variant = 'bold'
}
} else if (fontweight === 'normal' && ['bold', 'bold-italic'].includes(variant)) {
if (variant.includes('italic')) {
variant = 'italic'
} else {
variant = ''
}
}
const fontstyle =
elAttributes.fontstyle ||
ancestors.find(
(element) => element.name === 'mstyle' && element.attribs && element.attribs.fontstyle
)?.attribs.fontstyle ||
''
if (fontstyle === 'italic' && !['italic', 'bold-italic'].includes(variant)) {
if (variant.includes('bold')) {
variant = 'bold-italic'
} else {
variant = 'italic'
}
} else if (fontstyle === 'normal' && ['italic', 'bold-italic'].includes(variant)) {
if (variant.includes('bold')) {
variant = 'bold'
} else {
variant = ''
}
}
// Override variant for some types
if (!elAttributes.mathvariant) {
const textContent = getTextContent(element)
if (
previousStyle.variant === '' &&
((element.name === 'mi' && textContent.length > 1) ||
(element.name === 'mn' && !/^\d+\.\d+$/.test(textContent)))
) {
variant = ''
} else if (
['mi', 'mn', 'mo'].includes(element.name) &&
['italic', 'bold-italic'].includes(previousStyle.variant)
) {
if (fontweight === 'bold') {
variant = 'bold-italic'
} else {
variant = 'italic'
}
}
}
return {
color,
variant,
size,
scriptlevel,
background,
fontstyle
}
}
|