【发布时间】:2022-09-27 22:27:55
【问题描述】:
我想将 Markdown 文件中的 H1 到 H6 标签列表转换为 Javascript 层次结构,以便在目录中使用。
目前该列表是由 AstroJS 以这种格式[{depth: 1, text: \'I am a H1\'}, {depth: 2: \'I am a H2}] 生成的。
注意事项
- 降价由最终用户创建。
- 此列表可能只有一个根标题 (
H1 -> H2 -> H3),但 - 它可能有多个根标题 (
H2 -> H3, H2 -> H3)或者 - 它可能有一个非常规的标题列表 (
H3, H2 -> H3) - 它可能会跳过嵌套级别 (
H1 -> H3 -> H6)
寻找 Javascript 或 Typescript 示例。
以下三个场景基于 AstroJS 网站正在处理的一些 Markdown 内容。
单根标题
这个标准的 SEO 友好的标题集有一个 H1,后跟其他标题
作为降价
# Main heading
## Sub heading 1
### More info
## Sub heading 2
### Even more info
## Sub heading 3 (edge case)
##### Deep nesting
作为平面 javascript 数组
headings = [
{ depth: 1, text: \'Main heading\' },
{ depth: 2, text: \'Sub heading 1\' },
{ depth: 3, text: \'More info\' },
{ depth: 2, text: \'Sub heading 2\' },
{ depth: 3, text: \'Even more info\' },
{ depth: 2, text: \'Sub heading 3 (edge case)\' },
{ depth: 6, text: \'Deep nesting\' },
]
作为 javascript 层次结构
list_of_heading_heirachies = [
{ text: \'Main heading\', headings: [
{ text: \'Sub heading 1\', headings: [
{ text: \'More info\', headings: [] },
] },
{ text: \'Sub heading 2\', headings: [
{ text: \'Even more info\', headings: [] },
] },
{ text: \'Sub heading 3 (edge case)\', headings: [
{ text: \'Deep nesting\', headings: [] },
] }
]}
]
console.log(list_of_heading_heirachies.length);
// => 1
多个根标题
这个降价(常见于 listicle 页面)没有像上面那样的单个根节点,而是有多个 H2
作为降价
## Why is it done
### Why abc
### Why xyz
## How is it done
### How reason 1
### How reason 2
#### More info
## Conclusion
作为平面 javascript 数组
headings = [
{ depth: 2, \'Why is it done\' },
{ depth: 3, \'Why abc\' },
{ depth: 3, \'Why xyz\' },
{ depth: 2, \'How is it done\' },
{ depth: 3, \'How reason 1\' },
{ depth: 3, \'How reason 2\' },
{ depth: 4, \'More info\' },
{ depth: 2, \'Conclusion\' }
]
作为 javascript 层次结构
list_of_heading_heirachies = [
{ text: \'Why is it done\', headings: [
{ text: \'Why abc\', headings: [] },
{ text: \'Why xyz\', headings: [] },
] },
{ text: \'How is it done\', headings: [
{ text: \'How reason 1\', headings: [] },
{ text: \'How reason 2\', headings: [
{ text: \'More info\', headings: [] },
] },
] },
{ text: \'Conclusion\', headings: [] }
]
console.log(list_of_heading_heirachies.length);
// => 3
非常规标题列表
当一般内容标题之前有元数据或面包屑数据时,就会出现这种非常规的标题列表
#### Home -> Blog -> Some Articles
### By Ben Hurr
#### 24th, Sep, 2022
# Some cool Article
## Why abc
### info on why
### more info on why
## How
### How we did it
## Conclusion
作为平面 javascript 数组
headings = [
{ depth: 4, text: \'Home -> Blog -> Some Articles\' },
{ depth: 3, text: \'By Ben Hurr\' },
{ depth: 4, text: \'24th, Sep, 2022\' },
{ depth: 1, text: \'Some cool Article\' },
{ depth: 2, text: \'Why abc\' },
{ depth: 3, text: \'info on why\' },
{ depth: 3, text: \'more info on why\' },
{ depth: 2, text: \'How\' },
{ depth: 3, text: \'How we did it\' },
{ depth: 2, text: \'Conclusion\' },
]
作为 javascript 层次结构
list_of_heading_heirachies = [
{ text: \'Home -> Blog -> Some Articles\', headings: [] },
{ text: \'By Ben Hurr\', headings: [
{ text: \'24th, Sep, 2022\', headings: [] },
] },
{ text: \'Some cool Article\', headings: [
{ text: \'Why abc\', headings: [
{ text: \'info on why\', headings: [] },
{ text: \'more info on why\', headings: [] },
] },
{ text: \'How\', headings: [
{ text: \'How we did it\', headings: [] },
] },
{ text: \'Conclusion\', headings: [] },
] },
]
console.log(list_of_heading_heirachies.length);
// => 3
-
你尝试了什么?为什么这个问题是关于 Javascript、C#、Ruby 和 TypeScript 的?你肯定不是在尝试用每种语言做同样的事情吗?
-
无论如何,您可能可以使用堆栈来跟踪当前父级(当存在更深的标题时推送,弹出直到到达下一个标题深度等)然后您知道在哪里应用标题。
-
我目前正在通过单元测试探索 ruby 中的堆栈弹出/推送方法,但是如果有人使用另一种语言的算法解决了问题,那么我自己会适应 ruby。
标签: javascript typescript algorithm