All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ilcali.lmxml-core_2.10.0.1.3.source-code.converters.scala Maven / Gradle / Ivy

package lmxml

trait LmxmlConvert[A] extends (Seq[ParsedNode] => A)

trait SinglePass[A] extends LmxmlConvert[Seq[A]] {
  def single(node: ParsedNode): A

  def apply(nodes: Seq[ParsedNode]): List[A] = nodes.headOption match {
    case Some(n) => single(n) :: apply(nodes.tail)
    case None => Nil
  }
}

case class XmlFormat(width: Int, step: Int) extends (Seq[xml.Node] => String) {
  val printer = new xml.PrettyPrinter(width, step)

  def apply(nodes: Seq[xml.Node]) = printer.formatNodes(nodes)
}

object XmlConvert extends LmxmlConvert[xml.NodeSeq] {

  import xml._

  def apply(nodes: Seq[ParsedNode]): NodeSeq = nodes.headOption match {
    case None => Nil
    case Some(node) => single(node) ++ apply(nodes.tail)
  }

  def single(node: ParsedNode): xml.NodeSeq = node match {
    case EmptyNode(children) => apply(children)
    case LmxmlNode(name, attrs, children) =>
      val meta = attrs.map { attr =>
        Attribute(None, attr._1, Text(attr._2), Null)
      }.toList.sortWith(_.key < _.key)

      val input = if (meta.isEmpty) Null else meta.reduceLeft((i, m) => m.copy(i))

      Elem(null, name, input, TopScope, apply(children): _*)
    case TextNode(contents, unparsed, children) =>
      if (unparsed)
        Group(Unparsed(contents) ++ apply(children))
      else
        Group(Text(contents) ++ apply(children))
    case CommentNode(children) =>
      Group(Unparsed("\n\n"))
    case _ =>
      Elem(null, node.name, Null, TopScope, apply(node.children): _*)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy