promptmanager / src /utils /exportUtils.ts
samlax12's picture
Upload 55 files
e85fa50 verified
import { PromptGroup, Prompt, DslFile } from '../types';
import JSZip from 'jszip';
import { saveAs } from 'file-saver';
// 将提示词转换为 Markdown 格式
const formatPromptToMarkdown = (prompt: Prompt): string => {
return `# ${prompt.title}
${prompt.content}
## 标签
${prompt.tags.map(tag => `- ${tag}`).join('\n')}
## 元数据
- 创建时间: ${new Date(prompt.createdAt).toLocaleString()}
- 更新时间: ${new Date(prompt.updatedAt).toLocaleString()}
`;
};
// 导出提示词组为 ZIP
export const exportPromptGroupToZip = async (group: PromptGroup) => {
const zip = new JSZip();
// 创建提示词文件夹
const promptsFolder = zip.folder('prompts');
if (!promptsFolder) throw new Error('创建提示词文件夹失败');
// 添加提示词为 Markdown 文件
group.prompts.forEach(prompt => {
const content = formatPromptToMarkdown(prompt);
promptsFolder.file(`${prompt.title.replace(/[\\/:*?"<>|]/g, '_')}.md`, content);
});
// 创建 DSL 文件文件夹
const dslFolder = zip.folder('dsl_files');
if (!dslFolder) throw new Error('创建 DSL 文件夹失败');
// 添加 DSL 文件 - 直接使用文本内容
group.dslFiles.forEach(file => {
try {
dslFolder.file(file.name, file.content);
} catch (error) {
console.error(`处理文件 ${file.name} 时出错:`, error);
}
});
// 添加元数据文件
const metadata = JSON.stringify({
name: group.name,
description: group.description,
category: typeof group.category === 'object' ? group.category.name : group.category,
createdAt: group.createdAt,
updatedAt: group.updatedAt,
promptCount: group.prompts.length,
dslFileCount: group.dslFiles.length
}, null, 2);
zip.file('metadata.json', metadata);
// 创建并下载 ZIP 文件
const zipBlob = await zip.generateAsync({ type: 'blob' });
const fileName = `${group.name.replace(/[\\/:*?"<>|]/g, '_')}_${new Date().toISOString().split('T')[0]}.zip`;
saveAs(zipBlob, fileName);
};
// 导出单个提示词为 Markdown
export const exportPrompt = (prompt: Prompt) => {
const content = formatPromptToMarkdown(prompt);
const blob = new Blob([content], { type: 'text/markdown;charset=utf-8' });
saveAs(blob, `${prompt.title.replace(/[\\/:*?"<>|]/g, '_')}.md`);
};
// 导出多个提示词为 ZIP
export const exportMultiplePrompts = async (prompts: Prompt[]) => {
const zip = new JSZip();
prompts.forEach(prompt => {
const content = formatPromptToMarkdown(prompt);
zip.file(`${prompt.title.replace(/[\\/:*?"<>|]/g, '_')}.md`, content);
});
const zipBlob = await zip.generateAsync({ type: 'blob' });
saveAs(zipBlob, `prompts_${new Date().toISOString().split('T')[0]}.zip`);
};
// 导出单个 DSL 文件
export const exportDslFile = (file: DslFile) => {
const blob = new Blob([file.content], { type: 'text/yaml;charset=utf-8' });
saveAs(blob, file.name);
};
// 导出多个 DSL 文件为 ZIP
export const exportMultipleDslFiles = async (files: DslFile[]) => {
const zip = new JSZip();
files.forEach(file => {
zip.file(file.name, file.content);
});
const zipBlob = await zip.generateAsync({ type: 'blob' });
saveAs(zipBlob, `dsl_files_${new Date().toISOString().split('T')[0]}.zip`);
};
// eslint-disable-next-line
export default {
exportPrompt,
exportMultiplePrompts,
exportPromptGroupToZip,
exportDslFile,
exportMultipleDslFiles
};