Как бы вы пометили (с помощью тегов html) группы в шаблонах, не стирая несгруппированные шаблоны? - PullRequest
2 голосов
/ 28 апреля 2020

Я создаю одностраничное веб-приложение, которое дает результаты в реальном времени для lua -паттернов. Я использую vue magi c и fengari js / lua interop, чтобы автоматически запускать функцию на экране каждый раз, когда сопоставляется текст или шаблон, который обновляется. Цель функции - выделить соответствующий текст.

Соответствующим кодом lua здесь является функция, и первое, о чем я подумал, это просто gsub.
string.gsub(text_to_test, pattern, function(m) return "<mark>"..m.."</mark>" end)
Это отлично работает - для шаблонов, в которых нет групп. Например: %u%l
Тестовая строка: This is your sandbox шаблон: %s. Результат: This<mark> i</mark>s<mark> y</mark>our<mark> s</mark>andbox
Но что, если кто-то захочет проверить шаблон с группой, например: %s(.) (или хуже: Несколько групп!)
Одна и та же тестовая строка, шаблон теперь: %s(.) Результат: This<mark>i</mark>s<mark>y</mark>our<mark>s</mark>andbox
При работе функции символ в группе передается как m, а возвращаемая строка заменяет весь шаблон %s(.), пробел и символ. Это бесполезно!
Однако мы знаем, что "%0" в gsub представляет весь матч, а не разные группы. План: внутри каждого всего матча размечать индивидуализированные группы.
string.gsub(s, p, function(m) local w = "%0" return string.gsub(w, m, function(a) return "<mark>"..a.."</mark>" end) end)
Тестовая строка: This is your sandbox pattern: %s. Результат: This%0s%0our%0andbox

Проблема: На ссылку %0 можно ссылаться, только если она непосредственно находится в возвращаемой строке. Также я не думаю, что это сработает, даже если бы я мог ссылаться на %0.

Желаемый результат:
Для тестовой строки Quick Brown Fox и шаблона %s(%u)
, производить Quick<mark> B</mark>rown<mark> F</mark>ox

Понятия не имею, что это за решение. Что бы вы порекомендовали?

1 Ответ

0 голосов
/ 28 апреля 2020

Оберните весь шаблон, который они вам дают, в скобки, так что это все первая группа, независимо от того, какие группы в ней:

string.gsub(text_to_test, "("..pattern..")", function(m) return "<mark>"..m.."</mark>" end)
...