# bananamark-codemirror 中文文档

规范地址：https://npmcn.com/package/bananamark-codemirror/

版本：0\.2\.1
npm 元数据更新时间：2026-11-03T02:39:28.931Z
中文译文更新时间：2026-11-03T05:27:46.143Z
软件包许可：MIT

本文由上游 README 机器翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/bananamark-codemirror
原文对照：https://npmcn.com/package/bananamark-codemirror/?lang=original
项目主页：https://github.com/banana-space/banana/tree/main/packages/bananamark-codemirror#readme
源码仓库：https://github.com/banana-space/banana

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：78.2 kB，13 个文件
- 模块格式：ES Module
- TypeScript 类型：未声明
- Node.js 要求：\>=22
- 运行依赖：0 个
- peer 依赖：bananamark ~0\.2\.0，@codemirror/lint ^6\.9\.7，@codemirror/view ^6\.43\.14，@codemirror/state ^6\.7\.6，@codemirror/language ^6\.13\.1，@codemirror/autocomplete ^6\.20\.3，@codemirror/lang-markdown ^6\.5\.2
- 首次发布：2026-10-28T03:02:57.599Z
- 最新版本发布：2026-11-03T02:39:28.786Z
- 已发布版本数：4（近 12 个月 4 个）

## 中文简介

CodeMirror 6语言支持bananmark Markdown方言：高亮，折叠，补全和检查

## 安装

```sh
npm install bananamark-codemirror
```

也可以使用：`pnpm add bananamark-codemirror`、`yarn add bananamark-codemirror`、`bun add bananamark-codemirror`

## README

# bananamark-codemirror

