ast

package
v1.7.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 29, 2024 License: MulanPSL-2.0 Imports: 12 Imported by: 41

Documentation

Index

Constants

View Source
const (
	// WalkStop 意味着不需要继续遍历。
	WalkStop = iota
	// WalkSkipChildren 意味着不要遍历子节点。
	WalkSkipChildren
	// WalkContinue 意味着继续遍历。
	WalkContinue
)

Variables

View Source
var Testing bool

Testing 标识是否为测试环境。

Functions

func IsNodeIDPattern

func IsNodeIDPattern(str string) bool

func NewNodeID

func NewNodeID() string

func Walk

func Walk(n *Node, walker Walker)

Walk 使用深度优先算法遍历指定的树节点 n。

Types

type ListData

type ListData struct {
	Typ          int    `json:",omitempty"` // 0:无序列表,1:有序列表,3:任务列表
	Tight        bool   `json:",omitempty"` // 是否是紧凑模式
	BulletChar   byte   `json:",omitempty"` // 无序列表标识,* - 或者 +
	Start        int    `json:",omitempty"` // 有序列表起始序号
	Delimiter    byte   `json:",omitempty"` // 有序列表分隔符,. 或者 )
	Padding      int    `json:",omitempty"` // 列表内部缩进空格数(包含标识符长度,即规范中的 W+N)
	MarkerOffset int    `json:",omitempty"` // 标识符(* - + 或者 1 2 3)相对缩进空格数
	Checked      bool   `json:",omitempty"` // 任务列表项是否勾选
	Marker       []byte `json:",omitempty"` // 列表标识符
	Num          int    `json:",omitempty"` // 有序列表项修正过的序号
}

ListData 用于记录列表或列表项节点的附加信息。

type Node

