@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.
- package/BlockquoteInsertNewLineCommand.js +16 -18
- package/BlockquoteInsertNewLineCommand.js.flow +76 -77
- package/BlockquoteNodeSpec.js +3 -4
- package/BlockquoteNodeSpec.js.flow +29 -30
- package/BlockquoteToggleCommand.js +16 -17
- package/BlockquoteToggleCommand.js.flow +56 -56
- package/BookmarkNodeSpec.js +2 -2
- package/BookmarkNodeSpec.js.flow +39 -39
- package/BulletListNodeSpec.js.flow +61 -61
- package/CZIProseMirror.js.flow +90 -90
- package/CodeBlockCommand.js +17 -18
- package/CodeBlockCommand.js.flow +65 -65
- package/CodeBlockNodeSpec.js.flow +24 -24
- package/CodeMarkSpec.js.flow +14 -14
- package/ContentPlaceholderPlugin.js +20 -21
- package/ContentPlaceholderPlugin.js.flow +185 -187
- package/CursorPlaceholderPlugin.js +11 -11
- package/CursorPlaceholderPlugin.js.flow +115 -115
- package/DocLayoutCommand.js +18 -21
- package/DocLayoutCommand.js.flow +97 -99
- package/DocNodeSpec.js.flow +64 -64
- package/EMMarkSpec.js.flow +14 -14
- package/EditorCommands.js.flow +126 -126
- package/EditorKeyMap.js +0 -1
- package/EditorKeyMap.js.flow +185 -187
- package/EditorMarks.js +2 -2
- package/EditorMarks.js.flow +71 -71
- package/EditorNodes.js +2 -3
- package/EditorNodes.js.flow +58 -59
- package/EditorPageLayoutPlugin.js +10 -10
- package/EditorPageLayoutPlugin.js.flow +67 -67
- package/EditorPlugins.js.flow +8 -8
- package/EditorSchema.js.flow +12 -12
- package/EditorState.js.flow +7 -7
- package/FontSizeMarkSpec.js.flow +49 -49
- package/FontTypeMarkSpec.js +1 -1
- package/FontTypeMarkSpec.js.flow +80 -80
- package/HTMLMutator.js +6 -7
- package/HTMLMutator.js.flow +59 -59
- package/HardBreakNodeSpec.js.flow +15 -15
- package/HeadingNodeSpec.js +3 -13
- package/HeadingNodeSpec.js.flow +42 -52
- package/HistoryRedoCommand.js +15 -16
- package/HistoryRedoCommand.js.flow +41 -41
- package/HistoryUndoCommand.js +15 -16
- package/HistoryUndoCommand.js.flow +41 -41
- package/HorizontalRuleCommand.js +15 -16
- package/HorizontalRuleCommand.js.flow +71 -71
- package/HorizontalRuleNodeSpec.js.flow +39 -39
- package/ImageUploadPlaceholderPlugin.js +15 -17
- package/ImageUploadPlaceholderPlugin.js.flow +190 -192
- package/LinkMarkSpec.js +6 -1
- package/LinkMarkSpec.js.flow +37 -32
- package/LinkSetURLCommand.js +130 -60
- package/LinkSetURLCommand.js.flow +141 -117
- package/LinkTooltipPlugin.js +122 -34
- package/LinkTooltipPlugin.js.flow +261 -190
- package/ListItemInsertNewLineCommand.js +16 -18
- package/ListItemInsertNewLineCommand.js.flow +76 -77
- package/ListItemMergeCommand.js +24 -24
- package/ListItemMergeCommand.js.flow +198 -199
- package/ListItemNodeSpec.js.flow +52 -52
- package/ListSplitCommand.js +15 -16
- package/ListSplitCommand.js.flow +54 -54
- package/ListToggleCommand.js +19 -20
- package/ListToggleCommand.js.flow +99 -99
- package/MarkNames.js.flow +18 -18
- package/MarksClearCommand.js +17 -18
- package/MarksClearCommand.js.flow +65 -65
- package/MathEditCommand.js +17 -19
- package/MathEditCommand.js.flow +119 -120
- package/MathNodeSpec.js.flow +46 -46
- package/NodeNames.js.flow +23 -23
- package/OrderedListNodeSpec.js +2 -2
- package/OrderedListNodeSpec.js.flow +132 -132
- package/ParagraphNodeSpec.js +11 -2
- package/ParagraphNodeSpec.js.flow +163 -156
- package/ParagraphSpacingCommand.js +21 -23
- package/ParagraphSpacingCommand.js.flow +139 -144
- package/PrintCommand.js +17 -18
- package/PrintCommand.js.flow +53 -53
- package/SelectionPlaceholderPlugin.js +11 -11
- package/SelectionPlaceholderPlugin.js.flow +131 -131
- package/SpacerMarkSpec.js +2 -2
- package/SpacerMarkSpec.js.flow +47 -47
- package/StrikeMarkSpec.js.flow +21 -21
- package/StrongMarkSpec.js.flow +25 -25
- package/StyleView.js +5 -7
- package/StyleView.js.flow +18 -19
- package/TableBackgroundColorCommand.js +34 -23
- package/TableBackgroundColorCommand.js.flow +80 -75
- package/TableBorderColorCommand.js +34 -23
- package/TableBorderColorCommand.js.flow +81 -75
- package/TableCellColorCommand.js +20 -21
- package/TableCellColorCommand.js.flow +74 -75
- package/TableCellMenuPlugin.js +19 -19
- package/TableCellMenuPlugin.js.flow +130 -132
- package/TableInsertCommand.js +19 -22
- package/TableInsertCommand.js.flow +118 -120
- package/TableMergeCellsCommand.js +19 -19
- package/TableMergeCellsCommand.js.flow +113 -112
- package/TableNodesSpecs.js +4 -2
- package/TableNodesSpecs.js.flow +80 -78
- package/TablePlugins.js.flow +14 -14
- package/TableResizePlugin.js +20 -20
- package/TableResizePlugin.js.flow +631 -631
- package/TextColorMarkSpec.js.flow +35 -35
- package/TextHighlightMarkSpec.js.flow +38 -38
- package/TextInsertTabSpaceCommand.js +15 -16
- package/TextInsertTabSpaceCommand.js.flow +106 -106
- package/TextNoWrapMarkSpec.js.flow +14 -14
- package/TextNodeSpec.js.flow +7 -7
- package/TextSelectionMarkSpec.js.flow +24 -24
- package/TextSubMarkSpec.js.flow +20 -20
- package/TextSuperMarkSpec.js.flow +20 -20
- package/TextUnderlineMarkSpec.js.flow +27 -27
- package/Types.js +6 -0
- package/Types.js.flow +77 -75
- package/WebFontLoader.js +6 -7
- package/WebFontLoader.js.flow +22 -22
- package/blockQuoteInputRule.js.flow +36 -36
- package/bom.xml +17223 -25722
- package/browser.js.flow +7 -7
- package/buildEditorPlugins.js +6 -7
- package/buildEditorPlugins.js.flow +49 -49
- package/buildInputRules.js +8 -4
- package/buildInputRules.js.flow +85 -81
- package/client/CollabConnector.js +20 -20
- package/client/CollabConnector.js.flow +90 -90
- package/client/EditorConnection.js +10 -9
- package/client/EditorConnection.js.flow +324 -323
- package/client/Licit.js +78 -115
- package/client/Licit.js.flow +611 -643
- package/client/Licit.test.js +49 -39
- package/client/Licit.test.js.flow +104 -98
- package/client/Reporter.js +5 -6
- package/client/Reporter.js.flow +37 -37
- package/client/SimpleConnector.js +5 -5
- package/client/SimpleConnector.js.flow +61 -61
- package/client/http.js +0 -6
- package/client/http.js.flow +62 -70
- package/client/licit.css +12 -12
- package/client/throttle.js +8 -2
- package/client/throttle.js.flow +27 -27
- package/convertFromDOMElement.js +2 -4
- package/convertFromDOMElement.js.flow +33 -36
- package/convertFromHTML.js +2 -3
- package/convertFromHTML.js.flow +15 -17
- package/convertFromJSON.js +1 -2
- package/convertFromJSON.js.flow +55 -56
- package/convertToCSSPTValue.js +6 -10
- package/convertToCSSPTValue.js.flow +19 -22
- package/convertToJSON.js.flow +7 -7
- package/createCommand.js +16 -17
- package/createCommand.js.flow +62 -62
- package/createEditorKeyMap.js +2 -2
- package/createEditorKeyMap.js.flow +94 -94
- package/createEmptyEditorState.js +2 -3
- package/createEmptyEditorState.js.flow +29 -31
- package/createTableResizingPlugin.js +6 -6
- package/createTableResizingPlugin.js.flow +86 -86
- package/findActionableCell.js.flow +74 -74
- package/findActiveMark.js +1 -1
- package/findActiveMark.js.flow +32 -32
- package/hyphenize.js.flow +17 -17
- package/index.d.ts +165 -165
- package/index.js.flow +10 -10
- package/insertTable.js +0 -3
- package/insertTable.js.flow +54 -56
- package/isEditorStateEmpty.js.flow +32 -32
- package/isTableNode.js.flow +15 -15
- package/joinDown.js +1 -3
- package/joinDown.js.flow +25 -27
- package/joinListNode.js.flow +55 -55
- package/joinUp.js +1 -3
- package/joinUp.js.flow +37 -39
- package/keymaps.js.flow +185 -185
- package/lookUpElement.js +2 -1
- package/lookUpElement.js.flow +14 -14
- package/nodeAt.js.flow +12 -12
- package/normalizeHTML.js +3 -1
- package/normalizeHTML.js.flow +80 -78
- package/package.json +162 -156
- package/patchAnchorElements.js +1 -1
- package/patchAnchorElements.js.flow +38 -38
- package/patchBreakElements.js +3 -2
- package/patchBreakElements.js.flow +22 -22
- package/patchElementInlineStyles.js +1 -1
- package/patchElementInlineStyles.js.flow +92 -92
- package/patchListElements.js +4 -4
- package/patchListElements.js.flow +276 -276
- package/patchMathElements.js +5 -7
- package/patchMathElements.js.flow +58 -60
- package/patchParagraphElements.js.flow +20 -20
- package/patchStyleElements.js +1 -1
- package/patchStyleElements.js.flow +197 -196
- package/patchTableElements.js +2 -3
- package/patchTableElements.js.flow +88 -89
- package/rebaseDocWithSteps.js.flow +42 -42
- package/sanitizeURL.js +1 -1
- package/sanitizeURL.js.flow +13 -13
- package/splitListItem.js +3 -3
- package/splitListItem.js.flow +191 -191
- package/styles.css +19 -19
- package/styles0.css +29 -29
- package/toClosestFontPtSize.js.flow +22 -22
- package/toSafeHTMLDocument.js.flow +9 -9
- package/toggleBlockquote.js +4 -5
- package/toggleBlockquote.js.flow +101 -108
- package/toggleCodeBlock.js +6 -6
- package/toggleCodeBlock.js.flow +102 -102
- package/ui/AlertInfo.js +15 -16
- package/ui/AlertInfo.js.flow +64 -64
- package/ui/BookmarkNodeView.js +20 -21
- package/ui/BookmarkNodeView.js.flow +66 -66
- package/ui/CommandButton.js +15 -16
- package/ui/CommandButton.js.flow +68 -68
- package/ui/CommandMenu.js +19 -20
- package/ui/CommandMenu.js.flow +75 -75
- package/ui/CommandMenuButton.js +23 -25
- package/ui/CommandMenuButton.js.flow +130 -131
- package/ui/CustomEditorView.js +20 -20
- package/ui/CustomEditorView.js.flow +29 -28
- package/ui/CustomMenu.js +11 -12
- package/ui/CustomMenu.js.flow +17 -17
- package/ui/CustomMenuItem.js +16 -18
- package/ui/CustomMenuItem.js.flow +36 -36
- package/ui/CustomNodeView.js +29 -19
- package/ui/CustomNodeView.js.flow +207 -200
- package/ui/CustomRadioButton.js +18 -21
- package/ui/CustomRadioButton.js.flow +64 -65
- package/ui/DocLayoutEditor.js +18 -20
- package/ui/DocLayoutEditor.js.flow +145 -146
- package/ui/Editor.js +30 -28
- package/ui/Editor.js.flow +287 -288
- package/ui/EditorFrameset.js +13 -14
- package/ui/EditorFrameset.js.flow +81 -81
- package/ui/EditorToolbar.js +36 -42
- package/ui/EditorToolbar.js.flow +199 -218
- package/ui/EditorToolbarConfig.js +5 -5
- package/ui/EditorToolbarConfig.js.flow +164 -164
- package/ui/FontSizeCommandMenuButton.js +14 -15
- package/ui/FontSizeCommandMenuButton.js.flow +66 -66
- package/ui/FontTypeCommandMenuButton.js +15 -17
- package/ui/FontTypeCommandMenuButton.js.flow +60 -61
- package/ui/Frag.js +11 -12
- package/ui/Frag.js.flow +13 -13
- package/ui/Icon.js +21 -24
- package/ui/Icon.js.flow +89 -89
- package/ui/ImageInlineEditor.js +14 -15
- package/ui/ImageInlineEditor.js.flow +67 -67
- package/ui/KeyCodes.js.flow +12 -12
- package/ui/LinkTooltip.js +68 -34
- package/ui/LinkTooltip.js.flow +118 -85
- package/ui/LinkURLEditor.js +160 -43
- package/ui/LinkURLEditor.js.flow +243 -117
- package/ui/ListItemNodeView.js +6 -7
- package/ui/ListItemNodeView.js.flow +98 -98
- package/ui/ListTypeButton.js +23 -27
- package/ui/ListTypeButton.js.flow +128 -131
- package/ui/ListTypeCommandButton.js +14 -15
- package/ui/ListTypeCommandButton.js.flow +85 -85
- package/ui/ListTypeMenu.js +21 -22
- package/ui/ListTypeMenu.js.flow +70 -70
- package/ui/LoadingIndicator.js +11 -12
- package/ui/LoadingIndicator.js.flow +20 -20
- package/ui/MathEditor.js +17 -22
- package/ui/MathEditor.js.flow +72 -78
- package/ui/MathInlineEditor.js +20 -21
- package/ui/MathInlineEditor.js.flow +101 -102
- package/ui/MathNodeView.js +29 -30
- package/ui/MathNodeView.js.flow +176 -186
- package/ui/PasteMenu.js +19 -23
- package/ui/PasteMenu.js.flow +53 -57
- package/ui/ResizeObserver.js +1 -1
- package/ui/ResizeObserver.js.flow +106 -106
- package/ui/RichTextEditor.js +17 -18
- package/ui/RichTextEditor.js.flow +133 -133
- package/ui/SelectionObserver.js +8 -9
- package/ui/SelectionObserver.js.flow +134 -134
- package/ui/TableCellMenu.js +14 -15
- package/ui/TableCellMenu.js.flow +51 -51
- package/ui/TableGridSizeEditor.js +30 -33
- package/ui/TableGridSizeEditor.js.flow +187 -184
- package/ui/TableNodeView.js +18 -17
- package/ui/TableNodeView.js.flow +25 -25
- package/ui/bindScrollHandler.js +2 -1
- package/ui/bindScrollHandler.js.flow +46 -46
- package/ui/canUseCSSFont.js +5 -4
- package/ui/canUseCSSFont.js.flow +42 -43
- package/ui/czi-body-layout-editor.css +16 -16
- package/ui/czi-bookmark-view.css +10 -10
- package/ui/czi-cursor-placeholder.css +36 -36
- package/ui/czi-custom-menu-button.css +18 -18
- package/ui/czi-custom-menu-item.css +30 -30
- package/ui/czi-custom-menu.css +8 -8
- package/ui/czi-custom-radio-button.css +80 -80
- package/ui/czi-custom-scrollbar.css +21 -21
- package/ui/czi-editor-frameset.css +81 -81
- package/ui/czi-editor-toolbar.css +122 -122
- package/ui/czi-editor.css +217 -220
- package/ui/czi-form.css +201 -107
- package/ui/czi-frag.css +3 -3
- package/ui/czi-heading.css +40 -40
- package/ui/czi-icon.css +72 -72
- package/ui/czi-image-resize-box.css +165 -165
- package/ui/czi-image-upload-editor.css +57 -57
- package/ui/czi-image-upload-placeholder.css +50 -50
- package/ui/czi-image-url-editor.css +38 -38
- package/ui/czi-image-view.css +121 -125
- package/ui/czi-indent.css +137 -137
- package/ui/czi-inline-editor.css +20 -20
- package/ui/czi-link-tooltip.css +112 -71
- package/ui/czi-list.css +406 -410
- package/ui/czi-loading-indicator.css +66 -111
- package/ui/czi-math-view.css +62 -62
- package/ui/czi-selection-placeholder.css +24 -24
- package/ui/czi-table-cell-menu.css +16 -14
- package/ui/czi-table-grid-size-editor.css +37 -37
- package/ui/czi-table.css +87 -87
- package/ui/czi-vars.css +2 -2
- package/ui/findActiveFontSize.js +2 -1
- package/ui/findActiveFontSize.js.flow +55 -58
- package/ui/findActiveFontType.js +4 -3
- package/ui/findActiveFontType.js.flow +35 -38
- package/ui/fonts.css +460 -460
- package/ui/handleEditorDrop.js +1 -1
- package/ui/handleEditorDrop.js.flow +28 -28
- package/ui/handleEditorKeyDown.js +1 -1
- package/ui/handleEditorKeyDown.js.flow +39 -39
- package/ui/handleEditorPaste.js +1 -1
- package/ui/handleEditorPaste.js.flow +33 -33
- package/ui/htmlElementToRect.js.flow +18 -18
- package/ui/icon-font.css +9 -9
- package/ui/injectStyleSheet.js +2 -2
- package/ui/injectStyleSheet.js.flow +40 -42
- package/ui/isElementFullyVisible.js +1 -10
- package/ui/isElementFullyVisible.js.flow +14 -26
- package/ui/isOffline.js.flow +8 -8
- package/ui/isReactClass.js.flow +12 -12
- package/ui/listType.css +21 -21
- package/ui/mathquill-editor/MathQuillEditor.js +27 -30
- package/ui/mathquill-editor/MathQuillEditor.js.flow +158 -159
- package/ui/mathquill-editor/MathQuillEditorSymbols.js.flow +483 -483
- package/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js +14 -15
- package/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js.flow +50 -50
- package/ui/mathquill-editor/czi-mathquill-editor-symbols-panel.css +39 -39
- package/ui/mathquill-editor/czi-mathquill-editor.css +50 -50
- package/ui/mathquill-editor/mathquill-import-kludge.js +1 -8
- package/ui/mathquill-editor/mathquill-import-kludge.js.flow +17 -24
- package/ui/renderLaTeXAsHTML.js +4 -4
- package/ui/renderLaTeXAsHTML.js.flow +46 -46
- package/ui/resolveImage.js +5 -6
- package/ui/resolveImage.js.flow +121 -123
- package/ui/toCSSColor.js.flow +51 -51
- package/ui/toCSSLineSpacing.js +2 -3
- package/ui/toCSSLineSpacing.js.flow +53 -55
- package/ui/toHexColor.js.flow +26 -26
- package/ui/uuid.js.flow +9 -9
- package/uuid.js.flow +9 -9
|
@@ -1,276 +1,276 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import HTMLMutator from './HTMLMutator.js';
|
|
4
|
-
import nullthrows from 'nullthrows';
|
|
5
|
-
import uuid from './ui/uuid.js';
|
|
6
|
-
|
|
7
|
-
import { ATTRIBUTE_LIST_STYLE_TYPE } from './ListItemNodeSpec.js';
|
|
8
|
-
import {
|
|
9
|
-
ATTRIBUTE_INDENT,
|
|
10
|
-
EMPTY_CSS_VALUE,
|
|
11
|
-
convertMarginLeftToIndentValue,
|
|
12
|
-
} from './ParagraphNodeSpec.js';
|
|
13
|
-
import {
|
|
14
|
-
ATTRIBUTE_COUNTER_RESET,
|
|
15
|
-
ATTRIBUTE_FOLLOWING,
|
|
16
|
-
} from './OrderedListNodeSpec.js';
|
|
17
|
-
import { ATTRIBUTE_CSS_BEFORE_CONTENT } from './patchStyleElements.js';
|
|
18
|
-
|
|
19
|
-
export default function patchListElements(doc: Document): void {
|
|
20
|
-
// In Google Doc, lists are exported as indented
|
|
21
|
-
// (e.g. style="margin-left: 48pt") list elements which is the default DOM
|
|
22
|
-
// structure that `czi-prosemirror` supports. However, other doc providers
|
|
23
|
-
// (e.g Office 365) may export lists as nested list elements that can't
|
|
24
|
-
// be rendered properly.
|
|
25
|
-
// Before proceeding further, it needs to convert the nested list elements
|
|
26
|
-
// into indented list elements.
|
|
27
|
-
liftNestedListElements(doc);
|
|
28
|
-
Array.from(doc.querySelectorAll('ol, ul')).forEach(patchListElementsElement);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// This assumes that every 36pt maps to one indent level.
|
|
32
|
-
const CHAR_BULLET = '\u25cf';
|
|
33
|
-
const CHAR_CIRCLE = '\u25cb';
|
|
34
|
-
const CHAR_SQUARE = '\u25a0';
|
|
35
|
-
const CHAR_BOX = '\u274f';
|
|
36
|
-
const CHAR_ZERO_SPACE = '\u200B';
|
|
37
|
-
const INLINE_NODE_NAME_PATTERN = /^(#text
|
|
38
|
-
|
|
39
|
-
function patchListElementsElement(listElement: HTMLElement): void {
|
|
40
|
-
// If the children of `listElement` all have teh same marginLeft, assume
|
|
41
|
-
// it to be indented.
|
|
42
|
-
let marginLeft
|
|
43
|
-
let beforeContent
|
|
44
|
-
const { parentElement, children } = listElement;
|
|
45
|
-
|
|
46
|
-
// A workaround to patch the issue when <ul /> or <ol /> is pasted as the
|
|
47
|
-
// first child of <body />, its first <li /> somehow can't be wrapped
|
|
48
|
-
// with the list. The hack is to prepend zero-width-space character
|
|
49
|
-
// before the list.
|
|
50
|
-
if (
|
|
51
|
-
parentElement &&
|
|
52
|
-
parentElement.nodeName === 'BODY' &&
|
|
53
|
-
parentElement.firstChild === listElement
|
|
54
|
-
) {
|
|
55
|
-
const tt = parentElement.ownerDocument.createTextNode(CHAR_ZERO_SPACE);
|
|
56
|
-
parentElement.insertBefore(tt, listElement);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
Array.from(children).forEach((listItemElement) => {
|
|
60
|
-
const { style } = listItemElement;
|
|
61
|
-
patchPaddingStyle(listItemElement);
|
|
62
|
-
|
|
63
|
-
const bc = listItemElement.getAttribute(ATTRIBUTE_CSS_BEFORE_CONTENT) || '';
|
|
64
|
-
if (beforeContent === undefined) {
|
|
65
|
-
beforeContent = bc;
|
|
66
|
-
}
|
|
67
|
-
if (beforeContent !== bc) {
|
|
68
|
-
beforeContent = null;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const ml = (style
|
|
72
|
-
if (marginLeft === undefined) {
|
|
73
|
-
marginLeft = ml;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
if (ml !== marginLeft) {
|
|
77
|
-
marginLeft = null;
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
if (marginLeft) {
|
|
82
|
-
const indent = convertMarginLeftToIndentValue(marginLeft);
|
|
83
|
-
if (indent) {
|
|
84
|
-
listElement.setAttribute(ATTRIBUTE_INDENT, String(indent));
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (beforeContent) {
|
|
89
|
-
beforeContent = String(beforeContent);
|
|
90
|
-
let listStyleType;
|
|
91
|
-
switch (true) {
|
|
92
|
-
case beforeContent.indexOf(CHAR_BULLET) > -1:
|
|
93
|
-
listStyleType = 'disc';
|
|
94
|
-
break;
|
|
95
|
-
|
|
96
|
-
case beforeContent.indexOf(CHAR_CIRCLE) > -1:
|
|
97
|
-
listStyleType = 'circle';
|
|
98
|
-
break;
|
|
99
|
-
|
|
100
|
-
case beforeContent.indexOf(CHAR_SQUARE) > -1:
|
|
101
|
-
listStyleType = 'square';
|
|
102
|
-
break;
|
|
103
|
-
|
|
104
|
-
case beforeContent.indexOf(CHAR_BOX) > -1:
|
|
105
|
-
listStyleType = 'box';
|
|
106
|
-
break;
|
|
107
|
-
|
|
108
|
-
case beforeContent.indexOf('lower-latin') > -1:
|
|
109
|
-
listStyleType = 'lower-latin';
|
|
110
|
-
break;
|
|
111
|
-
|
|
112
|
-
case beforeContent.indexOf('upper-latin') > -1:
|
|
113
|
-
listStyleType = 'upper-latin';
|
|
114
|
-
break;
|
|
115
|
-
|
|
116
|
-
case beforeContent.indexOf('lower-roman') > -1:
|
|
117
|
-
listStyleType = 'lower-roman';
|
|
118
|
-
break;
|
|
119
|
-
|
|
120
|
-
case beforeContent.indexOf('upper-roman') > -1:
|
|
121
|
-
listStyleType = 'upper-roman';
|
|
122
|
-
break;
|
|
123
|
-
|
|
124
|
-
case beforeContent.indexOf('-') > -1:
|
|
125
|
-
listStyleType = 'dash';
|
|
126
|
-
break;
|
|
127
|
-
|
|
128
|
-
default:
|
|
129
|
-
console.log('unknown list style type', beforeContent);
|
|
130
|
-
break;
|
|
131
|
-
}
|
|
132
|
-
if (listStyleType) {
|
|
133
|
-
listElement.setAttribute(ATTRIBUTE_LIST_STYLE_TYPE, listStyleType);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// This moves the styles of <li /> into its content <p />.
|
|
139
|
-
function patchPaddingStyle(listItemElement: HTMLElement): void {
|
|
140
|
-
const { style, childNodes } = listItemElement;
|
|
141
|
-
const { paddingTop, paddingBottom, lineHeight } = style;
|
|
142
|
-
if (
|
|
143
|
-
!EMPTY_CSS_VALUE.has(paddingBottom) &&
|
|
144
|
-
!EMPTY_CSS_VALUE.has(paddingTop) &&
|
|
145
|
-
!EMPTY_CSS_VALUE.has(lineHeight)
|
|
146
|
-
) {
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
const doc = listItemElement.ownerDocument;
|
|
151
|
-
const frag = doc.createDocumentFragment();
|
|
152
|
-
let contentIsInline = true;
|
|
153
|
-
|
|
154
|
-
Array.from(childNodes).forEach((cn) => {
|
|
155
|
-
contentIsInline =
|
|
156
|
-
contentIsInline && INLINE_NODE_NAME_PATTERN.test(cn.nodeName);
|
|
157
|
-
frag.appendChild(cn);
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
if (contentIsInline) {
|
|
161
|
-
// Wrap all inline content with <p /> with the padding style applied.
|
|
162
|
-
const pEl = doc.createElement('p');
|
|
163
|
-
Object.assign(pEl.style, {
|
|
164
|
-
lineHeight,
|
|
165
|
-
paddingBottom,
|
|
166
|
-
paddingTop,
|
|
167
|
-
});
|
|
168
|
-
pEl.appendChild(frag);
|
|
169
|
-
listItemElement.appendChild(pEl);
|
|
170
|
-
} else {
|
|
171
|
-
// Unable to patch the style.
|
|
172
|
-
listItemElement.appendChild(frag);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// This converts all nested list elements into indented list elements.
|
|
177
|
-
// For instance,
|
|
178
|
-
// == UI ==
|
|
179
|
-
// 1. AA
|
|
180
|
-
// 1. BB
|
|
181
|
-
// 2. BB
|
|
182
|
-
// 2. AA
|
|
183
|
-
// == DOM Structure (Before) ==
|
|
184
|
-
// <ol> <!-- Parent List -->
|
|
185
|
-
// <li>
|
|
186
|
-
// AA
|
|
187
|
-
// <ol> <!-- Child (nested) List -->
|
|
188
|
-
// <li>BB</li>
|
|
189
|
-
// <li>BB</li>
|
|
190
|
-
// </ol>
|
|
191
|
-
// </li>
|
|
192
|
-
// <li> AA</li>
|
|
193
|
-
// </ol>
|
|
194
|
-
// == DOM Structure (After) ==
|
|
195
|
-
// <ol name="x">
|
|
196
|
-
// <li>AA</li>
|
|
197
|
-
// </ol>
|
|
198
|
-
// <ol data-indent="1">
|
|
199
|
-
// <li>BB</li>
|
|
200
|
-
// <li>BB</li>
|
|
201
|
-
// </ol>
|
|
202
|
-
// <ol data-following="x" data-counter-reset-"none">
|
|
203
|
-
// <li>AA</li>
|
|
204
|
-
// </ol>
|
|
205
|
-
function liftNestedListElements(doc: Document): void {
|
|
206
|
-
const selector = 'li > ol, li > ul';
|
|
207
|
-
const els = Array.from(doc.querySelectorAll(selector));
|
|
208
|
-
const htmlMutator = new HTMLMutator(doc);
|
|
209
|
-
|
|
210
|
-
els.forEach((list) => {
|
|
211
|
-
const indent = findIndentLevel(list);
|
|
212
|
-
list.setAttribute('data-indent', String(indent));
|
|
213
|
-
|
|
214
|
-
const parentListItem = nullthrows(list.parentElement);
|
|
215
|
-
const parentList = nullthrows(parentListItem.parentElement);
|
|
216
|
-
const parentListNodeName = parentList.nodeName.toLowerCase();
|
|
217
|
-
const isLast = parentList.lastElementChild === parentListItem;
|
|
218
|
-
const style = parentList.getAttribute('style') || '';
|
|
219
|
-
|
|
220
|
-
// The parent list will be split into two lists and the second list should
|
|
221
|
-
// follow the first list.
|
|
222
|
-
const followingName = parentList.getAttribute('name') || uuid();
|
|
223
|
-
parentList.setAttribute('name', followingName);
|
|
224
|
-
|
|
225
|
-
// Stub HTML snippets that will lift the list.
|
|
226
|
-
|
|
227
|
-
// Before:
|
|
228
|
-
// <ol>
|
|
229
|
-
// <li>
|
|
230
|
-
// AAA
|
|
231
|
-
// <ol><li>BBB</li></ol>
|
|
232
|
-
// </li>
|
|
233
|
-
// <li>CCC</li>
|
|
234
|
-
// </ol>
|
|
235
|
-
// After:
|
|
236
|
-
// <ol><li>AAA</li></ol>
|
|
237
|
-
// <ol><li>BBB</li></ol>
|
|
238
|
-
// <ol><li>CCC</li></ol>
|
|
239
|
-
|
|
240
|
-
// Close the parent list before the list.
|
|
241
|
-
htmlMutator.insertHTMLBefore(
|
|
242
|
-
// Open a new list after list.
|
|
243
|
-
htmlMutator.insertHTMLAfter(
|
|
244
|
-
`<${parentListNodeName}
|
|
245
|
-
style="${style}"
|
|
246
|
-
class="${parentList.className}"
|
|
247
|
-
${ATTRIBUTE_COUNTER_RESET}="none"
|
|
248
|
-
${ATTRIBUTE_FOLLOWING}="${followingName}">`,
|
|
249
|
-
list
|
|
250
|
-
);
|
|
251
|
-
|
|
252
|
-
if (isLast) {
|
|
253
|
-
// The new list after list is an empty list, comment it out.
|
|
254
|
-
htmlMutator
|
|
255
|
-
.insertHTMLAfter('<!--', list)
|
|
256
|
-
.insertHTMLAfter('-->', parentList);
|
|
257
|
-
}
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
htmlMutator.execute();
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
function findIndentLevel(el: Element): number {
|
|
264
|
-
let indent = 0;
|
|
265
|
-
let currentEl = el.parentElement;
|
|
266
|
-
while (currentEl) {
|
|
267
|
-
const { nodeName } = currentEl;
|
|
268
|
-
if (nodeName === 'OL' || nodeName === 'UL') {
|
|
269
|
-
indent++;
|
|
270
|
-
} else if (nodeName !== 'LI') {
|
|
271
|
-
break;
|
|
272
|
-
}
|
|
273
|
-
currentEl = currentEl.parentElement;
|
|
274
|
-
}
|
|
275
|
-
return indent;
|
|
276
|
-
}
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
import HTMLMutator from './HTMLMutator.js';
|
|
4
|
+
import nullthrows from 'nullthrows';
|
|
5
|
+
import uuid from './ui/uuid.js';
|
|
6
|
+
|
|
7
|
+
import { ATTRIBUTE_LIST_STYLE_TYPE } from './ListItemNodeSpec.js';
|
|
8
|
+
import {
|
|
9
|
+
ATTRIBUTE_INDENT,
|
|
10
|
+
EMPTY_CSS_VALUE,
|
|
11
|
+
convertMarginLeftToIndentValue,
|
|
12
|
+
} from './ParagraphNodeSpec.js';
|
|
13
|
+
import {
|
|
14
|
+
ATTRIBUTE_COUNTER_RESET,
|
|
15
|
+
ATTRIBUTE_FOLLOWING,
|
|
16
|
+
} from './OrderedListNodeSpec.js';
|
|
17
|
+
import { ATTRIBUTE_CSS_BEFORE_CONTENT } from './patchStyleElements.js';
|
|
18
|
+
|
|
19
|
+
export default function patchListElements(doc: Document): void {
|
|
20
|
+
// In Google Doc, lists are exported as indented
|
|
21
|
+
// (e.g. style="margin-left: 48pt") list elements which is the default DOM
|
|
22
|
+
// structure that `czi-prosemirror` supports. However, other doc providers
|
|
23
|
+
// (e.g Office 365) may export lists as nested list elements that can't
|
|
24
|
+
// be rendered properly.
|
|
25
|
+
// Before proceeding further, it needs to convert the nested list elements
|
|
26
|
+
// into indented list elements.
|
|
27
|
+
liftNestedListElements(doc);
|
|
28
|
+
Array.from(doc.querySelectorAll('ol, ul')).forEach(patchListElementsElement);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// This assumes that every 36pt maps to one indent level.
|
|
32
|
+
const CHAR_BULLET = '\u25cf';
|
|
33
|
+
const CHAR_CIRCLE = '\u25cb';
|
|
34
|
+
const CHAR_SQUARE = '\u25a0';
|
|
35
|
+
const CHAR_BOX = '\u274f';
|
|
36
|
+
const CHAR_ZERO_SPACE = '\u200B';
|
|
37
|
+
const INLINE_NODE_NAME_PATTERN = /^(#text|(A|SPAN|B|STRONG))$/;
|
|
38
|
+
|
|
39
|
+
function patchListElementsElement(listElement: HTMLElement): void {
|
|
40
|
+
// If the children of `listElement` all have teh same marginLeft, assume
|
|
41
|
+
// it to be indented.
|
|
42
|
+
let marginLeft;
|
|
43
|
+
let beforeContent;
|
|
44
|
+
const { parentElement, children } = listElement;
|
|
45
|
+
|
|
46
|
+
// A workaround to patch the issue when <ul /> or <ol /> is pasted as the
|
|
47
|
+
// first child of <body />, its first <li /> somehow can't be wrapped
|
|
48
|
+
// with the list. The hack is to prepend zero-width-space character
|
|
49
|
+
// before the list.
|
|
50
|
+
if (
|
|
51
|
+
parentElement &&
|
|
52
|
+
parentElement.nodeName === 'BODY' &&
|
|
53
|
+
parentElement.firstChild === listElement
|
|
54
|
+
) {
|
|
55
|
+
const tt = parentElement.ownerDocument.createTextNode(CHAR_ZERO_SPACE);
|
|
56
|
+
parentElement.insertBefore(tt, listElement);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
Array.from(children).forEach((listItemElement) => {
|
|
60
|
+
const { style } = listItemElement;
|
|
61
|
+
patchPaddingStyle(listItemElement);
|
|
62
|
+
|
|
63
|
+
const bc = listItemElement.getAttribute(ATTRIBUTE_CSS_BEFORE_CONTENT) || '';
|
|
64
|
+
if (beforeContent === undefined) {
|
|
65
|
+
beforeContent = bc;
|
|
66
|
+
}
|
|
67
|
+
if (beforeContent !== bc) {
|
|
68
|
+
beforeContent = null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const ml = (style?.marginLeft) || '';
|
|
72
|
+
if (marginLeft === undefined) {
|
|
73
|
+
marginLeft = ml;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (ml !== marginLeft) {
|
|
77
|
+
marginLeft = null;
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
if (marginLeft) {
|
|
82
|
+
const indent = convertMarginLeftToIndentValue(marginLeft);
|
|
83
|
+
if (indent) {
|
|
84
|
+
listElement.setAttribute(ATTRIBUTE_INDENT, String(indent));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (beforeContent) {
|
|
89
|
+
beforeContent = String(beforeContent);
|
|
90
|
+
let listStyleType;
|
|
91
|
+
switch (true) {
|
|
92
|
+
case beforeContent.indexOf(CHAR_BULLET) > -1:
|
|
93
|
+
listStyleType = 'disc';
|
|
94
|
+
break;
|
|
95
|
+
|
|
96
|
+
case beforeContent.indexOf(CHAR_CIRCLE) > -1:
|
|
97
|
+
listStyleType = 'circle';
|
|
98
|
+
break;
|
|
99
|
+
|
|
100
|
+
case beforeContent.indexOf(CHAR_SQUARE) > -1:
|
|
101
|
+
listStyleType = 'square';
|
|
102
|
+
break;
|
|
103
|
+
|
|
104
|
+
case beforeContent.indexOf(CHAR_BOX) > -1:
|
|
105
|
+
listStyleType = 'box';
|
|
106
|
+
break;
|
|
107
|
+
|
|
108
|
+
case beforeContent.indexOf('lower-latin') > -1:
|
|
109
|
+
listStyleType = 'lower-latin';
|
|
110
|
+
break;
|
|
111
|
+
|
|
112
|
+
case beforeContent.indexOf('upper-latin') > -1:
|
|
113
|
+
listStyleType = 'upper-latin';
|
|
114
|
+
break;
|
|
115
|
+
|
|
116
|
+
case beforeContent.indexOf('lower-roman') > -1:
|
|
117
|
+
listStyleType = 'lower-roman';
|
|
118
|
+
break;
|
|
119
|
+
|
|
120
|
+
case beforeContent.indexOf('upper-roman') > -1:
|
|
121
|
+
listStyleType = 'upper-roman';
|
|
122
|
+
break;
|
|
123
|
+
|
|
124
|
+
case beforeContent.indexOf('-') > -1:
|
|
125
|
+
listStyleType = 'dash';
|
|
126
|
+
break;
|
|
127
|
+
|
|
128
|
+
default:
|
|
129
|
+
console.log('unknown list style type', beforeContent);
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
if (listStyleType) {
|
|
133
|
+
listElement.setAttribute(ATTRIBUTE_LIST_STYLE_TYPE, listStyleType);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// This moves the styles of <li /> into its content <p />.
|
|
139
|
+
function patchPaddingStyle(listItemElement: HTMLElement): void {
|
|
140
|
+
const { style, childNodes } = listItemElement;
|
|
141
|
+
const { paddingTop, paddingBottom, lineHeight } = style;
|
|
142
|
+
if (
|
|
143
|
+
!EMPTY_CSS_VALUE.has(paddingBottom) &&
|
|
144
|
+
!EMPTY_CSS_VALUE.has(paddingTop) &&
|
|
145
|
+
!EMPTY_CSS_VALUE.has(lineHeight)
|
|
146
|
+
) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const doc = listItemElement.ownerDocument;
|
|
151
|
+
const frag = doc.createDocumentFragment();
|
|
152
|
+
let contentIsInline = true;
|
|
153
|
+
|
|
154
|
+
Array.from(childNodes).forEach((cn) => {
|
|
155
|
+
contentIsInline =
|
|
156
|
+
contentIsInline && INLINE_NODE_NAME_PATTERN.test(cn.nodeName);
|
|
157
|
+
frag.appendChild(cn);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
if (contentIsInline) {
|
|
161
|
+
// Wrap all inline content with <p /> with the padding style applied.
|
|
162
|
+
const pEl = doc.createElement('p');
|
|
163
|
+
Object.assign(pEl.style, {
|
|
164
|
+
lineHeight,
|
|
165
|
+
paddingBottom,
|
|
166
|
+
paddingTop,
|
|
167
|
+
});
|
|
168
|
+
pEl.appendChild(frag);
|
|
169
|
+
listItemElement.appendChild(pEl);
|
|
170
|
+
} else {
|
|
171
|
+
// Unable to patch the style.
|
|
172
|
+
listItemElement.appendChild(frag);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// This converts all nested list elements into indented list elements.
|
|
177
|
+
// For instance,
|
|
178
|
+
// == UI ==
|
|
179
|
+
// 1. AA
|
|
180
|
+
// 1. BB
|
|
181
|
+
// 2. BB
|
|
182
|
+
// 2. AA
|
|
183
|
+
// == DOM Structure (Before) ==
|
|
184
|
+
// <ol> <!-- Parent List -->
|
|
185
|
+
// <li>
|
|
186
|
+
// AA
|
|
187
|
+
// <ol> <!-- Child (nested) List -->
|
|
188
|
+
// <li>BB</li>
|
|
189
|
+
// <li>BB</li>
|
|
190
|
+
// </ol>
|
|
191
|
+
// </li>
|
|
192
|
+
// <li> AA</li>
|
|
193
|
+
// </ol>
|
|
194
|
+
// == DOM Structure (After) ==
|
|
195
|
+
// <ol name="x">
|
|
196
|
+
// <li>AA</li>
|
|
197
|
+
// </ol>
|
|
198
|
+
// <ol data-indent="1">
|
|
199
|
+
// <li>BB</li>
|
|
200
|
+
// <li>BB</li>
|
|
201
|
+
// </ol>
|
|
202
|
+
// <ol data-following="x" data-counter-reset-"none">
|
|
203
|
+
// <li>AA</li>
|
|
204
|
+
// </ol>
|
|
205
|
+
function liftNestedListElements(doc: Document): void {
|
|
206
|
+
const selector = 'li > ol, li > ul';
|
|
207
|
+
const els = Array.from(doc.querySelectorAll(selector));
|
|
208
|
+
const htmlMutator = new HTMLMutator(doc);
|
|
209
|
+
|
|
210
|
+
els.forEach((list) => {
|
|
211
|
+
const indent = findIndentLevel(list);
|
|
212
|
+
list.setAttribute('data-indent', String(indent));
|
|
213
|
+
|
|
214
|
+
const parentListItem = nullthrows(list.parentElement);
|
|
215
|
+
const parentList = nullthrows(parentListItem.parentElement);
|
|
216
|
+
const parentListNodeName = parentList.nodeName.toLowerCase();
|
|
217
|
+
const isLast = parentList.lastElementChild === parentListItem;
|
|
218
|
+
const style = parentList.getAttribute('style') || '';
|
|
219
|
+
|
|
220
|
+
// The parent list will be split into two lists and the second list should
|
|
221
|
+
// follow the first list.
|
|
222
|
+
const followingName = parentList.getAttribute('name') || uuid();
|
|
223
|
+
parentList.setAttribute('name', followingName);
|
|
224
|
+
|
|
225
|
+
// Stub HTML snippets that will lift the list.
|
|
226
|
+
|
|
227
|
+
// Before:
|
|
228
|
+
// <ol>
|
|
229
|
+
// <li>
|
|
230
|
+
// AAA
|
|
231
|
+
// <ol><li>BBB</li></ol>
|
|
232
|
+
// </li>
|
|
233
|
+
// <li>CCC</li>
|
|
234
|
+
// </ol>
|
|
235
|
+
// After:
|
|
236
|
+
// <ol><li>AAA</li></ol>
|
|
237
|
+
// <ol><li>BBB</li></ol>
|
|
238
|
+
// <ol><li>CCC</li></ol>
|
|
239
|
+
|
|
240
|
+
// Close the parent list before the list.
|
|
241
|
+
htmlMutator.insertHTMLBefore(`</${parentListNodeName}>`, list);
|
|
242
|
+
// Open a new list after list.
|
|
243
|
+
htmlMutator.insertHTMLAfter(
|
|
244
|
+
`<${parentListNodeName}
|
|
245
|
+
style="${style}"
|
|
246
|
+
class="${parentList.className}"
|
|
247
|
+
${ATTRIBUTE_COUNTER_RESET}="none"
|
|
248
|
+
${ATTRIBUTE_FOLLOWING}="${followingName}">`,
|
|
249
|
+
list
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
if (isLast) {
|
|
253
|
+
// The new list after list is an empty list, comment it out.
|
|
254
|
+
htmlMutator
|
|
255
|
+
.insertHTMLAfter('<!--', list)
|
|
256
|
+
.insertHTMLAfter('-->', parentList);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
htmlMutator.execute();
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function findIndentLevel(el: Element): number {
|
|
264
|
+
let indent = 0;
|
|
265
|
+
let currentEl = el.parentElement;
|
|
266
|
+
while (currentEl) {
|
|
267
|
+
const { nodeName } = currentEl;
|
|
268
|
+
if (nodeName === 'OL' || nodeName === 'UL') {
|
|
269
|
+
indent++;
|
|
270
|
+
} else if (nodeName !== 'LI') {
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
currentEl = currentEl.parentElement;
|
|
274
|
+
}
|
|
275
|
+
return indent;
|
|
276
|
+
}
|
package/patchMathElements.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import queryString from 'query-string';
|
|
2
|
-
import url from 'url';
|
|
3
1
|
export default function patchMathElements(doc) {
|
|
4
2
|
Array.from(doc.querySelectorAll('img')).forEach(patchGoogleEquationElement);
|
|
5
3
|
}
|
|
@@ -39,14 +37,14 @@ function getGoogleEquationContent(src) {
|
|
|
39
37
|
if (!src) {
|
|
40
38
|
return null;
|
|
41
39
|
}
|
|
42
|
-
var
|
|
43
|
-
host =
|
|
44
|
-
pathname =
|
|
45
|
-
query =
|
|
40
|
+
var _URL = new URL(src),
|
|
41
|
+
host = _URL.host,
|
|
42
|
+
pathname = _URL.pathname,
|
|
43
|
+
query = _URL.query;
|
|
46
44
|
if (host !== 'www.google.com' || pathname !== '/chart') {
|
|
47
45
|
return null;
|
|
48
46
|
}
|
|
49
|
-
var params =
|
|
47
|
+
var params = new URL(query);
|
|
50
48
|
var chartType = params[PARAM_CHART_CHART_TYPE];
|
|
51
49
|
var label = params[PARAM_CHART_LABEL];
|
|
52
50
|
|