Facebook Text CLI

Description:
A Unicode Bold & Italic Generator primarily used for quickly formatting facebook promotional material.
The original concept has expanded into an ever-growing collection of useful Unicode Characters,
however retains the legacy name which reflect it’s origins.

Usage:
facebooktext [OPTIONS] [TEXT]

Commands:
   -b     Bold
   -i     Italic

   -l     Print Unicode line
   -a     Print right pointing triangle

   -u     Display full list of Unicode options

   -h     Help

Examples:
   facebooktext -i
   facebooktext -bi   
   facebooktext -b Vote Now!

Extended Unicode Options:
   -ar     Right Arrows
   -al     Left Arrows
   -ch     Check Marks
   -cr     Cross Marks
   -bu     Bullet Point
   -em     Empty Character

Examples:
   facebooktext -ch
   facebooktext -ch4
   facebooktext -ar2

Download facebooktext.sh

#!/bin/bash
#
#
set -euo pipefail

####################
# GLOBAL VARIABLES
####################
STYLE="DEFAULT"
VERSION="2.1.2"

####################
# COLOUR VARIABLES
####################

# Terminal Formatting
RESET="\033[0m"
F_BOLD="\033[1m"

# UI Colours
CLR_RED="\033[38;5;196m"  # Bright Red
CLR_GREEN="\033[38;5;46m" # Bright Lime Green

CLR_GOLD="\033[38;5;226m"           # Gold
CLR_PURPLE="\033[38;5;141m"         # Light Purple / Lavender
CLR_BLUE="\033[38;5;81m"            # Bright Sky Blue
CLR_DGREEN="\033[38;5;2m"           # Dark Forest Green
CLR_ORANGE="\033[38;5;208m"         # Faded Orange
CLR_PROMPT="${F_BOLD}\033[38;5;51m" # Aqua + Bold
CLR_TEXT="\033[38;5;250m"           # Light Grey
CLR_FRAME="\033[38;5;245m"          # Darker Grey

####################
# CHARACTER SETS
####################

NORMAL="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

BOLD=(
    𝗔 𝗕 𝗖 𝗗 𝗘 𝗙 𝗚 𝗛 𝗜 𝗝 𝗞 𝗟 𝗠 𝗡 𝗢 𝗣 𝗤 𝗥 𝗦 𝗧 𝗨 𝗩 𝗪 𝗫 𝗬 𝗭
    𝗮 𝗯 𝗰 𝗱 𝗲 𝗳 𝗴 𝗵 𝗶 𝗷 𝗸 𝗹 𝗺 𝗻 𝗼 𝗽 𝗾 𝗿 𝘀 𝘁 𝘂 𝘃 𝘄 𝘅 𝘆 𝘇
    𝟬 𝟭 𝟮 𝟯 𝟰 𝟱 𝟲 𝟳 𝟴 𝟵
)

ITALIC=(
    𝘈 𝘉 𝘊 𝘋 𝘌 𝘍 𝘎 𝘏 𝘐 𝘑 𝘒 𝘓 𝘔 𝘕 𝘖 𝘗 𝘘 𝘙 𝘚 𝘛 𝘜 𝘝 𝘞 𝘟 𝘠 𝘡
    𝘢 𝘣 𝘤 𝘥 𝘦 𝘧 𝘨 𝘩 𝘪 𝘫 𝘬 𝘭 𝘮 𝘯 𝘰 𝘱 𝘲 𝘳 𝘴 𝘵 𝘶 𝘷 𝘸 𝘹 𝘺 𝘻
    𝟬 𝟭 𝟮 𝟯 𝟰 𝟱 𝟲 𝟳 𝟴 𝟵
)

BOLDITALIC=(
    𝘼 𝘽 𝘾 𝘿 𝙀 𝙁 𝙂 𝙃 𝙄 𝙅 𝙆 𝙇 𝙈 𝙉 𝙊 𝙋 𝙌 𝙍 𝙎 𝙏 𝙐 𝙑 𝙒 𝙓 𝙔 𝙕
    𝙖 𝙗 𝙘 𝙙 𝙚 𝙛 𝙜 𝙝 𝙞 𝙟 𝙠 𝙡 𝙢 𝙣 𝙤 𝙥 𝙦 𝙧 𝙨 𝙩 𝙪 𝙫 𝙬 𝙭 𝙮 𝙯
    𝟬 𝟭 𝟮 𝟯 𝟰 𝟱 𝟲 𝟳 𝟴 𝟵
)

