@modusoperandi/licit 1.4.2 → 1.4.6

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 (228) hide show
  1. package/BlockquoteInsertNewLineCommand.js.flow +70 -70
  2. package/BlockquoteNodeSpec.js.flow +29 -29
  3. package/BlockquoteToggleCommand.js.flow +56 -56
  4. package/BookmarkNodeSpec.js.flow +39 -39
  5. package/BulletListNodeSpec.js.flow +61 -61
  6. package/CZIProseMirror.js.flow +90 -90
  7. package/CodeBlockCommand.js.flow +65 -65
  8. package/CodeBlockNodeSpec.js.flow +24 -24
  9. package/CodeMarkSpec.js.flow +14 -14
  10. package/ContentPlaceholderPlugin.js.flow +183 -183
  11. package/CursorPlaceholderPlugin.js.flow +113 -113
  12. package/DocLayoutCommand.js.flow +97 -97
  13. package/DocNodeSpec.js.flow +62 -62
  14. package/EMMarkSpec.js.flow +39 -39
  15. package/EditorCommands.js.flow +124 -124
  16. package/EditorKeyMap.js.flow +173 -173
  17. package/EditorMarks.js +4 -2
  18. package/EditorMarks.js.flow +77 -74
  19. package/EditorNodes.js.flow +55 -55
  20. package/EditorPageLayoutPlugin.js.flow +67 -67
  21. package/EditorPlugins.js.flow +8 -8
  22. package/EditorSchema.js.flow +12 -12
  23. package/EditorState.js.flow +7 -7
  24. package/FontSizeMarkSpec.js.flow +54 -54
  25. package/FontTypeMarkSpec.js.flow +89 -89
  26. package/HTMLMutator.js.flow +58 -58
  27. package/HangingIndentMarkSpec.js +34 -0
  28. package/HangingIndentMarkSpec.js.flow +30 -0
  29. package/HardBreakNodeSpec.js.flow +15 -15
  30. package/HeadingNodeSpec.js.flow +42 -42
  31. package/HistoryRedoCommand.js.flow +41 -41
  32. package/HistoryUndoCommand.js.flow +41 -41
  33. package/HorizontalRuleCommand.js.flow +71 -71
  34. package/HorizontalRuleNodeSpec.js.flow +39 -39
  35. package/ImageUploadPlaceholderPlugin.js.flow +187 -187
  36. package/LICENSE +22 -22
  37. package/LinkMarkSpec.js +4 -2
  38. package/LinkMarkSpec.js.flow +38 -37
  39. package/LinkSetURLCommand.js +1 -1
  40. package/LinkSetURLCommand.js.flow +129 -129
  41. package/LinkTooltipPlugin.js +32 -38
  42. package/LinkTooltipPlugin.js.flow +204 -217
  43. package/ListItemInsertNewLineCommand.js.flow +76 -76
  44. package/ListItemMergeCommand.js.flow +197 -197
  45. package/ListItemNodeSpec.js.flow +52 -52
  46. package/ListSplitCommand.js.flow +54 -54
  47. package/ListToggleCommand.js.flow +99 -99
  48. package/MarkNames.js +2 -1
  49. package/MarkNames.js.flow +20 -19
  50. package/MarksClearCommand.js.flow +66 -66
  51. package/NodeNames.js.flow +23 -23
  52. package/OrderedListNodeSpec.js.flow +131 -131
  53. package/OverrideMarkSpec.js.flow +49 -49
  54. package/ParagraphNodeSpec.js +21 -2
  55. package/ParagraphNodeSpec.js.flow +233 -215
  56. package/ParagraphSpacingCommand.js.flow +139 -139
  57. package/PrintCommand.js.flow +53 -53
  58. package/SelectionPlaceholderPlugin.js.flow +129 -129
  59. package/SpacerMarkSpec.js.flow +47 -47
  60. package/StrikeMarkSpec.js.flow +24 -24
  61. package/StrongMarkSpec.js.flow +39 -39
  62. package/StyleView.js.flow +18 -18
  63. package/TableBackgroundColorCommand.js.flow +79 -79
  64. package/TableBorderColorCommand.js +5 -3
  65. package/TableBorderColorCommand.js.flow +108 -106
  66. package/TableCellColorCommand.js.flow +73 -73
  67. package/TableCellMenuPlugin.js.flow +129 -129
  68. package/TableInsertCommand.js.flow +117 -117
  69. package/TableMergeCellsCommand.js.flow +113 -113
  70. package/TableNodesSpecs.js.flow +144 -144
  71. package/TablePlugins.js.flow +14 -14
  72. package/TableResizePlugin.js.flow +636 -636
  73. package/TextColorMarkSpec.js.flow +40 -40
  74. package/TextHighlightMarkSpec.js.flow +47 -47
  75. package/TextInsertTabSpaceCommand.js +0 -3
  76. package/TextInsertTabSpaceCommand.js.flow +103 -106
  77. package/TextNoWrapMarkSpec.js.flow +14 -14
  78. package/TextNodeSpec.js.flow +7 -7
  79. package/TextSelectionMarkSpec.js.flow +24 -24
  80. package/TextSubMarkSpec.js.flow +28 -28
  81. package/TextSuperMarkSpec.js.flow +28 -28
  82. package/TextUnderlineMarkSpec.js.flow +24 -24
  83. package/Types.js.flow +77 -77
  84. package/WebFontLoader.js.flow +22 -22
  85. package/blockQuoteInputRule.js.flow +36 -36
  86. package/bom.xml +8645 -8637
  87. package/browser.js.flow +7 -7
  88. package/buildEditorPlugins.js.flow +48 -48
  89. package/buildInputRules.js.flow +85 -85
  90. package/client/CollabConnector.js.flow +90 -90
  91. package/client/EditorConnection.js.flow +324 -324
  92. package/client/Licit.js +40 -40
  93. package/client/Licit.js.flow +649 -648
  94. package/client/Licit.test.js.flow +104 -104
  95. package/client/Reporter.js.flow +35 -35
  96. package/client/SimpleConnector.js.flow +61 -61
  97. package/client/http.js.flow +60 -60
  98. package/client/licit.css +12 -12
  99. package/client/throttle.js.flow +27 -27
  100. package/convertFromDOMElement.js.flow +33 -33
  101. package/convertFromHTML.js.flow +15 -15
  102. package/convertFromJSON.js.flow +53 -53
  103. package/convertToCSSPTValue.js.flow +19 -19
  104. package/convertToJSON.js.flow +7 -7
  105. package/createCommand.js.flow +62 -62
  106. package/createEditorKeyMap.js.flow +87 -87
  107. package/createEmptyEditorState.js.flow +29 -29
  108. package/createTableResizingPlugin.js.flow +86 -86
  109. package/findActionableCell.js.flow +74 -74
  110. package/findActiveMark.js.flow +32 -32
  111. package/hyphenize.js.flow +17 -17
  112. package/index.d.ts +167 -167
  113. package/index.js.flow +10 -10
  114. package/insertTable.js.flow +54 -54
  115. package/isEditorStateEmpty.js.flow +32 -32
  116. package/isTableNode.js.flow +15 -15
  117. package/joinDown.js.flow +25 -25
  118. package/joinListNode.js.flow +55 -55
  119. package/joinUp.js.flow +37 -37
  120. package/keymaps.js.flow +175 -175
  121. package/lookUpElement.js.flow +14 -14
  122. package/nodeAt.js.flow +12 -12
  123. package/normalizeHTML.js.flow +80 -80
  124. package/package.json +152 -152
  125. package/patchAnchorElements.js.flow +38 -38
  126. package/patchBreakElements.js.flow +22 -22
  127. package/patchElementInlineStyles.js.flow +92 -92
  128. package/patchListElements.js.flow +275 -275
  129. package/patchMathElements.js.flow +58 -58
  130. package/patchParagraphElements.js.flow +20 -20
  131. package/patchStyleElements.js.flow +197 -197
  132. package/patchTableElements.js.flow +88 -88
  133. package/rebaseDocWithSteps.js.flow +42 -42
  134. package/sanitizeURL.js.flow +13 -13
  135. package/splitListItem.js.flow +191 -191
  136. package/styles.css +46 -46
  137. package/toClosestFontPtSize.js.flow +22 -22
  138. package/toSafeHTMLDocument.js.flow +9 -9
  139. package/toggleBlockquote.js.flow +101 -101
  140. package/toggleCodeBlock.js.flow +102 -102
  141. package/ui/AlertInfo.js.flow +63 -63
  142. package/ui/BookmarkNodeView.js.flow +64 -64
  143. package/ui/CommandButton.js.flow +68 -68
  144. package/ui/CommandMenu.js.flow +74 -74
  145. package/ui/CommandMenuButton.js.flow +128 -128
  146. package/ui/CustomEditorView.js.flow +29 -29
  147. package/ui/CustomMenu.js.flow +14 -14
  148. package/ui/CustomMenuItem.js.flow +35 -35
  149. package/ui/CustomNodeView.js.flow +207 -207
  150. package/ui/CustomRadioButton.js.flow +63 -63
  151. package/ui/DocLayoutEditor.js.flow +130 -130
  152. package/ui/Editor.js.flow +281 -281
  153. package/ui/EditorFrameset.js.flow +79 -79
  154. package/ui/EditorToolbar.js.flow +197 -197
  155. package/ui/EditorToolbarConfig.js.flow +162 -162
  156. package/ui/FontSizeCommandMenuButton.js.flow +66 -66
  157. package/ui/FontTypeCommandMenuButton.js.flow +60 -60
  158. package/ui/Frag.js.flow +11 -11
  159. package/ui/Icon.js +1 -1
  160. package/ui/Icon.js.flow +82 -82
  161. package/ui/ImageInlineEditor.js.flow +66 -66
  162. package/ui/KeyCodes.js.flow +12 -12
  163. package/ui/LinkTooltip.js.flow +51 -51
  164. package/ui/LinkURLEditor.js.flow +227 -227
  165. package/ui/ListItemNodeView.js.flow +101 -101
  166. package/ui/ListTypeButton.js.flow +121 -121
  167. package/ui/ListTypeCommandButton.js.flow +85 -85
  168. package/ui/ListTypeMenu.js.flow +78 -78
  169. package/ui/LoadingIndicator.js.flow +19 -19
  170. package/ui/PasteMenu.js.flow +52 -52
  171. package/ui/ResizeObserver.js.flow +105 -105
  172. package/ui/RichTextEditor.js.flow +133 -133
  173. package/ui/SelectionObserver.js.flow +134 -134
  174. package/ui/TableCellMenu.js.flow +49 -49
  175. package/ui/TableGridSizeEditor.js.flow +185 -185
  176. package/ui/TableNodeView.js.flow +36 -36
  177. package/ui/bindScrollHandler.js.flow +46 -46
  178. package/ui/canUseCSSFont.js.flow +42 -42
  179. package/ui/czi-body-layout-editor.css +16 -16
  180. package/ui/czi-bookmark-view.css +10 -10
  181. package/ui/czi-cursor-placeholder.css +36 -36
  182. package/ui/czi-custom-menu-button.css +18 -18
  183. package/ui/czi-custom-menu-item.css +30 -30
  184. package/ui/czi-custom-menu.css +8 -8
  185. package/ui/czi-custom-radio-button.css +80 -80
  186. package/ui/czi-custom-scrollbar.css +21 -21
  187. package/ui/czi-editor-frameset.css +81 -81
  188. package/ui/czi-editor-toolbar.css +122 -122
  189. package/ui/czi-editor.css +239 -216
  190. package/ui/czi-form.css +201 -201
  191. package/ui/czi-frag.css +3 -3
  192. package/ui/czi-heading.css +40 -40
  193. package/ui/czi-icon.css +72 -72
  194. package/ui/czi-image-resize-box.css +165 -165
  195. package/ui/czi-image-upload-editor.css +57 -57
  196. package/ui/czi-image-upload-placeholder.css +50 -50
  197. package/ui/czi-image-url-editor.css +38 -38
  198. package/ui/czi-image-view.css +121 -121
  199. package/ui/czi-indent.css +137 -137
  200. package/ui/czi-inline-editor.css +20 -20
  201. package/ui/czi-link-tooltip.css +112 -112
  202. package/ui/czi-list.css +406 -406
  203. package/ui/czi-loading-indicator.css +66 -66
  204. package/ui/czi-math-view.css +62 -62
  205. package/ui/czi-selection-placeholder.css +24 -24
  206. package/ui/czi-table-cell-menu.css +16 -16
  207. package/ui/czi-table-grid-size-editor.css +37 -37
  208. package/ui/czi-table.css +89 -89
  209. package/ui/czi-vars.css +47 -45
  210. package/ui/findActiveFontSize.js.flow +55 -55
  211. package/ui/findActiveFontType.js.flow +35 -35
  212. package/ui/fonts.css +460 -460
  213. package/ui/handleEditorDrop.js.flow +28 -28
  214. package/ui/handleEditorKeyDown.js.flow +39 -39
  215. package/ui/handleEditorPaste.js.flow +33 -33
  216. package/ui/htmlElementToRect.js.flow +18 -18
  217. package/ui/icon-font.css +9 -9
  218. package/ui/injectStyleSheet.js.flow +40 -40
  219. package/ui/isElementFullyVisible.js.flow +14 -14
  220. package/ui/isOffline.js.flow +8 -8
  221. package/ui/isReactClass.js.flow +12 -12
  222. package/ui/listType.css +21 -21
  223. package/ui/resolveImage.js.flow +121 -121
  224. package/ui/toCSSColor.js.flow +51 -51
  225. package/ui/toCSSLineSpacing.js.flow +53 -53
  226. package/ui/toHexColor.js.flow +26 -26
  227. package/ui/uuid.js.flow +9 -9
  228. package/uuid.js.flow +9 -9
