mirror of
https://github.com/martinvonz/jj.git
synced 2024-12-24 12:48:55 +00:00
d2667c52ec
Because of changes to ImageMagick, the previous demos update increased the png file sizes significantly. This is the fix.
77 lines
3.4 KiB
Bash
Executable file
77 lines
3.4 KiB
Bash
Executable file
#!/bin/bash
|
|
set -euo pipefail
|
|
. "$(dirname "$0")"/setup_standard_config.sh
|
|
|
|
# NOTE ON TOOLS: the only two nice tools I'm aware of that support our use-case
|
|
# (non-animated svgs) are https://github.com/slowli/term-transcript and
|
|
# https://github.com/FHPythonUtils/AnsiToImg. They have slightly different
|
|
# limitations and advantages. If one of them stops being developed, we could
|
|
# look at the other one.
|
|
#
|
|
# AnsiToImg can also generate PNGs, but that is currently harder to setup than
|
|
# `magick`. `magick` supports different backends. I do not completely
|
|
# understand them. On Debian, it did not work well without `sudo apt install
|
|
# inkscape`. It's unclear to me whether `magick` used Inkscape or one of its
|
|
# dependencies. Inkscape can be also used manually for SVG -> PNG conversion.
|
|
which term-transcript > /dev/null \
|
|
|| (echo '`term-transcript` must be installed with e.g.'\
|
|
'`cargo binstall term-transcript-cli`.' \
|
|
'See also https://github.com/slowli/term-transcript' >&2;
|
|
false)
|
|
which magick > /dev/null \
|
|
|| echo '`magick` from ImageMagick needs to be installed to create pngs.' \
|
|
'Only svgs will be created.' >&2
|
|
|
|
echo "jj --version: (set PATH to change)"
|
|
jj --version
|
|
|
|
# Make `jj` wrap text as opposed to `term-transcript`. `term-transcript` wraps
|
|
# at 80 columns. Also, 80 seems to be the maximum number of columns that's
|
|
# somewhat readable on mobile devices.
|
|
#
|
|
# Note that `bash` likes to reset the value of $COLUMNS, so we use a different
|
|
# variable here that is interpreted by `run_command()` in `helpers.sh`.
|
|
RUN_COMMAND_COLUMNS=80
|
|
export RUN_COMMAND_COLUMNS
|
|
|
|
run_script_through_term_transcript_and_pipe_result_to_stderr() {
|
|
script="$1"
|
|
script_base="${script%.sh}"
|
|
script_base="${script_base#demo_}"
|
|
outfile=$(mktemp --tmpdir "$script_base"-output-XXXX.ansi)
|
|
# We use `term-transcript capture` instead of `term-transcript exec` so that
|
|
# we can show the output of the script via `tee`.
|
|
(bash "$script" || (echo "SCRIPT FAILED WITH EXIT CODE $?"; false)) 2>&1 | \
|
|
tee "$outfile"
|
|
term-transcript capture \
|
|
--no-inputs --pure-svg --palette powershell \
|
|
--font "Fira Code, Liberation Mono, SFMono-Regular, Consolas, Menlo" \
|
|
--out "$script_base".svg "$script_base" < "$outfile"
|
|
# The default font choice term-transcript would make is:
|
|
# SFMono-Regular, Consolas, Liberation Mono, Menlo
|
|
# We add the fonts that were checked and seem to contain all the relevant
|
|
# unicode in front.
|
|
rm "$outfile"
|
|
}
|
|
|
|
for script in "$@"; do
|
|
run_script_through_term_transcript_and_pipe_result_to_stderr "$script" 2>&1
|
|
# By default, 1 SVG unit becomes 1 pixel. The term-transcript output
|
|
# defaults to 720 SVG units width.
|
|
#
|
|
# `-background black` is important because the SVGs use transparency to make
|
|
# rounded corners, and the transparent portion becomes white by default.
|
|
# TODO(ilyagr): Figure out if `magick` can make PNGs have transparency.
|
|
#
|
|
# `-resize 100%` is a no-op. `-resize 700x10000`` would make the width 700 px
|
|
# and preserve aspect ratio.
|
|
#
|
|
# (!) The order of operations is important and confusingly different from what
|
|
# would happen to a PNG with transparency. If editing this, it might help to
|
|
# look at https://github.com/ImageMagick/ImageMagick/discussions/7600
|
|
which magick > /dev/null \
|
|
&& magick -background black "$script_base".svg \
|
|
-type Palette -colors 63 -resize 100% \
|
|
"$script_base".png \
|
|
|| true
|
|
done
|