RIGHT_ARROWS=(
    "▶"
    "►"
    "🢒"
    "⮞"
    "➤"
    "⮕"
    "🠲"
    "🡒"
    "⤅"
    "⤐"
    "⇀"
    "⇁"
    "↱"
    "↳"
    "➠"
    "⯮"
    "🢂"
)
LEFT_ARROWS=(
    "◀" # ▶
    "◄" # ►
    "🢐" # 🢒
    "⮜" # ⮞
    ""  # ➤
    "⬅" # ⮕
    "🠰" # 🠲
    "🡐" # 🡒
    "⬶" # ⤅
    "⬷" # ⤐
    "↼" # ⇀
    "↽" # ⇁
    "↰" # ↱
    "↲" # ↳
    ""  # ➠
    "⯬" # ⯮
    "🢀" # 🢂
)

CHECK_MARK=(
    "✓"
    "🗸"
    "✔"
    "✅"
    "🗹"
)
CROSS_MARK=(
    "🗙"
    "✗"
    "✘"
    "❎"
    "☒"
    "🗴"
)

BULLET_POINT=(
    "•"
)

EMPTY_CHAR=(
    "ㅤ"
)
####################
# FUNCTIONS
####################

usage() {
    echo -e "${F_BOLD}${CLR_PURPLE}FacebookText Unicode Bold & Italic Generator v${VERSION}${RESET}"
    echo
    echo -e "${F_BOLD}Description:${RESET}"
    echo -e "${CLR_TEXT}  A Unicode Bold & Italic Generator primarily used for"
    echo -e "  quickly formatting facebook promotional material"
    echo -e "  The original concept has expanded into an ever-growing collection of useful Unicode"
    echo -e "  characters, however retains the legacy name which reflect it’s origins.${RESET}"
    echo
    echo -e "${F_BOLD}Usage:${RESET}${CLR_TEXT}"
    echo -e "   facebooktext [OPTIONS] [TEXT]${RESET}"
    echo
    echo -e "${F_BOLD}Options:${RESET}${CLR_TEXT}"
    echo -e "    -b     Bold"
    echo -e "    -i     Italic"
    echo
    echo -e "    -l     Print Unicode line"
    echo -e "    -a     Print right pointing triangle"
    echo
    echo -e "    -u     Display full list of Unicode options"
    echo
    echo -e "    -h     Help${RESET}"
    echo
    echo -e "${F_BOLD}Examples:${RESET}${CLR_TEXT}"
    echo -e "    facebooktext"
    echo -e "    facebooktext -i"
    echo -e "    facebooktext -bi"
    echo -e "    facebooktext -aa"
    echo -e "    facebooktext -b "Vote Now!"${RESET}"
    echo
}

usage_unicode() {
echo
echo -e "${F_BOLD}Extended Unicode Options:${RESET}${CLR_TEXT}"
    echo -e "    -ar     Right Arrows"
    echo -e "    -al     Left Arrows"
    echo -e "    -ch     Check Marks"
    echo -e "    -cr     Cross Marks"
    echo -e "    -bu     Bullet Point"
    echo -e "    -em     Empty Character"
    echo
    echo -e "${F_BOLD}Examples:${RESET}${CLR_TEXT}"
    echo -e "    facebooktext -ch"
    echo -e "    facebooktext -ch4"
    echo -e "    facebooktext -ar2${RESET}"
    echo
}

separator() {
    printf '──────────────────────────────\n'
}

copy_clipboard() {
    if command -v xclip >/dev/null; then
        xclip -selection clipboard
    elif command -v wl-copy >/dev/null; then
        wl-copy
    else
        cat
    fi
}