type Node struct {
	ID   string `json:",omitempty"` // 节点的唯一标识
	Box  string `json:"-"`          // 容器
	Path string `json:"-"`          // 路径
	Spec string `json:",omitempty"` // 规范版本号

	Type       NodeType `json:"-"`              // 节点类型
	Parent     *Node    `json:"-"`              // 父节点
	Previous   *Node    `json:"-"`              // 前一个兄弟节点
	Next       *Node    `json:"-"`              // 后一个兄弟节点
	FirstChild *Node    `json:"-"`              // 第一个子节点
	LastChild  *Node    `json:"-"`              // 最后一个子节点
	Children   []*Node  `json:",omitempty"`     // 所有子节点
	Tokens     []byte   `json:"-"`              // 词法分析结果 Tokens,语法分析阶段会继续操作这些 Tokens
	TypeStr    string   `json:"Type"`           // 类型字符串
	Data       string   `json:"Data,omitempty"` // Tokens 字符串

	Close           bool `json:"-"` // 标识是否关闭
	LastLineBlank   bool `json:"-"` // 标识最后一行是否是空行
	LastLineChecked bool `json:"-"` // 标识最后一行是否检查过

	CodeMarkerLen int `json:",omitempty"` // ` 个数,1 或 2

	IsFencedCodeBlock  bool `json:",omitempty"`
	CodeBlockFenceChar byte `json:",omitempty"`

	CodeBlockFenceLen    int    `json:",omitempty"`
	CodeBlockFenceOffset int    `json:",omitempty"`
	CodeBlockOpenFence   []byte `json:",omitempty"`
	CodeBlockInfo        []byte `json:",omitempty"`
	CodeBlockCloseFence  []byte `json:",omitempty"`

	HtmlBlockType int `json:",omitempty"` // 规范中定义的 HTML 块类型(1-7)

	ListData *ListData `json:",omitempty"`

	TaskListItemChecked bool `json:",omitempty"` // 是否勾选

	TableAligns              []int `json:",omitempty"` // 从左到右每个表格节点的对齐方式,0:默认对齐,1:左对齐,2:居中对齐,3:右对齐
	TableCellAlign           int   `json:",omitempty"` // 表的单元格对齐方式
	TableCellContentWidth    int   `json:",omitempty"` // 表的单元格内容宽度(字节数)
	TableCellContentMaxWidth int   `json:",omitempty"` // 表的单元格内容最大宽度

	LinkType     int    `json:",omitempty"` // 链接类型,0:内联链接 [foo](/bar),1:链接引用定义 [foo]: /bar,2:自动链接,3:链接引用 [foo]
	LinkRefLabel []byte `json:",omitempty"` // 链接引用 label,[label] 或者 [text][label] 形式,[label] 情况下 text 和 label 相同

	HeadingLevel        int    `json:",omitempty"` // 1~6
	HeadingSetext       bool   `json:",omitempty"` // 是否为 Setext
	HeadingNormalizedID string `json:",omitempty"` // 规范化后的 ID

	MathBlockDollarOffset int `json:",omitempty"`

	FootnotesRefLabel []byte  `json:",omitempty"` // 脚注引用 label,[^label]
	FootnotesRefId    string  `json:",omitempty"` // 脚注 id
	FootnotesRefs     []*Node `json:",omitempty"` // 脚注引用

	HtmlEntityTokens []byte `json:",omitempty"` // 原始输入的实体 tokens,&

	KramdownIAL [][]string        `json:"-"`          // Kramdown 内联属性列表
	Properties  map[string]string `json:",omitempty"` // 属性

	TextMarkType                string `json:",omitempty"` // 文本标记类型
	TextMarkAHref               string `json:",omitempty"` // 文本标记超链接 data-href 属性
	TextMarkATitle              string `json:",omitempty"` // 文本标记超链接 data-title 属性
	TextMarkInlineMathContent   string `json:",omitempty"` // 文本标记内联数学公式内容 data-content 属性
	TextMarkInlineMemoContent   string `json:",omitempty"` // 文本标记内联备注内容 data-inline-memo-content 属性
	TextMarkBlockRefID          string `json:",omitempty"` // 文本标记块引用 ID data-id 属性
	TextMarkBlockRefSubtype     string `json:",omitempty"` // 文本标记块引用子类型(静态/动态锚文本) data-subtype 属性
	TextMarkFileAnnotationRefID string `json:",omitempty"` // 文本标记文件注解引用 ID data-id 属性
	TextMarkTextContent         string `json:",omitempty"` // 文本标记文本内容

	AttributeViewID   string `json:",omitempty"` // 属性视图 data-av-id 属性
	AttributeViewType string `json:",omitempty"` // 属性视图 data-av-type 属性

	CustomBlockFenceOffset int    `json:",omitempty"` // 自定义块标记符起始偏移量
	CustomBlockInfo        string `json:",omitempty"` // 自定义块信息
}

Node 描述了节点结构。

func (*Node) AcceptLines

func (n *Node) AcceptLines() bool

AcceptLines 判断是否节点是否可以接受更多的文本行。比如 HTML 块、代码块和段落是可以接受更多的文本行的。

func (*Node) AppendChild

func (n *Node) AppendChild(child *Node)

AppendChild 在 n 的子节点最后再添加一个子节点。

func (*Node) AppendTokens

func (n *Node) AppendTokens(tokens []byte)

AppendTokens 添加 Tokens 到结尾。

func (*Node) CanContain

func (n *Node) CanContain(nodeType NodeType) bool

CanContain 判断是否能够包含 NodeType 指定类型的节点。 比如列表节点(块级容器)只能包含列表项节点, 块引用节点(块级容器)可以包含任意节点;段落节点(叶子块节点)不能包含任何其他块级节点。

func (*Node) ChildByType

func (n *Node) ChildByType(childType NodeType) *Node

ChildByType 在 n 的子节点中查找 childType 指定类型的第一个子节点。

func (*Node) ChildrenByType

func (n *Node) ChildrenByType(childType NodeType) (ret []*Node)

ChildrenByType 返回 n 下所有类型为 childType 的子节点。

func (*Node) ClearIALAttrs

func (n *Node) ClearIALAttrs()

