#!/usr/bin/php -q
<?php
/**
 * Check XML files intended to be used with Translation2
 *
 * @category  Internationalization
 * @package   Translation2
 * @author    Olivier Guilyardi <ylf@xung.org>
 * @copyright 2004-2007 Olivier Guilyardi
 * @license   http://www.debian.org/misc/bsd.license  BSD License (3 Clause)
 * @version   CVS: $Id: t2xmlchk.php,v 1.5 2007/10/29 21:10:02 quipo Exp $
 * @link      http://pear.php.net/package/Translation2
 */
//error_reporting (E_ALL);

if (substr(phpversion(), 0, 1) != '4') {
    exit("Sorry, this script will only run under PHP4 (that is: not PHP5)\n");
}

function print_usage()
{
    echo "t2xmlchk checks and validates XML files intended to be used with \n" . 
         "the Translation2 internationalization package.\n" . 
         "Usage: t2xmlchk <xml filename>\n";
}

require_once 'Translation2/Container/xml.php';
require_once 'XML/DTD/XmlValidator.php';

if (!$xml_file = $argv[1]) {
    echo "ERROR : No xml filename provided\n\n";
    print_usage();
    exit("\n");
}

if (!is_readable($xml_file)) {
    echo "ERROR : No such file : \"$xml_file\"\n\n";
    print_usage();
    exit("\n");
}

$validator =& new XML_DTD_XmlValidator();

$dtd_file = tempnam('/tmp', 't2');
$fp = fopen($dtd_file, 'w');
fwrite($fp, TRANSLATION2_DTD);
fclose($fp);

echo "Performing DTD validation... ";
$test = $validator->isValid($dtd_file, $xml_file);
unlink($dtd_file);
if ($test) {
    echo "OK\n";
} else {
    exit("FAILED : " . $validator->getMessage() . "\n");
}

echo "Unserializing... ";

$keyAttr = array(
    'lang'   => 'id',
    'page'   => 'key',
    'string' => 'key',
    'tr'     => 'lang'
);
$unserializer = &new XML_Unserializer(array('keyAttribute' => $keyAttr));
if (PEAR::isError($status = $unserializer->unserialize($xml_file, true))) {
    exit("FAILED : " .  $status->getMessage() . "\n");
} else {
    echo "OK\n";
}

$data = $unserializer->getUnserializedData();
Translation2_Container_xml::fixEmptySets($data);

// This should be done by XML_DTD :
echo "Checking lang IDs... ";

$known_langs = array();

foreach ($data['languages'] as $lang => $spec) {
    echo "$lang ";
    $known_langs[] = $lang;
    if (isset($spec[0])) {
        exit("FAILED : Found lang duplicate for \"$lang\"\n");
    }
}

echo "OK\n";

echo "Checking string duplicates... ";

foreach ($data['pages'] as $pagename => $pagedata) {
    foreach ($pagedata as $stringname => $stringvalues) {
        if (is_array(array_pop($stringvalues))) {
            exit("FAILED : found duplicate in page \"$pagename\" for string \"stringname\"\n");
        }
    }
}

echo "OK\n";

// This should be done by XML_DTD :
echo "Checking lang IDREFs... ";

foreach ($data['pages'] as $pagename => $pagedata) {
    foreach ($pagedata as $stringname => $stringvalues) {
        foreach ($stringvalues as $lang => $translation) {
            if (!in_array($lang, $known_langs)) {
                exit("FAILED : Unknow lang \"$lang\" in page \"$pagename\" at string \"$stringname\"\n");
            }
        }
    }
}

echo "OK\n";
echo "Checking translation duplicates... ";

foreach ($data['pages'] as $pagename => $pagedata) {
    foreach ($pagedata as $stringname => $stringvalues) {
        foreach ($stringvalues as $lang => $translation) {
            if (is_array($translation)) {
                exit("FAILED : found duplicate in page \"$pagename\" for string \"stringname\" with lang \"$lang\"\n");
            }
        }
    }
}

echo "OK\n";
?>