我有一些 Ruby 代码可以在 GitHub Flavored Markdown 中自动生成目录。如果存在与此问题相关的差异,那么了解其他版本的 Markdown 也会很好。
目前,我的代码在 99% 的情况下都可以正常工作:
def header_to_anchor
@header
.downcase
.gsub(/[^a-z\d\- ]+/, "")
.gsub(/ /, "-")
end
这是基于我在此处的 GitHub 评论中找到的注释。它写道:
创建锚点的代码在这里: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 而言。
我也在这里看到了这个答案,但是那里指定的那些规则似乎也不太可靠。
有没有人知道解释生成这些锚点的规则的权威文档?
好吧,这里的混淆似乎1是 GitHub 评论中提到的代码中的 Ruby 正则表达式与评论所说的有些不同。代码使用这个正则表达式:
PUNCTUATION_REGEXP = RUBY_VERSION > '1.9' ? /[^\p{Word}\- ]/u : /[^\w\- ]/
同时,\p{Word}
实际上是指字母数字加下划线。
因此,GitHub 问题中的评论“删除不是字母、数字、空格或连字符的任何内容(请参阅 Unicode 处理方式的来源) ”是对代码的误读。
正确的规则应该是:
- 它使字符串小写
- 删除不是字母、数字、空格、下划线或连字符的任何内容(有关如何处理 Unicode,请参阅源代码)
- 将任何空格更改为连字符。
- 如果这不是唯一的,请添加“-1”、“-2”、“-3”...以使其唯一
1当然,假设toc_filter.rb
GitHub 问题中提到的文件确实是“事实来源”,而不是其他地方定义的规则的实现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句