@modusoperandi/licit 1.0.4 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/BlockquoteInsertNewLineCommand.js +16 -18
  2. package/BlockquoteInsertNewLineCommand.js.flow +76 -77
  3. package/BlockquoteNodeSpec.js +3 -4
  4. package/BlockquoteNodeSpec.js.flow +29 -30
  5. package/BlockquoteToggleCommand.js +16 -17
  6. package/BlockquoteToggleCommand.js.flow +56 -56
  7. package/BookmarkNodeSpec.js +2 -2
  8. package/BookmarkNodeSpec.js.flow +39 -39
  9. package/BulletListNodeSpec.js.flow +61 -61
  10. package/CZIProseMirror.js.flow +90 -90
  11. package/CodeBlockCommand.js +17 -18
  12. package/CodeBlockCommand.js.flow +65 -65
  13. package/CodeBlockNodeSpec.js.flow +24 -24
  14. package/CodeMarkSpec.js.flow +14 -14
  15. package/ContentPlaceholderPlugin.js +20 -21
  16. package/ContentPlaceholderPlugin.js.flow +185 -187
  17. package/CursorPlaceholderPlugin.js +11 -11
  18. package/CursorPlaceholderPlugin.js.flow +115 -115
  19. package/DocLayoutCommand.js +18 -21
  20. package/DocLayoutCommand.js.flow +97 -99
  21. package/DocNodeSpec.js.flow +64 -64
  22. package/EMMarkSpec.js.flow +14 -14
  23. package/EditorCommands.js.flow +126 -126
  24. package/EditorKeyMap.js +0 -1
  25. package/EditorKeyMap.js.flow +185 -187
  26. package/EditorMarks.js +2 -2
  27. package/EditorMarks.js.flow +71 -71
  28. package/EditorNodes.js +2 -3
  29. package/EditorNodes.js.flow +58 -59
  30. package/EditorPageLayoutPlugin.js +10 -10
  31. package/EditorPageLayoutPlugin.js.flow +67 -67
  32. package/EditorPlugins.js.flow +8 -8
  33. package/EditorSchema.js.flow +12 -12
  34. package/EditorState.js.flow +7 -7
  35. package/FontSizeMarkSpec.js.flow +49 -49
  36. package/FontTypeMarkSpec.js +1 -1
  37. package/FontTypeMarkSpec.js.flow +80 -80
  38. package/HTMLMutator.js +6 -7
  39. package/HTMLMutator.js.flow +59 -59
  40. package/HardBreakNodeSpec.js.flow +15 -15
  41. package/HeadingNodeSpec.js +3 -13
  42. package/HeadingNodeSpec.js.flow +42 -52
  43. package/HistoryRedoCommand.js +15 -16
  44. package/HistoryRedoCommand.js.flow +41 -41
  45. package/HistoryUndoCommand.js +15 -16
  46. package/HistoryUndoCommand.js.flow +41 -41
  47. package/HorizontalRuleCommand.js +15 -16
  48. package/HorizontalRuleCommand.js.flow +71 -71
  49. package/HorizontalRuleNodeSpec.js.flow +39 -39
  50. package/ImageUploadPlaceholderPlugin.js +15 -17
  51. package/ImageUploadPlaceholderPlugin.js.flow +190 -192
  52. package/LinkMarkSpec.js +6 -1
  53. package/LinkMarkSpec.js.flow +37 -32
  54. package/LinkSetURLCommand.js +130 -60
  55. package/LinkSetURLCommand.js.flow +141 -117
  56. package/LinkTooltipPlugin.js +122 -34
  57. package/LinkTooltipPlugin.js.flow +261 -190
  58. package/ListItemInsertNewLineCommand.js +16 -18
  59. package/ListItemInsertNewLineCommand.js.flow +76 -77
  60. package/ListItemMergeCommand.js +24 -24
  61. package/ListItemMergeCommand.js.flow +198 -199
  62. package/ListItemNodeSpec.js.flow +52 -52
  63. package/ListSplitCommand.js +15 -16
  64. package/ListSplitCommand.js.flow +54 -54
  65. package/ListToggleCommand.js +19 -20
  66. package/ListToggleCommand.js.flow +99 -99
  67. package/MarkNames.js.flow +18 -18
  68. package/MarksClearCommand.js +17 -18
  69. package/MarksClearCommand.js.flow +65 -65
  70. package/MathEditCommand.js +17 -19
  71. package/MathEditCommand.js.flow +119 -120
  72. package/MathNodeSpec.js.flow +46 -46
  73. package/NodeNames.js.flow +23 -23
  74. package/OrderedListNodeSpec.js +2 -2
  75. package/OrderedListNodeSpec.js.flow +132 -132
  76. package/ParagraphNodeSpec.js +11 -2
  77. package/ParagraphNodeSpec.js.flow +163 -156
  78. package/ParagraphSpacingCommand.js +21 -23
  79. package/ParagraphSpacingCommand.js.flow +139 -144
  80. package/PrintCommand.js +17 -18
  81. package/PrintCommand.js.flow +53 -53
  82. package/SelectionPlaceholderPlugin.js +11 -11
  83. package/SelectionPlaceholderPlugin.js.flow +131 -131
  84. package/SpacerMarkSpec.js +2 -2
  85. package/SpacerMarkSpec.js.flow +47 -47
  86. package/StrikeMarkSpec.js.flow +21 -21
  87. package/StrongMarkSpec.js.flow +25 -25
  88. package/StyleView.js +5 -7
  89. package/StyleView.js.flow +18 -19
  90. package/TableBackgroundColorCommand.js +34 -23
  91. package/TableBackgroundColorCommand.js.flow +80 -75
  92. package/TableBorderColorCommand.js +34 -23
  93. package/TableBorderColorCommand.js.flow +81 -75
  94. package/TableCellColorCommand.js +20 -21
  95. package/TableCellColorCommand.js.flow +74 -75
  96. package/TableCellMenuPlugin.js +19 -19
  97. package/TableCellMenuPlugin.js.flow +130 -132
  98. package/TableInsertCommand.js +19 -22
  99. package/TableInsertCommand.js.flow +118 -120
  100. package/TableMergeCellsCommand.js +19 -19
  101. package/TableMergeCellsCommand.js.flow +113 -112
  102. package/TableNodesSpecs.js +4 -2
  103. package/TableNodesSpecs.js.flow +80 -78
  104. package/TablePlugins.js.flow +14 -14
  105. package/TableResizePlugin.js +20 -20
  106. package/TableResizePlugin.js.flow +631 -631
  107. package/TextColorMarkSpec.js.flow +35 -35
  108. package/TextHighlightMarkSpec.js.flow +38 -38
  109. package/TextInsertTabSpaceCommand.js +15 -16
  110. package/TextInsertTabSpaceCommand.js.flow +106 -106
  111. package/TextNoWrapMarkSpec.js.flow +14 -14
  112. package/TextNodeSpec.js.flow +7 -7
  113. package/TextSelectionMarkSpec.js.flow +24 -24
  114. package/TextSubMarkSpec.js.flow +20 -20
  115. package/TextSuperMarkSpec.js.flow +20 -20
  116. package/TextUnderlineMarkSpec.js.flow +27 -27
  117. package/Types.js +6 -0
  118. package/Types.js.flow +77 -75
  119. package/WebFontLoader.js +6 -7
  120. package/WebFontLoader.js.flow +22 -22
  121. package/blockQuoteInputRule.js.flow +36 -36
  122. package/bom.xml +17223 -25722
  123. package/browser.js.flow +7 -7
  124. package/buildEditorPlugins.js +6 -7
  125. package/buildEditorPlugins.js.flow +49 -49
  126. package/buildInputRules.js +8 -4
  127. package/buildInputRules.js.flow +85 -81
  128. package/client/CollabConnector.js +20 -20
  129. package/client/CollabConnector.js.flow +90 -90
  130. package/client/EditorConnection.js +10 -9
  131. package/client/EditorConnection.js.flow +324 -323
  132. package/client/Licit.js +78 -115
  133. package/client/Licit.js.flow +611 -643
  134. package/client/Licit.test.js +49 -39
  135. package/client/Licit.test.js.flow +104 -98
  136. package/client/Reporter.js +5 -6
  137. package/client/Reporter.js.flow +37 -37
  138. package/client/SimpleConnector.js +5 -5
  139. package/client/SimpleConnector.js.flow +61 -61
  140. package/client/http.js +0 -6
  141. package/client/http.js.flow +62 -70
  142. package/client/licit.css +12 -12
  143. package/client/throttle.js +8 -2
  144. package/client/throttle.js.flow +27 -27
  145. package/convertFromDOMElement.js +2 -4
  146. package/convertFromDOMElement.js.flow +33 -36
  147. package/convertFromHTML.js +2 -3
  148. package/convertFromHTML.js.flow +15 -17
  149. package/convertFromJSON.js +1 -2
  150. package/convertFromJSON.js.flow +55 -56
  151. package/convertToCSSPTValue.js +6 -10
  152. package/convertToCSSPTValue.js.flow +19 -22
  153. package/convertToJSON.js.flow +7 -7
  154. package/createCommand.js +16 -17
  155. package/createCommand.js.flow +62 -62
  156. package/createEditorKeyMap.js +2 -2
  157. package/createEditorKeyMap.js.flow +94 -94
  158. package/createEmptyEditorState.js +2 -3
  159. package/createEmptyEditorState.js.flow +29 -31
  160. package/createTableResizingPlugin.js +6 -6
  161. package/createTableResizingPlugin.js.flow +86 -86
  162. package/findActionableCell.js.flow +74 -74
  163. package/findActiveMark.js +1 -1
  164. package/findActiveMark.js.flow +32 -32
  165. package/hyphenize.js.flow +17 -17
  166. package/index.d.ts +165 -165
  167. package/index.js.flow +10 -10
  168. package/insertTable.js +0 -3
  169. package/insertTable.js.flow +54 -56
  170. package/isEditorStateEmpty.js.flow +32 -32
  171. package/isTableNode.js.flow +15 -15
  172. package/joinDown.js +1 -3
  173. package/joinDown.js.flow +25 -27
  174. package/joinListNode.js.flow +55 -55
  175. package/joinUp.js +1 -3
  176. package/joinUp.js.flow +37 -39
  177. package/keymaps.js.flow +185 -185
  178. package/lookUpElement.js +2 -1
  179. package/lookUpElement.js.flow +14 -14
  180. package/nodeAt.js.flow +12 -12
  181. package/normalizeHTML.js +3 -1
  182. package/normalizeHTML.js.flow +80 -78
  183. package/package.json +162 -156
  184. package/patchAnchorElements.js +1 -1
  185. package/patchAnchorElements.js.flow +38 -38
  186. package/patchBreakElements.js +3 -2
  187. package/patchBreakElements.js.flow +22 -22
  188. package/patchElementInlineStyles.js +1 -1
  189. package/patchElementInlineStyles.js.flow +92 -92
  190. package/patchListElements.js +4 -4
  191. package/patchListElements.js.flow +276 -276
  192. package/patchMathElements.js +5 -7
  193. package/patchMathElements.js.flow +58 -60
  194. package/patchParagraphElements.js.flow +20 -20
  195. package/patchStyleElements.js +1 -1
  196. package/patchStyleElements.js.flow +197 -196
  197. package/patchTableElements.js +2 -3
  198. package/patchTableElements.js.flow +88 -89
  199. package/rebaseDocWithSteps.js.flow +42 -42
  200. package/sanitizeURL.js +1 -1
  201. package/sanitizeURL.js.flow +13 -13
  202. package/splitListItem.js +3 -3
  203. package/splitListItem.js.flow +191 -191
  204. package/styles.css +19 -19
  205. package/styles0.css +29 -29
  206. package/toClosestFontPtSize.js.flow +22 -22
  207. package/toSafeHTMLDocument.js.flow +9 -9
  208. package/toggleBlockquote.js +4 -5
  209. package/toggleBlockquote.js.flow +101 -108
  210. package/toggleCodeBlock.js +6 -6
  211. package/toggleCodeBlock.js.flow +102 -102
  212. package/ui/AlertInfo.js +15 -16
  213. package/ui/AlertInfo.js.flow +64 -64
  214. package/ui/BookmarkNodeView.js +20 -21
  215. package/ui/BookmarkNodeView.js.flow +66 -66
  216. package/ui/CommandButton.js +15 -16
  217. package/ui/CommandButton.js.flow +68 -68
  218. package/ui/CommandMenu.js +19 -20
  219. package/ui/CommandMenu.js.flow +75 -75
  220. package/ui/CommandMenuButton.js +23 -25
  221. package/ui/CommandMenuButton.js.flow +130 -131
  222. package/ui/CustomEditorView.js +20 -20
  223. package/ui/CustomEditorView.js.flow +29 -28
  224. package/ui/CustomMenu.js +11 -12
  225. package/ui/CustomMenu.js.flow +17 -17
  226. package/ui/CustomMenuItem.js +16 -18
  227. package/ui/CustomMenuItem.js.flow +36 -36
  228. package/ui/CustomNodeView.js +29 -19
  229. package/ui/CustomNodeView.js.flow +207 -200
  230. package/ui/CustomRadioButton.js +18 -21
  231. package/ui/CustomRadioButton.js.flow +64 -65
  232. package/ui/DocLayoutEditor.js +18 -20
  233. package/ui/DocLayoutEditor.js.flow +145 -146
  234. package/ui/Editor.js +30 -28
  235. package/ui/Editor.js.flow +287 -288
  236. package/ui/EditorFrameset.js +13 -14
  237. package/ui/EditorFrameset.js.flow +81 -81
  238. package/ui/EditorToolbar.js +36 -42
  239. package/ui/EditorToolbar.js.flow +199 -218
  240. package/ui/EditorToolbarConfig.js +5 -5
  241. package/ui/EditorToolbarConfig.js.flow +164 -164
  242. package/ui/FontSizeCommandMenuButton.js +14 -15
  243. package/ui/FontSizeCommandMenuButton.js.flow +66 -66
  244. package/ui/FontTypeCommandMenuButton.js +15 -17
  245. package/ui/FontTypeCommandMenuButton.js.flow +60 -61
  246. package/ui/Frag.js +11 -12
  247. package/ui/Frag.js.flow +13 -13
  248. package/ui/Icon.js +21 -24
  249. package/ui/Icon.js.flow +89 -89
  250. package/ui/ImageInlineEditor.js +14 -15
  251. package/ui/ImageInlineEditor.js.flow +67 -67
  252. package/ui/KeyCodes.js.flow +12 -12
  253. package/ui/LinkTooltip.js +68 -34
  254. package/ui/LinkTooltip.js.flow +118 -85
  255. package/ui/LinkURLEditor.js +160 -43
  256. package/ui/LinkURLEditor.js.flow +243 -117
  257. package/ui/ListItemNodeView.js +6 -7
  258. package/ui/ListItemNodeView.js.flow +98 -98
  259. package/ui/ListTypeButton.js +23 -27
  260. package/ui/ListTypeButton.js.flow +128 -131
  261. package/ui/ListTypeCommandButton.js +14 -15
  262. package/ui/ListTypeCommandButton.js.flow +85 -85
  263. package/ui/ListTypeMenu.js +21 -22
  264. package/ui/ListTypeMenu.js.flow +70 -70
  265. package/ui/LoadingIndicator.js +11 -12
  266. package/ui/LoadingIndicator.js.flow +20 -20
  267. package/ui/MathEditor.js +17 -22
  268. package/ui/MathEditor.js.flow +72 -78
  269. package/ui/MathInlineEditor.js +20 -21
  270. package/ui/MathInlineEditor.js.flow +101 -102
  271. package/ui/MathNodeView.js +29 -30
  272. package/ui/MathNodeView.js.flow +176 -186
  273. package/ui/PasteMenu.js +19 -23
  274. package/ui/PasteMenu.js.flow +53 -57
  275. package/ui/ResizeObserver.js +1 -1
  276. package/ui/ResizeObserver.js.flow +106 -106
  277. package/ui/RichTextEditor.js +17 -18
  278. package/ui/RichTextEditor.js.flow +133 -133
  279. package/ui/SelectionObserver.js +8 -9
  280. package/ui/SelectionObserver.js.flow +134 -134
  281. package/ui/TableCellMenu.js +14 -15
  282. package/ui/TableCellMenu.js.flow +51 -51
  283. package/ui/TableGridSizeEditor.js +30 -33
  284. package/ui/TableGridSizeEditor.js.flow +187 -184
  285. package/ui/TableNodeView.js +18 -17
  286. package/ui/TableNodeView.js.flow +25 -25
  287. package/ui/bindScrollHandler.js +2 -1
  288. package/ui/bindScrollHandler.js.flow +46 -46
  289. package/ui/canUseCSSFont.js +5 -4
  290. package/ui/canUseCSSFont.js.flow +42 -43
  291. package/ui/czi-body-layout-editor.css +16 -16
  292. package/ui/czi-bookmark-view.css +10 -10
  293. package/ui/czi-cursor-placeholder.css +36 -36
  294. package/ui/czi-custom-menu-button.css +18 -18
  295. package/ui/czi-custom-menu-item.css +30 -30
  296. package/ui/czi-custom-menu.css +8 -8
  297. package/ui/czi-custom-radio-button.css +80 -80
  298. package/ui/czi-custom-scrollbar.css +21 -21
  299. package/ui/czi-editor-frameset.css +81 -81
  300. package/ui/czi-editor-toolbar.css +122 -122
  301. package/ui/czi-editor.css +217 -220
  302. package/ui/czi-form.css +201 -107
  303. package/ui/czi-frag.css +3 -3
  304. package/ui/czi-heading.css +40 -40
  305. package/ui/czi-icon.css +72 -72
  306. package/ui/czi-image-resize-box.css +165 -165
  307. package/ui/czi-image-upload-editor.css +57 -57
  308. package/ui/czi-image-upload-placeholder.css +50 -50
  309. package/ui/czi-image-url-editor.css +38 -38
  310. package/ui/czi-image-view.css +121 -125
  311. package/ui/czi-indent.css +137 -137
  312. package/ui/czi-inline-editor.css +20 -20
  313. package/ui/czi-link-tooltip.css +112 -71
  314. package/ui/czi-list.css +406 -410
  315. package/ui/czi-loading-indicator.css +66 -111
  316. package/ui/czi-math-view.css +62 -62
  317. package/ui/czi-selection-placeholder.css +24 -24
  318. package/ui/czi-table-cell-menu.css +16 -14
  319. package/ui/czi-table-grid-size-editor.css +37 -37
  320. package/ui/czi-table.css +87 -87
  321. package/ui/czi-vars.css +2 -2
  322. package/ui/findActiveFontSize.js +2 -1
  323. package/ui/findActiveFontSize.js.flow +55 -58
  324. package/ui/findActiveFontType.js +4 -3
  325. package/ui/findActiveFontType.js.flow +35 -38
  326. package/ui/fonts.css +460 -460
  327. package/ui/handleEditorDrop.js +1 -1
  328. package/ui/handleEditorDrop.js.flow +28 -28
  329. package/ui/handleEditorKeyDown.js +1 -1
  330. package/ui/handleEditorKeyDown.js.flow +39 -39
  331. package/ui/handleEditorPaste.js +1 -1
  332. package/ui/handleEditorPaste.js.flow +33 -33
  333. package/ui/htmlElementToRect.js.flow +18 -18
  334. package/ui/icon-font.css +9 -9
  335. package/ui/injectStyleSheet.js +2 -2
  336. package/ui/injectStyleSheet.js.flow +40 -42
  337. package/ui/isElementFullyVisible.js +1 -10
  338. package/ui/isElementFullyVisible.js.flow +14 -26
  339. package/ui/isOffline.js.flow +8 -8
  340. package/ui/isReactClass.js.flow +12 -12
  341. package/ui/listType.css +21 -21
  342. package/ui/mathquill-editor/MathQuillEditor.js +27 -30
  343. package/ui/mathquill-editor/MathQuillEditor.js.flow +158 -159
  344. package/ui/mathquill-editor/MathQuillEditorSymbols.js.flow +483 -483
  345. package/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js +14 -15
  346. package/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js.flow +50 -50
  347. package/ui/mathquill-editor/czi-mathquill-editor-symbols-panel.css +39 -39
  348. package/ui/mathquill-editor/czi-mathquill-editor.css +50 -50
  349. package/ui/mathquill-editor/mathquill-import-kludge.js +1 -8
  350. package/ui/mathquill-editor/mathquill-import-kludge.js.flow +17 -24
  351. package/ui/renderLaTeXAsHTML.js +4 -4
  352. package/ui/renderLaTeXAsHTML.js.flow +46 -46
  353. package/ui/resolveImage.js +5 -6
  354. package/ui/resolveImage.js.flow +121 -123
  355. package/ui/toCSSColor.js.flow +51 -51
  356. package/ui/toCSSLineSpacing.js +2 -3
  357. package/ui/toCSSLineSpacing.js.flow +53 -55
  358. package/ui/toHexColor.js.flow +26 -26
  359. package/ui/uuid.js.flow +9 -9
  360. package/uuid.js.flow +9 -9