ClearIALAttrs 用于删除 name、alias、memo 和 bookmark 以及所有 custom- 前缀属性。

func (*Node) ContainTextMarkTypes added in v1.7.6

func (n *Node) ContainTextMarkTypes(types ...string) bool

func (*Node) Content

func (n *Node) Content() (ret string)

Content 返回 n 及其所有内容子节点的文本值,块级节点间通过换行符分隔。

func (*Node) DocChild

func (n *Node) DocChild() (ret *Node)

DocChild 返回 n 的父节点,该该父节点是 doc 的直接子节点。

func (*Node) EscapeMarkerContent added in v1.7.6

func (n *Node) EscapeMarkerContent() (ret string)

EscapeMarkerContent 返回 n 及其所有内容子节点的文本值(其中的标记符会被转义),块级节点间通过换行符分隔。

func (*Node) FirstDeepestChild

func (n *Node) FirstDeepestChild() (ret *Node)

FirstDeepestChild 返回 n 的第一个最深的子节点。

func (*Node) IALAttr

func (n *Node) IALAttr(name string) string

func (*Node) InsertAfter

func (n *Node) InsertAfter(sibling *Node)

InsertAfter 在当前节点后插入一个兄弟节点。

func (*Node) InsertBefore

func (n *Node) InsertBefore(sibling *Node)

InsertBefore 在当前节点前插入一个兄弟节点。

func (*Node) IsBlock

func (n *Node) IsBlock() bool

IsBlock 判断 n 是否为块级节点。

func (*Node) IsChildBlockOf

func (n *Node) IsChildBlockOf(parent *Node, depth int) bool

IsChildBlockOf 用于检查块级节点 n 的父节点是否是 parent 节点,depth 指定层级,0 为任意层级。 n 如果不是块级节点,则直接返回 false。

func (*Node) IsContainerBlock

func (n *Node) IsContainerBlock() bool

IsContainerBlock 判断 n 是否为容器块。

func (*Node) IsEmptyBlockIAL added in v1.7.5

func (n *Node) IsEmptyBlockIAL() bool

func (*Node) IsMarker

func (n *Node) IsMarker() bool

IsMarker 判断 n 是否为节点标记符。

func (*Node) IsSameTextMarkType added in v1.7.5

func (n *Node) IsSameTextMarkType(node *Node) bool

func (*Node) IsTextMarkType added in v1.7.5

func (n *Node) IsTextMarkType(typ string) bool

func (*Node) LastDeepestChild

func (n *Node) LastDeepestChild() (ret *Node)

LastDeepestChild 返回 n 的最后一个最深子节点。

func (*Node) List

func (n *Node) List() (ret []*Node)

List 将 n 及其所有子节点按深度优先遍历添加到结果列表 ret 中。

func (*Node) Marker added in v1.7.6

func (n *Node) Marker(entering bool) (ret string)

func (*Node) NextNodeText

func (n *Node) NextNodeText() string

func (*Node) ParentIs

func (n *Node) ParentIs(nodeType NodeType, nodeTypes ...NodeType) bool

ParentIs 判断 n 的类型是否在指定的 nodeTypes 类型列表内。

func (*Node) PrependChild

func (n *Node) PrependChild(child *Node)

PrependChild 在 n 的子节点最前添加一个子节点。

func (*Node) PrependTokens added in v1.7.5

func (n *Node) PrependTokens(tokens []byte)

PrependTokens 添加 Tokens 到开头。

func (*Node) PreviousNodeText

func (n *Node) PreviousNodeText() string

func (*Node) RemoveIALAttr

func (n *Node) RemoveIALAttr(name string)

func (*Node) SetIALAttr

func (n *Node) SetIALAttr(name, value string)

func (*Node) SortTextMarkDataTypes added in v1.7.5

func (n *Node) SortTextMarkDataTypes()

func (*Node) Stat added in v1.7.5

func (n *Node) Stat() (runeCnt, wordCnt, linkCnt, imgCnt, refCnt int)

func (*Node) Text

func (n *Node) Text() (ret string)

