#!/bin/bash
X11DIR=/usr/X11
X11FONTDIR=${X11DIR}/lib/X11/fonts
system=0
osxfonts=1
force=0
verbose=0
check_dirty() {
local dir=$1
local fontfiles=""
local retval=1
if [[ ! -d "${dir}" ]]; then
return 1
fi
fontfiles="$(find ${dir}/ -maxdepth 1 -type f | awk '$0 !~ /fonts\..*$|^.*\.dir$/ {print}')"
if [[ -z "${fontfiles}" ]] ; then
local f
for f in "${dir}"/fonts.* "${dir}"/encodings.dir; do
if [[ -f ${f} ]] ; then
rm -f "${f}"
fi
done
return 1
fi
if [[ ${force} == 1 ]] ; then
retval=0
fi
if [[ ! -f "${dir}/fonts.list" || ! -f "${dir}/fonts.dir" || ! -f "${dir}/encodings.dir" ]]; then
retval=0
fi
if [[ "${retval}" -ne 0 && "$(cat ${dir}/fonts.list)" != "${fontfiles}" ]] ; then
retval=0
fi
if [[ "${retval}" -ne 0 ]] ; then
local changed="$(find ${dir}/ -type f -cnewer ${dir}/fonts.dir | awk '$0 !~ /fonts\..*$|^.*\.dir$/ {print}')"
if [[ -n "${changed}" ]] ; then
retval=0
fi
fi
if [[ "${retval}" == 0 ]] ; then
echo "${fontfiles}" > "${dir}"/fonts.list
fi
return ${retval}
}
get_fontdirs() {
local d
if [[ $system == 1 ]] ; then
if [[ $osxfonts == 1 ]] ; then
find {/System/,/}Library/Fonts -type d
fi
for d in "${X11FONTDIR}"/* ; do
case ${d conf*|encodings*) ;;
*) find "$d" -type d ;;
esac
done
else
if [[ $osxfonts == 1 && -d "${HOME}/Library/Fonts" ]] ; then
find "${HOME}/Library/Fonts" -type d
fi
if [[ -d "${HOME}/.fonts" ]] ; then
find "${HOME}/.fonts" -type d
fi
fi
}
setup_fontdirs() {
local x=""
local fontdirs=""
local changed="no"
umask 022
if [[ $system == 1 ]] ; then
echo "font_cache: Scanning system font directories to generate X11 font caches"
else
echo "font_cache: Scanning user font directories to generate X11 font caches"
fi
if [[ $system == 1 ]] ; then
${X11DIR}/bin/mkfontdir -n \
-e ${X11FONTDIR}/encodings \
-e ${X11FONTDIR}/encodings/large \
-- ${X11FONTDIR}/encodings
fi
OIFS=$IFS
IFS='
'
for x in $(get_fontdirs) ; do
if [[ -d "${x}" ]] && check_dirty "${x}" ; then
if [[ -z "${fontdirs}" ]] ; then
fontdirs="${x}"
else
fontdirs="${fontdirs}${IFS}${x}"
fi
fi
done
if [[ -n "${fontdirs}" ]] ; then
echo "font_cache: Making fonts.dir for updated directories."
for x in ${fontdirs} ; do
if [[ $verbose == 1 ]] ; then
echo "font_cache: ${x}"
fi
${X11DIR}/bin/mkfontscale \
-a ${X11FONTDIR}/encodings/encodings.dir \
-- ${x}
if [[ $verbose == 1 ]] ; then
${X11DIR}/bin/mkfontdir \
-e ${X11FONTDIR}/encodings \
-e ${X11FONTDIR}/encodings/large \
-- ${x}
else
${X11DIR}/bin/mkfontdir \
-e ${X11FONTDIR}/encodings \
-e ${X11FONTDIR}/encodings/large \
-- ${x} > /dev/null
fi
done
fi
IFS=$OIFS
echo "font_cache: Updating FC cache"
if [[ $system == 1 ]] ; then
HOME="$(echo ~root)" ${X11DIR}/bin/fc-cache \
$([[ $force == 1 ]] && echo "-f -r") \
$([[ $verbose == 1 ]] && echo "-v")
else
${X11DIR}/bin/fc-cache \
$([[ $force == 1 ]] && echo "-f -r") \
$([[ $verbose == 1 ]] && echo "-v")
fi
echo "font_cache: Done"
}
do_usage() {
echo "font_cache [options]"
echo " -f, --force : Force cache recreation"
echo " -n, --no-osxfonts : Just cache X11 font directories"
echo " (-n just pertains to XFont cache, not fontconfig)"
echo " -s, --system : Cache system font dirs instead of user dirs"
echo " -v, --verbose : Verbose Output"
}
while [[ $ case $1 in
-s|--system) system=1 ;;
-f|--force) force=1 ;;
-v|--verbose) verbose=1 ;;
-n|--no-osxfonts) osxfonts=0 ;;
--help) do_usage ; exit 0 ;;
*) do_usage ; exit 1 ;;
esac
shift
done
setup_fontdirs