@teriusu/rich-editor 0.6.4 → 0.6.5
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/components/TipTapEditor.svelte +6 -9
- package/dist/components/TipTapEditor.svelte.d.ts +1 -0
- package/dist/components/TipTapEditor.svelte.d.ts.map +1 -1
- package/dist/extensions/FileAttachment.d.ts +5 -3
- package/dist/extensions/FileAttachment.d.ts.map +1 -1
- package/dist/extensions/FileAttachment.js +8 -12
- package/package.json +1 -1
|
@@ -113,6 +113,7 @@
|
|
|
113
113
|
placeholder = "'/'를 눌러 명령어를 입력하세요...",
|
|
114
114
|
onUploadFile,
|
|
115
115
|
onResolveFile,
|
|
116
|
+
fileDownloadBaseUrl,
|
|
116
117
|
onPromptLink,
|
|
117
118
|
onPromptImage,
|
|
118
119
|
extensions: extraExtensions = [],
|
|
@@ -125,6 +126,7 @@
|
|
|
125
126
|
placeholder?: string;
|
|
126
127
|
onUploadFile?: UploadHandler;
|
|
127
128
|
onResolveFile?: FileResolver;
|
|
129
|
+
fileDownloadBaseUrl?: string;
|
|
128
130
|
onPromptLink?: PromptHandler;
|
|
129
131
|
onPromptImage?: PromptHandler;
|
|
130
132
|
extensions?: AnyExtension[];
|
|
@@ -370,7 +372,10 @@
|
|
|
370
372
|
CustomTableHeader,
|
|
371
373
|
CustomTableCell,
|
|
372
374
|
PdfBlock,
|
|
373
|
-
FileAttachment
|
|
375
|
+
FileAttachment.configure({
|
|
376
|
+
resolver: onResolveFile ?? null,
|
|
377
|
+
...(fileDownloadBaseUrl ? { downloadBaseUrl: fileDownloadBaseUrl } : {}),
|
|
378
|
+
}),
|
|
374
379
|
VideoBlock,
|
|
375
380
|
Columns,
|
|
376
381
|
Column,
|
|
@@ -496,14 +501,6 @@
|
|
|
496
501
|
},
|
|
497
502
|
});
|
|
498
503
|
|
|
499
|
-
// File resolver를 storage에 등록
|
|
500
|
-
if (onResolveFile) {
|
|
501
|
-
editor.storage.fileAttachment = {
|
|
502
|
-
...editor.storage.fileAttachment,
|
|
503
|
-
resolver: onResolveFile,
|
|
504
|
-
};
|
|
505
|
-
}
|
|
506
|
-
|
|
507
504
|
editor.on("update", handleUpdate);
|
|
508
505
|
editor.on("selectionUpdate", handleSelectionUpdate);
|
|
509
506
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TipTapEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/components/TipTapEditor.svelte.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAa5D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEhE,KAAK,gBAAgB,GAAI;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CAC7B,CAAC;
|
|
1
|
+
{"version":3,"file":"TipTapEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/components/TipTapEditor.svelte.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAa5D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEhE,KAAK,gBAAgB,GAAI;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CAC7B,CAAC;AA2mBJ,QAAA,MAAM,YAAY,sDAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { Node } from "@tiptap/core";
|
|
2
|
-
export interface FileAttachmentOptions {
|
|
3
|
-
HTMLAttributes: Record<string, unknown>;
|
|
4
|
-
}
|
|
5
2
|
export type FileResolveResult = {
|
|
6
3
|
src: string;
|
|
7
4
|
name?: string;
|
|
8
5
|
size?: number;
|
|
9
6
|
};
|
|
10
7
|
export type FileResolver = (fileId: string) => Promise<FileResolveResult>;
|
|
8
|
+
export interface FileAttachmentOptions {
|
|
9
|
+
HTMLAttributes: Record<string, unknown>;
|
|
10
|
+
resolver: FileResolver | null;
|
|
11
|
+
downloadBaseUrl: string;
|
|
12
|
+
}
|
|
11
13
|
declare module "@tiptap/core" {
|
|
12
14
|
interface Commands<ReturnType> {
|
|
13
15
|
fileAttachment: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileAttachment.d.ts","sourceRoot":"","sources":["../../src/extensions/FileAttachment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAC;AAErD,MAAM,
|
|
1
|
+
{"version":3,"file":"FileAttachment.d.ts","sourceRoot":"","sources":["../../src/extensions/FileAttachment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9E,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE1E,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,cAAc,EAAE;YACd,iBAAiB,EAAE,CAAC,KAAK,EAAE;gBACzB,GAAG,CAAC,EAAE,MAAM,CAAC;gBACb,MAAM,CAAC,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;gBACb,IAAI,CAAC,EAAE,MAAM,CAAC;aACf,KAAK,UAAU,CAAC;SAClB,CAAC;KACH;CACF;AAkCD,eAAO,MAAM,cAAc,kCAiNzB,CAAC"}
|
|
@@ -8,7 +8,7 @@ function formatFileSize(bytes) {
|
|
|
8
8
|
}
|
|
9
9
|
function isInlineable(name) {
|
|
10
10
|
const ext = name.split(".").pop()?.toLowerCase() || "";
|
|
11
|
-
return ["pdf", "png", "jpg", "jpeg", "gif", "webp", "svg"].includes(ext);
|
|
11
|
+
return ["pdf", "png", "jpg", "jpeg", "gif", "webp", "svg", "txt", "html", "htm"].includes(ext);
|
|
12
12
|
}
|
|
13
13
|
function getFileIcon(name) {
|
|
14
14
|
const ext = name.split(".").pop()?.toLowerCase() || "";
|
|
@@ -36,7 +36,7 @@ export const FileAttachment = Node.create({
|
|
|
36
36
|
atom: true,
|
|
37
37
|
draggable: true,
|
|
38
38
|
addOptions() {
|
|
39
|
-
return { HTMLAttributes: {} };
|
|
39
|
+
return { HTMLAttributes: {}, resolver: null, downloadBaseUrl: "/api/upload" };
|
|
40
40
|
},
|
|
41
41
|
addAttributes() {
|
|
42
42
|
return {
|
|
@@ -168,15 +168,14 @@ export const FileAttachment = Node.create({
|
|
|
168
168
|
sizeEl.textContent = formatFileSize(node.attrs.size);
|
|
169
169
|
}
|
|
170
170
|
else if (node.attrs.fileId) {
|
|
171
|
-
//
|
|
172
|
-
|
|
173
|
-
sizeEl.textContent = "loading...";
|
|
171
|
+
// fileId만 있어도 proxy URL로 다운로드 가능 — 버튼은 항상 활성.
|
|
172
|
+
// resolver가 있으면 이름/크기 메타데이터를 채운다.
|
|
174
173
|
const resolver = editor.storage.fileAttachment?.resolver;
|
|
175
174
|
if (resolver) {
|
|
175
|
+
sizeEl.textContent = "loading...";
|
|
176
176
|
resolver(node.attrs.fileId)
|
|
177
177
|
.then((result) => {
|
|
178
178
|
resolvedSrc = result.src;
|
|
179
|
-
nameEl.disabled = false;
|
|
180
179
|
if (result.name) {
|
|
181
180
|
resolvedName = result.name;
|
|
182
181
|
nameEl.textContent = result.name;
|
|
@@ -185,12 +184,9 @@ export const FileAttachment = Node.create({
|
|
|
185
184
|
sizeEl.textContent = result.size ? formatFileSize(result.size) : "";
|
|
186
185
|
})
|
|
187
186
|
.catch(() => {
|
|
188
|
-
sizeEl.textContent = "
|
|
187
|
+
sizeEl.textContent = "";
|
|
189
188
|
});
|
|
190
189
|
}
|
|
191
|
-
else {
|
|
192
|
-
sizeEl.textContent = `ID: ${node.attrs.fileId}`;
|
|
193
|
-
}
|
|
194
190
|
}
|
|
195
191
|
dom.appendChild(icon);
|
|
196
192
|
dom.appendChild(nameEl);
|
|
@@ -220,8 +216,8 @@ export const FileAttachment = Node.create({
|
|
|
220
216
|
},
|
|
221
217
|
addStorage() {
|
|
222
218
|
return {
|
|
223
|
-
resolver:
|
|
224
|
-
downloadBaseUrl:
|
|
219
|
+
resolver: this.options.resolver,
|
|
220
|
+
downloadBaseUrl: this.options.downloadBaseUrl,
|
|
225
221
|
};
|
|
226
222
|
},
|
|
227
223
|
addCommands() {
|