💾 Archived View for republic.circumlunar.space › users › johngodlee › posts › 2020-08-08-card.gmi captured on 2023-09-08 at 16:20:28. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2021-12-04)

➡️ Next capture (2024-06-16)

-=-=-=-=-=-=-

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=""
default=""
bold=""
underline=""
reverse=""
black=""
red=""
green=""
yellow=""
blue=""
magenta=""
cyan=""
white=""

# 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