@@ -1,60 +1,58 @@
1
- // @flow
2
-
3
- import queryString from 'query-string';
4
- import url from 'url';
5
- export default function patchMathElements(doc: Document): void {
6
- Array.from(doc.querySelectorAll('img')).forEach(patchGoogleEquationElement);
7
- }
8
-
9
- // See https://developers.google.com/chart/image/docs/chart_params#gcharts_cht
10
- const PARAM_CHART_CHART_TYPE = 'cht';
11
- const PARAM_CHART_LABEL = 'chl';
12
-
13
- // Google Doc exports math equation content as single image element that loads
14
- // its content from google. For example:
15
- // <img src="https://www.google.com/chart?cht=tx&amp;c...p;chl=m%E2%88%A0C" />
16
- // Unfortunately, such image often fails to load because its url contains the
17
- // value that the Google Chart API does not support.
18
- // The workaround is to use KaTex (https://katex.org/) whoch supports a broader
19
- // set of characters that can be safely converted into math quations.
20
-
21
- function patchGoogleEquationElement(el: HTMLElement): void {
22
- const { ownerDocument, parentElement } = el;
23
- if (!ownerDocument || !parentElement) {
24
- return;
25
- }
26
- const src = el.getAttribute('src');
27
- const content = getGoogleEquationContent(src);
28
- if (!content) {
29
- return;
30
- }
31
-
32
- // Replace `<img src="..." />` with `<math data-latex="..." />`.
33
- // Note that this requires the schema to support `MathNodeSpec`.
34
- const math = ownerDocument.createElement('math');
35
- math.setAttribute('data-latex', content);
36
- parentElement.insertBefore(math, el);
37
- parentElement.removeChild(el);
38
- }
39
-
40
- function getGoogleEquationContent(src: ?string): ?string {
41
- if (!src) {
42
- return null;
43
- }
44
- const { host, pathname, query } = url.parse(src);
45
- if (host !== 'www.google.com' || pathname !== '/chart') {
46
- return null;
47
- }
48
-
49
- const params = queryString.parse(query);
50
- const chartType = params[PARAM_CHART_CHART_TYPE];
51
- const label = params[PARAM_CHART_LABEL];
52
-
53
- // Google exports math equation as a special chart with plan text only
54
- // contents.
55
- if (chartType !== 'tx' || !label) {
56
- return null;
57
- }
58
-
59
- return label;
60
- }
1
+ // @flow
2
+
3
+ export default function patchMathElements(doc: Document): void {
4
+ Array.from(doc.querySelectorAll('img')).forEach(patchGoogleEquationElement);
5
+ }
6
+
7
+ // See https://developers.google.com/chart/image/docs/chart_params#gcharts_cht
8
+ const PARAM_CHART_CHART_TYPE = 'cht';
9
+ const PARAM_CHART_LABEL = 'chl';
10
+
11
+ // Google Doc exports math equation content as single image element that loads
12
+ // its content from google. For example:
13
+ // <img src="https://www.google.com/chart?cht=tx&amp;c...p;chl=m%E2%88%A0C" />
14
+ // Unfortunately, such image often fails to load because its url contains the
15
+ // value that the Google Chart API does not support.
16
+ // The workaround is to use KaTex (https://katex.org/) whoch supports a broader
17
+ // set of characters that can be safely converted into math quations.
18
+
19
+ function patchGoogleEquationElement(el: HTMLElement): void {
20
+ const { ownerDocument, parentElement } = el;
21
+ if (!ownerDocument || !parentElement) {
22
+ return;
23
+ }
24
+ const src = el.getAttribute('src');
25
+ const content = getGoogleEquationContent(src);
26
+ if (!content) {
27
+ return;
28
+ }
29
+
30
+ // Replace `<img src="..." />` with `<math data-latex="..." />`.
31
+ // Note that this requires the schema to support `MathNodeSpec`.
32
+ const math = ownerDocument.createElement('math');
33
+ math.setAttribute('data-latex', content);
34
+ parentElement.insertBefore(math, el);
35
+ parentElement.removeChild(el);
36
+ }
37
+
38
+ function getGoogleEquationContent(src: ?string): ?string {
39
+ if (!src) {
40
+ return null;
41
+ }
42
+ const { host, pathname, query } = new URL(src);
43
+ if (host !== 'www.google.com' || pathname !== '/chart') {
44
+ return null;
45
+ }
46
+
47
+ const params = new URL(query);
48
+ const chartType = params[PARAM_CHART_CHART_TYPE];
49
+ const label = params[PARAM_CHART_LABEL];
50
+
51
+ // Google exports math equation as a special chart with plan text only
52
+ // contents.
53
+ if (chartType !== 'tx' || !label) {
54
+ return null;
55
+ }
56
+
57
+ return label;
58
+ }
@@ -1,20 +1,20 @@
1
- // @flow
2
-
3
- import {
4
- ATTRIBUTE_INDENT,
5
- convertMarginLeftToIndentValue,
6
- } from './ParagraphNodeSpec.js';
7
-
8
- export default function patchParagraphElements(doc: Document): void {
9
- Array.from(doc.querySelectorAll('p')).forEach(patchParagraphElement);
10
- }
11
-
12
- function patchParagraphElement(pElement: HTMLElement): void {
13
- const { marginLeft } = pElement.style;
14
- if (marginLeft) {
15
- const indent = convertMarginLeftToIndentValue(marginLeft);
16
- if (indent) {
17
- pElement.setAttribute(ATTRIBUTE_INDENT, String(indent));
18
- }
19
- }
20
- }
1
+ // @flow
2
+
3
+ import {
4
+ ATTRIBUTE_INDENT,
5
+ convertMarginLeftToIndentValue,
6
+ } from './ParagraphNodeSpec.js';
7
+
8
+ export default function patchParagraphElements(doc: Document): void {
9
+ Array.from(doc.querySelectorAll('p')).forEach(patchParagraphElement);
10
+ }
11
+
12
+ function patchParagraphElement(pElement: HTMLElement): void {
13
+ const { marginLeft } = pElement.style;
14
+ if (marginLeft) {
15
+ const indent = convertMarginLeftToIndentValue(marginLeft);
16
+ if (indent) {
17
+ pElement.setAttribute(ATTRIBUTE_INDENT, String(indent));
18
+ }
19
+ }
20
+ }
@@ -64,7 +64,7 @@ export default function patchStyleElements(doc) {
64
64
  }
