@v5md/plugin-export 0.0.0-stage → 0.0.2
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/README.md +66 -2
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +285 -0
- package/dist/index.js.map +1 -0
- package/package.json +39 -4
package/README.md
CHANGED
|
@@ -1,3 +1,67 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @v5md/plugin-export
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
v5md 的导出插件:Markdown、HTML、PDF 和图片。没有工具条按钮,全部通过外部 API 调用。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @v5md/plugin-export
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 使用
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { createExportPlugin, type ExportApi } from '@v5md/plugin-export'
|
|
15
|
+
|
|
16
|
+
const editor = new Editor({
|
|
17
|
+
element,
|
|
18
|
+
plugins: [createExportPlugin({ title: '我的文章' })],
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
const exporter = editor.getPlugin<ExportApi>('export')!
|
|
22
|
+
|
|
23
|
+
const markdown = exporter.api.exportMarkdown()
|
|
24
|
+
const html = await exporter.api.exportHtml()
|
|
25
|
+
const png = await exporter.api.exportImage({ type: 'png', scale: 2 })
|
|
26
|
+
const pdf = await exporter.api.exportPdf({ format: 'a4', margin: 24 })
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
也可以直接下载:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
exporter.api.downloadMarkdown('article.md')
|
|
33
|
+
await exporter.api.downloadHtml('article.html')
|
|
34
|
+
await exporter.api.downloadImage('article.png')
|
|
35
|
+
await exporter.api.downloadPdf('article.pdf')
|
|
36
|
+
await exporter.api.print()
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## API
|
|
40
|
+
|
|
41
|
+
| 方法 | 说明 |
|
|
42
|
+
| --- | --- |
|
|
43
|
+
| `exportMarkdown()` | 返回 Markdown |
|
|
44
|
+
| `exportHtmlFragment()` | 返回带内联样式的 HTML 片段 |
|
|
45
|
+
| `exportHtml()` | 返回完整 HTML 文档,图片会尽量内联为 data URL |
|
|
46
|
+
| `exportImage(options?)` | 返回 PNG / JPEG Blob |
|
|
47
|
+
| `exportPdf(options?)` | 返回 PDF Blob |
|
|
48
|
+
| `print()` | 打开浏览器打印对话框,可选择「另存为 PDF」 |
|
|
49
|
+
| `downloadMarkdown(fileName?)` | 下载 Markdown |
|
|
50
|
+
| `downloadHtml(fileName?)` | 下载 HTML |
|
|
51
|
+
| `downloadImage(fileName?, options?)` | 下载图片 |
|
|
52
|
+
| `downloadPdf(fileName?, options?)` | 下载 PDF |
|
|
53
|
+
|
|
54
|
+
`exportHtml()` 会导出当前编辑器已经渲染好的内容,因此公式保留 KaTeX 排版、Mermaid 保留渲染后的 SVG,而不是退回源码代码块;图片会先用 `fetch` 转成 data URL,遇到跨域图片时回退为绝对 URL。`exportHtml()` 和 `downloadHtml()` 都是异步的。`exportHtmlFragment()` 仍然输出适合公众号粘贴的内联样式片段。
|
|
55
|
+
|
|
56
|
+
PDF 和图片默认使用 `html2canvas` + `jspdf`,这两个依赖在插件包内部按需动态加载。也可以选择浏览器打印路径:`print()` 会打开打印对话框,由用户在浏览器里选择「另存为 PDF」。需要自定义实现时,通过 `renderer` 替换:
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
createExportPlugin({
|
|
60
|
+
renderer: {
|
|
61
|
+
image: async (element, options) => myImageRenderer(element, options),
|
|
62
|
+
pdf: async (element, options) => myPdfRenderer(element, options),
|
|
63
|
+
},
|
|
64
|
+
})
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
PDF 当前是图片式 PDF(文字不可选中);需要可选中文字时,可以通过自定义 `renderer.pdf` 接入其他方案。
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type V5mdPlugin } from '@v5md/view';
|
|
2
|
+
export type ExportImageType = 'png' | 'jpeg';
|
|
3
|
+
export interface ExportImageOptions {
|
|
4
|
+
type?: ExportImageType;
|
|
5
|
+
scale?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ExportPdfOptions {
|
|
8
|
+
/** PDF 页边距,单位 pt,默认 24。 */
|
|
9
|
+
margin?: number;
|
|
10
|
+
format?: 'a4' | 'letter';
|
|
11
|
+
/** 截图倍率,默认 2。 */
|
|
12
|
+
scale?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ExportRenderer {
|
|
15
|
+
image(element: HTMLElement, options: Required<Pick<ExportImageOptions, 'type' | 'scale'>>): Promise<Blob>;
|
|
16
|
+
pdf(element: HTMLElement, options: Required<ExportPdfOptions>): Promise<Blob>;
|
|
17
|
+
}
|
|
18
|
+
export interface ExportPluginOptions {
|
|
19
|
+
name?: string;
|
|
20
|
+
/** 导出 HTML 时使用的标题。 */
|
|
21
|
+
title?: string;
|
|
22
|
+
/** 默认文件名前缀,不含扩展名。 */
|
|
23
|
+
fileName?: string;
|
|
24
|
+
/** 图片/PDF 截图倍率,默认 2。 */
|
|
25
|
+
imageScale?: number;
|
|
26
|
+
/** PDF 页边距,单位 pt,默认 24。 */
|
|
27
|
+
pdfMargin?: number;
|
|
28
|
+
/** 替换默认的 html2canvas / jsPDF 实现,便于测试或接入其他渲染器。 */
|
|
29
|
+
renderer?: Partial<ExportRenderer>;
|
|
30
|
+
}
|
|
31
|
+
export interface ExportApi {
|
|
32
|
+
exportMarkdown(): string;
|
|
33
|
+
/** 完整 HTML 文档,可直接下载或打开;图片会尽量内联为 data URL。 */
|
|
34
|
+
exportHtml(): Promise<string>;
|
|
35
|
+
/** 可粘贴的 HTML 片段。 */
|
|
36
|
+
exportHtmlFragment(): string;
|
|
37
|
+
exportImage(options?: ExportImageOptions): Promise<Blob>;
|
|
38
|
+
exportPdf(options?: ExportPdfOptions): Promise<Blob>;
|
|
39
|
+
/** 打开浏览器打印对话框,可选择“另存为 PDF”。 */
|
|
40
|
+
print(): Promise<void>;
|
|
41
|
+
downloadMarkdown(fileName?: string): void;
|
|
42
|
+
downloadHtml(fileName?: string): Promise<void>;
|
|
43
|
+
downloadImage(fileName?: string, options?: ExportImageOptions): Promise<void>;
|
|
44
|
+
downloadPdf(fileName?: string, options?: ExportPdfOptions): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
export declare function createExportPlugin(options?: ExportPluginOptions): V5mdPlugin<ExportApi>;
|
|
47
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvE,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,CAAA;AAE5C,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,eAAe,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAA;IACxB,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzG,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9E;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sBAAsB;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wBAAwB;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,cAAc,IAAI,MAAM,CAAA;IACxB,6CAA6C;IAC7C,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7B,oBAAoB;IACpB,kBAAkB,IAAI,MAAM,CAAA;IAC5B,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxD,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,+BAA+B;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7E,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1E;AAKD,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,UAAU,CAAC,SAAS,CAAC,CAK3F"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { toWechatHtml } from '@v5md/view';
|
|
2
|
+
const DEFAULT_IMAGE_SCALE = 2;
|
|
3
|
+
const DEFAULT_PDF_MARGIN = 24;
|
|
4
|
+
export function createExportPlugin(options = {}) {
|
|
5
|
+
return {
|
|
6
|
+
name: options.name ?? 'export',
|
|
7
|
+
api: (context) => createExportApi(context.editor, context.editor.getContentElement(), options),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function createExportApi(editor, content, options) {
|
|
11
|
+
const title = options.title ?? 'v5md 文档';
|
|
12
|
+
const baseName = options.fileName ?? 'v5md-document';
|
|
13
|
+
const imageScale = options.imageScale ?? DEFAULT_IMAGE_SCALE;
|
|
14
|
+
const pdfMargin = options.pdfMargin ?? DEFAULT_PDF_MARGIN;
|
|
15
|
+
const renderImage = options.renderer?.image ?? renderImageWithHtml2Canvas;
|
|
16
|
+
const renderPdf = options.renderer?.pdf ?? renderPdfWithJsPdf;
|
|
17
|
+
const requireContent = () => {
|
|
18
|
+
if (!content.isConnected)
|
|
19
|
+
throw new Error('export plugin is not mounted');
|
|
20
|
+
return content;
|
|
21
|
+
};
|
|
22
|
+
const api = {
|
|
23
|
+
exportMarkdown() {
|
|
24
|
+
return editor.getMarkdown();
|
|
25
|
+
},
|
|
26
|
+
exportHtmlFragment() {
|
|
27
|
+
return toWechatHtml(editor.getMarkdown());
|
|
28
|
+
},
|
|
29
|
+
exportHtml() {
|
|
30
|
+
return buildStandaloneHtml(editor, title);
|
|
31
|
+
},
|
|
32
|
+
async print() {
|
|
33
|
+
printHtml(await api.exportHtml());
|
|
34
|
+
},
|
|
35
|
+
exportImage(imageOptions = {}) {
|
|
36
|
+
return renderImage(requireContent(), {
|
|
37
|
+
type: imageOptions.type ?? 'png',
|
|
38
|
+
scale: imageOptions.scale ?? imageScale,
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
exportPdf(pdfOptions = {}) {
|
|
42
|
+
return renderPdf(requireContent(), {
|
|
43
|
+
margin: pdfOptions.margin ?? pdfMargin,
|
|
44
|
+
format: pdfOptions.format ?? 'a4',
|
|
45
|
+
scale: pdfOptions.scale ?? imageScale,
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
downloadMarkdown(fileName = `${baseName}.md`) {
|
|
49
|
+
downloadBlob(new Blob([api.exportMarkdown()], { type: 'text/markdown;charset=utf-8' }), fileName);
|
|
50
|
+
},
|
|
51
|
+
async downloadHtml(fileName = `${baseName}.html`) {
|
|
52
|
+
downloadBlob(new Blob([await api.exportHtml()], { type: 'text/html;charset=utf-8' }), fileName);
|
|
53
|
+
},
|
|
54
|
+
async downloadImage(fileName, imageOptions) {
|
|
55
|
+
const type = imageOptions?.type ?? 'png';
|
|
56
|
+
const blob = await api.exportImage(imageOptions);
|
|
57
|
+
downloadBlob(blob, fileName ?? `${baseName}.${type === 'jpeg' ? 'jpg' : 'png'}`);
|
|
58
|
+
},
|
|
59
|
+
async downloadPdf(fileName = `${baseName}.pdf`, pdfOptions) {
|
|
60
|
+
const blob = await api.exportPdf(pdfOptions);
|
|
61
|
+
downloadBlob(blob, fileName);
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
return api;
|
|
65
|
+
}
|
|
66
|
+
async function buildStandaloneHtml(editor, title) {
|
|
67
|
+
const clone = editor.getContentElement().cloneNode(true);
|
|
68
|
+
if (!(clone instanceof HTMLElement))
|
|
69
|
+
throw new Error('editor content is not an element');
|
|
70
|
+
cleanContent(clone);
|
|
71
|
+
await inlineImages(clone);
|
|
72
|
+
const styles = collectEditorStyles();
|
|
73
|
+
return `<!doctype html>
|
|
74
|
+
<html lang="zh-CN">
|
|
75
|
+
<head>
|
|
76
|
+
<meta charset="utf-8">
|
|
77
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
78
|
+
<title>${escapeHtml(title)}</title>
|
|
79
|
+
<style>
|
|
80
|
+
${styles}
|
|
81
|
+
</style>
|
|
82
|
+
</head>
|
|
83
|
+
<body style="margin:0;padding:32px;background:#fff;">
|
|
84
|
+
<div class="v5md is-preview">${clone.outerHTML}</div>
|
|
85
|
+
</body>
|
|
86
|
+
</html>`;
|
|
87
|
+
}
|
|
88
|
+
function cleanContent(root) {
|
|
89
|
+
root
|
|
90
|
+
.querySelectorAll('.md-marker, .v5-source, .v5-image-resize, .v5-empty-line, .v5-block-handle, .v5-block-menu, .v5-tablebar, .v5-toolbar, .v5-outline, .v5-find')
|
|
91
|
+
.forEach((element) => element.remove());
|
|
92
|
+
root.querySelectorAll('.v5-check').forEach((check) => {
|
|
93
|
+
if (check.tagName !== 'BUTTON')
|
|
94
|
+
return;
|
|
95
|
+
const span = root.ownerDocument.createElement('span');
|
|
96
|
+
span.className = 'v5-check';
|
|
97
|
+
span.dataset.checked = check.getAttribute('data-checked') ?? 'false';
|
|
98
|
+
check.replaceWith(span);
|
|
99
|
+
});
|
|
100
|
+
for (const element of [root, ...root.querySelectorAll('*')]) {
|
|
101
|
+
for (const attribute of [...element.attributes]) {
|
|
102
|
+
if (attribute.name === 'data-checked')
|
|
103
|
+
continue;
|
|
104
|
+
if (attribute.name.startsWith('data-') ||
|
|
105
|
+
attribute.name === 'contenteditable' ||
|
|
106
|
+
attribute.name === 'tabindex' ||
|
|
107
|
+
attribute.name === 'spellcheck' ||
|
|
108
|
+
attribute.name === 'autocapitalize' ||
|
|
109
|
+
attribute.name === 'role' ||
|
|
110
|
+
attribute.name.startsWith('aria-')) {
|
|
111
|
+
element.removeAttribute(attribute.name);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
element.classList.remove('is-source', 'is-active', 'is-composing', 'v5-source-mode');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function inlineImages(root) {
|
|
118
|
+
const images = [...root.querySelectorAll('img')];
|
|
119
|
+
await Promise.all(images.map(async (image) => {
|
|
120
|
+
const source = image.getAttribute('src')?.trim();
|
|
121
|
+
if (!source || source.startsWith('data:'))
|
|
122
|
+
return;
|
|
123
|
+
let absolute = source;
|
|
124
|
+
if (typeof document !== 'undefined') {
|
|
125
|
+
try {
|
|
126
|
+
absolute = new URL(source, document.baseURI).href;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Keep the original source when it cannot be resolved.
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (typeof fetch !== 'function') {
|
|
133
|
+
image.setAttribute('src', absolute);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
const response = await fetch(absolute, { mode: 'cors' });
|
|
138
|
+
if (!response.ok)
|
|
139
|
+
throw new Error(`image request failed: ${response.status}`);
|
|
140
|
+
image.setAttribute('src', await blobToDataUrl(await response.blob()));
|
|
141
|
+
image.removeAttribute('srcset');
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
image.setAttribute('src', absolute);
|
|
145
|
+
}
|
|
146
|
+
}));
|
|
147
|
+
}
|
|
148
|
+
function blobToDataUrl(blob) {
|
|
149
|
+
return new Promise((resolve, reject) => {
|
|
150
|
+
const reader = new FileReader();
|
|
151
|
+
reader.onload = () => {
|
|
152
|
+
if (typeof reader.result === 'string')
|
|
153
|
+
resolve(reader.result);
|
|
154
|
+
else
|
|
155
|
+
reject(new Error('failed to read image as data url'));
|
|
156
|
+
};
|
|
157
|
+
reader.onerror = () => reject(reader.error ?? new Error('failed to read image as data url'));
|
|
158
|
+
reader.readAsDataURL(blob);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
function collectEditorStyles() {
|
|
162
|
+
if (typeof document === 'undefined')
|
|
163
|
+
return '';
|
|
164
|
+
const rules = [];
|
|
165
|
+
for (const sheet of Array.from(document.styleSheets)) {
|
|
166
|
+
let list;
|
|
167
|
+
try {
|
|
168
|
+
list = sheet.cssRules;
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
for (const rule of Array.from(list)) {
|
|
174
|
+
const text = rule.cssText;
|
|
175
|
+
if (!text)
|
|
176
|
+
continue;
|
|
177
|
+
if (/\.v5|\.katex|\.hljs|KaTeX|@font-face|::highlight/.test(text))
|
|
178
|
+
rules.push(text);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return rules.join('\n');
|
|
182
|
+
}
|
|
183
|
+
function printHtml(html) {
|
|
184
|
+
if (typeof document === 'undefined')
|
|
185
|
+
throw new Error('print requires a browser document');
|
|
186
|
+
const iframe = document.createElement('iframe');
|
|
187
|
+
iframe.setAttribute('aria-hidden', 'true');
|
|
188
|
+
iframe.style.position = 'fixed';
|
|
189
|
+
iframe.style.left = '-9999px';
|
|
190
|
+
iframe.style.top = '0';
|
|
191
|
+
iframe.style.width = '0';
|
|
192
|
+
iframe.style.height = '0';
|
|
193
|
+
iframe.style.border = '0';
|
|
194
|
+
iframe.srcdoc = html;
|
|
195
|
+
const cleanup = () => {
|
|
196
|
+
setTimeout(() => iframe.remove(), 0);
|
|
197
|
+
};
|
|
198
|
+
iframe.addEventListener('load', () => {
|
|
199
|
+
const frameWindow = iframe.contentWindow;
|
|
200
|
+
if (!frameWindow) {
|
|
201
|
+
cleanup();
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
frameWindow.focus();
|
|
205
|
+
frameWindow.print();
|
|
206
|
+
cleanup();
|
|
207
|
+
});
|
|
208
|
+
document.body.append(iframe);
|
|
209
|
+
}
|
|
210
|
+
async function renderCanvas(element, scale) {
|
|
211
|
+
if (typeof document === 'undefined')
|
|
212
|
+
throw new Error('image export requires a browser document');
|
|
213
|
+
const html2canvas = (await import('html2canvas')).default;
|
|
214
|
+
return html2canvas(element, {
|
|
215
|
+
backgroundColor: '#ffffff',
|
|
216
|
+
scale,
|
|
217
|
+
useCORS: true,
|
|
218
|
+
logging: false,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
async function renderImageWithHtml2Canvas(element, options) {
|
|
222
|
+
const canvas = await renderCanvas(element, options.scale);
|
|
223
|
+
return canvasToBlob(canvas, options.type);
|
|
224
|
+
}
|
|
225
|
+
async function renderPdfWithJsPdf(element, options) {
|
|
226
|
+
const canvas = await renderCanvas(element, options.scale);
|
|
227
|
+
if (canvas.width === 0 || canvas.height === 0)
|
|
228
|
+
throw new Error('cannot export an empty document');
|
|
229
|
+
const { jsPDF } = await import('jspdf');
|
|
230
|
+
const pdf = new jsPDF({ unit: 'pt', format: options.format, orientation: 'portrait' });
|
|
231
|
+
const pageWidth = pdf.internal.pageSize.getWidth();
|
|
232
|
+
const pageHeight = pdf.internal.pageSize.getHeight();
|
|
233
|
+
const margin = options.margin;
|
|
234
|
+
const contentWidth = pageWidth - margin * 2;
|
|
235
|
+
const contentHeight = pageHeight - margin * 2;
|
|
236
|
+
const scale = contentWidth / canvas.width;
|
|
237
|
+
const pageSliceHeight = Math.max(1, Math.floor(contentHeight / scale));
|
|
238
|
+
const ownerDocument = element.ownerDocument;
|
|
239
|
+
let offset = 0;
|
|
240
|
+
while (offset < canvas.height) {
|
|
241
|
+
const height = Math.min(pageSliceHeight, canvas.height - offset);
|
|
242
|
+
const pageCanvas = ownerDocument.createElement('canvas');
|
|
243
|
+
pageCanvas.width = canvas.width;
|
|
244
|
+
pageCanvas.height = height;
|
|
245
|
+
const context = pageCanvas.getContext('2d');
|
|
246
|
+
if (!context)
|
|
247
|
+
throw new Error('image export requires a 2d canvas context');
|
|
248
|
+
context.fillStyle = '#ffffff';
|
|
249
|
+
context.fillRect(0, 0, pageCanvas.width, pageCanvas.height);
|
|
250
|
+
context.drawImage(canvas, 0, offset, canvas.width, height, 0, 0, canvas.width, height);
|
|
251
|
+
if (offset > 0)
|
|
252
|
+
pdf.addPage();
|
|
253
|
+
pdf.addImage(pageCanvas.toDataURL('image/png'), 'PNG', margin, margin, contentWidth, height * scale);
|
|
254
|
+
offset += height;
|
|
255
|
+
}
|
|
256
|
+
return pdf.output('blob');
|
|
257
|
+
}
|
|
258
|
+
function canvasToBlob(canvas, type) {
|
|
259
|
+
return new Promise((resolve, reject) => {
|
|
260
|
+
canvas.toBlob((blob) => {
|
|
261
|
+
if (blob)
|
|
262
|
+
resolve(blob);
|
|
263
|
+
else
|
|
264
|
+
reject(new Error('failed to create image blob'));
|
|
265
|
+
}, `image/${type}`, 0.95);
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
function downloadBlob(blob, fileName) {
|
|
269
|
+
if (typeof document === 'undefined' || typeof URL === 'undefined') {
|
|
270
|
+
throw new Error('download requires a browser document');
|
|
271
|
+
}
|
|
272
|
+
const url = URL.createObjectURL(blob);
|
|
273
|
+
const anchor = document.createElement('a');
|
|
274
|
+
anchor.href = url;
|
|
275
|
+
anchor.download = fileName;
|
|
276
|
+
anchor.rel = 'noopener';
|
|
277
|
+
document.body.append(anchor);
|
|
278
|
+
anchor.click();
|
|
279
|
+
anchor.remove();
|
|
280
|
+
setTimeout(() => URL.revokeObjectURL(url), 1000);
|
|
281
|
+
}
|
|
282
|
+
function escapeHtml(text) {
|
|
283
|
+
return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@v5md/plugin-export",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "v5md 导出插件:Markdown / HTML / PDF / 图片",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md"
|
|
10
|
+
],
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"sideEffects": false,
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public",
|
|
16
|
+
"registry": "https://registry.npmjs.org"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://onedev.v5ai.xin/v5md.git",
|
|
21
|
+
"directory": "packages/plugins/export"
|
|
22
|
+
},
|
|
23
|
+
"exports": {
|
|
24
|
+
".": {
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"import": "./dist/index.js"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "rm -rf dist tsconfig.tsbuildinfo && tsc -p tsconfig.json",
|
|
31
|
+
"prepublishOnly": "npm run build"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@v5md/view": "0.0.2",
|
|
35
|
+
"html2canvas": "^1.4.1",
|
|
36
|
+
"jspdf": "^4.2.1"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"typescript": "^5.9.0"
|
|
40
|
+
}
|
|
41
|
+
}
|