递归大法好,30 行代码为 Markdown 生成目录树

目录

前言

本以为我的博客程序是没有 [TOC] 这样东西来自动生成目录树的,都已经把代码写好了,一看文档就懵逼了。原来文档最后一条写明了,[TOC] 以及其用法,是我自己没好好看文档,心痛。

不过既然写完了,那就把原理分享出来吧,反正也就 30 行代码。千万别钻牛角尖跟我说超过了 30 行,你硬是觉得括号占一行也算行的话我也没办法。

第一步、提取标题

既然要为 Markdown 生成目录树,那么第一个步骤就是提取 Markdown 中的所有标题。因为 Markdown 本身语法非常简单,由若各个 # 符号开头,所以可以用一个正则表达式 /^(#+)[ \t](.*)$/ 进行匹配提取。(#+) 用来提取是第几级的标题,(.*) 用来提取出具体标题内容。因为很多 Markdown 实现里面都要求标题的 # 符号后面要跟空格或者 tab 来进行分隔,所以我们也按照这样的标准,用 [ \t]+ 来强制要求至少有一个空格或者 tab 进行分隔。

下面这个 getHeaders 就是用来提取一个 Markdown 里面标题的,具体过程如下:

  1. 将 Markdown 文件用 split('\n') 分成一个行数组。
  2. 将行数组里面的每一行用 /^(#+)[ \t](.*)$/ 进行匹配和提取标题。
  3. 过滤掉不匹配的行。
  4. 最后将提取出来的字符整理成一个级数和标题的对象。
const getHeaders = text =>
    text
        .split('\n')
        .map(line => line.match(/^(#+)[ \t]+(.*)$/))
        .filter(header => header !== null)
        .map(([, prefix, title]) => ({ level: prefix.length, title }))

getHeaders 函数会提取出一个 Markdown 文件里面所有的标题信息,这个标题信息里面包含了标题的级数和标题内容。

Read more   2018/1/22 posted in  技术分享

博客这种东西,还是要写写的

发现我真的挺不适合写博客的,总是容易丢项目,丢文章,这可能跟像个习惯有些关系。毕竟我是一个比较急躁的人。不过现在年纪大些了,也多少有些耐心了。就重新把博客开起来,再更新点内容,算是一种记录,也算是对自己学了那么多年东西的一个交代。

前面这些年来,我自认为学到了挺多东西的,但是自己却又没有系统给自己理一理。只是这种东西,一个点一个点是没有用处的,就像一对散乱的零件,帮别人的东西修修补补可能没什么问题,但是要自己从零构建一整套系统体系,那就非常困难了。知识要连成片,立成体,才能使它的价值最大化,才能触类旁通,解决现实中复杂的问题。

所以我建这个博客,的第一个目的是要把我学到的东西竖立起来,串联起来,立起来,让自己能够从多个维度来把自己的知识输出出来。毕竟掌握得清不清楚,往纸上那么一写,立刻清清楚楚,一目了然。

我建这个博客的第二个目的,就是我想要输出我自己对编程的看法和理念。虽然我目前才疏学浅,感觉自己就是一个不入流的 loser,但是 loser 也有 loser 的方式来对这个世界表达一些心得感想,也能够给别人提供一个心得感想,再不济也可以把自己做一个反面例证嘛~

毕竟,人活在这世界上的唯一价值,是与其他人的联系与影响。

2018/1/17 posted in  吐槽扯蛋