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 图片语法(,这主要是为了便于编辑器关联文件)。@creator:文件创建者,不支持多项。@updater:文件更新者,不支持多项。- 自定义 Flag:预定义 Flag(
title、tags、updated、cover、times、startDate、endDate、creator、updater,请避免和其中任何一项重名)之外的所有 Flag 标记都是自定义 Flag,不支持多项。
内容目录
你可以使用单独占据一行的 [toc] 标记(不区分大小写)在你指定的位置为页面添加内容目录(Table of Contents)。如果一个页面有多个 [toc] 标记,只有第一个会生效,其它都会被剔除。
v-no 会在页面宽度允许的情况下,自动将过长的 ToC 尽可能均匀地分成两到三组并排展示。
分组算法
这个算法的时间复杂度大概在 O(n log n)。
步骤简述:
- 先为标题总数大于 7 的 ToC 预分配两组、大于 11 的预分配三组。
- 根据预分配的组数计算平均标题个数,将它作为第一轮分组时的每组最大容量。
- 依序将最外层的
<li>标签(移动的最小单元)推入预分配的组中,在当前组的标题总数即将超过最大容量时进入下一组。 - 直到没有元素可以分,或预分配的所有组都被填满:
- 如果所有元素都在组内,则分组完成。
- 如果还有剩余元素,将第二组第一个元素推进第一组,并将第一组的总数作为新的最大容量,从第二组第二个元素开始,重新分配第一组之后的其它组。
举个例子:
首先将 ToC 描述为由每个最外层 <li> 标签所包含的标题个数组成的数组。
这个数组的总和为 45,为它预分配三组,每组容量为 15。
- 第一轮分组(容量:15):
[3, 4, 1]= 8,+ 9 = 17,超出 15,进入下一组。[9, 2]= 11[7, 8]= 15,已经分完三组了,但是还剩[6, 5]没有分,扩增容量进入下一轮。
- 第二轮分组(容量:17):
[3, 4, 1, 9]= 17[2, 7, 8]= 17[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