faviconv-noREADME|ARCHIVES|CATEGORIES|SEARCH|
«Wed Jan 06 2021AkrISrn语法标记db593aeRaw
内容目录
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.

你可以使用单独占据一行的 [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 函数的最后一部分。

This page is open source, improve it
Graph