/** * 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; }
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; }