hrbrmstr's Daily Drop

Share this post

2022-07-18.01

dailyfinds.hrbrmstr.dev

2022-07-18.01

librsvg; icat; tv

boB Rudis
Jul 18, 2022
4
Share this post

2022-07-18.01

dailyfinds.hrbrmstr.dev

It looks like today is "Command Line Monday" (let's see if I can manage to consistently make that "a thing" each week).

In other news, I cannot guarantee a daily edition cadence this week as I'm on a ✈️ Monday & Friday + at a company off-site Tue-Thu.

Also, no section header images today as they would have broken email distribution since I have three example images for each utility embedded in each section.

(How Substack became the dominant newsletter platform with so many quirks and limitations is beyond me.)

librsvg

Librsvg [GH] is a high performance SVG-to-Cairo-surfaces rendering library. It has support for SVG 1.1 and SVG 2 formats. You've seen it in action each time you've viewed rendered SVGs on Wikipedia.

It has both C and Rust APIs, and is pretty simple to use from the handy command line tool rsvg-convert.

Convert SVG files to other image formats

USAGE:
    rsvg-convert [FLAGS] [OPTIONS] [FILE]...

FLAGS:
    -?, --help                  Prints help information
    -a, --keep-aspect-ratio     Preserve the aspect ratio
        --keep-image-data       Keep image data
        --no-keep-image-data    Do not keep image data
    -u, --unlimited             Allow huge SVG files
    -v, --version               Prints version information

OPTIONS:
    -l, --accept-language <languages>    Languages to accept, for example "es-MX,de,en" [default uses language from the
                                         environment]
    -b, --background-color <color>       Set the background color using a CSS color spec
    -i, --export-id <object id>          SVG id of object to export [default is to export all objects]
    -f, --format <format>                Output format [default: png]  [possible values: Png, Pdf, Ps, Eps, Svg]
        --left <length>                  Distance between left edge of page and the image [defaults to 0]
    -o, --output <output>                Output filename [defaults to stdout]
        --page-height <length>           Height of output media [defaults to the height of the SVG]
        --page-width <length>            Width of output media [defaults to the width of the SVG]
    -d, --dpi-x <number>                 Pixels per inch [default: 96]
    -p, --dpi-y <number>                 Pixels per inch [default: 96]
    -w, --width <length>                 Width [defaults to the width of the SVG]
    -h, --height <length>                Height [defaults to the height of the SVG]
    -s, --stylesheet <filename.css>      Filename of CSS stylesheet to apply
        --top <length>                   Distance between top edge of page and the image [defaults to 0]
    -z, --zoom <number>                  Zoom factor
    -x, --x-zoom <number>                Horizontal zoom factor
    -y, --y-zoom <number>                Vertical zoom factor

Here's a basic example that pulls the R SVG logo from the internet and converts it to PNG (we'll expand upon in the next section)

curl --silent https://www.r-project.org/logo/Rlogo.svg | rsvg-convert > /tmp/r.png
R SVG logo converted to PNG

SVGs are becoming increasingly popular as they tend to be smaller than and scale more nicely than bitmaps, plus have much better browser support now that Internet Explorer is finally dead. Having this utility in your back pocket will make quick work of any SVG conversions you may need.

icat

icat stands "image cat", with "cat" being a reference to the command line utility for displaying files. icat can output images on a 256-color or 24-bit color enabled terminal with UTF-8 locale. Many modern terminals support those requirements (even Apple's basic Terminal.app), including previously mentioned Warp and WezTerm.

Let's grab and display that R SVG logo again, this time using icat to display it:

curl --silent https://www.r-project.org/logo/Rlogo.svg | rsvg-convert > /tmp/r.png && icat /tmp/r.png

(Note that I'm using the && control operator vs “icat -” for reading from stdin since it seems there's something busted in one of the icat supporting libraries preventing it from handling stdin; this was true on both macOS and Linux when I tried it.)

R logo displayed in a terminal

icat's options are fairly straightforward:

icat (0.5) outputs an image on a 256-color or 24-bit color enabled terminal with UTF-8 locale.
Usage: icat [-h|--help] [-x value] [-y value] [-w|--width value] [-k|--keep]
            [-m|--mode indexed|24bit|both] imagefile [imagefile...]
	-h | --help  -- Display this message
	-x value     -- Specify the column to print the image in (min. 1)
	-y value     -- Specify the row to print the image in (min. 1)
	                This is ignored when more than one image is printed.
	-w | --width value
	                Instead of resizing the image to fit the terminal width,
	                use the provided value as the desired width.
	-k | --keep  -- Keep image size, i.e. do not automatically resize image to fit
	                the terminal width.
	-m | --mode indexed|24bit|both
	                Use indexed (256-color, the default), 24-bit color, or both.
	imagefile    -- The image to print. If the file name is "-", the file is
	                read from stdin.
Big images are automatically resized to your terminal width, unless with the -k option.

and it's super-handy to be able to preview images without loading up another GUI tool.

tv

Tidy Viewer ("tv") is a cross-platform command line utility for pretty-printing CSV files. It uses column styling rules heavily influenced by R's tidyverse to "maximize viewer enjoyment".

curl -sL https://raw.githubusercontent.com/tidyverse/dplyr/master/data-raw/starwars.csv | tv
Sample Tidy Viewer output showing the 'star wars' data frame

It does one thing, does it well, and has tons of options, so no manual page or more blathering by me.

FIN

With today's CLI run-down, you no longer need to leave the terminal to preview graphics or common data files. Hopefully, this will save some time and mouse/trackpad clicks. ☮

Share this post

2022-07-18.01

dailyfinds.hrbrmstr.dev
Previous
Next
Comments
TopNewCommunity

No posts

Ready for more?

© 2023 boB Rudis
Privacy ∙ Terms ∙ Collection notice
Start WritingGet the app
Substack is the home for great writing