#!/bin/sh puts() { printf "\033[1m\033[38;5;%sm[%s]\033[m %s\n" "$3" "$1" "$2" } error() { puts "ERROR" "$1" "9" if [ -n "$2" ] then exit "$2" else exit 1 fi } message() { puts "TIKZTOSVG" "$1" "2" } showHelp() { man tikztosvg exit 0 } showVersion() { echo 0.1.1 exit 0 } if ! [ -x "$(command -v xelatex)" ] then error "xelatex could not be found" fi if ! [ -x "$(command -v pdf2svg)" ] then error "pdf2svg could not be found" fi # Parsing the arguments PACKAGES="" while [ $# -gt 1 ] do case "$1" in -h|--help) showHelp ;; -v|--version) showVersion ;; -p|--package) if [ -z "$2" ] then error "Unnexpected EOF" else case "$2" in # Check if the name of the package is valid *" "*) error "Invalid package name. LaTeX package names cannot contain scapes!" ;; *) PACKAGES="$PACKAGES $2" shift shift esac fi ;; -o|--output) if [ -n "$OUTPUT" ] then error "The output path was specified multiple times" elif [ -z "$2" ] then error "Unexpected EOF" else OUTPUT="$2" shift shift fi ;; -q|--quit) QUIET=1 shift ;; *) error "Unexpected token: \"$1\"" ;; esac done case "$1" in -h|--help) showHelp ;; -v|--version) showVersion ;; "") error "No input path provided" ;; "-") INPUT=/dev/stdin ;; *) INPUT="$1" esac case "$OUTPUT" in # Set the output to stdout -) QUIET=1 OUTPUT=/dev/stdout ;; # If no output path is provided, use the basename of the input "") if [ -x "$(command -v dirname)" ] then OUTPUT="$(dirname "$INPUT")/$(basename "$INPUT" | cut -d "." -f1).svg" fi ;; # If the output path is provided, but it resolves to directory, output a # a file with the same basename as the input in the target directory */) OUTPUT="$OUTPUT$(basename "$INPUT" | cut -d "." -f1).svg" ;; esac TEMP_DIR="$(mktemp -d)" TEX_FILE="$TEMP_DIR/tmp.tex" # Generate the LaTeX document printf "\documentclass[crop,tikz,multi=false]{standalone}\n" > "$TEX_FILE" for PACKAGE in $PACKAGES do printf "\usepackage{%s}\n" "$PACKAGE" >> "$TEX_FILE" done printf "\\\begin{document} \huge\n" >> "$TEX_FILE" cat "$INPUT" >> "$TEX_FILE" if [ $? -ne 0 ] then rm "$TEMP_DIR" -r error "File not found: $INPUT" fi printf "\\\end{document}\n" >> "$TEX_FILE" if [ -z "$QUIET" ] then message "Rendering the LaTeX document. . ." xelatex -output-directory="$TEMP_DIR" "$TEX_FILE" else xelatex -halt-on-error -output-directory="$TEMP_DIR" "$TEX_FILE" 1> /dev/null 2>&1 fi S=$? if [ $S -ne 0 ] then rm "$TEMP_DIR" -r if [ -z "$QUIET" ] then error "xelatex exited with code $S" $S else exit $S fi fi if [ -z "$QUIET" ] then message "Converting the output to SVG. . ." fi pdf2svg "$TEMP_DIR/tmp.pdf" "$OUTPUT" 1 S=$? if [ $S -ne 0 ] then rm "$TEMP_DIR" -r if [ -z "$QUIET" ] then error "pdf2svg exited with code $S" $S else exit $S fi fi if [ -z "$QUIET" ] then message "Done!" fi rm "$TEMP_DIR" -r