Networking

Unix and Linux network configuration. Multiple network interfaces. Bridged NICs. High-availability network configurations.

Applications

Reviews of latest Unix and Linux software. Helpful tips for application support admins. Automating application support.

Data

Disk partitioning, filesystems, directories, and files. Volume management, logical volumes, HA filesystems. Backups and disaster recovery.

Monitoring

Distributed server monitoring. Server performance and capacity planning. Monitoring applications, network status and user activity.

Commands & Shells

Cool Unix shell commands and options. Command-line tools and application. Things every Unix sysadmin needs to know.

Home » Commands & Shells, Featured

Convert Code Snippets to PNG

Submitted by on October 4, 2020 – 8:19 am

On occasion I find myself struggling posting code on discussion forums that don’t handle code formatting all that well. What would’ve helped is some quick and easy way to convert code to an image file with syntax highlighting. And so here it is.

The first step is to install some prerequisites.

apt install inkscape python-pygments imagemagick

In the script below you can modify a few things: font face, font size, and image size. You can list the appropriate fonts available on your system like so:

fc-list | grep -i mono

The script itself needs to be executed this way:

# To convert a single file
code2png <file path and name> <output folder> <language> [<file extension>]
# To convert multiple files
code2png <input folder> <output folder> <language> <file extension>
# Examples
code2png /var/tmp/test01.sh /mnt/c/code_snippets bash
code2png /var/tmp /mnt/c/code_snippets bash sh

You can install the script from my GitHub repo like so:

d=/var/adm/bin && f=code2png && mkdir -p ${d} && curl -s0 -k https://raw.githubusercontent.com/igoros777/kw/master/${f}.sh > ${d}/${f}.sh && chmod 755 ${d}/${f}.sh && ln -s ${d}/${f}.s
h /usr/bin/${f}

And the script itself is below.

  #!/bin/bash
  fmt=svg
  out=png
  lang=""
  ext=""
  wsize=1280
  source_path=""
  target_path=""
  if [ -z "${source_path}" ] || [ -z "${target_path}" ] || [ -z "${lang}" ]; then exit 1; fi
  if [ ! -f "${source_path}" ] && [ -z "${ext}" ]; then exit 3; fi
  if [ -f "${source_path}" ] && [ -z "${ext}" ]; then ext="*"; fi
  if [ ! -d "${target_path}" ]; then mkdir -p "${target_path}" || exit 2; fi
  find "${source_path}" -maxdepth 1 -mindepth 0 -type f -name "*\.${ext}" | while read f
  do
    pygmentize -O "style=monokai,fontface=DejaVu Sans Mono,fontsize=24" -f "${fmt}" \
    -l ${lang} -o "${target_path}/$(basename -- "${f%.*}").${fmt}" "${f}" 2>/dev/null
    inkscape -z -D --export-area-snap -b '#272822' -w ${wsize} \
    "${target_path}/$(basename -- "${f%.*}").${fmt}" \
    -e "${target_path}/$(basename -- "${f%.*}").${out}" 2>/dev/null
    mogrify -path "${target_path}" -bordercolor '#272822' -border 20 \
    -format png "${target_path}/$(basename -- "${f%.*}").${out}"
    /bin/rm "${target_path}/$(basename -- "${f%.*}").${fmt}" 2>/dev/null
  done

It’s a very simplistic version that begs for a rewrite. Alas, this was all the time I could spare. By all means, feel free to make improvements. Here are some output examples:

Print Friendly, PDF & Email

Leave a Reply