# Copyright 1999-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
#
# Chromium note: the Gentoo version of this eclass performs additional fc-cache
# logic in pkg_postinst()/pkg_postrm(), to generate/clean cache files
# respectively. We don't want to leave these cache files un-owned by packages,
# and instead generate those caches in the chromeos-base/chromeos-fonts ebuild.
# See also b/187790181.

# @ECLASS: font.eclass
# @MAINTAINER:
# fonts@gentoo.org
# @SUPPORTED_EAPIS: 7 8
# @BLURB: Eclass to make font installation uniform

case ${EAPI} in
	7|8) ;;
	*) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
esac

if [[ -z ${_FONT_ECLASS} ]]; then
_FONT_ECLASS=1

# @ECLASS_VARIABLE: FONT_SUFFIX
# @DEFAULT_UNSET
# @REQUIRED
# @DESCRIPTION:
# Space delimited list of font suffixes to install.
FONT_SUFFIX=${FONT_SUFFIX:-}

# @ECLASS_VARIABLE: FONT_S
# @DEFAULT_UNSET
# @DESCRIPTION:
# Directory containing the fonts.  If unset, ${S} is used instead.
# Can also be an array of several directories.

# @ECLASS_VARIABLE: FONT_PN
# @DESCRIPTION:
# Font name (ie. last part of FONTDIR).
FONT_PN=${FONT_PN:-${PN}}

# @ECLASS_VARIABLE: FONTDIR
# @DESCRIPTION:
# Full path to installation directory.
FONTDIR=${FONTDIR:-/usr/share/fonts/${FONT_PN}}

# @ECLASS_VARIABLE: FONT_CONF
# @DEFAULT_UNSET
# @DESCRIPTION:
# Array containing fontconfig conf files to install.
FONT_CONF=( "" )

# @ECLASS_VARIABLE: FONT_OPENTYPE_COMPAT
# @DEFAULT_UNSET
# @DESCRIPTION:
# Determines whether detected BDF and PCF font files should be converted
# to an SFNT wrapper, for use with newer Pango.

if [[ ${CATEGORY}/${PN} != media-fonts/encodings ]]; then
	IUSE="X"
	BDEPEND="X? (
			>=x11-apps/mkfontscale-1.2.0
			media-fonts/encodings
	)"
fi

if [[ -n ${FONT_OPENTYPE_COMPAT} ]] ; then
	IUSE+=" +opentype-compat"
	BDEPEND+=" opentype-compat? ( x11-apps/fonttosfnt )"
fi

# @FUNCTION: font_wrap_opentype_compat
# @DESCRIPTION:
# Converts .bdf and .pcf fonts detected within ${ED} to the OTB wrapper format
# using x11-apps/fonttosfnt.  Handles optional .gz extension.
font_wrap_opentype_compat() {
	local file tmpfile

	while IFS= read -rd '' file; do
		if [[ ${file} == *.gz ]] ; then
			tmpfile=${file%.*}

			gzip -cd -- "${file}" > "${tmpfile}" \
			&& fonttosfnt -v -o "${file%.*}.otb" -- "${tmpfile}" \
			&& rm -- "${tmpfile}"
		else
			fonttosfnt -v -o "${file%.*}.otb" -- "${file}"
		fi || ! break
	done < <(find "${ED}" \( -name '*.bdf' -o -name '*.bdf.gz' -o -name '*.pcf' -o -name '*.pcf.gz' \) -type f ! -type l -print0) || die
}

# @FUNCTION: font_xfont_config
# @DESCRIPTION:
# Generate Xorg font files (mkfontscale/mkfontdir).
font_xfont_config() {
	local dir_name
	if in_iuse X && use X ; then
		dir_name="${1:-${FONT_PN}}"
		rm -f "${ED}${FONTDIR}/${1//${S}/}"/{fonts.{dir,scale},encodings.dir} \
			|| die "failed to prepare ${FONTDIR}/${1//${S}/}"
		einfo "Creating fonts.scale & fonts.dir in ${dir_name##*/}"
		mkfontscale "${ED}${FONTDIR}/${1//${S}/}" || eerror "failed to create fonts.scale"
		mkfontdir \
			-e "${EPREFIX}"/usr/share/fonts/encodings \
			-e "${EPREFIX}"/usr/share/fonts/encodings/large \
			"${ED}${FONTDIR}/${1//${S}/}" || eerror "failed to create fonts.dir"
		[[ -e fonts.alias ]] && doins fonts.alias
	fi
}

