diff --git a/scripts/build-manpages.sh b/scripts/build-manpages.sh index 27bb97b04..ec5d143f1 100755 --- a/scripts/build-manpages.sh +++ b/scripts/build-manpages.sh @@ -1,19 +1,61 @@ #!/bin/bash # Build styled HTML manpages from man files -# Usage: build-manpages.sh +# Usage: build-manpages.sh [lang] [fallback-tldr-dir] set -euo pipefail -MANPAGES_DIR="${1:?Usage: $0 }" +MANPAGES_DIR="${1:?Usage: $0 [lang] [fallback-tldr-dir]}" TLDR_DIR="${2:?}" OUTPUT_DIR="${3:?}" TEMPLATES_DIR="${4:?}" +LANG_CODE="${5:-en}" +FALLBACK_TLDR_DIR="${6:-}" mkdir -p "$OUTPUT_DIR" MANPAGE_TEMPLATE="$TEMPLATES_DIR/manpage.html" INDEX_TEMPLATE="$TEMPLATES_DIR/manpage-index.html" +# Language display names +declare -A LANG_NAMES=( + [en]="English" [fr]="Français" [de]="Deutsch" [es]="Español" + [it]="Italiano" [pt]="Português" [pt-BR]="Português (Brasil)" + [ja]="日本語" [ko]="한국어" [ru]="Русский" [zh]="中文" + [uk]="Українська" [sv]="Svenska" [pl]="Polski" [tr]="Türkçe" + [ar]="العربية" [cs]="Čeština" [da]="Dansk" [id]="Bahasa Indonesia" +) + +LANG_NAME="${LANG_NAMES[$LANG_CODE]:-$LANG_CODE}" + +# Determine manpages base path +if [ "$LANG_CODE" = "en" ]; then + MANPAGES_PATH="manpages" +else + MANPAGES_PATH="manpages-${LANG_CODE}" +fi + +# Helper: parse a tldr markdown file into HTML +parse_tldr() { + local file="$1" + local html="" + while IFS= read -r line; do + case "$line" in + "# "* | "> "* | "---" | "") ;; + "- "*) + desc="${line#- }" + html="$html

$desc

" + ;; + '`'*'`') + cmd="${line#\`}" + cmd="${cmd%\`}" + cmd=$(echo "$cmd" | sed 's/&/\&/g; s//\>/g') + html="$html
$cmd
" + ;; + esac + done < "$file" + echo "$html" +} + manpage_names="" for man in "$MANPAGES_DIR"/usr/local/share/man/man*/*.1; do @@ -26,42 +68,43 @@ for man in "$MANPAGES_DIR"/usr/local/share/man/man*/*.1; do # Build tldr examples section tldr_html="" tldr_file="$TLDR_DIR/${name}.md" + fallback_file="${FALLBACK_TLDR_DIR:+$FALLBACK_TLDR_DIR/${name}.md}" + if [ -f "$tldr_file" ]; then + # Translated tldr available tldr_html="

Examples (from tldr)

" - while IFS= read -r line; do - case "$line" in - "# "* | "> "* | "---" | "") ;; - "- "*) - desc="${line#- }" - tldr_html="$tldr_html

$desc

" - ;; - '`'*'`') - cmd="${line#\`}" - cmd="${cmd%\`}" - cmd=$(echo "$cmd" | sed 's/&/\&/g; s//\>/g') - tldr_html="$tldr_html
$cmd
" - ;; - esac - done < "$tldr_file" + tldr_html="$tldr_html$(parse_tldr "$tldr_file")" + tldr_html="$tldr_html
" + elif [ -n "$FALLBACK_TLDR_DIR" ] && [ -f "$fallback_file" ] && [ "$LANG_CODE" != "en" ]; then + # Fall back to English + tldr_html="

Examples (from tldr)

" + tldr_html="$tldr_html

These examples are not yet translated. Help translate them.

" + tldr_html="$tldr_html$(parse_tldr "$fallback_file")" tldr_html="$tldr_html
" fi # Apply template: split at placeholders, concatenate with content - # Get line numbers of placeholders content_line=$(grep -n '{{CONTENT}}' "$MANPAGE_TEMPLATE" | cut -d: -f1) tldr_line=$(grep -n '{{TLDR}}' "$MANPAGE_TEMPLATE" | cut -d: -f1) { - # Before {{CONTENT}} - head -n $((content_line - 1)) "$MANPAGE_TEMPLATE" | sed "s|{{NAME}}|${name}|g" - # The manpage content + head -n $((content_line - 1)) "$MANPAGE_TEMPLATE" \ + | sed "s|{{NAME}}|${name}|g" \ + | sed "s|{{LANG_CODE}}|${LANG_CODE}|g" \ + | sed "s|{{LANG_NAME}}|${LANG_NAME}|g" \ + | sed "s|{{MANPAGES_PATH}}|${MANPAGES_PATH}|g" echo "$man_content" - # Between {{CONTENT}} and {{TLDR}} - sed -n "$((content_line + 1)),$((tldr_line - 1))p" "$MANPAGE_TEMPLATE" | sed "s|{{NAME}}|${name}|g" - # The tldr content + sed -n "$((content_line + 1)),$((tldr_line - 1))p" "$MANPAGE_TEMPLATE" \ + | sed "s|{{NAME}}|${name}|g" \ + | sed "s|{{LANG_CODE}}|${LANG_CODE}|g" \ + | sed "s|{{LANG_NAME}}|${LANG_NAME}|g" \ + | sed "s|{{MANPAGES_PATH}}|${MANPAGES_PATH}|g" echo "$tldr_html" - # After {{TLDR}} - tail -n +$((tldr_line + 1)) "$MANPAGE_TEMPLATE" | sed "s|{{NAME}}|${name}|g" + tail -n +$((tldr_line + 1)) "$MANPAGE_TEMPLATE" \ + | sed "s|{{NAME}}|${name}|g" \ + | sed "s|{{LANG_CODE}}|${LANG_CODE}|g" \ + | sed "s|{{LANG_NAME}}|${LANG_NAME}|g" \ + | sed "s|{{MANPAGES_PATH}}|${MANPAGES_PATH}|g" } > "$OUTPUT_DIR/${name}.html" manpage_names="$manpage_names $name" @@ -70,11 +113,17 @@ done # Build index page content_line=$(grep -n '{{LINKS}}' "$INDEX_TEMPLATE" | cut -d: -f1) { - head -n $((content_line - 1)) "$INDEX_TEMPLATE" + head -n $((content_line - 1)) "$INDEX_TEMPLATE" \ + | sed "s|{{LANG_CODE}}|${LANG_CODE}|g" \ + | sed "s|{{LANG_NAME}}|${LANG_NAME}|g" \ + | sed "s|{{MANPAGES_PATH}}|${MANPAGES_PATH}|g" for name in $(echo $manpage_names | tr ' ' '\n' | sort); do echo " ${name}" done - tail -n +$((content_line + 1)) "$INDEX_TEMPLATE" + tail -n +$((content_line + 1)) "$INDEX_TEMPLATE" \ + | sed "s|{{LANG_CODE}}|${LANG_CODE}|g" \ + | sed "s|{{LANG_NAME}}|${LANG_NAME}|g" \ + | sed "s|{{MANPAGES_PATH}}|${MANPAGES_PATH}|g" } > "$OUTPUT_DIR/index.html" -echo "Built $(echo $manpage_names | wc -w) manpages in $OUTPUT_DIR" +echo "Built $(echo $manpage_names | wc -w) manpages ($LANG_NAME) in $OUTPUT_DIR"