import {Marked} from 'marked'; import hljs from 'highlight.js'; import markedFootnote from 'marked-footnote' import markedCodeFormat from 'marked-code-format' import { markedEmoji } from 'marked-emoji'; postMessage({ type: 'init', data: 'Hello World!' }) // 默认编辑器配置 const defaoltMarkOption = { async: true, // 同步编译 pedantic: false, gfm: true, silent: true, // 输出错误 breaks: false, // 将回车编程
} // 自定义行号注入函数 const injectLineNumbers = (highlightedCode) => { const lines = highlightedCode.split('\n') // 移除最后一行空行(常见于代码块末尾的换行) if (lines[lines.length - 1] === '') lines.pop() // 为每行添加行号容器 return lines.map((line, index) => `
${index + 1}${line}
`).join('') } // 编辑器render配置 const editorRenderOption = { space: (...args) => { console.log(args, 'space') return `
space
` }, code: (...args) => { console.log(args, 'code') return `
xscode
` }, blockquote: (...args) => { console.log(args, 'blockquote') return `
blockquote
` }, html: (...args) => { console.log(args, 'html') return `
html
` }, heading: (...args) => { console.log(args[0], 'heading') return `${args[0].raw}` }, hr: (...args) => { console.log(args, 'hr') return `
hr
` }, list: (...args) => { console.log(args, 'list') return `
list
` }, listitem: (...args) => { console.log(args, 'listitem') return `
listitem
` }, checkbox: (...args) => { console.log(args, 'checkbox') return `
checkbox
` }, paragraph: (...args) => { console.log(args, 'paragraph') return `
${args[0].raw}
` }, table: (...args) => { console.log(args, 'table') return `
table
` }, tablerow: (...args) => { console.log(args, 'tablerow') return `
tablerow
` }, tablecell: (...args) => { console.log(args, 'tablecell') return `
tablecell
` }, strong: (...args) => { console.log(args, 'strong') return `
strong
` }, em: (...args) => { console.log(args, 'em') return `
em
` }, codespan: (...args) => { console.log(args, 'codespan') return `
codespan
` }, br: (...args) => { console.log(args, 'br') return `
br
` }, del: (...args) => { console.log(args, 'del') return `
del
` }, link: (...args) => { console.log(args, 'link') return `
link
` }, image: (...args) => { console.log(args, 'image') return `
image
` }, text: (...args) => { console.log(args, 'text') return `
text
` }, } // 显示器render配置 const viewerRenderOption = { code: ({text, lang}) => { // console.log(text); const validLang = hljs.getLanguage(lang) ? lang : 'plaintext' const highlighted = hljs.highlight(text, {language: lang}).value // console.log(highlighted) const withLineNumbers = injectLineNumbers(highlighted) return `
${withLineNumbers}
`; } } // 编辑器Marked编译器 const editorMarked = new Marked({ ...defaoltMarkOption, renderer: editorRenderOption }); // 显示器Marked编译器 const viewerMarked = new Marked({ ...defaoltMarkOption, renderer: viewerRenderOption }); // 编辑器插件 editorMarked.use(markedCodeFormat()).use() // 显示器插件 // 自定义表情快速插入 const markedEmojiOptions = { emojis: { "heart": "❤️", "tada": "🎉" }, renderer: (token) => { console.log(token) return token.emoji } }; // 支持脚注[^1] 会影响原始文本 viewerMarked.use(markedFootnote()).use(markedCodeFormat()).use(markedEmoji(markedEmojiOptions)) addEventListener('message', async (e) => { console.log(e.data) switch (e.data.type) { case 'render': { // const editContent = await makeEditContent(e.data.content) const viewContent = await makeViewContent(e.data.content) postMessage({ type: 'render', content: { viewContent, // editContent, }, }) break; } } }) // 函数 // 使用编译 async function makeEditContent(contents){ // 去除html innerText两端的空格,将 转化为空格 let content = contents.trim().replace(/  /g, ' '); // 过滤不能识别,难识别的字符,空字符 content = content.replace(/^[\u200B\u200C\u200D\u200E\u200F\uFEFF]/,""); // 编译 content = await editorMarked.parse(content) return content } async function makeViewContent(contents){ // 过滤不能识别,难识别的字符,空字符 let content = contents.replace(/^[\u200B\u200C\u200D\u200E\u200F\uFEFF]/,""); // 编译 content = await viewerMarked.parse(content) return content }