@zipify/wysiwyg 1.0.0-dev.16 → 1.0.0-dev.19

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 (100) hide show
  1. package/.github/dependabot.yaml +1 -0
  2. package/dist/wysiwyg.css +293 -12
  3. package/dist/wysiwyg.js +1 -1
  4. package/example/ExampleApp.vue +6 -2
  5. package/example/pageBlocks.js +31 -0
  6. package/example/presets.js +2 -2
  7. package/lib/Wysiwyg.vue +16 -6
  8. package/lib/assets/icons/link.svg +3 -0
  9. package/lib/assets/icons/unlink.svg +3 -0
  10. package/lib/components/base/Button.vue +21 -1
  11. package/lib/components/base/Checkbox.vue +89 -0
  12. package/lib/components/base/FieldLabel.vue +2 -1
  13. package/lib/components/base/Icon.vue +2 -2
  14. package/lib/components/base/Modal.vue +0 -1
  15. package/lib/components/base/TextField.vue +106 -0
  16. package/lib/components/base/__tests__/TextField.test.js +57 -0
  17. package/lib/components/base/__tests__/__snapshots__/TextField.test.js.snap +9 -0
  18. package/lib/components/base/composables/index.js +1 -0
  19. package/lib/components/base/composables/useValidator.js +19 -0
  20. package/lib/components/base/dropdown/Dropdown.vue +15 -3
  21. package/lib/components/base/dropdown/DropdownActivator.vue +19 -3
  22. package/lib/components/base/index.js +3 -1
  23. package/lib/components/toolbar/Toolbar.vue +48 -8
  24. package/lib/components/toolbar/ToolbarFull.vue +10 -2
  25. package/lib/components/toolbar/__tests__/Toolbar.test.js +6 -0
  26. package/lib/components/toolbar/controls/FontSizeControl.vue +7 -0
  27. package/lib/components/toolbar/controls/UnderlineControl.vue +2 -2
  28. package/lib/components/toolbar/controls/__tests__/UnderlineControl.test.js +4 -0
  29. package/lib/components/toolbar/controls/index.js +1 -0
  30. package/lib/components/toolbar/controls/link/LinkControl.vue +152 -0
  31. package/lib/components/toolbar/controls/link/LinkControlApply.vue +35 -0
  32. package/lib/components/toolbar/controls/link/LinkControlHeader.vue +67 -0
  33. package/lib/components/toolbar/controls/link/composables/index.js +1 -0
  34. package/lib/components/toolbar/controls/link/composables/useLink.js +61 -0
  35. package/lib/components/toolbar/controls/link/destination/LinkControlDestination.vue +103 -0
  36. package/lib/components/toolbar/controls/link/destination/LinkControlPageBlock.vue +54 -0
  37. package/lib/components/toolbar/controls/link/destination/LinkControlUrl.vue +52 -0
  38. package/lib/components/toolbar/controls/link/destination/index.js +1 -0
  39. package/lib/components/toolbar/controls/link/index.js +1 -0
  40. package/lib/composables/__tests__/useEditor.test.js +2 -2
  41. package/lib/composables/useEditor.js +4 -5
  42. package/lib/composables/useToolbar.js +15 -19
  43. package/lib/enums/LinkDestinations.js +4 -0
  44. package/lib/enums/LinkTargets.js +4 -0
  45. package/lib/enums/TextSettings.js +3 -1
  46. package/lib/enums/index.js +2 -0
  47. package/lib/extensions/Alignment.js +18 -6
  48. package/lib/extensions/BackgroundColor.js +14 -6
  49. package/lib/extensions/FontColor.js +14 -6
  50. package/lib/extensions/FontFamily.js +25 -8
  51. package/lib/extensions/FontSize.js +26 -13
  52. package/lib/extensions/FontStyle.js +23 -13
  53. package/lib/extensions/FontWeight.js +22 -14
  54. package/lib/extensions/LineHeight.js +11 -3
  55. package/lib/extensions/Link.js +101 -0
  56. package/lib/extensions/StylePreset.js +4 -2
  57. package/lib/extensions/TextDecoration.js +27 -12
  58. package/lib/extensions/__tests__/Alignment.test.js +11 -5
  59. package/lib/extensions/__tests__/BackgroundColor.test.js +11 -5
  60. package/lib/extensions/__tests__/CaseStyle.test.js +3 -5
  61. package/lib/extensions/__tests__/FontColor.test.js +11 -5
  62. package/lib/extensions/__tests__/FontFamily.test.js +32 -7
  63. package/lib/extensions/__tests__/FontSize.test.js +11 -5
  64. package/lib/extensions/__tests__/FontStyle.test.js +11 -5
  65. package/lib/extensions/__tests__/FontWeight.test.js +11 -5
  66. package/lib/extensions/__tests__/LineHeight.test.js +11 -5
  67. package/lib/extensions/__tests__/StylePreset.test.js +70 -6
  68. package/lib/extensions/__tests__/TextDecoration.test.js +27 -5
  69. package/lib/extensions/__tests__/__snapshots__/Alignment.test.js.snap +26 -2
  70. package/lib/extensions/__tests__/__snapshots__/BackgroundColor.test.js.snap +30 -1
  71. package/lib/extensions/__tests__/__snapshots__/FontColor.test.js.snap +18 -1
  72. package/lib/extensions/__tests__/__snapshots__/FontFamily.test.js.snap +88 -1
  73. package/lib/extensions/__tests__/__snapshots__/FontSize.test.js.snap +33 -2
  74. package/lib/extensions/__tests__/__snapshots__/FontStyle.test.js.snap +25 -4
  75. package/lib/extensions/__tests__/__snapshots__/FontWeight.test.js.snap +30 -1
  76. package/lib/extensions/__tests__/__snapshots__/LineHeight.test.js.snap +26 -2
  77. package/lib/extensions/__tests__/__snapshots__/StylePreset.test.js.snap +6 -2
  78. package/lib/extensions/__tests__/__snapshots__/TextDecoration.test.js.snap +93 -3
  79. package/lib/extensions/core/CopyPasteProcessor.js +10 -0
  80. package/lib/extensions/core/TextProcessor.js +10 -0
  81. package/lib/extensions/core/__tests__/NodeProcessor.test.js +3 -5
  82. package/lib/extensions/core/__tests__/SelectionProcessor.test.js +3 -5
  83. package/lib/extensions/core/__tests__/TextProcessor.test.js +138 -12
  84. package/lib/extensions/core/__tests__/__snapshots__/TextProcessor.test.js.snap +26 -0
  85. package/lib/extensions/core/index.js +11 -2
  86. package/lib/extensions/core/plugins/PastePlugin.js +48 -0
  87. package/lib/extensions/core/plugins/ProseMirrorPlugin.js +20 -0
  88. package/lib/extensions/core/plugins/index.js +1 -0
  89. package/lib/extensions/index.js +41 -34
  90. package/lib/extensions/list/__tests__/List.test.js +3 -5
  91. package/lib/extensions/list/__tests__/__snapshots__/List.test.js.snap +45 -15
  92. package/lib/injectionTokens.js +2 -1
  93. package/lib/services/ContentNormalizer.js +62 -20
  94. package/lib/services/__tests__/ContentNormalizer.test.js +40 -7
  95. package/lib/styles/content.css +96 -9
  96. package/lib/styles/helpers/offsets.css +16 -0
  97. package/lib/styles/variables.css +6 -0
  98. package/lib/utils/__tests__/__snapshots__/renderInlineSetting.test.js.snap +4 -4
  99. package/lib/utils/renderInlineSetting.js +1 -1
  100. package/package.json +11 -9
