@bendyline/squisq-editor-react 1.0.0 → 1.1.0
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/DropZoneOverlay.d.ts +24 -0
- package/dist/DropZoneOverlay.d.ts.map +1 -0
- package/dist/DropZoneOverlay.js +53 -0
- package/dist/DropZoneOverlay.js.map +1 -0
- package/dist/EditorContext.d.ts +79 -0
- package/dist/EditorContext.d.ts.map +1 -0
- package/dist/EditorContext.js +204 -0
- package/dist/EditorContext.js.map +1 -0
- package/dist/EditorShell.d.ts +39 -0
- package/dist/EditorShell.d.ts.map +1 -0
- package/dist/EditorShell.js +104 -0
- package/dist/EditorShell.js.map +1 -0
- package/dist/MediaBin.d.ts +18 -0
- package/dist/MediaBin.d.ts.map +1 -0
- package/dist/MediaBin.js +141 -0
- package/dist/MediaBin.js.map +1 -0
- package/dist/PreviewPanel.d.ts +33 -0
- package/dist/PreviewPanel.d.ts.map +1 -0
- package/dist/PreviewPanel.js +385 -0
- package/dist/PreviewPanel.js.map +1 -0
- package/dist/RawEditor.d.ts +25 -0
- package/dist/RawEditor.d.ts.map +1 -0
- package/dist/RawEditor.js +100 -0
- package/dist/RawEditor.js.map +1 -0
- package/dist/StatusBar.d.ts +15 -0
- package/dist/StatusBar.d.ts.map +1 -0
- package/dist/StatusBar.js +24 -0
- package/dist/StatusBar.js.map +1 -0
- package/dist/TemplateAnnotation.d.ts +20 -0
- package/dist/TemplateAnnotation.d.ts.map +1 -0
- package/dist/TemplateAnnotation.js +69 -0
- package/dist/TemplateAnnotation.js.map +1 -0
- package/dist/Toolbar.d.ts +23 -0
- package/dist/Toolbar.d.ts.map +1 -0
- package/dist/Toolbar.js +350 -0
- package/dist/Toolbar.js.map +1 -0
- package/dist/ViewSwitcher.d.ts +14 -0
- package/dist/ViewSwitcher.d.ts.map +1 -0
- package/dist/ViewSwitcher.js +20 -0
- package/dist/ViewSwitcher.js.map +1 -0
- package/dist/WysiwygEditor.d.ts +28 -0
- package/dist/WysiwygEditor.d.ts.map +1 -0
- package/dist/WysiwygEditor.js +111 -0
- package/dist/WysiwygEditor.js.map +1 -0
- package/dist/hooks/useFileDrop.d.ts +41 -0
- package/dist/hooks/useFileDrop.d.ts.map +1 -0
- package/dist/hooks/useFileDrop.js +167 -0
- package/dist/hooks/useFileDrop.js.map +1 -0
- package/dist/index.d.ts +43 -268
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -3832
- package/dist/index.js.map +1 -1
- package/dist/tiptapBridge.d.ts +24 -0
- package/dist/tiptapBridge.d.ts.map +1 -0
- package/dist/tiptapBridge.js +358 -0
- package/dist/tiptapBridge.js.map +1 -0
- package/dist/utils/dropUtils.d.ts +36 -0
- package/dist/utils/dropUtils.d.ts.map +1 -0
- package/dist/utils/dropUtils.js +71 -0
- package/dist/utils/dropUtils.js.map +1 -0
- package/package.json +5 -5
- package/src/DropZoneOverlay.tsx +137 -0
- package/src/EditorContext.tsx +56 -0
- package/src/EditorShell.tsx +102 -8
- package/src/MediaBin.tsx +223 -0
- package/src/Toolbar.tsx +21 -1
- package/src/hooks/useFileDrop.ts +226 -0
- package/src/index.ts +23 -0
- package/src/styles/editor.css +318 -0
- package/src/utils/dropUtils.ts +88 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiptap Bridge
|
|
3
|
+
*
|
|
4
|
+
* Conversion utilities between raw markdown source and Tiptap's JSON/HTML
|
|
5
|
+
* content format. Uses a lightweight HTML-based approach: we convert markdown
|
|
6
|
+
* to a simple HTML representation that Tiptap can consume, and parse
|
|
7
|
+
* Tiptap's HTML output back to markdown.
|
|
8
|
+
*
|
|
9
|
+
* This bridge preserves markdown semantics much better than going through
|
|
10
|
+
* Tiptap's native markdown extension, since we control the conversion
|
|
11
|
+
* using squisq's own parser.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Convert raw markdown source to Tiptap-consumable HTML content.
|
|
15
|
+
* Uses a simple markdown-to-HTML conversion that maps cleanly to
|
|
16
|
+
* Tiptap's ProseMirror schema.
|
|
17
|
+
*/
|
|
18
|
+
export declare function markdownToTiptap(markdown: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Convert Tiptap HTML output back to markdown source.
|
|
21
|
+
* Extracts semantic structure from HTML and produces clean markdown.
|
|
22
|
+
*/
|
|
23
|
+
export declare function tiptapToMarkdown(html: string): string;
|
|
24
|
+
//# sourceMappingURL=tiptapBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiptapBridge.d.ts","sourceRoot":"","sources":["../src/tiptapBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAsBH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAyJzD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuJrD"}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiptap Bridge
|
|
3
|
+
*
|
|
4
|
+
* Conversion utilities between raw markdown source and Tiptap's JSON/HTML
|
|
5
|
+
* content format. Uses a lightweight HTML-based approach: we convert markdown
|
|
6
|
+
* to a simple HTML representation that Tiptap can consume, and parse
|
|
7
|
+
* Tiptap's HTML output back to markdown.
|
|
8
|
+
*
|
|
9
|
+
* This bridge preserves markdown semantics much better than going through
|
|
10
|
+
* Tiptap's native markdown extension, since we control the conversion
|
|
11
|
+
* using squisq's own parser.
|
|
12
|
+
*/
|
|
13
|
+
// Hoisted regex patterns for inline markdown ↔ HTML conversion
|
|
14
|
+
const RE_BOLD_STAR = /\*\*(.+?)\*\*/g;
|
|
15
|
+
const RE_BOLD_UNDER = /__(.+?)__/g;
|
|
16
|
+
const RE_ITALIC_STAR = /\*(.+?)\*/g;
|
|
17
|
+
const RE_ITALIC_UNDER = /_(.+?)_/g;
|
|
18
|
+
const RE_STRIKETHROUGH = /~~(.+?)~~/g;
|
|
19
|
+
const RE_INLINE_CODE = /`(.+?)`/g;
|
|
20
|
+
const RE_LINK = /\[(.+?)\]\((.+?)\)/g;
|
|
21
|
+
const RE_IMAGE = /!\[(.+?)\]\((.+?)\)/g;
|
|
22
|
+
const RE_STRONG_TAG = /<strong>(.*?)<\/strong>/g;
|
|
23
|
+
const RE_B_TAG = /<b>(.*?)<\/b>/g;
|
|
24
|
+
const RE_EM_TAG = /<em>(.*?)<\/em>/g;
|
|
25
|
+
const RE_I_TAG = /<i>(.*?)<\/i>/g;
|
|
26
|
+
const RE_S_TAG = /<s>(.*?)<\/s>/g;
|
|
27
|
+
const RE_DEL_TAG = /<del>(.*?)<\/del>/g;
|
|
28
|
+
const RE_CODE_TAG = /<code>(.*?)<\/code>/g;
|
|
29
|
+
const RE_A_TAG = /<a[^>]+href="([^"]*)"[^>]*>(.*?)<\/a>/g;
|
|
30
|
+
const RE_IMG_TAG = /<img[^>]+alt="([^"]*)"[^>]+src="([^"]*)"[^>]*>/g;
|
|
31
|
+
const RE_STRIP_TAGS = /<[^>]+>/g;
|
|
32
|
+
/**
|
|
33
|
+
* Convert raw markdown source to Tiptap-consumable HTML content.
|
|
34
|
+
* Uses a simple markdown-to-HTML conversion that maps cleanly to
|
|
35
|
+
* Tiptap's ProseMirror schema.
|
|
36
|
+
*/
|
|
37
|
+
export function markdownToTiptap(markdown) {
|
|
38
|
+
if (!markdown.trim())
|
|
39
|
+
return '<p></p>';
|
|
40
|
+
// Simple conversion of markdown constructs to HTML that Tiptap understands.
|
|
41
|
+
// This is intentionally straightforward — Tiptap's parser handles the HTML.
|
|
42
|
+
const html = markdown;
|
|
43
|
+
// Process blocks line by line for accurate conversion
|
|
44
|
+
const lines = html.split('\n');
|
|
45
|
+
const outputBlocks = [];
|
|
46
|
+
let inCodeBlock = false;
|
|
47
|
+
let codeBlockLang = '';
|
|
48
|
+
let codeBlockLines = [];
|
|
49
|
+
let inList = false;
|
|
50
|
+
let listItems = [];
|
|
51
|
+
let listType = 'ul';
|
|
52
|
+
const flushList = () => {
|
|
53
|
+
if (inList && listItems.length > 0) {
|
|
54
|
+
const tag = listType === 'ol' ? 'ol' : 'ul';
|
|
55
|
+
const attr = listType === 'task' ? ' data-type="taskList"' : '';
|
|
56
|
+
outputBlocks.push(`<${tag}${attr}>${listItems.join('')}</${tag}>`);
|
|
57
|
+
listItems = [];
|
|
58
|
+
inList = false;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
for (let i = 0; i < lines.length; i++) {
|
|
62
|
+
const line = lines[i];
|
|
63
|
+
// Code fence handling
|
|
64
|
+
if (line.startsWith('```')) {
|
|
65
|
+
if (!inCodeBlock) {
|
|
66
|
+
flushList();
|
|
67
|
+
inCodeBlock = true;
|
|
68
|
+
codeBlockLang = line.slice(3).trim();
|
|
69
|
+
codeBlockLines = [];
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
const langAttr = codeBlockLang ? ` class="language-${escapeHtml(codeBlockLang)}"` : '';
|
|
74
|
+
outputBlocks.push(`<pre><code${langAttr}>${escapeHtml(codeBlockLines.join('\n'))}</code></pre>`);
|
|
75
|
+
inCodeBlock = false;
|
|
76
|
+
codeBlockLang = '';
|
|
77
|
+
codeBlockLines = [];
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (inCodeBlock) {
|
|
82
|
+
codeBlockLines.push(line);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
// Blank line flushes list
|
|
86
|
+
if (line.trim() === '') {
|
|
87
|
+
flushList();
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
// Headings
|
|
91
|
+
const headingMatch = line.match(/^(#{1,6})\s+(.+)$/);
|
|
92
|
+
if (headingMatch) {
|
|
93
|
+
flushList();
|
|
94
|
+
const level = headingMatch[1].length;
|
|
95
|
+
let text = headingMatch[2];
|
|
96
|
+
let attrs = '';
|
|
97
|
+
// Extract {[template key=value …]} annotation
|
|
98
|
+
const annotMatch = text.match(/\s*\{\[([^\]]+)\]\}\s*$/);
|
|
99
|
+
if (annotMatch) {
|
|
100
|
+
text = text.slice(0, annotMatch.index).trimEnd();
|
|
101
|
+
const tokens = annotMatch[1].trim().split(/\s+/);
|
|
102
|
+
attrs = ` data-template="${escapeHtml(tokens[0])}"`;
|
|
103
|
+
const params = tokens.slice(1).filter((t) => t.includes('='));
|
|
104
|
+
if (params.length > 0) {
|
|
105
|
+
attrs += ` data-template-params="${escapeHtml(params.join(' '))}"`;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
outputBlocks.push(`<h${level}${attrs}>${inlineToHtml(text)}</h${level}>`);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
// Thematic break
|
|
112
|
+
if (/^(---|\*\*\*|___)(\s*)$/.test(line.trim())) {
|
|
113
|
+
flushList();
|
|
114
|
+
outputBlocks.push('<hr>');
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
// Blockquote
|
|
118
|
+
if (line.startsWith('> ')) {
|
|
119
|
+
flushList();
|
|
120
|
+
outputBlocks.push(`<blockquote><p>${inlineToHtml(line.slice(2))}</p></blockquote>`);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
// Task list item
|
|
124
|
+
const taskMatch = line.match(/^[-*+]\s+\[([xX ])\]\s+(.+)$/);
|
|
125
|
+
if (taskMatch) {
|
|
126
|
+
if (!inList || listType !== 'task') {
|
|
127
|
+
flushList();
|
|
128
|
+
inList = true;
|
|
129
|
+
listType = 'task';
|
|
130
|
+
}
|
|
131
|
+
const checked = taskMatch[1].toLowerCase() === 'x' ? ' data-checked="true"' : '';
|
|
132
|
+
listItems.push(`<li data-type="taskItem"${checked}><label><input type="checkbox"${checked ? ' checked' : ''}>${inlineToHtml(taskMatch[2])}</label></li>`);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
// Unordered list item
|
|
136
|
+
const ulMatch = line.match(/^[-*+]\s+(.+)$/);
|
|
137
|
+
if (ulMatch) {
|
|
138
|
+
if (!inList || listType !== 'ul') {
|
|
139
|
+
flushList();
|
|
140
|
+
inList = true;
|
|
141
|
+
listType = 'ul';
|
|
142
|
+
}
|
|
143
|
+
listItems.push(`<li><p>${inlineToHtml(ulMatch[1])}</p></li>`);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
// Ordered list item
|
|
147
|
+
const olMatch = line.match(/^\d+\.\s+(.+)$/);
|
|
148
|
+
if (olMatch) {
|
|
149
|
+
if (!inList || listType !== 'ol') {
|
|
150
|
+
flushList();
|
|
151
|
+
inList = true;
|
|
152
|
+
listType = 'ol';
|
|
153
|
+
}
|
|
154
|
+
listItems.push(`<li><p>${inlineToHtml(olMatch[1])}</p></li>`);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
// Regular paragraph
|
|
158
|
+
flushList();
|
|
159
|
+
outputBlocks.push(`<p>${inlineToHtml(line)}</p>`);
|
|
160
|
+
}
|
|
161
|
+
// Close any remaining open blocks
|
|
162
|
+
if (inCodeBlock) {
|
|
163
|
+
const langAttr = codeBlockLang ? ` class="language-${escapeHtml(codeBlockLang)}"` : '';
|
|
164
|
+
outputBlocks.push(`<pre><code${langAttr}>${escapeHtml(codeBlockLines.join('\n'))}</code></pre>`);
|
|
165
|
+
}
|
|
166
|
+
flushList();
|
|
167
|
+
return outputBlocks.join('') || '<p></p>';
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Convert Tiptap HTML output back to markdown source.
|
|
171
|
+
* Extracts semantic structure from HTML and produces clean markdown.
|
|
172
|
+
*/
|
|
173
|
+
export function tiptapToMarkdown(html) {
|
|
174
|
+
if (!html || html === '<p></p>')
|
|
175
|
+
return '';
|
|
176
|
+
const lines = [];
|
|
177
|
+
// Simple regex-based HTML to markdown conversion
|
|
178
|
+
// This works because Tiptap produces clean, predictable HTML
|
|
179
|
+
let remaining = html;
|
|
180
|
+
while (remaining.length > 0) {
|
|
181
|
+
// Headings
|
|
182
|
+
const headingMatch = remaining.match(/^<h([1-6])([^>]*)>(.*?)<\/h\1>/s);
|
|
183
|
+
if (headingMatch) {
|
|
184
|
+
const level = parseInt(headingMatch[1], 10);
|
|
185
|
+
const attrs = headingMatch[2];
|
|
186
|
+
let text = htmlToInline(headingMatch[3]);
|
|
187
|
+
// Re-inject template annotation from data attributes
|
|
188
|
+
const tmplMatch = attrs.match(/data-template="([^"]+)"/);
|
|
189
|
+
if (tmplMatch) {
|
|
190
|
+
let annotation = tmplMatch[1];
|
|
191
|
+
const paramsMatch = attrs.match(/data-template-params="([^"]+)"/);
|
|
192
|
+
if (paramsMatch) {
|
|
193
|
+
annotation += ' ' + unescapeHtml(paramsMatch[1]);
|
|
194
|
+
}
|
|
195
|
+
text += ` {[${annotation}]}`;
|
|
196
|
+
}
|
|
197
|
+
lines.push('#'.repeat(level) + ' ' + text);
|
|
198
|
+
lines.push('');
|
|
199
|
+
remaining = remaining.slice(headingMatch[0].length);
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
// Code blocks
|
|
203
|
+
const codeMatch = remaining.match(/^<pre><code(?:\s+class="language-([^"]*)")?>(.*?)<\/code><\/pre>/s);
|
|
204
|
+
if (codeMatch) {
|
|
205
|
+
const lang = codeMatch[1] || '';
|
|
206
|
+
const code = unescapeHtml(codeMatch[2]);
|
|
207
|
+
lines.push('```' + lang);
|
|
208
|
+
lines.push(code);
|
|
209
|
+
lines.push('```');
|
|
210
|
+
lines.push('');
|
|
211
|
+
remaining = remaining.slice(codeMatch[0].length);
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
// Blockquote
|
|
215
|
+
const bqMatch = remaining.match(/^<blockquote>(.*?)<\/blockquote>/s);
|
|
216
|
+
if (bqMatch) {
|
|
217
|
+
const inner = htmlToInline(bqMatch[1].replace(/<\/?p>/g, ''));
|
|
218
|
+
lines.push('> ' + inner);
|
|
219
|
+
lines.push('');
|
|
220
|
+
remaining = remaining.slice(bqMatch[0].length);
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
// Horizontal rule
|
|
224
|
+
if (remaining.startsWith('<hr>') ||
|
|
225
|
+
remaining.startsWith('<hr/>') ||
|
|
226
|
+
remaining.startsWith('<hr />')) {
|
|
227
|
+
const hrMatch = remaining.match(/^<hr\s*\/?>/);
|
|
228
|
+
lines.push('---');
|
|
229
|
+
lines.push('');
|
|
230
|
+
remaining = remaining.slice(hrMatch[0].length);
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
// Task list
|
|
234
|
+
const taskListMatch = remaining.match(/^<ul[^>]*data-type="taskList"[^>]*>(.*?)<\/ul>/s);
|
|
235
|
+
if (taskListMatch) {
|
|
236
|
+
const items = taskListMatch[1].matchAll(/<li[^>]*data-type="taskItem"[^>]*(data-checked="true")?[^>]*>.*?<\/li>/gs);
|
|
237
|
+
for (const item of items) {
|
|
238
|
+
const checked = item[0].includes('data-checked="true"') || item[0].includes('checked');
|
|
239
|
+
const textMatch = item[0].match(/<label>.*?<\/label>|<p>(.*?)<\/p>/s);
|
|
240
|
+
const text = textMatch ? htmlToInline(textMatch[0].replace(/<[^>]+>/g, '')) : '';
|
|
241
|
+
lines.push(`- [${checked ? 'x' : ' '}] ${text}`);
|
|
242
|
+
}
|
|
243
|
+
lines.push('');
|
|
244
|
+
remaining = remaining.slice(taskListMatch[0].length);
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
// Unordered list
|
|
248
|
+
const ulMatch = remaining.match(/^<ul>(.*?)<\/ul>/s);
|
|
249
|
+
if (ulMatch) {
|
|
250
|
+
const items = ulMatch[1].matchAll(/<li>(.*?)<\/li>/gs);
|
|
251
|
+
for (const item of items) {
|
|
252
|
+
lines.push('- ' + htmlToInline(item[1].replace(/<\/?p>/g, '')));
|
|
253
|
+
}
|
|
254
|
+
lines.push('');
|
|
255
|
+
remaining = remaining.slice(ulMatch[0].length);
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
// Ordered list
|
|
259
|
+
const olMatch = remaining.match(/^<ol[^>]*>(.*?)<\/ol>/s);
|
|
260
|
+
if (olMatch) {
|
|
261
|
+
const items = [...olMatch[1].matchAll(/<li>(.*?)<\/li>/gs)];
|
|
262
|
+
items.forEach((item, idx) => {
|
|
263
|
+
lines.push(`${idx + 1}. ` + htmlToInline(item[1].replace(/<\/?p>/g, '')));
|
|
264
|
+
});
|
|
265
|
+
lines.push('');
|
|
266
|
+
remaining = remaining.slice(olMatch[0].length);
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
// Paragraph
|
|
270
|
+
const pMatch = remaining.match(/^<p>(.*?)<\/p>/s);
|
|
271
|
+
if (pMatch) {
|
|
272
|
+
const text = htmlToInline(pMatch[1]);
|
|
273
|
+
if (text.trim()) {
|
|
274
|
+
lines.push(text);
|
|
275
|
+
lines.push('');
|
|
276
|
+
}
|
|
277
|
+
remaining = remaining.slice(pMatch[0].length);
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
// Skip unknown tags or whitespace
|
|
281
|
+
const skipMatch = remaining.match(/^(<[^>]+>|\s+)/);
|
|
282
|
+
if (skipMatch) {
|
|
283
|
+
remaining = remaining.slice(skipMatch[0].length);
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
// Plain text (shouldn't happen in well-formed Tiptap output)
|
|
287
|
+
const textMatch = remaining.match(/^([^<]+)/);
|
|
288
|
+
if (textMatch) {
|
|
289
|
+
lines.push(unescapeHtml(textMatch[1]));
|
|
290
|
+
remaining = remaining.slice(textMatch[0].length);
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
// Safety: skip one character to avoid infinite loop
|
|
294
|
+
remaining = remaining.slice(1);
|
|
295
|
+
}
|
|
296
|
+
// Clean up trailing blank lines
|
|
297
|
+
return (lines
|
|
298
|
+
.join('\n')
|
|
299
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
300
|
+
.trim() + '\n');
|
|
301
|
+
}
|
|
302
|
+
// ─── Helpers ─────────────────────────────────────────────
|
|
303
|
+
function escapeHtml(text) {
|
|
304
|
+
return text
|
|
305
|
+
.replace(/&/g, '&')
|
|
306
|
+
.replace(/</g, '<')
|
|
307
|
+
.replace(/>/g, '>')
|
|
308
|
+
.replace(/"/g, '"');
|
|
309
|
+
}
|
|
310
|
+
function unescapeHtml(text) {
|
|
311
|
+
return text
|
|
312
|
+
.replace(/</g, '<')
|
|
313
|
+
.replace(/>/g, '>')
|
|
314
|
+
.replace(/"/g, '"')
|
|
315
|
+
.replace(/&/g, '&');
|
|
316
|
+
}
|
|
317
|
+
/** Convert inline markdown to HTML for Tiptap consumption */
|
|
318
|
+
function inlineToHtml(text) {
|
|
319
|
+
let result = escapeHtml(text);
|
|
320
|
+
// Bold: **text** or __text__
|
|
321
|
+
result = result.replace(RE_BOLD_STAR, '<strong>$1</strong>');
|
|
322
|
+
result = result.replace(RE_BOLD_UNDER, '<strong>$1</strong>');
|
|
323
|
+
// Italic: *text* or _text_
|
|
324
|
+
result = result.replace(RE_ITALIC_STAR, '<em>$1</em>');
|
|
325
|
+
result = result.replace(RE_ITALIC_UNDER, '<em>$1</em>');
|
|
326
|
+
// Strikethrough: ~~text~~
|
|
327
|
+
result = result.replace(RE_STRIKETHROUGH, '<s>$1</s>');
|
|
328
|
+
// Inline code: `text`
|
|
329
|
+
result = result.replace(RE_INLINE_CODE, '<code>$1</code>');
|
|
330
|
+
// Links: [text](url)
|
|
331
|
+
result = result.replace(RE_LINK, '<a href="$2">$1</a>');
|
|
332
|
+
// Images: 
|
|
333
|
+
result = result.replace(RE_IMAGE, '<img alt="$1" src="$2">');
|
|
334
|
+
return result;
|
|
335
|
+
}
|
|
336
|
+
/** Convert inline HTML back to markdown */
|
|
337
|
+
function htmlToInline(html) {
|
|
338
|
+
let result = html;
|
|
339
|
+
// Strong
|
|
340
|
+
result = result.replace(RE_STRONG_TAG, '**$1**');
|
|
341
|
+
result = result.replace(RE_B_TAG, '**$1**');
|
|
342
|
+
// Em
|
|
343
|
+
result = result.replace(RE_EM_TAG, '*$1*');
|
|
344
|
+
result = result.replace(RE_I_TAG, '*$1*');
|
|
345
|
+
// Strikethrough
|
|
346
|
+
result = result.replace(RE_S_TAG, '~~$1~~');
|
|
347
|
+
result = result.replace(RE_DEL_TAG, '~~$1~~');
|
|
348
|
+
// Code
|
|
349
|
+
result = result.replace(RE_CODE_TAG, '`$1`');
|
|
350
|
+
// Links
|
|
351
|
+
result = result.replace(RE_A_TAG, '[$2]($1)');
|
|
352
|
+
// Images
|
|
353
|
+
result = result.replace(RE_IMG_TAG, '');
|
|
354
|
+
// Strip remaining tags
|
|
355
|
+
result = result.replace(RE_STRIP_TAGS, '');
|
|
356
|
+
return unescapeHtml(result);
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=tiptapBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiptapBridge.js","sourceRoot":"","sources":["../src/tiptapBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drop Utilities
|
|
3
|
+
*
|
|
4
|
+
* File processing pipeline for dropped files. Classifies files by type,
|
|
5
|
+
* processes media files into a MediaProvider, and converts text files
|
|
6
|
+
* (.md, .txt, .docx) to markdown strings.
|
|
7
|
+
*/
|
|
8
|
+
import type { MediaProvider } from '@bendyline/squisq/schemas';
|
|
9
|
+
import { classifyFile, type FileCategory } from '../hooks/useFileDrop';
|
|
10
|
+
export type { FileCategory };
|
|
11
|
+
export { classifyFile };
|
|
12
|
+
/**
|
|
13
|
+
* Partition an array of files into media and text categories.
|
|
14
|
+
* Files with unknown type are skipped.
|
|
15
|
+
*/
|
|
16
|
+
export declare function partitionFiles(files: File[]): {
|
|
17
|
+
media: File[];
|
|
18
|
+
text: File[];
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Add media files to a MediaProvider. Returns the relative paths
|
|
22
|
+
* assigned by the provider.
|
|
23
|
+
*/
|
|
24
|
+
export declare function processMediaFiles(files: File[], mediaProvider: MediaProvider): Promise<string[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Read a text-content file and return its content as a markdown string.
|
|
27
|
+
*
|
|
28
|
+
* - `.md` and `.txt` files are read as UTF-8 text directly
|
|
29
|
+
* - `.docx` files are converted to markdown via `@bendyline/squisq-formats/docx`
|
|
30
|
+
*/
|
|
31
|
+
export declare function processTextFile(file: File): Promise<string>;
|
|
32
|
+
/**
|
|
33
|
+
* Process multiple text files and concatenate their content.
|
|
34
|
+
*/
|
|
35
|
+
export declare function processTextFiles(files: File[]): Promise<string>;
|
|
36
|
+
//# sourceMappingURL=dropUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropUtils.d.ts","sourceRoot":"","sources":["../../src/utils/dropUtils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEvE,YAAY,EAAE,YAAY,EAAE,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,IAAI,EAAE,IAAI,EAAE,CAAA;CAAE,CAW7E;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,IAAI,EAAE,EACb,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC,CAWnB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAcjE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CASrE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drop Utilities
|
|
3
|
+
*
|
|
4
|
+
* File processing pipeline for dropped files. Classifies files by type,
|
|
5
|
+
* processes media files into a MediaProvider, and converts text files
|
|
6
|
+
* (.md, .txt, .docx) to markdown strings.
|
|
7
|
+
*/
|
|
8
|
+
import { stringifyMarkdown } from '@bendyline/squisq/markdown';
|
|
9
|
+
import { docxToMarkdownDoc } from '@bendyline/squisq-formats/docx';
|
|
10
|
+
import { classifyFile } from '../hooks/useFileDrop';
|
|
11
|
+
export { classifyFile };
|
|
12
|
+
/**
|
|
13
|
+
* Partition an array of files into media and text categories.
|
|
14
|
+
* Files with unknown type are skipped.
|
|
15
|
+
*/
|
|
16
|
+
export function partitionFiles(files) {
|
|
17
|
+
const media = [];
|
|
18
|
+
const text = [];
|
|
19
|
+
for (const file of files) {
|
|
20
|
+
const cat = classifyFile(file);
|
|
21
|
+
if (cat === 'media')
|
|
22
|
+
media.push(file);
|
|
23
|
+
else if (cat === 'text')
|
|
24
|
+
text.push(file);
|
|
25
|
+
}
|
|
26
|
+
return { media, text };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Add media files to a MediaProvider. Returns the relative paths
|
|
30
|
+
* assigned by the provider.
|
|
31
|
+
*/
|
|
32
|
+
export async function processMediaFiles(files, mediaProvider) {
|
|
33
|
+
const paths = [];
|
|
34
|
+
for (const file of files) {
|
|
35
|
+
const buffer = await file.arrayBuffer();
|
|
36
|
+
const mimeType = file.type || 'application/octet-stream';
|
|
37
|
+
const path = await mediaProvider.addMedia(file.name, buffer, mimeType);
|
|
38
|
+
paths.push(path);
|
|
39
|
+
}
|
|
40
|
+
return paths;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Read a text-content file and return its content as a markdown string.
|
|
44
|
+
*
|
|
45
|
+
* - `.md` and `.txt` files are read as UTF-8 text directly
|
|
46
|
+
* - `.docx` files are converted to markdown via `@bendyline/squisq-formats/docx`
|
|
47
|
+
*/
|
|
48
|
+
export async function processTextFile(file) {
|
|
49
|
+
const ext = file.name.split('.').pop()?.toLowerCase() ?? '';
|
|
50
|
+
if (ext === 'md' || ext === 'txt') {
|
|
51
|
+
return await file.text();
|
|
52
|
+
}
|
|
53
|
+
if (ext === 'docx') {
|
|
54
|
+
const buffer = await file.arrayBuffer();
|
|
55
|
+
const markdownDoc = await docxToMarkdownDoc(buffer);
|
|
56
|
+
return stringifyMarkdown(markdownDoc);
|
|
57
|
+
}
|
|
58
|
+
return await file.text();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Process multiple text files and concatenate their content.
|
|
62
|
+
*/
|
|
63
|
+
export async function processTextFiles(files) {
|
|
64
|
+
const results = [];
|
|
65
|
+
for (const file of files) {
|
|
66
|
+
const content = await processTextFile(file);
|
|
67
|
+
results.push(content);
|
|
68
|
+
}
|
|
69
|
+
return results.join('\n\n');
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=dropUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropUtils.js","sourceRoot":"","sources":["../../src/utils/dropUtils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAqB,MAAM,sBAAsB,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,IAAI,GAAW,EAAE,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,GAAG,KAAK,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACjC,IAAI,GAAG,KAAK,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAa,EACb,aAA4B;IAE5B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,0BAA0B,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAU;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAE5D,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClC,OAAO,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAa;IAClD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bendyline/squisq-editor-react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "React editor shell with raw/WYSIWYG/preview modes for Squisq documents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Bendyline",
|
|
@@ -38,16 +38,16 @@
|
|
|
38
38
|
},
|
|
39
39
|
"scripts": {
|
|
40
40
|
"build": "tsup",
|
|
41
|
-
"typecheck": "tsc --noEmit"
|
|
42
|
-
"prepublishOnly": "npm run build"
|
|
41
|
+
"typecheck": "tsc --noEmit"
|
|
43
42
|
},
|
|
44
43
|
"peerDependencies": {
|
|
45
44
|
"react": "^18.0.0 || ^19.0.0",
|
|
46
45
|
"react-dom": "^18.0.0 || ^19.0.0"
|
|
47
46
|
},
|
|
48
47
|
"dependencies": {
|
|
49
|
-
"@bendyline/squisq": "1.
|
|
50
|
-
"@bendyline/squisq-
|
|
48
|
+
"@bendyline/squisq": "1.1.0",
|
|
49
|
+
"@bendyline/squisq-formats": "1.1.0",
|
|
50
|
+
"@bendyline/squisq-react": "1.0.2",
|
|
51
51
|
"@monaco-editor/react": "^4.6.0",
|
|
52
52
|
"@tiptap/extension-placeholder": "^2.11.0",
|
|
53
53
|
"@tiptap/extension-table": "^2.11.0",
|