TITLE: Curl-able contact card
DATE: 2020-08-08
AUTHOR: John L. Godlee
====================================================================
I saw a Github Gist with a businesss card that can be displayed all
pretty-like in the terminal using curl. The one online was quite
simplistic, it just padded out the card contents manually with
spaces, which required a lot of trial and error to position
everything correctly. It also required knowing the ANSI escape
sequences to colour and style the text.
I wrote the script below to automate some of this process and
produce a similar looking contact card:
#!/usr/bin/env bash
# Define colours and fonts
boxcol="[36m"
default="[0m"
bold="[1m"
underline="[4m"
reverse="[7m"
black="[30m"
red="[31m"
green="[32m"
yellow="[33m"
blue="[34m"
magenta="[35m"
cyan="[36m"
white="[37m"
# Card items, in line order
inputs=()
inputs+=("${red}${underline}John L. Godlee")
inputs+=("${blue}PhD Student, University of Edinburgh")
inputs+=("")
inputs+=("${bold}Email: ${default}
[email protected]")
inputs+=("${bold}Blog: ${default}
https://johngodlee.github.io")
inputs+=("${bold}GitHub:
${default}
https://github.com/johngodlee")
inputs+=("${bold}ORCiD:
${default}
https://orcid.org/0000-0001-5595-255X")
inputs+=("")
inputs+=("${yellow}curl -sL
https://johngodlee.github.io/files/card")
# Define left-padding
leftpad=' '
# Define box drawing chars
vbord="│"
hbord="─"
tlcor="╭"
trcor="╮"
brcor="╯"
blcor="╰"
# Get length of longest line
linel=$(for i in "${inputs[@]}"; do
echo $i | sed 's/\x1b\[[0-9;]*m//g'| wc -c
done | sort -nr | head -n 1)
# Get width of card, with padding
inwidth=$(($linel + 4*2))
# Get length of left-padding
leftpadl=${#leftpad}
# Print top line
printf "$boxcol"
printf "$tlcor"
for ((i=1; i<=inwidth; i++)); do
printf "$hbord"
done
printf "$trcor"
printf "\n"
printf "$boxcol"
printf "$vbord"
for ((i=1; i<=inwidth; i++)); do
printf " "
done
printf "$vbord"
printf "\n"
# Print each card item
for ((i = 0; i < ${#inputs[@]}; i++))
do
# Get length of string
stringcl=$(echo ${inputs[$i]} | sed 's/\x1b\[[0-9;]*m//g')
stringl=${#stringcl}
# Get length of right padding
rightpadl=$(($inwidth-$stringl-$leftpadl))
# Print border
printf "$boxcol$vbord"
# Print left-padding
printf "$leftpad"
# Print string
printf "$default${inputs[$i]}$default"
# Print right-padding
for ((j=1; j<=rightpadl; j++))
do
printf " "
done
# Print border
printf "$boxcol$vbord"
# New-line
printf "\n"
done
# Print bottom line
printf "$boxcol"
printf "$vbord"
for ((i=1; i<=inwidth; i++)); do
printf " "
done
printf "$vbord"
printf "\n"
printf "$boxcol$blcor"
for ((i=1; i<=inwidth; i++)); do
printf "$hbord"
done
printf "$brcor"
printf "\n"
The customisation comes from the inputs array, which contains the
contents of the contact card, and uses the variables for font and
colour to style the text, e.g.:
inputs+=("${red}${underline}John L. Godlee")
The script requires bash rather than a standard POSIX shell,
because it uses bash arithmetic, but this could probably be ported
to use bc or something. Also not that some of the escape sequences
might not have rendered properly on the web, like ^[.
![Contact card
screenshot](
https://johngodlee.xyz/img_full/card/card.png)