65
65
  });
66
66
  if (selectorText.indexOf(',') > -1) {
67
- selectorText.split(/\s*,\s*/).forEach(function (st) {
67
+ selectorText.split('.').trim().forEach(function (st) {
68
68
  buildSelectorTextToCSSText(selectorTextToCSSTexts, st, cssText);
69
69
  });
70
70
  } else {
@@ -1,196 +1,197 @@
1
- // @flow
2
-
3
- import toCSSColor from './ui/toCSSColor.js';
4
- import {
5
- toCSSLineSpacing
6
- } from '@modusoperandi/licit-ui-commands';
7
-
8
- const LIST_ITEM_PSEUDO_ELEMENT_BEFORE = /li:+before/;
9
- const NODE_NAME_SELECTOR = /^[a-zA-Z]+\d*$/;
10
- const PSEUDO_ELEMENT_ANY = /:+[a-z]+/;
11
-
12
- // Assume these className from Google doc has less specificity.
13
- const WEAK_CLASS_SELECTOR = /\.title/;
14
-
15
- type SelectorTextToCSSText = {
16
- afterContent: ?string,
17
- beforeContent: ?string,
18
- cssText: string,
19
- selectorText: string,
20
- };
21
-
22
- export const ATTRIBUTE_CSS_BEFORE_CONTENT = 'data-attribute-css-before-content';
23
-
24
- // Node name only selector has less priority, we'll handle it
25
- // separately
26
-
27
- export default function patchStyleElements(doc: Document): void {
28
- const els = Array.from(doc.querySelectorAll('style'));
29
- if (!els.length) {
30
- return;
31
- }
32
-
33
- const selectorTextToCSSTexts = [];
34
-
35
- els.forEach((styleEl: any) => {
36
- const sheet = styleEl.sheet;
37
- if (!sheet) {
38
- // TODO: Find out why the browser does not support this.
39
- console.error('styleEl.sheet undefined', styleEl);
40
- return;
41
- }
42
- const cssRules = sheet.cssRules;
43
- if (!cssRules) {
44
- // TODO: Find out why the browser does not support this.
45
- console.error('sheet.cssRules undefined', sheet);
46
- return;
47
- }
48
-
49
- Array.from(cssRules).forEach((rule, cssRuleIndex) => {
50
- const selectorText = String(rule.selectorText || '');
51
- if (!selectorText) {
52
- // This could be `CSSImportRule.` created by @import().
53
- // ignore it.
54
- return;
55
- }
56
-
57
- if (!rule.styleMap) {
58
- // TODO: Find out why the browser does not support this.
59
- console.error('rule.styleMap undefined', rule);
60
- return;
61
- }
62
- let cssText = '';
63
- rule.styleMap.forEach((cssStyleValue, key) => {
64
- let cssStyleValueStr = String(cssStyleValue);
65
- // e.g. rules['color'] = 'red'.
66
- if (key === 'color') {
67
- const color = toCSSColor(cssStyleValueStr);
68
- if (!color) {
69
- return;
70
- }
71
- } else if (key === 'background-color') {
72
- const color = toCSSColor(cssStyleValueStr);
73
- if (!color) {
74
- return;
75
- }
76
- } else if (key === 'line-height') {
77
- cssStyleValueStr = toCSSLineSpacing(cssStyleValueStr);
78
- }
79
- if (cssStyleValueStr) {
80
- cssText += `${key}: ${cssStyleValueStr};`;
81
- }
82
- });
83
- if (selectorText.indexOf(',') > -1) {
84
- selectorText.split(/\s*,\s*/).forEach((st) => {
85
- buildSelectorTextToCSSText(selectorTextToCSSTexts, st, cssText);
86
- });
87
- } else {
88
- buildSelectorTextToCSSText(
89
- selectorTextToCSSTexts,
90
- selectorText,
91
- cssText
92
- );
93
- }
94
- });
95
- });
96
-
97
- // Sort selector by
98
- selectorTextToCSSTexts
99
- .sort(sortBySpecificity)
100
- .reduce(buildElementToCSSTexts.bind(null, doc), new Map())
101
- .forEach(applyInlineStyleSheetCSSTexts);
102
- }
103
-
104
- function buildElementToCSSTexts(
105
- doc: Document,
106
- elementToCSSTexts: Map<HTMLElement, Array<string>>,
107
- bag: SelectorTextToCSSText
108
- ): Map<HTMLElement, Array<string>> {
109
- const { selectorText, cssText, beforeContent } = bag;
110
- const els = Array.from(doc.querySelectorAll(selectorText));
111
-
112
- els.forEach((el) => {
113
- const style = el.style;
114
- if (!style || !(el instanceof HTMLElement)) {
115
- return;
116
- }
117
- if (cssText) {
118
- const cssTexts = elementToCSSTexts.get(el) || [];
119
- cssTexts.push(cssText);
120
- elementToCSSTexts.set(el, cssTexts);
121
- }
122
- if (beforeContent) {
123
- // This simply adds the custom attribute 'data-before-content' to element,
124
- // developer must handle his attribute via NodeSpec separately if needed.
125
- el.setAttribute(ATTRIBUTE_CSS_BEFORE_CONTENT, beforeContent);
126
- }
127
- });
128
- return elementToCSSTexts;
129
- }
130
-
131
- function sortBySpecificity(
132
- one: SelectorTextToCSSText,
133
- two: SelectorTextToCSSText
134
- ): number {
135
- // This is just the naive implementation of sorting selectors by css
136
- // specificity.
137
- // 1. NodeName selectors has less priority.
138
- let aa = NODE_NAME_SELECTOR.test(one.selectorText);
139
- let bb = NODE_NAME_SELECTOR.test(two.selectorText);
140
- if (aa && !bb) {
141
- return -1;
142
- }
143
-
144
- if (!aa && bb) {
145
- return 1;
146
- }
147
-
148
- // Assume both are className selector.
149
- // Assume these className from Google doc has less specificity.
150
- aa = WEAK_CLASS_SELECTOR.test(one.selectorText);
151
- bb = WEAK_CLASS_SELECTOR.test(two.selectorText);
152
- if (aa && !bb) {
153
- return -1;
154
- }
155
- if (!aa && bb) {
156
- return 1;
157
- }
158
- return 0;
159
- }
160
-
161
- function buildSelectorTextToCSSText(
162
- result: Array<SelectorTextToCSSText>,
163
- selectorText: string,
164
- cssText: string
165
- ): void {
166
- let afterContent;
167
- let beforeContent;
168
-
169
- if (LIST_ITEM_PSEUDO_ELEMENT_BEFORE.test(selectorText)) {
170
- // Workaround to extract the list style content from HTML generated by
171
- // Google.
172
- // This converts `content:"\0025a0 "` to `\0025a0`
173
- beforeContent = cssText.replace(/^content:\s*"\s*/, '').replace(/";*$/, '');
174
- selectorText = selectorText.replace(/:+before/, '');
175
- cssText = '';
176
- } else if (PSEUDO_ELEMENT_ANY.test(selectorText)) {
177
- // TODO: Handle this later.
178
- return;
179
- }
180
-
181
- result.push({
182
- selectorText,
183
- cssText,
184
- afterContent,
185
- beforeContent,
186
- });
187
- }
188
-
189
- function applyInlineStyleSheetCSSTexts(
190
- cssTexts: Array<string>,
191
- el: HTMLElement
192
- ): void {
193
- if (cssTexts.length) {
194
- el.style.cssText = cssTexts.join(';') + ';' + el.style.cssText;
195
- }
196
- }
1
+ // @flow
2
+
3
+ import toCSSColor from './ui/toCSSColor.js';
4
+ import { toCSSLineSpacing } from '@modusoperandi/licit-ui-commands';
5
+
6
+ const LIST_ITEM_PSEUDO_ELEMENT_BEFORE = /li:+before/;
7
+ const NODE_NAME_SELECTOR = /^[a-zA-Z]+\d*$/;
8
+ const PSEUDO_ELEMENT_ANY = /:+[a-z]+/;
9
+
10
+ // Assume these className from Google doc has less specificity.
11
+ const WEAK_CLASS_SELECTOR = /\.title/;
12
+
13
+ type SelectorTextToCSSText = {
14
+ afterContent: ?string,
15
+ beforeContent: ?string,
16
+ cssText: string,
17
+ selectorText: string,
18
+ };
19
+
20
+ export const ATTRIBUTE_CSS_BEFORE_CONTENT = 'data-attribute-css-before-content';
21
+
22
+ // Node name only selector has less priority, we'll handle it
23
+ // separately
24
+
25
+ export default function patchStyleElements(doc: Document): void {
26
+ const els = Array.from(doc.querySelectorAll('style'));
27
+ if (!els.length) {
28
+ return;
29
+ }
30
+
31
+ const selectorTextToCSSTexts = [];
32
+
33
+ els.forEach((styleEl: any) => {
34
+ const sheet = styleEl.sheet;
35
+ if (!sheet) {
36
+ // TODO: Find out why the browser does not support this.
37
+ console.error('styleEl.sheet undefined', styleEl);
38
+ return;
39
+ }
40
+ const cssRules = sheet.cssRules;
41
+ if (!cssRules) {
42
+ // TODO: Find out why the browser does not support this.
43
+ console.error('sheet.cssRules undefined', sheet);
44
+ return;
45
+ }
46
+
47
+ Array.from(cssRules).forEach((rule, cssRuleIndex) => {
48
+ const selectorText = String(rule.selectorText || '');
49
+ if (!selectorText) {
50
+ // This could be `CSSImportRule.` created by @import().
51
+ // ignore it.
52
+ return;
53
+ }
54
+
55
+ if (!rule.styleMap) {
56
+ // TODO: Find out why the browser does not support this.
57
+ console.error('rule.styleMap undefined', rule);
58
+ return;
59
+ }
60
+ let cssText = '';
61
+ rule.styleMap.forEach((cssStyleValue, key) => {
62
+ let cssStyleValueStr = String(cssStyleValue);
63
+ // e.g. rules['color'] = 'red'.
64
+ if (key === 'color') {
65
+ const color = toCSSColor(cssStyleValueStr);
66
+ if (!color) {
67
+ return;
68
+ }
69
+ } else if (key === 'background-color') {
70
+ const color = toCSSColor(cssStyleValueStr);
71
+ if (!color) {
72
+ return;
73
+ }
74
+ } else if (key === 'line-height') {
75
+ cssStyleValueStr = toCSSLineSpacing(cssStyleValueStr);
76
+ }
77
+ if (cssStyleValueStr) {
78
+ cssText += `${key}: ${cssStyleValueStr};`;
79
+ }
80
+ });
81
+ if (selectorText.indexOf(',') > -1) {
82
+ selectorText
83
+ .split('.')
84
+ .trim()
85
+ .forEach((st) => {
86
+ buildSelectorTextToCSSText(selectorTextToCSSTexts, st, cssText);
87
+ });
88
+ } else {
89
+ buildSelectorTextToCSSText(
90
+ selectorTextToCSSTexts,
91
+ selectorText,
92
+ cssText
93
+ );
94
+ }
95
+ });
96
+ });
97
+
98
+ // Sort selector by
99
+ selectorTextToCSSTexts
100
+ .sort(sortBySpecificity)
101
+ .reduce(buildElementToCSSTexts.bind(null, doc), new Map())
102
+ .forEach(applyInlineStyleSheetCSSTexts);
103
+ }
104
+
105
+ function buildElementToCSSTexts(
106
+ doc: Document,
107
+ elementToCSSTexts: Map<HTMLElement, Array<string>>,
108
+ bag: SelectorTextToCSSText
109
+ ): Map<HTMLElement, Array<string>> {
110
+ const { selectorText, cssText, beforeContent } = bag;
111
+ const els = Array.from(doc.querySelectorAll(selectorText));
112
+
113
+ els.forEach((el) => {
114
+ const style = el.style;
115
+ if (!style || !(el instanceof HTMLElement)) {
116
+ return;
117
+ }
118
+ if (cssText) {
119
+ const cssTexts = elementToCSSTexts.get(el) || [];
120
+ cssTexts.push(cssText);
121
+ elementToCSSTexts.set(el, cssTexts);
122
+ }
123
+ if (beforeContent) {
124
+ // This simply adds the custom attribute 'data-before-content' to element,
125
+ // developer must handle his attribute via NodeSpec separately if needed.
126
+ el.setAttribute(ATTRIBUTE_CSS_BEFORE_CONTENT, beforeContent);
127
+ }
128
+ });
129
+ return elementToCSSTexts;
130
+ }
131
+
132
+ function sortBySpecificity(
133
+ one: SelectorTextToCSSText,
134
+ two: SelectorTextToCSSText
135
+ ): number {
136
+ // This is just the naive implementation of sorting selectors by css
137
+ // specificity.
138
+ // 1. NodeName selectors has less priority.
139
+ let aa = NODE_NAME_SELECTOR.test(one.selectorText);
140
+ let bb = NODE_NAME_SELECTOR.test(two.selectorText);
141
+ if (aa && !bb) {
142
+ return -1;
143
+ }
144
+
145
+ if (!aa && bb) {
146
+ return 1;
147
+ }
148
+
149
+ // Assume both are className selector.
150
+ // Assume these className from Google doc has less specificity.
151
+ aa = WEAK_CLASS_SELECTOR.test(one.selectorText);
152
+ bb = WEAK_CLASS_SELECTOR.test(two.selectorText);
153
+ if (aa && !bb) {
154
+ return -1;
155
+ }
156
+ if (!aa && bb) {
157
+ return 1;
158
+ }
159
+ return 0;
160
+ }
161
+
162
+ function buildSelectorTextToCSSText(
163
+ result: Array<SelectorTextToCSSText>,
164
+ selectorText: string,
165
+ cssText: string
166
+ ): void {
167
+ let afterContent;
168
+ let beforeContent;
169
+
170
+ if (LIST_ITEM_PSEUDO_ELEMENT_BEFORE.test(selectorText)) {
171
+ // Workaround to extract the list style content from HTML generated by
172
+ // Google.
173
+ // This converts `content:"\0025a0 "` to `\0025a0`
174
+ beforeContent = cssText.replace(/^content:\s*"\s*/, '').replace(/";*$/, '');
175
+ selectorText = selectorText.replace(/:+before/, '');
176
+ cssText = '';
177
+ } else if (PSEUDO_ELEMENT_ANY.test(selectorText)) {
178
+ // TODO: Handle this later.
179
+ return;
180
+ }
181
+
182
+ result.push({
183
+ selectorText,
184
+ cssText,
185
+ afterContent,
186
+ beforeContent,
187
+ });
188
+ }
189
+
190
+ function applyInlineStyleSheetCSSTexts(
191
+ cssTexts: Array<string>,
192
+ el: HTMLElement
193
+ ): void {
194
+ if (cssTexts.length) {
195
+ el.style.cssText = cssTexts.join(';') + ';' + el.style.cssText;
196
+ }
197
+ }
@@ -1,5 +1,4 @@
1
- import { PT_TO_PX_RATIO } from './convertToCSSPTValue.js';
2
- import convertToCSSPTValue from './convertToCSSPTValue.js';
1
+ import convertToCSSPTValue, { PT_TO_PX_RATIO } from './convertToCSSPTValue.js';
3
2
  import toHexColor from './ui/toHexColor.js';
4
3
  export default function patchTableElements(doc) {
5
4
  Array.from(doc.querySelectorAll('td')).forEach(patchTableCell);
@@ -25,7 +24,7 @@ function patchTableCell(tdElement) {
25
24
  spans.some(function (spanElement) {
26
25
  var retVal = true;
27
26
  var spanStyle = spanElement.style;
28
- if (!spanStyle || !spanStyle.backgroundColor) {
27
+ if (!(spanStyle !== null && spanStyle !== void 0 && spanStyle.backgroundColor)) {
29
28
  retVal = false;
30
29
  } else {
31
30
  var spanBgColor = toHexColor(spanStyle.backgroundColor);