在Markdown中稳健地产生锚点

时间:2019-05-18 05:22:59

标签: markdown github-flavored-markdown

我有一些Ruby代码可以自动在GitHub Flavored Markdown中生成目录。如果与此问题相关的差异,最好也了解Markdown的其他风格。

此刻,我有这段代码可以在99%的时间内工作:

  def header_to_anchor
    @header
      .downcase
      .gsub(/[^a-z\d\- ]+/, "")
      .gsub(/ /, "-")
  end

这是基于我在GitHub评论here中找到的注释。内容为:

  

创建锚点的代码在这里:   https://github.com/jch/html-pipeline/blob/master/lib/html/pipeline/toc_filter.rb

     
      
  1. 将字符串小写
  2.   
  3. 删除所有不是字母,数字,空格或连字符的内容(请参阅源代码以了解Unicode的处理方式)
  4.   
  5. 将任何空格更改为连字符。
  6.   
  7. 如果不是唯一的,请添加“ -1”,“-2”,“-3”,...以使其唯一
  8.   

出于我的目的,我不需要解决唯一性问题。

这很棒,直到我发现另一个失败的极端情况,即我的降价文档的标题是:

### shunit2/_shared.sh

我的代码生成的锚为:

* [shunit2/_shared.sh](#shunit2sharedsh)

并创建另一个断开的链接,至少就GitHub Flavored Markdown而言。

我在这里也看到了this的答案,但是那里指定的那些规则似乎也不是很可靠。

有人知道解释这些锚的规则的权威文档吗?

1 个答案:

答案 0 :(得分:0)

这里出现的混乱是 1 ,是GitHub注释中提到的代码中的Ruby正则表达式与注释中的内容有些不同。该代码使用此正则表达式:

PUNCTUATION_REGEXP = RUBY_VERSION > '1.9' ? /[^\p{Word}\- ]/u : /[^\w\- ]/

删除“标点符号”。 Ruby正则表达式记录在here中。

与此同时,\p{Word}实际上表示字母数字加下划线

因此,在GitHub问题中,“ 删除不是字母,数字,空格或连字符的任何内容(请参阅Unicode处理方式的源代码)”是对代码的误读

正确的规则应为:

  
      
  1. 将字符串小写
  2.   
  3. 删除不包含字母,数字,空格,下划线或连字符的所有内容(请参阅源中有关Unicode的处理方式)
  4.   
  5. 将任何空格更改为连字符。
  6.   
  7. 如果不是唯一的,请添加“ -1”,“-2”,“-3”,...以使其唯一
  8.   

1 当然,假设GitHub问题中提到的toc_filter.rb文件确实是“真理之源”,而不是其他地方定义的规则的实现。