@tiptap/extension-invisible-characters 2.24.2 → 3.0.0-beta.10
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/LICENSE.md +21 -0
- package/dist/index.cjs +285 -246
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +86 -0
- package/dist/index.d.ts +86 -10
- package/dist/index.js +255 -238
- package/dist/index.js.map +1 -1
- package/package.json +13 -9
- package/src/invisible-characters.ts +39 -43
- package/src/plugin/InvisibleCharacter.ts +3 -3
- package/src/plugin/InvisibleCharactersPlugin.ts +19 -16
- package/src/plugin/InvisibleNode.ts +5 -5
- package/src/plugin/reducers.ts +2 -5
- package/src/plugin/utils/create-style-tag.ts +3 -1
- package/src/plugin/utils/get-updated-ranges.ts +3 -6
- package/src/plugin/utils/text-between.ts +2 -2
- package/src/types.ts +11 -11
- package/dist/index.d.ts.map +0 -1
- package/dist/index.umd.js +0 -312
- package/dist/index.umd.js.map +0 -1
- package/dist/invisible-characters.d.ts +0 -27
- package/dist/invisible-characters.d.ts.map +0 -1
- package/dist/plugin/InvisibleCharacter.d.ts +0 -19
- package/dist/plugin/InvisibleCharacter.d.ts.map +0 -1
- package/dist/plugin/InvisibleCharactersPlugin.d.ts +0 -10
- package/dist/plugin/InvisibleCharactersPlugin.d.ts.map +0 -1
- package/dist/plugin/InvisibleNode.d.ts +0 -21
- package/dist/plugin/InvisibleNode.d.ts.map +0 -1
- package/dist/plugin/index.d.ts +0 -2
- package/dist/plugin/index.d.ts.map +0 -1
- package/dist/plugin/invisible-characters/hardBreak.d.ts +0 -6
- package/dist/plugin/invisible-characters/hardBreak.d.ts.map +0 -1
- package/dist/plugin/invisible-characters/paragraph.d.ts +0 -6
- package/dist/plugin/invisible-characters/paragraph.d.ts.map +0 -1
- package/dist/plugin/invisible-characters/space.d.ts +0 -6
- package/dist/plugin/invisible-characters/space.d.ts.map +0 -1
- package/dist/plugin/reducers.d.ts +0 -4
- package/dist/plugin/reducers.d.ts.map +0 -1
- package/dist/plugin/style.d.ts +0 -3
- package/dist/plugin/style.d.ts.map +0 -1
- package/dist/plugin/utils/create-decoration-widget.d.ts +0 -4
- package/dist/plugin/utils/create-decoration-widget.d.ts.map +0 -1
- package/dist/plugin/utils/create-style-tag.d.ts +0 -3
- package/dist/plugin/utils/create-style-tag.d.ts.map +0 -1
- package/dist/plugin/utils/get-updated-ranges.d.ts +0 -5
- package/dist/plugin/utils/get-updated-ranges.d.ts.map +0 -1
- package/dist/plugin/utils/text-between.d.ts +0 -5
- package/dist/plugin/utils/text-between.d.ts.map +0 -1
- package/dist/types.d.ts +0 -18
- package/dist/types.d.ts.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import { DecorationSet, Decoration } from '@tiptap/pm/view';
|
|
1
|
+
// src/invisible-characters.ts
|
|
2
|
+
import { Extension } from "@tiptap/core";
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
// src/plugin/InvisibleCharactersPlugin.ts
|
|
5
|
+
import { AllSelection, Plugin, PluginKey } from "@tiptap/pm/state";
|
|
6
|
+
import { DecorationSet } from "@tiptap/pm/view";
|
|
7
|
+
|
|
8
|
+
// src/plugin/reducers.ts
|
|
9
|
+
var stateReducer = (state, visible) => {
|
|
10
|
+
if (visible === void 0) {
|
|
11
|
+
return state;
|
|
12
|
+
}
|
|
13
|
+
return { ...state, visible };
|
|
10
14
|
};
|
|
11
15
|
|
|
12
|
-
|
|
16
|
+
// src/plugin/style.ts
|
|
17
|
+
var style = `.Tiptap-invisible-character {
|
|
13
18
|
height: 0;
|
|
14
19
|
padding: 0;
|
|
15
20
|
pointer-events: none;
|
|
@@ -28,15 +33,15 @@ const style = `.Tiptap-invisible-character {
|
|
|
28
33
|
}
|
|
29
34
|
|
|
30
35
|
.Tiptap-invisible-character--space::before {
|
|
31
|
-
content: '
|
|
36
|
+
content: '\xB7'
|
|
32
37
|
}
|
|
33
38
|
|
|
34
39
|
.Tiptap-invisible-character--break::before {
|
|
35
|
-
content: '
|
|
40
|
+
content: '\xAC'
|
|
36
41
|
}
|
|
37
42
|
|
|
38
43
|
.Tiptap-invisible-character--paragraph::before {
|
|
39
|
-
content: '
|
|
44
|
+
content: '\xB6'
|
|
40
45
|
}
|
|
41
46
|
|
|
42
47
|
.Tiptap-invisible-character + img.ProseMirror-separator {
|
|
@@ -51,250 +56,262 @@ const style = `.Tiptap-invisible-character {
|
|
|
51
56
|
}
|
|
52
57
|
`;
|
|
53
58
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
59
|
+
// src/plugin/utils/create-style-tag.ts
|
|
60
|
+
var createStyleTag = (style2, nonce) => {
|
|
61
|
+
const tiptapStyleTag = document.querySelector("style[data-tiptap-extension-invisible-characters-style]");
|
|
62
|
+
if (tiptapStyleTag !== null) {
|
|
63
|
+
return tiptapStyleTag;
|
|
64
|
+
}
|
|
65
|
+
const styleNode = document.createElement("style");
|
|
66
|
+
if (nonce) {
|
|
67
|
+
styleNode.setAttribute("nonce", nonce);
|
|
68
|
+
}
|
|
69
|
+
styleNode.setAttribute("data-tiptap-extension-invisible-characters-style", "");
|
|
70
|
+
styleNode.innerHTML = style2;
|
|
71
|
+
document.getElementsByTagName("head")[0].appendChild(styleNode);
|
|
72
|
+
return styleNode;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// src/plugin/utils/get-updated-ranges.ts
|
|
76
|
+
var getUpdatedRanges = ({ mapping }) => {
|
|
77
|
+
const ranges = [];
|
|
78
|
+
mapping.maps.forEach((stepMap, i) => {
|
|
79
|
+
stepMap.forEach((_oldStart, _oldEnd, newStart, newEnd) => {
|
|
80
|
+
ranges.push([mapping.slice(i + 1).map(newStart), mapping.slice(i + 1).map(newEnd)]);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
return ranges;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// src/plugin/InvisibleCharactersPlugin.ts
|
|
87
|
+
var InvisibleCharactersPluginKey = new PluginKey("invisibleCharacters");
|
|
88
|
+
var InvisibleCharactersPlugin = (state, options) => {
|
|
89
|
+
const key = InvisibleCharactersPluginKey;
|
|
90
|
+
const emptyDecorationSet = DecorationSet.create(state.doc, []);
|
|
91
|
+
const addDecorationsBetweenPositions = (from, to, editorState, decorations) => {
|
|
92
|
+
return options.builders.sort((builderA, builderB) => {
|
|
93
|
+
if (builderA.priority > builderB.priority) {
|
|
94
|
+
return 1;
|
|
95
|
+
}
|
|
96
|
+
return -1;
|
|
97
|
+
}).reduce((newDecos, builder) => {
|
|
98
|
+
return builder.createDecoration(from, to, editorState.doc, newDecos);
|
|
99
|
+
}, decorations);
|
|
100
|
+
};
|
|
101
|
+
return new Plugin({
|
|
102
|
+
key,
|
|
103
|
+
state: {
|
|
104
|
+
init: () => {
|
|
105
|
+
const { $from, $to } = new AllSelection(state.doc);
|
|
106
|
+
if (options.injectCSS && document) {
|
|
107
|
+
createStyleTag(style, options.injectNonce);
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
visible: options.visible,
|
|
111
|
+
decorations: addDecorationsBetweenPositions($from.pos, $to.pos, state, DecorationSet.empty)
|
|
112
|
+
};
|
|
113
|
+
},
|
|
114
|
+
apply: (tr, pluginState, _, currentState) => {
|
|
115
|
+
const newPluginState = stateReducer(pluginState, tr.getMeta("setInvisibleCharactersVisible"));
|
|
116
|
+
const decorations = getUpdatedRanges(tr).reduce(
|
|
117
|
+
(nextDecorations, [from, to]) => {
|
|
118
|
+
return addDecorationsBetweenPositions(from, to, currentState, nextDecorations);
|
|
119
|
+
},
|
|
120
|
+
newPluginState.decorations.map(tr.mapping, tr.doc)
|
|
121
|
+
);
|
|
122
|
+
return {
|
|
123
|
+
...newPluginState,
|
|
124
|
+
decorations
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
props: {
|
|
129
|
+
decorations(editorState) {
|
|
130
|
+
const pluginState = this.getState(editorState);
|
|
131
|
+
const visible = pluginState == null ? void 0 : pluginState.visible;
|
|
132
|
+
const decorations = pluginState == null ? void 0 : pluginState.decorations;
|
|
133
|
+
return visible ? decorations : emptyDecorationSet;
|
|
134
|
+
}
|
|
58
135
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
// src/plugin/utils/create-decoration-widget.ts
|
|
140
|
+
import { Decoration } from "@tiptap/pm/view";
|
|
141
|
+
var createDecorationWidget = (pos, type, content) => {
|
|
142
|
+
const createElement = () => {
|
|
143
|
+
const newElement = document.createElement("span");
|
|
144
|
+
newElement.classList.add("Tiptap-invisible-character");
|
|
145
|
+
newElement.classList.add(`Tiptap-invisible-character--${type}`);
|
|
146
|
+
if (content) {
|
|
147
|
+
newElement.textContent = content;
|
|
62
148
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
149
|
+
return newElement;
|
|
150
|
+
};
|
|
151
|
+
return Decoration.widget(pos, createElement, {
|
|
152
|
+
key: type,
|
|
153
|
+
marks: [],
|
|
154
|
+
side: 1e3
|
|
155
|
+
});
|
|
67
156
|
};
|
|
68
157
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
158
|
+
// src/plugin/InvisibleNode.ts
|
|
159
|
+
var defaultPosition = (node, pos) => pos + node.nodeSize - 1;
|
|
160
|
+
var InvisibleNode = class {
|
|
161
|
+
constructor(options) {
|
|
162
|
+
this.predicate = options.predicate;
|
|
163
|
+
this.type = options.type;
|
|
164
|
+
this.position = options.position || defaultPosition;
|
|
165
|
+
this.content = options.content;
|
|
166
|
+
this.priority = options.priority || 100;
|
|
167
|
+
}
|
|
168
|
+
createDecoration(from, to, doc, decorations) {
|
|
169
|
+
let newDecorations = decorations;
|
|
170
|
+
doc.nodesBetween(from, to, (node, pos) => {
|
|
171
|
+
if (this.test(node)) {
|
|
172
|
+
const decorationPosition = this.position(node, pos);
|
|
173
|
+
const oldDecorations = newDecorations.find(
|
|
174
|
+
decorationPosition,
|
|
175
|
+
decorationPosition,
|
|
176
|
+
(spec) => spec.key === this.type
|
|
177
|
+
);
|
|
178
|
+
newDecorations = newDecorations.remove(oldDecorations).add(doc, [createDecorationWidget(decorationPosition, this.type, this.content)]);
|
|
179
|
+
}
|
|
78
180
|
});
|
|
79
|
-
return
|
|
181
|
+
return newDecorations;
|
|
182
|
+
}
|
|
183
|
+
test(value) {
|
|
184
|
+
return this.predicate(value);
|
|
185
|
+
}
|
|
80
186
|
};
|
|
81
187
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
if (builderA.priority > builderB.priority) {
|
|
89
|
-
return 1;
|
|
90
|
-
}
|
|
91
|
-
return -1;
|
|
92
|
-
}).reduce((newDecos, builder) => {
|
|
93
|
-
return builder.createDecoration(from, to, editorState.doc, newDecos);
|
|
94
|
-
}, decorations);
|
|
95
|
-
};
|
|
96
|
-
return new Plugin({
|
|
97
|
-
key,
|
|
98
|
-
state: {
|
|
99
|
-
init: () => {
|
|
100
|
-
const { $from, $to } = new AllSelection(state.doc);
|
|
101
|
-
if (options.injectCSS && document) {
|
|
102
|
-
createStyleTag(style, options.injectNonce);
|
|
103
|
-
}
|
|
104
|
-
return {
|
|
105
|
-
visible: options.visible,
|
|
106
|
-
decorations: addDecorationsBetweenPositions($from.pos, $to.pos, state, DecorationSet.empty),
|
|
107
|
-
};
|
|
108
|
-
},
|
|
109
|
-
apply: (tr, pluginState, _, currentState) => {
|
|
110
|
-
const newPluginState = stateReducer(pluginState, tr.getMeta('setInvisibleCharactersVisible'));
|
|
111
|
-
const decorations = getUpdatedRanges(tr).reduce((nextDecorations, [from, to]) => {
|
|
112
|
-
return addDecorationsBetweenPositions(from, to, currentState, nextDecorations);
|
|
113
|
-
}, newPluginState.decorations.map(tr.mapping, tr.doc));
|
|
114
|
-
return {
|
|
115
|
-
...newPluginState,
|
|
116
|
-
decorations,
|
|
117
|
-
};
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
props: {
|
|
121
|
-
decorations(editorState) {
|
|
122
|
-
const pluginState = this.getState(editorState);
|
|
123
|
-
const visible = pluginState === null || pluginState === void 0 ? void 0 : pluginState.visible;
|
|
124
|
-
const decorations = pluginState === null || pluginState === void 0 ? void 0 : pluginState.decorations;
|
|
125
|
-
return visible ? decorations : emptyDecorationSet;
|
|
126
|
-
},
|
|
127
|
-
},
|
|
188
|
+
// src/plugin/invisible-characters/hardBreak.ts
|
|
189
|
+
var HardBreakNode = class extends InvisibleNode {
|
|
190
|
+
constructor() {
|
|
191
|
+
super({
|
|
192
|
+
type: "break",
|
|
193
|
+
predicate: (node) => node.type === node.type.schema.nodes.hardBreak
|
|
128
194
|
});
|
|
195
|
+
}
|
|
129
196
|
};
|
|
130
197
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
newElement.textContent = content;
|
|
138
|
-
}
|
|
139
|
-
return newElement;
|
|
140
|
-
};
|
|
141
|
-
// return Decoration.inline(pos - 1, pos, {
|
|
142
|
-
// class: `Tiptap-invisible-character Tiptap-invisible-character--${type}`,
|
|
143
|
-
// })
|
|
144
|
-
return Decoration.widget(pos, createElement, {
|
|
145
|
-
key: type,
|
|
146
|
-
marks: [],
|
|
147
|
-
side: 1000,
|
|
198
|
+
// src/plugin/invisible-characters/paragraph.ts
|
|
199
|
+
var ParagraphNode = class extends InvisibleNode {
|
|
200
|
+
constructor() {
|
|
201
|
+
super({
|
|
202
|
+
type: "paragraph",
|
|
203
|
+
predicate: (node) => node.type === node.type.schema.nodes.paragraph
|
|
148
204
|
});
|
|
205
|
+
}
|
|
149
206
|
};
|
|
150
207
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
let newDecorations = decorations;
|
|
163
|
-
doc.nodesBetween(from, to, (node, pos) => {
|
|
164
|
-
if (this.test(node)) {
|
|
165
|
-
const decorationPosition = this.position(node, pos);
|
|
166
|
-
const oldDecorations = newDecorations.find(decorationPosition, decorationPosition, spec => spec.key === this.type);
|
|
167
|
-
newDecorations = newDecorations
|
|
168
|
-
.remove(oldDecorations)
|
|
169
|
-
.add(doc, [createDecorationWidget(decorationPosition, this.type, this.content)]);
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
return newDecorations;
|
|
173
|
-
}
|
|
174
|
-
test(value) {
|
|
175
|
-
return this.predicate(value);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
class HardBreakNode extends InvisibleNode {
|
|
180
|
-
constructor() {
|
|
181
|
-
super({
|
|
182
|
-
type: 'break',
|
|
183
|
-
predicate: node => node.type === node.type.schema.nodes.hardBreak,
|
|
184
|
-
});
|
|
208
|
+
// src/plugin/utils/text-between.ts
|
|
209
|
+
var textBetween = (from, to, doc) => {
|
|
210
|
+
const positions = [];
|
|
211
|
+
doc.nodesBetween(from, to, (node, pos) => {
|
|
212
|
+
var _a;
|
|
213
|
+
if (node.isText) {
|
|
214
|
+
const offset = Math.max(from, pos) - pos;
|
|
215
|
+
positions.push({
|
|
216
|
+
pos: pos + offset,
|
|
217
|
+
text: ((_a = node.text) == null ? void 0 : _a.slice(offset, to - pos)) || ""
|
|
218
|
+
});
|
|
185
219
|
}
|
|
186
|
-
}
|
|
220
|
+
});
|
|
221
|
+
return positions;
|
|
222
|
+
};
|
|
187
223
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
}
|
|
224
|
+
// src/plugin/InvisibleCharacter.ts
|
|
225
|
+
var InvisibleCharacter = class {
|
|
226
|
+
constructor(options) {
|
|
227
|
+
this.predicate = options.predicate;
|
|
228
|
+
this.type = options.type;
|
|
229
|
+
this.content = options.content;
|
|
230
|
+
this.priority = options.priority || 100;
|
|
231
|
+
}
|
|
232
|
+
createDecoration(from, to, doc, decorations) {
|
|
233
|
+
const textContent = textBetween(from, to, doc);
|
|
234
|
+
return textContent.reduce((oldDecorations, currentPosition) => {
|
|
235
|
+
return currentPosition.text.split("").reduce((innerDecorations, char, i) => {
|
|
236
|
+
return this.test(char) ? innerDecorations.add(doc, [createDecorationWidget(currentPosition.pos + i, this.type, this.content)]) : innerDecorations;
|
|
237
|
+
}, oldDecorations);
|
|
238
|
+
}, decorations);
|
|
239
|
+
}
|
|
240
|
+
test(value) {
|
|
241
|
+
return this.predicate(value);
|
|
242
|
+
}
|
|
243
|
+
};
|
|
196
244
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
positions.push({
|
|
204
|
-
pos: pos + offset,
|
|
205
|
-
text: ((_a = node.text) === null || _a === void 0 ? void 0 : _a.slice(offset, to - pos)) || '',
|
|
206
|
-
});
|
|
207
|
-
}
|
|
245
|
+
// src/plugin/invisible-characters/space.ts
|
|
246
|
+
var SpaceCharacter = class extends InvisibleCharacter {
|
|
247
|
+
constructor() {
|
|
248
|
+
super({
|
|
249
|
+
type: "space",
|
|
250
|
+
predicate: (char) => char === " "
|
|
208
251
|
});
|
|
209
|
-
|
|
252
|
+
}
|
|
210
253
|
};
|
|
211
254
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
},
|
|
262
|
-
addStorage() {
|
|
263
|
-
return {
|
|
264
|
-
visibility: () => this.options.visible,
|
|
265
|
-
};
|
|
266
|
-
},
|
|
267
|
-
onBeforeCreate() {
|
|
268
|
-
this.storage.visibility = () => {
|
|
269
|
-
var _a;
|
|
270
|
-
return (_a = InvisibleCharactersPluginKey.getState(this.editor.state)) === null || _a === void 0 ? void 0 : _a.visible;
|
|
271
|
-
};
|
|
272
|
-
},
|
|
273
|
-
addCommands() {
|
|
274
|
-
return {
|
|
275
|
-
showInvisibleCharacters: (visibility = true) => ({ dispatch, tr }) => {
|
|
276
|
-
if (dispatch) {
|
|
277
|
-
tr.setMeta('setInvisibleCharactersVisible', visibility);
|
|
278
|
-
}
|
|
279
|
-
return true;
|
|
280
|
-
},
|
|
281
|
-
hideInvisibleCharacters: () => ({ dispatch, tr }) => {
|
|
282
|
-
if (dispatch) {
|
|
283
|
-
tr.setMeta('setInvisibleCharactersVisible', false);
|
|
284
|
-
}
|
|
285
|
-
return true;
|
|
286
|
-
},
|
|
287
|
-
toggleInvisibleCharacters: () => ({ dispatch, tr, state }) => {
|
|
288
|
-
var _a;
|
|
289
|
-
const visibility = !((_a = InvisibleCharactersPluginKey.getState(state)) === null || _a === void 0 ? void 0 : _a.visible);
|
|
290
|
-
if (dispatch) {
|
|
291
|
-
tr.setMeta('setInvisibleCharactersVisible', visibility);
|
|
292
|
-
}
|
|
293
|
-
return true;
|
|
294
|
-
},
|
|
295
|
-
};
|
|
296
|
-
},
|
|
255
|
+
// src/invisible-characters.ts
|
|
256
|
+
var InvisibleCharacters = Extension.create({
|
|
257
|
+
name: "invisibleCharacters",
|
|
258
|
+
addOptions() {
|
|
259
|
+
return {
|
|
260
|
+
visible: true,
|
|
261
|
+
builders: [new SpaceCharacter(), new ParagraphNode(), new HardBreakNode()],
|
|
262
|
+
injectCSS: true,
|
|
263
|
+
injectNonce: void 0
|
|
264
|
+
};
|
|
265
|
+
},
|
|
266
|
+
addProseMirrorPlugins() {
|
|
267
|
+
return [InvisibleCharactersPlugin(this.editor.state, this.options)];
|
|
268
|
+
},
|
|
269
|
+
addStorage() {
|
|
270
|
+
return {
|
|
271
|
+
visibility: () => this.options.visible
|
|
272
|
+
};
|
|
273
|
+
},
|
|
274
|
+
onBeforeCreate() {
|
|
275
|
+
this.storage.visibility = () => {
|
|
276
|
+
var _a;
|
|
277
|
+
return (_a = InvisibleCharactersPluginKey.getState(this.editor.state)) == null ? void 0 : _a.visible;
|
|
278
|
+
};
|
|
279
|
+
},
|
|
280
|
+
addCommands() {
|
|
281
|
+
return {
|
|
282
|
+
showInvisibleCharacters: (visibility = true) => ({ dispatch, tr }) => {
|
|
283
|
+
if (dispatch) {
|
|
284
|
+
tr.setMeta("setInvisibleCharactersVisible", visibility);
|
|
285
|
+
}
|
|
286
|
+
return true;
|
|
287
|
+
},
|
|
288
|
+
hideInvisibleCharacters: () => ({ dispatch, tr }) => {
|
|
289
|
+
if (dispatch) {
|
|
290
|
+
tr.setMeta("setInvisibleCharactersVisible", false);
|
|
291
|
+
}
|
|
292
|
+
return true;
|
|
293
|
+
},
|
|
294
|
+
toggleInvisibleCharacters: () => ({ dispatch, tr, state }) => {
|
|
295
|
+
var _a;
|
|
296
|
+
const visibility = !((_a = InvisibleCharactersPluginKey.getState(state)) == null ? void 0 : _a.visible);
|
|
297
|
+
if (dispatch) {
|
|
298
|
+
tr.setMeta("setInvisibleCharactersVisible", visibility);
|
|
299
|
+
}
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
}
|
|
297
304
|
});
|
|
298
305
|
|
|
299
|
-
|
|
300
|
-
|
|
306
|
+
// src/index.ts
|
|
307
|
+
var index_default = InvisibleCharacters;
|
|
308
|
+
export {
|
|
309
|
+
HardBreakNode,
|
|
310
|
+
InvisibleCharacter,
|
|
311
|
+
InvisibleCharacters,
|
|
312
|
+
InvisibleNode,
|
|
313
|
+
ParagraphNode,
|
|
314
|
+
SpaceCharacter,
|
|
315
|
+
index_default as default
|
|
316
|
+
};
|
|
317
|
+
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/plugin/reducers.ts","../src/plugin/style.ts","../src/plugin/utils/create-style-tag.ts","../src/plugin/utils/get-updated-ranges.ts","../src/plugin/InvisibleCharactersPlugin.ts","../src/plugin/utils/create-decoration-widget.ts","../src/plugin/InvisibleNode.ts","../src/plugin/invisible-characters/hardBreak.ts","../src/plugin/invisible-characters/paragraph.ts","../src/plugin/utils/text-between.ts","../src/plugin/InvisibleCharacter.ts","../src/plugin/invisible-characters/space.ts","../src/invisible-characters.ts"],"sourcesContent":["import { PluginState } from '../types.js'\n\nexport const stateReducer = (\n state: PluginState,\n visible: boolean,\n): PluginState => {\n if (visible === undefined) {\n return state\n }\n\n return { ...state, visible }\n}\n\nexport default stateReducer\n","export const style = `.Tiptap-invisible-character {\n height: 0;\n padding: 0;\n pointer-events: none;\n user-select: none;\n width: 0;\n}\n\n.Tiptap-invisible-character::before {\n caret-color: inherit;\n color: #aaa;\n display: inline-block;\n font-style: normal;\n font-weight: 400;\n line-height: 1em;\n width: 0;\n}\n\n.Tiptap-invisible-character--space::before {\n content: '·'\n}\n\n.Tiptap-invisible-character--break::before {\n content: '¬'\n}\n\n.Tiptap-invisible-character--paragraph::before {\n content: '¶'\n}\n\n.Tiptap-invisible-character + img.ProseMirror-separator {\n height: 0 !important;\n pointer-events: none;\n user-select: none;\n width: 0 !important;\n}\n\n.is-empty[data-placeholder].has-focus > .Tiptap-invisible-character {\n display: none;\n}\n`\n\nexport default style\n","export const createStyleTag = (style: string, nonce?: string): HTMLStyleElement => {\n const tiptapStyleTag = (<HTMLStyleElement>document.querySelector('style[data-tiptap-extension-invisible-characters-style]'))\n\n if (tiptapStyleTag !== null) {\n return tiptapStyleTag\n }\n\n const styleNode = document.createElement('style')\n\n if (nonce) {\n styleNode.setAttribute('nonce', nonce)\n }\n\n styleNode.setAttribute('data-tiptap-extension-invisible-characters-style', '')\n styleNode.innerHTML = style\n document.getElementsByTagName('head')[0].appendChild(styleNode)\n\n return styleNode\n}\n\nexport default createStyleTag\n","import { Transaction } from '@tiptap/pm/state'\n\ntype StepRange = [from: number, to: number];\n\nexport const getUpdatedRanges = ({ mapping }: Transaction): StepRange[] => {\n const ranges: StepRange[] = []\n\n mapping.maps.forEach((stepMap, i) => {\n stepMap.forEach((_oldStart, _oldEnd, newStart, newEnd) => {\n ranges.push([\n mapping.slice(i + 1).map(newStart),\n mapping.slice(i + 1).map(newEnd),\n ])\n })\n })\n\n return ranges\n}\n\nexport default getUpdatedRanges\n","import {\n AllSelection, EditorState, Plugin, PluginKey,\n} from '@tiptap/pm/state'\nimport { DecorationSet } from '@tiptap/pm/view'\n\nimport { InvisibleCharactersOptions, PluginState } from '../types.js'\nimport { stateReducer } from './reducers.js'\nimport { style } from './style.js'\nimport { createStyleTag } from './utils/create-style-tag.js'\nimport { getUpdatedRanges } from './utils/get-updated-ranges.js'\n\nexport const InvisibleCharactersPluginKey = new PluginKey<PluginState>('invisibleCharacters')\n\nexport const InvisibleCharactersPlugin = (state: EditorState, options: InvisibleCharactersOptions) => {\n const key = InvisibleCharactersPluginKey\n const emptyDecorationSet = DecorationSet.create(state.doc, [])\n\n const addDecorationsBetweenPositions = (\n from: number,\n to: number,\n editorState: EditorState,\n decorations: DecorationSet,\n ) => {\n return options.builders.sort((builderA, builderB) => {\n if (builderA.priority > builderB.priority) {\n return 1\n }\n\n return -1\n }).reduce((newDecos, builder) => {\n return builder.createDecoration(from, to, editorState.doc, newDecos)\n }, decorations)\n }\n\n return new Plugin({\n key,\n\n state: {\n init: () => {\n const { $from, $to } = new AllSelection(state.doc)\n\n if (options.injectCSS && document) {\n createStyleTag(style, options.injectNonce)\n }\n\n return {\n visible: options.visible,\n decorations: addDecorationsBetweenPositions($from.pos, $to.pos, state, DecorationSet.empty),\n }\n },\n apply: (tr, pluginState, _, currentState) => {\n const newPluginState = stateReducer(pluginState, tr.getMeta('setInvisibleCharactersVisible'))\n\n const decorations = getUpdatedRanges(tr).reduce((nextDecorations, [from, to]) => {\n return addDecorationsBetweenPositions(from, to, currentState, nextDecorations)\n }, newPluginState.decorations.map(tr.mapping, tr.doc))\n\n return {\n ...newPluginState,\n decorations,\n }\n },\n },\n\n props: {\n decorations(editorState) {\n const pluginState = this.getState(editorState)\n\n const visible = pluginState?.visible\n const decorations = pluginState?.decorations\n\n return visible ? decorations : emptyDecorationSet\n },\n },\n\n })\n}\n\nexport default InvisibleCharactersPlugin\n","import { Decoration } from '@tiptap/pm/view'\n\nexport const createDecorationWidget = (pos: number, type: string, content?: string) => {\n const createElement = () => {\n const newElement = document.createElement('span')\n\n newElement.classList.add('Tiptap-invisible-character')\n newElement.classList.add(`Tiptap-invisible-character--${type}`)\n\n if (content) {\n newElement.textContent = content\n }\n\n return newElement\n }\n\n // return Decoration.inline(pos - 1, pos, {\n // class: `Tiptap-invisible-character Tiptap-invisible-character--${type}`,\n // })\n\n return Decoration.widget(pos, createElement, {\n key: type,\n marks: [],\n side: 1000,\n })\n}\n\nexport default createDecorationWidget\n","import { Node } from '@tiptap/pm/model'\nimport { DecorationSet } from '@tiptap/pm/view'\n\nimport { createDecorationWidget } from './utils/create-decoration-widget.js'\n\nexport interface InvisibleNodeOptions {\n content?: string\n position?: (node: Node, pos: number) => number;\n predicate: (value: Node) => boolean\n priority?: number\n type: string;\n}\n\n/** Default position for nodes is always at the end of the node */\nconst defaultPosition = (node: Node, pos: number) => pos + node.nodeSize - 1\n\nexport class InvisibleNode {\n predicate: (value: Node) => boolean\n\n position: (node: Node, pos: number) => number\n\n content ?: string\n\n type: string\n\n priority: number\n\n constructor(options: InvisibleNodeOptions) {\n this.predicate = options.predicate\n this.type = options.type\n this.position = options.position || defaultPosition\n this.content = options.content\n this.priority = options.priority || 100\n }\n\n createDecoration(from: number, to: number, doc: Node, decorations: DecorationSet) {\n let newDecorations = decorations\n\n doc.nodesBetween(from, to, (node, pos) => {\n if (this.test(node)) {\n const decorationPosition = this.position(node, pos)\n const oldDecorations = newDecorations.find(\n decorationPosition,\n decorationPosition,\n spec => spec.key === this.type,\n )\n\n newDecorations = newDecorations\n .remove(oldDecorations)\n .add(doc, [createDecorationWidget(decorationPosition, this.type, this.content)])\n }\n })\n return newDecorations\n }\n\n test(value: Node) {\n return this.predicate(value)\n }\n}\n\nexport default InvisibleNode\n","import { InvisibleNode } from '../InvisibleNode.js'\n\nexport class HardBreakNode extends InvisibleNode {\n constructor() {\n super({\n type: 'break',\n predicate: node => node.type === node.type.schema.nodes.hardBreak,\n })\n }\n}\n\nexport default HardBreakNode\n","import { InvisibleNode } from '../InvisibleNode.js'\n\nexport class ParagraphNode extends InvisibleNode {\n constructor() {\n super({\n type: 'paragraph',\n predicate: node => node.type === node.type.schema.nodes.paragraph,\n })\n }\n}\n\nexport default ParagraphNode\n","import { Node } from '@tiptap/pm/model'\n\nimport { Position } from '../../types.js'\n\nexport const textBetween = (from: number, to: number, doc: Node) => {\n const positions: Position[] = []\n\n doc.nodesBetween(from, to, (node, pos) => {\n if (node.isText) {\n const offset = Math.max(from, pos) - pos\n\n positions.push({\n pos: pos + offset,\n text: node.text?.slice(offset, to - pos) || '',\n })\n }\n })\n\n return positions\n}\n\nexport default textBetween\n","import { Node } from '@tiptap/pm/model'\nimport { DecorationSet } from '@tiptap/pm/view'\n\nimport { createDecorationWidget } from './utils/create-decoration-widget.js'\nimport { textBetween } from './utils/text-between.js'\n\nexport interface InvisibleCharacterOptions {\n type: string;\n predicate: (value: string) => boolean\n priority?: number\n content?: string\n}\n\nexport class InvisibleCharacter {\n predicate: (value: string) => boolean\n\n content?: string\n\n type: string\n\n priority: number\n\n constructor(options: InvisibleCharacterOptions) {\n this.predicate = options.predicate\n this.type = options.type\n this.content = options.content\n this.priority = options.priority || 100\n }\n\n createDecoration(from: number, to: number, doc: Node, decorations: DecorationSet) {\n const textContent = textBetween(from, to, doc)\n\n return textContent.reduce((oldDecorations, currentPosition) => {\n return currentPosition.text.split('').reduce((innerDecorations, char, i) => {\n return this.test(char)\n ? innerDecorations.add(doc, [createDecorationWidget(currentPosition.pos + i, this.type, this.content)])\n : innerDecorations\n }, oldDecorations)\n }, decorations)\n }\n\n test(value: string) {\n return this.predicate(value)\n }\n}\n\nexport default InvisibleCharacter\n","import { InvisibleCharacter } from '../InvisibleCharacter.js'\n\nexport class SpaceCharacter extends InvisibleCharacter {\n constructor() {\n super({\n type: 'space',\n predicate: (char: string) => char === ' ',\n })\n }\n}\n\nexport default SpaceCharacter\n","import { Extension } from '@tiptap/core'\n\nimport { InvisibleCharactersPlugin, InvisibleCharactersPluginKey } from './plugin/index.js'\nimport { HardBreakNode } from './plugin/invisible-characters/hardBreak.js'\nimport { ParagraphNode } from './plugin/invisible-characters/paragraph.js'\nimport { SpaceCharacter } from './plugin/invisible-characters/space.js'\nimport { InvisibleCharactersOptions } from './types.js'\n\nexport {\n HardBreakNode,\n ParagraphNode,\n SpaceCharacter,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n invisibleCharacters: {\n /**\n * Show invisible characters\n */\n showInvisibleCharacters: (show?: boolean) => ReturnType\n\n /**\n * Hide invisible characters\n */\n hideInvisibleCharacters: () => ReturnType\n\n /**\n * Toggle invisible characters\n */\n toggleInvisibleCharacters: () => ReturnType\n }\n }\n}\n\nexport const InvisibleCharacters = Extension.create<InvisibleCharactersOptions>({\n name: 'invisibleCharacters',\n\n addOptions() {\n return {\n visible: true,\n builders: [\n new SpaceCharacter(),\n new ParagraphNode(),\n new HardBreakNode(),\n ],\n injectCSS: true,\n injectNonce: undefined,\n }\n },\n\n addProseMirrorPlugins() {\n return [\n InvisibleCharactersPlugin(this.editor.state, this.options),\n ]\n },\n\n addStorage() {\n return {\n visibility: () => this.options.visible,\n }\n },\n\n onBeforeCreate() {\n this.storage.visibility = () => {\n return InvisibleCharactersPluginKey.getState(this.editor.state)?.visible\n }\n },\n\n addCommands() {\n return {\n showInvisibleCharacters: (visibility = true) => ({ dispatch, tr }) => {\n if (dispatch) {\n tr.setMeta('setInvisibleCharactersVisible', visibility)\n }\n\n return true\n },\n hideInvisibleCharacters: () => ({ dispatch, tr }) => {\n if (dispatch) {\n tr.setMeta('setInvisibleCharactersVisible', false)\n }\n\n return true\n },\n toggleInvisibleCharacters: () => ({ dispatch, tr, state }) => {\n const visibility = !InvisibleCharactersPluginKey.getState(state)?.visible\n\n if (dispatch) {\n tr.setMeta('setInvisibleCharactersVisible', visibility)\n }\n\n return true\n },\n }\n },\n})\n\nexport default InvisibleCharacters\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/invisible-characters.ts","../src/plugin/InvisibleCharactersPlugin.ts","../src/plugin/reducers.ts","../src/plugin/style.ts","../src/plugin/utils/create-style-tag.ts","../src/plugin/utils/get-updated-ranges.ts","../src/plugin/utils/create-decoration-widget.ts","../src/plugin/InvisibleNode.ts","../src/plugin/invisible-characters/hardBreak.ts","../src/plugin/invisible-characters/paragraph.ts","../src/plugin/utils/text-between.ts","../src/plugin/InvisibleCharacter.ts","../src/plugin/invisible-characters/space.ts","../src/index.ts"],"sourcesContent":["import { Extension } from '@tiptap/core'\n\nimport { InvisibleCharactersPlugin, InvisibleCharactersPluginKey } from './plugin/index.js'\nimport { HardBreakNode } from './plugin/invisible-characters/hardBreak.js'\nimport { ParagraphNode } from './plugin/invisible-characters/paragraph.js'\nimport { SpaceCharacter } from './plugin/invisible-characters/space.js'\nimport type { InvisibleCharactersOptions } from './types.js'\n\nexport { HardBreakNode, ParagraphNode, SpaceCharacter }\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n invisibleCharacters: {\n /**\n * Show invisible characters\n */\n showInvisibleCharacters: (show?: boolean) => ReturnType\n\n /**\n * Hide invisible characters\n */\n hideInvisibleCharacters: () => ReturnType\n\n /**\n * Toggle invisible characters\n */\n toggleInvisibleCharacters: () => ReturnType\n }\n }\n}\n\nexport const InvisibleCharacters = Extension.create<InvisibleCharactersOptions>({\n name: 'invisibleCharacters',\n\n addOptions() {\n return {\n visible: true,\n builders: [new SpaceCharacter(), new ParagraphNode(), new HardBreakNode()],\n injectCSS: true,\n injectNonce: undefined,\n }\n },\n\n addProseMirrorPlugins() {\n return [InvisibleCharactersPlugin(this.editor.state, this.options)]\n },\n\n addStorage() {\n return {\n visibility: () => this.options.visible,\n }\n },\n\n onBeforeCreate() {\n this.storage.visibility = () => {\n return InvisibleCharactersPluginKey.getState(this.editor.state)?.visible\n }\n },\n\n addCommands() {\n return {\n showInvisibleCharacters:\n (visibility = true) =>\n ({ dispatch, tr }) => {\n if (dispatch) {\n tr.setMeta('setInvisibleCharactersVisible', visibility)\n }\n\n return true\n },\n hideInvisibleCharacters:\n () =>\n ({ dispatch, tr }) => {\n if (dispatch) {\n tr.setMeta('setInvisibleCharactersVisible', false)\n }\n\n return true\n },\n toggleInvisibleCharacters:\n () =>\n ({ dispatch, tr, state }) => {\n const visibility = !InvisibleCharactersPluginKey.getState(state)?.visible\n\n if (dispatch) {\n tr.setMeta('setInvisibleCharactersVisible', visibility)\n }\n\n return true\n },\n }\n },\n})\n\nexport default InvisibleCharacters\n","import type { EditorState } from '@tiptap/pm/state'\nimport { AllSelection, Plugin, PluginKey } from '@tiptap/pm/state'\nimport { DecorationSet } from '@tiptap/pm/view'\n\nimport type { InvisibleCharactersOptions, PluginState } from '../types.js'\nimport { stateReducer } from './reducers.js'\nimport { style } from './style.js'\nimport { createStyleTag } from './utils/create-style-tag.js'\nimport { getUpdatedRanges } from './utils/get-updated-ranges.js'\n\nexport const InvisibleCharactersPluginKey = new PluginKey<PluginState>('invisibleCharacters')\n\nexport const InvisibleCharactersPlugin = (state: EditorState, options: InvisibleCharactersOptions) => {\n const key = InvisibleCharactersPluginKey\n const emptyDecorationSet = DecorationSet.create(state.doc, [])\n\n const addDecorationsBetweenPositions = (\n from: number,\n to: number,\n editorState: EditorState,\n decorations: DecorationSet,\n ) => {\n return options.builders\n .sort((builderA, builderB) => {\n if (builderA.priority > builderB.priority) {\n return 1\n }\n\n return -1\n })\n .reduce((newDecos, builder) => {\n return builder.createDecoration(from, to, editorState.doc, newDecos)\n }, decorations)\n }\n\n return new Plugin({\n key,\n\n state: {\n init: () => {\n const { $from, $to } = new AllSelection(state.doc)\n\n if (options.injectCSS && document) {\n createStyleTag(style, options.injectNonce)\n }\n\n return {\n visible: options.visible,\n decorations: addDecorationsBetweenPositions($from.pos, $to.pos, state, DecorationSet.empty),\n }\n },\n apply: (tr, pluginState, _, currentState) => {\n const newPluginState = stateReducer(pluginState, tr.getMeta('setInvisibleCharactersVisible'))\n\n const decorations = getUpdatedRanges(tr).reduce(\n (nextDecorations, [from, to]) => {\n return addDecorationsBetweenPositions(from, to, currentState, nextDecorations)\n },\n newPluginState.decorations.map(tr.mapping, tr.doc),\n )\n\n return {\n ...newPluginState,\n decorations,\n }\n },\n },\n\n props: {\n decorations(editorState) {\n const pluginState = this.getState(editorState)\n\n const visible = pluginState?.visible\n const decorations = pluginState?.decorations\n\n return visible ? decorations : emptyDecorationSet\n },\n },\n })\n}\n\nexport default InvisibleCharactersPlugin\n","import type { PluginState } from '../types.js'\n\nexport const stateReducer = (state: PluginState, visible: boolean): PluginState => {\n if (visible === undefined) {\n return state\n }\n\n return { ...state, visible }\n}\n\nexport default stateReducer\n","export const style = `.Tiptap-invisible-character {\n height: 0;\n padding: 0;\n pointer-events: none;\n user-select: none;\n width: 0;\n}\n\n.Tiptap-invisible-character::before {\n caret-color: inherit;\n color: #aaa;\n display: inline-block;\n font-style: normal;\n font-weight: 400;\n line-height: 1em;\n width: 0;\n}\n\n.Tiptap-invisible-character--space::before {\n content: '·'\n}\n\n.Tiptap-invisible-character--break::before {\n content: '¬'\n}\n\n.Tiptap-invisible-character--paragraph::before {\n content: '¶'\n}\n\n.Tiptap-invisible-character + img.ProseMirror-separator {\n height: 0 !important;\n pointer-events: none;\n user-select: none;\n width: 0 !important;\n}\n\n.is-empty[data-placeholder].has-focus > .Tiptap-invisible-character {\n display: none;\n}\n`\n\nexport default style\n","export const createStyleTag = (style: string, nonce?: string): HTMLStyleElement => {\n const tiptapStyleTag = <HTMLStyleElement>(\n document.querySelector('style[data-tiptap-extension-invisible-characters-style]')\n )\n\n if (tiptapStyleTag !== null) {\n return tiptapStyleTag\n }\n\n const styleNode = document.createElement('style')\n\n if (nonce) {\n styleNode.setAttribute('nonce', nonce)\n }\n\n styleNode.setAttribute('data-tiptap-extension-invisible-characters-style', '')\n styleNode.innerHTML = style\n document.getElementsByTagName('head')[0].appendChild(styleNode)\n\n return styleNode\n}\n\nexport default createStyleTag\n","import type { Transaction } from '@tiptap/pm/state'\n\ntype StepRange = [from: number, to: number]\n\nexport const getUpdatedRanges = ({ mapping }: Transaction): StepRange[] => {\n const ranges: StepRange[] = []\n\n mapping.maps.forEach((stepMap, i) => {\n stepMap.forEach((_oldStart, _oldEnd, newStart, newEnd) => {\n ranges.push([mapping.slice(i + 1).map(newStart), mapping.slice(i + 1).map(newEnd)])\n })\n })\n\n return ranges\n}\n\nexport default getUpdatedRanges\n","import { Decoration } from '@tiptap/pm/view'\n\nexport const createDecorationWidget = (pos: number, type: string, content?: string) => {\n const createElement = () => {\n const newElement = document.createElement('span')\n\n newElement.classList.add('Tiptap-invisible-character')\n newElement.classList.add(`Tiptap-invisible-character--${type}`)\n\n if (content) {\n newElement.textContent = content\n }\n\n return newElement\n }\n\n // return Decoration.inline(pos - 1, pos, {\n // class: `Tiptap-invisible-character Tiptap-invisible-character--${type}`,\n // })\n\n return Decoration.widget(pos, createElement, {\n key: type,\n marks: [],\n side: 1000,\n })\n}\n\nexport default createDecorationWidget\n","import type { Node } from '@tiptap/pm/model'\nimport type { DecorationSet } from '@tiptap/pm/view'\n\nimport { createDecorationWidget } from './utils/create-decoration-widget.js'\n\nexport interface InvisibleNodeOptions {\n content?: string\n position?: (node: Node, pos: number) => number\n predicate: (value: Node) => boolean\n priority?: number\n type: string\n}\n\n/** Default position for nodes is always at the end of the node */\nconst defaultPosition = (node: Node, pos: number) => pos + node.nodeSize - 1\n\nexport class InvisibleNode {\n predicate: (value: Node) => boolean\n\n position: (node: Node, pos: number) => number\n\n content?: string\n\n type: string\n\n priority: number\n\n constructor(options: InvisibleNodeOptions) {\n this.predicate = options.predicate\n this.type = options.type\n this.position = options.position || defaultPosition\n this.content = options.content\n this.priority = options.priority || 100\n }\n\n createDecoration(from: number, to: number, doc: Node, decorations: DecorationSet) {\n let newDecorations = decorations\n\n doc.nodesBetween(from, to, (node, pos) => {\n if (this.test(node)) {\n const decorationPosition = this.position(node, pos)\n const oldDecorations = newDecorations.find(\n decorationPosition,\n decorationPosition,\n spec => spec.key === this.type,\n )\n\n newDecorations = newDecorations\n .remove(oldDecorations)\n .add(doc, [createDecorationWidget(decorationPosition, this.type, this.content)])\n }\n })\n return newDecorations\n }\n\n test(value: Node) {\n return this.predicate(value)\n }\n}\n\nexport default InvisibleNode\n","import { InvisibleNode } from '../InvisibleNode.js'\n\nexport class HardBreakNode extends InvisibleNode {\n constructor() {\n super({\n type: 'break',\n predicate: node => node.type === node.type.schema.nodes.hardBreak,\n })\n }\n}\n\nexport default HardBreakNode\n","import { InvisibleNode } from '../InvisibleNode.js'\n\nexport class ParagraphNode extends InvisibleNode {\n constructor() {\n super({\n type: 'paragraph',\n predicate: node => node.type === node.type.schema.nodes.paragraph,\n })\n }\n}\n\nexport default ParagraphNode\n","import type { Node } from '@tiptap/pm/model'\n\nimport type { Position } from '../../types.js'\n\nexport const textBetween = (from: number, to: number, doc: Node) => {\n const positions: Position[] = []\n\n doc.nodesBetween(from, to, (node, pos) => {\n if (node.isText) {\n const offset = Math.max(from, pos) - pos\n\n positions.push({\n pos: pos + offset,\n text: node.text?.slice(offset, to - pos) || '',\n })\n }\n })\n\n return positions\n}\n\nexport default textBetween\n","import type { Node } from '@tiptap/pm/model'\nimport type { DecorationSet } from '@tiptap/pm/view'\n\nimport { createDecorationWidget } from './utils/create-decoration-widget.js'\nimport { textBetween } from './utils/text-between.js'\n\nexport interface InvisibleCharacterOptions {\n type: string\n predicate: (value: string) => boolean\n priority?: number\n content?: string\n}\n\nexport class InvisibleCharacter {\n predicate: (value: string) => boolean\n\n content?: string\n\n type: string\n\n priority: number\n\n constructor(options: InvisibleCharacterOptions) {\n this.predicate = options.predicate\n this.type = options.type\n this.content = options.content\n this.priority = options.priority || 100\n }\n\n createDecoration(from: number, to: number, doc: Node, decorations: DecorationSet) {\n const textContent = textBetween(from, to, doc)\n\n return textContent.reduce((oldDecorations, currentPosition) => {\n return currentPosition.text.split('').reduce((innerDecorations, char, i) => {\n return this.test(char)\n ? innerDecorations.add(doc, [createDecorationWidget(currentPosition.pos + i, this.type, this.content)])\n : innerDecorations\n }, oldDecorations)\n }, decorations)\n }\n\n test(value: string) {\n return this.predicate(value)\n }\n}\n\nexport default InvisibleCharacter\n","import { InvisibleCharacter } from '../InvisibleCharacter.js'\n\nexport class SpaceCharacter extends InvisibleCharacter {\n constructor() {\n super({\n type: 'space',\n predicate: (char: string) => char === ' ',\n })\n }\n}\n\nexport default SpaceCharacter\n","import { InvisibleCharacters } from './invisible-characters.js'\n\nexport * from './invisible-characters.js'\nexport * from './plugin/invisible-characters/hardBreak.js'\nexport * from './plugin/invisible-characters/paragraph.js'\nexport * from './plugin/invisible-characters/space.js'\nexport * from './plugin/InvisibleCharacter.js'\nexport * from './plugin/InvisibleNode.js'\nexport * from './types.js'\n\nexport default InvisibleCharacters\n"],"mappings":";AAAA,SAAS,iBAAiB;;;ACC1B,SAAS,cAAc,QAAQ,iBAAiB;AAChD,SAAS,qBAAqB;;;ACAvB,IAAM,eAAe,CAAC,OAAoB,YAAkC;AACjF,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,GAAG,OAAO,QAAQ;AAC7B;;;ACRO,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAd,IAAM,iBAAiB,CAACA,QAAe,UAAqC;AACjF,QAAM,iBACJ,SAAS,cAAc,yDAAyD;AAGlF,MAAI,mBAAmB,MAAM;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,SAAS,cAAc,OAAO;AAEhD,MAAI,OAAO;AACT,cAAU,aAAa,SAAS,KAAK;AAAA,EACvC;AAEA,YAAU,aAAa,oDAAoD,EAAE;AAC7E,YAAU,YAAYA;AACtB,WAAS,qBAAqB,MAAM,EAAE,CAAC,EAAE,YAAY,SAAS;AAE9D,SAAO;AACT;;;AChBO,IAAM,mBAAmB,CAAC,EAAE,QAAQ,MAAgC;AACzE,QAAM,SAAsB,CAAC;AAE7B,UAAQ,KAAK,QAAQ,CAAC,SAAS,MAAM;AACnC,YAAQ,QAAQ,CAAC,WAAW,SAAS,UAAU,WAAW;AACxD,aAAO,KAAK,CAAC,QAAQ,MAAM,IAAI,CAAC,EAAE,IAAI,QAAQ,GAAG,QAAQ,MAAM,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC,CAAC;AAAA,IACpF,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AACT;;;AJJO,IAAM,+BAA+B,IAAI,UAAuB,qBAAqB;AAErF,IAAM,4BAA4B,CAAC,OAAoB,YAAwC;AACpG,QAAM,MAAM;AACZ,QAAM,qBAAqB,cAAc,OAAO,MAAM,KAAK,CAAC,CAAC;AAE7D,QAAM,iCAAiC,CACrC,MACA,IACA,aACA,gBACG;AACH,WAAO,QAAQ,SACZ,KAAK,CAAC,UAAU,aAAa;AAC5B,UAAI,SAAS,WAAW,SAAS,UAAU;AACzC,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,CAAC,EACA,OAAO,CAAC,UAAU,YAAY;AAC7B,aAAO,QAAQ,iBAAiB,MAAM,IAAI,YAAY,KAAK,QAAQ;AAAA,IACrE,GAAG,WAAW;AAAA,EAClB;AAEA,SAAO,IAAI,OAAO;AAAA,IAChB;AAAA,IAEA,OAAO;AAAA,MACL,MAAM,MAAM;AACV,cAAM,EAAE,OAAO,IAAI,IAAI,IAAI,aAAa,MAAM,GAAG;AAEjD,YAAI,QAAQ,aAAa,UAAU;AACjC,yBAAe,OAAO,QAAQ,WAAW;AAAA,QAC3C;AAEA,eAAO;AAAA,UACL,SAAS,QAAQ;AAAA,UACjB,aAAa,+BAA+B,MAAM,KAAK,IAAI,KAAK,OAAO,cAAc,KAAK;AAAA,QAC5F;AAAA,MACF;AAAA,MACA,OAAO,CAAC,IAAI,aAAa,GAAG,iBAAiB;AAC3C,cAAM,iBAAiB,aAAa,aAAa,GAAG,QAAQ,+BAA+B,CAAC;AAE5F,cAAM,cAAc,iBAAiB,EAAE,EAAE;AAAA,UACvC,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM;AAC/B,mBAAO,+BAA+B,MAAM,IAAI,cAAc,eAAe;AAAA,UAC/E;AAAA,UACA,eAAe,YAAY,IAAI,GAAG,SAAS,GAAG,GAAG;AAAA,QACnD;AAEA,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,YAAY,aAAa;AACvB,cAAM,cAAc,KAAK,SAAS,WAAW;AAE7C,cAAM,UAAU,2CAAa;AAC7B,cAAM,cAAc,2CAAa;AAEjC,eAAO,UAAU,cAAc;AAAA,MACjC;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AK/EA,SAAS,kBAAkB;AAEpB,IAAM,yBAAyB,CAAC,KAAa,MAAc,YAAqB;AACrF,QAAM,gBAAgB,MAAM;AAC1B,UAAM,aAAa,SAAS,cAAc,MAAM;AAEhD,eAAW,UAAU,IAAI,4BAA4B;AACrD,eAAW,UAAU,IAAI,+BAA+B,IAAI,EAAE;AAE9D,QAAI,SAAS;AACX,iBAAW,cAAc;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AAMA,SAAO,WAAW,OAAO,KAAK,eAAe;AAAA,IAC3C,KAAK;AAAA,IACL,OAAO,CAAC;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AACH;;;ACXA,IAAM,kBAAkB,CAAC,MAAY,QAAgB,MAAM,KAAK,WAAW;AAEpE,IAAM,gBAAN,MAAoB;AAAA,EAWzB,YAAY,SAA+B;AACzC,SAAK,YAAY,QAAQ;AACzB,SAAK,OAAO,QAAQ;AACpB,SAAK,WAAW,QAAQ,YAAY;AACpC,SAAK,UAAU,QAAQ;AACvB,SAAK,WAAW,QAAQ,YAAY;AAAA,EACtC;AAAA,EAEA,iBAAiB,MAAc,IAAY,KAAW,aAA4B;AAChF,QAAI,iBAAiB;AAErB,QAAI,aAAa,MAAM,IAAI,CAAC,MAAM,QAAQ;AACxC,UAAI,KAAK,KAAK,IAAI,GAAG;AACnB,cAAM,qBAAqB,KAAK,SAAS,MAAM,GAAG;AAClD,cAAM,iBAAiB,eAAe;AAAA,UACpC;AAAA,UACA;AAAA,UACA,UAAQ,KAAK,QAAQ,KAAK;AAAA,QAC5B;AAEA,yBAAiB,eACd,OAAO,cAAc,EACrB,IAAI,KAAK,CAAC,uBAAuB,oBAAoB,KAAK,MAAM,KAAK,OAAO,CAAC,CAAC;AAAA,MACnF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,OAAa;AAChB,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AACF;;;ACxDO,IAAM,gBAAN,cAA4B,cAAc;AAAA,EAC/C,cAAc;AACZ,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,WAAW,UAAQ,KAAK,SAAS,KAAK,KAAK,OAAO,MAAM;AAAA,IAC1D,CAAC;AAAA,EACH;AACF;;;ACPO,IAAM,gBAAN,cAA4B,cAAc;AAAA,EAC/C,cAAc;AACZ,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,WAAW,UAAQ,KAAK,SAAS,KAAK,KAAK,OAAO,MAAM;AAAA,IAC1D,CAAC;AAAA,EACH;AACF;;;ACLO,IAAM,cAAc,CAAC,MAAc,IAAY,QAAc;AAClE,QAAM,YAAwB,CAAC;AAE/B,MAAI,aAAa,MAAM,IAAI,CAAC,MAAM,QAAQ;AAP5C;AAQI,QAAI,KAAK,QAAQ;AACf,YAAM,SAAS,KAAK,IAAI,MAAM,GAAG,IAAI;AAErC,gBAAU,KAAK;AAAA,QACb,KAAK,MAAM;AAAA,QACX,QAAM,UAAK,SAAL,mBAAW,MAAM,QAAQ,KAAK,SAAQ;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ACNO,IAAM,qBAAN,MAAyB;AAAA,EAS9B,YAAY,SAAoC;AAC9C,SAAK,YAAY,QAAQ;AACzB,SAAK,OAAO,QAAQ;AACpB,SAAK,UAAU,QAAQ;AACvB,SAAK,WAAW,QAAQ,YAAY;AAAA,EACtC;AAAA,EAEA,iBAAiB,MAAc,IAAY,KAAW,aAA4B;AAChF,UAAM,cAAc,YAAY,MAAM,IAAI,GAAG;AAE7C,WAAO,YAAY,OAAO,CAAC,gBAAgB,oBAAoB;AAC7D,aAAO,gBAAgB,KAAK,MAAM,EAAE,EAAE,OAAO,CAAC,kBAAkB,MAAM,MAAM;AAC1E,eAAO,KAAK,KAAK,IAAI,IACjB,iBAAiB,IAAI,KAAK,CAAC,uBAAuB,gBAAgB,MAAM,GAAG,KAAK,MAAM,KAAK,OAAO,CAAC,CAAC,IACpG;AAAA,MACN,GAAG,cAAc;AAAA,IACnB,GAAG,WAAW;AAAA,EAChB;AAAA,EAEA,KAAK,OAAe;AAClB,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AACF;;;AC1CO,IAAM,iBAAN,cAA6B,mBAAmB;AAAA,EACrD,cAAc;AACZ,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,WAAW,CAAC,SAAiB,SAAS;AAAA,IACxC,CAAC;AAAA,EACH;AACF;;;AZsBO,IAAM,sBAAsB,UAAU,OAAmC;AAAA,EAC9E,MAAM;AAAA,EAEN,aAAa;AACX,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,CAAC,IAAI,eAAe,GAAG,IAAI,cAAc,GAAG,IAAI,cAAc,CAAC;AAAA,MACzE,WAAW;AAAA,MACX,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,wBAAwB;AACtB,WAAO,CAAC,0BAA0B,KAAK,OAAO,OAAO,KAAK,OAAO,CAAC;AAAA,EACpE;AAAA,EAEA,aAAa;AACX,WAAO;AAAA,MACL,YAAY,MAAM,KAAK,QAAQ;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,iBAAiB;AACf,SAAK,QAAQ,aAAa,MAAM;AAtDpC;AAuDM,cAAO,kCAA6B,SAAS,KAAK,OAAO,KAAK,MAAvD,mBAA0D;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,yBACE,CAAC,aAAa,SACd,CAAC,EAAE,UAAU,GAAG,MAAM;AACpB,YAAI,UAAU;AACZ,aAAG,QAAQ,iCAAiC,UAAU;AAAA,QACxD;AAEA,eAAO;AAAA,MACT;AAAA,MACF,yBACE,MACA,CAAC,EAAE,UAAU,GAAG,MAAM;AACpB,YAAI,UAAU;AACZ,aAAG,QAAQ,iCAAiC,KAAK;AAAA,QACnD;AAEA,eAAO;AAAA,MACT;AAAA,MACF,2BACE,MACA,CAAC,EAAE,UAAU,IAAI,MAAM,MAAM;AAjFrC;AAkFU,cAAM,aAAa,GAAC,kCAA6B,SAAS,KAAK,MAA3C,mBAA8C;AAElE,YAAI,UAAU;AACZ,aAAG,QAAQ,iCAAiC,UAAU;AAAA,QACxD;AAEA,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,EACF;AACF,CAAC;;;AalFD,IAAO,gBAAQ;","names":["style"]}
|