Skip to content

Instantly share code, notes, and snippets.

@td-shi
Last active August 12, 2021 07:25
Show Gist options
  • Save td-shi/2630111405b252277aa379d97a00b723 to your computer and use it in GitHub Desktop.
Save td-shi/2630111405b252277aa379d97a00b723 to your computer and use it in GitHub Desktop.
b64post.sh generate from base64 to character symbols are a post bar '0' - '7' , stop, start and end(for adjast view).
#!/bin/sh
# -*- coding:utf-8 posix -*-
# === Coding shell scripting Memo ==============================================
# ${<name>#<pattern>} :: matching delete with shortest by forword.
# ${<name>##<pattern>} :: matching delete with longest by forword.
# ${<name>%<pattern>} :: matching delete with shortest by backword.
# ${<name>%%<pattern>} :: mathing delete with longest by backword.
# ${<name>/<before>/<after>} :: replace only first matching.
# ${<name>//<before>/<after>} :: replace all matching.
# ${<name>:-<value>} :: if no yet set value, return value.
# ${<name>:=<value>} :: if no yet set value, return value and set.
# ". <shell script>" is to keep current shell and take over environment.
# === Initialize shell environment =============================================
#set -u # Just stop undefined values.
#set -e # Just stop error.
#set -x # Debug running command.
umask 0022
export LC_ALL=C
export LANG=C
PATH="$(command -p getconf PATH 2>/dev/null)${PATH+:}${PATH-}"
case $PATH in :*) PATH=${PATH#?};; esac
export PATH # or PATH="<add dir>${PATH+:}${PATH-}"
export UNIX_STD=2003 # to make HP-UX conform to POSIX
# === Define the functions for printing usage and error message ================
usage_and_exit(){
cat <<-"USAGE" 1>&2
# About
b64post.sh is encode to post bar characters '0' - '7', start and stop (JP).
# Usage
## Command
b64post.sh [options]
The standard input shall be used, if no file operand is specified.
## Options
- -h |--help |--version
+ This help.
# Version
2021-08-12
# LICENSE
[CC0(Public domain)](https://creativecommons.org/publicdomain/zero/1.0/legalcode)
# Author
2021 TD
USAGE
exit 1
}
error_exit() {
${2+:} false && echo "${0##*/}: $2" 1>&2
exit "$1"
}
# === Initialize parameters ====================================================
SED_LF=$(printf '\\\n_')
SED_LF=${SED_LF%_}
IN_FILE=''
GEN_DATE=$(date -u "+%Y-%m-%d")
CREATOR="TD"
# === Confirm that the required commands exist =================================
# === Print usage and exit if one of the help options is set ===================
case "$# ${1:-}" in
'1 -h'|'1 --help'|'1 --version') usage_and_exit;;
esac
# === Read options =============================================================
while :; do
case "${1:-}" in
--|-)
break
;;
--*|-*)
error_exit 1 'Invalid option.'
;;
*)
break
;;
esac
done
# === Require parameters check =================================================
# === Last parameter ===========================================================
case $# in
0) : ;;
1) IN_FILE=$1 ;;
*) error_exit 1 'Too many args.' ;;
esac
if [ "_$IN_FILE" = '_' ] ||
[ "_$IN_FILE" = '_-' ] ||
[ "_$IN_FILE" = '_/dev/stdin' ] ||
[ "_$IN_FILE" = '_/dev/fd/0' ] ||
[ "_$IN_FILE" = '_/proc/self/fd/0' ] ; then
IN_FILE=''
elif [ -f "$IN_FILE" ] ||
[ -c "$IN_FILE" ] ||
[ -p "$IN_FILE" ] ; then
[ -r "$IN_FILE" ] || error_exit 1 'Cannot open the file: '"$IN_FILE"
else
usage_and_exit
fi
case "$IN_FILE" in ''|-|/*|./*|../*) :;; *) IN_FILE="./$IN_FILE";; esac
# === Define funcitons =========================================================
decode64() {
cat - |\
tr -d "=" |\
sed "s/[[:blank:]]//g" |\
tr "01" "<>" |\
sed "s/./ &/g" |\
sed "s:/:111 111:g" |\
sed "s:+:111 110:g" |\
sed "s:9:111 101:g" |\
sed "s:8:111 100:g" |\
sed "s:7:111 011:g" |\
sed "s:6:111 010:g" |\
sed "s:5:111 001:g" |\
sed "s:4:111 000:g" |\
sed "s:3:110 111:g" |\
sed "s:2:110 110:g" |\
sed "s:>:110 101:g" |\
sed "s:<:110 100:g" |\
sed "s:z:110 011:g" |\
sed "s:y:110 010:g" |\
sed "s:x:110 001:g" |\
sed "s:w:110 000:g" |\
sed "s:v:101 111:g" |\
sed "s:u:101 110:g" |\
sed "s:t:101 101:g" |\
sed "s:s:101 100:g" |\
sed "s:r:101 011:g" |\
sed "s:q:101 010:g" |\
sed "s:p:101 001:g" |\
sed "s:o:101 000:g" |\
sed "s:n:100 111:g" |\
sed "s:m:100 110:g" |\
sed "s:l:100 101:g" |\
sed "s:k:100 100:g" |\
sed "s:j:100 011:g" |\
sed "s:i:100 010:g" |\
sed "s:h:100 001:g" |\
sed "s:g:100 000:g" |\
sed "s:f:011 111:g" |\
sed "s:e:011 110:g" |\
sed "s:d:011 101:g" |\
sed "s:c:011 100:g" |\
sed "s:b:011 011:g" |\
sed "s:a:011 010:g" |\
sed "s:Z:011 001:g" |\
sed "s:Y:011 000:g" |\
sed "s:X:010 111:g" |\
sed "s:W:010 110:g" |\
sed "s:V:010 101:g" |\
sed "s:U:010 100:g" |\
sed "s:T:010 011:g" |\
sed "s:S:010 010:g" |\
sed "s:R:010 001:g" |\
sed "s:Q:010 000:g" |\
sed "s:P:001 111:g" |\
sed "s:O:001 110:g" |\
sed "s:N:001 101:g" |\
sed "s:M:001 100:g" |\
sed "s:L:001 011:g" |\
sed "s:K:001 010:g" |\
sed "s:J:001 001:g" |\
sed "s:I:001 000:g" |\
sed "s:H:000 111:g" |\
sed "s:G:000 110:g" |\
sed "s:F:000 101:g" |\
sed "s:E:000 100:g" |\
sed "s:D:000 011:g" |\
sed "s:C:000 010:g" |\
sed "s:B:000 001:g" |\
sed "s:A:000 000:g" |\
sed "s/111/7/g" |\
sed "s/110/6/g" |\
sed "s/101/5/g" |\
sed "s/100/4/g" |\
sed "s/011/3/g" |\
sed "s/010/2/g" |\
sed "s/001/1/g" |\
sed "s/000/0/g" |\
sed "s/./&${SED_LF}/g" |\
tr -d " " |\
sed "/^$/d"
}
# === Main routine =============================================================
cat <<-SVG
<svg encoding="UTF-8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<metadata>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#">
<cc:Work rdf:about="">
<dc:creator>${CREATOR}</dc:creator>
<dc:date>${GEN_DATE}</dc:date>
<cc:license rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:format>image/svg+xml</dc:format>
<dc:language>JP</dc:language>
</cc:Work>
<cc:License rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction"/>
<cc:permits rdf:resource="http://creativecommons.org/ns#Distribution"/>
<cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks"/>
</cc:License>
</rdf:RDF>
</metadata>
<style>
rect.bar {fill: black; stroke-width: 0;}
rect.rab {fill: white; stroke-width: 0; opacity: 0.02;}
@media (prefers-color-scheme: dark) {
rect.bar {fill: white; stroke-width: 0;}
rect.rab {fill: black; stroke-width: 0; opacity: 0.02;}
}
</style>
<symbol id="str">
<rect class="bar" x="0.08em" y="0.02em" width="0.16em" height="0.96em"/>
<rect class="bar" x="0.40em" y="0.34em" width="0.16em" height="0.64em"/>
<rect class="rab" x="0.40em" y="0.02em" width="0.16em" height="0.32em"/>
</symbol>
<symbol id="stp">
<rect class="bar" x="0.08em" y="0.34em" width="0.16em" height="0.64em"/>
<rect class="bar" x="0.40em" y="0.02em" width="0.16em" height="0.96em"/>
<rect class="rab" x="0.08em" y="0.02em" width="0.16em" height="0.32em"/>
</symbol>
<symbol id="end">
<rect class="bar" x="0.00em" y="0.00em" width="0.02em" height="0.02em"/>
<rect class="bar" x="0.00em" y="0.98em" width="0.02em" height="0.02em"/>
</symbol>
<symbol id="c0">
<rect class="bar" x="0.08em" y="0.02em" width="0.16em" height="0.96em"/>
<rect class="bar" x="0.40em" y="0.34em" width="0.16em" height="0.32em"/>
<rect class="bar" x="0.72em" y="0.34em" width="0.16em" height="0.32em"/>
<rect class="rab" x="0.40em" y="0.02em" width="0.16em" height="0.32em"/>
<rect class="rab" x="0.40em" y="0.66em" width="0.16em" height="0.32em"/>
<rect class="rab" x="0.72em" y="0.02em" width="0.16em" height="0.32em"/>
<rect class="rab" x="0.72em" y="0.66em" width="0.16em" height="0.32em"/>
</symbol>
<symbol id="c1">
<rect class="bar" x="0.08em" y="0.02em" width="0.16em" height="0.96em"/>
<rect class="bar" x="0.40em" y="0.02em" width="0.16em" height="0.96em"/>
<rect class="bar" x="0.72em" y="0.34em" width="0.16em" height="0.32em"/>
<rect class="rab" x="0.72em" y="0.02em" width="0.16em" height="0.32em"/>
<rect class="rab" x="0.72em" y="0.66em" width="0.16em" height="0.32em"/>
</symbol>
<symbol id="c2">
<rect class="bar" x="0.08em" y="0.02em" width="0.16em" height="0.96em"/>
<rect class="bar" x="0.40em" y="0.34em" width="0.16em" height="0.64em"/>
<rect class="bar" x="0.72em" y="0.02em" width="0.16em" height="0.64em"/>
<rect class="rab" x="0.40em" y="0.02em" width="0.16em" height="0.32em"/>
<rect class="rab" x="0.72em" y="0.66em" width="0.16em" height="0.32em"/>
</symbol>
<symbol id="c3">
<rect class="bar" x="0.08em" y="0.34em" width="0.16em" height="0.64em"/>
<rect class="bar" x="0.40em" y="0.02em" width="0.16em" height="0.96em"/>
<rect class="bar" x="0.72em" y="0.02em" width="0.16em" height="0.64em"/>
<rect class="rab" x="0.08em" y="0.02em" width="0.16em" height="0.32em"/>
<rect class="rab" x="0.72em" y="0.66em" width="0.16em" height="0.32em"/>
</symbol>
<symbol id="c4">
<rect class="bar" x="0.08em" y="0.02em" width="0.16em" height="0.96em"/>
<rect class="bar" x="0.40em" y="0.02em" width="0.16em" height="0.64em"/>
<rect class="bar" x="0.72em" y="0.34em" width="0.16em" height="0.64em"/>
<rect class="rab" x="0.40em" y="0.66em" width="0.16em" height="0.32em"/>
<rect class="rab" x="0.72em" y="0.02em" width="0.16em" height="0.32em"/>
</symbol>
<symbol id="c5">
<rect class="bar" x="0.08em" y="0.02em" width="0.16em" height="0.96em"/>
<rect class="bar" x="0.40em" y="0.34em" width="0.16em" height="0.32em"/>
<rect class="bar" x="0.72em" y="0.02em" width="0.16em" height="0.96em"/>
<rect class="rab" x="0.40em" y="0.02em" width="0.16em" height="0.32em"/>
<rect class="rab" x="0.40em" y="0.66em" width="0.16em" height="0.32em"/>
</symbol>
<symbol id="c6">
<rect class="bar" x="0.08em" y="0.34em" width="0.16em" height="0.64em"/>
<rect class="bar" x="0.40em" y="0.02em" width="0.16em" height="0.64em"/>
<rect class="bar" x="0.72em" y="0.02em" width="0.16em" height="0.96em"/>
<rect class="rab" x="0.08em" y="0.02em" width="0.16em" height="0.32em"/>
<rect class="rab" x="0.40em" y="0.66em" width="0.16em" height="0.32em"/>
</symbol>
<symbol id="c7">
<rect class="bar" x="0.08em" y="0.02em" width="0.16em" height="0.64em"/>
<rect class="bar" x="0.40em" y="0.02em" width="0.16em" height="0.96em"/>
<rect class="bar" x="0.72em" y="0.34em" width="0.16em" height="0.64em"/>
<rect class="rab" x="0.08em" y="0.66em" width="0.16em" height="0.32em"/>
<rect class="rab" x="0.72em" y="0.02em" width="0.16em" height="0.32em"/>
</symbol>
<use xlink:href="#end" x="0.00em" y="0em"/>
<use xlink:href="#str" x="0.10em" y="0em"/>
SVG
cat ${IN_FILE:+"$IN_FILE"} | decode64 |\
sed "=" |\
paste -d " " - - |\
awk --posix '
BEGIN {
point = 0.00;
}
/[0-9]+ [0-7]/ {
point = 0.74 + 0.96 * ($1 - 1);
printf(" <use xlink:href=\"#c%d\" x=\"%.2fem\" y=\"0em\"/>\n", $2, point);
}
END {
point = point + 0.96;
printf(" <use xlink:href=\"#stp\" x=\"%.2fem\" y=\"0em\"/>\n", point);
point = point + 0.72;
printf(" <use xlink:href=\"#end\" x=\"%.2fem\" y=\"0em\"/>\n", point);
}
'
printf "%s\n" '</svg>'
# === End shell script =========================================================
exit 0
Display the source blob
Display the rendered blob
Raw
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="1em">
<style>
rect.bar {fill: black; stroke-width: 0;}
@media (prefers-color-scheme: dark) { rect.char {fill: white; stroke-width: 0;}}
</style>
<symbol id="str"><rect class="bar" x="0.44em" y="0.02em" width="0.16em" height="0.96em"/><rect class="bar" x="0.76em" y="0.34em" width="0.16em" height="0.64em"/></symbol>
<symbol id="stp"><rect class="bar" x="0.08em" y="0.34em" width="0.16em" height="0.64em"/><rect class="bar" x="0.40em" y="0.02em" width="0.16em" height="0.96em"/></symbol>
<symbol id="end"><rect class="bar" x="0.08em" y="0.00em" width="0.16em" height="0.02em"/><rect class="bar" x="0.08em" y="0.98em" width="0.16em" height="0.02em"/></symbol>
<symbol id="c0"><rect class="bar" x="0.08em" y="0.02em" width="0.16em" height="0.96em"/><rect class="bar" x="0.40em" y="0.34em" width="0.16em" height="0.32em"/><rect class="bar" x="0.72em" y="0.34em" width="0.16em" height="0.32em"/></symbol>
<symbol id="c1"><rect class="bar" x="0.08em" y="0.02em" width="0.16em" height="0.96em"/><rect class="bar" x="0.40em" y="0.02em" width="0.16em" height="0.96em"/><rect class="bar" x="0.72em" y="0.34em" width="0.16em" height="0.32em"/></symbol>
<symbol id="c2"><rect class="bar" x="0.08em" y="0.02em" width="0.16em" height="0.96em"/><rect class="bar" x="0.40em" y="0.34em" width="0.16em" height="0.64em"/><rect class="bar" x="0.72em" y="0.02em" width="0.16em" height="0.64em"/></symbol>
<symbol id="c3"><rect class="bar" x="0.08em" y="0.34em" width="0.16em" height="0.64em"/><rect class="bar" x="0.40em" y="0.02em" width="0.16em" height="0.96em"/><rect class="bar" x="0.72em" y="0.02em" width="0.16em" height="0.64em"/></symbol>
<symbol id="c4"><rect class="bar" x="0.08em" y="0.02em" width="0.16em" height="0.96em"/><rect class="bar" x="0.40em" y="0.02em" width="0.16em" height="0.64em"/><rect class="bar" x="0.72em" y="0.34em" width="0.16em" height="0.64em"/></symbol>
<symbol id="c5"><rect class="bar" x="0.08em" y="0.02em" width="0.16em" height="0.96em"/><rect class="bar" x="0.40em" y="0.34em" width="0.16em" height="0.32em"/><rect class="bar" x="0.72em" y="0.02em" width="0.16em" height="0.96em"/></symbol>
<symbol id="c6"><rect class="bar" x="0.08em" y="0.34em" width="0.16em" height="0.64em"/><rect class="bar" x="0.40em" y="0.02em" width="0.16em" height="0.64em"/><rect class="bar" x="0.72em" y="0.02em" width="0.16em" height="0.96em"/></symbol>
<symbol id="c7"><rect class="bar" x="0.08em" y="0.02em" width="0.16em" height="0.64em"/><rect class="bar" x="0.40em" y="0.02em" width="0.16em" height="0.96em"/><rect class="bar" x="0.72em" y="0.34em" width="0.16em" height="0.64em"/></symbol>
<use xlink:href="#str" x="0.0em" y="0em"/>
<use xlink:href="#c0" x="1.00em" y="0em"/>
<use xlink:href="#c1" x="1.96em" y="0em"/>
<use xlink:href="#c2" x="2.92em" y="0em"/>
<use xlink:href="#c3" x="3.88em" y="0em"/>
<use xlink:href="#c4" x="4.84em" y="0em"/>
<use xlink:href="#c5" x="5.80em" y="0em"/>
<use xlink:href="#c6" x="6.76em" y="0em"/>
<use xlink:href="#c7" x="7.72em" y="0em"/>
<use xlink:href="#stp" x="8.68em" y="0em"/>
<use xlink:href="#end" x="9.64em" y="0em"/>
</svg>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment