def css(s: String): Attribute = new Attribute("style", s) def name(n: String): Attribute = new Attribute("name", n) def value(v: String): Attribute = new Attribute("value", v) def placeholder(p: String): Attribute = new Attribute("placeholder", p) def rowspan(n: Int): Attribute = new Attribute("rowspan", n.toString)
val nav = new Operator("nav") val header = new Operator("header") val footer = new Operator("footer") val main = new Operator("main") val fieldset = new Operator("fieldset") val button = new Operator("button")
val table = new Operator("table") val th = new Operator("th") val tr = new Operator("tr") val td = new Operator("td")
def selection(i: Params.Key, selected: Option[String], opts: XML.Body): XML.Elem = { def sel(elem: XML.Tree): XML.Tree = {
selected match { case Some(value) => val Value = new Properties.String("value")
elem match { case XML.Elem(Markup("optgroup", props), body) =>
XML.Elem(Markup("optgroup", props), body.map(sel)) case e@XML.Elem(Markup("option", Value(v)), _) if v == value =>
e + ("selected" -> "selected") case e => e
} case None => elem
}
}
def is_empty_group(elem: XML.Tree): Boolean = elem match { case XML.Elem(Markup("optgroup", _), body) if body.isEmpty => true case _ => false
}
val default = if (selected.isEmpty) List(option("", "") + ("hidden" -> "hidden")) else Nil
select(i, default ::: opts.filterNot(is_empty_group).map(sel))
}
def parse(body: Bytes): List[Data] = { /* Seq for text with embedded bytes */ caseclass Seq(text: String, bytes: Bytes) { def split_one(sep: String): Option[(Seq, Seq)] = { val text_i = text.indexOf(sep) if (text_i >= 0 && sep.nonEmpty) { val (before_text, at_text) = text.splitAt(text_i) val after_text = at_text.substring(sep.length)
// text might be shorter than bytes because of misinterpreted characters var found = false var bytes_i = 0L while (!found && bytes_i < bytes.size) { var sep_ok = true var sep_i = 0 while (sep_ok && sep_i < sep.length) { if (bytes.char(bytes_i + sep_i) == sep(sep_i)) {
sep_i += 1
} else {
bytes_i += 1
sep_ok = false
}
} if (sep_ok) found = true
}
val before_bytes = bytes.slice(0, bytes_i) val after_bytes = bytes.slice(bytes_i + sep.length, bytes.size)
def elem(s: String): Elem = if (s.contains('/')) error("Illegal separator in " + quote(s)) else { for {
c <- s if Symbol.is_ascii_blank(c)
} error("Illegal blank character " + c.toInt + " in " + quote(s))
s match { case Value.Int(i) => new List_Elem(i) case s => new Nested_Elem(s)
}
}
def elem(i: Int): List_Elem = if (i < 0) error("Illegal list element") elsenew List_Elem(i)
def num: Option[Int] =
rep match { case (e: Key.List_Elem) :: _ => Some(e.rep) case _ => None
}
def get(key: Key): Option[Key] = if (!rep.startsWith(key.rep)) None else { val rest = rep.drop(key.rep.length) if (Key.is_blank(rest)) None else Some(Key(rest))
}
def print = rep.map(_.print).mkString("/")
overridedef toString: String = print overridedef equals(that: Any): Boolean =
that match { case other: Key => rep == other.rep case _ => false
} overridedef hashCode(): Int = rep.hashCode()
}
def indexed[A, B](key: Key, xs: List[A], f: (Key, A) => B): List[B] = for ((x, i) <- xs.zipWithIndex) yield f(key + i, x)
object Data { def from_multipart(parts: List[Multi_Part.Data]): Data = { val files = parts.collect { case f: Multi_Part.File => f } val params =
parts.collect { case Multi_Part.Param(name, value) => Key.explode(name) -> value } val file_params = files.map(file => Key.explode(file.name) -> file.file_name) val file_files = files.map(file => Key.explode(file.name) -> file.content)
new Data(
SortedMap.from(params ++ file_params)(Key.Ordering),
SortedMap.from(file_files)(Key.Ordering))
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.