Проблема с RewriteRule
s заключается в том, что они гнездятся слишком глубоко. То есть после запуска правила добавления атрибутов в <tr>
его невозможно остановить. (По крайней мере, у меня это не сработало.) Однако я нашел рекурсивное решение, которое работает для меня. Кроме того, до тех пор, пока находится a <tbody>
внутри, рекурсия остановится рано. Если нет, у нас может быть проблема ...
abstract class Loop {
val stream_iter = Stream.continually(elems.toStream).flatten.iterator
def next = stream_iter.next
def elems: Seq[String]
}
class Cycle extends Loop { override def elems = List("odd", "even") }
// Call this when in <tbody>
def transformChildren(sn: Seq[Node]): Seq[Node] = {
// Start a new cycle
val cycle = new Cycle
sn.map{ node => node match {
case Elem(prefix, "tr", att, scope, ch @ _*) =>
Elem(prefix, "tr", att, scope, ch:_*) % Attribute(None, "class", Text(
List(att.get("class").getOrElse("").toString, cycle.next).reduceLeft(_+" "+_).trim
), Null)
case other => other
}
}
}
// Look for first <tbody>, transform child tr elements and stop recursion
// If no <tbody> found, recurse
def recurse(sn: NodeSeq): NodeSeq = sn.map{ node =>
node match {
case Elem(prefix, "tbody", att, scope, ch @ _*)
=> Elem(prefix, "tbody", att, scope, transformChildren(ch):_*)
case Elem(prefix, label, att, scope, ch @ _*)
=> Elem(prefix, label, att, scope, recurse(ch):_*)
case other => other
}
}
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><table><tbody><tr><td>Neither this.</td></tr></tbody></table></td><td>r2c2</td>
</tr>
<tr>
<td>r3c1</td><td>r3c2</td>
</tr>
</tbody>
</table>
println(recurse(code))
Дает:
<table>
<thead><tr><td>Don’t</td><td>transform this</td></tr></thead>
<tbody>
<tr class="otherclass odd">
<td>r1c1</td><td>r1c2</td>
</tr>
<tr class="even">
<td><table><tbody><tr><td>Neither this</td></tr></tbody></table></td><td>r2c2</td>
</tr>
<tr class="odd">
<td>r3c1</td><td>r3c2</td>
</tr>
</tbody>
</table>