2010年3月2日火曜日

[Scala] 文字列に含まれるURLをaタグにしてNodeSeqで返す

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Liftでbindする時にNodeSeqが必要だったので書いてみた。はじめ、Regex.findAllInとfor式のyieldでできるんじゃないかと試行錯誤してたが、再帰を使った方が簡単なことに気づいてこんな感じになった。

import scala.xml._
implicit def c2s(c: CharSequence): String = c.toString
val URLPATTERN = """http://[\d\w\-\./%?=#]+""".r
def linkURL(s: String): NodeSeq = URLPATTERN.findFirstMatchIn(s) match {
 case None => Text(s)
 case Some(m) =>
  <xml:group>{Text(m.before)}<a href={m.matched}>{m.matched}</a>{linkURL(m.after)}</xml:group>
}

使用例

scala> linkURL("aaaa http://pomu0325.blogspot.com/ bbbb http://twitter.com/pomu0325 cccc")
res21: scala.xml.NodeSeq = aaaa <a href="http://pomu0325.blogspot.com/">http://pomu0325.blogspot.com
/</a> bbbb <a href="http://twitter.com/pomu0325">http://twitter.com/pomu0325</a> cccc

0 件のコメント:

コメントを投稿