#! /bin/sh

# file postats.sh
#
# This file is part of LyX, the document processor.
# Licence details can be found in the file COPYING.
#
# author: Michael Schmitt, michael.schmitt@teststep.org
#
# This script extracts some information from the po file headers (last
# translator, revision date), generates the corresponding gmo files
# to retrieve the number of translated/fuzzy/untranslated messages,
# and generates a PHP web page.
#
# Invocation:
#    postats.sh po_files > "pathToWebPages"/i18n.php3


warning () {
	echo $* 1>&2
}


error () {
	warning $*
	exit 1
}


# $1 is a string like
# '588 translated messages, 1248 fuzzy translations, 2 untranslated messages.'
# Any one of these substrings may not appear if the associated number is 0.
# 
# $2 is the word following the number to be extracted,
# ie, 'translated', 'fuzzy', or 'untranslated'.
#
# extract_number fills var $number with this number, or sets it to zero if the
# word is not found in the string.
extract_number () {
	test $# -eq 2 || error 'extract_number expects 2 args'

	number=0
	echo $1 | grep $2 >/dev/null || return
	# It /is/ safe to use 'Z' as a delimiter here.
	number=`echo $1 | sed "s/\([0-9]*\)[ ]*$2/Z\1Z/" | cut -d 'Z' -f 2`
}


# $template is used by run_msgfmt, below, to fill $output. The function extracts
# the appropriate values from the data.
template="array ( 'langcode' => 'LC',
\"msg_tr\" => TR, \"msg_fu\" => FU, \"msg_nt\" => NT,
\"translator\" => \"AUTHOR\", \"email\" => \"EMAIL\",
\"date\" => \"DATE\" )"
readonly template


# $1 is the name of the po file.
#
# The function runs msgfmt on it and fills var $output.
# All other variables created in the function are unset on exit.
run_msgfmt () {
	test $# -eq 1 || error 'run_msgfmt expects 1 arg'

	output=
	test -f $1 || {
		warning "File $1 does not exist"  
		return
	}

	origdir=`pwd`
	dir=`dirname $1`
	pofile=`basename $1`
	gmofile=`echo $pofile | sed 's/po$/gmo/'`
	test $pofile != '' -a $pofile != $gmofile || {
		warning "File $1 is not a po file"  
		unset origdir dir pofile gmofile
		return
	}

	cd $dir
	unset dir

	langcode=`echo $pofile | sed 's/\.po$//'`

	# Searching for a string of the form
	# '"PO-Revision-Date: 2003-01-18 03:00+0100\n"'
	date=`grep 'Revision-Date' $pofile | sed 's/  */ /g' | cut -d ' ' -f 2`

	# Searching for a string of the form
	# '"Last-Translator: Michael Schmitt <Michael.Schmitt@teststep.org>\n"'
	translator=
	email=
	input=`grep "Last-Translator" $pofile` && {
		input=`echo $input | sed 's/  */ /g' | cut -d ' ' -f 2-`

		translator=`echo $input | cut -d '<' -f 1 | sed 's/ *$//'`
		email=`echo $input | cut -d '<' -f 2 | cut -d '>' -f 1`
	}
	unset input

	# Run msgfmt on the pofile, filling $message with the raw info.
	message=`$msgfmt --statistics -o $gmofile $pofile 2>&1 | grep "^[1-9]"` || {
		warning "Unable to run msgfmt successfully on file $1"
		cg $origdir
		unset origdir pofile gmofile
		return
	}
	unset pofile gmofile

	extract_number "$message" 'translated'
	translated=$number

	extract_number "$message" 'fuzzy'
	fuzzy=$number

	extract_number "$message" 'untranslated'
	untranslated=$number
	unset message number

	output=`echo "$template" | sed "s/LC/$langcode/; \
		s/TR/$translated/; s/FU/$fuzzy/; s/NT/$untranslated/; \
		s/AUTHOR/$translator/; s/EMAIL/$email/; s/DATE/$date/"`

	unset langcode date translator email untranslated fuzzy translated
	cd $origdir
	unset origdir
}


