Функція для вибіркової фільтрації

назад до списку постів

Для блогу я вирішив не використовувати готовий движок і почав писати свій. В теорії це викличе багато проблем. Одну з проблем хочу описати.

Движок пишу на Ruby on Rails між іншим.

Є задача - зробити підсвічування коду. Я використовую форматування simple_format для тексту яке повністю влаштовує в плані форматування. Є блоки з кодом (теги pre) для яких потрібно зробити підсвічування і яким simple_format просто заважає (вставляє зайві теги). Задача зводиться до вибіркової фільтрації тексту. Текст проходить через фільтр за винятком деяких нефільтрованих блоків (тегів pre).

Вибраний алгоритм вирішення задачі заключається в наступному

1. Блоки які не потрібно фільтрувати заміняєм унікальними текстовими значеннями. Самі блоки при цьому десь зберігаєм.
2. Фільтруєм текст через фільтр.
3. Заміняєм унікальні значення блоками тексту який був до цього.

Для опису блоку мені достатньо регулярного виразу.

Те що вийшло з даної задумки - невелике розширення класу String
Результат роботи функції далі, розширення - http://gist.github.com/425019

# Строка з текстом Регулярка Блок коду для заміни всього крім регіонів охоплених регулярним виразом

puts ("xxxxxxx<pre>xxxxxxxxx</pre>xxxxxxxxxx".without_matched_regions /<pre>(.*?)<\/pre>/m do |str|
  str.gsub("x", ":) ")
end)

Виводить

    :) :) :) :) :) :) :) >pre<xxxxxxxxx>/pre<:) :) :) :) :) :) :) :) :) :)

Як бачимо текст всередині тегу pre не змінився чого ми і добивались.

Зверніть увагу на //m в регулярному виразі. Це обов'язкова опція якщо тег pre буде вміщувати у собі символи нової строки.