# @FUNCTION: font_fontconfig
# @DESCRIPTION:
# Install fontconfig conf files given in FONT_CONF.
font_fontconfig() {
	local conffile
	if [[ -n ${FONT_CONF[@]} ]]; then
		insinto /etc/fonts/conf.avail/
		for conffile in "${FONT_CONF[@]}"; do
			[[ -e ${conffile} ]] && doins "${conffile}"
		done
	fi
}

# @FUNCTION: font_cleanup_dirs
# @DESCRIPTION:
# Remove font directories containing only generated files.
font_cleanup_dirs() {
	local genfiles="encodings.dir fonts.alias fonts.cache-1 fonts.dir fonts.scale"
	# fonts.alias isn't generated but it's a special case (see below).
	local d f g generated candidate otherfile

	ebegin "Cleaning up font directories"
	while read -d $'\0' -r; do
		candidate=false
		otherfile=false
		for f in "${d}"/*; do
			generated=false
			# make sure this is a file and not a subdir
			[[ -e ${f} || -L ${f} ]] || continue
			if has ${f##*/} ${genfiles}; then
				# this is a generated file
				generated=true
				break
			fi
			# if the file is a generated file then we know this is a font dir (as
			# opposed to something like encodings or util) and a candidate for
			# removal.  if it's not generated then it's an "otherfile".
			${generated} && candidate=true || otherfile=true
			# if the directory is both a candidate for removal and contains at
			# least one "otherfile" then don't remove it.
			[[ ${candidate} == ${otherfile} ]] && break
		done
		# if in the end we only have generated files, purge the directory.
		if [[ ${candidate} == true && ${otherfile} == false ]]; then
			# we don't want to remove fonts.alias files that were installed by
			# media-fonts/font-alias. any other fonts.alias files will have
			# already been unmerged with their packages.
			for g in ${genfiles}; do
				if [[ ${g} != fonts.alias && ( -e ${d}/${g} || -L ${d}/${g} ) ]] ; then
					rm "${d}"/${g} || eerror "failed to remove ${d}/${g}"
				fi
			done
			# if there's nothing left remove the directory
			find "${d}" -maxdepth 0 -type d -empty -delete || eerror "failed to purge ${d}"
		fi
	done < <(find -L "${EROOT}"/usr/share/fonts/ -type d -print0)
	eend 0
}

# @FUNCTION: font_pkg_setup
# @DESCRIPTION:
# The font pkg_setup function.
# Collision protection
font_pkg_setup() {
	# make sure we get no collisions
	# setup is not the nicest place, but preinst doesn't cut it
	if [[ -e "${EROOT}${FONTDIR}/fonts.cache-1" ]] ; then
		rm "${EROOT}${FONTDIR}/fonts.cache-1" || die "failed to remove fonts.cache-1"
	fi
}

# @FUNCTION: font_src_install
# @DESCRIPTION:
# The font src_install function.
font_src_install() {
	local dir suffix commondoc

	if [[ -n ${FONT_OPENTYPE_COMPAT} ]] && in_iuse opentype-compat && use opentype-compat ; then
		font_wrap_opentype_compat
	fi

	if [[ $(declare -p FONT_S 2>/dev/null) == "declare -a"* ]]; then
		# recreate the directory structure if FONT_S is an array
		for dir in "${FONT_S[@]}"; do
			pushd "${dir}" > /dev/null || die "pushd ${dir} failed"
			insinto "${FONTDIR}/${dir#"${S}"}"
			for suffix in ${FONT_SUFFIX}; do
				doins *.${suffix}
			done
			font_xfont_config "${dir}"
			popd > /dev/null || die
		done
	else
		pushd "${FONT_S:-${S}}" > /dev/null \
			|| die "pushd ${FONT_S:-${S}} failed"
		insinto "${FONTDIR}"
		for suffix in ${FONT_SUFFIX}; do
			doins *.${suffix}
		done
		font_xfont_config
		popd > /dev/null || die
	fi

	font_fontconfig

	einstalldocs

	# install common docs
	for commondoc in COPYRIGHT FONTLOG.txt; do
		[[ -s ${commondoc} ]] && dodoc ${commondoc}
	done
}

# @FUNCTION: font_pkg_postinst
# @DESCRIPTION:
# The font pkg_postinst function.
# We've stubbed this out (see Chromium notes above) but leave its identifier,
# so portage-stable ebuilds can still refer to it.
font_pkg_postinst() {
	:
}

# @FUNCTION: font_pkg_postrm
# @DESCRIPTION:
# The font pkg_postrm function.
font_pkg_postrm() {
	font_cleanup_dirs
}

fi

EXPORT_FUNCTIONS pkg_setup src_install pkg_postinst pkg_postrm
