私が解決しようとしている問題は次のとおりです。ユーザーは、Web サイトで何かのカスタム 4 文字のタイトルを表示できますNEWS
。ユーザーがFont Awesomeからもアイコンを指定できる方法のサポートを追加したいと考えています。
たとえば、ユーザーが書き込み、それが適切な Font Awesome アイコンで表示される[camera]pic
ように変換されます。<i class="icon-camera"></i>pic
ただし、マークアップをエスケープできるようにしたいので、(たとえば)ではなくf[[x]
として出力されます。テキスト プレースホルダーがネストされることはありませんが、隣接している可能性があります (例: )。正規表現*を使用してこれを解決するのに苦労しましたが、正規表現はおそらく問題の適切な解決策ではないという結論に達しました。f[x]
f[<i class="icon-x"></i>
[star][star][star][star]
Javascript と Ruby できれいに実装できる、この種の問題に対する簡単な解決策はありますか? または、これらの種類のテキスト プレースホルダーを表す別の簡単な方法はあります${camera}pic
か? それとも、一度に1文字ずつ手で解析する必要がありますか?
* 私が試した正規表現については:\[(\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]
これはケースに失敗します。