1
0
Fork 0
util-linux/tools/poman-translate.sh
Daniel Baumann c36e531662
Adding upstream version 2.41.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-21 11:26:35 +02:00

168 lines
4.9 KiB
Bash
Executable file

#!/usr/bin/env bash
set -eou pipefail
function usage()
{
cat << HEREDOC
Usage: $PROGRAM --srcdir <srcdir> --destdir <destdir> --asciidoctor-load-path <directory> --docdir <docdir> --po4acfg <file> --util-linux-version <version> [<asciidoc file>...]
Translate Asciidoc man page source files and generate man pages.
Options:
--help show this help message and exit
--progress report the current progress
--srcdir <srcdir> directory containing the asciidoc files to translate
--destdir <destdir> directory in which to place the translated asciidoc files and man pages
--asciidoctor-load-path <directory> value for the --load-path option passed to the Asciidoctor command
--docdir <docdir> directory where the package documentation will be installed
--util-linux-version <version> version of util-linux to include in the man pages
--po4acfg <file> path to the po4a.cfg file
HEREDOC
}
PROGRAM=$(basename "$0")
PROGRESS=false
while [[ $# -gt 0 ]]; do
case $1 in
--srcdir)
SRCDIR="$2"
shift
shift
;;
--destdir)
DESTDIR="$2"
shift
shift
;;
--asciidoctor-load-path)
ASCIIDOCTOR_LOAD_PATH="$2"
shift
shift
;;
--docdir)
DOCDIR="$2"
shift
shift
;;
--help)
usage
exit 0
;;
--po4acfg)
PO4ACFG="$2"
shift
shift
;;
--progress)
PROGRESS=true
shift
;;
--util-linux-version)
UTIL_LINUX_VERSION="$2"
shift
shift
;;
--*|-*)
echo "Unknown option $1"
usage
exit 1
;;
*)
ADOCS+=("$1")
shift
;;
esac
done
set -- "${ADOCS[@]}"
mapfile -t LOCALES < <( awk '/\[po4a_langs\]/ {for (i=2; i<=NF; i++) print $i}' "$PO4ACFG" )
mapfile -t PO4ACFG_TRANSLATIONS < <( awk '/\[type:asciidoc\]/ {print $2;}' "$PO4ACFG" )
mkdir --parents "$DESTDIR"
DESTDIR=$( OLDPWD=- CDPATH='' cd -P -- "$DESTDIR" && pwd )
MANADOCS=()
PO4A_TRANSLATE_ONLY_FLAGS=()
for LOCALE in "${LOCALES[@]}"; do
for ADOC in "${ADOCS[@]}"; do
if [[ "$ADOC" == *"/man-common/manpage-stub.adoc" ]]; then
continue
fi
ADOC_NAME=$(basename "$ADOC")
if [[ ! " ${PO4ACFG_TRANSLATIONS[*]} " =~ .*${ADOC_NAME}[[:space:]] ]]; then
echo "unconfigured in $PO4ACFG: $ADOC"
continue
fi
PO4A_TRANSLATE_ONLY_FLAGS+=("--translate-only")
if [[ "$ADOC" == *"/man-common/"* ]]; then
PO4A_TRANSLATE_ONLY_FLAGS+=("$LOCALE/man-common/$ADOC_NAME")
else
MANADOCS+=("$LOCALE/$ADOC_NAME")
PO4A_TRANSLATE_ONLY_FLAGS+=("$LOCALE/$ADOC_NAME")
fi
done
done
if [ ${#MANADOCS[@]} -eq 0 ] && [ ${#PO4A_TRANSLATE_ONLY_FLAGS[@]} -gt 0 ]; then
echo "Only man-common Asciidoc files were supplied"
exit 1
fi
# Only version 0.72 and later of po4a properly support the --translate-only flag.
PO4A_VERSION=$(po4a --version | { read -r _ _ v; echo "${v%*.}"; })
if echo "0.72" "$PO4A_VERSION" | sort --check --version-sort; then
PO4A_TRANSLATE_ONLY_FLAGS=("--no-update")
fi
[ "$PROGRESS" = true ] && echo "po4a: generate man-pages translations"
DISCARDED_TRANSLATIONS=()
output=$(po4a --srcdir "$SRCDIR" --destdir "$DESTDIR" "${PO4A_TRANSLATE_ONLY_FLAGS[@]}" "$PO4ACFG")
while IFS= read -r line; do
DISCARDED_TRANSLATION=$(echo "$line" | awk '/Discard/ {print $2;}')
if [ -n "${DISCARDED_TRANSLATION+x}" ]; then
DISCARDED_TRANSLATIONS+=("$DISCARDED_TRANSLATION")
fi
done <<< "$output"
TRANSLATED_MANADOCS=()
if [ ${#MANADOCS[@]} -eq 0 ]; then
for LOCALE in "${LOCALES[@]}"; do
shopt -s nullglob
TRANSLATED_MANADOCS=("$DESTDIR/$LOCALE"/*\.adoc)
done
else
for MANADOC in "${MANADOCS[@]}"; do
if [[ ! " ${DISCARDED_TRANSLATIONS[*]} " =~ [[:space:]]${MANADOC}[[:space:]] ]]; then
TRANSLATED_MANADOCS+=("$DESTDIR/$MANADOC")
fi
done
fi
for ADOC in "${TRANSLATED_MANADOCS[@]}"; do
LOCALE=$(basename "$(dirname "$ADOC")")
PAGE="${ADOC%.*}"
SECTION="${PAGE##*.}"
if [ "$PROGRESS" = true ]; then
PAGENAME=$(basename $PAGE)
echo " GEN " $LOCALE ": " $PAGENAME
fi
asciidoctor \
--backend manpage \
--attribute VERSION="$UTIL_LINUX_VERSION" \
--attribute release-version="$UTIL_LINUX_VERSION" \
--attribute ADJTIME_PATH=/etc/adjtime \
--attribute package-docdir="$DOCDIR" \
--base-dir "$DESTDIR/$LOCALE" \
--destination-dir "$DESTDIR/man/$LOCALE/man$SECTION" \
--load-path "$ASCIIDOCTOR_LOAD_PATH" \
--require asciidoctor-includetracker \
--require asciidoctor-unicodeconverter \
--trace \
"$ADOC"
done