@mcpcn/markdown-converter-mcp 1.0.1

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.
Files changed (65) hide show
  1. package/.eslintrc.json +17 -0
  2. package/.prettierrc.json +8 -0
  3. package/README.md +214 -0
  4. package/dist/config/word.d.ts +67 -0
  5. package/dist/config/word.d.ts.map +1 -0
  6. package/dist/config/word.js +86 -0
  7. package/dist/config/word.js.map +1 -0
  8. package/dist/core/BaseConverter.d.ts +104 -0
  9. package/dist/core/BaseConverter.d.ts.map +1 -0
  10. package/dist/core/BaseConverter.js +203 -0
  11. package/dist/core/BaseConverter.js.map +1 -0
  12. package/dist/core/BrowserPool.d.ts +25 -0
  13. package/dist/core/BrowserPool.d.ts.map +1 -0
  14. package/dist/core/BrowserPool.js +152 -0
  15. package/dist/core/BrowserPool.js.map +1 -0
  16. package/dist/core/CacheManager.d.ts +26 -0
  17. package/dist/core/CacheManager.d.ts.map +1 -0
  18. package/dist/core/CacheManager.js +74 -0
  19. package/dist/core/CacheManager.js.map +1 -0
  20. package/dist/core/EnhancedConverter.d.ts +78 -0
  21. package/dist/core/EnhancedConverter.d.ts.map +1 -0
  22. package/dist/core/EnhancedConverter.js +227 -0
  23. package/dist/core/EnhancedConverter.js.map +1 -0
  24. package/dist/core/MarkdownRenderer.d.ts +19 -0
  25. package/dist/core/MarkdownRenderer.d.ts.map +1 -0
  26. package/dist/core/MarkdownRenderer.js +160 -0
  27. package/dist/core/MarkdownRenderer.js.map +1 -0
  28. package/dist/core/PDFConverter.d.ts +81 -0
  29. package/dist/core/PDFConverter.d.ts.map +1 -0
  30. package/dist/core/PDFConverter.js +284 -0
  31. package/dist/core/PDFConverter.js.map +1 -0
  32. package/dist/core/PDFGenerator.d.ts +32 -0
  33. package/dist/core/PDFGenerator.d.ts.map +1 -0
  34. package/dist/core/PDFGenerator.js +352 -0
  35. package/dist/core/PDFGenerator.js.map +1 -0
  36. package/dist/core/TemplateManager.d.ts +16 -0
  37. package/dist/core/TemplateManager.d.ts.map +1 -0
  38. package/dist/core/TemplateManager.js +321 -0
  39. package/dist/core/TemplateManager.js.map +1 -0
  40. package/dist/core/WordConverter.d.ts +43 -0
  41. package/dist/core/WordConverter.d.ts.map +1 -0
  42. package/dist/core/WordConverter.js +398 -0
  43. package/dist/core/WordConverter.js.map +1 -0
  44. package/dist/index.d.ts +28 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +334 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/types/index.d.ts +69 -0
  49. package/dist/types/index.d.ts.map +1 -0
  50. package/dist/types/index.js +2 -0
  51. package/dist/types/index.js.map +1 -0
  52. package/package.json +66 -0
  53. package/src/config/word.ts +164 -0
  54. package/src/core/BaseConverter.ts +275 -0
  55. package/src/core/BrowserPool.ts +176 -0
  56. package/src/core/CacheManager.ts +88 -0
  57. package/src/core/MarkdownRenderer.ts +211 -0
  58. package/src/core/PDFConverter.ts +374 -0
  59. package/src/core/PDFGenerator.ts +428 -0
  60. package/src/core/TemplateManager.ts +331 -0
  61. package/src/core/WordConverter.ts +470 -0
  62. package/src/index.ts +419 -0
  63. package/src/types/index.ts +75 -0
  64. package/src/types/remarkable.d.ts +8 -0
  65. package/tsconfig.json +23 -0
