Auto-Linkify Words

@md-misko спасибо за PR!

Вы уверены? Меня это немного удивляет. Я бы подумал, что если ваше регулярное выражение достаточно жадное, то вы сможете сопоставить это. Обратите внимание: удаление точки из граничных символов ломает создание ссылок для слов в конце предложения.

Я провёл небольшой тест с вашим регулярным выражением ниже на regex101.com, и оно, кажется, работает с текущими граничными символами, см. regex101: build, test, and debug regex
Обратите внимание, что если я правильно понял вашу цель, вам, возможно, потребуется преобразовать некоторые ваши захватывающие группы в незахватывающие с помощью (?:).

Невозможность использования | очень раздражает, согласен. Обратите внимание, что для части ID|id вы можете просто использовать модификатор i, чтобы сделать регулярное выражение регистронезависимым. Что касается чисел, если вам действительно нужен точный диапазон от 1 до 10 и от 1 до 100, это сложно; если ослабить требование до диапазонов 1–19 и 1–199, это упростит задачу. :slight_smile:

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

/id\s?((?:[1-9]|10)\.(?:[1-9]|[1-9][0-9]|100))/i, https://example.com/id$2

@danekhollas спасибо за обратную связь и регулярное выражение! Я изменил код на основе ваших комментариев, PR готов к проверке.

1 лайк

Отлично! Однако это должен будет проверить кто-то из команды Discourse, @sam, к вашему сведению.

Обратите внимание, что вы можете просто установить расширение из своего форка (вы даже можете указать конкретную ветку).

1 лайк

Сначала я хотел бы прояснить: почему пользователи используют компонент вместо встроенных отслеживаемых слов?

4 лайка

Я обнаружил две основные проблемы со встроенными отслеживаемыми словами:

  • нельзя добавлять сложные регулярные выражения: возникает ошибка «Слово слишком длинное (максимум 100 символов)»;
  • нельзя использовать произвольные символы в качестве границ слов, в частности знак подчеркивания;
  • также невозможность редактировать правила или менять порядок их выполнения не совсем идеальна.

В PR для компонента границы слов вынесены на уровень пользователя, и проблем с длинными регулярными выражениями нет (за исключением невозможности использовать символ |, что также решено в этом PR).

В остальном отслеживаемые слова работают отлично, и если эти проблемы будут устранены в ядре, я только за.

Создал отдельный пост по ссылке Auto-Linkify Words - #216 by md-misko. Не уверен, можно ли считать это багами:

Следящие слова не учитывают Unicode: они рассматривают все символы Unicode как границы слов (при использовании \b, но это, видимо, ожидаемо).

И ещё несколько моментов (прогнал несколько тестовых случаев через «следящие слова» и нашёл эти два):

  • Следящее слово "\bid\(d+)\b" является недопустимым регулярным выражением. (Да, но правило всё равно добавляется)
  • \bid\s?(\d+)\b → https://example.com/id$1 приводит к ссылке https://example.com/id%241 (вместо подстановки добавляется URL-кодированная $1)

Подстановка не поддерживается или это баг?

Нашёл ли кто-нибудь обходной путь для использования вертикальных черт | на данный момент? У меня есть некоторые регулярные выражения, где они критически важны.

Привет, спасибо за разработку этой замечательной темы, мне она очень понравилась! Не могли бы вы выпустить её для всех пользователей, а не только для администраторов?

GitHub - renato/discourse-imgify-words: тема для автоматического преобразования URL в изображения в Discourse, почти так же, как discourse-linkify-works

Привет,

Этот компонент темы, на который вы ссылаетесь, является моей адаптацией решения Сэма, которое я создал как обходной путь для задачи, описанной вами в другой теме.

Это простые компоненты темы, которые лишь меняют способ отображения определённых слов в посте (у Сэма конкретные слова преобразуются в ссылки, у меня — в изображения) на основе настроек компонента темы, которыми управляют только администраторы.

Описанную вами функцию невозможно реализовать в рамках компонента темы. Для этого потребуется плагин, который будет хранить в базе данных набор пар (слово, URL изображения) для каждого пользователя, а преобразование слова в изображение должно выполняться на стороне сервера при формировании отформатированного содержимого поста (в виде HTML). Компонент темы не может этого сделать, так как это только фронтенд-код (код, выполняемый на стороне клиента). Если вы решите нанять кого-то для выполнения этой работы, критически важно, чтобы исполнитель понимал эти детали.

Это выходит за рамки данного компонента темы и потребует гораздо более сложной работы. Рекомендую опубликовать подробное описание того, как вы хотите, чтобы эта функция работала, в канале Marketplace. Там вы сможете найти специалиста с опытом работы с внутренним устройством Discourse, который сможет вам помочь.

Спасибо, что сообщили. Я добавлю это в соответствующую категорию и обсудю.

Это уже не раз поднималось в этой теме, но я хочу уточнить ещё раз: есть ли способ ограничить это определённой категорией или исключить некоторые категории? Я хотел бы использовать это в нашей категории для новичков, чтобы разместить ссылки на все основные термины, которые нужно знать новым участникам, но в других разделах они будут просто раздражать опытных пользователей. Спасибо!

3 лайка

Я обнаружил досадное ограничение: для регулярного выражения $1 подставляется ровно один раз.

Пример

/foo-([0-9a-f]+)/,https://target.example/foo/$1/foo-$1

Ожидаемый результат

ключевое слово ссылка
foo-abcd https://target.example/foo/abcd/foo-abcd

Фактический результат

ключевое слово ссылка
foo-abcd https://target.example/foo/abcd/foo-$1

Проблема с отслеживаемыми словами в том, что каждое упоминание отслеживаемого слова в сообщении создаёт ссылку. Это превращается в хаос.

P.S. Скажите это три раза быстро. :grin:

Если быть точным, слово заменяется один раз в каждой строке, а не один раз во всём посте. :slight_smile:

Жаль, что это не так, Койн, но в моей установке этого нет. :frowning:

Вот как это работает на моём тестовом экземпляре:

:thinking:

Посмотрите это…

Моё правило:

Результат:

@Canapin вы упустили мою проблему: дело не в повторяющихся словах, а в многократной замене шаблона для одного слова: в URL шаблон, подлежащий замене, встречается дважды.

Поскольку опция замены шаблона /g по умолчанию включена в плагине, она должна применяться ко всем вхождениям $1 в замене, а не только к первому.

Это отличается от случая, когда ключевое слово встречается несколько раз в предложении, строке или абзаце. Замена должна учитывать несколько вхождений выделенного фрагмента.

1 лайк

Я говорил о компоненте linkify слова, а не о функции отслеживаемых слов :slight_smile:

@hellekin, спасибо за уточнение :+1:

Я отвечал Сэму насчёт отслеживаемых слов. :grin:

Хорошо знать, что linkify обрабатывает только одно, но хотелось бы по одному на пост. Возможно, сегодня попробую это применить: когда отслеживаемые слова находят совпадение, это иногда становится невыносимым.

1 лайк