Здесь проблема, которую я пытаюсь решить: пользователь может отображать пользовательский заголовок с 4 символами для чего-то на веб-сайте, например. NEWS
. Я хочу добавить поддержку способа, которым пользователь может указывать значки из Font Awesome.
Я думал об использовании скобок, например. пользователь будет писать [camera]pic
, и это будет переведено на <i class="icon-camera"></i>pic
для отображения с соответствующим значком шрифта Awesome. Однако мне также хотелось бы избежать разметки, чтобы (например, f[[x]
был напечатан как f[x]
, а не f[<i class="icon-x"></i>
. Текстовые заполнители никогда не будут вложенными, но они могут быть смежными (например, [star][star][star][star]
). Я изо всех сил пытался решить эту проблему с помощью регулярных выражений * и пришел к выводу, что регулярные выражения, вероятно, не являются подходящим решением проблемы.
Есть ли простое решение этой проблемы, которое может быть реализовано в Javascript и Ruby? Альтернативно, существует ли еще один простой способ представить эти типы заполнителей текста, которые соответствуют моим последовательным и эскалационным требованиям (например, ${camera}pic
)? Или я должен разобрать его вручную, по одному символу за раз?
* Что касается регулярных выражений, которые я пробовал: \[(\w+)\]
прост, но соответствует, когда он не должен на f[[x]
. (\A|[^\[])\[(\w+)\]
проходит f[[x]
, но не выполняется для каждого другого заполнителя в [x][y][z]
.
Вот мои тестовые примеры. Предполагая простое преобразование замены заполнителя текста заполнителя с префиксом $
, тогда:
describe '#to_var' do
it { helper.to_var('abcd').should == 'abcd' }
it { helper.to_var('[foo][bar][baz]').should == '$foo$bar$baz' }
it { helper.to_var('[[x]').should == '[x]' }
it { helper.to_var('<[[x]>').should == '<[x]>' }
it { helper.to_var('<[x]>').should == '<$x>' }
end
Ближайшее регулярное выражение, которое я придумал, было:
icon_code_regex = %r(
(\A # beginning of string
| # or
[^\[]) # not a left bracket
\[ # literal left bracket
(\w+) # the good stuff
\] # literal right bracket
)x
str.gsub(icon_code_regex, '\1$\2').gsub('[[', '[')
который не работает в случае [foo][bar][baz]
.