Skip to content

Instantly share code, notes, and snippets.

@lihaoyi
Last active June 13, 2016 14:03
Show Gist options
  • Select an option

  • Save lihaoyi/f0545f714d105f30afd5f4191997e3ea to your computer and use it in GitHub Desktop.

Select an option

Save lihaoyi/f0545f714d105f30afd5f4191997e3ea to your computer and use it in GitHub Desktop.

Revisions

  1. lihaoyi revised this gist Jun 13, 2016. 1 changed file with 5 additions and 0 deletions.
    5 changes: 5 additions & 0 deletions ansiToHtml.scala
    Original file line number Diff line number Diff line change
    @@ -62,3 +62,8 @@ def ansiToHtml(ansiInput: String): Frag = {
    wrapped.toVector
    }

    // Example Usage
    @ ansiToHtml(Console.RED + "Hello" + Console.RESET + " " + Console.BLUE + "World").render
    res6: String = """
    <span style="color: #c0392b;">Hello</span><span> </span><span style="color: #2980b9;">World</span>
    """
  2. lihaoyi created this gist Jun 13, 2016.
    64 changes: 64 additions & 0 deletions ansiToHtml.scala
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,64 @@
    import scalatags.Text.all._
    import collection.mutable
    // http://flatuicolors.com/
    val red = "#c0392b"
    val green = "#27ae60"
    val yellow = "#f39c12"
    val blue = "#2980b9"
    val magenta = "#8e44ad"
    val cyan = "#16a085"
    val black = "#000"
    val white = "#fff"

    val foregrounds = Map[fansi.Attr, String](
    fansi.Color.Black -> black,
    fansi.Color.Red -> red,
    fansi.Color.Green-> green,
    fansi.Color.Yellow-> yellow,
    fansi.Color.Blue -> blue,
    fansi.Color.Magenta-> magenta,
    fansi.Color.Cyan -> cyan,
    fansi.Color.White -> white
    )
    val backgrounds = Map[fansi.Attr, String](
    fansi.Back.Black -> black,
    fansi.Back.Red -> red,
    fansi.Back.Green-> green,
    fansi.Back.Yellow-> yellow,
    fansi.Back.Blue -> blue,
    fansi.Back.Magenta-> magenta,
    fansi.Back.Cyan -> cyan,
    fansi.Back.White -> white
    )
    def ansiToHtml(ansiInput: String): Frag = {
    val wrapped = mutable.Buffer.empty[scalatags.Text.Frag]
    val parsed = fansi.Str(ansiInput, errorMode = fansi.ErrorMode.Strip)
    val chars = parsed.getChars
    val colors = parsed.getColors

    var i = 0
    var previousColor = 0
    val snippetBuffer = new mutable.StringBuilder()

    def createSnippet() = {
    val foreground = fansi.Color.lookupAttr(previousColor & fansi.Color.mask)
    val background = fansi.Back.lookupAttr(previousColor & fansi.Back.mask)
    val snippet = snippetBuffer.toString
    snippetBuffer.clear()
    wrapped.append(span(
    foregrounds.get(foreground).map(color := _),
    backgrounds.get(background).map(backgroundColor := _),
    snippet
    ))
    }

    while(i < parsed.length){
    if (colors(i) != previousColor && snippetBuffer.nonEmpty) createSnippet()
    previousColor = colors(i)
    snippetBuffer += chars(i)
    i += 1
    }
    createSnippet()
    wrapped.toVector
    }