当前位置: 首页 > 文档资料 > zDoc 使用文档 >

zDoc 的中间数据结构

优质
小牛编辑
134浏览
2023-12-01

世间任何文档,都是相似的

如何描述一个文档

抽象的看,任何一个文档都可以下列结构来描述

文档级属性 {         # ZDocMetas
    标题     
    作者
    子标题
    创建日期
    指定样式表
    …
}

标题                # ZDocNode.depth=0

    … 一块内容 …     # ZDocNode.depth=-1
    
    标题 A
        
        … 一块内容 …
        … 一块内容 …
        
  • 无论对于 HTML, markdown 我们都可以将其文档理解成这样的结构
  • 当然,我们可以用 zDoc 推荐的书写方式更加直白的写出这样的结构。

我们可以看出,所谓的 zDoc 文档结构,就是一个 ZDocNode 组成的文档结构树。所有的叶子节点
是段落内容,所有的中间节点则作为标题

关于 ZDocNode

任何一个节点,都可能表示以下的内容

Type说明

NODE文档节点,通常作为文档的根节点
HEADER标题,根据 depth 来决定标题级别
PARAGRAPH普通文字块,不能有子节点
BLOCKQUOTE缩进文字,子节点只能是 BLOCKQUOTE
TABLE表格,支持 attrs $cols,是个数组,表示自身的列居左居右设置
THEAD表头行
TH表头单元格
TR表格行
TD单元格
OL有序列表
UL无序列表
LI列表项
HR分割线
CODE代码
HTML一段 HTML 代码,不会有子节点,内容为直接输出,通常是 HTML 文档的解析结果
COMMENT注释
LINK外部链接对象,记录了对象原始的路径,它的子节点可以是任何一个 ZDocNode
OBJ嵌入式对象

ZDocNode 对象的结构

{
    type    : NODE|…|OBJ,
    depth   : 0,              // 深度,0 表示根节点
    eles    : [ZDocEle..],     // 本节点的显示内容
    parent  : ZDocNode,        // 父节点,文档只有一个根节点
    children: [ZDocNode..],    // 子节点,空和 null 是一个意思
    attrs   : {..},            // 对于这个段落的补充描述,是个名值对象
}
  • 一个解析出来的 ZDocNode 树,根节点必定为 NODE
  • 根节点的 attrs 就是文档的属性

标题 : HEADER

标题的 depth 一定不是 -1 ,否则就是错误

表格 : TABLE

表格的父子结构必须是

TABLE       // 属性 "$cols" 存放了各个列对齐方式,数组,null 表示自动
    THEAD   // 可选
        TH
    TR      
        TD
    

列表 : OL|UL|LI

列表的父子结构必须

OL | UL   // 属性 "itype" 可以是 "#,1,a,A,i,I" 任意一个
    LI
        OL | UL
            LI    // 可以没有子 BLOCK
                PARAGRAPH
                PARAGRAPH

缩进块 : BLOCKQUOTE

BLOCKQUOTE
    P
    BLOCKQUOTE
        P
    P

即,BLOCKQUOTE 带来缩进,其中的 P 节点承载内容

代码 : CODE

  • 代码里的 content 会是纯文本
  • 对于 n 敏感,认为是换行
  • 属性 code-type 可选,为进一步说明代码的格式内容

嵌入式对象 : OBJ

  • content 会被认为是一段 JSON 字符串,描述这个对象

原始HTML代码 : HTML

  • 里面的内容会在 HTML 输出时输出,否则会忽略
  • 解析时,会替换内部的占位符以及图片链接和超链接做相应的替换

关于 ZDocEle

下面让我们只关注一个普通段落 ...

任何一个普通段落,可以认为是一个由 ZDocEle 构成的数组。这有点像 HTML。ZDocNode 就是 block 元素,
而 ZDocEle 就是 inline 元素。

ZDocEle 会有如下一些类型

Type说明

INLINE普通行内文字
QUOTE被反引号括起来的文字
IMG图片
BR段内换行
SUP标注
SUB脚注

那么它的数据结构为:

{
    type  : TEXT|..|SUB ,  // 元素的类型
    quote : ` | ' | "      // 被引号包裹的类型,0 表示没有被引号包裹
    href  : '…',           // 为这个元素包裹一个链接
    src   : '…',           // 元素为一个图片
    width : 1920,          // 图片宽度,仅对图片有效,<=0 表示不指定
    height: 1080,          // 图片高度,仅对图片有效,<=0 表示不指定
    text  : 'xxxxx',       // 文字内容,对于图片为图片的 title    
    style : {              // 元素的显示风格,支持的同义 CSS 属性为
        "font-weight" : "bold",
        "font-style" : "italic",
        "text-decoration" : "underline",
        "color" : "#00A",
        "background-color" : "#FF0"
    }
}

弱弱的总结一下

总之,zDoc 项目就是提供各种解析器(ZDocParser),可以将:

  • HTML
  • zdoc
  • markdown

这样的文件类型转换成上述的结构,同时它也提供各种渲染器(ZDocRender),
将这个结构转换成:

  • HTML
  • zdoc
  • markdown
  • PDF
  • MS Word