convert() {
    local input="$1"
    local output=""
    local c pos
    local -n table="$2"

    local i
    for ((i = 0; i < ${#input}; i++)); do

        c="${input:i:1}"
        pos=$(expr index "$NORMAL" "$c") || pos=0

        if ((pos)); then
            output+="${table[pos - 1]}"
        else
            output+="$c"
        fi

    done

    printf '%s' "$output"
}

#####################
# SHOW/COPY SYMBOLS
#####################

copy_symbol() {
    local symbol="$1"

    printf '%s' "$symbol" | copy_clipboard >/dev/null

    echo
    echo -e " $symbol ${CLR_GREEN}Copied to clipboard${RESET}"
    echo
}

show_symbols() {
    local title="$1"
    local -n symbols="$2"

    echo
    echo "─────────────── "$title" ───────────────"

    for ((i = 0; i < ${#symbols[@]}; i++)); do
        printf '%2d  %s\n' "$((i + 1))" "${symbols[i]}"
    done

    echo
}

copy_symbol_from_array() {
    local -n symbols="$1"
    local index="$2"

    if ((index < 0 || index >= ${#symbols[@]})); then
        echo "Invalid symbol number: $((index + 1))" >&2
        exit 1
    fi

    copy_symbol "${symbols[index]}"
}
####################
# SYMBOL OPTIONS
####################

case "${1:-}" in

    # copy common arrow
    -a)
        copy_symbol_from_array RIGHT_ARROWS 0
        exit
        ;;
    # Right arrow catalogue
    -ar)
        show_symbols "Right Arrows" RIGHT_ARROWS
        exit
        ;;

    # Left arrows caralogue
    -al)
        show_symbols "Left Arrows" LEFT_ARROWS
        copy_symbol_from_array LEFT_ARROWS 0
        exit
        ;;
    # Checks
    -ch)
        show_symbols "Check Marks" CHECK_MARK
        exit
        ;;

    # Crosses
    -cr)
        show_symbols "Cross Marks" CROSS_MARK
        exit
        ;;
    # Bullet Point
    -bu)
        copy_symbol_from_array BULLET_POINT 0
        exit
        ;;
        # Bullet Point
    -em)
        copy_symbol_from_array EMPTY_CHAR 0
        exit
        ;;

    # Numbered symbols
    -ar[0-9]* | -al[0-9]* | -ch[0-9]* | -cr[0-9]*)
        number="${1:3}"

        if [[ ! "$number" =~ ^[0-9]+$ ]]; then
            echo "Invalid symbol number: $number" >&2
            exit 1
        fi

        case "${1:1:2}" in
            ar) symbols=RIGHT_ARROWS ;;
            al) symbols=LEFT_ARROWS ;;
            ch) symbols=CHECK_MARK ;;
            cr) symbols=CROSS_MARK ;;
            *)
                echo "Unknown symbol type: ${1:1:2}" >&2
                exit 1
                ;;
        esac
        copy_symbol_from_array "$symbols" "$((number - 1))"
        exit
        ;;
esac

####################
# OPTIONS
####################

while getopts ":bilauh" opt; do
    case "$opt" in
        b)
            case "$STYLE" in
                DEFAULT) STYLE="BOLD" ;;
                ITALIC) STYLE="BOLDITALIC" ;;
            esac
            ;;
        i)
            case "$STYLE" in
                DEFAULT) STYLE="ITALIC" ;;
                BOLD) STYLE="BOLDITALIC" ;;
            esac
            ;;
        l)
            echo
            echo -e " ${CLR_GREEN}Copied to clipboard${RESET}"
            echo
            separator
            separator | copy_clipboard >/dev/null
            echo
            echo
            exit
            ;;
        h)
            usage
            exit
            ;;
        u)
            usage_unicode
            exit
            ;;
    esac
done

shift $((OPTIND - 1))

case "$STYLE" in
    DEFAULT | BOLD)
        TABLE=BOLD
        ;;
    ITALIC)
        TABLE=ITALIC
        ;;
    BOLDITALIC)
        TABLE=BOLDITALIC
        ;;
esac
####################
# INPUT
####################

if (($#)); then
    OUTPUT=$(convert "$*" "$TABLE")

    printf '%s' "$OUTPUT" | copy_clipboard >/dev/null

    echo
    echo -e " ${OUTPUT}"
    echo
    separator
    echo -e "${CLR_GREEN} Copied to clipboard.${RESET}"
    separator
    echo
else
    echo
    echo -e "${F_BOLD}${CLR_BLUE}Enter desired text - then press ${CLR_GOLD}Ctrl+D${CLR_BLUE} when finished${RESET}"
    echo

    INPUT=$(cat)

    OUTPUT=""

    while IFS= read -r line || [[ -n $line ]]; do
        OUTPUT+="$(convert "$line" "$TABLE")"$'\n'
    done <<<"$INPUT"

    echo
    echo
    echo -e "───────────── ${CLR_ORANGE}Converted Text${RESET} ─────────────────"
    echo
    printf '%s' "$OUTPUT"

    printf '%s' "$OUTPUT" | copy_clipboard >/dev/null

    echo
    separator
    echo -e "${CLR_GREEN}Copied to clipboard.${RESET}"
    separator
    echo
fi