

___x_cmd_ascii_banner(){
    [ "$#" -gt 0 ] || set -- print

    local op="$1"; shift
    case "$op" in
        -h|--help)      ___x_cmd help -m ascii banner   ; return 0 ;;
        print|get)      ___x_cmd_ascii_banner_print     "$@" ;;
        get_)           ___x_cmd_ascii_banner_get_      "$@" ;;
        *)              ___x_cmd_ascii_banner_get "$op" "$@" ;;
    esac
}

___x_cmd_ascii_banner_print(){
    ___x_cmd_ascii_banner_get
}

___x_cmd_ascii_banner_get(){
    local x_
    ___x_cmd_ascii_banner_get_ "$@" || return $?
    printf "\n%s\n\n" "$x_"
}



___x_cmd_ascii_banner_get_(){
    local e33="$___X_CMD_UNSEENCHAR_033"

    local style=rainbow
    local str=""
    local SPACE=" "
    local OFFSET="  "
    while [ $# -gt 0 ]; do
        case "$1" in
            --rainbow|--rainbow1|--rainbow2|--rainbow3|--rainbow4|--rainbow5|--rainbow6|--red|--blue|--green|--yellow|--cyan|--magenta|--white)
                style="${1#--}" ; shift ;;
            --offset)
                OFFSET="$2"
                arg:2:shift
                ;;
            --space)
                case "$2" in
                    2)      SPACE="  "      ;;
                    3)      SPACE="   "     ;;
                    4)      SPACE="    "    ;;
                    *)      SPACE=" "       ;;
                esac
                arg:2:shift
                ;;
            *)  break ;;
        esac
    done

    local str="$1"

    . "${___X_CMD_ROOT_MOD}/ascii/lib/banner/letter.sh"

    local tmp=""
    local ch=""

    local line01="${OFFSET}"
    local line02="${OFFSET}"
    local line03="${OFFSET}"
    local line04="${OFFSET}"
    local line05="${OFFSET}"

    while [ -n "${str}" ]; do
        tmp="${str#?}"
        ch="${str%%"$tmp"}"
        str="$tmp"

        case "$ch" in
            " ")    ch=SPACE ;;
            ".")    ch=DOT ;;
            ",")    ch=COMMA ;;
            "!")    ch=EXCLAMATION ;;
            "?")    ch=QUESTION ;;
            "/")    ch=SLASH ;;
            "+")    ch=PLUS ;;
            "=")    ch=EQUAL ;;
            "(")    ch=LPAREN ;;
            ")")    ch=RPAREN ;;
            "[")    ch=LBRACKET ;;
            "]")    ch=RBRACKET ;;
            "{")    ch=LBRACE ;;
            "}")    ch=RBRACE ;;
            "#")    ch=HASH ;;
            "%")    ch=PERCENT ;;
            '$')    ch=DOLLAR ;;
            "&")    ch=AMPERSAND ;;
            "*")    ch=ASTERISK ;;
            "@")    ch=AT ;;
            "|")    ch=PIPE ;;
            '\')    ch=BSLASH ;;
            "^")    ch=CARET ;;
            '`')    ch=GRAVE ;;
            '~')    ch=TILDE ;;
            "'")    ch=QUOTE ;;
            '"')    ch=DQUOTE ;;
            "<")    ch=LT ;;
            ">")    ch=GT ;;
            ";")    ch=SEMICOLON ;;
            ":")    ch=COLON ;;
            "-")    ch=MINUS ;;
            "_")    ch=UNDERSCORE ;;
        esac

        eval "
            line01=\"\${line01}\${___X_CMD_ASCII_LETTER_${ch}_01}${SPACE}\"
            line02=\"\${line02}\${___X_CMD_ASCII_LETTER_${ch}_02}${SPACE}\"
            line03=\"\${line03}\${___X_CMD_ASCII_LETTER_${ch}_03}${SPACE}\"
            line04=\"\${line04}\${___X_CMD_ASCII_LETTER_${ch}_04}${SPACE}\"
            line05=\"\${line05}\${___X_CMD_ASCII_LETTER_${ch}_05}${SPACE}\"
        "

    done

    local c_reset="${e33}[0m"
    local c1="" c2="" c3="" c4="" c5=""

    case "$style" in
        rainbow1)
            c1="${e33}[31m"; c2="${e33}[33m"; c3="${e33}[32m"; c4="${e33}[36m"; c5="${e33}[34m"
            ;;
        rainbow2)
            c1="${e33}[33m"; c2="${e33}[32m"; c3="${e33}[36m"; c4="${e33}[34m"; c5="${e33}[35m"
            ;;
        rainbow3)
            c1="${e33}[32m"; c2="${e33}[36m"; c3="${e33}[34m"; c4="${e33}[35m"; c5="${e33}[31m"
            ;;
        rainbow4)
            c1="${e33}[36m"; c2="${e33}[34m"; c3="${e33}[35m"; c4="${e33}[31m"; c5="${e33}[33m"
            ;;
        rainbow|rainbow5)
            c1="${e33}[34m"; c2="${e33}[35m"; c3="${e33}[31m"; c4="${e33}[33m"; c5="${e33}[32m"
            ;;
        rainbow6)
            c1="${e33}[35m"; c2="${e33}[31m"; c3="${e33}[33m"; c4="${e33}[32m"; c5="${e33}[36m"
            ;;
        red)     c1="${e33}[31m"; c2="${e33}[31m"; c3="${e33}[31m"; c4="${e33}[31m"; c5="${e33}[31m" ;;
        green)   c1="${e33}[32m"; c2="${e33}[32m"; c3="${e33}[32m"; c4="${e33}[32m"; c5="${e33}[32m" ;;
        yellow)  c1="${e33}[33m"; c2="${e33}[33m"; c3="${e33}[33m"; c4="${e33}[33m"; c5="${e33}[33m" ;;
        blue)    c1="${e33}[34m"; c2="${e33}[34m"; c3="${e33}[34m"; c4="${e33}[34m"; c5="${e33}[34m" ;;
        magenta) c1="${e33}[35m"; c2="${e33}[35m"; c3="${e33}[35m"; c4="${e33}[35m"; c5="${e33}[35m" ;;
        cyan)    c1="${e33}[36m"; c2="${e33}[36m"; c3="${e33}[36m"; c4="${e33}[36m"; c5="${e33}[36m" ;;
        white)   c1="${e33}[37m"; c2="${e33}[37m"; c3="${e33}[37m"; c4="${e33}[37m"; c5="${e33}[37m" ;;
        *)       c1="" ; c2="" ; c3="" ; c4="" ; c5="" ; c_reset="" ;;
    esac

    x_="${c1}${line01}${c_reset}
${c2}${line02}${c_reset}
${c3}${line03}${c_reset}
${c4}${line04}${c_reset}
${c5}${line05}${c_reset}"


}
