Implement iterm image protocol for more customization
This commit is contained in:
parent
3ea943b1c4
commit
20d8d43048
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue