From 20d8d430488333700d4aca0219ebf12379d5ffcc Mon Sep 17 00:00:00 2001 From: Alexander Gehrke Date: Sat, 6 Mar 2021 04:43:53 +0100 Subject: [PATCH] Implement iterm image protocol for more customization --- copret/src/slides.scala | 8 +++----- copret/src/terminal.scala | 14 +++++++++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/copret/src/slides.scala b/copret/src/slides.scala index c5d6eaa..95e6a31 100644 --- a/copret/src/slides.scala +++ b/copret/src/slides.scala @@ -60,9 +60,7 @@ object Presentation { case PauseKey => waitkey(Keymap.empty) case Pause(msec) => Thread.sleep(msec) case incMd @ IncludeMarkdown(_) => println(incMd.markdownBlock()) - case Image(file) => - try { %("imgcat", file.toString)(pwd) } - catch { case _: InteractiveShelloutException => println(s"Image missing: $file") } + case Image(file, width, height, keepAspect) => print(Terminal.showImage(file, width, height, keepAspect)) case cmd: TypedCommand[_] => cmd.show() case Silent(actions) => actions() case Group(slides) => slides.foreach(executeSlide(p, pos)) @@ -84,7 +82,7 @@ object Presentation { case cmd: TypedCommand[_] => cmd.force() case Group(slides) => slides.foreach(executeSilent(p, pos)) 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) } } @@ -95,7 +93,7 @@ case class Paragraph(contents: fansi.Str) extends Slide case class IncludeMarkdown(path: Path) extends Slide { 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 class Pause(millisec: Long) extends Slide case object PauseKey extends Slide diff --git a/copret/src/terminal.scala b/copret/src/terminal.scala index ddf4bb9..7214b25 100644 --- a/copret/src/terminal.scala +++ b/copret/src/terminal.scala @@ -1,5 +1,5 @@ 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.reader.LineReaderBuilder @@ -46,6 +46,18 @@ object Terminal { } 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 {