/**
 * Repérer les balises de traduction (idiomes)
 *
 * Phrase les idiomes tel que
 * - `<:chaine:>`
 * - `<:module:chaine:>`
 * - `<:module:chaine{arg1=texte1,arg2=#BALISE}|filtre1{texte2,#BALISE}|filtre2:>`
 *
 * @note
 *    `chaine` peut etre vide si `=texte1` est present et `arg1` est vide
 *    sinon ce n'est pas un idiome
 *
 * @param string $texte
 * @param int $ligne
 * @param array $result
 * @return array
 **/
function phraser_idiomes($texte, $ligne, $result)
{
    while (preg_match(BALISE_IDIOMES, $texte, $match)) {
        $match = array_pad($match, 8, null);
        $p = strpos($texte, $match[0]);
        $ko = !$match[3] && $match[5][0] !== '=';
        $debut = substr($texte, 0, $p + ($ko ? strlen($match[0]) : 0));
        if ($debut) {
            $result = phraser_champs($debut, $ligne, $result);
        }
        $texte = substr($texte, $p + strlen($match[0]));
        $ligne += substr_count($debut, "\n");
        if ($ko) {
            continue;
        }
        // faux idiome
        $champ = new Idiome();
        $champ->ligne = $ligne;
        $ligne += substr_count($match[0], "\n");
        // Stocker les arguments de la balise de traduction
        $args = array();
        $largs = $match[5];
        while (preg_match(BALISE_IDIOMES_ARGS, $largs, $r)) {
            $args[$r[1]] = phraser_champs($r[2], 0, array());
            $largs = substr($largs, strlen($r[0]));
        }
        $champ->arg = $args;
        $champ->nom_champ = strtolower($match[3]);
        $champ->module = $match[2];
        // pas d'imbrication pour les filtres sur langue
        phraser_args($match[7], ":", '', array(), $champ);
        $result[] = $champ;
    }
    if ($texte !== "") {
        $result = phraser_champs($texte, $ligne, $result);
    }
    return $result;
}
Example #2
0
function phraser_idiomes($texte, $ligne, $result)
{
    // Reperer les balises de traduction <:module:chaine{argument1=texte,argument2=#BALISE}|filtre1{texte,#BALISE}|filtre2:>
    while (preg_match(BALISE_IDIOMES, $texte, $match)) {
        $p = strpos($texte, $match[0]);
        $debut = substr($texte, 0, $p);
        if ($p) {
            $result = phraser_champs($debut, $ligne, $result);
        }
        $champ = new Idiome();
        $ligne += substr_count($debut, "\n");
        $champ->ligne = $ligne;
        $ligne += substr_count($match[0], "\n");
        $texte = substr($texte, $p + strlen($match[0]));
        // Stocker les arguments de la balise de traduction
        $args = array();
        $vals = preg_split('/,\\s*/', $match[5]);
        foreach ($vals as $val) {
            $arg = preg_split('/\\s*=/', $val);
            if ($arg[0]) {
                $args[$arg[0]] = phraser_champs($arg[1], 0, array());
            }
        }
        $champ->arg = $args;
        $champ->nom_champ = strtolower($match[3]);
        $champ->module = $match[2] ? $match[2] : MODULES_IDIOMES;
        // pas d'imbrication pour les filtres sur langue
        phraser_args(@$match[7], ":", '', array(), $champ);
        $result[] = $champ;
    }
    if ($texte !== "") {
        $result = phraser_champs($texte, $ligne, $result);
    }
    return $result;
}