faviconv-noREADME|ARCHIVES|CATEGORIES|SEARCH|
«Mon Feb 08 2021AkrISrn语法标记63c8f92Raw
语法标记
The documentation is a work in progress, and English edition is just an empty shell for now. I will translate it when Chinese edition has done.

Flags

Flags 是形如 @tags: a, b, c 的一组标记(注意使用英文冒号),用于提供描述页面的元数据(我认为 @ 标记更加灵活简易,没有选用较为常见的 YAML 格式)。

所有 Flag 标记都是可选的,每条需要单独占据一行,个别可以填入多项数据(用中英文逗号或中文顿号分隔)。多次出现的同类 Flag 会以最后一条为准。它们最后都会从文件内容中剔除,部分会展示在页头或者页脚。

  • title:页面标题。它是一个特殊 Flag,不使用 Flag 标记语法,而是识别 Markdown 的顶级标题(# title)。如果文件的第一行没有顶级标题,它就是文件的路径(省略 index.md)。
  • @tags:文件标签,可以嵌套(a/b/c),支持多项。
  • @updated:更新日期 / 时间,支持多项(只会选取最旧和最新的时间进行展示)。没有严格的格式要求,只要能被 new Date() 解析就行。如果它全部由数字组成,会被作为时间戳(含毫秒)传入。除了使用 Flag,你也可以在文件路径中包含一个格式固定的日期(/YYYY/MM/DD/(正则表达式:/\/(\d{4}[/-]\d{2}[/-]\d{2})[/-]/),除了第一个 / 是必须的,其它都可以替换为 -),它会合并进 updated
  • @cover:页面头图,可以直接填入图片地址,也可以使用无 alt 的 Markdown 图片语法(![](src),这主要是为了便于编辑器关联文件)。
  • @creator:文件创建者,不支持多项。
  • @updater:文件更新者,不支持多项。
  • 自定义 Flag:预定义 FlagtitletagsupdatedcovertimesstartDateendDatecreatorupdater,请避免和其中任何一项重名)之外的所有 Flag 标记都是自定义 Flag,不支持多项。

内容目录

你可以使用单独占据一行的 [toc] 标记(不区分大小写)在你指定的位置为页面添加内容目录(Table of Contents)。如果一个页面有多个 [toc] 标记,只有第一个会生效,其它都会被剔除。

v-no 会在页面宽度允许的情况下,自动将过长的 ToC 尽可能均匀地分成两到三组并排展示。

分组算法

这个算法的时间复杂度大概在 O(n log n)

步骤简述:

  1. 先为标题总数大于 7 的 ToC 预分配两组、大于 11 的预分配三组。
  2. 根据预分配的组数计算平均标题个数,将它作为第一轮分组时的每组最大容量。
  3. 依序将最外层的 <li> 标签(移动的最小单元)推入预分配的组中,在当前组的标题总数即将超过最大容量时进入下一组。
  4. 直到没有元素可以分,或预分配的所有组都被填满:
    • 如果所有元素都在组内,则分组完成。
    • 如果还有剩余元素,将第二组第一个元素推进第一组,并将第一组的总数作为新的最大容量,从第二组第二个元素开始,重新分配第一组之后的其它组。

举个例子:

首先将 ToC 描述为由每个最外层 <li> 标签所包含的标题个数组成的数组。

[3, 4, 1, 9, 2, 7, 8, 6, 5]
JavaScript

这个数组的总和为 45,为它预分配三组,每组容量为 15。

  • 第一轮分组(容量:15):
    1. [3, 4, 1] = 8,+ 9 = 17,超出 15,进入下一组。
    2. [9, 2] = 11
    3. [7, 8] = 15,已经分完三组了,但是还剩 [6, 5] 没有分,扩增容量进入下一轮。
  • 第二轮分组(容量:17):
    1. [3, 4, 1, 9] = 17
    2. [2, 7, 8] = 17
    3. [6, 5] = 11,分组完成。

需要注意的是,预分配的三组并不会总是被填充。只要移除示例数组最后两项,它就会被分成 17 + 17 的两组。

如果你有更好的想法,欢迎改进它!它位于 updateHeading 函数的最后一部分。

生成列表

你可以使用单独占据一行的 [list] 标记(不区分大小写)在你指定的位置为页面添加一组自动生成的文件列表。只要页面有一个无参数 [list] 标记,其它所有同类标记都会被剔除,含参数的写法([list#content])则没有个数限制。

如果你不传入任何参数,它会展示所有文件,并根据标签进行分类汇总(比如分类页)。如果你在 list 后跟一个 #,相当于用它之后的部分对列表进行搜索过滤,它的写法和搜索页一致。

示例

列出所有 root 标签下的文件([list#@tags:root]):

列出所有 title 包含 v-no 的文件([list#@title:v-no]):

列出所有内容包含 Vue.js 的文件([list#Vue.js]):

文件切片

你可以使用单独占据一行的 [slice] 标记(不区分大小写)将位于它前后的文件内容划分为多个切片。

每个切片会依序得到一个从 0 开始的序号,该标记的参数([slice#a])可以为它前面的切片赋予一个额外的字符串别名。如果最后一个切片只有空白字符,v-no 会忽略它。

文件切片标记需要和嵌入文件配合使用。

重定向

你可以使用单独占据一行的 [redirect] 标记(不区分大小写)将当前页面重定向到其它页面。如果一个页面有多个 [redirect] 标记,只有第一个会生效。你需要将重定向路径作为参数传给它。

重定向路径以 / 开头,.md 结尾,锚点要在查询字符串前。

示例

  • [redirect#/index.md]:重定向到 /index.md
  • [redirect#/zh/archives.md#h2-1]:重定向到 /zh/archives.md,并滚动到锚点。
  • [redirect#/zh/search.md?content=%40tags%3Aroot]:重定向到 /zh/search.md,并进行搜索。
  • [redirect#/zh/search.md#h2-1?content=%40tags%3Aroot]:重定向到 /zh/search.md,滚动到锚点并搜索。

不引入通用文件

[noCommon],需要单独占据一行。

只在搜索页生效的标记

搜索框

[input],需要单独占据一行,参数为输入框占位字符串。

搜索结果列表

[result],需要单独占据一行,参数为查询开始前展示的字符串。

查询到的结果条数

[number],参数为默认值。

总查询条数

[count],参数为默认值。

查询用时(秒)

[time],参数为默认值。

This page is open source, improve it
Graph