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
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment