scala: добавление атрибутов (нечетных и четных строк) в таблицу xml - PullRequest
0 голосов
/ 05 июня 2010

В приложении 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))

Ответы [ 2 ]

3 голосов
/ 07 июня 2010

Есть два способа выполнения альтернативных классов строк таблицы:

1 - Используйте плагин jQuery colorize

2 - Используйте zipWithIndex при циклическом просмотре ваших данных для создания таблицы:

doQuery.zipWithIndex.map{ case (log, i) => {  
    <tr class={if (i % 2 == 0) "even" else "odd"}>  
        <td>Data</td>  
    </tr>  
}  
1 голос
/ 07 июня 2010

Проблема с 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>
...