1
0
mirror of https://github.com/ryanoasis/nerd-fonts.git synced 2024-12-13 17:18:37 +02:00
nerd-fonts/bin/scripts/gotta-patch-em-all-font-patcher!.sh
2017-05-19 03:17:45 -05:00

256 lines
8.9 KiB
Bash
Executable File

#!/bin/bash
# version: 1.0.0
# used for debugging
#set -x
LINE_PREFIX="# [Nerd Fonts] "
# Check for Fontforge
type fontforge >/dev/null 2>&1 || {
echo >&2 "$LINE_PREFIX FontForge must be installed before running this script."
echo >&2 "# Please see installation instructions at"
echo >&2 "# http://designwithfontforge.com/en-US/Installing_Fontforge.html"
exit 1
}
res1=$(date +%s)
parent_dir="${PWD}/../../"
# Set source and target directories
source_fonts_dir="${PWD}/../../src/unpatched-fonts"
like_pattern=''
complete_variations_per_family=4
font_typefaces_count=0
font_families_count=0
complete_variation_count=0
total_variation_count=0
total_count=0
last_parent_dir=""
unpatched_parent_dir="bin/scripts/../../src/unpatched-fonts"
patched_parent_dir="patched-fonts"
max_parallel_process=64
if [ $# -eq 1 ]
then
like_pattern=$1
echo "$LINE_PREFIX Parameter given, limiting search and patch to pattern '$like_pattern' given"
fi
# simple second param option to allow to regenerate font info without re-patching
if [ $# -eq 2 ]
then
info_only=$2
echo "$LINE_PREFIX 'Info Only' Parameter given, only generating font info (not patching)"
fi
# correct way to output find results into an array (when files have space chars, etc)
# source: http://stackoverflow.com/questions/8213328/bash-script-find-output-to-array
source_fonts=()
while IFS= read -d $'\0' -r file ; do
source_fonts=("${source_fonts[@]}" "$file")
done < <(find "$source_fonts_dir" -name "$like_pattern*.[o,t]tf" -type f -print0)
# print total number of source fonts found
echo "$LINE_PREFIX Total source fonts found: ${#source_fonts[*]}"
function patch_font {
local f=$1; shift
local i=$1; shift
#echo $i
#echo $f
# take everything before the last slash (/) to start building the full path
local patched_font_dir="${f%/*}/"
# find replace unpatched parent dir with patched parent dir:
local patched_font_dir="${patched_font_dir/$unpatched_parent_dir/$patched_parent_dir}"
[[ -d "$patched_font_dir" ]] || mkdir -p "$patched_font_dir"
config_parent_dir=$( cd "$( dirname "$f" )" && cd ".." && pwd)
config_dir=$( cd "$( dirname "$f" )" && pwd)
# source the font config file if exists:
if [ -f "$config_dir/config.cfg" ]
then
source "$config_dir/config.cfg"
elif [ -f "$config_parent_dir/config.cfg" ]
then
source "$config_parent_dir/config.cfg"
fi
if [ "$post_process" ]
then
post_process="--postprocess=$post_process"
else
post_process=""
fi
if [ "$config_has_powerline" ]
then
powerline=""
combinations=$(printf "./font-patcher ${f##*/} %s\n" {' --use-single-width-glyphs',}{' --windows',}{' --fontawesome',}{' --octicons',}{' --fontlinux',}{' --pomicons',}{' --powerlineextra',}{' --fontawesomeextension',}{' --powersymbols',})
else
powerline="--powerline"
combinations=$(printf "./font-patcher ${f##*/} %s\n" {' --powerline',}{' --use-single-width-glyphs',}{' --windows',}{' --fontawesome',}{' --octicons',}{' --fontlinux',}{' --pomicons',}{' --powerlineextra',}{' --fontawesomeextension',}{' --powersymbols',})
fi
cd "$parent_dir" || {
echo >&2 "# Could not find project parent directory"
exit 1
}
fontforge -quiet -script ./font-patcher "$f" -q $powerline $post_process --complete --no-progressbars --outputdir "${patched_font_dir}complete/" 2>/dev/null
fontforge -quiet -script ./font-patcher "$f" -q -s $powerline $post_process --complete --no-progressbars --outputdir "${patched_font_dir}complete/" 2>/dev/null
fontforge -quiet -script ./font-patcher "$f" -q -w $powerline $post_process --complete --no-progressbars --outputdir "${patched_font_dir}complete/" 2>/dev/null
fontforge -quiet -script ./font-patcher "$f" -q -s -w $powerline $post_process --complete --no-progressbars --outputdir "${patched_font_dir}complete/" 2>/dev/null
# wait for this group of background processes to finish to avoid forking too many processes
# that can add up quickly with the number of combinations
#wait
}
function generate_info {
local f=$1; shift
local i=$1; shift
#echo $i
#echo $f
# take everything before the last slash (/) to start building the full path
local patched_font_dir="${f%/*}/"
# find replace unpatched parent dir with patched parent dir:
local patched_font_dir="${patched_font_dir/$unpatched_parent_dir/$patched_parent_dir}"
[[ -d "$patched_font_dir" ]] || mkdir -p "$patched_font_dir"
config_parent_dir=$( cd "$( dirname "$f" )" && cd ".." && pwd)
config_dir=$( cd "$( dirname "$f" )" && pwd)
config_parent_dir_name=$(basename "$config_parent_dir")
is_unpatched_fonts_root=0
if [ "$config_parent_dir_name" == "unpatched-fonts" ]
then
is_unpatched_fonts_root=1
font_typefaces_count=$((font_typefaces_count+1))
fi
# source the font config file if exists:
if [ -f "$config_dir/config.cfg" ]
then
source "$config_dir/config.cfg"
elif [ -f "$config_parent_dir/config.cfg" ]
then
source "$config_parent_dir/config.cfg"
fi
if [ "$config_has_powerline" ]
then
powerline=""
combinations=$(printf "./font-patcher ${f##*/} %s\n" {' --use-single-width-glyphs',}{' --windows',}{' --fontawesome',}{' --octicons',}{' --fontlinux',}{' --pomicons',}{' --powerlineextra',}{' --fontawesomeextension',}{' --powersymbols',})
else
powerline="--powerline"
combinations=$(printf "./font-patcher ${f##*/} %s\n" {' --powerline',}{' --use-single-width-glyphs',}{' --windows',}{' --fontawesome',}{' --octicons',}{' --fontlinux',}{' --pomicons',}{' --powerlineextra',}{' --fontawesomeextension',}{' --powersymbols',})
fi
font_families_count=$((font_families_count+1))
complete_variation_count=$((complete_variation_count+complete_variations_per_family))
combination_count=$(printf "%s" "$combinations" | wc -l)
# generate the readmes:
# if first time with this font then re-build parent dir readme, else skip:
if [[ $config_parent_dir != "$last_parent_dir" && (! $is_unpatched_fonts_root) ]];
then
echo "$LINE_PREFIX Re-generate parent directory readme"
generate_readme "$patched_font_dir/.."
fi
generate_readme "$patched_font_dir"
last_parent_dir=$config_parent_dir
total_variation_count=$((total_variation_count+combination_count))
total_count=$((total_count+complete_variations_per_family+combination_count))
}
# Re-generate all the readmes
# $1 = fontdir path
function generate_readme {
patched_font_dir=$1
combinations_filename="$patched_font_dir/readme.md"
font_info="$patched_font_dir/font-info.md"
# clear output file (needed for multiple runs or updates):
> "$combinations_filename"
if [ -f "$font_info" ];
then
cat "$patched_font_dir/font-info.md" >> "$combinations_filename"
else
echo "$LINE_PREFIX Could not append font-info.md (file not found). Was standardize script run? It should be executed first"
echo "# looked for: $font_info"
fi
cat "$parent_dir/src/readme-per-directory-variations.md" >> "$combinations_filename"
# add to the file
{
printf "\`\`\`sh"
printf "\n# %s Possible Combinations:\n" "$combination_count"
printf "\n"
printf "%s" "$combinations"
printf "\n"
printf "\`\`\`"
} >> "$combinations_filename"
}
if [ ! $info_only ]
then
# Iterate through source fonts
for i in "${!source_fonts[@]}"
do
patch_font "${source_fonts[$i]}" "$i" 2>/dev/null &
# un-comment to test this script (patch 1 font)
#break
# wait for this set of bg commands to finish: dont do too many at once!
# if we spawn a background process for each set of fonts it will
# end up using too many system resources
# however we want to run a certain number in parallel to decrease
# the amount of time patching all the fonts will take
# for now set a 'wait' for each X set of processes:
if [[ $(($i % $max_parallel_process)) == 0 ]];
then
echo "$LINE_PREFIX complete_variation_count after max parallel proc is $complete_variation_count"
wait
fi
done
# wait for all bg commands to finish
wait
fi
# update information in separate iteration (to avoid issues with bg processes and the counts):
# Iterate through source fonts
for i in "${!source_fonts[@]}"
do
generate_info "${source_fonts[$i]}" "$i" 2>/dev/null
done
res2=$(date +%s)
dt=$(echo "$res2 - $res1" | bc)
dd=$(echo "$dt/86400" | bc)
dt2=$(echo "$dt-86400*$dd" | bc)
dh=$(echo "$dt2/3600" | bc)
dt3=$(echo "$dt2-3600*$dh" | bc)
dm=$(echo "$dt3/60" | bc)
ds=$(echo "$dt3-60*$dm" | bc)
printf "$LINE_PREFIX Total runtime: %d:%02d:%02d:%02d\n" "$dd" "$dh" "$dm" "$ds"
printf "# All fonts patched to sub-directories in \t\t\t'%s'\n" "$patched_parent_dir"
printf "# The total number of font typefaces patched was \t\t'%s'\n" "$font_typefaces_count"
printf "# The total number of font families patched was \t\t'%s'\n" "$font_families_count"
printf "# The total number of 'complete' patched fonts created was \t'%s'\n" "$complete_variation_count"
printf "# The total number of 'variation' patched fonts created was \t'%s'\n" "$total_variation_count"
printf "# The total number of patched fonts created was \t\t'%s'\n" "$total_count"