@ebl-vue/editor-full 1.0.8

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 (101) hide show
  1. package/.postcssrc.yml +33 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1 -0
  4. package/dist/index.d.ts +5 -0
  5. package/dist/index.mjs +2565 -0
  6. package/dist/index.mjs.map +1 -0
  7. package/package.json +55 -0
  8. package/postcss.config.js +15 -0
  9. package/src/components/Editor/Editor.vue +209 -0
  10. package/src/components/index.ts +27 -0
  11. package/src/constants/index.ts +1 -0
  12. package/src/i18n/zh-cn.ts +151 -0
  13. package/src/icons/index.ts +78 -0
  14. package/src/index.ts +11 -0
  15. package/src/installer.ts +22 -0
  16. package/src/plugins/alert/index.css +150 -0
  17. package/src/plugins/alert/index.ts +463 -0
  18. package/src/plugins/block-alignment/index.css +9 -0
  19. package/src/plugins/block-alignment/index.ts +116 -0
  20. package/src/plugins/block-alignment/readme.md +1 -0
  21. package/src/plugins/code/LICENSE +21 -0
  22. package/src/plugins/code/index.css +120 -0
  23. package/src/plugins/code/index.ts +530 -0
  24. package/src/plugins/code/utils/string.ts +34 -0
  25. package/src/plugins/color-picker/index.ts +138 -0
  26. package/src/plugins/color-picker/styles.css +27 -0
  27. package/src/plugins/delimiter/index.css +14 -0
  28. package/src/plugins/delimiter/index.ts +122 -0
  29. package/src/plugins/drag-drop/index.css +19 -0
  30. package/src/plugins/drag-drop/index.ts +151 -0
  31. package/src/plugins/drag-drop/readme.md +1 -0
  32. package/src/plugins/header/H1.ts +405 -0
  33. package/src/plugins/header/H2.ts +403 -0
  34. package/src/plugins/header/H3.ts +404 -0
  35. package/src/plugins/header/H4.ts +405 -0
  36. package/src/plugins/header/H5.ts +405 -0
  37. package/src/plugins/header/H6.ts +406 -0
  38. package/src/plugins/header/index.css +20 -0
  39. package/src/plugins/header/index.ts +15 -0
  40. package/src/plugins/header/types.d.ts +46 -0
  41. package/src/plugins/indent/index.css +86 -0
  42. package/src/plugins/indent/index.ts +697 -0
  43. package/src/plugins/inline-code/index.css +11 -0
  44. package/src/plugins/inline-code/index.ts +205 -0
  45. package/src/plugins/list/ListRenderer/ChecklistRenderer.ts +211 -0
  46. package/src/plugins/list/ListRenderer/ListRenderer.ts +73 -0
  47. package/src/plugins/list/ListRenderer/OrderedListRenderer.ts +123 -0
  48. package/src/plugins/list/ListRenderer/UnorderedListRenderer.ts +123 -0
  49. package/src/plugins/list/ListRenderer/index.ts +6 -0
  50. package/src/plugins/list/ListTabulator/index.ts +1179 -0
  51. package/src/plugins/list/index.ts +502 -0
  52. package/src/plugins/list/styles/CssPrefix.ts +4 -0
  53. package/src/plugins/list/styles/icons/index.ts +10 -0
  54. package/src/plugins/list/styles/input.css +36 -0
  55. package/src/plugins/list/styles/list.css +165 -0
  56. package/src/plugins/list/types/Elements.ts +14 -0
  57. package/src/plugins/list/types/ItemMeta.ts +40 -0
  58. package/src/plugins/list/types/ListParams.ts +102 -0
  59. package/src/plugins/list/types/ListRenderer.ts +6 -0
  60. package/src/plugins/list/types/OlCounterType.ts +63 -0
  61. package/src/plugins/list/types/index.ts +14 -0
  62. package/src/plugins/list/utils/focusItem.ts +18 -0
  63. package/src/plugins/list/utils/getChildItems.ts +40 -0
  64. package/src/plugins/list/utils/getItemChildWrapper.ts +10 -0
  65. package/src/plugins/list/utils/getItemContentElement.ts +10 -0
  66. package/src/plugins/list/utils/getSiblings.ts +52 -0
  67. package/src/plugins/list/utils/isLastItem.ts +9 -0
  68. package/src/plugins/list/utils/itemHasSublist.ts +10 -0
  69. package/src/plugins/list/utils/normalizeData.ts +84 -0
  70. package/src/plugins/list/utils/removeChildWrapperIfEmpty.ts +31 -0
  71. package/src/plugins/list/utils/renderToolboxInput.ts +105 -0
  72. package/src/plugins/list/utils/stripNumbers.ts +7 -0
  73. package/src/plugins/list/utils/type-guards.ts +8 -0
  74. package/src/plugins/list.md +15 -0
  75. package/src/plugins/marker/index.css +4 -0
  76. package/src/plugins/marker/index.ts +187 -0
  77. package/src/plugins/paragraph/index.css +23 -0
  78. package/src/plugins/paragraph/index.ts +380 -0
  79. package/src/plugins/paragraph/types/icons.d.ts +4 -0
  80. package/src/plugins/paragraph/utils/makeFragment.ts +17 -0
  81. package/src/plugins/quote/index.css +26 -0
  82. package/src/plugins/quote/index.ts +206 -0
  83. package/src/plugins/table/index.ts +4 -0
  84. package/src/plugins/table/plugin.ts +254 -0
  85. package/src/plugins/table/style.css +388 -0
  86. package/src/plugins/table/table.ts +1192 -0
  87. package/src/plugins/table/toolbox.ts +165 -0
  88. package/src/plugins/table/utils/dom.ts +128 -0
  89. package/src/plugins/table/utils/popover.ts +172 -0
  90. package/src/plugins/table/utils/throttled.ts +22 -0
  91. package/src/plugins/underline/index.css +3 -0
  92. package/src/plugins/underline/index.ts +216 -0
  93. package/src/plugins/undo/index.ts +509 -0
  94. package/src/plugins/undo/observer.ts +101 -0
  95. package/src/style.css +89 -0
  96. package/src/utils/index.ts +15 -0
  97. package/src/utils/install.ts +19 -0
  98. package/tsconfig.json +37 -0
  99. package/types/index.d.ts +13 -0
  100. package/types/plugins/index.d.ts +0 -0
  101. package/vite.config.ts +79 -0
