Implement iterm image protocol for more customization

This commit is contained in:
Alexander Gehrke 2021-03-06 04:43:53 +01:00
parent 3ea943b1c4
commit 20d8d43048
2 changed files with 16 additions and 6 deletions

View file

@ -60,9 +60,7 @@ object Presentation {
case PauseKey => waitkey(Keymap.empty) case PauseKey => waitkey(Keymap.empty)
case Pause(msec) => Thread.sleep(msec) case Pause(msec) => Thread.sleep(msec)
case incMd @ IncludeMarkdown(_) => println(incMd.markdownBlock()) case incMd @ IncludeMarkdown(_) => println(incMd.markdownBlock())
case Image(file) => case Image(file, width, height, keepAspect) => print(Terminal.showImage(file, width, height, keepAspect))
try { %("imgcat", file.toString)(pwd) }
catch { case _: InteractiveShelloutException => println(s"Image missing: $file") }
case cmd: TypedCommand[_] => cmd.show() case cmd: TypedCommand[_] => cmd.show()
case Silent(actions) => actions() case Silent(actions) => actions()
case Group(slides) => slides.foreach(executeSlide(p, pos)) case Group(slides) => slides.foreach(executeSlide(p, pos))
@ -84,7 +82,7 @@ object Presentation {
case cmd: TypedCommand[_] => cmd.force() case cmd: TypedCommand[_] => cmd.force()
case Group(slides) => slides.foreach(executeSilent(p, pos)) case Group(slides) => slides.foreach(executeSilent(p, pos))
case lios @ LazyIOSlide(_, display) => executeSilent(p, pos)(lios.genSlide()) case lios @ LazyIOSlide(_, display) => executeSilent(p, pos)(lios.genSlide())
case Paragraph(_) | Image(_) | Clear | IncludeMarkdown(_) | Meta(_) => () case Paragraph(_) | Image(_,_,_,_) | Clear | IncludeMarkdown(_) | Meta(_) => ()
case _ => executeQuick(p, pos)(slide) case _ => executeQuick(p, pos)(slide)
} }
} }
@ -95,7 +93,7 @@ case class Paragraph(contents: fansi.Str) extends Slide
case class IncludeMarkdown(path: Path) extends Slide { case class IncludeMarkdown(path: Path) extends Slide {
def markdownBlock() = %%%("/usr/bin/mdcat", "--columns", (columns * 0.8).toInt.toString, path.toString)(pwd).block def markdownBlock() = %%%("/usr/bin/mdcat", "--columns", (columns * 0.8).toInt.toString, path.toString)(pwd).block
} }
case class Image(path: Path) extends Slide case class Image(path: Path, width: String = "100%", height: String = "100%", keepAspect: Boolean = true) extends Slide
case object Clear extends Slide case object Clear extends Slide
case class Pause(millisec: Long) extends Slide case class Pause(millisec: Long) extends Slide
case object PauseKey extends Slide case object PauseKey extends Slide

View file

@ -1,5 +1,5 @@
package de.qwertyuiop.copret package de.qwertyuiop.copret
import ammonite.ops.{Path, ShelloutException, pwd, %, %%} import ammonite.ops.{Path, ShelloutException, pwd, read, %, %%}
import org.jline.terminal.TerminalBuilder import org.jline.terminal.TerminalBuilder
import org.jline.reader.LineReaderBuilder import org.jline.reader.LineReaderBuilder
@ -46,6 +46,18 @@ object Terminal {
} }
else result else result
} }
def isTmux = sys.env.contains("TMUX") || sys.env("TERM").startsWith("screen")
def osc = if (isTmux) "\u001bPtmux\u001b\u001b]" else "\u001b]"
def st = if (isTmux) "\u0007\u001b\\" else "\u0007"
def showImage(img: Path, width: String = "100%", height: String = "100%", keepAspect: Boolean = true) = {
import java.util.Base64
val image = Base64.getEncoder.encodeToString(read.bytes(img))
val aspect = if(keepAspect) 1 else 0
s"${osc}1337;File=inline=1;width=$width;height=$height;preserveAspectRatio=$aspect:$image$st"
}
} }
private[copret] trait TerminalSyntax { private[copret] trait TerminalSyntax {