#!/bin/sh # # po4a-display-man shows a translated manpage, recompiling everything on the fly with po4a. # Translators can see the effects of their work without reinstalling everything. # OPTIONS="" usage() { echo "Usage: $0 -p PO_FILE [-m MASTER_FILE] [-o PO4A_OPT]" return 0 } error () { echo "Error: $1" 1>&2 exit 1 } while getopts m:p:ho: option do case $option in m) MASTER="$OPTARG" ;; p) PO="$OPTARG" ;; o) OPTIONS="$OPTIONS $OPTARG" ;; h) usage exit 0 ;; [?]) usage 1>&2 exit 1 ;; esac done if [ -z "$PO" ] then usage 1>&2 exit 1 fi if [ ! -f "$PO" ] then error "could not find PO file: $PO" fi if [ -z "$MASTER" ] then echo "No manpage specified." echo "Trying to find the manpage according to a line reference in the PO." MASTER=$(grep -m 1 "^#:" $PO | sed -e 's/^.* \(.*\):.*$/\1/') fi find_man() { section="$1" man="$2" echo -n "Looking for manpage $file" [ -n "$section" ] && echo " in section $section" || echo "" MAN_NUMBER=`man --all --where --locale=C $section "$man" 2> /dev/null | wc -l` if [ "$MAN_NUMBER" = "0" ] then return 1 elif [ "$MAN_NUMBER" != "1" ]; then MAN_NUMBER=`man --all --where --locale=C $section "$man" 2> /dev/null | \ grep "\/$man\.$section\(.gz\)\?$" | wc -l` if [ "$MAN_NUMBER" = "1" ] then MASTER=`man --where --locale=C "$section" "$man" | grep "\/$man\.$section\(.gz\)\?$"` echo "Multiple manpages in section $section: $(man -aw -L C $section "$man"), only one exactly matches the section." else error "Too many possible manpages: $(man -aw -L C $section "$man"), you must specify the manpage or the section" fi else MASTER=`man --where --locale=C "$section" "$man"` fi return 0 } if [ ! -f "$MASTER" ] then echo "Can't find the master man page $MASTER" file=$(basename "$MASTER") MASTER="" section="" if ! find_man "" "$file" then # Maybe $file contains a section # (in the form of file.section.extension) section=$(echo "$file" | sed -ne 's/^.*\.\([1-9].*\)$/\1/; s/\..*//; p') file=$(echo "$file" | sed -e 's/\.[1-9].*//') if ! find_man "$section" "$file" then # Maybe there is an extension at the end of the manpage (e.g. .man) file=$(echo "$file" | sed -e 's/\..*//') if ! find_man "$section" "$file" then echo "No manpage found" echo "You must provide the manpage with the -m option" MASTER="" fi fi fi if [ -n "$MASTER" ] then echo "Using: $MASTER as the original manpage" fi fi # checking mandatory options if [ -z "$MASTER" ] then usage 1>&2 exit 1 fi # checking files if [ ! -e "$MASTER" ] then error "could not find master file: $MASTER" fi if [ "${MASTER%.gz}" = "$MASTER" ] then MAINNAME="$MASTER" else MAINNAME=`mktemp` trap "rm \"$MAINNAME\"" EXIT INT gunzip -c "$MASTER" > "$MAINNAME" fi CHARSET_MASTER=`file -i "$MAINNAME" | cut -d "=" -f 2` CHARSET_PO=`file -i "$PO" | cut -d "=" -f 2` po4a-translate -f man -k 0 -m "$MAINNAME" -M "$CHARSET_MASTER" \ -p "$PO" $OPTIONS| iconv -f "$CHARSET_PO" -t // | man -l - # TODO: man may need some options (e.g. -L) # as we cannot detect what options are needed, they will have to be # specified on the po4a-display-man command line.