#!/bin/bash # This file is part of GNU TALER. # Copyright (C) 2014-2023 Taler Systems SA # # TALER is free software; you can redistribute it and/or modify it under the # terms of the GNU Lesser General Public License as published by the Free Software # Foundation; either version 2.1, or (at your option) any later version. # # TALER is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License along with # TALER; see the file COPYING. If not, see # # @author Florian Dold # @author Benedikt Muller # @author Sree Harsha Totakura # @author Marcello Stanisci # @author Christian Grothoff # # # Error checking on set -eu # Call with target language as first argument. function make_config() { cat >"${BUILDDIR}/conf.py" <&2 exit 1 } # defaults AUTHOR="GNU Taler team" VERSION="exchange-tos-v0" LOCALE_DIR=$(taler-config -s "PATHS" -o "LOCALEDIR" -f) OUTPUT=$(taler-config -s "EXCHANGE" -o "TERMS_DIR" -f) PAPER="a4" COPYRIGHT="2014-2023 Taler Systems SA (GPLv3+ or GFDL 1.3+)" INCREMENTAL=0 # Parse command-line options while getopts ':a:C:hKi:l:L:o:p:t:' OPTION; do case "$OPTION" in a) AUTHOR="$OPTARG" ;; C) COPYRIGHT="$OPTARG" ;; h) echo 'Supported options:' echo ' -a AUTHOR -- set author header' "(default: $AUTHOR)" echo ' -C COPYRIGHT -- set copyright header' "(default: $COPYRIGHT)" echo ' -h -- print this help' echo ' -K -- rebuild only if input is older than output' echo ' -i INPUT -- input file to convert' "(default: $VERSION)" echo ' -l LANGUAGE -- target language to add' echo ' -L LOCALE_DIR -- directory with resources for translation' "(default: $LOCALE_DIR)" echo ' -o OUTPUT -- output directory' "(default: $OUTPUT)" echo ' -p PAPER -- paper format' "(default: $PAPER)" echo ' -t TITLE -- title of the document to generate' exit 0 ;; l) ADD_LANGUAGE="$OPTARG" ;; L) LOCALE_DIR="$OPTARG" ;; i) VERSION="$OPTARG" ;; o) OUTPUT="$OPTARG" ;; p) PAPER="$OPTARG" case "$PAPER" in a4 | letter) ;; *) echo "Error: Paper format '$PAPER' invalid (use 'a4' or 'letter')" 1>&2 exit 1 ;; esac ;; t) TITLE="$OPTARG" ;; K) INCREMENTAL=1 ;; ?) echo "Unrecognized command line option" 1>&2 exit 1 ;; esac done if ! which sphinx-build >/dev/null; then echo "Command 'sphinx-build' not found, but required. Please install sphinx." 1>&2 exit 1 fi if ! which pandoc >/dev/null; then echo "Command 'pandoc' not found, but required. Please install pandoc." 1>&2 exit 1 fi if ! which gs >/dev/null; then echo "Command 'gs' not found, but required. Please install ghostscript." 1>&2 exit 1 fi if ! which pdfroff >/dev/null; then echo "Command 'pdfroff' not found, but required. Please install pdfroff/groff." 1>&2 exit 1 fi if ! which make >/dev/null; then echo "Command 'make' not found, but required. Please install make." 1>&2 exit 1 fi # We append ".rst" if needed, remove if given on command-line # shellcheck disable=SC2001 VERSION=$(echo "${VERSION}" | sed -e "s/\.rst$//") # Sometimes we just want the basename, not the directory. VERSION_BASENAME=$(basename "${VERSION}") BUILDDIR=$(mktemp -d /tmp/taler-terms-XXXXXX) if [ ! -f "${VERSION}.rst" ]; then echo "Error: File '${VERSION}.rst' not found. Please check '-i' option." 1>&2 exit 1 fi cp "${VERSION}.rst" "${BUILDDIR}/" if [ -z ${TITLE+x} ]; then TITLE=$(head -n1 "${VERSION}.rst") echo "Title automatically set to '$TITLE'" 1>&2 fi if [ -n "${ADD_LANGUAGE+x}" ]; then if ! echo "${ADD_LANGUAGE}" | grep -e '^..$' >/dev/null; then echo "Error: Invalid language '${ADD_LANGUAGE}'. Two characters (en, de, fr, ...) expected." 1>&2 exit 1 fi echo "Adding language files for translations to '${ADD_LANGUAGE}'" 1>&2 make_config "${ADD_LANGUAGE}" sphinx-build \ -b gettext \ -D language="${ADD_LANGUAGE}" \ -d "${BUILDDIR}/.doctrees" \ "${BUILDDIR}" \ "${LOCALE_DIR}/${ADD_LANGUAGE}/LC_MESSAGES/" \ &>"${BUILDDIR}/add-language.log" || failcat "${BUILDDIR}/add-language.log" if [ -f "${LOCALE_DIR}/${ADD_LANGUAGE}/LC_MESSAGES/${VERSION_BASENAME}.po" ]; then msgmerge --lang="${ADD_LANGUAGE}" \ --no-location \ -o "${LOCALE_DIR}/${ADD_LANGUAGE}/LC_MESSAGES/${VERSION_BASENAME}.mrg" \ "${LOCALE_DIR}/${ADD_LANGUAGE}/LC_MESSAGES/${VERSION_BASENAME}.po" \ "${LOCALE_DIR}/${ADD_LANGUAGE}/LC_MESSAGES/${VERSION_BASENAME}.pot" mv "${LOCALE_DIR}/${ADD_LANGUAGE}/LC_MESSAGES/${VERSION_BASENAME}.mrg" \ "${LOCALE_DIR}/${ADD_LANGUAGE}/LC_MESSAGES/${VERSION_BASENAME}.po" else mv "${LOCALE_DIR}/${ADD_LANGUAGE}/LC_MESSAGES/${VERSION_BASENAME}.pot" \ "${LOCALE_DIR}/${ADD_LANGUAGE}/LC_MESSAGES/${VERSION_BASENAME}.po" fi rm -f "${LOCALE_DIR}/${ADD_LANGUAGE}/LC_MESSAGES/${VERSION_BASENAME}.pot" echo "Done" 1>&2 exit 0 fi # As a heuristic for incremental builds, we only check the text output file. if [[ $INCREMENTAL -eq 1 ]]; then if [[ "${VERSION}.rst" -ot "${OUTPUT}/buildstamp" ]]; then echo "Not rebuilding, input file $VERSION is older than $OUTPUT/buildstamp." exit 0 fi fi # shellcheck disable=SC2086 for d in en $(ls -d ${LOCALE_DIR}/?? | grep -v "en" 2>/dev/null || true); do LANGUAGE=$(basename "$d") if [ "en" != "${LANGUAGE}" ] && [ ! -f "${LOCALE_DIR}/${LANGUAGE}/LC_MESSAGES/${VERSION_BASENAME}.po" ]; then echo "Skipping language ${LANGUAGE}: no translation for ${VERSION_BASENAME} found." continue fi echo "Generating files at '$OUTPUT' for ETag '$VERSION_BASENAME' and language '${LANGUAGE}' in '${BUILDDIR}':" 1>&2 make_config "$LANGUAGE" mkdir -p "${OUTPUT}/${LANGUAGE}/" LBUILD="sphinx-build -D language=${LANGUAGE} -d ${BUILDDIR}/.doctrees" OUTBASE="${OUTPUT}/${LANGUAGE}/${VERSION_BASENAME}" echo "$VERSION_BASENAME MD ($LANGUAGE)..." 1>&2 $LBUILD \ -b markdown \ "${BUILDDIR}" \ "${BUILDDIR}/md" \ &>"${BUILDDIR}/md-sphinx.log" || failcat "${BUILDDIR}/md-sphinx.log" BUILDFILE_MARKDOWN="${BUILDDIR}/md/${VERSION_BASENAME}.md" cp "$BUILDFILE_MARKDOWN" "${OUTBASE}.md" # Convert the generated Markdown (!) to other formats. echo "$VERSION_BASENAME PDF ($LANGUAGE)..." 1>&2 pandoc \ -i "$BUILDFILE_MARKDOWN" \ -o "${OUTBASE}.pdf" \ --pdf-engine=pdfroff \ --shift-heading-level-by=-1 echo "$VERSION_BASENAME HTML ($LANGUAGE)..." 1>&2 # FIXME: Newer versions of pandic should use # --embed-resources --standalone instead of --self-contained pandoc \ -i "$BUILDFILE_MARKDOWN" \ -o "${OUTBASE}.html" \ --self-contained \ --shift-heading-level-by=-1 echo "$VERSION_BASENAME TXT ($LANGUAGE)..." 1>&2 pandoc \ -i "$BUILDFILE_MARKDOWN" \ -o "${OUTBASE}.txt" done if [[ $INCREMENTAL -eq 1 ]]; then touch "${OUTPUT}/buildstamp" fi echo "Done" 1>&2 exit 0