VSCode扩展编写总结(三)目录解析

扩展有一个很重要的功能,就是在将当前文档目录以树的形式显示。那么如何将SUMMARY.md中的目录信息提取出来呢?

首先要分析一下SUMMARY.md中跟目录大纲组成:

  1. ,##,###等不同级别的标题(header)

  2. *,列表前置的空格或者制表符控制层级缩进
  3. 标题可能包含列表,列表也可能包含列表,它们之间的层级关系也要在目录中体现
  4. 列表元素包含了页面跳转信息,列表的项目都会包含一个跳转uri,用正则表达式来表示,应当为 [\s\t]*\* [.+](.+)的形式

为了保存目录项目之间的包含关系,在将SUMMARY.md的内容逐行进行解析时,需要将当前元素的上级元素记录下来,在处理当前行时,需要查看前一次记录下来的元素。根据两者的类型和层级,可能出现以下几种情况:

  1. 前一个元素是header,当前行是list,则list添加到header的子元素中
  2. 前一个元素是header,当前元素是header,此时需要比较两个header的层级,又会有三种结果:
    • 前一个header级别更高(#字符的数量更少),则后一个header应当作为前一个header的子元素
    • 两者级别相同,则当前header应当添加到前一个header的父节点上
    • 后一个节点级别更高,这时需要回溯前一个元素,找到其父元素为header,且级别不低于当前元素的元素,进行添加判断
  3. 前一个元素是list,当前元素是header。这种情况跟2类似,需要先进行回溯,然后仿照2的操作处理
  4. 前一个元素是list,后一个元素是list。同样,也需要对比两者的层级,注意:由于list元素的层级关系是通过前置的空白字符(制表符或者空格)进行区分的。两个list也仿照2中的步骤进行层级对比,然后决定新列表插入到何处

具体代码参见github。https://github.com/hoyt-tian/vscode-gitbook-kit

Show Comments

Get the latest posts delivered right to your inbox.