Markdown / Jekyll: автоматически окружать голые URL-адреса угловыми скобками? - PullRequest
0 голосов
/ 16 июня 2020

Я заметил, что некоторые парсеры Markdown и GitHub автоматически преобразуют голые URL-адреса в ссылки, а другие ( например, Kramdown ) - нет. Стандартный синтаксис Markdown требует, чтобы URL-адреса были заключены в угловые скобки, например <https://www.google.com/>.

У меня есть несколько документов с голыми URL-адресами, которые отображаются в моем редакторе Markdown по желанию, то есть в виде гиперссылок, но не получают отображаются в виде ссылок, когда я sh помещаю их в Jekyll на страницы GitHub.

Как я могу написать сценарий, чтобы окружать голые URL-адреса угловыми скобками? Желательно с помощью сценариев оболочки, стандартных инструментов командной строки (sed, awk) или Python. Или, может быть, для этого уже есть плагин Jekyll?

Я знаю, что сопоставление URL-адресов очень нетривиально, поэтому хотел спросить здесь, в SO, прежде чем углубляться в это.

Дополнительная сложность: Решение должно только измениться голые URL-адреса, и оставьте в покое URL-адреса, которые уже были упакованы / закодированы с помощью совместимого со стандартами Markdown или HTML.

(Я ожидал, что это будет общий вопрос, и это это в различных сообщениях GitHub-Issues для разных пакетов, без решений ... Но попытался найти этот вопрос здесь и не смог Я не нашел его уже заданным, или каких-либо готовых решений Jekyll . Я нашел много вопросов о сопоставлении, когда угловые скобки уже есть, но не тех, которые добавляют угловые скобки. Я представляю, как это решение реализовывалось много-много раз - в тех самых инструментах, которые мы используем, таких как GitHub и MathOverflow - так что не знаю, почему средства для этого широко не публикуются. )

1 Ответ

1 голос
/ 21 июня 2020

Вы можете попробовать следующее регулярное выражение:

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

Объяснение приведенного выше регулярного выражения:

  • (?!<) - представляет отрицательный прогноз, не соответствующий строке, если она начинается с <.

  • ^, $ - представляет начало и конец строки соответственно .

  • (https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/\/=]*)) - Эта часть эффективно сопоставляет все возможные действительные URL-адреса.

  • (?!>) - представляет собой отрицательный прогноз, который не соответствует, если URL-адрес заканчивается на >.

Pictorial Representation

You can find the demo of the above regex in здесь.

ПРИМЕЧАНИЕ: Я также предпочитаю использовать команду perl, если речь идет о реализации в bash. Но если вам необходимо использовать sed, вы можете попробовать следующую команду. Однако; обратите внимание, что sed упускает многие удивительные особенности регулярного выражения, а именно; осмотры, незахваченные группы и т. д. c.

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

Вы можете найти пример выполнения perl и sed в здесь.

...