@tiptap/extension-ruby-text 3.30.2 → 3.30.3
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/dist/index.cjs +255 -293
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +69 -64
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +69 -64
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +248 -264
- package/dist/index.js.map +1 -1
- package/package.json +10 -10
package/dist/index.cjs
CHANGED
|
@@ -1,317 +1,279 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/index.ts
|
|
21
|
-
var index_exports = {};
|
|
22
|
-
__export(index_exports, {
|
|
23
|
-
RubyText: () => RubyText,
|
|
24
|
-
default: () => index_default
|
|
1
|
+
Object.defineProperties(exports, {
|
|
2
|
+
__esModule: { value: true },
|
|
3
|
+
[Symbol.toStringTag]: { value: "Module" }
|
|
25
4
|
});
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
var import_state = require("@tiptap/pm/state");
|
|
33
|
-
var import_view = require("@tiptap/pm/view");
|
|
34
|
-
var rubyTextDecorationPluginKey = new import_state.PluginKey("rubyTextDecoration");
|
|
35
|
-
var editSessions = /* @__PURE__ */ new WeakMap();
|
|
5
|
+
let _tiptap_core = require("@tiptap/core");
|
|
6
|
+
let _tiptap_pm_state = require("@tiptap/pm/state");
|
|
7
|
+
let _tiptap_pm_view = require("@tiptap/pm/view");
|
|
8
|
+
//#region src/ruby-text-decoration-plugin.ts
|
|
9
|
+
const rubyTextDecorationPluginKey = new _tiptap_pm_state.PluginKey("rubyTextDecoration");
|
|
10
|
+
const editSessions = /* @__PURE__ */ new WeakMap();
|
|
36
11
|
function isImeEvent(event) {
|
|
37
|
-
|
|
38
|
-
|
|
12
|
+
const legacyKeyCode = event.keyCode;
|
|
13
|
+
return event.isComposing || legacyKeyCode === 229;
|
|
39
14
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
event.preventDefault();
|
|
62
|
-
submit(input.value);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
return input;
|
|
15
|
+
/** Default annotation editor: a plain text input. Enter submits, Escape or blur dismisses. */
|
|
16
|
+
function defaultRenderAnnotationEditor({ annotation, submit, dismiss }) {
|
|
17
|
+
const input = document.createElement("input");
|
|
18
|
+
input.type = "text";
|
|
19
|
+
input.value = annotation;
|
|
20
|
+
input.size = Math.max(annotation.length, 1);
|
|
21
|
+
input.setAttribute("aria-label", "Ruby text annotation");
|
|
22
|
+
input.addEventListener("focus", () => input.select(), { once: true });
|
|
23
|
+
input.addEventListener("blur", () => dismiss());
|
|
24
|
+
input.addEventListener("keydown", (event) => {
|
|
25
|
+
if (isImeEvent(event)) return;
|
|
26
|
+
if (event.key === "Escape") {
|
|
27
|
+
event.preventDefault();
|
|
28
|
+
dismiss();
|
|
29
|
+
}
|
|
30
|
+
if (event.key === "Enter") {
|
|
31
|
+
event.preventDefault();
|
|
32
|
+
submit(input.value);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return input;
|
|
66
36
|
}
|
|
67
37
|
function createRtElement(annotation, range, rubyTextType, view, options) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
editing = true;
|
|
120
|
-
openEditor();
|
|
121
|
-
});
|
|
122
|
-
return rt;
|
|
38
|
+
const rt = document.createElement("rt");
|
|
39
|
+
rt.contentEditable = "false";
|
|
40
|
+
rt.textContent = annotation;
|
|
41
|
+
let editing = false;
|
|
42
|
+
const restoreEditorFocus = () => {
|
|
43
|
+
view.dispatch(view.state.tr.setSelection(_tiptap_pm_state.TextSelection.create(view.state.doc, range.to)));
|
|
44
|
+
view.focus();
|
|
45
|
+
};
|
|
46
|
+
if (!options.allowClickToEdit || !view.editable) return rt;
|
|
47
|
+
editSessions.set(rt, () => {
|
|
48
|
+
editing = false;
|
|
49
|
+
});
|
|
50
|
+
const dismiss = () => {
|
|
51
|
+
if (!editing) return;
|
|
52
|
+
editing = false;
|
|
53
|
+
rt.textContent = annotation;
|
|
54
|
+
restoreEditorFocus();
|
|
55
|
+
};
|
|
56
|
+
const submit = (value) => {
|
|
57
|
+
if (!editing) return;
|
|
58
|
+
if (!view.editable || value === annotation) {
|
|
59
|
+
dismiss();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
editing = false;
|
|
63
|
+
const transaction = view.state.tr.addMark(range.from, range.to, rubyTextType.create({
|
|
64
|
+
...range.mark.attrs,
|
|
65
|
+
rt: value
|
|
66
|
+
}));
|
|
67
|
+
view.dispatch(transaction.setSelection(_tiptap_pm_state.TextSelection.create(transaction.doc, range.to)));
|
|
68
|
+
view.focus();
|
|
69
|
+
};
|
|
70
|
+
const openEditor = () => {
|
|
71
|
+
var _options$renderAnnota, _element$querySelecto;
|
|
72
|
+
const element = ((_options$renderAnnota = options.renderAnnotationEditor) !== null && _options$renderAnnota !== void 0 ? _options$renderAnnota : defaultRenderAnnotationEditor)({
|
|
73
|
+
annotation,
|
|
74
|
+
submit,
|
|
75
|
+
dismiss,
|
|
76
|
+
editor: options.editor
|
|
77
|
+
});
|
|
78
|
+
rt.replaceChildren(element);
|
|
79
|
+
((_element$querySelecto = element.querySelector("[autofocus]")) !== null && _element$querySelecto !== void 0 ? _element$querySelecto : element).focus();
|
|
80
|
+
};
|
|
81
|
+
rt.addEventListener("click", () => {
|
|
82
|
+
if (editing || !view.editable) return;
|
|
83
|
+
editing = true;
|
|
84
|
+
openEditor();
|
|
85
|
+
});
|
|
86
|
+
return rt;
|
|
123
87
|
}
|
|
88
|
+
/** Gets the mark of ruby text from the given node, if it exists. */
|
|
124
89
|
function getRubyTextMark(node, rubyTextType) {
|
|
125
|
-
|
|
90
|
+
return node.isText ? node.marks.find((candidate) => candidate.type === rubyTextType) : void 0;
|
|
126
91
|
}
|
|
92
|
+
/** Adds a ruby text range to an existing array of ranges. */
|
|
127
93
|
function addRange(ranges, range) {
|
|
128
|
-
|
|
129
|
-
ranges.push(range);
|
|
130
|
-
}
|
|
94
|
+
if (range) ranges.push(range);
|
|
131
95
|
}
|
|
96
|
+
/** Can the current range be extended with the given mark at the given position? */
|
|
132
97
|
function canExtendRange(range, mark, pos) {
|
|
133
|
-
|
|
98
|
+
return (range === null || range === void 0 ? void 0 : range.to) === pos && range.mark.eq(mark);
|
|
134
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Gets the next ruby text range based on the current node and position.
|
|
102
|
+
* @param ranges The array of ruby text ranges to add to.
|
|
103
|
+
* @param range The current ruby text range being built.
|
|
104
|
+
* @param node The current ProseMirror node being processed.
|
|
105
|
+
* @param pos The position of the current node in the document.
|
|
106
|
+
* @param rubyTextType The MarkType for ruby text.
|
|
107
|
+
* @returns The updated ruby text range, or null if the current node does not have a ruby text mark.
|
|
108
|
+
*/
|
|
135
109
|
function getNextRange(ranges, range, node, pos, rubyTextType) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
110
|
+
const mark = getRubyTextMark(node, rubyTextType);
|
|
111
|
+
if (!mark) {
|
|
112
|
+
addRange(ranges, range);
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
if (range && canExtendRange(range, mark, pos)) {
|
|
116
|
+
range.to += node.nodeSize;
|
|
117
|
+
return range;
|
|
118
|
+
}
|
|
119
|
+
addRange(ranges, range);
|
|
120
|
+
return {
|
|
121
|
+
from: pos,
|
|
122
|
+
to: pos + node.nodeSize,
|
|
123
|
+
mark
|
|
124
|
+
};
|
|
147
125
|
}
|
|
148
126
|
function getRubyTextRanges(doc, rubyTextType) {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
127
|
+
const ranges = [];
|
|
128
|
+
let range = null;
|
|
129
|
+
doc.descendants((node, pos) => {
|
|
130
|
+
range = getNextRange(ranges, range, node, pos, rubyTextType);
|
|
131
|
+
});
|
|
132
|
+
addRange(ranges, range);
|
|
133
|
+
return ranges;
|
|
156
134
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
135
|
+
const STOPPED_EVENT_TYPES = /* @__PURE__ */ new Set([
|
|
136
|
+
"click",
|
|
137
|
+
"dblclick",
|
|
138
|
+
"contextmenu",
|
|
139
|
+
"mousedown",
|
|
140
|
+
"mouseup",
|
|
141
|
+
"pointerdown",
|
|
142
|
+
"pointerup",
|
|
143
|
+
"touchstart",
|
|
144
|
+
"touchend",
|
|
145
|
+
"keydown",
|
|
146
|
+
"keypress",
|
|
147
|
+
"keyup",
|
|
148
|
+
"input",
|
|
149
|
+
"beforeinput",
|
|
150
|
+
"compositionstart",
|
|
151
|
+
"compositionupdate",
|
|
152
|
+
"compositionend",
|
|
153
|
+
"paste",
|
|
154
|
+
"cut",
|
|
155
|
+
"copy",
|
|
156
|
+
"focus",
|
|
157
|
+
"blur",
|
|
158
|
+
"focusin",
|
|
159
|
+
"focusout"
|
|
182
160
|
]);
|
|
183
161
|
function createDecorations(doc, rubyTextType, options) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
}
|
|
200
|
-
);
|
|
201
|
-
});
|
|
202
|
-
return import_view.DecorationSet.create(doc, decorations);
|
|
162
|
+
const decorations = getRubyTextRanges(doc, rubyTextType).map((range) => {
|
|
163
|
+
var _range$mark$attrs$rt;
|
|
164
|
+
const annotation = (_range$mark$attrs$rt = range.mark.attrs.rt) !== null && _range$mark$attrs$rt !== void 0 ? _range$mark$attrs$rt : "";
|
|
165
|
+
return _tiptap_pm_view.Decoration.widget(range.to, (view) => createRtElement(annotation, range, rubyTextType, view, options), {
|
|
166
|
+
key: `ruby-text-${range.from}-${range.to}-${annotation}`,
|
|
167
|
+
marks: [range.mark],
|
|
168
|
+
side: 1,
|
|
169
|
+
stopEvent: (event) => options.allowClickToEdit && STOPPED_EVENT_TYPES.has(event.type),
|
|
170
|
+
destroy: (node) => {
|
|
171
|
+
var _editSessions$get;
|
|
172
|
+
return (_editSessions$get = editSessions.get(node)) === null || _editSessions$get === void 0 ? void 0 : _editSessions$get();
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
return _tiptap_pm_view.DecorationSet.create(doc, decorations);
|
|
203
177
|
}
|
|
204
178
|
function RubyTextDecorationPlugin(rubyTextType, options) {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
214
|
-
});
|
|
179
|
+
return new _tiptap_pm_state.Plugin({
|
|
180
|
+
key: rubyTextDecorationPluginKey,
|
|
181
|
+
state: {
|
|
182
|
+
init: (_, state) => createDecorations(state.doc, rubyTextType, options),
|
|
183
|
+
apply: (transaction, decorations) => transaction.docChanged ? createDecorations(transaction.doc, rubyTextType, options) : decorations.map(transaction.mapping, transaction.doc)
|
|
184
|
+
},
|
|
185
|
+
props: { decorations: (state) => rubyTextDecorationPluginKey.getState(state) }
|
|
186
|
+
});
|
|
215
187
|
}
|
|
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
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
ruby.setAttribute(key, String(value));
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
);
|
|
303
|
-
return {
|
|
304
|
-
dom: ruby,
|
|
305
|
-
contentDOM: ruby
|
|
306
|
-
};
|
|
307
|
-
};
|
|
308
|
-
}
|
|
188
|
+
//#endregion
|
|
189
|
+
//#region src/ruby-text.ts
|
|
190
|
+
/**
|
|
191
|
+
* This extension adds support for HTML ruby text annotations.
|
|
192
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ruby
|
|
193
|
+
*/
|
|
194
|
+
const RubyText = _tiptap_core.Mark.create({
|
|
195
|
+
name: "rubyText",
|
|
196
|
+
inclusive: false,
|
|
197
|
+
addOptions() {
|
|
198
|
+
return {
|
|
199
|
+
HTMLAttributes: {},
|
|
200
|
+
allowClickToEdit: true,
|
|
201
|
+
renderAnnotationEditor: void 0
|
|
202
|
+
};
|
|
203
|
+
},
|
|
204
|
+
addAttributes() {
|
|
205
|
+
return { rt: { default: null } };
|
|
206
|
+
},
|
|
207
|
+
parseHTML() {
|
|
208
|
+
return [{
|
|
209
|
+
tag: "ruby",
|
|
210
|
+
contentElement: (node) => {
|
|
211
|
+
const rb = node.querySelector("rb");
|
|
212
|
+
if (rb) return rb;
|
|
213
|
+
const surrogate = document.createElement("span");
|
|
214
|
+
Array.from(node.childNodes).forEach((child) => {
|
|
215
|
+
if (child.nodeName !== "RT" && child.nodeName !== "RP") surrogate.appendChild(child.cloneNode(true));
|
|
216
|
+
});
|
|
217
|
+
return surrogate;
|
|
218
|
+
},
|
|
219
|
+
getAttrs: (node) => {
|
|
220
|
+
var _rt$textContent;
|
|
221
|
+
const rt = node.querySelector("rt");
|
|
222
|
+
if (!rt) return false;
|
|
223
|
+
return { rt: (_rt$textContent = rt.textContent) !== null && _rt$textContent !== void 0 ? _rt$textContent : "" };
|
|
224
|
+
}
|
|
225
|
+
}];
|
|
226
|
+
},
|
|
227
|
+
renderHTML({ HTMLAttributes, mark }) {
|
|
228
|
+
return [
|
|
229
|
+
"ruby",
|
|
230
|
+
(0, _tiptap_core.mergeAttributes)(this.options.HTMLAttributes, HTMLAttributes),
|
|
231
|
+
["rb", 0],
|
|
232
|
+
...mark.attrs.rt == null ? [] : [[
|
|
233
|
+
"rt",
|
|
234
|
+
{ contenteditable: "false" },
|
|
235
|
+
mark.attrs.rt
|
|
236
|
+
]]
|
|
237
|
+
];
|
|
238
|
+
},
|
|
239
|
+
addCommands() {
|
|
240
|
+
return {
|
|
241
|
+
setRubyText: (attributes) => ({ commands }) => {
|
|
242
|
+
return commands.setMark(this.name, attributes);
|
|
243
|
+
},
|
|
244
|
+
toggleRubyText: (attributes) => ({ commands }) => {
|
|
245
|
+
return commands.toggleMark(this.name, attributes, { extendEmptyMarkRange: true });
|
|
246
|
+
},
|
|
247
|
+
unsetRubyText: () => ({ commands }) => {
|
|
248
|
+
return commands.unsetMark(this.name, { extendEmptyMarkRange: true });
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
},
|
|
252
|
+
addProseMirrorPlugins() {
|
|
253
|
+
return [RubyTextDecorationPlugin(this.type, {
|
|
254
|
+
editor: this.editor,
|
|
255
|
+
allowClickToEdit: this.options.allowClickToEdit,
|
|
256
|
+
renderAnnotationEditor: this.options.renderAnnotationEditor
|
|
257
|
+
})];
|
|
258
|
+
},
|
|
259
|
+
addMarkView() {
|
|
260
|
+
return ({ HTMLAttributes }) => {
|
|
261
|
+
const ruby = document.createElement("ruby");
|
|
262
|
+
Object.entries((0, _tiptap_core.mergeAttributes)(this.options.HTMLAttributes, HTMLAttributes)).forEach(([key, value]) => {
|
|
263
|
+
if (value != null) ruby.setAttribute(key, String(value));
|
|
264
|
+
});
|
|
265
|
+
return {
|
|
266
|
+
dom: ruby,
|
|
267
|
+
contentDOM: ruby
|
|
268
|
+
};
|
|
269
|
+
};
|
|
270
|
+
}
|
|
309
271
|
});
|
|
272
|
+
//#endregion
|
|
273
|
+
//#region src/index.ts
|
|
274
|
+
var src_default = RubyText;
|
|
275
|
+
//#endregion
|
|
276
|
+
exports.RubyText = RubyText;
|
|
277
|
+
exports.default = src_default;
|
|
310
278
|
|
|
311
|
-
// src/index.ts
|
|
312
|
-
var index_default = RubyText;
|
|
313
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
314
|
-
0 && (module.exports = {
|
|
315
|
-
RubyText
|
|
316
|
-
});
|
|
317
279
|
//# sourceMappingURL=index.cjs.map
|