Markdown/Jekyll:自动包围带尖括号的裸 URL?

Markdown/Jekyll: Auto-surround bare URLs with angle brackets?

我注意到一些 Markdown 解析器和 GitHub 会自动将裸 URL 转换为链接,但其他 (like Kramdown) 不会。标准的 Markdown 语法要求 URL 包含在尖括号中,例如<https://www.google.com/>.

我有许多文档在我的 Markdown 编辑器中显示为所需的裸 URL,即作为超链接,但是当我在 Jekyll 中将它们推送到 GitHub 页面时,它们没有呈现为链接。

如何编写脚本以用尖括号将裸 URL 括起来? 最好通过 shell 脚本、标准命令行工具(sed、awk)或 Python。或者也许已经有一个 Jekyll 插件可以解决这个问题?

我知道匹配 URL 非常重要,所以想在深入了解之前先在这里问一下。

进一步的困难:解决方案应该只更改 URL,而不要管已经wrapped/encoded通过符合标准的 Markdown 或 HTML。

(我预计这是一个常见问题,它 在各种 GitHub- 各种包的问题帖子中,没有解决方案......但尝试过在这里搜索这个问题,但找不到它已经问过,nor any premade Jekyll solutions. I found many questions about matching when the angle brackets are already there, but not ones to add the angle brackets. Yet I'm imagining the solution has been implemented many, many times -- in the very tools we use, such as GitHub and MathOverflow——所以,不确定为什么没有广泛发布这样做的方法。)

您可以试试下面的正则表达式:

(?!<)^(https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/\/=]*))(?!>)$

上面正则表达式的解释:

  • (?!<) - 如果字符串以 <.[=22= 开头,则表示不匹配字符串的否定前瞻]

  • ^, $ - 分别表示行的开始和结束。

  • (https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/\/=]*)) - 这部分有效匹配所有可能的有效 urls。

  • (?!>) - 表示如果 url 以 > 结尾则不匹配。

你可以在here.

中找到上述正则表达式的演示

注意: 如果要在 bash 中实现,我也更喜欢使用 perl 命令。但是,如果使用 sed 是您的必要要求,那么您可以尝试以下命令。 但是;请注意 sed 错过了正则表达式的许多惊人功能;环视、非捕获组等

sed -E 's@^[^<]?(https?://(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&/=]*))[^>]?$@<>@gm'

您可以在 here.

中找到 perl 和 sed 实现的示例 运行