HTMLタグを生成するのに、Stringクラスではなく、ScalaのXMLクラスを使って行う方法を試してみる。
Queueクラス生成の記述がNewで書くとエラーとなってしまった。
Queue.empty[Node]と書くのが正しい。
XMLの出力で適当に改行を入れたいのでノードの記述で改行してみた。
package SeeDo import scala.collection.immutable._ import scala.xml._ import scala.xml.transform.{RewriteRule, RuleTransformer} class GenHtml { var tableElem = Queue.empty[Any] // テーブル化する要素を格納 // TABLEタグ化 def tagTable(idName:String):Node = { // var nodes = new Queue[Node] var nodes = Queue.empty[Node] tableElem.foreach{(e) => val ret = e match{ //配列なら1行分として case e:Array[String] => nodes += addTdElem(e); // 文字なら1文字1行分として case e:String => nodes += <tr><td>{e}</td> </tr>; case _ => nodes += <tr><td/></tr> // 空行として } } <TABLE id={idName}>{nodes} </TABLE> } // 文字を1行分として def addTableElem(eml:String):Any = { tableElem += eml tableElem } // 配列なら要素を1行分として def addTableElem(eml:Array[String]):Any = { tableElem += eml tableElem } // <TR><TD>..</TD>...</TR>化 def addTdElem(eml:Array[String]):Node = { var nodes = Queue.empty[Node] eml.foreach{(x) => nodes += <td>{x}</td>} <tr>{nodes}</tr> } }
このプログラムをテストするためのコードがこれです。
X藤さんは1行ずつにして、Y田さんは5名を一行にしてタグを付ける。
package SeeDo object TestGenHtml { def main(args : Array[String]) : Unit = { val html = new GenHtml val emp = Array ("加藤","安藤","斉藤","伊藤","後藤") val emp2 = Array ("大田","伊与田","水田","神田","杉田") //従業員1名を1行 emp.foreach{(ename) => html.addTableElem(ename) } //従業員複数を1行 html.addTableElem(emp2) //TABLEタグ化 println(html.tagTable("blue")) } }
実行すると以下のようにデータがTABLEタグ化されて出力されます。
<TABLE id="blue"><tr><td>加藤</td> </tr><tr><td>安藤</td> </tr><tr><td>斉藤</td> </tr><tr><td>伊藤</td> </tr><tr><td>後藤</td> </tr><tr><td>大田</td><td>伊与田</td><td>水田</td><td>神田</td><td>杉田</td></tr> </TABLE>
はじめて、XMLクラスを使ってプログラムを書いてみましたが、もっといい書き方があるような気がします。
余白
Scalaコードの中にWEBページ用にHTMLタグをそのままテンプレートとして記述して、ScalaのXMLクラスでHTMLタグを処理してページを生成するということを考えてみたのですが、HTMLはWebデザイナが作る方がやっぱりよくて、Scalaプログラマーが管理するものではないと思う次第です。だからといって、StrutsのようにTaglib化するのも隠ぺいしすぎているように思えるし。そうなると、デザイナが作ったページデザインとScalaのコードはどうやってマージするのがいいのでしょう。難しい問題です。
コメントを残す
コメントを投稿するにはログインしてください。