@@ -1,80 +1,80 @@
1
- // @flow
2
-
3
- import {
4
- DOM_ATTRIBUTE_SIZE,
5
- HAIR_SPACE_CHAR,
6
- SPACER_SIZE_TAB,
7
- } from './SpacerMarkSpec.js';
8
- import patchAnchorElements from './patchAnchorElements.js';
9
- import patchBreakElements from './patchBreakElements.js';
10
- import patchElementInlineStyles from './patchElementInlineStyles.js';
11
- import patchListElements from './patchListElements.js';
12
- import patchMathElements from './patchMathElements.js';
13
- import patchParagraphElements from './patchParagraphElements.js';
14
- import patchStyleElements from './patchStyleElements.js';
15
- import patchTableElements from './patchTableElements.js';
16
- import toSafeHTMLDocument from './toSafeHTMLDocument.js';
17
-
18
- const HTML_BODY_PATTERN = /<body[\s>]/i;
19
- const LONG_UNDERLINE_PATTERN = /_+/g;
20
-
21
- // This is a workround to convert "&nbsp;&nbsp;......&nbsp;" into wider tab
22
- // tab spacers. For every 6 "&nbsp;", they will be converted into tab spacers.
23
- const LONG_TAB_SPACE_PATTERN = /(&nbsp;){6}/g;
24
-
25
- const TAB_SPACER_HTML = new Array(6).join(
26
- `<span ${DOM_ATTRIBUTE_SIZE}="${SPACER_SIZE_TAB}">${HAIR_SPACE_CHAR}</span>`
27
- );
28
-
29
- function replaceNOBR(matched: string): string {
30
- // This is a workround to convert "_______" into none-wrapped text
31
- // that apppears like a horizontal line.
32
- if (matched && matched.length >= 20) {
33
- // needs extra space after it so user can escape the <nobr />.
34
- matched = `<nobr>${String(matched)}</nobr> `;
35
- }
36
- return matched;
37
- }
38
-
39
- export default function normalizeHTML(html: string): string {
40
- let body: ?HTMLElement = null;
41
-
42
- const sourceIsPage = HTML_BODY_PATTERN.test(html);
43
- html = html.replace(LONG_UNDERLINE_PATTERN, replaceNOBR);
44
-
45
- // Convert every two consecutive "&nbsp;" into a spacer tab.
46
- html = html.replace(LONG_TAB_SPACE_PATTERN, TAB_SPACER_HTML);
47
- // fix for jspdf copy paste text, from jspdf its always getting transparent
48
- html = html.replace(/color:\s*transparent;/g, 'color: black;');
49
- const doc = toSafeHTMLDocument(html);
50
- if (doc) {
51
- // styles.
52
- patchStyleElements(doc);
53
- patchElementInlineStyles(doc);
54
- // contents.
55
- patchAnchorElements(doc);
56
- patchBreakElements(doc);
57
- patchListElements(doc);
58
- patchParagraphElements(doc);
59
- patchTableElements(doc);
60
- patchMathElements(doc);
61
- body = doc.getElementsByTagName('body')[0];
62
-
63
- if (body && sourceIsPage) {
64
- // Source HTML contains <body />, assumes this to be a complete
65
- // page HTML. Assume this <body /> may contain the style that indicates
66
- // page's layout.
67
- const frag = doc.createElement('html');
68
- frag.appendChild(body);
69
- return frag.innerHTML;
70
- }
71
- }
72
-
73
- if (!body) {
74
- // <body /> should alway be generated by doc.
75
- return 'Unsupported HTML content';
76
- }
77
-
78
- // HTML snippet only.
79
- return '<body>' + body.innerHTML + '</body>';
80
- }
1
+ // @flow
2
+
3
+ import {
4
+ DOM_ATTRIBUTE_SIZE,
5
+ HAIR_SPACE_CHAR,
6
+ SPACER_SIZE_TAB,
7
+ } from './SpacerMarkSpec.js';
8
+ import patchAnchorElements from './patchAnchorElements.js';
9
+ import patchBreakElements from './patchBreakElements.js';
10
+ import patchElementInlineStyles from './patchElementInlineStyles.js';
11
+ import patchListElements from './patchListElements.js';
12
+ import patchMathElements from './patchMathElements.js';
13
+ import patchParagraphElements from './patchParagraphElements.js';
14
+ import patchStyleElements from './patchStyleElements.js';
15
+ import patchTableElements from './patchTableElements.js';
16
+ import toSafeHTMLDocument from './toSafeHTMLDocument.js';
17
+
18
+ const HTML_BODY_PATTERN = /<body[\s>]/i;
19
+ const LONG_UNDERLINE_PATTERN = /_+/g;
20
+
21
+ // This is a workround to convert "&nbsp;&nbsp;......&nbsp;" into wider tab
22
+ // tab spacers. For every 6 "&nbsp;", they will be converted into tab spacers.
23
+ const LONG_TAB_SPACE_PATTERN = /(&nbsp;){6}/g;
24
+
25
+ const TAB_SPACER_HTML = new Array(6).join(
26
+ `<span ${DOM_ATTRIBUTE_SIZE}="${SPACER_SIZE_TAB}">${HAIR_SPACE_CHAR}</span>`
27
+ );
28
+
29
+ function replaceNOBR(matched: string): string {
30
+ // This is a workround to convert "_______" into none-wrapped text
31
+ // that apppears like a horizontal line.
32
+ if (matched && matched.length >= 20) {
33
+ // needs extra space after it so user can escape the <nobr />.
34
+ matched = `<nobr>${String(matched)}</nobr> `;
35
+ }
36
+ return matched;
37
+ }
38
+
39
+ export default function normalizeHTML(html: string): string {
40
+ let body: ?HTMLElement = null;
41
+
42
+ const sourceIsPage = HTML_BODY_PATTERN.test(html);
43
+ html = html.replace(LONG_UNDERLINE_PATTERN, replaceNOBR);
44
+
45
+ // Convert every two consecutive "&nbsp;" into a spacer tab.
46
+ html = html.replace(LONG_TAB_SPACE_PATTERN, TAB_SPACER_HTML);
47
+ // fix for jspdf copy paste text, from jspdf its always getting transparent
48
+ html = html.replace(/color:\s*transparent;/g, 'color: black;');
49
+ const doc = toSafeHTMLDocument(html);
50
+ if (doc) {
51
+ // styles.
52
+ patchStyleElements(doc);
53
+ patchElementInlineStyles(doc);
54
+ // contents.
55
+ patchAnchorElements(doc);
56
+ patchBreakElements(doc);
57
+ patchListElements(doc);
58
+ patchParagraphElements(doc);
59
+ patchTableElements(doc);
60
+ patchMathElements(doc);
61
+ body = doc.getElementsByTagName('body')[0];
62
+
63
+ if (body && sourceIsPage) {
64
+ // Source HTML contains <body />, assumes this to be a complete
65
+ // page HTML. Assume this <body /> may contain the style that indicates
66
+ // page's layout.
67
+ const frag = doc.createElement('html');
68
+ frag.appendChild(body);
69
+ return frag.innerHTML;
70
+ }
71
+ }
72
+
73
+ if (!body) {
74
+ // <body /> should alway be generated by doc.
75
+ return 'Unsupported HTML content';
76
+ }
77
+
78
+ // HTML snippet only.
79
+ return '<body>' + body.innerHTML + '</body>';
80
+ }
package/package.json CHANGED
@@ -1,152 +1,152 @@
1
- {
2
- "name": "@modusoperandi/licit",
3
- "version": "1.4.2",
4
- "license": "MIT",
5
- "type": "module",
6
- "subversion": "1",
7
- "description": "Rich text editor built with React and ProseMirror",
8
- "main": "index.js",
9
- "style": "styles.css",
10
- "types": "index.d.ts",
11
- "repository": {
12
- "type": "git",
13
- "url": "git+https://github.com/MO-Movia/licit.git"
14
- },
15
- "scripts": {
16
- "test": "jest --coverage",
17
- "test:unit": "jest",
18
- "test:coverage": "jest --coverage",
19
- "build:bom": "cyclonedx-npm --ignore-npm-errors --short-PURLs --output-format XML --output-file dist/bom.xml",
20
- "build:clean": "rm -rf dist/ && rm -f modusoperandi-licit-*.*.*.tgz",
21
- "build:css": "cp src/ui/*.css dist/ui && cp src/client/*.css dist/client && cp src/*.css dist",
22
- "build:fonts": "mkdirp ./dist/fonts && cp -r src/fonts/* dist/fonts",
23
- "build:babel": "babel src --out-dir dist",
24
- "build:flow": "flow-copy-source -v -i '**/__tests__/**' src dist",
25
- "build:dist": "npm run build:clean && npm run build:babel && npm run build:flow && npm run build:css && npm run build:fonts && npm run build:bom && cp src/*.d.ts dist/",
26
- "build:licit": "node utils/build_bin.js",
27
- "ci:bom": "cyclonedx-npm --ignore-npm-errors --short-PURLs --output-format XML --output-file dist/bom.xml",
28
- "ci:build": "npm run build:clean && npm run build:babel && npm run build:flow && npm run build:css && npm run build:fonts && npm run build:bom && copyfiles --up 1 \"src/**/*.d.ts\" dist/ && copyfiles --up 1 \"src/**/*.css\" dist && copyfiles package.json LICENSE dist",
29
- "lint:css": "stylelint \"**/*.css\"",
30
- "lint:js": "eslint \"src/**/*.js\"",
31
- "lint": "npm run lint:css & npm run lint:js",
32
- "start": "node scripts/webserver.js",
33
- "prebuild:style-service-docker": "node utils/build_customstyle_server.js",
34
- "build:style-service-docker": "docker build . -f style-service.Dockerfile -t style-service:latest",
35
- "verify": "npm run lint -- --fix && npm run ci:build && npm run test:coverage && echo 'All Tests Passed!'"
36
- },
37
- "peerDependencies": {
38
- "@modusoperandi/licit-ui-commands": "^1.0.8",
39
- "prosemirror-collab": "^1.2.2",
40
- "prosemirror-tables": "^1.2.5"
41
- },
42
- "dependencies": {
43
- "@modusoperandi/color-picker": "^1.0.4",
44
- "browserkeymap": "^2.0.2",
45
- "flatted": "^3.1.0",
46
- "react-tooltip": "^5.28.0",
47
- "resize-observer-polyfill": "^1.5.1",
48
- "smooth-scroll-into-view-if-needed": "^2.0.2",
49
- "url": "^0.11.0",
50
- "webfontloader": "^1.6.28"
51
- },
52
- "devDependencies": {
53
- "@babel/cli": "^7.19.3",
54
- "@babel/core": "^7.19.3",
55
- "@babel/eslint-parser": "^7.19.1",
56
- "@babel/plugin-proposal-class-properties": "^7.18.6",
57
- "@babel/plugin-proposal-decorators": "^7.19.3",
58
- "@babel/plugin-proposal-do-expressions": "^7.18.6",
59
- "@babel/plugin-proposal-export-default-from": "^7.18.10",
60
- "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
61
- "@babel/plugin-proposal-function-sent": "^7.18.6",
62
- "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9",
63
- "@babel/plugin-proposal-object-rest-spread": "^7.19.4",
64
- "@babel/plugin-proposal-pipeline-operator": "^7.18.9",
65
- "@babel/plugin-proposal-throw-expressions": "^7.18.6",
66
- "@babel/plugin-syntax-dynamic-import": "^7.8.3",
67
- "@babel/plugin-syntax-import-meta": "^7.10.4",
68
- "@babel/plugin-transform-flow-strip-types": "^7.10.4",
69
- "@babel/plugin-transform-parameters": "^7.18.8",
70
- "@babel/plugin-transform-runtime": "^7.19.1",
71
- "@babel/preset-env": "^7.19.4",
72
- "@babel/preset-flow": "^7.10.4",
73
- "@babel/preset-react": "^7.18.6",
74
- "@cyclonedx/cyclonedx-npm": "^4.0.0",
75
- "babel-jest": "^30.0.2",
76
- "babel-loader": "^10.0.0",
77
- "babel-plugin-flow-react-proptypes": "^26.0.0",
78
- "babel-plugin-transform-react-remove-prop-types": "^0.4.24",
79
- "body-parser": "^2.2.0",
80
- "clean-webpack-plugin": "^4.0.0",
81
- "copy-webpack-plugin": "^13.0.0",
82
- "copyfiles": "^2.4.1",
83
- "cors": "^2.8.5",
84
- "css-loader": "^7.1.1",
85
- "eslint": "^9.20.1",
86
- "eslint-config-prettier": "^10.0.1",
87
- "eslint-plugin-jest": "^29.0.1",
88
- "eslint-plugin-prettier": "^5.1.3",
89
- "eslint-plugin-react": "^7.33.2",
90
- "exports-loader": "^5.0.0",
91
- "express": "^5.1.0",
92
- "file-loader": "^6.2.0",
93
- "flow-bin": "^0.276.0",
94
- "flow-copy-source": "^2.0.9",
95
- "flow-typed": "^4.0.0",
96
- "flow-webpack-plugin": "^1.2.0",
97
- "formidable": "^3.5.1",
98
- "globals": "^16.0.0",
99
- "html-loader": "^5.0.0",
100
- "html-webpack-inline-source-plugin": "1.0.0-beta.2",
101
- "html-webpack-plugin": "^5.5.0",
102
- "husky": "^9.0.10",
103
- "identity-obj-proxy": "^3.0.0",
104
- "jest": "^29.2.0",
105
- "jest-environment-jsdom": "^30.0.0",
106
- "jest-junit": "^16.0.0",
107
- "jest-prosemirror": "^3.0.0",
108
- "jest-sonar-reporter": "^2.0.0",
109
- "lint-staged": "^16.0.0",
110
- "mkdirp": "^3.0.1",
111
- "mv": "^2.1.1",
112
- "prettier": "^3.2.5",
113
- "style-loader": "^4.0.0",
114
- "stylelint": "^16.2.1",
115
- "stylelint-config-standard": "^38.0.0",
116
- "stylelint-prettier": "^5.0.0",
117
- "terser-webpack-plugin": "^5.3.10",
118
- "ts-jest": "^29.1.2",
119
- "ts-loader": "^9.5.0",
120
- "ts-node": "^10.9.2",
121
- "typescript": "5.8.3",
122
- "webpack": "^5.74.0",
123
- "webpack-cli": "^6.0.1",
124
- "webpack-dev-server": "^5.0.2",
125
- "write-file-webpack-plugin": "^4.5.1"
126
- },
127
- "overrides": {
128
- "libxmljs2": "^1.0.0"
129
- },
130
- "importSort": {
131
- ".js": {
132
- "parser": "babylon",
133
- "style": "module-grouping"
134
- }
135
- },
136
- "husky": {
137
- "hooks": {
138
- "pre-commit": "lint-staged"
139
- }
140
- },
141
- "lint-staged": {
142
- "*.css": [
143
- "stylelint --fix"
144
- ],
145
- "!(*test|*.setup).js": [
146
- "eslint --fix"
147
- ],
148
- "*.json": [
149
- "prettier --write"
150
- ]
151
- }
152
- }
1
+ {
2
+ "name": "@modusoperandi/licit",
3
+ "version": "1.4.6",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "subversion": "1",
7
+ "description": "Rich text editor built with React and ProseMirror",
8
+ "main": "index.js",
9
+ "style": "styles.css",
10
+ "types": "index.d.ts",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/MO-Movia/licit"
14
+ },
15
+ "scripts": {
16
+ "test": "jest --coverage",
17
+ "test:unit": "jest",
18
+ "test:coverage": "jest --coverage",
19
+ "build:bom": "cyclonedx-npm --ignore-npm-errors --short-PURLs --output-format XML --output-file dist/bom.xml",
20
+ "build:clean": "rm -rf dist/ && rm -f modusoperandi-licit-*.*.*.tgz",
21
+ "build:css": "cp src/ui/*.css dist/ui && cp src/client/*.css dist/client && cp src/*.css dist",
22
+ "build:fonts": "mkdirp ./dist/fonts && cp -r src/fonts/* dist/fonts",
23
+ "build:babel": "babel src --out-dir dist",
24
+ "build:flow": "flow-copy-source -v -i '**/__tests__/**' src dist",
25
+ "build:dist": "npm run build:clean && npm run build:babel && npm run build:flow && npm run build:css && npm run build:fonts && npm run build:bom && cp src/*.d.ts dist/",
26
+ "build:licit": "node utils/build_bin.js",
27
+ "ci:bom": "cyclonedx-npm --ignore-npm-errors --short-PURLs --output-format XML --output-file dist/bom.xml",
28
+ "ci:build": "npm run build:clean && npm run build:babel && npm run build:flow && npm run build:css && npm run build:fonts && npm run build:bom && copyfiles --up 1 \"src/**/*.d.ts\" dist/ && copyfiles --up 1 \"src/**/*.css\" dist && copyfiles package.json LICENSE dist",
29
+ "lint:css": "stylelint \"**/*.css\"",
30
+ "lint:js": "eslint \"src/**/*.js\"",
31
+ "lint": "npm run lint:css & npm run lint:js",
32
+ "start": "node scripts/webserver.js",
33
+ "prebuild:style-service-docker": "node utils/build_customstyle_server.js",
34
+ "build:style-service-docker": "docker build . -f style-service.Dockerfile -t style-service:latest",
35
+ "verify": "npm run lint -- --fix && npm run ci:build && npm run test:coverage && echo 'All Tests Passed!'"
36
+ },
37
+ "peerDependencies": {
38
+ "@modusoperandi/licit-ui-commands": "^1.0.8",
39
+ "prosemirror-collab": "^1.2.2",
40
+ "prosemirror-tables": "^1.2.5"
41
+ },
42
+ "dependencies": {
43
+ "@modusoperandi/color-picker": "^1.0.7",
44
+ "browserkeymap": "^2.0.2",
45
+ "flatted": "^3.3.3",
46
+ "react-tooltip": "^5.29.1",
47
+ "resize-observer-polyfill": "^1.5.1",
48
+ "smooth-scroll-into-view-if-needed": "^2.0.2",
49
+ "url": "^0.11.4",
50
+ "webfontloader": "^1.6.28"
51
+ },
52
+ "devDependencies": {
53
+ "@babel/cli": "^7.28.3",
54
+ "@babel/core": "^7.28.4",
55
+ "@babel/eslint-parser": "^7.28.4",
56
+ "@babel/plugin-proposal-class-properties": "^7.18.6",
57
+ "@babel/plugin-proposal-decorators": "^7.28.0",
58
+ "@babel/plugin-proposal-do-expressions": "^7.28.3",
59
+ "@babel/plugin-proposal-export-default-from": "^7.27.1",
60
+ "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
61
+ "@babel/plugin-proposal-function-sent": "^7.27.1",
62
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7",
63
+ "@babel/plugin-proposal-object-rest-spread": "^7.20.7",
64
+ "@babel/plugin-proposal-pipeline-operator": "^7.27.1",
65
+ "@babel/plugin-proposal-throw-expressions": "^7.27.1",
66
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
67
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
68
+ "@babel/plugin-transform-flow-strip-types": "^7.27.1",
69
+ "@babel/plugin-transform-parameters": "^7.27.7",
70
+ "@babel/plugin-transform-runtime": "^7.28.3",
71
+ "@babel/preset-env": "^7.28.3",
72
+ "@babel/preset-flow": "^7.27.1",
73
+ "@babel/preset-react": "^7.27.1",
74
+ "@cyclonedx/cyclonedx-npm": "^4.0.1",
75
+ "babel-jest": "^30.1.2",
76
+ "babel-loader": "^10.0.0",
77
+ "babel-plugin-flow-react-proptypes": "^26.0.0",
78
+ "babel-plugin-transform-react-remove-prop-types": "^0.4.24",
79
+ "body-parser": "^2.2.0",
80
+ "clean-webpack-plugin": "^4.0.0",
81
+ "copy-webpack-plugin": "^13.0.1",
82
+ "copyfiles": "^2.4.1",
83
+ "cors": "^2.8.5",
84
+ "css-loader": "^7.1.2",
85
+ "eslint": "^9.35.0",
86
+ "eslint-config-prettier": "^10.1.8",
87
+ "eslint-plugin-jest": "^29.0.1",
88
+ "eslint-plugin-prettier": "^5.5.4",
89
+ "eslint-plugin-react": "^7.37.5",
90
+ "exports-loader": "^5.0.0",
91
+ "express": "^5.1.0",
92
+ "file-loader": "^6.2.0",
93
+ "flow-bin": "^0.281.0",
94
+ "flow-copy-source": "^2.0.9",
95
+ "flow-typed": "^4.1.1",
96
+ "flow-webpack-plugin": "^1.2.0",
97
+ "formidable": "^3.5.4",
98
+ "globals": "^16.3.0",
99
+ "html-loader": "^5.1.0",
100
+ "html-webpack-inline-source-plugin": "1.0.0-beta.2",
101
+ "html-webpack-plugin": "^5.6.4",
102
+ "husky": "^9.1.7",
103
+ "identity-obj-proxy": "^3.0.0",
104
+ "jest": "^29.7.0",
105
+ "jest-environment-jsdom": "^30.1.2",
106
+ "jest-junit": "^16.0.0",
107
+ "jest-prosemirror": "^3.0.1",
108
+ "jest-sonar-reporter": "^2.0.0",
109
+ "lint-staged": "^16.1.6",
110
+ "mkdirp": "^3.0.1",
111
+ "mv": "^2.1.1",
112
+ "prettier": "^3.6.2",
113
+ "style-loader": "^4.0.0",
114
+ "stylelint": "^16.24.0",
115
+ "stylelint-config-standard": "^39.0.0",
116
+ "stylelint-prettier": "^5.0.3",
117
+ "terser-webpack-plugin": "^5.3.14",
118
+ "ts-jest": "^29.4.1",
119
+ "ts-loader": "^9.5.4",
120
+ "ts-node": "^10.9.2",
121
+ "typescript": "5.9.2",
122
+ "webpack": "^5.101.3",
123
+ "webpack-cli": "^6.0.1",
124
+ "webpack-dev-server": "^5.2.2",
125
+ "write-file-webpack-plugin": "^4.5.1"
126
+ },
127
+ "overrides": {
128
+ "libxmljs2": "^1.0.0"
129
+ },
130
+ "importSort": {
131
+ ".js": {
132
+ "parser": "babylon",
133
+ "style": "module-grouping"
134
+ }
135
+ },
136
+ "husky": {
137
+ "hooks": {
138
+ "pre-commit": "lint-staged"
139
+ }
140
+ },
141
+ "lint-staged": {
142
+ "*.css": [
143
+ "stylelint --fix"
144
+ ],
145
+ "!(*test|*.setup).js": [
146
+ "eslint --fix"
147
+ ],
148
+ "*.json": [
149
+ "prettier --write"
150
+ ]
151
+ }
152
+ }
@@ -1,38 +1,38 @@
1
- // @flow
2
-
3
- import {
4
- ATTRIBUTE_BOOKMARK_ID,
5
- ATTRIBUTE_BOOKMARK_VISIBLE,
6
- } from './BookmarkNodeSpec.js';
7
-
8
- const BLOCK_NODE_NAME_PATTERN = /(P|H1|H2|H3|H4|H5|H6)/;
9
-
10
- export default function patchAnchorElements(doc: Document): void {
11
- Array.from(doc.querySelectorAll('a[id]')).forEach(patchAnchorElement);
12
- }
13
-
14
- function patchAnchorElement(node: HTMLElement): void {
15
- const { id } = node;
16
- if (id && node.childElementCount === 0) {
17
- // This looks like a bookmark generated from Google Doc, will render
18
- // this as BookmarkNode.
19
- node.setAttribute(ATTRIBUTE_BOOKMARK_ID, id);
20
-
21
- // Google Doc always inject anchor links before <table />.
22
- // <a id="t.3060ecccc199a88a1e4cc1252769f957b88f2207"></a>
23
- // <a id="t.0"></a>
24
- // <table class="c23">
25
- // and these anchor link should not be visible.
26
- const visible = !node.id.startsWith('t.');
27
-
28
- visible && node.setAttribute(ATTRIBUTE_BOOKMARK_VISIBLE, 'true');
29
- }
30
- const nextNode = node.nextElementSibling;
31
- if (!nextNode) {
32
- return;
33
- }
34
- // If this is next to a block element, make that block element the bookmark.
35
- if (BLOCK_NODE_NAME_PATTERN.test(nextNode.nodeName)) {
36
- nextNode.insertBefore(node, nextNode.firstChild);
37
- }
38
- }
1
+ // @flow
2
+
3
+ import {
4
+ ATTRIBUTE_BOOKMARK_ID,
5
+ ATTRIBUTE_BOOKMARK_VISIBLE,
6
+ } from './BookmarkNodeSpec.js';
7
+
8
+ const BLOCK_NODE_NAME_PATTERN = /(P|H1|H2|H3|H4|H5|H6)/;
9
+
10
+ export default function patchAnchorElements(doc: Document): void {
11
+ Array.from(doc.querySelectorAll('a[id]')).forEach(patchAnchorElement);
12
+ }
13
+
14
+ function patchAnchorElement(node: HTMLElement): void {
15
+ const { id } = node;
16
+ if (id && node.childElementCount === 0) {
17
+ // This looks like a bookmark generated from Google Doc, will render
18
+ // this as BookmarkNode.
19
+ node.setAttribute(ATTRIBUTE_BOOKMARK_ID, id);
20
+
21
+ // Google Doc always inject anchor links before <table />.
22
+ // <a id="t.3060ecccc199a88a1e4cc1252769f957b88f2207"></a>
23
+ // <a id="t.0"></a>
24
+ // <table class="c23">
25
+ // and these anchor link should not be visible.
26
+ const visible = !node.id.startsWith('t.');
27
+
28
+ visible && node.setAttribute(ATTRIBUTE_BOOKMARK_VISIBLE, 'true');
29
+ }
30
+ const nextNode = node.nextElementSibling;
31
+ if (!nextNode) {
32
+ return;
33
+ }
34
+ // If this is next to a block element, make that block element the bookmark.
35
+ if (BLOCK_NODE_NAME_PATTERN.test(nextNode.nodeName)) {
36
+ nextNode.insertBefore(node, nextNode.firstChild);
37
+ }
38
+ }
@@ -1,22 +1,22 @@
1
- // @flow
2
-
3
- export default function patchBreakElements(doc: Document): void {
4
- // This is a workaround to handle HTML converted from DraftJS that
5
- // `<div><span><br /></span><div>` becomes `<p><br /><br /></p>`.
6
- // Block with single `<br />` inside should be collapsed into `<p />`.
7
- const selector = 'div > span:only-child > br:only-child';
8
- Array.from(doc.querySelectorAll(selector)).forEach(patchBreakElement);
9
- }
10
-
11
- function patchBreakElement(brElement: HTMLElement): void {
12
- const { ownerDocument, parentElement } = brElement;
13
- if (!ownerDocument || !parentElement) {
14
- return;
15
- }
16
- const div = brElement.parentElement?.parentElement;
17
- if (!div) {
18
- return;
19
- }
20
- const pp = ownerDocument.createElement('p');
21
- div.parentElement?.replaceChild(pp, div);
22
- }
1
+ // @flow
2
+
3
+ export default function patchBreakElements(doc: Document): void {
4
+ // This is a workaround to handle HTML converted from DraftJS that
5
+ // `<div><span><br /></span><div>` becomes `<p><br /><br /></p>`.
6
+ // Block with single `<br />` inside should be collapsed into `<p />`.
7
+ const selector = 'div > span:only-child > br:only-child';
8
+ Array.from(doc.querySelectorAll(selector)).forEach(patchBreakElement);
9
+ }
10
+
11
+ function patchBreakElement(brElement: HTMLElement): void {
12
+ const { ownerDocument, parentElement } = brElement;
13
+ if (!ownerDocument || !parentElement) {
14
+ return;
15
+ }
16
+ const div = brElement.parentElement?.parentElement;
17
+ if (!div) {
18
+ return;
19
+ }
20
+ const pp = ownerDocument.createElement('p');
21
+ div.parentElement?.replaceChild(pp, div);
22
+ }