文章内容本身也是查询数据[#122]

规则目录不是唯一的数据源。Forester在分析阶段遍历每篇文章的内容IR,自动生成content-node relation。它记录节点所属页面、父节点、同级位置、类型、属性、纯文本投影和字符数;tag、taxon、link、subtree与math都是普通节点事实。

因为.plant在整个站点分析之前就已读取,跨文章查询应放在项目的#:analyze阶段。下面是Flora project.scm实际运行的查询:

(let ((nodes (content-node-relation forest)))
    (query (node-id page-id position text line column)
      (fresh (file)
        (math-containing-paragrapho nodes node-id)
        (shorter-than-o nodes node-id 120)
        (source-locationo nodes node-id file line column)
        (nodeo nodes
               (node-id node-id)
               (page-id page-id)
               (position position)
               (text text)))))

这会直接查询全站文章IR,不需要另外登记段落。查询结果由下面这个Flora项目本地的占位命令生成并放在此处:

匹配到 36 个短于 120 字且含公式的段落;下面展示前 6 个。

  • math-0006 (line 20, column 1; IR position 2): 输入是 ∇ × (−y, x, 0);计算得到 0, 0, 2。
  • cfd-2-1 (line 51, column 3; IR position 7): 图2.1:有限控制体的定义(固定于空间中)。图例:流线;\Omega——控制体;\partial\Omega——控制体边界(封闭曲面);dS——面元;\vec{n}——外指单位法向量;\vec{v}——流动速度。
  • cfd-2-2-2 (line 253, column 5; IR position 17): 图2.2:作用在控制体表面元上的表面力。图例:\overline{\overline{\tau}}\cdot\vec{n}\,dS——黏性应力;p\vec{n}\,dS——压力;dS——面元;\Omega——控制体。
  • cfd-2-4-3 (line 671, column 5; IR position 4): 图2.4:薄边界层的表示。图例:Flow——流动;Boundary layer——边界层;Body contour——物面轮廓;\eta、\xi——贴体曲线坐标。
  • cfd-4-1-2 (line 185, column 5; IR position 2): 图4.2:三维中控制体一个面上法向量变化的情形。图例:阴影四边形为控制体的一个面;由于其四个顶点不共面,面上的法向量(图中\vec{n}_1、\vec{n}_2)随位置变化,不再是常向量。
  • cfd-4-3-3 (line 1361, column 22; IR position 0): |\bar{A}_{Roe}|与左、右状态之差的乘积可以高效地计算如下en

同一份节点关系也能查普通文本和metadata。plain-text-paragrapho选择只有文本子节点的段落;contains-texto检查文本投影中是否包含指定字符串;topic-membero通过相同的关系查询tag和taxon。例如把topic ID固定为tutorial,会返回所有相应页面。

node-id只在本次分析结果中有效,不应保存成外部引用。source-locationo会返回节点对应的源文件、行和列;Flora的结果列表会同时展示源码行列号与IR同级位置。若一个段落由多行文本和内联命令组成,段落位置取其第一个有位置的子节点,内联命令则保留自己的起始位置。若需要定位到IR中更具体的节点,可以沿parent-id与position回溯。公式的纯文本投影会保留幂、下标和分数的可读边界,例如x^(2)与(a)/(b),避免把结构挤成难读的x2或ab。