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