@@ -13,10 +13,10 @@ export const TextDecoration = Mark.create({
13
13
 
14
14
  addCommands() {
15
15
  return {
16
- isUnderline: createCommand(({ commands }) => {
16
+ isUnderline: createCommand(({ commands, editor }) => {
17
17
  const decoration = commands.getTextDecoration();
18
18
 
19
- return computed(() => decoration.value.underline);
19
+ return computed(() => editor.isActive('link') || decoration.value.underline);
20
20
  }),
21
21
 
22
22
  isStrikeThrough: createCommand(({ commands }) => {
@@ -51,7 +51,9 @@ export const TextDecoration = Mark.create({
51
51
  });
52
52
  }),
53
53
 
54
- toggleUnderline: createCommand(({ commands }) => {
54
+ toggleUnderline: createCommand(({ commands, editor }) => {
55
+ if (editor.isActive('link')) return;
56
+
55
57
  commands.toggleTextDecoration('underline');
56
58
  }),
57
59
 
@@ -86,16 +88,29 @@ export const TextDecoration = Mark.create({
86
88
  'Mod-U': createKeyboardShortcut('toggleUnderline')
87
89
  }),
88
90
 
89
- parseHTML: () => [
90
- {
91
- style: 'text-decoration-line',
91
+ parseHTML() {
92
+ const getAttrs = (value) => {
93
+ const underline = value.includes('underline');
94
+ const strike_through = value.includes('line-through');
92
95
 
93
- getAttrs: (value) => ({
94
- underline: value.includes('underline'),
95
- strike_through: value.includes('line-through')
96
- })
97
- }
98
- ],
96
+ if (!underline && !strike_through) {
97
+ return false;
98
+ }
99
+
100
+ return { underline, strike_through };
101
+ };
102
+
103
+ return [
104
+ {
105
+ style: '--zw-text-decoration',
106
+ getAttrs
107
+ },
108
+ {
109
+ style: 'text-decoration-line',
110
+ getAttrs
111
+ }
112
+ ];
113
+ },
99
114
 
100
115
  renderHTML({ HTMLAttributes: attrs }) {
101
116
  const decorations = [];
@@ -2,11 +2,11 @@ import { Editor, Extension } from '@tiptap/vue-2';
2
2
  import { ref } from '@vue/composition-api';
3
3
  import { NodeFactory } from '../../__tests__/utils';
4
4
  import { createCommand } from '../../utils';
5
- import { CORE_EXTENSIONS } from '../core';
6
5
  import { Alignment } from '../Alignment';
7
6
  import { DeviceManager } from '../DeviceManager';
8
7
  import { Alignments } from '../../enums';
9
8
  import { ContentNormalizer } from '../../services';
9
+ import { buildCoreExtensions } from '../core';
10
10
 
11
11
  const MockStylePreset = Extension.create({
12
12
  name: 'style_preset',
@@ -23,11 +23,9 @@ const MockStylePreset = Extension.create({
23
23
  });
24
24
 
25
25
  function createEditor({ content }) {
26
- const normalizer = new ContentNormalizer();
27
-
28
26
  return new Editor({
29
- content: normalizer.normalize(content),
30
- extensions: CORE_EXTENSIONS.concat(
27
+ content: ContentNormalizer.normalize(content),
28
+ extensions: buildCoreExtensions().concat(
31
29
  MockStylePreset,
32
30
  DeviceManager.configure({ deviceRef: ref('desktop') }),
33
31
  Alignment
@@ -118,6 +116,14 @@ describe('parsing html', () => {
118
116
  expect(editor.getJSON()).toMatchSnapshot();
119
117
  });
120
118
 
119
+ test('should get alignment from rendered view', () => {
120
+ const editor = createEditor({
121
+ content: '<p style="--zw-text-align-mobile:center;--zw-text-align-desktop:right">test</p>'
122
+ });
123
+
124
+ expect(editor.getJSON()).toMatchSnapshot();
125
+ });
126
+
121
127
  test('should set null if no alignment', () => {
122
128
  const editor = createEditor({
123
129
  content: '<p>test</p>'
@@ -2,9 +2,9 @@ import { Editor, Extension } from '@tiptap/vue-2';
2
2
  import { ref } from '@vue/composition-api';
3
3
  import { NodeFactory } from '../../__tests__/utils';
4
4
  import { createCommand } from '../../utils';
5
- import { CORE_EXTENSIONS } from '../core';
6
5
  import { BackgroundColor } from '../BackgroundColor';
7
6
  import { ContentNormalizer } from '../../services';
7
+ import { buildCoreExtensions } from '../core';
8
8
 
9
9
  const MockStylePreset = Extension.create({
10
10
  name: 'style_preset',
@@ -19,11 +19,9 @@ const MockStylePreset = Extension.create({
19
19
  });
20
20
 
21
21
  function createEditor({ content }) {
22
- const normalizer = new ContentNormalizer();
23
-
24
22
  return new Editor({
25
- content: normalizer.normalize(content),
26
- extensions: CORE_EXTENSIONS.concat(MockStylePreset, BackgroundColor)
23
+ content: ContentNormalizer.normalize(content),
24
+ extensions: buildCoreExtensions().concat(MockStylePreset, BackgroundColor)
27
25
  });
28
26
  }
29
27
 
@@ -94,6 +92,14 @@ describe('parsing html', () => {
94
92
  expect(editor.getJSON()).toMatchSnapshot();
95
93
  });
96
94
 
95
+ test('should get value from rendered view', () => {
96
+ const editor = createEditor({
97
+ content: '<p><span style="--zw-background-color: red">lorem</span> ipsum</p>'
98
+ });
99
+
100
+ expect(editor.getJSON()).toMatchSnapshot();
101
+ });
102
+
97
103
  test('should merge paragraph and text settings', () => {
98
104
  const editor = createEditor({
99
105
  content: '<p style="background-color: red"><span style="background-color: #000">lorem</span> ipsum</p>'
@@ -1,16 +1,14 @@
1
1
  import { Editor } from '@tiptap/vue-2';
2
2
  import { NodeFactory } from '../../__tests__/utils';
3
3
  import { CaseStyles } from '../../enums';
4
- import { CORE_EXTENSIONS } from '../core';
5
4
  import { CaseStyle } from '../CaseStyle';
6
5
  import { ContentNormalizer } from '../../services';
6
+ import { buildCoreExtensions } from '../core';
7
7
 
8
8
  function createEditor({ content }) {
9
- const normalizer = new ContentNormalizer();
10
-
11
9
  return new Editor({
12
- content: normalizer.normalize(content),
13
- extensions: CORE_EXTENSIONS.concat(CaseStyle)
10
+ content: ContentNormalizer.normalize(content),
11
+ extensions: buildCoreExtensions().concat(CaseStyle)
14
12
  });
15
13
  }
16
14
 
@@ -2,9 +2,9 @@ import { Editor, Extension } from '@tiptap/vue-2';
2
2
  import { ref } from '@vue/composition-api';
3
3
  import { NodeFactory } from '../../__tests__/utils';
4
4
  import { createCommand } from '../../utils';
5
- import { CORE_EXTENSIONS } from '../core';
6
5
  import { FontColor } from '../FontColor';
7
6
  import { ContentNormalizer } from '../../services';
7
+ import { buildCoreExtensions } from '../core';
8
8
 
9
9
  const MockStylePreset = Extension.create({
10
10
  name: 'style_preset',
@@ -19,11 +19,9 @@ const MockStylePreset = Extension.create({
19
19
  });
20
20
 
21
21
  function createEditor({ content }) {
22
- const normalizer = new ContentNormalizer();
23
-
24
22
  return new Editor({
25
- content: normalizer.normalize(content),
26
- extensions: CORE_EXTENSIONS.concat(MockStylePreset, FontColor)
23
+ content: ContentNormalizer.normalize(content),
24
+ extensions: buildCoreExtensions().concat(MockStylePreset, FontColor)
27
25
  });
28
26
  }
29
27
 
@@ -104,6 +102,14 @@ describe('parsing html', () => {
104
102
  expect(editor.getJSON()).toMatchSnapshot();
105
103
  });
106
104
 
105
+ test('should get value from parsed view', () => {
106
+ const editor = createEditor({
107
+ content: '<p><span style="--zw-color: red">lorem</span> ipsum</p>'
108
+ });
109
+
110
+ expect(editor.getJSON()).toMatchSnapshot();
111
+ });
112
+
107
113
  test('should merge paragraph and text settings', () => {
108
114
  const editor = createEditor({
109
115
  content: '<p style="color: red"><span style="color: #000">lorem</span> ipsum</p>'
@@ -2,12 +2,12 @@ import { Editor, Extension } from '@tiptap/vue-2';
2
2
  import { ref } from '@vue/composition-api';
3
3
  import { NodeFactory } from '../../__tests__/utils';
4
4
  import { createCommand } from '../../utils';
5
- import { CORE_EXTENSIONS } from '../core';
6
5
  import { Font } from '../../models';
7
6
  import { FontFamily } from '../FontFamily';
8
7
  import { FontWeight } from '../FontWeight';
9
8
  import { FontStyle } from '../FontStyle';
10
9
  import { ContentNormalizer } from '../../services';
10
+ import { buildCoreExtensions } from '../core';
11
11
 
12
12
  const MockStylePreset = Extension.create({
13
13
  name: 'style_preset',
@@ -25,17 +25,18 @@ const MockStylePreset = Extension.create({
25
25
  });
26
26
 
27
27
  function createEditor({ content }) {
28
- const normalizer = new ContentNormalizer();
29
-
30
28
  return new Editor({
31
- content: normalizer.normalize(content),
32
- extensions: CORE_EXTENSIONS.concat(
29
+ content: ContentNormalizer.normalize(content),
30
+ extensions: buildCoreExtensions().concat(
33
31
  MockStylePreset,
34
32
  FontFamily.configure({
35
33
  fonts: [
36
34
  new Font({ name: 'Lato', styles: ['400', '700', '700i'] }),
37
- new Font({ name: 'Bungee', styles: ['400'] })
38
- ]
35
+ new Font({ name: 'Bungee', styles: ['400'] }),
36
+ new Font({ name: 'Roboto', styles: ['400'] }),
37
+ new Font({ name: 'Josefin Slab', styles: ['400'] })
38
+ ],
39
+ defaultFont: 'Lato'
39
40
  }),
40
41
  FontWeight,
41
42
  FontStyle
@@ -190,6 +191,22 @@ describe('parsing html', () => {
190
191
  expect(editor.getJSON()).toMatchSnapshot();
191
192
  });
192
193
 
194
+ test('should get value from rendered view', () => {
195
+ const editor = createEditor({
196
+ content: '<p><span style="--zw-font-family: Lato">lorem</span> ipsum</p>'
197
+ });
198
+
199
+ expect(editor.getJSON()).toMatchSnapshot();
200
+ });
201
+
202
+ test('should get set default if undefined font', () => {
203
+ const editor = createEditor({
204
+ content: '<p><span style="--zw-font-family: Arial">lorem</span> ipsum</p>'
205
+ });
206
+
207
+ expect(editor.getJSON()).toMatchSnapshot();
208
+ });
209
+
193
210
  test('should merge paragraph and text settings', () => {
194
211
  const editor = createEditor({
195
212
  content: '<p style="font-family: Lato"><span style="font-family: Roboto">lorem</span> ipsum</p>'
@@ -197,4 +214,12 @@ describe('parsing html', () => {
197
214
 
198
215
  expect(editor.getJSON()).toMatchSnapshot();
199
216
  });
217
+
218
+ test('should get parse font name with quotes', () => {
219
+ const editor = createEditor({
220
+ content: '<p>hello <span style="font-family: &quot;Josefin Slab&quot;;">world</span></p>'
221
+ });
222
+
223
+ expect(editor.getJSON()).toMatchSnapshot();
224
+ });
200
225
  });
@@ -2,10 +2,10 @@ import { Editor, Extension } from '@tiptap/vue-2';
2
2
  import { ref } from '@vue/composition-api';
3
3
  import { NodeFactory } from '../../__tests__/utils';
4
4
  import { createCommand } from '../../utils';
5
- import { CORE_EXTENSIONS } from '../core';
6
5
  import { FontSize } from '../FontSize';
7
6
  import { DeviceManager } from '../DeviceManager';
8
7
  import { ContentNormalizer } from '../../services';
8
+ import { buildCoreExtensions } from '../core';
9
9
 
10
10
  const MockStylePreset = Extension.create({
11
11
  name: 'style_preset',
@@ -22,11 +22,9 @@ const MockStylePreset = Extension.create({
22
22
  });
23
23
 
24
24
  function createEditor({ content }) {
25
- const normalizer = new ContentNormalizer();
26
-
27
25
  return new Editor({
28
- content: normalizer.normalize(content),
29
- extensions: CORE_EXTENSIONS.concat(
26
+ content: ContentNormalizer.normalize(content),
27
+ extensions: buildCoreExtensions().concat(
30
28
  MockStylePreset,
31
29
  DeviceManager.configure({
32
30
  deviceRef: ref('desktop')
@@ -202,6 +200,14 @@ describe('parsing html', () => {
202
200
  expect(editor.getJSON()).toMatchSnapshot();
203
201
  });
204
202
 
203
+ test('should get value from rendered view', () => {
204
+ const editor = createEditor({
205
+ content: '<p><span style="--zw-font-size-mobile: 24px; --zw-font-size-desktop:30px">lorem</span> ipsum</p>'
206
+ });
207
+
208
+ expect(editor.getJSON()).toMatchSnapshot();
209
+ });
210
+
205
211
  test('should merge paragraph and text settings', () => {
206
212
  const editor = createEditor({
207
213
  content: '<p style="font-size: 24px"><span style="font-size: 20px">lorem</span> ipsum</p>'
@@ -2,12 +2,12 @@ import { Editor, Extension } from '@tiptap/vue-2';
2
2
  import { ref } from '@vue/composition-api';
3
3
  import { NodeFactory } from '../../__tests__/utils';
4
4
  import { createCommand } from '../../utils';
5
- import { CORE_EXTENSIONS } from '../core';
6
5
  import { FontStyle } from '../FontStyle';
7
6
  import { FontFamily } from '../FontFamily';
8
7
  import { Font } from '../../models';
9
8
  import { FontWeight } from '../FontWeight';
10
9
  import { ContentNormalizer } from '../../services';
10
+ import { buildCoreExtensions } from '../core';
11
11
 
12
12
  const MockStylePreset = Extension.create({
13
13
  name: 'style_preset',
@@ -26,11 +26,9 @@ const MockStylePreset = Extension.create({
26
26
  });
27
27
 
28
28
  function createEditor({ content }) {
29
- const normalizer = new ContentNormalizer();
30
-
31
29
  return new Editor({
32
- content: normalizer.normalize(content),
33
- extensions: CORE_EXTENSIONS.concat(
30
+ content: ContentNormalizer.normalize(content),
31
+ extensions: buildCoreExtensions().concat(
34
32
  MockStylePreset,
35
33
  FontStyle,
36
34
  FontWeight,
@@ -155,6 +153,14 @@ describe('parsing html', () => {
155
153
  expect(editor.getJSON()).toMatchSnapshot();
156
154
  });
157
155
 
156
+ test('should get value from rendered view', () => {
157
+ const editor = createEditor({
158
+ content: '<p><span style="--zw-font-style: italic">lorem</span> ipsum</p>'
159
+ });
160
+
161
+ expect(editor.getJSON()).toMatchSnapshot();
162
+ });
163
+
158
164
  test('should get value from i tag', () => {
159
165
  const editor = createEditor({
160
166
  content: '<p><i>lorem</i> ipsum</p>'
@@ -2,12 +2,12 @@ import { Editor, Extension } from '@tiptap/vue-2';
2
2
  import { ref } from '@vue/composition-api';
3
3
  import { NodeFactory } from '../../__tests__/utils';
4
4
  import { createCommand } from '../../utils';
5
- import { CORE_EXTENSIONS } from '../core';
6
5
  import { Font } from '../../models';
7
6
  import { FontWeight } from '../FontWeight';
8
7
  import { FontFamily } from '../FontFamily';
9
8
  import { FontStyle } from '../FontStyle';
10
9
  import { ContentNormalizer } from '../../services';
10
+ import { buildCoreExtensions } from '../core';
11
11
 
12
12
  const MockStylePreset = Extension.create({
13
13
  name: 'style_preset',
@@ -25,11 +25,9 @@ const MockStylePreset = Extension.create({
25
25
  });
26
26
 
27
27
  function createEditor({ content }) {
28
- const normalizer = new ContentNormalizer();
29
-
30
28
  return new Editor({
31
- content: normalizer.normalize(content),
32
- extensions: CORE_EXTENSIONS.concat(
29
+ content: ContentNormalizer.normalize(content),
30
+ extensions: buildCoreExtensions().concat(
33
31
  MockStylePreset,
34
32
  FontFamily.configure({
35
33
  fonts: [
@@ -182,6 +180,14 @@ describe('parsing html', () => {
182
180
  expect(editor.getJSON()).toMatchSnapshot();
183
181
  });
184
182
 
183
+ test('should get value from rendered view', () => {
184
+ const editor = createEditor({
185
+ content: '<p><span style="--zw-font-weight: 700">lorem</span> ipsum</p>'
186
+ });
187
+
188
+ expect(editor.getJSON()).toMatchSnapshot();
189
+ });
190
+
185
191
  test('should get value from b tag', () => {
186
192
  const editor = createEditor({
187
193
  content: '<p><b>lorem</b> ipsum</p>'
@@ -2,10 +2,10 @@ import { Editor, Extension } from '@tiptap/vue-2';
2
2
  import { ref } from '@vue/composition-api';
3
3
  import { NodeFactory } from '../../__tests__/utils';
4
4
  import { createCommand } from '../../utils';
5
- import { CORE_EXTENSIONS } from '../core';
6
5
  import { DeviceManager } from '../DeviceManager';
7
6
  import { LineHeight } from '../LineHeight';
8
7
  import { ContentNormalizer } from '../../services';
8
+ import { buildCoreExtensions } from '../core';
9
9
 
10
10
  const MockStylePreset = Extension.create({
11
11
  name: 'style_preset',
@@ -22,11 +22,9 @@ const MockStylePreset = Extension.create({
22
22
  });
23
23
 
24
24
  function createEditor({ content }) {
25
- const normalizer = new ContentNormalizer();
26
-
27
25
  return new Editor({
28
- content: normalizer.normalize(content),
29
- extensions: CORE_EXTENSIONS.concat(
26
+ content: ContentNormalizer.normalize(content),
27
+ extensions: buildCoreExtensions().concat(
30
28
  MockStylePreset,
31
29
  DeviceManager.configure({ deviceRef: ref('desktop') }),
32
30
  LineHeight
@@ -136,6 +134,14 @@ describe('parsing html', () => {
136
134
  global.document.body.style.removeProperty('font-size');
137
135
  });
138
136
 
137
+ test('should get value from rendered view', () => {
138
+ const editor = createEditor({
139
+ content: '<p style="--zw-line-height-mobile:1.2;--zw-line-height-desktop:1.4">test</p>'
140
+ });
141
+
142
+ expect(editor.getJSON()).toMatchSnapshot();
143
+ });
144
+
139
145
  test('should set null if no alignment', () => {
140
146
  const editor = createEditor({
141
147
  content: '<p>test</p>'
@@ -1,11 +1,11 @@
1
1
  import { Editor, Extension, Mark } from '@tiptap/vue-2';
2
2
  import { ref } from '@vue/composition-api';
3
3
  import { NodeFactory } from '../../__tests__/utils';
4
- import { CORE_EXTENSIONS } from '../core';
5
4
  import { StylePreset } from '../StylePreset';
6
5
  import { List } from '../list';
7
6
  import { ListTypes, NodeTypes, TextSettings } from '../../enums';
8
7
  import { ContentNormalizer } from '../../services';
8
+ import { buildCoreExtensions } from '../core';
9
9
 
10
10
  const MockFontSize = Mark.create({
11
11
  name: TextSettings.FONT_SIZE,
@@ -43,15 +43,73 @@ const MockAlignment = Extension.create({
43
43
  ]
44
44
  });
45
45
 
46
+ const MockBackgroundColor = Mark.create({
47
+ name: TextSettings.BACKGROUND_COLOR,
48
+
49
+ addAttributes: () => ({
50
+ value: { default: null }
51
+ }),
52
+
53
+ renderHTML: () => ['span', {}, 0]
54
+ });
55
+
56
+ const MockFontColor = Mark.create({
57
+ name: TextSettings.FONT_COLOR,
58
+
59
+ addAttributes: () => ({
60
+ value: { default: null }
61
+ }),
62
+
63
+ renderHTML: () => ['span', {}, 0]
64
+ });
65
+
66
+ const MockFontFamily = Mark.create({
67
+ name: TextSettings.FONT_FAMILY,
68
+
69
+ addAttributes: () => ({
70
+ value: { default: null }
71
+ }),
72
+
73
+ renderHTML: () => ['span', {}, 0]
74
+ });
75
+
76
+ const MockFontStyle = Mark.create({
77
+ name: TextSettings.FONT_STYLE,
78
+
79
+ addAttributes: () => ({
80
+ value: { default: null }
81
+ }),
82
+
83
+ renderHTML: () => ['span', {}, 0]
84
+ });
85
+
86
+ const MockTextDecoration = Mark.create({
87
+ name: TextSettings.TEXT_DECORATION,
88
+
89
+ addAttributes: () => ({
90
+ value: { default: null }
91
+ }),
92
+
93
+ renderHTML: () => ['span', {}, 0]
94
+ });
95
+
96
+ const MockSuperscript = Mark.create({
97
+ name: TextSettings.SUPERSCRIPT,
98
+
99
+ addAttributes: () => ({
100
+ value: { default: null }
101
+ }),
102
+
103
+ renderHTML: () => ['span', {}, 0]
104
+ });
105
+
46
106
  function createEditor({ content, presets, defaultId }) {
47
107
  return new Promise((resolve) => {
48
- const normalizer = new ContentNormalizer();
49
-
50
108
  const editor = new Editor({
51
- content: normalizer.normalize(content),
109
+ content: ContentNormalizer.normalize(content),
52
110
  onCreate: () => resolve(editor),
53
111
 
54
- extensions: CORE_EXTENSIONS.concat(
112
+ extensions: buildCoreExtensions().concat(
55
113
  StylePreset.configure({
56
114
  presetsRef: ref(presets),
57
115
  baseClass: 'zw ts-',
@@ -68,7 +126,13 @@ function createEditor({ content, presets, defaultId }) {
68
126
  }),
69
127
  MockFontSize,
70
128
  MockFontWeight,
71
- MockAlignment
129
+ MockAlignment,
130
+ MockBackgroundColor,
131
+ MockFontColor,
132
+ MockFontFamily,
133
+ MockFontStyle,
134
+ MockTextDecoration,
135
+ MockSuperscript
72
136
  )
73
137
  });
74
138
  });
@@ -2,9 +2,9 @@ import { Editor, Extension } from '@tiptap/vue-2';
2
2
  import { ref } from '@vue/composition-api';
3
3
  import { NodeFactory } from '../../__tests__/utils';
4
4
  import { createCommand } from '../../utils';
5
- import { CORE_EXTENSIONS } from '../core';
6
5
  import { TextDecoration } from '../TextDecoration';
7
6
  import { ContentNormalizer } from '../../services';
7
+ import { buildCoreExtensions } from '../core';
8
8
 
9
9
  const MockStylePreset = Extension.create({
10
10
  name: 'style_preset',
@@ -19,11 +19,9 @@ const MockStylePreset = Extension.create({
19
19
  });
20
20
 
21
21
  function createEditor({ content }) {
22
- const normalizer = new ContentNormalizer();
23
-
24
22
  return new Editor({
25
- content: normalizer.normalize(content),
26
- extensions: CORE_EXTENSIONS.concat(MockStylePreset, TextDecoration)
23
+ content: ContentNormalizer.normalize(content),
24
+ extensions: buildCoreExtensions().concat(MockStylePreset, TextDecoration)
27
25
  });
28
26
  }
29
27
 
@@ -294,6 +292,14 @@ describe('parsing html', () => {
294
292
  expect(editor.getJSON()).toMatchSnapshot();
295
293
  });
296
294
 
295
+ test('should get underline from rendered view', () => {
296
+ const editor = createEditor({
297
+ content: '<p><span style="--zw-text-decoration: underline">lorem</span> ipsum</p>'
298
+ });
299
+
300
+ expect(editor.getJSON()).toMatchSnapshot();
301
+ });
302
+
297
303
  test('should get strike through from text', () => {
298
304
  const editor = createEditor({
299
305
  content: '<p><span style="text-decoration-line: line-through">lorem</span> ipsum</p>'
@@ -302,6 +308,14 @@ describe('parsing html', () => {
302
308
  expect(editor.getJSON()).toMatchSnapshot();
303
309
  });
304
310
 
311
+ test('should get strike through from rendered view', () => {
312
+ const editor = createEditor({
313
+ content: '<p><span style="--zw-text-decoration: line-through">lorem</span> ipsum</p>'
314
+ });
315
+
316
+ expect(editor.getJSON()).toMatchSnapshot();
317
+ });
318
+
305
319
  test('should get both from text', () => {
306
320
  const editor = createEditor({
307
321
  content: '<p><span style="text-decoration-line: underline line-through">lorem</span> ipsum</p>'
@@ -310,6 +324,14 @@ describe('parsing html', () => {
310
324
  expect(editor.getJSON()).toMatchSnapshot();
311
325
  });
312
326
 
327
+ test('should get both from rendered view', () => {
328
+ const editor = createEditor({
329
+ content: '<p><span style="--zw-text-decoration: underline line-through">lorem</span> ipsum</p>'
330
+ });
331
+
332
+ expect(editor.getJSON()).toMatchSnapshot();
333
+ });
334
+
313
335
  test('should merge paragraph and text settings', () => {
314
336
  const editor = createEditor({
315
337
  content: '<p style="text-decoration-line: underline"><span style="text-decoration-line: line-through">lorem</span> ipsum</p>'
@@ -24,6 +24,30 @@ Object {
24
24
  }
25
25
  `;
26
26
 
27
+ exports[`parsing html should get alignment from rendered view 1`] = `
28
+ Object {
29
+ "content": Array [
30
+ Object {
31
+ "attrs": Object {
32
+ "alignment": Object {
33
+ "desktop": "right",
34
+ "mobile": "center",
35
+ "tablet": null,
36
+ },
37
+ },
38
+ "content": Array [
39
+ Object {
40
+ "text": "test",
41
+ "type": "text",
42
+ },
43
+ ],
44
+ "type": "paragraph",
45
+ },
46
+ ],
47
+ "type": "doc",
48
+ }
49
+ `;
50
+
27
51
  exports[`parsing html should get alignment from text 1`] = `
28
52
  Object {
29
53
  "content": Array [
@@ -68,6 +92,6 @@ Object {
68
92
  }
69
93
  `;
70
94
 
71
- exports[`rendering should render all devices 1`] = `"<p class=\\"zw-style\\" style=\\"--zw-mobile-text-align: left; --zw-tablet-text-align: right; --zw-desktop-text-align: center;\\">hello world</p>"`;
95
+ exports[`rendering should render all devices 1`] = `"<p class=\\"zw-style\\" style=\\"--zw-text-align-mobile:left;--zw-text-align-tablet:right;--zw-text-align-desktop:center;\\">hello world</p>"`;
72
96
 
73
- exports[`rendering should render only desktop 1`] = `"<p class=\\"zw-style\\" style=\\"--zw-desktop-text-align: center;\\">hello world</p>"`;
97
+ exports[`rendering should render only desktop 1`] = `"<p class=\\"zw-style\\" style=\\"--zw-text-align-desktop:center;\\">hello world</p>"`;