@@ -0,0 +1,404 @@
1
+ /**
2
+ * Build styles
3
+ */
4
+ import './index.css';
5
+
6
+
7
+ import { API, PasteEvent } from '@ebl-vue/editorjs';
8
+ import type { HeaderData, HeaderConfig, Level } from './types';
9
+ import type { BlockTool, BlockToolConstructorOptions } from '@ebl-vue/editorjs';
10
+
11
+
12
+
13
+ const IconH3: string = `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M6 7L6 12M6 17L6 12M6 12L12 12M12 7V12M12 17L12 12"/><path stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M16 11C16 10.5 16.8323 10 17.6 10C18.3677 10 19.5 10.311 19.5 11.5C19.5 12.5315 18.7474 12.9022 18.548 12.9823C18.5378 12.9864 18.5395 13.0047 18.5503 13.0063C18.8115 13.0456 20 13.3065 20 14.8C20 16 19.5 17 17.8 17C17.8 17 16 17 16 16.3"/></svg>`;
14
+
15
+ /**
16
+ * Header block for the Editor.js.
17
+ *
18
+ * @author CodeX (team@ifmo.su)
19
+ * @copyright CodeX 2018
20
+ * @license MIT
21
+ * @version 2.0.0
22
+ */
23
+ export default class H3 implements BlockTool {
24
+ /**
25
+ * Render plugin`s main Element and fill it with saved data
26
+ *
27
+ * @param {{data: HeaderData, config: HeaderConfig, api: object}}
28
+ * data — previously saved data
29
+ * config - user config for Tool
30
+ * api - Editor.js API
31
+ * readOnly - read only mode flag
32
+ */
33
+ /**
34
+ * Editor.js API
35
+ * @private
36
+ */
37
+ private api: API;
38
+ /**
39
+ * Read-only mode flag
40
+ * @private
41
+ */
42
+ private readOnly: boolean;
43
+ /**
44
+ * Tool's settings passed from Editor
45
+ * @private
46
+ */
47
+ private _settings: HeaderConfig;
48
+ /**
49
+ * Block's data
50
+ * @private
51
+ */
52
+ private _data: HeaderData;
53
+ /**
54
+ * Main Block wrapper
55
+ * @private
56
+ */
57
+ private _element: HTMLHeadingElement;
58
+
59
+
60
+
61
+ constructor({ data, config, api, readOnly }: BlockToolConstructorOptions) {
62
+ this.api = api;
63
+ this.readOnly = readOnly;
64
+
65
+ /**
66
+ * Tool's settings passed from Editor
67
+ *
68
+ * @type {HeaderConfig}
69
+ * @private
70
+ */
71
+ this._settings={placeholder:"H3"};
72
+
73
+ /**
74
+ * Block's data
75
+ *
76
+ * @type {HeaderData}
77
+ * @private
78
+ */
79
+ this._data = this.normalizeData(data);
80
+
81
+ /**
82
+ * Main Block wrapper
83
+ *
84
+ * @type {HTMLElement}
85
+ * @private
86
+ */
87
+ this._element = this.getTag();
88
+ }
89
+ /**
90
+ * Styles
91
+ */
92
+ private get _CSS() {
93
+ return {
94
+ block: this.api.styles.block,
95
+ wrapper: 'ce-header',
96
+ };
97
+ }
98
+
99
+ /**
100
+ * Check if data is valid
101
+ *
102
+ * @param {any} data - data to check
103
+ * @returns {data is HeaderData}
104
+ * @private
105
+ */
106
+ isHeaderData(data: any): data is HeaderData {
107
+ return (data as HeaderData).text !== undefined;
108
+ }
109
+
110
+ /**
111
+ * Normalize input data
112
+ *
113
+ * @param {HeaderData} data - saved data to process
114
+ *
115
+ * @returns {HeaderData}
116
+ * @private
117
+ */
118
+ normalizeData(data: HeaderData | {}): HeaderData {
119
+ const newData: HeaderData = { text: '', level: this.defaultLevel.number };
120
+
121
+ if (this.isHeaderData(data)) {
122
+ newData.text = data.text || '';
123
+
124
+ if (data.level !== undefined && !isNaN(parseInt(data.level.toString()))) {
125
+ newData.level = parseInt(data.level.toString());
126
+ }
127
+ }
128
+
129
+ return newData;
130
+ }
131
+
132
+ /**
133
+ * Return Tool's view
134
+ *
135
+ * @returns {HTMLHeadingElement}
136
+ * @public
137
+ */
138
+ render(): HTMLHeadingElement {
139
+ return this._element;
140
+ }
141
+
142
+
143
+ /**
144
+ * Callback for Block's settings buttons
145
+ *
146
+ * @param {number} level - level to set
147
+ */
148
+ setLevel(level: number): void {
149
+ this.data = {
150
+ level: level,
151
+ text: this.data.text,
152
+ };
153
+ }
154
+
155
+ /**
156
+ * Method that specified how to merge two Text blocks.
157
+ * Called by Editor.js by backspace at the beginning of the Block
158
+ *
159
+ * @param {HeaderData} data - saved data to merger with current block
160
+ * @public
161
+ */
162
+ merge(data: HeaderData): void {
163
+ this._element.insertAdjacentHTML('beforeend', data.text)
164
+ }
165
+
166
+ /**
167
+ * Validate Text block data:
168
+ * - check for emptiness
169
+ *
170
+ * @param {HeaderData} blockData — data received after saving
171
+ * @returns {boolean} false if saved data is not correct, otherwise true
172
+ * @public
173
+ */
174
+ validate(blockData: HeaderData): boolean {
175
+ return blockData.text.trim() !== '';
176
+ }
177
+
178
+ /**
179
+ * Extract Tool's data from the view
180
+ *
181
+ * @param {HTMLHeadingElement} toolsContent - Text tools rendered view
182
+ * @returns {HeaderData} - saved data
183
+ * @public
184
+ */
185
+ save(toolsContent: HTMLHeadingElement): HeaderData {
186
+ return {
187
+ text: toolsContent.innerHTML,
188
+ level: this.defaultLevel.number,
189
+ };
190
+ }
191
+
192
+ /**
193
+ * Allow Header to be converted to/from other blocks
194
+ */
195
+ static get conversionConfig() {
196
+ return {
197
+ export: 'text', // use 'text' property for other blocks
198
+ import: 'text', // fill 'text' property from other block's export string
199
+ };
200
+ }
201
+
202
+ /**
203
+ * Sanitizer Rules
204
+ */
205
+ static get sanitize() {
206
+ return {
207
+ level: false,
208
+ text: {},
209
+ };
210
+ }
211
+
212
+ /**
213
+ * Returns true to notify core that read-only is supported
214
+ *
215
+ * @returns {boolean}
216
+ */
217
+ static get isReadOnlySupported() {
218
+ return true;
219
+ }
220
+
221
+ /**
222
+ * Get current Tools`s data
223
+ *
224
+ * @returns {HeaderData} Current data
225
+ * @private
226
+ */
227
+ get data(): HeaderData {
228
+ this._data.text = this._element.innerHTML;
229
+ this._data.level = this.defaultLevel.number;
230
+
231
+ return this._data;
232
+ }
233
+
234
+ /**
235
+ * Store data in plugin:
236
+ * - at the this._data property
237
+ * - at the HTML
238
+ *
239
+ * @param {HeaderData} data — data to set
240
+ * @private
241
+ */
242
+ set data(data: HeaderData) {
243
+ this._data = this.normalizeData(data);
244
+
245
+ /**
246
+ * If level is set and block in DOM
247
+ * then replace it to a new block
248
+ */
249
+ if (data.level !== undefined && this._element.parentNode) {
250
+ /**
251
+ * Create a new tag
252
+ *
253
+ * @type {HTMLHeadingElement}
254
+ */
255
+ const newHeader = this.getTag();
256
+
257
+ /**
258
+ * Save Block's content
259
+ */
260
+ newHeader.innerHTML = this._element.innerHTML;
261
+
262
+ /**
263
+ * Replace blocks
264
+ */
265
+ this._element.parentNode.replaceChild(newHeader, this._element);
266
+
267
+ /**
268
+ * Save new block to private variable
269
+ *
270
+ * @type {HTMLHeadingElement}
271
+ * @private
272
+ */
273
+ this._element = newHeader;
274
+ }
275
+
276
+ /**
277
+ * If data.text was passed then update block's content
278
+ */
279
+ if (data.text !== undefined) {
280
+ this._element.innerHTML = this._data.text || '';
281
+ }
282
+ }
283
+
284
+ /**
285
+ * Get tag for target level
286
+ * By default returns second-leveled header
287
+ *
288
+ * @returns {HTMLElement}
289
+ */
290
+ getTag(): HTMLHeadingElement {
291
+ const tag = this.createHeadingElement();
292
+ this.setElementContent(tag);
293
+ this.addStylesToElement(tag);
294
+ this.setEditability(tag);
295
+ this.addPlaceholder(tag);
296
+ return tag;
297
+ }
298
+
299
+ /**
300
+ * 创建标题元素
301
+ * @returns {HTMLHeadingElement} 创建的HTML标题元素
302
+ * @private
303
+ */
304
+ private createHeadingElement(): HTMLHeadingElement {
305
+ return document.createElement(this.defaultLevel.tag) as HTMLHeadingElement;
306
+ }
307
+
308
+ /**
309
+ * 设置元素内容
310
+ * @param {HTMLHeadingElement} element - 要设置内容的HTML标题元素
311
+ * @private
312
+ */
313
+ private setElementContent(element: HTMLHeadingElement): void {
314
+ element.innerHTML = this._data.text || '';
315
+ }
316
+
317
+ /**
318
+ * 为元素添加样式类
319
+ * @param {HTMLHeadingElement} element - 要添加样式的HTML标题元素
320
+ * @private
321
+ */
322
+ private addStylesToElement(element: HTMLHeadingElement): void {
323
+ element.classList.add(this._CSS.wrapper);
324
+ }
325
+
326
+ /**
327
+ * 设置元素可编辑属性
328
+ * @param {HTMLHeadingElement} element - 要设置编辑属性的HTML标题元素
329
+ * @private
330
+ */
331
+ private setEditability(element: HTMLHeadingElement): void {
332
+ element.contentEditable = this.readOnly ? 'false' : 'true';
333
+ }
334
+
335
+ /**
336
+ * 为元素添加占位符文本
337
+ * @param {HTMLHeadingElement} element - 要添加占位符的HTML标题元素
338
+ * @private
339
+ */
340
+ private addPlaceholder(element: HTMLHeadingElement): void {
341
+ element.dataset.placeholder = this.api.i18n.t(this._settings.placeholder || '');
342
+ }
343
+
344
+
345
+
346
+ /**
347
+ * Return default level
348
+ *
349
+ * @returns {level}
350
+ */
351
+ get defaultLevel(): Level {
352
+ return {
353
+ number: 3,
354
+ tag: 'H3',
355
+ svg: IconH3,
356
+ };
357
+ }
358
+
359
+
360
+
361
+
362
+ /**
363
+ * Handle H1-H6 tags on paste to substitute it with header Tool
364
+ *
365
+ * @param {PasteEvent} event - event with pasted content
366
+ */
367
+ onPaste(event: PasteEvent): void {
368
+ const detail = event.detail;
369
+
370
+ if ('data' in detail) {
371
+ const content = detail.data as HTMLElement;
372
+ this.data = {
373
+ level: 3,
374
+ text: content.innerHTML,
375
+ };
376
+ }
377
+ }
378
+
379
+ /**
380
+ * Used by Editor.js paste handling API.
381
+ * Provides configuration to handle H1-H6 tags.
382
+ *
383
+ * @returns {{handler: (function(HTMLElement): {text: string}), tags: string[]}}
384
+ */
385
+ static get pasteConfig() {
386
+ return {
387
+ tags: ['H3'],
388
+ };
389
+ }
390
+
391
+ /**
392
+ * Get Tool toolbox settings
393
+ * icon - Tool icon's SVG
394
+ * title - title to show in toolbox
395
+ *
396
+ * @returns {{icon: string, title: string}}
397
+ */
398
+ static get toolbox() {
399
+ return {
400
+ icon: IconH3,
401
+ title: 'H3',
402
+ };
403
+ }
404
+ }