24.02.2009Регулярные выражения: радость победы 2 :)
Ещё один бонус, который я ожидал от этого блога, и который уже успел получить — это обратная связь. После разговора с Лёшей Кукушкиным было решено модифицировать задачу из предыдущего поста так, чтобы стало удобнее.
Задача
- Ввести дополнительный тэг для кода
- Печатать код внутри тэга так, как он должен выглядеть (прошлый раз пришлось шаманить)
- Иметь возможность более ли менее безнаказанно употреблять сами тэги в тексте
Решение
Итак, для кода будем использовать тэг [code]...[/code]. Для того, чтобы не провоцировать преобразование кода там, где не нужно, будет использовать знак «/». (То есть в этом абзаце жирным на самом деле написано «/[code]...[/code]»)
Так же используем стандартный метод rails для приведения в порядок того, что находится внутри тэга [code]. Результат выглядит вот так:
def lonelyelk_format(text)
res = "<p>" + text.to_s.dup
codes = []
res.gsub!(//[^\/]\[code\]([\s\S]+?)\[\/code\]/) do |s|
codes.push(s.gsub(/(^[^\/]\[code\]|\[\/code\]$)/, ""))
"#{s[0,1]}[code#{codes.length - 1} /]"
end
res.gsub!(/\r\n?/, "\n")
res.gsub!(/\n*\[h\]\n*/, "</p><h2>")
res.gsub!(/\n*\[\/h\]\n*/, "</h2><p>")
res.gsub!(/\n\n+/, "</p><p>")
res.gsub!(/\n(?=\[code\d+\s\/\])/, "</p><p>")
res.gsub!(/(\[code\d+\s\/\])\n/, '\1</p><p>')
res.gsub!("\n", "<br />")
res += "</p>"
res.gsub!(/<p>\[code\d+\s\/\]<\/p>/) do |s|
"<pre><code>#{h codes[s.gsub(/\D+/, '').to_i]}</code></pre>"
end
res.gsub!("<p></p>", "")
res.gsub!("//[", "[")
res
end
Итоги
По результатам могу сказать, что код ещё можно улучшать и дорабатывать для разных целей. Чем, безусловно, мне ещё предстоит заниматься. Но писать об этой задаче больше не буду. Есть много другого интересного, о чём можно поговорить.