在 Lift 应用程序中,我想添加一个特殊标签,该标签占据<tbody>
下一个表的一部分,并为每个标签添加odd
和even
类(例如) 。<tr>
当然是交替的。虽然我找到了一种为所有<tr>
标签添加另一个属性的方法,但仍然存在一些问题(参见下面的代码)。
首先,它不起作用。cycle.next
被调用的太频繁了,所以最后,一切都是odd
连续的。其他问题是代码不排除内部表(因此嵌套<tr>
也会被转换)并且它也会影响<thead>
表的一部分。
使此代码起作用的想法?(当然,如果已经有一个基于提升的解决方案——没有 jQuery——我会很感激地接受它。)
// Helper class for looping
class Loop(val strs: String*) {
val stream_iter = Stream.continually(strs.toStream).flatten.iterator
def next = stream_iter.next
}
val cycle = new Loop("even", "odd")
val rr = new RewriteRule {
override def transform(n: Node): Seq[Node] = n match {
// match any Elem
case elem : Elem => elem match {
// If it’s a <tr> do some further processing
case Elem(_, "tr", att @ _, _, _*) =>
elem % Attribute(None, "class", Text(
// add the attribute and concatenate with others
List(att.get("class").getOrElse("").toString, cycle.next).reduceLeft(_+" "+_).trim
), Null) toSeq
case other => other
}
case other => other
}
}
val rt = new RuleTransformer(rr)
val code = <table>
<thead><tr><td>Don’t</td><td>transform this</td></tr></thead>
<tbody>
<tr class="otherclass">
<td>r1c1</td><td>r1c2</td>
</tr>
<tr>
<td>r2c1</td><td>r2c2</td>
</tr>
<tr>
<td>r3c1</td><td>r3c2</td>
</tr>
</tbody>
</table>
println(rt(code))