DIR="$(cd "$(dirname "${BASH_SRC_DIR[0]}")" >/dev/null 2>&1 && pwd)"
SCRIPT_NAME=$(basename $0)
COLOUR_BLUE='\033[1;34m'
COLOUR_PINK='\033[1;35m'
COLOUR_DKGRAY='\033[30m'
COLOUR_DKRED='\033[31m'
COLOUR_YELLOW='\033[1;33m'
COLOUR_OFF='\033[0m'
COLOUR_LOGGING=$COLOUR_BLUE
COLOUR_WARNING=$COLOUR_YELLOW
TPL_DIR="$DIR/template"
INC_DIR="$TPL_DIR/includes"
ARG_FONT=false
unset ARG_HELP
unset ARG_DEBUG
unset ARG_FONT
main() {
check_requirements
parse_commandline $@
if [ ! -z "$ARG_HELP" ]; then
show_usage
fi
if [ ! -z "$ARG_FONT" ]; then
> $INC_DIR/css/main.min.css
convert_markdown index.md
apply_templates index.html
minify_fonts index.html
fi
minify_artefacts
convert_markdown index.md
apply_templates index.html
minify_html index.html
}
convert_markdown() {
log "Convert $1 to HTML..."
pandoc "$1" \
--lua-filter svg.lua \
-f markdown-auto_identifiers \
-o "$INC_DIR/html/body.html"
}
minify_artefacts() {
log "Minify CSS..."
closure.sh --allow-unrecognized-properties css/*.css > "$INC_DIR/css/main.min.css"
}
apply_templates() {
log "Generate $1 using files from template directory..."
fmpp -Q -S "$TPL_DIR" -O . "$1"
}
minify_html() {
log "Minify ${1}..."
tidy -m -q \
--wrap 0 \
--tidy-mark no \
--vertical-space auto \
--doctype html5 \
"$1"
}
minify_fonts() {
log "Minify fonts based on text from ${1}..."
CHARSET=$(lynx -dump -nolist "$1" \
| sed 's/./&\n/g' \
| sort -u \
| uniq \
| tr -d '\n')
log "Glyphs: $CHARSET"
pushd fonts > /dev/null
for i in *; do
log "Remove glyphs from ${i}..."
FILE_FONT=ss_$i
TEMPDIR=/tmp
pyftsubset $i --text="$CHARSET" --output-file="$TEMPDIR/$FILE_FONT"
sfnt2woff $TEMPDIR/$FILE_FONT
FILE_WOFF="${FILE_FONT%.*}".woff
FILE_WOFF_BASE64=$TEMPDIR/$FILE_WOFF.b64
base64 -w 0 $TEMPDIR/$FILE_WOFF > $FILE_WOFF_BASE64
FONT_NAME=${i%.*}
FONT_FAMILY=${i%-*}
FONT_WEIGHT=${i#*-}
FONT_WEIGHT=${FONT_WEIGHT%.*}
CSS_FONT_WEIGHT=400
CSS_FONT_STYLE=normal
log "Parse font family ${FONT_NAME}..."
case "$FONT_WEIGHT" in
ExtraLight|UltraLight)
CSS_FONT_WEIGHT=100
;;
Light|Thin)
CSS_FONT_WEIGHT=200
;;
Book|Demi)
CSS_FONT_WEIGHT=300
;;
Medium)
CSS_FONT_WEIGHT=500
;;
SemiBold|DemiBold)
CSS_FONT_WEIGHT=600
;;
Bold)
CSS_FONT_WEIGHT=700
;;
Black|ExtraBold|Heavy)
CSS_FONT_WEIGHT=800
;;
ExtraBlack|Fat|Poster|UltraBlack)
CSS_FONT_WEIGHT=900
;;
Italic)
CSS_FONT_STYLE=italic;
;;
Oblique)
CSS_FONT_STYLE=oblique;
;;
LightItalic|ThinItalic)
CSS_FONT_WEIGHT=200
CSS_FONT_STYLE=italic;
;;
MediumItalic)
CSS_FONT_WEIGHT=500
CSS_FONT_STYLE=italic;
;;
BoldItalic)
CSS_FONT_WEIGHT=500
CSS_FONT_STYLE=italic;
;;
BoldOblique)
CSS_FONT_WEIGHT=500
CSS_FONT_STYLE=oblique;
;;
esac
log "Font weight: ${CSS_FONT_WEIGHT}"
log "Font style: ${CSS_FONT_STYLE}"
cat > ../css/font-$FONT_NAME.css << EOF
@font-face {
font-family: '${FONT_FAMILY}';
src: url(data:font/woff;charset=utf-8;base64,$(cat $FILE_WOFF_BASE64)) format('woff');
font-weight: ${CSS_FONT_WEIGHT};
font-style: ${CSS_FONT_STYLE};
font-display: block;
}
EOF
done
popd > /dev/null
}
check_requirements() {
required pyftsubset "https://github.com/fonttools/fonttools"
required base64 "https://linux.die.net/man/1/base64"
required tidy "https://github.com/htacg/tidy-html5"
required fmpp "http://fmpp.sourceforge.net/"
required pandoc "http://pandoc.org/"
required closure.sh "https://developers.google.com/closure/"
required sfnt2woff "https://github.com/kseo/sfnt2woff"
}
required() {
if ! command -v $1 > /dev/null 2>&1; then
warning "Install $1 from $2"
exit 1
fi
}
coloured_text() {
printf "%b$1%b\n" "$2" "$COLOUR_OFF"
}
warning() {
coloured_text "$1" "$COLOUR_WARNING"
}
log() {
if [ ! -z "$ARG_DEBUG" ]; then
printf "[$(date +%H:%I:%S.%4N)] %b" "$COLOUR_LOGGING"
echo -e $1
printf "%b" "$COLOUR_OFF"
fi
}
parse_commandline() {
POSITIONAL=()
while [[ $
key="$1"
case $key in
-d|--debug)
ARG_DEBUG="true"
shift
;;
-h|-\?|--help)
ARG_HELP="true"
shift
;;
-f|--font)
ARG_FONT="true"
shift
;;
*)
shift
;;
esac
done
set -- "${POSITIONAL[@]}"
}
show_usage() {
printf "Usage: $SCRIPT_NAME [-f|--font]\n" >&2
printf "Where: --font Regenerate minified fonts\n" >&2
exit 1
}
main $@