in scala-interpreter/src/main/scala/org/apache/toree/kernel/interpreter/scala/ScalaDisplayers.scala [135:208]
private def displayRows(
rows: Array[Row],
fields: Option[Seq[String]] = None,
isTruncated: Boolean = false): (String, String) = {
if (rows.length < 1) {
return ("", "")
}
val lengths = Array.fill(rows(0).length)(3)
val cells = rows.map { row =>
row.toSeq.zipWithIndex.map {
case (value, pos) =>
val repr = value match {
case null => "NULL"
case binary: Array[Byte] =>
binary.map("%02X".format(_)).mkString("[", " ", "]")
case arr: Array[_] =>
arr.mkString("[", ", ", "]")
case seq: Seq[_] =>
seq.mkString("[", ", ", "]")
case map: Map[_, _] =>
map.map {
case (k: Any, v: Any) => s"$k -> $v"
}.mkString("{", ", ", "}")
case _ =>
value.toString
}
lengths(pos) = Math.max(lengths(pos), repr.length)
repr
}
}
fields match {
case Some(names) =>
names.zipWithIndex.foreach {
case (name, pos) =>
lengths(pos) = Math.max(lengths(pos), name.length)
}
case _ =>
}
var htmlLines = new mutable.ArrayBuffer[String]()
htmlLines
htmlLines += "<table>"
var lines = new mutable.ArrayBuffer[String]()
val divider = lengths.map(l => "-" * (l + 2)).mkString("+", "+", "+")
val format = lengths.map(l => s" %-${l}s ").mkString("|", "|", "|")
lines += divider
fields match {
case Some(names) =>
htmlLines += names.mkString("<tr><th>", "</th><th>", "</th></tr>")
lines += String.format(format, names:_*)
lines += divider
case _ =>
}
cells.foreach { row =>
htmlLines += row.mkString("<tr><td>", "</td><td>", "</td></tr>")
lines += String.format(format, row: _*)
}
if (isTruncated) {
val dots = Array.fill(lengths.length)("...")
htmlLines += dots.mkString("<tr><td>", "</td><td>", "</td></tr>")
lines += String.format(format, dots: _*)
}
htmlLines += "</table>"
lines += divider
(lines.mkString("\n"), htmlLines.mkString("\n"))
}