Text 返回 n 及其文本子节点的文本值。

func (*Node) TextLen

func (n *Node) TextLen() (ret int)

TextLen 返回 n 及其文本子节点的累计长度。

func (*Node) TokenLen

func (n *Node) TokenLen() (ret int)

TokenLen 返回 n 及其子节点 tokens 累计长度。

func (*Node) TokensStr

func (n *Node) TokensStr() string

TokensStr 返回 n 的 Tokens 字符串。

func (n *Node) Unlink()

Unlink 用于将节点从树上移除,后一个兄弟节点会接替该节点。

type NodeType

type NodeType int
const (
	NodeDocument                  NodeType = 0  // 根
	NodeParagraph                 NodeType = 1  // 段落
	NodeHeading                   NodeType = 2  // 标题
	NodeHeadingC8hMarker          NodeType = 3  // ATX 标题标记符 #
	NodeThematicBreak             NodeType = 4  // 分隔线
	NodeBlockquote                NodeType = 5  // 块引用
	NodeBlockquoteMarker          NodeType = 6  // 块引用标记符 >
	NodeList                      NodeType = 7  // 列表
	NodeListItem                  NodeType = 8  // 列表项
	NodeHTMLBlock                 NodeType = 9  // HTML 块
	NodeInlineHTML                NodeType = 10 // 内联 HTML
	NodeCodeBlock                 NodeType = 11 // 代码块
	NodeCodeBlockFenceOpenMarker  NodeType = 12 // 开始围栏代码块标记符 “`
	NodeCodeBlockFenceCloseMarker NodeType = 13 // 结束围栏代码块标记符 “`
	NodeCodeBlockFenceInfoMarker  NodeType = 14 // 围栏代码块信息标记符 info string
	NodeCodeBlockCode             NodeType = 15 // 围栏代码块代码
	NodeText                      NodeType = 16 // 文本
	NodeEmphasis                  NodeType = 17 // 强调
	NodeEmA6kOpenMarker           NodeType = 18 // 开始强调标记符 *
	NodeEmA6kCloseMarker          NodeType = 19 // 结束强调标记符 *
	NodeEmU8eOpenMarker           NodeType = 20 // 开始强调标记符 _
	NodeEmU8eCloseMarker          NodeType = 21 // 结束强调标记符 _
	NodeStrong                    NodeType = 22 // 加粗
	NodeStrongA6kOpenMarker       NodeType = 23 // 开始加粗标记符 **
	NodeStrongA6kCloseMarker      NodeType = 24 // 结束加粗标记符 **
	NodeStrongU8eOpenMarker       NodeType = 25 // 开始加粗标记符 __
	NodeStrongU8eCloseMarker      NodeType = 26 // 结束加粗标记符 __
	NodeCodeSpan                  NodeType = 27 // 代码
	NodeCodeSpanOpenMarker        NodeType = 28 // 开始代码标记符 `
	NodeCodeSpanContent           NodeType = 29 // 代码内容
	NodeCodeSpanCloseMarker       NodeType = 30 // 结束代码标记符 `
	NodeHardBreak                 NodeType = 31 // 硬换行
	NodeSoftBreak                 NodeType = 32 // 软换行
	NodeLink                      NodeType = 33 // 链接
	NodeImage                     NodeType = 34 // 图片
	NodeBang                      NodeType = 35 // !
	NodeOpenBracket               NodeType = 36 // [
	NodeCloseBracket              NodeType = 37 // ]
	NodeOpenParen                 NodeType = 38 // (
	NodeCloseParen                NodeType = 39 // )
	NodeLinkText                  NodeType = 40 // 链接文本
	NodeLinkDest                  NodeType = 41 // 链接地址
	NodeLinkTitle                 NodeType = 42 // 链接标题
	NodeLinkSpace                 NodeType = 43 // 链接地址和链接标题之间的空格
	NodeHTMLEntity                NodeType = 44 // HTML 实体
	NodeLinkRefDefBlock           NodeType = 45 // 链接引用定义块
	NodeLinkRefDef                NodeType = 46 // 链接引用定义 [label]:
	NodeLess                      NodeType = 47 // <
	NodeGreater                   NodeType = 48 // >

	NodeTaskListItemMarker        NodeType = 100 // 任务列表项标记符
	NodeStrikethrough             NodeType = 101 // 删除线
	NodeStrikethrough1OpenMarker  NodeType = 102 // 开始删除线标记符 ~
	NodeStrikethrough1CloseMarker NodeType = 103 // 结束删除线标记符 ~
	NodeStrikethrough2OpenMarker  NodeType = 104 // 开始删除线标记符 ~~
	NodeStrikethrough2CloseMarker NodeType = 105 // 结束删除线标记符 ~~
	NodeTable                     NodeType = 106 // 表
	NodeTableHead                 NodeType = 107 // 表头
	NodeTableRow                  NodeType = 108 // 表行
	NodeTableCell                 NodeType = 109 // 表格

	NodeEmoji        NodeType = 200 // Emoji
	NodeEmojiUnicode NodeType = 201 // Emoji Unicode
	NodeEmojiImg     NodeType = 202 // Emoji 图片
	NodeEmojiAlias   NodeType = 203 // Emoji ASCII

	NodeMathBlock             NodeType = 300 // 数学公式块
	NodeMathBlockOpenMarker   NodeType = 301 // 开始数学公式块标记符 $$
	NodeMathBlockContent      NodeType = 302 // 数学公式块内容
	NodeMathBlockCloseMarker  NodeType = 303 // 结束数学公式块标记符 $$
	NodeInlineMath            NodeType = 304 // 内联数学公式
	NodeInlineMathOpenMarker  NodeType = 305 // 开始内联数学公式标记符 $
	NodeInlineMathContent     NodeType = 306 // 内联数学公式内容
	NodeInlineMathCloseMarker NodeType = 307 // 结束内联数学公式标记符 $

	NodeBackslash        NodeType = 400 // 转义反斜杠标记符 \
	NodeBackslashContent NodeType = 401 // 转义反斜杠后的内容

	NodeVditorCaret NodeType = 405 // 插入符,某些情况下需要使用该节点进行插入符位置调整

	NodeFootnotesDefBlock NodeType = 410 // 脚注定义块
	NodeFootnotesDef      NodeType = 411 // 脚注定义 [^label]:
	NodeFootnotesRef      NodeType = 412 // 脚注引用 [^label]

	NodeToC NodeType = 415 // 目录 [toc]

	NodeHeadingID NodeType = 420 // 标题 ID # foo {id}

	NodeYamlFrontMatter            NodeType = 425 // https://jekyllrb.com/docs/front-matter/
	NodeYamlFrontMatterOpenMarker  NodeType = 426 // 开始 YAML Front Matter 标记符 ---
	NodeYamlFrontMatterContent     NodeType = 427 // YAML Front Matter 内容
	NodeYamlFrontMatterCloseMarker NodeType = 428 // 结束 YAML Front Matter 标记符 ---

	NodeBlockRef            NodeType = 430 // 内容块引用节点
	NodeBlockRefID          NodeType = 431 // 被引用的内容块(定义块)ID
	NodeBlockRefSpace       NodeType = 432 // 被引用的内容块 ID 和内容块引用锚文本之间的空格
	NodeBlockRefText        NodeType = 433 // 内容块引用锚文本
	NodeBlockRefDynamicText NodeType = 434 // 内容块引用动态锚文本

	NodeMark             NodeType = 450 // 标记
	NodeMark1OpenMarker  NodeType = 451 // 开始标记标记符 =
	NodeMark1CloseMarker NodeType = 452 // 结束标记标记符 =
	NodeMark2OpenMarker  NodeType = 453 // 开始标记标记符 ==
	NodeMark2CloseMarker NodeType = 454 // 结束标记标记符 ==

	NodeKramdownBlockIAL NodeType = 455 // 块级内联属性列表 {: name="value"}
	NodeKramdownSpanIAL  NodeType = 456 // 行级内联属性列表 *foo*{: name="value"}bar

	NodeTag            NodeType = 460 // 标签
	NodeTagOpenMarker  NodeType = 461 // 开始标签标记符 #
	NodeTagCloseMarker NodeType = 462 // 结束标签标记符 #

	NodeBlockQueryEmbed       NodeType = 465 // 内容块查询嵌入
	NodeOpenBrace             NodeType = 466 // {
	NodeCloseBrace            NodeType = 467 // }
	NodeBlockQueryEmbedScript NodeType = 468 // 内容块查询嵌入脚本

	NodeSuperBlock             NodeType = 475 // 超级块节点
	NodeSuperBlockOpenMarker   NodeType = 476 // 开始超级块标记符 {{{
	NodeSuperBlockLayoutMarker NodeType = 477 // 超级块布局 row/col
	NodeSuperBlockCloseMarker  NodeType = 478 // 结束超级块标记符 }}}

	NodeSup            NodeType = 485 // 上标
	NodeSupOpenMarker  NodeType = 486 // 开始上标标记符 ^
	NodeSupCloseMarker NodeType = 487 // 结束上标标记符 ^
	NodeSub            NodeType = 490 // 下标
	NodeSubOpenMarker  NodeType = 491 // 开始下标标记符 ~
	NodeSubCloseMarker NodeType = 492 // 结束下标标记符 ~

	NodeGitConflict            NodeType = 495 // Git 冲突标记
	NodeGitConflictOpenMarker  NodeType = 496 // 开始 Git 冲突标记标记符 <<<<<<<
	NodeGitConflictContent     NodeType = 497 // Git 冲突标记内容
	NodeGitConflictCloseMarker NodeType = 498 // 结束 Git 冲突标记标记符 >>>>>>>

	NodeIFrame NodeType = 500 // <iframe> 标签

	NodeAudio NodeType = 505 // <audio> 标签

	NodeVideo NodeType = 510 // <video> 标签

	NodeKbd            NodeType = 515 // 键盘
	NodeKbdOpenMarker  NodeType = 516 // 开始 kbd 标记符 <kbd>
	NodeKbdCloseMarker NodeType = 517 // 结束 kbd 标记符 </kbd>

	NodeUnderline            NodeType = 520 // 下划线
	NodeUnderlineOpenMarker  NodeType = 521 // 开始下划线标记符 <u>
	NodeUnderlineCloseMarker NodeType = 522 // 结束下划线标记符 </u>

	NodeBr NodeType = 525 // <br> 换行

	NodeTextMark NodeType = 530 // 文本标记,该节点因为不存在嵌套,所以不使用 Open/Close 标记符

	NodeWidget NodeType = 535 // <iframe data-type="NodeWidget" data-subtype="widget"></iframe>

	NodeFileAnnotationRef      NodeType = 540 // 文件注解引用节点
	NodeFileAnnotationRefID    NodeType = 541 // 被引用的文件注解 ID(file/annotation)
	NodeFileAnnotationRefSpace NodeType = 542 // 被引用的文件注解 ID 和文件注解引用锚文本之间的空格
	NodeFileAnnotationRefText  NodeType = 543 // 文件注解引用锚文本(不能为空,如果为空的话会自动使用 ID 渲染)

	NodeAttributeView NodeType = 550 // 属性视图

	NodeCustomBlock NodeType = 560 // 自定义块

	NodeTypeMaxVal NodeType = 1024 // 节点类型最大值
)

func Str2NodeType

func Str2NodeType(nodeTypeStr string) NodeType

func (NodeType) String

func (i NodeType) String() string

type WalkStatus

type WalkStatus int

WalkStatus 描述了遍历状态。

type Walker

type Walker func(n *Node, entering bool) WalkStatus

Walker 函数定义了遍历节点 n 时需要执行的操作,进入节点设置 entering 为 true,离开节点设置为 false。 如果返回 WalkStop 或者 error 则结束遍历。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL