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
  }
}