2026-10-13
') } ``` ## 代码块(可选语言 + 语法高亮) 工具栏「代码块」按钮点开就是一个**语言面板**(20 种内置语言,支持按名称或别名搜索,如 `js` / `mysql` / `yml`): - 选好语言后插入代码块,光标直接落在块内,可以**边写边高亮** - 光标已在某个代码块里时,同一个面板变成「代码块语言」,选一项即**改写当前块的语言**并重新着色 - 语言写入 `data-k-lang`(编辑器识别)与 `class="language-x"`(通用约定),块右上角显示语言角标,`plaintext` 不显示 - **高亮只是编辑/预览时的显示效果**:`getHTML()`、源码模式、复制出去的内容都是**不带 `` 的干净代码**,再次导入会自动重新高亮 ```js KEditor.create('#editor', { code: { languages: ['js', 'python', 'go', 'sql'], // 只留几种(主名或别名都认);不写 = 全部 20 种 defaultLanguage: 'python', // 新建代码块默认语言(不在清单内会落到第一项) highlight: true, // false = 只保留纯文本,语言标记照写 }, }) // 运行时 editor.codeLanguages() // [{ value:'javascript', label:'JavaScript', hint:'前端与 Node 脚本' }, …] editor.insertCode('const a = 1', 'js') // 插入代码块(语言可省,用 defaultLanguage) editor.setCodeLanguage('sql') // 改写光标所在块的语言(返回生效语言;不在块内返回 null) editor.getCodeLanguage() // 光标所在块的语言,不在块内返回 '' editor.getState().inCode // 光标是否在代码块内(工具栏按钮据此高亮) editor.highlightCode() // 手动重跑全量高亮,返回处理的块数 KEditor.highlightCode(code, 'python') // 纯函数:把源码转成带 token 的 HTML 片段(已转义) KEditor.listLanguages() // 语言清单;normalizeLang('MySQL') === 'sql' ``` | 内置语言 | | | --- | --- | | `plaintext` `javascript` `typescript` `html` `css` `json` `python` `java` `go` `rust` | `c` `csharp` `php` `ruby` `sql` `bash` `yaml` `ini` `markdown` `diff` | 别名同样可用:`js`/`ts`/`py`/`golang`/`yml`/`sh`/`md`/`c++`/`cs`/`mysql`/`postgres`/`toml`/`patch` … > 高亮器是内置的极简 tokenizer(零依赖,约 13 KB gzip),正则规则带长度保护:**单块超过 60 KB 的代码按纯文本处理**,避免长文档卡顿。样式沿用 One Dark 配色,作用域限定在 `.ke-content` 内,不会影响宿主页面。 ## 导入 Markdown(.md / 粘贴文本 → 可编辑 HTML) 工具栏尾栏的 **导入MD** 按钮打开导入面板:选文件、拖文件,或直接粘文本,**实时预览**转换结果与结构统计,再选落点导入。把 `.md` / `.markdown` / `.txt` 文件**拖进正文**也能直接转换。 ```js KEditor.create('#editor', { markdown: { insertMode: 'replace', // 默认落点:replace 替换全文 / append 追加文末 / cursor 插入光标 maxSize: 5 * 1024 * 1024, // 单文件上限(字节),0 = 不限制 gfm: true, // 表格 / 删除线 / 任务列表 / 裸链接 breaks: false, // true = 段落内单换行也当硬换行 linkTarget: false, // true 或 '_blank' = 外链自动加 target + rel="noopener noreferrer" frontMatter: true, // 丢弃开头的 YAML front matter }, }) // 运行时(source 支持 文本 / File / { name, content }) await editor.importMarkdown(mdText) // 按 options.markdown.insertMode 落点 await editor.importMarkdown(file, { mode: 'append' }) // 临时指定落点 await editor.setMarkdown(mdText) // 替换全文 await editor.insertMarkdown(mdText) // 插入光标处 await editor.appendMarkdown(mdText) // 追加到文末 editor.markdownOptions() // { insertMode:'replace', maxSize:5242880, auto:true } // 纯函数(不依赖实例,Node 端也能用) KEditor.markdownToHtml('# 标题\n\n正文', { gfm: true }) KEditor.markdownSummary(html) // { headings, paragraphs, lists, items, codeBlocks, quotes, tables, images, links } KEditor.isMarkdownFile({ name: 'a.md', type: '' }) // 按 MIME + 扩展名判断 KEditor.normalizeInsertMode('append') // 非法值回落 'replace' KEditor.MARKDOWN_ACCEPT // 用 ``` 导入返回值 `{ ok, html, summary, mode, chars, name }`;只读模式返回 `{ ok: false, reason: 'readonly' }`,超限或读文件失败返回 `{ ok: false, reason: 'error' }`。导入成功后会触发 `markdownimport` 事件(`editor.on('markdownimport', fn)`)。 > 手边没文件?demo 里带了一份示例:`demo/assets/sample.md`(含标题 / 表格 / 任务列表 / 多语言代码块),拖进 demo 的正文就能看到完整效果。 | 支持 | 说明 | | --- | --- | | 标题 | `#` ~ `######` 与 setext(`===` / `---`) | | 列表 | 有序 / 无序 / 嵌套 / 松散段落 / 任务列表(`- [x]` → ☑) | | 表格 | GFM 表格,列对齐写入 `style="text-align:…"` | | 代码块 | 围栅与缩进,**语言保留并高亮**(`data-k-lang` + `class="language-x"`),未知语言退化纯文本 | | 行内 | 粗体 / 斜体 / 删除线 / 行内代码 / 转义 / 硬换行 / 引用式与自动链接 / 图片 | | 其他 | 引用(含嵌套与懒续行)、分隔线、YAML front matter 丢弃、内联 HTML 与 HTML 块 | > 转换产物就是编辑器正文规范里的普通 HTML(`` `` `
` `
` `
` `
` …),默认再过一遍白名单净化:`