« $fonc » non défini'"; } } } return $code; } // Generer le code PHP correspondant a un champ SPIP // retourne un tableau composé d'une suite d'instructions (souvent vide) // et d'une expression calculant le champ define("RETOUR", '$tmp'); function calculer_champ($id_champ, $id_boucle, $gensym) { global $calcul_logo_switch, $rows_all; global $les_notes; global $boucles; global $champs; global $flag_ob; global $flag_pcre; $idb = $id_boucle; $nom_champ = $champs[$id_champ]->nom_champ; $fonctions = $champs[$id_champ]->fonctions; // Calculer $id_row en prenant la boucle la plus proche // (i.e. la plus profonde) qui autorise le champ demande $prof = 0; while (strlen($idb)) { // $rows_all. : la table des tables contenant les correspondances // (nom du champ -> numero colonne mysql) en fonction du type de requete $id_row = $rows_all[$boucles[$idb]->type_requete][$nom_champ]; if ($id_row) break; $idb = $boucles[$idb]->id_parent; $prof++; } // Si cas general (le plus simple), generation du code php calculant le champ if ($id_row) { return array("", applique_filtres($fonctions, ($prof) ? "\$pile_boucles[\$id_instance-$prof]->row[$id_row]" : "\$row[$id_row]")); } $nom_var = RETOUR . $gensym; # $milieu = "\t$nom_var = #". $nom_champ. ";\n"; # debug ske $milieu=""; switch($nom_champ) { // Les logos (rubriques, articles...) case 'LOGO_ARTICLE': case 'LOGO_ARTICLE_NORMAL': case 'LOGO_ARTICLE_RUBRIQUE': case 'LOGO_ARTICLE_SURVOL': case 'LOGO_AUTEUR': case 'LOGO_AUTEUR_NORMAL': case 'LOGO_AUTEUR_SURVOL': case 'LOGO_SITE': case 'LOGO_BREVE': case 'LOGO_BREVE_RUBRIQUE': case 'LOGO_MOT': case 'LOGO_RUBRIQUE': case 'LOGO_RUBRIQUE_NORMAL': case 'LOGO_RUBRIQUE_SURVOL': case 'LOGO_DOCUMENT': $filtres = ''; if ($fonctions) { while (list(, $nom) = each($fonctions)) { if (ereg('^(left|right|center|top|bottom)$', $nom)) $align = $nom; else if ($nom == 'lien') { $flag_lien_auto = 'oui'; $flag_stop = true; } else if ($nom == 'fichier') { $flag_fichier = 'oui'; $flag_stop = true; } else if ($nom == '') // double || signifie "on passe aux filtres" $flag_stop = true; else if (!$flag_stop) { $lien = $nom; $flag_stop = true; } else // apres un URL ou || ou |fichier ce sont des filtres (sauf left...lien...fichier) $filtres[] = $nom; } // recuperer les filtres s'il y en a $fonctions = $filtres; } ereg("^LOGO_(([a-zA-Z]+).*$)", $nom_champ, $regs); $milieu = $calcul_logo_switch[$regs[1]]; $type_objet = strtolower($regs[2]); $code = (($flag_fichier) ? "ereg_replace('^/?IMG/','',\$logon)" : ("affiche_logos(\$logon, \$logoff, " . (($flag_lien_auto && !$lien) ? "generer_url_$type_objet(\$contexte['id_$type_objet'])" : transformer_lien_logo(addslashes($lien)) ) . ", '" . addslashes($align) . "')") ); break; case 'LESAUTEURS': $milieu = "\n\t$nom_var = '';" . ' if ($i = $contexte["id_article"]) { $query_auteurs = "SELECT auteurs.nom, auteurs.email FROM spip_auteurs AS auteurs, spip_auteurs_articles AS lien WHERE lien.id_article=$i AND auteurs.id_auteur=lien.id_auteur"; $result_auteurs = spip_query($query_auteurs); $auteurs = ""; while($row_auteur = spip_fetch_array($result_auteurs)) { $nom_auteur = typo($row_auteur["nom"]); $email_auteur = $row_auteur["email"]; if ($email_auteur) { $auteurs[] = "$nom_auteur"; } else {$auteurs[] = "$nom_auteur";} } if ($auteurs) '.$nom_var.' = join($auteurs, ", "); } '; $code = $nom_var; break; // Introduction (d'un article, d'une breve ou d'un message de forum) case 'INTRODUCTION': switch ($boucles[$id_boucle]->type_requete) { case 'articles': $code = '(($row["descriptif"]) ? propre($row["descriptif"]) : PtoBR(propre(supprimer_tags(couper_intro($row["chapo"]."\n\n\n".$row["texte"], 500)))))'; break; case 'breves': $code = 'PtoBR(propre(supprimer_tags(couper_intro($row["texte"], 300))))'; break; case 'forums': $code = 'PtoBR(propre(supprimer_tags(couper_intro($row["texte"], 600))))'; break; } break; case 'URL_SITE_SPIP': $code = "lire_meta('adresse_site')"; break; case 'NOM_SITE_SPIP': $code = "lire_meta('nom_site')"; break; case 'EMAIL_WEBMASTER': $code = "lire_meta('email_webmaster')"; break; case 'CHARSET': $code = "lire_meta('charset')"; break; case 'PUCE': $code = "propre('- ')"; break; case 'DATE': // Uniquement hors-boucles, pour la date passee dans l'URL // ou le contexte inclusion $code = "\$contexte['date']"; break; case 'DATE_NOUVEAUTES': $code = "(lire_meta('quoi_de_neuf') == 'oui' AND lire_meta('majnouv')) ? normaliser_date(lire_meta('majnouv')) : \"'0000-00-00'\""; break; case 'URL_ARTICLE': $code = "generer_url_article(\$contexte['id_article'])"; if ($boucles[$id_boucle]->hash) $code = "url_var_recherche($code, true)"; break; case 'URL_RUBRIQUE': $code = "generer_url_rubrique(\$contexte['id_rubrique'])"; if ($boucles[$id_boucle]->hash) $code = "url_var_recherche($code, true)"; break; case 'URL_BREVE': $code = "generer_url_breve(\$contexte['id_breve'])"; if ($boucles[$id_boucle]->hash) $code = "url_var_recherche($code, true)"; break; case 'URL_FORUM': $code = "generer_url_forum(\$contexte['id_forum'])"; break; case 'URL_MOT': $code = "generer_url_mot(\$contexte['id_mot'])"; if ($boucles[$id_boucle]->hash) $code = "url_var_recherche($code, true)"; break; case 'URL_DOCUMENT': $code = "generer_url_document(\$contexte['id_document'])"; break; case 'NOTES': $milieu = $nom_var.' = $GLOBALS["les_notes"]; $GLOBALS["les_notes"] = ""; $GLOBALS["compt_note"] = 0; $GLOBALS["marqueur_notes"] ++; '; $code = $nom_var; break; case 'RECHERCHE': $code = '$GLOBALS["recherche"]'; break; case 'COMPTEUR_BOUCLE': $code = '$pile_boucles[$id_instance]->compteur_boucle'; break; case 'TOTAL_BOUCLE': $code = '$pile_boucles[$id_instance+0]->total_boucle'; break; case 'POPULARITE': $code = 'ceil(min(100, 100 * $row["popularite"] / max(1 , 0 + lire_meta("popularite_max"))))'; break; case 'POPULARITE_ABSOLUE': $code = '$pile_boucles[$id_instance+0]->total_boucle'; break; case 'POPULARITE_SITE': $code = 'ceil(lire_meta("popularite_total"))'; break; case 'POPULARITE_MAX': $code = 'ceil(lire_meta("popularite_max"))'; break; // Inserer directement un document dans le squelette case 'EMBED_DOCUMENT': if ($fonctions) $fonctions = join($fonctions, "|"); $milieu = "\n\t\tinclude_ecrire('inc_documents.php3');"; $code = "embed_document(\$contexte['id_document'], '$fonctions', false)"; $fonctions = ""; break; // Formulaire de recherche sur le site case 'FORMULAIRE_RECHERCHE': if ($fonctions) { list(, $lien) = each($fonctions); // le premier est un url while (list(, $filtre) = each($fonctions)) { $filtres[] = $filtre; // les suivants sont des filtres } $fonctions = $filtres; } if (!$lien) $lien = 'recherche.php3'; $code = "((lire_meta('activer_moteur') != 'oui') ? '' : (\"
\"))"; break; // Formulaire d'inscription comme redacteur (dans inc-formulaires.php) case 'FORMULAIRE_INSCRIPTION': $milieu = ' $request_uri = $GLOBALS["REQUEST_URI"]; $accepter_inscriptions = lire_meta("accepter_inscriptions");'; $code = '($accepter_inscriptions != "oui") ? "" : ("<"."?php include_local(\"inc-formulaires.php3\"); formulaire_inscription(\"redac\"); ?".">")'; break; // Formulaire pour ecrire a l'auteur case 'FORMULAIRE_ECRIRE_AUTEUR': $code = '(!email_valide($row["email"]) ? "" :' . '("<' . '?php include (\'inc-formulaires.php3\'); formulaire_ecrire_auteur(\'".$row["id_auteur"]."\',\'" . trim($row["email"]) . "\'); ?' . '>"))' ; break; // Formulaire de signature d'une petition case 'FORMULAIRE_SIGNATURE': $milieu = ' $request_uri = $GLOBALS["REQUEST_URI"]; $accepter_inscriptions = lire_meta("accepter_inscriptions"); $query_petition = "SELECT * FROM spip_petitions WHERE id_article=$contexte[id_article]"; $result_petition = spip_query($query_petition);'; $code = '($row_petition = spip_fetch_array($result_petition)) ? "<"."?php include_local(\"inc-formulaires.php3\"); formulaire_signature($contexte[id_article]); ?".">" : ""'; break; // // Formulaire de referencement d'un site // case 'FORMULAIRE_SITE': $milieu = ' $request_uri = $GLOBALS["REQUEST_URI"]; $proposer_sites = lire_meta("proposer_sites");'; $code = '($proposer_sites == "2") ? "<"."?php include_local(\"inc-formulaires.php3\"); formulaire_site($contexte[id_rubrique]); ?".">" : ""'; break; // Champ testant la presence d'une petition case 'PETITION': $milieu = ' $query_petition = "SELECT id_article FROM spip_petitions WHERE id_article=$contexte[id_article]"; $result_petition = spip_query($query_petition);'; $code = '(spip_num_rows($result_petition) > 0) ? " " : ""'; break; // // Formulaire de reponse a un forum // case 'FORMULAIRE_FORUM': switch ($boucles[$id_boucle]->type_requete) { case 'articles': $code = 'retour_forum(0, 0, $contexte["id_article"], 0, 0)'; break; case 'breves': $code = 'retour_forum(0, 0, 0, $contexte["id_breve"], 0)'; break; case 'forums': $code = 'retour_forum($contexte["id_rubrique"], $contexte["id_forum"], $contexte["id_article"], $contexte["id_breve"], $contexte["id_syndic"])'; break; case 'rubriques': $code = 'retour_forum($contexte["id_rubrique"], 0, 0, 0, 0)'; break; case 'syndication': $code = 'retour_forum(0, 0, 0, 0, $contexte["id_syndic"])'; break; default: $code = 'retour_forum($contexte["id_rubrique"], $contexte["id_forum"], $contexte["id_article"], $contexte["id_breve"], $contexte["id_syndic"])'; break; } break; // // Parametres d'appel du formulaire de reponse a un forum // case 'PARAMETRES_FORUM': $milieu = param_forum($boucles[$id_boucle]->type_requete, $nom_var); $code = $nom_var; break; // // Debut et fin de surlignage auto des mots de la recherche // case 'DEBUT_SURLIGNE': $code = (!($flag_ob AND $flag_pcre)) ? '' : ('"<"."?php if (\$var_recherche) { \$mode_surligne = debut_surligne(\$var_recherche, \$mode_surligne); } ?".">"'); break; case 'FIN_SURLIGNE': $code = (!($flag_ob AND $flag_pcre)) ? '' : ('"<"."?php if (\$var_recherche) { \$mode_surligne = fin_surligne(\$var_recherche, \$mode_surligne); } ?".">"'); break; // // Formulaires de login // case 'LOGIN_PRIVE': $code = '"<"."?php include_local (\"inc-login.php3\"); login (\"\", \"prive\"); ?".">"'; break; case 'LOGIN_PUBLIC': $lacible = '\$GLOBALS["clean_link"]'; # ce code est absurde: filtres ne change pas! if ($fonctions) { $filtres = array(); while (list(, $nom) = each($fonctions)) $lacible = "new Link('".$nom."')"; $fonctions = $filtres; } $code = '"<"."?php include_local (\"inc-login.php3\"); \$cible = ' . $lacible . '; login (\$cible, false); ?".">"'; break; case 'URL_LOGOUT': if ($fonctions) { $url = "&url=".$fonctions[0]; $fonctions = array(); } else { $url = '&url=\'.urlencode(\$clean_link->getUrl()).\''; } $code = '"<"."?php if (\$GLOBALS[\"auteur_session\"][\"login\"]) { echo \'spip_cookie.php3?logout_public=\'.\$GLOBALS[\'auteur_session\'][\'login\'].\'' . $url . '\'; } ?".">"'; break; // // Boutons d'administration // case 'FORMULAIRE_ADMIN': $code = '"<"."?php \$GLOBALS[\"flag_boutons_admin\"] = true; if (\$GLOBALS[\"HTTP_COOKIE_VARS\"][\"spip_admin\"]) { include_local(\"inc-admin.php3\"); afficher_boutons_admin(); } ?".">"'; break; } // switch return array ($milieu, applique_filtres ($fonctions, # code vide est surement une erreur, il vaudrait mieux un message ($code) ? $code : $nom_var)); } function param_forum($type, $nom_var) { $milieu = ' $request_uri = $GLOBALS["REQUEST_URI"]; $http_get_vars = $GLOBALS["HTTP_GET_VARS"]; $forums_publics = lire_meta("forums_publics"); if (!(($contexte["accepter_forum"] == "" AND $forums_publics != "non") OR ($contexte["accepter_forum"] != "" AND $contexte["accepter_forum"] != "non"))) { ' . $nom_var . '= ""; } else { $lien = substr($request_uri, strrpos($request_uri, "/") + 1); if (!$lien_retour = $http_get_vars["retour"]) $lien_retour = $lien; $lien_retour = rawurlencode($lien_retour); '; switch ($type) { case 'articles': $c = '"id_article=$contexte[id_article]"'; break; case 'breves': $c = '"id_breve=$contexte[id_breve]"'; break; case 'rubriques': $c = '"id_rubrique=$contexte[id_rubrique]"'; break; case 'syndication': $c = '"id_syndic=$contexte[id_syndic]"'; break; case 'forums': default: $milieu .= ' $liste_champs = array ("id_article","id_breve","id_rubrique","id_syndic","id_forum"); unset($element); while (list(,$champ) = each ($liste_champs)) { if ($contexte[$champ]) $element[] = "$champ=$contexte[$champ]"; }'; $c = 'join("&",$element)'; break; } return ("$milieu\n\t\t$nom_var = $c. \"&retour=\$lien_retour\";}"); } function calculer_boucle_hierarchie($boucle, $prefix_boucle, $id_boucle, $deb) { if (ereg("([0-9]+),([0-9]*)", $boucle->requete, $match)) { $d = $match[1] ; $f = 'if ($fin_class > ' . ($d + $match[2]) . ') $fin_class = ' . ($d + $match[2]) . ";\n" ;} else { $d = 0 ; $f = ""; } return ' $hierarchie = construire_hierarchie( ($id_article || $id_syndic) ? $id_rubrique : $id_parent); if ($hierarchie) { $hierarchie = explode("-", substr($hierarchie, 0, -1)); $fin_class = sizeof($hierarchie); ' . $f . ' $hierarchie = join(",", $hierarchie); $result = spip_query(" SELECT *, FIELD(id_rubrique, $hierarchie) AS _field FROM spip_rubriques WHERE id_rubrique IN ($hierarchie)' . (($boucle->doublons != "oui") ? "" : "\n\tAND id_rubrique NOT IN (\$id_doublons[rubriques])") . ' ORDER BY _field LIMIT ' . $d . '," . ($fin_class - ' . $d . '));' . ((!$boucle->separateur) ? "\n\t\$ret = '';" : "\n\t\$retour = '';") . ' if ($result) {' . $deb . ' while ($row = spip_fetch_array($result)) { $pile_boucles[$id_instance]->row = $row; $contexte["id_rubrique"] = $row["id_rubrique"]; $contexte["id_parent"] = $row["id_parent"]; $contexte["id_secteur"] = $row["id_secteur"]; $contexte["date"] = normaliser_date($row["date"]); $contexte["date_redac"] = normaliser_date($row["date_redac"]);' . (($boucle->doublons != "oui") ? "" : ' $id_doublons["rubriques"] .= ",".$row["id_rubrique"];') . ((!$boucle->separateur) ? "" : "\n\t\t\$ret = '';") . calculer_liste($boucle->milieu, $prefix_boucle, $id_boucle). ((!$boucle->separateur) ? '' : ("\n\t\tif (\$ret) \n\t\t\t\$retour .= ((\$retour) ? '$boucle->separateur' : '') . \$ret; ")) . '} @mysql_free_result($result); $id_instance--; } } return ' . ((!$boucle->separateur) ? '$ret' : '$retour') . '; } '; } function calculer_boucle($id_boucle, $prefix_boucle) { global $boucles, $calculer_boucle_switch, $calculer_boucle_doublons; $boucle = $boucles[$id_boucle]; $flag_parties = ($boucle->partie AND $boucle->total_parties); // Ecrire le debut de la fonction // Recherche : recuperer les hash a partir de la chaine de recherche // Recuperation du contexte et creation de l'instance de boucle $texte = "function " . $prefix_boucle . $id_boucle .'($contexte) { global $pile_boucles, $id_instance, $syn_rubrique, $rubriques_publiques' . (($boucle->type_requete != 'forums') ? "" : ', $fichier_cache, $requetes_cache') . (($boucle->doublons != "oui") ? "" : ', $id_doublons') . ((!$boucle->hash) ? ";" : ', $recherche, $hash_recherche; if (!$hash_recherche) $hash_recherche = requete_hash($recherche);') . ' if ($contexte) foreach ($contexte as $k => $v) $$k = addslashes($v);'; $code_deb = ' $id_instance++; $pile_boucles[$id_instance] = new InstanceBoucle;'; // Boucle recursive : simplement appeler la boucle interieure if ($boucle->type_requete == 'boucle') { $r = calculer_rec("", $prefix_boucle, $boucles[$boucle->requete], $id_boucle, 0); $x=ereg("^[[:space:]]*\\\$ret \.=(.*)$", $r,$m); return ( $texte . $code_deb . (!$x ? ("\n\t\$ret = ''; $r") : ("\n\t\$ret =$m[1]")) . "\n\t\$id_instance--;\n\treturn \$ret;\n}\n"); } // Boucle 'hierarchie' : code specifique else if ($boucle->type_requete == 'hierarchie') { return ($texte . calculer_boucle_hierarchie($boucle, $prefix_boucle, $id_boucle, $code_deb)); } // // Pour les forums, ajouter le code de gestion du cache // et de l'activation / desactivation par article // if ($boucle->type_requete == 'forums') { $texte .= ' if (!$id_rubrique AND !$id_article AND !$id_breve) $my_id_forum = $id_forum; else $my_id_forum = 0; if (!$id_article) $id_article = 0; if (!$id_rubrique) $id_rubrique = 0; if (!$id_breve) $id_breve = 0; $valeurs = "$id_article, $id_rubrique, $id_breve, $my_id_forum, \'$fichier_cache\'"; if (!$requetes_cache[$valeurs]) { $query_cache = "INSERT INTO spip_forum_cache (id_article, id_rubrique, id_breve, id_forum, fichier) VALUES ($valeurs)"; spip_query($query_cache); $requetes_cache[$valeurs] = 1; }'; } // forums // calcul du corps de boucle et tests de complexité $corps = calculer_liste($boucle->milieu, $prefix_boucle, $id_boucle); $flag_corps = strpos($corps,'$contexte'); $flag_cpt = strpos($corps,'$pile_boucles[$id_instance]->compteur_boucle'); // complément au corps $corps = ((!$flag_parties) ? "" : ' $compteur_boucle++; if ($compteur_boucle >= $debut_boucle AND $compteur_boucle <= $fin_boucle) {') . (!$flag_cpt ? "" : ' $pile_boucles[$id_instance]->compteur_boucle++;') . ((!$flag_corps) ? "" : (' $pile_boucles[$id_instance]->row = $row;' . $calculer_boucle_switch["$boucle->type_requete"])) . (($boucle->type_requete != "rubriques") ? "" : ' $syn_rubrique .= ",".$row["id_rubrique"].",";') . (($boucle->doublons != "oui") ? "" : ' $id_doublons["' . $boucle->type_requete . '"] .= ",".$row["' . $calculer_boucle_doublons["$boucle->type_requete"] . '"];') . ((!$boucle->separateur) ? "" : "\n\t\t\$ret = '';") . $corps . ((!$boucle->separateur) ? '' : ("\n\t\tif (\$ret) \n\t\t\t\$retour .= ((\$retour) ? '$boucle->separateur' : '') . \$ret;")) . ((!$flag_parties) ? "" : "\t\t}\n"); // Ecrire le code d'envoi de la requete, // de recuperation du nombre de resultats // de recuperation des resultats // Fermeture de la boucle spip_fetch_array et liberation des resultats return $texte . " if (!(\$result = @spip_query(\"$boucle->requete\"))) { include('inc-debug-squel.php3'); return erreur_requete('$boucle->type_requete','$id_boucle'); } else { \$total_boucle = @mysql_num_rows(\$result);" . ((!$boucle->separateur) ? "\n\t\$ret = '';" : "\n\t\$retour = '';") . $code_deb . ((!$flag_parties) ? ' $pile_boucles[$id_instance]->total_boucle = $total_boucle;' : ("\n\t" . '$debut_boucle = 1+floor(($total_boucle * ' . ($boucle->partie - 1) . ' + ' . ($boucle->total_parties - 1) . ')/' . $boucle->total_parties . ");\n\t" . '$fin_boucle = floor(($total_boucle * ' . $boucle->partie . ' + ' . ($boucle->total_parties - 1) . ')/' . $boucle->total_parties . ");\n\t\$compteur_boucle = 0;\n\t" . '$pile_boucles[$id_instance]->total_boucle = $fin_boucle - $debut_boucle + 1;')). (!$corps ? '' : ((!$flag_cpt ? "" : ' $pile_boucles[$id_instance]->compteur_boucle = 0;') . "\n\twhile (\$row = @spip_fetch_array(\$result)) {" . "$corps\n\t\t}")) . "\n\t@mysql_free_result(\$result);\n\t\$id_instance--;\n\treturn " . ((!$boucle->separateur) ? '$ret' : '$retour') . ";}\n}"; } // // Generer le code PHP correspondant a un texte brut // function calculer_texte($texte) { global $dossier_squelettes; $code = ""; // ne pas écrire "^(.*)(.*)$', $texte, $match)) { $code .= ereg_replace("([\\\\'])", "\\\\1", substr($texte,0,strpos($texte,$match[0]))) . "<"."?php \$contexte_inclus = array(); "; $texte = $match[4]; $fichier = $match[1]; $params = $match[2]; while (ereg("^[[:space:]]*\{([_0-9a-zA-Z]+)[[:space:]]*(=[[:space:]]*([^}]+))?\}(.*)$", $params, $args)) { $params = $args[4]; $var = $args[1]; $val = $args[3]; if ($val) $code .= "\$contexte_inclus[$var] = \'".addslashes($val)."\'; "; else $code .= "\$contexte_inclus[$var] = \''.addslashes(\$contexte[$var]).'\'; "; } // inclure en priorite dans le dossier_squelettes if ($dossier_squelettes) { $code .= " if (@file_exists(\"$dossier_squelettes/$fichier\")){ include(\"$dossier_squelettes/$fichier\"); } else { include(\"$fichier\"); } ?" . ">"; } else $code .= "include(\"$fichier\"); ?" . ">"; } return ($code . ereg_replace("([\\\\'])", "\\\\1", $texte)) ; } # concatène deux suites d'instructions php $t et $m, # puis une instruction d'affectation de RET$n à un expression $e # puis un test sur la valeur recue par RET$n, # avec un alternant vrai construit avec $b et $a # et un alternant faux $c # Produit au pire (attention, le test contient une affectation): # $t $m if (RET$n = $e) {$b RET=RET$n; $a) else {$c} # mais optimise selon les cas function optim_liste ($t, $m, $e, $b, $a, $c, $n) { # remplacer l'auxiliaire protéiforme RETOURn par le systèmatique RET # si RETOURn absent de $m, pas d'alternant et pas de concaténation si vrai. $nom = RETOUR . $n; $sep="\n\t"; while($n) {$sep.="\t";$n--;} if (!(ereg("\\\$$nom ",$m)) AND ereg("^[[:space:]]*$",$b) AND ereg("^[[:space:]]*$",$a) AND ereg("^[[:space:]]*$",$c)) { # si en plus, le code précédent s'achève en affectant $ret, fusionner if (ereg("^[[:space:]]*$",$m) AND ereg("^.*\\\$ret \.= *(([^;]*)|('[^']*'))( *\. *(([^;]*)|('[^']*')))*;$", $t)) return (substr($t,0,strlen($t)-1) . " . $e;"); else return("$t$m$sep\$ret .= $e;"); } else { # si le code d'avant et/ou d'après affectent $ret, fusionner. # pas pu distinguer le ";" php du ";" dans les entité html comme < if (ereg("^(.*)\\\$ret *\.= *(.*);[[:space:]]*$", $b, $r)) # Eviter le 3e arg de regexp, ça décuple le temps de compil ! {if (ereg("^(([^;]*)|('[^']*'))( *\. *(([^;]*)|('[^']*')))*$", $r[2])) {$v1= "$r[2]."; $b=ereg("^[[:space:]]*$",$r[1]) ? "" : $r[1];}} if (ereg("^[[:space:]]*\\\$ret \.= *([^;]*);(.*)$", $a, $r)) {$v2= ".$r[1]";$a=ereg("^[[:space:]]*$",$r[2]) ? "" : $r[2];} # Tester si l'exp est une chaine non vide semble superflu ==> générer le if. if ($c) $c = $sep . 'else {' . $c . "}"; $test = ($e == $nom) ? $nom : "$nom = $e"; return ( "$t$m$sep" . "if ($test)$sep\{$b\$ret .= $v1$nom$v2;$a}$c" ); } } # le ci-devant instance_cond++ et -- est traité sans affectation function encapsulcond($a) { $r = ""; while (strpos($a, '$pile_boucles[$id_instance+')) { ereg("^(.*pile_boucles\[.id_instance\+)(.*)(\].*)$", $a, $m); $r .= $m[1] . ($m[2]+1); $a = $m[3]; } return $r . $a; } function calculer_rec($texte, $prefix, $objet, $id_boucle, $gensym) { return optim_liste($texte, "", "$prefix$objet->id_boucle(\$contexte)", (!($s = $objet->cond_avant)) ? "" : calculer_liste($s, $prefix, $id_boucle), (!($s = $objet->cond_apres)) ? "" : encapsulcond(calculer_liste($s, $prefix, $id_boucle)), (!($s = $objet->cond_altern)) ? "" : encapsulcond(calculer_liste($s, $prefix, $id_boucle)), $gensym); } // // Generer le code PHP correspondant a une liste d'objets syntaxiques // function calculer_liste($tableau, $prefix_boucle, $id_boucle) { # le bon vieux gensym Lispien static $nb_milieu=0; $texte = ''; if (!$tableau) return $texte; $nb_milieu++; reset($tableau); while (list(, $objet) = each($tableau)) { switch($objet->type) { case 'boucle': $texte = calculer_rec($texte, $prefix_boucle, $objet, $id_boucle, $nb_milieu); break; case 'texte': $r = calculer_texte($objet->texte); if ($r) { # if (ereg("^.*\\\$ret \.=[^;]*;$", $texte, $s)) if (ereg("^.*\\\$ret \.= *(([^;]*)|('[^']*'))( *\. *(([^;]*)|('[^']*')))*;$", $texte)) $texte = substr($texte,0,strlen($texte)-1) . ".'$r';"; else $texte .= "\n\t\t\$ret .= '$r';"; } break; case 'champ': list($p,$e) = calculer_champ($objet->id_champ, $id_boucle, $nb_milieu); $texte = optim_liste($texte, $p, $e, (!($s = $objet->cond_avant)) ? "" : calculer_liste($s, $prefix_boucle, $id_boucle), (!($s = $objet->cond_apres)) ? "" : calculer_liste($s, $prefix_boucle, $id_boucle), "", $nb_milieu); break; } } $nb_milieu--; return $texte; } ?>