This commit is contained in:
熊潇 2025-04-07 16:27:39 +08:00
parent 346be9e235
commit aed46f2adc
2 changed files with 43 additions and 7 deletions

View File

@ -46,7 +46,7 @@ export class TextEditor {
} }
this.opts = opts; this.opts = opts;
this.element = el; this.element = el;
const html = opts?.html || ''; const html = opts?.markdown || opts?.html || '';
const items = opts?.items || getSuggestionItems(); const items = opts?.items || getSuggestionItems();
const placeholder = opts?.placeholder || 'Type @ to see commands (e.g., @today, @list @test )...'; const placeholder = opts?.placeholder || 'Type @ to see commands (e.g., @today, @list @test )...';
const suggestionConfig = createSuggestionConfig(items); const suggestionConfig = createSuggestionConfig(items);
@ -54,7 +54,9 @@ export class TextEditor {
this.editor = new Editor({ this.editor = new Editor({
element: el, // 指定编辑器容器 element: el, // 指定编辑器容器
extensions: [ extensions: [
StarterKit.configure({}), // 使用 StarterKit 包含基础功能 StarterKit.configure({
codeBlock: false,
}), // 使用 StarterKit 包含基础功能
Highlight, Highlight,
Placeholder.configure({ Placeholder.configure({
placeholder, placeholder,
@ -62,7 +64,6 @@ export class TextEditor {
Typography, Typography,
Markdown, Markdown,
CodeBlockLowlight.extend({ CodeBlockLowlight.extend({
name: 'ai-code-block',
addKeyboardShortcuts() { addKeyboardShortcuts() {
return { return {
Tab: () => { Tab: () => {

View File

@ -1,10 +1,45 @@
import { marked } from 'marked'; import { Marked } from 'marked';
import TurndownService from 'turndown'; import TurndownService from 'turndown';
import hljs from 'highlight.js';
import { markedHighlight } from 'marked-highlight';
// import { marked } from 'marked';
const markedAndHighlight = new Marked(
markedHighlight({
emptyLangClass: 'hljs',
langPrefix: 'hljs language-',
highlight(code, lang, info) {
const language = hljs.getLanguage(lang) ? lang : 'plaintext';
return hljs.highlight(code, { language }).value;
},
}),
);
export const md2html = async (md: string) => { export const md2html = async (md: string) => {
return marked.parse(md); const html = markedAndHighlight.parse(md);
return html;
}; };
export const html2md = async (html: string, opts?: TurndownService.Options) => { export const html2md = async (html: string, opts?: TurndownService.Options) => {
const turndownService = new TurndownService(opts); const turndownService = new TurndownService({ ...opts });
return turndownService.turndown(html); // 添加代码块规则,保留语言标记
turndownService.addRule('codeBlocks', {
filter: function (node) {
return node.nodeName === 'PRE' && node.firstChild?.nodeName === 'CODE';
},
replacement: function (content, node) {
const code = node.firstChild as HTMLElement;
// 从类名中提取语言 (hljs language-xxx)
const className = code.className || '';
const language = className.match(/language-(\w+)/)?.[1] || '';
// 确保内容首尾没有多余空行
const trimmedContent = content.trim();
return `\n\n\`\`\`${language}\n${trimmedContent}\n\`\`\`\n\n`;
},
});
const md = turndownService.turndown(html);
return md;
}; };