Skip to content
Extraits de code Groupes Projets
Valider 5de76af3 rédigé par esj's avatar esj
Parcourir les fichiers

deport (enfin) de l'analyse des balises de langues dès le phrasé, avec...

deport (enfin) de l'analyse des balises de langues dès le phrasé, avec introduction de 2 nouveaux noeuds dans l'arbre de syntaxe abstraite. Permet d'avoir des champs # comme argument de leur filtre, et elimine la recherche de <multi> a chaque appel des filtres et typo et ses traitements redondants
parent 182155fd
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -810,85 +810,32 @@ function post_autobr($texte, $delim="\n_ ") {
}
//
// Gestion des blocs multilingues
//
// renvoie la traduction d'un bloc multi dans la langue demandee
function multi_trad ($lang, $trads) {
// si la traduction existe, genial
if (isset($trads[$lang])) {
$retour = $trads[$lang];
} // cas des langues xx_yy
else if (ereg('^([a-z]+)_', $lang, $regs) AND isset($trads[$regs[1]])) {
$retour = $trads[$regs[1]];
} // sinon, renvoyer la premiere du tableau
// remarque : on pourrait aussi appeler un service de traduction externe
// ou permettre de choisir une langue "plus proche",
// par exemple le francais pour l'espagnol, l'anglais pour l'allemand, etc.
else {
list (,$trad) = each($trads);
$retour = $trad;
}
// dans l'espace prive, mettre un popup multi
if (!_DIR_RESTREINT) {
$retour = ajoute_popup_multi($lang, $trads, $retour);
}
return $retour;
}
// analyse un bloc multi
function extraire_trad ($langue_demandee, $bloc) {
$lang = '';
// les ci-devant blocs multi sont maintenant traites en amont.
// garder cette fonction pour de vielles contrib qui l'appelleraient
while (preg_match("/^(.*?)[\{\[]([a-z_]+)[\}\]]/si", $bloc, $regs)) {
$texte = trim($regs[1]);
if ($texte OR $lang)
$trads[$lang] = $texte;
$bloc = substr($bloc, strlen($regs[0]));
$lang = $regs[2];
}
$trads[$lang] = $bloc;
// faire la traduction avec ces donnees
return multi_trad($langue_demandee, $trads);
}
// repere les blocs multi dans un texte et extrait le bon
function extraire_multi ($letexte) {
global $flag_pcre;
function extraire_multi ($letexte) {return $letexte;}
if (strpos($letexte, '<multi>') === false) return $letexte; // perf
if ($flag_pcre AND preg_match_all("@<multi>(.*?)</multi>@s", $letexte, $regs, PREG_SET_ORDER)) {
while (list(,$reg) = each ($regs)) {
$letexte = str_replace($reg[0], extraire_trad($GLOBALS['spip_lang'], $reg[1]), $letexte);
}
}
return $letexte;
}
//
// Selection dans un tableau dont les index sont des noms de langues
// de la valeur associee a la langue en cours (ci-devant bloc multi)
//
// popup des blocs multi dans l'espace prive (a ameliorer)
function ajoute_popup_multi($langue_demandee, $trads, $texte) {
static $num_multi=0;
global $multi_popup;
while (list($lang,$bloc) = each($trads)) {
if ($lang != $langue_demandee)
$survol .= "[$lang] ".supprimer_tags(couper($bloc,20))."\n";
$texte_popup .= "<br /><b>".traduire_nom_langue($lang)."</b> ".ereg_replace("\n+","<br />", supprimer_tags(couper(propre($bloc),200)));
}
function multi_trad ($trads) {
global $spip_lang;
if ($survol) {
$num_multi ++;
$texte .= " <img src=\"" . _DIR_IMG_PACK . "langues-modif-12.gif\" alt=\"(multi)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" onclick=\"return openmulti($num_multi)\" />";
$multi_popup .= "textes_multi[$num_multi] = '".addslashes($texte_popup)."';\n";
}
if (isset($trads[$spip_lang])) {
return $trads[$spip_lang];
return $texte;
} // cas des langues xx_yy
else if (ereg('^([a-z]+)_', $spip_lang, $regs) AND isset($trads[$regs[1]])) {
return $trads[$regs[1]];
}
// sinon, renvoyer la premiere du tableau
// remarque : on pourrait aussi appeler un service de traduction externe
// ou permettre de choisir une langue "plus proche",
// par exemple le francais pour l'espagnol, l'anglais pour l'allemand, etc.
else return array_shift($trads);
}
// Raccourci ancre [#ancre<-]
......
......@@ -68,7 +68,6 @@ function nettoyer_chapo($chapo){
// points d'entree de pre- et post-traitement pour propre() et typo()
function spip_avant_propre ($letexte) {
$letexte = avant_propre_ancres($letexte);
$letexte = extraire_multi($letexte);
if (function_exists('avant_propre'))
$letexte = avant_propre($letexte);
......@@ -84,7 +83,6 @@ function spip_apres_propre ($letexte) {
}
function spip_avant_typo ($letexte) {
$letexte = extraire_multi($letexte);
$letexte = avant_typo_smallcaps($letexte);
if (function_exists('avant_typo'))
......@@ -365,7 +363,7 @@ function couper($texte, $taille=50) {
// prendre <intro>...</intro> sinon couper a la longueur demandee
function couper_intro($texte, $long) {
$texte = extraire_multi(eregi_replace("(</?)intro>", "\\1intro>", $texte)); // minuscules
$texte = (eregi_replace("(</?)intro>", "\\1intro>", $texte)); // minuscules
while ($fin = strpos($texte, "</intro>")) {
$zone = substr($texte, 0, $fin);
$texte = substr($texte, $fin + strlen("</intro>"));
......
......@@ -16,7 +16,7 @@ if (defined("_INC_COMPILO_API")) return;
define("_INC_COMPILO_API", "1");
// Definition des classes Boucle, Texte, Inclure, Champ
// Definition des noeuds de l'arbre de syntaxe abstraite
class Texte {
var $type = 'texte';
......@@ -73,7 +73,7 @@ class Champ {
var $nom_champ;
var $nom_boucle= ''; // seulement si boucle explicite
var $cond_avant, $cond_apres; // tableaux d'objets
var $fonctions; // filtre explicites
var $fonctions = array(); // filtre explicites
var $etoile;
// champs pour la production de code
var $id_boucle;
......@@ -90,6 +90,24 @@ class Champ {
}
class Idiome {
var $type = 'idiome';
var $chaine = ""; // la chaine a traduire
var $module = ""; // son module de definition
var $fonctions = array(); // les filtres a appliquer au resultat
// champs pour la production de code, cf ci-dessus
var $id_boucle;
var $boucles;
var $type_requete;
var $code;
var $statut;
var $descr = array();
}
class Polyglotte {
var $type = 'polyglotte';
var $traductions = array(); // les textes ou choisir
}
//
// Globales de description de la base
......
......@@ -288,25 +288,17 @@ function filtres_arglist($args, $p, $sep) {
else
ereg('^([[:space:]]*)([^,]*),?(.*)$', $args, $regs);
// $quote differencie {#ID_ARTICLE} et {'#ID_ARTICLE'}
$quote = trim($regs[1]); // valeur = ", ', ou vide
$arg = $regs[2]; // le premier argument
$args = $regs[3]; // ceux qui restent
if ($quote)
$arg = $regs[2]; // le premier argument
$args = $regs[3]; // ceux qui restent
// difference {#ID_ARTICLE} et {'#ID_ARTICLE'}
if ($regs[1]) // valeur = ", ', ou vide
$arg = "'" . texte_script($arg) . "'";
else {
$arg = trim($arg);
if ($arg[0] =='$')
$arg = '$Pile[0][\'' . substr($arg,1) . "']";
else if ($arg[0] =='<')
$arg = calculer_texte($arg, $p->id_boucle, $p->boucles);
else if (ereg("^" . NOM_DE_CHAMP ."(.*)$", $arg, $r2)) {
$p->nom_boucle = $r2[2];
$p->nom_champ = $r2[3];
$p->fonctions = phraser_filtres($r2[5]);
$arg = calculer_champ($p);
} else if (!is_numeric($arg))
$arg = "'" . texte_script($arg) . "'";
// Appel recursif de calculer_liste sur des cas restreints
$arg = calculer_liste(phraser_champs(trim($arg), array()),
$p->descr,
$p->boucles,
$p->id_boucle);
}
$arglist .= $sep . $arg;
......
......@@ -90,51 +90,6 @@ function calculer_inclure($fichier, $params, $id_boucle, &$boucles) {
"\n?'." . "'>'";
}
//
// Traite une partie "texte" d'un squelette (c'est-a-dire tout element
// qui ne contient ni balise, ni boucle, ni <INCLURE()> ; le transforme
// en une EXPRESSION php (qui peut etre l'argument d'un Return ou la
// partie droite d'une affectation). Ici sont analyses les elements
// multilingues des squelettes : <:xxx:> et <multi>[fr]coucou</multi>
//
function calculer_texte($texte, $id_boucle, &$boucles) {
//
// Les elements multilingues
//
$code = "'".ereg_replace("([\\\\'])", "\\\\1", $texte)."'";
// bloc multi
if (eregi('<multi>', $texte)) {
$ouvre_multi = 'extraire_multi(';
$ferme_multi = ')';
} else {
$ouvre_multi = $ferme_multi = '';
}
// Reperer les balises de traduction <:toto:>
while (eregi("<:(([a-z0-9_]+):)?([a-z0-9_]+)(\|[^>]*)?:>", $code, $match)) {
//
// Traiter la balise de traduction multilingue
//
$chaine = strtolower($match[3]);
if (!($module = $match[2]))
// ordre standard des modules a explorer
$module = 'public/spip/ecrire';
$c = new Champ;
$c->code = "_T('$module:$chaine')";
$c->fonctions = phraser_filtres(substr($match[4],1));
$c->id_boucle = $id_boucle;
$c->boucles = &$boucles;
$c->statut = 'php'; // ne pas manger les espaces avec trim()
$c = applique_filtres($c);
$code = str_replace($match[0], "'$ferme_multi.$c.$ouvre_multi'", $code);
}
return $ouvre_multi . $code . $ferme_multi;
}
//
// calculer_boucle() produit le corps PHP d'une boucle Spip
// (sauf les recursives)
......@@ -424,6 +379,7 @@ function calculer_parties($partie, $mode_partie, $total_parties, $id_boucle) {
// Production du code PHP a partir de la sequence livree par le phraseur
// $boucles est passe par reference pour affectation par index_pile.
// Retourne une expression PHP,
// (qui sera argument d'un Return ou la partie droite d'une affectation).
function calculer_liste($tableau, $descr, &$boucles, $id_boucle='', $niv=1) {
if (!$tableau) return "''";
......@@ -437,13 +393,32 @@ function calculer_liste($tableau, $descr, &$boucles, $id_boucle='', $niv=1) {
switch($p->type) {
// texte seul
case 'texte':
$code = calculer_texte($p->texte, $id_boucle, $boucles);
$code = "'".ereg_replace("([\\\\'])", "\\\\1", $p->texte)."'";
$commentaire='';
$avant='';
$apres='';
$altern = "''";
break;
case 'polyglotte':
$code = "";
foreach($p->traductions as $k => $v) {
$code .= ",'" .
ereg_replace("([\\\\'])", "\\\\1", $k) .
"' => '" .
ereg_replace("([\\\\'])", "\\\\1", $v) .
"'";
}
$code = "multi_trad(array(" .
substr($code,1) .
"))";
$commentaire= '';
$avant='';
$apres='';
$altern = "''";
break;
// inclure
case 'include':
$code= calculer_inclure($p->fichier,
......@@ -473,7 +448,18 @@ function calculer_liste($tableau, $descr, &$boucles, $id_boucle='', $niv=1) {
$newdescr, $boucles, $id_boucle, $niv+1);
break;
// balise SPIP
case 'idiome':
$p->code = "_T('" . $p->module . ":" .$p->chaine. "')";
$p->id_boucle = $id_boucle;
$p->boucles = &$boucles;
$p->statut = 'php'; // ne pas manger les espaces avec trim()
$commentaire = "";
$code = applique_filtres($p);
$avant='';
$apres='';
$altern = "''";
break;
default:
// cette structure pourrait etre completee des le phrase' (a faire)
......
......@@ -51,7 +51,7 @@ function phraser_inclure($texte, $result) {
$debut = substr($texte, 0, $p);
$texte = substr($fin, strlen($s));
if ($debut) $result = phraser_champs($debut, $result);
if ($debut) $result = phraser_idiomes($debut, $result);
$champ = new Inclure;
$champ->fichier = $match[1];
......@@ -70,20 +70,64 @@ function phraser_inclure($texte, $result) {
$result[] = $champ;
}
return (!$texte ? $result : phraser_champs($texte, $result));
return (!$texte ? $result : phraser_idiomes($texte, $result));
}
function phraser_champs($texte,$result) {
while (ereg(NOM_DE_CHAMP . '(.*)$', $texte, $regs)) {
$p = strpos($texte, $regs[0]);
if ($regs[4] || (strpos($regs[5][0], "[0-9]") === false)) {
function phraser_polyglotte($texte,$result) {
while (eregi('<multi>([^<]*)</multi>', $texte, $match)) {
$p = strpos($texte, $match[0]);
if ($p) {
$champ = new Texte;
$champ->texte = (substr($texte, 0, $p));
$result[] = $champ;
}
$champ = new Polyglotte;
$lang = '';
$bloc = $match[1];
$texte = substr($texte,$p+strlen($match[0]));
while (preg_match("/^[[:space:]]*([^[{]*)[[:space:]]*[\{\[]([a-z_]+)[\}\]](.*)$/si", $bloc, $regs)) {
$trad = $regs[1];
if ($trad OR $lang)
$champ->traductions[$lang] = $trad;
$lang = $regs[2];
$bloc = $regs[3];
}
$champ->traductions[$lang] = $bloc;
$result[] = $champ;
}
if ($texte) {
$champ = new Texte;
$champ->texte = $texte;
$result[] = $champ;
}
return $result;
}
function phraser_idiomes($texte,$result) {
// Reperer les balises de traduction <:toto:>
while (eregi("<:(([a-z0-9_]+):)?([a-z0-9_]+)(\|[^>]*)?:>", $texte, $match)) {
$p = strpos($texte, $match[0]);
if ($p) $result = phraser_champs(substr($texte, 0, $p),$result);
$champ = new Idiome;
$champ->chaine = strtolower($match[3]);
$champ->module = $match[2] ? $match[2] : 'public/spip/ecrire';
$champ->fonctions = phraser_filtres(substr($match[4],1));
$texte = substr($texte,$p+strlen($match[0]));
$result[] = $champ;
}
if ($texte) $result = phraser_champs($texte,$result);
return $result;
}
function phraser_champs($texte,$result) {
while (ereg(NOM_DE_CHAMP . '(.*)$', $texte, $regs)) {
$p = strpos($texte, $regs[0]);
if ($regs[4] || (strpos($regs[5][0], "[0-9]") === false)) {
if ($p)
$result = phraser_polyglotte(substr($texte, 0, $p), $result);
$champ = new Champ;
$champ->nom_boucle = $regs[2];
$champ->nom_champ = $regs[3];
......@@ -92,18 +136,11 @@ function phraser_champs($texte,$result) {
$result[] = $champ;
} else {
// faux champ
$champ = new Texte;
$champ->texte = (substr($texte, 0, $p+1));
$result[] = $champ;
$result = phraser_polyglotte (substr($texte, 0, $p+1), $result);
$texte = (substr($texte, $p+1));
}
}
if ($texte) {
$champ = new Texte;
$champ->texte = $texte;
$result[] = $champ;
}
if ($texte) $result = phraser_polyglotte($texte, $result);
return $result;
}
......@@ -120,13 +157,12 @@ function phraser_champs_etendus($texte, $result) {
return array_merge($result, phraser_champs_interieurs($texte, $sep, array()));
}
function phraser_filtres($fonctions) {
$r = array();
if ($fonctions) {
$fonctions = explode('|', ereg_replace("^\|", "", $fonctions));
foreach($fonctions as $f) {
ereg("^([^{]*)?(.*)$",$f,$m);
ereg("^([^{]*)(.*)$",$f,$m);
$arg = $m[2];
$fonc = $m[1];
$x = ereg("^\{(.*)\} *$",$arg,$m);
......@@ -145,7 +181,6 @@ function phraser_champs_exterieurs($debut, $sep, $nested) {
$debut = $m[2];
}
return (!$debut ? $res : phraser_inclure($debut, $res));
}
function phraser_champs_interieurs($texte, $sep, $result) {
......
......@@ -73,9 +73,7 @@ function _generer_url_propre($type, $id_objet) {
// Sinon, creer l'URL
include_ecrire("inc_filtres.php3");
include_ecrire("inc_charsets.php3");
$url = translitteration(corriger_caracteres(
supprimer_tags(supprimer_numero(extraire_multi($row['titre'])))
));
$url = translitteration(corriger_caracteres(supprimer_tags(supprimer_numero($row['titre']))));
$url = @preg_replace(',[[:punct:][:space:]]+,u', ' ', $url);
// S'il reste des caracteres non latins, utiliser l'id a la place
if (preg_match(",[^a-zA-Z0-9 ],", $url)) {
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter