Documentation
¶
Index ¶
- Constants
- Variables
- func IsNodeIDPattern(str string) bool
- func NewNodeID() string
- func Walk(n *Node, walker Walker)
- type ListData
- type Node
- func (n *Node) AcceptLines() bool
- func (n *Node) AppendChild(child *Node)
- func (n *Node) AppendTokens(tokens []byte)
- func (n *Node) CanContain(nodeType NodeType) bool
- func (n *Node) ChildByType(childType NodeType) *Node
- func (n *Node) ChildrenByType(childType NodeType) (ret []*Node)
- func (n *Node) ClearIALAttrs()
- func (n *Node) Content() (ret string)
- func (n *Node) ContentLen() (runeCnt, wordCnt int)
- func (n *Node) DocChild() (ret *Node)
- func (n *Node) FirstDeepestChild() (ret *Node)
- func (n *Node) IALAttr(name string) string
- func (n *Node) InsertAfter(sibling *Node)
- func (n *Node) InsertBefore(sibling *Node)
- func (n *Node) IsBlock() bool
- func (n *Node) IsChildBlockOf(parent *Node, depth int) bool
- func (n *Node) IsContainerBlock() bool
- func (n *Node) IsMarker() bool
- func (n *Node) LastDeepestChild() (ret *Node)
- func (n *Node) List() (ret []*Node)
- func (n *Node) NextNodeText() string
- func (n *Node) ParentIs(nodeType NodeType, nodeTypes ...NodeType) bool
- func (n *Node) PrependChild(child *Node)
- func (n *Node) PreviousNodeText() string
- func (n *Node) RemoveIALAttr(name string)
- func (n *Node) SetIALAttr(name, value string)
- func (n *Node) Text() (ret string)
- func (n *Node) TextLen() (ret int)
- func (n *Node) TokenLen() (ret int)
- func (n *Node) TokensStr() string
- func (n *Node) Unlink()
- type NodeType
- type WalkStatus
- type Walker
Constants ¶
const ( // WalkStop 意味着不需要继续遍历。 WalkStop = iota // WalkSkipChildren 意味着不要遍历子节点。 WalkSkipChildren // WalkContinue 意味着继续遍历。 WalkContinue )
Variables ¶
var Testing bool
Testing 标识是否为测试环境。
Functions ¶
func IsNodeIDPattern ¶
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:"-"` // 路径
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"` // 属性
}
Node 描述了节点结构。
func (*Node) AcceptLines ¶
AcceptLines 判断是否节点是否可以接受更多的文本行。比如 HTML 块、代码块和段落是可以接受更多的文本行的。
func (*Node) CanContain ¶
CanContain 判断是否能够包含 NodeType 指定类型的节点。 比如列表节点(块级容器)只能包含列表项节点, 块引用节点(块级容器)可以包含任意节点;段落节点(叶子块节点)不能包含任何其他块级节点。
func (*Node) ChildByType ¶
ChildByType 在 n 的子节点中查找 childType 指定类型的第一个子节点。
func (*Node) ChildrenByType ¶
ChildrenByType 返回 n 下所有类型为 childType 的子节点。
func (*Node) ClearIALAttrs ¶
func (n *Node) ClearIALAttrs()
ClearIALAttrs 用于删除 name、alias、memo 和 bookmark 以及所有 custom- 前缀属性。
func (*Node) ContentLen ¶
ContentLen 返回 n 及其所有内容子节点的累计长度。
func (*Node) FirstDeepestChild ¶
FirstDeepestChild 返回 n 的第一个最深的子节点。
func (*Node) IsChildBlockOf ¶
IsChildBlockOf 用于检查块级节点 n 的父节点是否是 parent 节点,depth 指定层级,0 为任意层级。 n 如果不是块级节点,则直接返回 false。
func (*Node) IsContainerBlock ¶
IsContainerBlock 判断 n 是否为容器块。
func (*Node) LastDeepestChild ¶
LastDeepestChild 返回 n 的最后一个最深子节点。
func (*Node) NextNodeText ¶
func (*Node) PrependChild ¶
PrependChild 在 n 的子节点最前添加一个子节点。
func (*Node) PreviousNodeText ¶
func (*Node) RemoveIALAttr ¶
func (*Node) SetIALAttr ¶
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 // 文本标记 NodeTextMarkOpenMarker NodeType = 531 // 开始文本标记符 <span> NodeTextMarkCloseMarker NodeType = 532 // 开始文本标记符 </span> 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 渲染) NodeTypeMaxVal NodeType = 1024 // 节点类型最大值 )
func Str2NodeType ¶
type Walker ¶
type Walker func(n *Node, entering bool) WalkStatus
Walker 函数定义了遍历节点 n 时需要执行的操作,进入节点设置 entering 为 true,离开节点设置为 false。 如果返回 WalkStop 或者 error 则结束遍历。