@@ -0,0 +1,203 @@
1
+ /**
2
+ * 基础转换器抽象类
3
+ * 提供通用的Markdown处理、缓存管理、进度报告等功能
4
+ */
5
+ import fs from 'fs/promises';
6
+ import path from 'path';
7
+ import crypto from 'crypto';
8
+ /**
9
+ * 抽象基础转换器类
10
+ * 子类需要实现具体的转换逻辑
11
+ */
12
+ export class BaseConverter {
13
+ cacheEnabled;
14
+ cacheDir;
15
+ constructor(options = {}) {
16
+ this.cacheEnabled = options.cacheEnabled ?? true;
17
+ this.cacheDir = options.cacheDir ?? path.join(process.cwd(), '.cache');
18
+ }
19
+ /**
20
+ * 解析Markdown内容,提取基本统计信息
21
+ */
22
+ parseMarkdown(content) {
23
+ const lines = content.split('\n');
24
+ const stats = {
25
+ headings: 0,
26
+ codeBlocks: 0,
27
+ paragraphs: 0,
28
+ tables: 0,
29
+ };
30
+ let inCodeBlock = false;
31
+ for (const line of lines) {
32
+ const trimmed = line.trim();
33
+ // 检测代码块
34
+ if (trimmed.startsWith('```')) {
35
+ inCodeBlock = !inCodeBlock;
36
+ if (!inCodeBlock)
37
+ stats.codeBlocks++;
38
+ continue;
39
+ }
40
+ if (inCodeBlock)
41
+ continue;
42
+ // 检测标题
43
+ if (trimmed.startsWith('#')) {
44
+ stats.headings++;
45
+ }
46
+ // 检测表格
47
+ else if (trimmed.includes('|') && trimmed.split('|').length > 2) {
48
+ stats.tables++;
49
+ }
50
+ // 检测段落
51
+ else if (trimmed.length > 0) {
52
+ stats.paragraphs++;
53
+ }
54
+ }
55
+ return { content, stats };
56
+ }
57
+ /**
58
+ * 生成缓存键
59
+ */
60
+ generateCacheKey(content, options) {
61
+ const hash = crypto.createHash('md5');
62
+ hash.update(content);
63
+ hash.update(JSON.stringify(options));
64
+ return hash.digest('hex');
65
+ }
66
+ /**
67
+ * 获取缓存文件路径
68
+ */
69
+ getCacheFilePath(cacheKey, extension) {
70
+ return path.join(this.cacheDir, `${cacheKey}.${extension}`);
71
+ }
72
+ /**
73
+ * 检查缓存是否存在且有效
74
+ */
75
+ async isCacheValid(cacheKey, extension) {
76
+ if (!this.cacheEnabled)
77
+ return false;
78
+ try {
79
+ const cacheFile = this.getCacheFilePath(cacheKey, extension);
80
+ await fs.access(cacheFile);
81
+ // 检查文件修改时间(24小时内有效)
82
+ const stats = await fs.stat(cacheFile);
83
+ const now = Date.now();
84
+ const fileAge = now - stats.mtime.getTime();
85
+ const maxAge = 24 * 60 * 60 * 1000; // 24小时
86
+ return fileAge < maxAge;
87
+ }
88
+ catch {
89
+ return false;
90
+ }
91
+ }
92
+ /**
93
+ * 保存到缓存
94
+ */
95
+ async saveToCache(cacheKey, extension, data) {
96
+ if (!this.cacheEnabled)
97
+ return;
98
+ try {
99
+ await fs.mkdir(this.cacheDir, { recursive: true });
100
+ const cacheFile = this.getCacheFilePath(cacheKey, extension);
101
+ await fs.writeFile(cacheFile, data);
102
+ }
103
+ catch (error) {
104
+ // 缓存失败不影响主流程
105
+ console.warn('保存缓存失败:', error);
106
+ }
107
+ }
108
+ /**
109
+ * 从缓存读取
110
+ */
111
+ async loadFromCache(cacheKey, extension) {
112
+ if (!this.cacheEnabled)
113
+ return null;
114
+ try {
115
+ const cacheFile = this.getCacheFilePath(cacheKey, extension);
116
+ return await fs.readFile(cacheFile);
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ }
122
+ /**
123
+ * 报告进度
124
+ */
125
+ reportProgress(progress, progressCallback) {
126
+ if (progressCallback) {
127
+ progressCallback(progress);
128
+ }
129
+ }
130
+ /**
131
+ * 清理资源
132
+ */
133
+ async cleanup() {
134
+ // 子类可以重写此方法进行特定清理
135
+ }
136
+ /**
137
+ * 验证输入文件
138
+ */
139
+ async validateInputFile(filePath) {
140
+ try {
141
+ const stats = await fs.stat(filePath);
142
+ if (!stats.isFile()) {
143
+ throw new Error(`路径不是文件: ${filePath}`);
144
+ }
145
+ // 限制文件大小为50MB
146
+ const maxSize = 50 * 1024 * 1024;
147
+ if (stats.size > maxSize) {
148
+ throw new Error(`文件过大,最大支持50MB: ${filePath}`);
149
+ }
150
+ }
151
+ catch (error) {
152
+ if (error.code === 'ENOENT') {
153
+ throw new Error(`文件不存在: ${filePath}`);
154
+ }
155
+ throw error;
156
+ }
157
+ }
158
+ /**
159
+ * 确保输出目录存在
160
+ */
161
+ async ensureOutputDir(outputPath) {
162
+ const dir = path.dirname(outputPath);
163
+ await fs.mkdir(dir, { recursive: true });
164
+ }
165
+ /**
166
+ * 获取文件大小信息
167
+ */
168
+ async getFileSize(filePath) {
169
+ try {
170
+ const stats = await fs.stat(filePath);
171
+ return stats.size;
172
+ }
173
+ catch {
174
+ return 0;
175
+ }
176
+ }
177
+ /**
178
+ * 格式化文件大小
179
+ */
180
+ formatFileSize(bytes) {
181
+ if (bytes < 1024)
182
+ return `${bytes} B`;
183
+ if (bytes < 1024 * 1024)
184
+ return `${(bytes / 1024).toFixed(1)} KB`;
185
+ return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
186
+ }
187
+ /**
188
+ * 清理文本,移除可能导致问题的字符
189
+ */
190
+ cleanText(text) {
191
+ return text
192
+ // 修复常见的Unicode字符问题
193
+ .replace(/[\u2018\u2019]/g, "'") // 弯引号 → 直引号
194
+ .replace(/[\u201C\u201D]/g, '"') // 弯双引号 → 直双引号
195
+ .replace(/[\u2013\u2014]/g, '-') // 长破折号 → 连字符
196
+ .replace(/\u2026/g, '...') // 省略号
197
+ .replace(/\u00A0/g, ' ') // 不间断空格 → 普通空格
198
+ // 移除其他可能导致问题的字符
199
+ .replace(/[\u200B-\u200D\uFEFF]/g, '') // 零宽度字符
200
+ .trim();
201
+ }
202
+ }
203
+ //# sourceMappingURL=BaseConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseConverter.js","sourceRoot":"","sources":["../../src/core/BaseConverter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { Browser } from 'puppeteer';
2
+ import { BrowserPool } from '../types/index.js';
3
+ /**
4
+ * 高性能浏览器连接池
5
+ * 支持浏览器复用,减少启动开销
6
+ */
7
+ export declare class PuppeteerBrowserPool implements BrowserPool {
8
+ private browsers;
9
+ private busyBrowsers;
10
+ private readonly maxBrowsers;
11
+ private readonly chromeVersion;
12
+ private isShuttingDown;
13
+ constructor(maxBrowsers?: number);
14
+ private getChromeExecutablePath;
15
+ private createBrowser;
16
+ getBrowser(): Promise<Browser>;
17
+ releaseBrowser(browser: Browser): void;
18
+ cleanup(): Promise<void>;
19
+ getStats(): {
20
+ total: number;
21
+ busy: number;
22
+ available: number;
23
+ };
24
+ }
25
+ //# sourceMappingURL=BrowserPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserPool.d.ts","sourceRoot":"","sources":["../../src/core/BrowserPool.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,OAAO,EAAQ,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKhD;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,WAAW;IACtD,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,cAAc,CAAS;gBAEnB,WAAW,GAAE,MAAU;IAQnC,OAAO,CAAC,uBAAuB;YA2BjB,aAAa;IAyCrB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAoDpC,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIhC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB9B,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CAQ/D"}
@@ -0,0 +1,152 @@
1
+ import puppeteer from 'puppeteer';
2
+ import os from 'os';
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ /**
6
+ * 高性能浏览器连接池
7
+ * 支持浏览器复用,减少启动开销
8
+ */
9
+ export class PuppeteerBrowserPool {
10
+ browsers = [];
11
+ busyBrowsers = new Set();
12
+ maxBrowsers;
13
+ chromeVersion = '131.0.6778.204';
14
+ isShuttingDown = false;
15
+ constructor(maxBrowsers = 3) {
16
+ this.maxBrowsers = maxBrowsers;
17
+ // 优雅关闭处理
18
+ process.on('SIGINT', () => this.cleanup());
19
+ process.on('SIGTERM', () => this.cleanup());
20
+ }
21
+ getChromeExecutablePath() {
22
+ const platform = process.platform;
23
+ const arch = os.arch();
24
+ let chromePath;
25
+ if (platform === 'darwin') {
26
+ chromePath = arch === 'arm64'
27
+ ? `mac_arm-${this.chromeVersion}/chrome-mac-arm64/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing`
28
+ : `mac-${this.chromeVersion}/chrome-mac/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing`;
29
+ }
30
+ else if (platform === 'linux') {
31
+ chromePath = `linux-${this.chromeVersion}/chrome-linux/chrome`;
32
+ }
33
+ else if (platform === 'win32') {
34
+ chromePath = `win64-${this.chromeVersion}/chrome-win/chrome.exe`;
35
+ }
36
+ else {
37
+ throw new Error(`Unsupported platform: ${platform}`);
38
+ }
39
+ const fullPath = path.join(os.homedir(), '.cache', 'puppeteer', 'chrome', chromePath);
40
+ if (!fs.existsSync(fullPath)) {
41
+ throw new Error(`Chrome executable not found at: ${fullPath}`);
42
+ }
43
+ return fullPath;
44
+ }
45
+ async createBrowser() {
46
+ try {
47
+ const executablePath = this.getChromeExecutablePath();
48
+ return await puppeteer.launch({
49
+ headless: true,
50
+ executablePath,
51
+ args: [
52
+ '--no-sandbox',
53
+ '--disable-setuid-sandbox',
54
+ '--disable-dev-shm-usage',
55
+ '--disable-extensions',
56
+ '--disable-gpu',
57
+ '--disable-background-timer-throttling',
58
+ '--disable-backgrounding-occluded-windows',
59
+ '--disable-renderer-backgrounding',
60
+ '--disable-features=TranslateUI,VizDisplayCompositor',
61
+ '--run-all-compositor-stages-before-draw',
62
+ '--disable-ipc-flooding-protection',
63
+ '--memory-pressure-off'
64
+ ],
65
+ defaultViewport: {
66
+ width: 1200,
67
+ height: 1600,
68
+ deviceScaleFactor: 1
69
+ }
70
+ });
71
+ }
72
+ catch (error) {
73
+ // 回退到默认Chrome
74
+ console.warn('使用默认Chrome安装,性能可能受影响');
75
+ return await puppeteer.launch({
76
+ headless: true,
77
+ args: [
78
+ '--no-sandbox',
79
+ '--disable-setuid-sandbox',
80
+ '--disable-dev-shm-usage'
81
+ ]
82
+ });
83
+ }
84
+ }
85
+ async getBrowser() {
86
+ if (this.isShuttingDown) {
87
+ throw new Error('BrowserPool is shutting down');
88
+ }
89
+ // 查找空闲浏览器
90
+ const availableBrowser = this.browsers.find(browser => !this.busyBrowsers.has(browser) && browser.isConnected());
91
+ if (availableBrowser) {
92
+ this.busyBrowsers.add(availableBrowser);
93
+ return availableBrowser;
94
+ }
95
+ // 创建新浏览器(如果未达到最大数量)
96
+ if (this.browsers.length < this.maxBrowsers) {
97
+ const newBrowser = await this.createBrowser();
98
+ this.browsers.push(newBrowser);
99
+ this.busyBrowsers.add(newBrowser);
100
+ // 监听浏览器断开事件
101
+ newBrowser.on('disconnected', () => {
102
+ this.browsers = this.browsers.filter(b => b !== newBrowser);
103
+ this.busyBrowsers.delete(newBrowser);
104
+ });
105
+ return newBrowser;
106
+ }
107
+ // 等待浏览器可用
108
+ return new Promise((resolve, reject) => {
109
+ const checkInterval = setInterval(() => {
110
+ const available = this.browsers.find(browser => !this.busyBrowsers.has(browser) && browser.isConnected());
111
+ if (available) {
112
+ clearInterval(checkInterval);
113
+ this.busyBrowsers.add(available);
114
+ resolve(available);
115
+ }
116
+ }, 100);
117
+ // 超时处理
118
+ setTimeout(() => {
119
+ clearInterval(checkInterval);
120
+ reject(new Error('获取浏览器超时'));
121
+ }, 30000);
122
+ });
123
+ }
124
+ releaseBrowser(browser) {
125
+ this.busyBrowsers.delete(browser);
126
+ }
127
+ async cleanup() {
128
+ this.isShuttingDown = true;
129
+ const closePromises = this.browsers.map(async (browser) => {
130
+ try {
131
+ if (browser.isConnected()) {
132
+ await browser.close();
133
+ }
134
+ }
135
+ catch (error) {
136
+ console.error('关闭浏览器时出错:', error);
137
+ }
138
+ });
139
+ await Promise.all(closePromises);
140
+ this.browsers = [];
141
+ this.busyBrowsers.clear();
142
+ }
143
+ getStats() {
144
+ const connected = this.browsers.filter(b => b.isConnected());
145
+ return {
146
+ total: connected.length,
147
+ busy: this.busyBrowsers.size,
148
+ available: connected.length - this.busyBrowsers.size
149
+ };
150
+ }
151
+ }
152
+ //# sourceMappingURL=BrowserPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserPool.js","sourceRoot":"","sources":["../../src/core/BrowserPool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { CacheManager } from '../types/index.js';
2
+ /**
3
+ * 内存缓存管理器
4
+ * 用于缓存渲染结果,提升性能
5
+ */
6
+ export declare class MemoryCacheManager implements CacheManager {
7
+ private defaultTTL;
8
+ private cache;
9
+ private cleanupInterval;
10
+ constructor(defaultTTL?: number);
11
+ get<T>(key: string): Promise<T | null>;
12
+ set<T>(key: string, value: T, ttl?: number): Promise<void>;
13
+ delete(key: string): Promise<void>;
14
+ clear(): Promise<void>;
15
+ private cleanExpired;
16
+ private cleanup;
17
+ getStats(): {
18
+ size: number;
19
+ expired: number;
20
+ };
21
+ /**
22
+ * 生成缓存键
23
+ */
24
+ static generateKey(prefix: string, data: any): string;
25
+ }
26
+ //# sourceMappingURL=CacheManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheManager.d.ts","sourceRoot":"","sources":["../../src/core/CacheManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IAIzC,OAAO,CAAC,UAAU;IAH9B,OAAO,CAAC,KAAK,CAAqD;IAClE,OAAO,CAAC,eAAe,CAAiB;gBAEpB,UAAU,GAAE,MAAe;IAQzC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAetC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,OAAO;IAOf,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAgB7C;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM;CAKtD"}
@@ -0,0 +1,74 @@
1
+ import crypto from 'crypto';
2
+ /**
3
+ * 内存缓存管理器
4
+ * 用于缓存渲染结果,提升性能
5
+ */
6
+ export class MemoryCacheManager {
7
+ defaultTTL;
8
+ cache = new Map();
9
+ cleanupInterval;
10
+ constructor(defaultTTL = 300000) {
11
+ this.defaultTTL = defaultTTL;
12
+ // 每分钟清理过期缓存
13
+ this.cleanupInterval = setInterval(() => this.cleanExpired(), 60000);
14
+ // 进程退出时清理
15
+ process.on('exit', () => this.cleanup());
16
+ }
17
+ async get(key) {
18
+ const item = this.cache.get(key);
19
+ if (!item) {
20
+ return null;
21
+ }
22
+ if (Date.now() > item.expiry) {
23
+ this.cache.delete(key);
24
+ return null;
25
+ }
26
+ return item.value;
27
+ }
28
+ async set(key, value, ttl) {
29
+ const expiry = Date.now() + (ttl || this.defaultTTL);
30
+ this.cache.set(key, { value, expiry });
31
+ }
32
+ async delete(key) {
33
+ this.cache.delete(key);
34
+ }
35
+ async clear() {
36
+ this.cache.clear();
37
+ }
38
+ cleanExpired() {
39
+ const now = Date.now();
40
+ for (const [key, item] of this.cache.entries()) {
41
+ if (now > item.expiry) {
42
+ this.cache.delete(key);
43
+ }
44
+ }
45
+ }
46
+ cleanup() {
47
+ if (this.cleanupInterval) {
48
+ clearInterval(this.cleanupInterval);
49
+ }
50
+ this.cache.clear();
51
+ }
52
+ getStats() {
53
+ const now = Date.now();
54
+ let expired = 0;
55
+ for (const item of this.cache.values()) {
56
+ if (now > item.expiry) {
57
+ expired++;
58
+ }
59
+ }
60
+ return {
61
+ size: this.cache.size,
62
+ expired
63
+ };
64
+ }
65
+ /**
66
+ * 生成缓存键
67
+ */
68
+ static generateKey(prefix, data) {
69
+ const hash = crypto.createHash('sha256');
70
+ hash.update(JSON.stringify(data));
71
+ return `${prefix}:${hash.digest('hex')}`;
72
+ }
73
+ }
74
+ //# sourceMappingURL=CacheManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheManager.js","sourceRoot":"","sources":["../../src/core/CacheManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { ConversionOptions } from '../types/index.js';
2
+ /**
3
+ * 增强版转换引擎
4
+ * 支持批量处理、并行转换、缓存优化
5
+ */
6
+ export declare class EnhancedConverter {
7
+ private browserPool;
8
+ private templateManager;
9
+ private markdownRenderer;
10
+ private pdfGenerator;
11
+ private cacheManager;
12
+ private concurrencyLimit;
13
+ constructor(options?: {
14
+ maxBrowsers?: number;
15
+ maxConcurrent?: number;
16
+ templateDir?: string;
17
+ cacheEnabled?: boolean;
18
+ });
19
+ /**
20
+ * 单文件转换
21
+ */
22
+ convertSingle(markdown: string, outputPath: string, options?: ConversionOptions): Promise<string>;
23
+ /**
24
+ * 批量转换
25
+ */
26
+ convertBatch(inputs: Array<{
27
+ markdown: string;
28
+ outputPath: string;
29
+ options?: ConversionOptions;
30
+ }>, globalProgress?: (overall: {
31
+ completed: number;
32
+ total: number;
33
+ current?: string;
34
+ errors: Error[];
35
+ }) => void): Promise<string[]>;
36
+ /**
37
+ * 从文件转换
38
+ */
39
+ convertFromFile(markdownPath: string, outputPath?: string, options?: ConversionOptions): Promise<string>;
40
+ /**
41
+ * 流式转换(适合大文件)
42
+ */
43
+ convertStream(markdownStream: NodeJS.ReadableStream, outputPath: string, options?: ConversionOptions): Promise<string>;
44
+ /**
45
+ * 获取系统状态
46
+ */
47
+ getStats(): {
48
+ browserPool: {
49
+ total: number;
50
+ busy: number;
51
+ available: number;
52
+ };
53
+ cache?: {
54
+ size: number;
55
+ expired: number;
56
+ };
57
+ system: {
58
+ memory: {
59
+ used: number;
60
+ total: number;
61
+ };
62
+ cpu: number;
63
+ };
64
+ };
65
+ /**
66
+ * 清理资源
67
+ */
68
+ cleanup(): Promise<void>;
69
+ /**
70
+ * 获取可用模板
71
+ */
72
+ getAvailableTemplates(): string[];
73
+ /**
74
+ * 获取模板详情
75
+ */
76
+ getTemplateInfo(name: string): Promise<import("../types/index.js").Template | null>;
77
+ }
78
+ //# sourceMappingURL=EnhancedConverter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnhancedConverter.d.ts","sourceRoot":"","sources":["../../src/core/EnhancedConverter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAsB,MAAM,mBAAmB,CAAC;AAS1E;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,gBAAgB,CAA2C;gBAEvD,OAAO,GAAE;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,OAAO,CAAC;KACnB;IAqBN;;OAEG;IACG,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC;IAsElB;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,KAAK,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,iBAAiB,CAAC;KAC7B,CAAC,EACF,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE;QACzB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,KAAK,EAAE,CAAC;KACjB,KAAK,IAAI,GACT,OAAO,CAAC,MAAM,EAAE,CAAC;IAuEpB;;OAEG;IACG,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC;IAUlB;;OAEG;IACG,aAAa,CACjB,cAAc,EAAE,MAAM,CAAC,cAAc,EACrC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC;IAqBlB;;OAEG;IACH,QAAQ,IAAI;QACV,WAAW,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QAChE,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,MAAM,EAAE;YACN,MAAM,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,CAAC;YACxC,GAAG,EAAE,MAAM,CAAC;SACb,CAAC;KACH;IAgBD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9B;;OAEG;IACH,qBAAqB,IAAI,MAAM,EAAE;IAIjC;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM;CAGnC"}