スキンのパースとスレッドの表示-解決編

ThousandのスキンはHTMLファイルで、いろいろ妙なキーワードを使って置換したり繰り返したりする用のまあテンプレートである。
例えばレスの名前を表示したい時は、@(name)と書いておくと、表示の時に名前欄に置換されるわけだ。
しかし例えばである、スキンには@(name):@(mail)と書いてあって、名前欄に「@(mail)」と書かれていたらどうなるのか?Thousandはまず@(name)を実際の名前欄、@(mail)と置換して、その後@(mail)をメール欄と置換するために、名前欄に本来書いてあった「@(mail)」は表示されなくなってしまうのか?

実際にはこうしても、ちゃんと@(mail)と表示される。というのは、スレッドを表示する際には文字列置換を用いていないからである。スキンをパースする際に、@()に囲まれた部分とそれ以外の文字列は分離されて別々のNSArrayに収められ、表示の際には順次連結されていくようになっている。

じゃああれはどうなっているのか。「<!--@if ID:@(identifier)-->」という、IDがあればコメントが解除され、なければ消滅というあれは。

実はこちらに関しては、@(なんとか)連結後に、置き換えられなかった@(なんとか)を見つけてその周りの@ifコメントを削除するという方法をとっていた。というわけで、もし実際のIDの中に「@(なんとか)」という文字列があればそれは表示されなくなってしまう。しかし、@ifを使うのはIDやBeなどであり、名前欄やメール欄と違って好きな文字列を入れられるわけではないから妥協してこういう仕組みになっていた.

で、この問題を解決するために前回のエントリで書いたように、また部品を外して作りなおすようなことをやっていたんである。スレッド表示の際に一々文字列検索や置換をしなくなったので、原理上少し速くなっているかもしれないのだが、無視できるほどのものであろう。