# The head of the generated php file.
dump_head () {
cat <<EOF
<?
	// What's the title of the page?
	\$title = "LyX i18n";
	// What's the short name of the page in the navigation bar?
	\$item="i18n";
	// Who is the author?
	\$author="Michael Schmitt";
	// Full name of the file (relative path from LyX home page -- i.e., it should
	// be "foo.php3" or "bar/foo.php3")
	\$file_full="i18n.php3";

	include("start.php3");

	error_reporting(E_ALL);
?>

<?
\$podata = array (
EOF
}


# The foot of the generated php file.
dump_tail () {
cat <<EOF
<?
\$lang = array(
	'bg' => 'Bulgarian',
	'ca' => 'Catalan',
	'cs' => 'Czech',
	'da' => 'Danish',
	'de' => 'German',
	'es' => 'Spanish',
	'eu' => 'Basque',
	'fi' => 'Finnish',
	'fr' => 'French',
	'he' => 'Hebrew',
	'hu' => 'Hungarian',
	'it' => 'Italian',
	'nl' => 'Dutch',
	'no' => 'Norwegian',
	'pl' => 'Polish',
	'pt' => 'Portuguese',
	'ro' => 'Romanian',
	'ru' => 'Russian',
	'sk' => 'Slovak',
	'sl' => 'Slovenian',
	'sv' => 'Swedish',
	'tr' => 'Turkish',
	'wa' => 'Walloon'
);

\$noOfMsg = \$podata[0]['msg_tr'] + \$podata[0]['msg_fu'] + \$podata[0]['msg_nt'];

function cmp (\$a, \$b) {
	if (\$a['msg_tr'] == \$b['msg_tr']) {
		return 0;
	}
	return (\$a['msg_tr'] > \$b['msg_tr']) ? -1 : 1;
}

usort (\$podata, "cmp");
?>

<p>
	The following table details the current state of the translations of the
	LyX GUI for the LyX stable branch (currently 1.3.1cvs).
	Unfortunately, only a few languages are well-supported. The LyX team may,
	therefore, decide to exclude some of the translations from a formal
	release in order not to confuse the user with a strongly mixed-language
	interface.
</p>
<p>
	Explanation:
</p>
<ul>
	<li><i>Translated:</i> The number of translated messages</li>
	<li><i>Fuzzy:</i> The number of fuzzy messages; these are not considered
	    for LyX output but solely serve as a hint for the translators</li>
	<li><i>Untranslated:</i> The number of untranslated messages; the
	    default language (i.e., English) will be used in the LyX outputs</li>
</ul>
<table class="center" frame="box" rules="all" border="2" cellpadding="5">
<thead>
	<tr>
		<td>Language</td>
		<td>Translated</td>
		<td>Fuzzy</td>
		<td>Untranslated</td>
		<td>Revision Date</td>
		<td>Translator</td>
	</tr>
</thead>
<tbody>
<?
while (list(\$foo,\$info) = each(\$podata)) {
	print "<tr>";

	if ( \$info['msg_tr'] > \$noOfMsg * 2 / 3 ) {
		\$style="style='background:#009900'";
	} else if ( \$info['msg_tr'] > \$noOfMsg / 2 ) {
		\$style="style='background:#AAAA00'";
	} else {
		\$style="style='background:#AA3333'";
	}

	print "<td \$style>" . \$lang[\$info['langcode']] . "</td>";

	print "<td \$style align=\"right\">" . \$info['msg_tr'] . "</td>";

	print "<td \$style align=\"right\">";
	if (isset(\$info['msg_fu'])) {
		print \$info['msg_fu'];
	} else {
		print "0";
	}
	print "</td>";

	print "<td \$style align=\"right\">";
	if (isset(\$info['msg_nt'])) {
		print \$info['msg_nt'];
	} else {
		print "0";
	}
	print "</td>";

	print "<td \$style align=\"center\">" . \$info['date'] . "</td>";

	print "<td \$style>";
	if (\$info['email'] == "") {
		print \$info['translator'];
	} else {
		print "<a href=\"mailto:" . \$info['email'] . "\">" .
			\$info['translator'] . "</a>";
	}
	print "</td>";

	print "</tr>\n";
}
?>
</tbody>
</table>
<?
include("end.php3");
?>
EOF
}


# The main body of the script
msgfmt=`which msgfmt`
test $msgfmt != '' || error "Unable to find 'msgfmt'. Cannot proceed." 

dump_head

while [ $# -ne 0 ]
do
	run_msgfmt $1
	shift
	if [ $# -eq 0 ]; then
		echo "${output});"
		echo '?>'
	else
		echo "${output},"
		echo
	fi
done

dump_tail
# The end