lezer-markdown源码阅读。

主要代码在src\markdown.ts处。

导出一个Type,是enum类型,元素为Markdown中号牌的编号。

导出一个parser,为MarkdownParser的实例,包含默认的配置

  • 从NodeTypes创建NodeSet,并辅之以highlight tags
  • DefaultBlockParsers
    • 包含针对block的解析器
      • IndentedCode
      • FencedCode
      • Blockquote
      • HorizontalRule
      • BulletList
      • OrderedList
      • ATXHeading
      • HTMLBlock
      • LinkReference: null
      • SetexHeading: null
  • DefaultLeafBlocks中定义了:
    • LinkReference
    • SetexHeading
  • blocknames来自于DefaultBlockParsers的keys
  • DefaultEndLeaf
    • isAtxHeading
    • isFencedCode
    • isBlockquote
    • isBulletList
    • isOrderedList
    • isHorizontalRule
    • isHTMLBlock
  • DefaultSkipMarkup
  • DefaultInline
    • Escape
    • Entity
    • InlineCode
    • HTMLTag
    • Emphasis
    • HardBreak
    • Link
    • Image
    • LinkEnd
  • 取DefaultInline的keys作为值

解析器的功能主要在类型MarkdownParser中实现。 它实现了lezer.Parser,最主要的方法是createParse:

  • 创建了一个BlockContext现例(实现了PartialParse)
  • 在此基础上增加this.wrappers
  • 返回此PartialParse值

MarkdownParser的其他方法

  • configure可以用于配置MarkdownExtension
  • parseInline,解析随行内容

BlockContext实现了PartialParse:

  • 含有到MarkdownParser的引用
  • PartialParse的属方
    • parsedPos返回absoluteLineStart
    • advance()
      • 如果碰到stoppedAt就finish

如何使用mocha测试

首先安装VSCode扩展Mocha Test Explorer

typescript需要额外配置,否则会显示:Unknown file extension ".ts"

根据https://github.com/hbenl/vscode-mocha-test-adapter/issues/206做如下配置:

{
    "mochaExplorer.files": "test/test-*.ts",
    "mochaExplorer.require": [
        "ts-node/register",
        // "esm"
    ],
    "mochaExplorer.nodeArgv": [
        "--loader=ts-node/esm",
        "--no-warnings=ExperimentalWarning",
        "--experimental-specifier-resolution=node"
      ]
}

可能会提示spec.ts中有类型错误,使用// @ts-ignore即可。