CodeMirror 6语言支持 [bananamark](https://github.com/banana-space/banana/tree/main/packages/bananamark#readme) 标记方言：高亮，折叠，键，补全和检查。语法是bananark自己的。`bananamark/grammar`)，其中公式和标签的结束来自bananark的扫描器(`bananamark/scan`)，检查运行bananark的方言层，因此编辑器读取页面就像渲染器一样。补全取方言的规则 `bananamark/rules` (数据)。它在浏览器中运行（带捆绑器）；检查也在Node中运行。

## 状态

版本0.2，发布于 `bananamark` (见其 [状态](https://github.com/banana-space/banana/tree/main/packages/bananamark#status))：在1.0之前，小版本可能会改变接口。同行依赖性: `bananamark` 相同的次要版本，和codemmirror的 `@codemirror/language`， `state`， `view`， `autocomplete`， `lint` 和 `lang-markdown` （每个包都有一个副本：CodeMirror不能使用两个副本）。仅限ES模块；麻省理工学院的执照。

```sh
npm install bananamark bananamark-codemirror codemirror
```

## 一个最小的例子

```js
import { EditorView, basicSetup } from 'codemirror';
import { bananamark } from 'bananamark-codemirror';
import { dialect } from './dialect.js';   // the site's, from bananamark's defineDialect

new EditorView({
  parent: document.querySelector('#editor'),
  extensions: [
    basicSetup,
    bananamark({ dialect, completion: { entries: async () => (await fetch('/names.json')).json() } }),
  ],
});
```

给编辑器提供渲染器的方言（bananark’s） [`defineDialect`](https://github.com/banana-space/banana/blob/main/packages/bananamark/REFERENCE.md#the-dialect))：它的语法、环境、数据块、标签、消息和开关（维基链接、书目、TikZ）都是渲染器的。高亮显示显示类(`bm-hl-…`（与bananark的代码块相同），所以一个样式表(`bananamark/style.css`)用于编辑器和页面中的代码块。

## 一切同时进行

`bananamark(options)` 返回一个扩展数组：语言、高亮显示、键、公式编辑、补全和检查，按照它们需要的顺序和优先级。

| 选项 | 意义 | 默认的 |
| --- | --- | --- |
| `dialect` | bananamark的 `defineDialect` | bananamark的违约 |
| `codeLanguages`， `wikiLinks` | 没有方言：更多的隔离代码语言（codemmirror） `Language`S，通过名字)和是否 `[[wiki links]]` 读作 `bananamarkLanguage` 把他们(`wikiLinks` 用于完成和检查) | 没有一个; `false` |
| `locale` | 补全选项旁边的单词和错误的语言： `'en'`， `'zh-cn'`或者是方言信息中的一个 | `'en'` |
| `completion` | `completionSources`'选项(`entries`， `languages`， `otherLabels`， `mathCommands`…), `sources` （调用者的更多完成源）和 `afterComposition(state)` （输入法提交后补全是否打开）；或 `false` | `{}` |
| `lint` | `checkFile`的选择和 `delay` (女士);或 `false` | `{}` |
| `highlight` | 这个 `bm-hl-…` 类(`syntaxHighlighting(highlightClasses)`） | `true` |
| `keymap` | `bananamarkKeymap` | `true` |
| `formulaEditing` | `\[` 和 `\(` 在键入时关闭(`pairFormulaDelimiters`） | `true` |

完成被注册为语言数据(`EditorState.languageData`)，在每个位置，公式包括：CodeMirror's `autocompletion()` (在 `basicSetup`，或由 `bananamark`)与其他扩展的源代码一起使用它。输入法合成时不提供任何内容；当它提交时，补全将在输入名称的地方打开(`afterComposition`）。

每一件作品也会被导出，供编辑器自己把它们组合在一起（比如，有自己的编辑器）。

## 的语言

`bananamarkLanguage({ dialect })` 返回CodeMirror的 `LanguageSupport`：

-   香蕉的语法(`bananamark/grammar`)：标题（YAML），公式（突出显示为TeX）， wiki链接（当方言有它们时），参考文献，类定理环境的围栏，标记列表项，html样式的标签，图像” `{width=…}`，用语言（方言）突出显示的代码块 `codeLanguages` 其中)。没有方言的： `bananamarkLanguage({ codeLanguages, wikiLinks })` (CodeMirror `Language`年代;Wiki的链接默认是关闭的，就像bananark的一样)。
-   折页：除标题外，前物之间的折页 `---` 行)和类似定理的环境(从 `::: name` 在它之前 `:::`嵌套的数， `:::` 代码中没有)。
-   退格删除列表标记和引号。

`newlineAndIndent`：输入，将新行缩进到该行文本开始的位置（列表项的文本从其第一行开始；引号保持其位置） `>`)，无需添加列表标记；光标两侧的空格被删除，一行空格留空。首先，代码块和显示它返回的公式 `false` （codemmirror自己的Enter then）。

`bananamarkKeymap`在方言中按顺序输入和退格键： `closeDisplayFormula`， `newlineAndIndent`,然后 `deleteFormulaDelimiters` (下图)。

`highlightClasses`， `highlightTags`：高亮类，以及方言自身的高亮标签(来自 `bananamark/grammar`）。

## 编辑公式

-   `pairFormulaDelimiters(view, from, to, text)`:输入 `[` 或者 `(` 后 `\` 给这对(`\[|\]`）. 一个 `EditorView.inputHandler`，括号结束前(`Prec.high`）。
-   `deleteFormulaDelimiters(view)`空格之间的退格 `\[` 和 `\]` 删除两个。退格命令。
-   `closeDisplayFormula(view)`：只能在线保持输入 `\[` (其 `\]`（也许）给予 `\[`，空行和 `\]`，缩进相同。输入命令，在 `newlineAndIndent`.

## 完成

`completionSources(options)` 返回补全源(`bananamark()` 寄存器;或者把它们送给 `autocompletion({ override })`)，提供：

-   `:::` 在一行的开始和一个环境的名称：类似定理的环境，与他们的打开和关闭围栏（只有当页面的围栏已经平衡的行）；标题和标签的简写可以在名称(`:::th Title @label` 变成了 `::: theorem [Title] {@label}`）。
-   ` ``` ` 在一行的开头： `math`， `tikz` （还开着TikZ），来电者的数据块和 `bibliography` 块（带参考书目）。
-   后 `[[` 还有一个角色不是 `$` （带有wiki链接）：文章的标题和别名，以 `]]`.
-   `@`， `{@`：页面声明的标签(标题、环境、列表项、 `math` 块，并与参考书目，它的参考书目条目的键和版本的键，与条目的标题)，然后是书的其他页面的标签。
-   `\` 和公式中的字母：KaTeX的命令（加上所需的大括号）和环境(`\begin{…}`开头、空行和结尾；当它们已经配对时重命名)。
-   `<` 和字母：html样式的标签（开始和结束标签，光标文本的下一个位置）； `</` 关闭仍然打开的标签；在标签中，它的参数名称、语言代码和参数值。

选项，都是可选的；除了 `dialect`， `otherLabels`， `locale`， `messages` 而开关，每个都是一个值或一个函数给它（一个承诺），第一次需要时被请求：

| 选项 | 意义 | 默认的 |
| --- | --- | --- |
| `dialect` | bananamark的 `defineDialect`：其环境，数据块，标签，消息和开关，在下面的选项 | 无 |
| `tikz`， `wikiLinks`， `bibliography` | 是否 ` ```tikz ` 和 ` ```bibliography ` 块和 `[[links]]` 提供 | 方言是，或者 `false` |
| `environments` | 类似定理的环境，如香蕉的（kind→） `{ name, … }`，或者 `false`)，围绕着香蕉的违约；名字 `locale` | bananamark的 |
| `dataBlocks` | 数据块，如bananark的数据块（只使用它们的名称），或名称数组 | 无 |
| `tags` | 调用者的html样式的标签，如bananark的(no `render` 需要); `completion: { snippet, then, values }` 说明如何完成(`${}`：光标所在位置； `then`：插入后再次打开列表； `values`（裸参数的值），否则从其参数中计算出来 | 无 |
| `entries` | 文章: `[{ title, aliases }]` | 无（无文章） |
| `languages` | 语言代码→名称，对于接受语言的参数(`<lang …>` 诸如此类) | 无 |
| `mathCommands` | `{ commands: [[name, arguments, glyph?]], environments: [[name, arguments]] }` | 包的 `katex-commands.json` |
| `otherLabels()` | 书中其他书页的标签： `[{ name, text, page }]` （`text`：参考文献如何显示它； `page`：页面名称；bananamark的 `book.labels()` 给它们，页的键为 `page`） | 无 |
| `locale` | 选项旁边单词的语言： `'en'`， `'zh-cn'`，或一分之一 `messages` | `'en'` |
| `messages` | 选项旁边的词，按语言如香蕉的(`{ en: { key: text } }`）; 键 `completion_<block>`， `completion_tag_<tag>`， `completion_parameter_<parameter>`， `completion_<tag>_<value>`;来电者的标签和数据块在这里有他们的文字 | 包裹是英文和中文的 |

`afterComposition(state)`：输入法提交文本后是否打开补全(在 `[[link]]`的目标);开始吧 `compositionend`． 在编写文本时，补全不提供任何功能。

`katex-commands.json` (也 `import`可以作为 `bananamark-codemirror/katex-commands.json`)是由KaTeX自己的定义生成的：KaTeX呈现的命令，除了那些定义宏、链接和HTML的命令，以及公式不能在方言中使用的环境(`align`), `tikzcd` 和 `tikzpicture`，由TeX编译。遵循KaTeX版本 `bananamark` 取决于。

## 正在检查

-   `checkDocument(source, options)`：用bananark的方言层检查页面主体，给出它的问题， `[{ line, column, message, code, params }]` (从1; `column` 当已知; `code` 和 `params`错误的，如香蕉的 `BananamarkError` 他们)。层在第一个错误处停止，所以最多有一个错误。 `options` 是方言层的(`dialect`， `lang`， `locale`， `allowH1`， `lineOffset` 等等；另一个是错误)；使用KaTeX (`checkMath: false`:不是)。 `labels`：在书的一页上，书的其他页的标签(`[{ name, text, page }]`， `page` 页面的键；bananamark的 `book.labels()` 给出它们)：对它们的引用不是错误。链接是否存在，以及一本书的页码是否共享，都取决于整个网站，而不会被检查。页面中不是错误的东西（错误的选项、bug）被抛出，而不是作为问题报告。
-   `checkFile(text, options)`对整个文件都是一样的：在文件的开头(between . `---` 行)被跳过，并从文件的第一个行开始计数。在Node中也可以检查编辑器外的文件。
-   `problemRange(doc, line, column)`在编辑的文档中标记出问题的地方：从它的一栏中，一个字(a `[[link]]` 整)，或者没有列时的行。
-   `bananamarkLinter({ delay, ...options })`： codemmirror将整个文档作为文件(`checkFile`的选项; `delay` 以毫秒为单位，默认300)； `bananamark()` 它补充道。

## 助手

-   `declaredLabels(text, { bibliography })`：页面声明的标签，按顺序， `[{ name, text }]` (与 `bibliography: true`（它的书目条目也是键）。从每页的字里行间读起，当它被键入时（方言层在每页的第一个错误处停止）。
-   `fencesBalance(text)`：页面的环境栅栏是否平衡（外部代码块）。
-   `inFormula(state, pos)`：某个位置是否在公式中（还在输入的位置）。
-   `matchingEnd(state, from, to)`: `\end` 匹配一个 `\begin` 在 `[from, to)`， `{ from, to }`，或者 `null`.
-   `messages`包装上自己的话； `{ en, 'zh-cn' }`.

## 贡献

测试和再生 `katex-commands.json` KaTeX更新后：参见 [CONTRIBUTING.md](https://github.com/banana-space/banana/blob/main/packages/CONTRIBUTING.md).

## 常见问题

### bananamark-codemirror 是什么？

CodeMirror 6语言支持bananmark Markdown方言：高亮，折叠，补全和检查

### 如何安装 bananamark-codemirror？

在项目目录运行 npm install bananamark-codemirror，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：bananamark（~0\.2\.0）、@codemirror/lint（^6\.9\.7）、@codemirror/view（^6\.43\.14）、@codemirror/state（^6\.7\.6）、@codemirror/language（^6\.13\.1）、@codemirror/autocomplete（^6\.20\.3）、@codemirror/lang-markdown（^6\.5\.2）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### bananamark-codemirror 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/bananamark-codemirror 是否存在。

### bananamark-codemirror 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### bananamark-codemirror 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=22。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### bananamark-codemirror 可以商用吗？

bananamark-codemirror 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### bananamark-codemirror 还在维护吗？

最新版本 0\.2\.1 发布于 2026/11/03（今天）；至今共发布 4 个版本，其中过去 12 个月发布了 4 个；首次发布于 2026/10/28。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

