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}johngodlee@gmail.com") 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) Now you can curl my contact card from this website: curl -sL https://johngodlee.github.io/files/card