package cbt.plugins.scalatex.runtime import scalatags.Text.TypedTag import scalatags.Text.all._ import cbt.eval.Eval import java.net._ import java.io._ import org.cvogt.scala._ object hl extends scalatex.site.Highlighter object `package`{ def comment(any: =>Any): Unit = () def plain = span(fontFamily:="monospace") def highlight(code: String) = raw( """
""" ++ code.stripIndent.trim ++ "
" )
def layout: SeqFrag[Frag] => String => String = { contents => path =>
import scalatex._
import scalatags.Text.tags2._
import java.nio.file.{Paths, Files}
import scalatags.stylesheet._
val parts = path.split(File.separator)
val base = ("../" * (parts.size - 1)).mkString
val classes = parts.inits.toList.reverse.drop(1).map( parts => "path-" ++ parts.mkString("-") ).mkString(" ")
html(
head(
link(rel:="stylesheet", `type`:="text/css", href := base+"style.css")
),
body(
`class` := classes,
raw("\n"), contents, raw("\n")
)
).render
}
}
class repl(classLoader: ClassLoader, dependencyClasspath: java.io.File*) { repl =>
private val eval = new Eval(){
override lazy val impliedClassPath: List[String] = dependencyClasspath.map(_.toString).to
override def classLoader = repl.classLoader
}
/**
* repl session, inspired by tut.
*
* Example: code="1 + 1" returns
* "scala> 1 + 1
* res0: Int = 2"
*/
def apply(code: String) = {
// adapted from https://github.com/olafurpg/scalafmt/blob/a12141b5ce285a60886abab0d96044c617e20b51/readme/Readme.scala
import scala.meta._
import scala.util._
val expressions = s"{$code}".parse[Stat].get.asInstanceOf[Term.Block].stats
val output = Try(eval[Any](code)) match {
case Success( value ) => "res0: " ++ value.getClass.getName ++ " = " ++ (value match {
case v: String => "\"" ++ v ++ "\""
case other => other.toString
})
case Failure( e ) => e.getMessage
}
val lineSeparator = String.format("%n")
val prefix = code.lines.filterNot("\t ".contains).mkString(lineSeparator).commonLinePrefix
val result = (
expressions
.map(prefix ++ _.toString)
.map("scala> " ++ _.stripIndent.prefixLines(" ").trimLeft)
.mkString("\n")
++
"\n" ++ output.trim
)
hl.scala(result)
}
}