我有一些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
- 将字符串小写
- 删除所有不是字母,数字,空格或连字符的内容(请参阅源代码以了解Unicode的处理方式)
- 将任何空格更改为连字符。
- 如果不是唯一的,请添加“ -1”,“-2”,“-3”,...以使其唯一
出于我的目的,我不需要解决唯一性问题。
这很棒,直到我发现另一个失败的极端情况,即我的降价文档的标题是:
### shunit2/_shared.sh
我的代码生成的锚为:
* [shunit2/_shared.sh](#shunit2sharedsh)
并创建另一个断开的链接,至少就GitHub Flavored Markdown而言。
我在这里也看到了this的答案,但是那里指定的那些规则似乎也不是很可靠。
有人知道解释这些锚的规则的权威文档吗?
答案 0 :(得分:0)
这里出现的混乱是 1 ,是GitHub注释中提到的代码中的Ruby正则表达式与注释中的内容有些不同。该代码使用此正则表达式:
PUNCTUATION_REGEXP = RUBY_VERSION > '1.9' ? /[^\p{Word}\- ]/u : /[^\w\- ]/
删除“标点符号”。 Ruby正则表达式记录在here中。
与此同时,\p{Word}
实际上表示字母数字加下划线。
因此,在GitHub问题中,“ 删除不是字母,数字,空格或连字符的任何内容(请参阅Unicode处理方式的源代码)”是对代码的误读
正确的规则应为:
- 将字符串小写
- 删除不包含字母,数字,空格,下划线或连字符的所有内容(请参阅源中有关Unicode的处理方式)
- 将任何空格更改为连字符。
- 如果不是唯一的,请添加“ -1”,“-2”,“-3”,...以使其唯一
1 当然,假设GitHub问题中提到的toc_filter.rb
文件确实是“真理之源”,而不是其他地方定义的规则的实现。