Valider 03b9e260 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Extension de la syntaxe des boucles pour y ajouter une partie entete (affichee...

Extension de la syntaxe des boucles pour y ajouter une partie entete (affichee avant) et pied (affichee apres) dont l'affichage sera systematique.
Ces deux parties, comme les parties conditionnelles, sont evalees apres le corps de la boucle, et permettent d'acceder aux balises lies a la boucle (#TOTAL_BOUCLE, #PAGINATION...)
Ex :
```
	<BB_articles>
		<div style="border:5px solid red;padding:20px;">
			<h1>[(#TOTAL_BOUCLE) ]articles</h1>
			<B_articles>
				<ul>
				<BOUCLE_articles(ARTICLES){id_article?}{0,5}>
					<li>#ID_ARTICLE::#TITRE</li>
				</BOUCLE_articles>
				</ul>
				[<div class="patination">(#PAGINATION)</div>]
			</B_articles>
			  <p>Vous avez peut-être fait une erreur?...</p>
			<//B_articles>
		</div>
	</BB_articles>
```
parent 01d5ffe6
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+86 −35
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -938,6 +938,7 @@ function calculer_liste($tableau, $descr, &$boucles, $id_boucle = '') {
	}
}


define('_REGEXP_COND_VIDE_NONVIDE', "/^[(](.*)[?]\s*''\s*:\s*('[^']+')\s*[)]$/");
define('_REGEXP_COND_NONVIDE_VIDE', "/^[(](.*)[?]\s*('[^']+')\s*:\s*''\s*[)]$/");
define('_REGEXP_CONCAT_NON_VIDE', "/^(.*)[.]\s*'[^']+'\s*$/");
@@ -1007,14 +1008,17 @@ function compile_cas($tableau, $descr, &$boucles, $id_boucle) {
				$newdescr = $descr;
				$newdescr['id_mere'] = $nom;
				$newdescr['niv']++;
				$avant = calculer_liste($p->avant,
					$newdescr, $boucles, $id_boucle);
				$apres = calculer_liste($p->apres,
					$newdescr, $boucles, $id_boucle);
				$preaff = calculer_liste($p->preaff, $newdescr, $boucles, $id_boucle);
				$avant = calculer_liste($p->avant, $newdescr, $boucles, $id_boucle);
				$apres = calculer_liste($p->apres, $newdescr, $boucles, $id_boucle);
				$postaff = calculer_liste($p->postaff, $newdescr, $boucles, $id_boucle);
				$newdescr['niv']--;
				$altern = calculer_liste($p->altern,
					$newdescr, $boucles, $id_boucle);
				if (($avant === false) or ($apres === false) or ($altern === false)) {
				$altern = calculer_liste($p->altern, $newdescr, $boucles, $id_boucle);
				if ($preaff === false
					or $avant === false
					or $apres === false
					or $altern === false
					or $postaff === false) {
					$err_e_c = true;
					$code = "''";
				} else {
@@ -1025,14 +1029,28 @@ function compile_cas($tableau, $descr, &$boucles, $id_boucle) {
					if (!$boucles[$nom]->milieu
						and $boucles[$nom]->type_requete <> TYPE_RECURSIF
					) {
						if ($preaff != "''") {
							$code .= "\n. $preaff";
						}
						if ($altern != "''") {
							$code .= "\n. $altern";
						}
						if ($postaff != "''") {
							$code .= "\n. $postaff";
						}
						if ($avant <> "''" or $apres <> "''") {
							spip_log("boucle $nom toujours vide, code superflu dans $descr[sourcefile]");
						}
						$avant = $apres = $altern = "''";
					} else {
						if ($preaff != "''") {
							$avant = compile_concatene_parties_codes($preaff, $avant);
							$altern = compile_concatene_parties_codes($preaff, $altern);
						}
						if ($postaff != "''") {
							$apres = compile_concatene_parties_codes($apres, $postaff);
							$altern = compile_concatene_parties_codes($altern, $postaff);
						}
						if ($altern != "''") {
							$altern = "($altern)";
						}
@@ -1127,22 +1145,51 @@ function compile_cas($tableau, $descr, &$boucles, $id_boucle) {
	return $err_e_c ? false : $codes;
}

// production d'une expression conditionnelle ((v=EXP) ? (p . v .s) : a)
// mais si EXP est de la forme (t ? 'C' : '') on produit (t ? (p . C . s) : a)
// de meme si EXP est de la forme (t ? '' : 'C')
/**
 * Concatene 2 parties de code, en simplifiant si l'une des 2 est vides
 * @param $partie1
 * @param $partie2
 * @return string
 */
function compile_concatene_parties_codes($partie1, $partie2) {
	if ($partie1 === "''") {
		return $partie2;
	}
	if ($partie2 === "''") {
		return $partie1;
	}
	return "$partie1\n. $partie2";
}


// http://code.spip.net/@compile_retour
/**
 * production d'une expression conditionnelle ((v=EXP) ? (p . v .s) : a)
 * mais si EXP est de la forme (t ? 'C' : '') on produit (t ? (p . C . s) : a)
 * de meme si EXP est de la forme (t ? '' : 'C')
 * http://code.spip.net/@compile_retour
 *
 * @param string $code
 *   le code principal, dont le resultat conditionnera le reste
 * @param string $avant
 *   la partie conditionnelle avant, qui est calculee apres le code, mais s'affiche avant si le code produit un resultat
 * @param string $apres
 *   la partie conditionnelle apres, qui est calculee apres le code, et s'affiche apres si le code produit un resultat
 * @param string $altern
 *   la partie alternative apres, qui est calculee apres le code, et s'affiche apres, si le code ne produit pas de resultat
 * @param string $tab
 *   tabulation
 * @param int $n
 *   compteur
 * @return mixed|string
 */
function compile_retour($code, $avant, $apres, $altern, $tab, $n) {
	if ($avant == "''") {
	if ($avant === "''") {
		$avant = '';
	}
	if ($apres == "''") {
	if ($apres === "''") {
		$apres = '';
	}
	if (!$avant and !$apres and ($altern === "''")) {
		return $code;
	}

	if ($avant or $apres or ($altern !== "''")){
		if (preg_match(_REGEXP_CONCAT_NON_VIDE, $code)){
			$t = $code;
			$cond = '';
@@ -1167,7 +1214,11 @@ function compile_retour($code, $avant, $apres, $altern, $tab, $n) {
			$res = "($res)";
		}

	return !$cond ? $res : "($cond ?\n\t$tab$res :\n\t$tab$altern)";
		$code = (!$cond ? $res : "($cond ?\n\t$tab$res :\n\t$tab$altern)");
	}

	return $code;

}


+3 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -18,10 +18,12 @@ if (!defined('_ECRIRE_INC_VERSION')) {

function decompiler_boucle($struct, $fmt = '', $prof = 0) {
	$nom = $struct->id_boucle;
	$preaff = decompiler_($struct->preaff, $fmt, $prof);
	$avant = decompiler_($struct->avant, $fmt, $prof);
	$apres = decompiler_($struct->apres, $fmt, $prof);
	$altern = decompiler_($struct->altern, $fmt, $prof);
	$milieu = decompiler_($struct->milieu, $fmt, $prof);
	$postaff = decompiler_($struct->postaff, $fmt, $prof);

	$type = $struct->sql_serveur ? "$struct->sql_serveur:" : '';
	$type .= ($struct->type_requete ? $struct->type_requete :
@@ -43,7 +45,7 @@ function decompiler_boucle($struct, $fmt = '', $prof = 0) {

	$f = 'format_boucle_' . $fmt;

	return $f($avant, $nom, $type, $crit, $milieu, $apres, $altern, $prof);
	return $f($preaff, $avant, $nom, $type, $crit, $milieu, $apres, $altern, $postaff, $prof);
}

function decompiler_include($struct, $fmt = '', $prof = 0) {
+4 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -14,17 +14,19 @@ if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}

function format_boucle_html($avant, $nom, $type, $crit, $corps, $apres, $altern, $prof) {
function format_boucle_html($preaff, $avant, $nom, $type, $crit, $corps, $apres, $altern, $postaff, $prof) {
	$preaff = $preaff ? "<BB$nom>$preaff" : "";
	$avant = $avant ? "<B$nom>$avant" : "";
	$apres = $apres ? "$apres</B$nom>" : "";
	$altern = $altern ? "$altern<//B$nom>" : "";
	$postaff = $postaff ? "$postaff</BB$nom>" : "";
	if (!$corps) {
		$corps = " />";
	} else {
		$corps = ">$corps</BOUCLE$nom>";
	}

	return "$avant<BOUCLE$nom($type)$crit$corps$apres$altern";
	return "$preaff$avant<BOUCLE$nom($type)$crit$corps$apres$altern$postaff";
}

function format_inclure_html($file, $args, $prof) {
+15 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -210,6 +210,13 @@ class Boucle {
	 */
	public $id_parent = '';

	/**
	 * Partie avant toujours affichee
	 *
	 * @var string|array
	 */
	public $preaff = '';

	/**
	 * Partie optionnelle avant
	 *
@@ -238,6 +245,14 @@ class Boucle {
	 */
	public $altern = '';

	/**
	 * Partie apres toujours affichee
	 *
	 * @var string|array
	 */
	public $postaff = '';


	/**
	 * La boucle doit-elle sélectionner la langue ?
	 *
+43 −14
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -27,10 +27,14 @@ if (!defined('_ECRIRE_INC_VERSION')) {
define('BALISE_BOUCLE', '<BOUCLE');
/** Fin de la partie principale d'une boucle */
define('BALISE_FIN_BOUCLE', '</BOUCLE');
/** Début de la partie avant non optionnelle d'une boucle (toujours affichee)*/
define('BALISE_PREAFF_BOUCLE', '<BB');
/** Début de la partie optionnelle avant d'une boucle */
define('BALISE_PRECOND_BOUCLE', '<B');
/** Fin de la partie optionnelle après d'une boucle */
define('BALISE_POSTCOND_BOUCLE', '</B');
/** Fin de la partie après non optionnelle d'une boucle (toujours affichee) */
define('BALISE_POSTAFF_BOUCLE', '</BB');
/** Fin de la partie alternative après d'une boucle */
define('BALISE_ALT_BOUCLE', '<//B');

@@ -812,28 +816,37 @@ function public_phraser_html_dist($texte, $id_parent, &$boucles, $descr, $ligne
			continue;
		}

		$ligne_avant = $ligne_milieu = $ligne + public_compte_ligne($texte, 0, $pos_parent);
		$ligne_preaff = $ligne_avant = $ligne_milieu = $ligne + public_compte_ligne($texte, 0, $pos_parent);
		$pos_debut_boucle = $pos_boucle;
		$milieu = substr($texte, $pos_parent);

		# attention: reperer la premiere des 2 balises: pre_boucle ou boucle
		// Regarder si on a une partie conditionnelle avant <B_xxx>
		$avant_boucle = BALISE_PRECOND_BOUCLE . $id_boucle . '>';
		$pos_avant = strpos($texte, $avant_boucle);
		if ($pos_avant === false or $pos_avant > $pos_boucle) {
		if ($pos_avant !== false && $pos_avant < $pos_debut_boucle) {

			$debut = substr($texte, 0, $pos_boucle);
			$milieu = substr($texte, $pos_parent);
			$pos_debut_boucle = $pos_avant;

			$pos_avant += strlen($avant_boucle);
			$result->avant = substr($texte, $pos_avant, $pos_boucle - $pos_avant);
			$ligne_avant = $ligne +  public_compte_ligne(0, $pos_avant);
		}
		else {

			$debut = substr($texte, 0, $pos_avant);
			$milieu = substr($texte, $pos_parent);
		// Regarder si on a une partie inconditionnelle avant <BB_xxx>
		$preaff_boucle = BALISE_PREAFF_BOUCLE . $id_boucle . '>';
		$pos_preaff = strpos($texte, $preaff_boucle);
		if ($pos_preaff !== false && $pos_preaff < $pos_debut_boucle) {

			$pos_avant += strlen($avant_boucle);
			$result->avant = substr($texte, $pos_avant, $pos_boucle - $pos_avant);
			$ligne_avant = $ligne +  public_compte_ligne($debut);
			$end_preaff = $pos_debut_boucle;
			$pos_debut_boucle = $pos_preaff;

			$pos_preaff += strlen($preaff_boucle);
			$result->preaff = substr($texte, $pos_preaff, $end_preaff - $pos_preaff);
			$ligne_preaff = $ligne +  public_compte_ligne(0, $pos_preaff);
		}

		$debut = substr($texte, 0, $pos_debut_boucle);

		$result->id_boucle = $id_boucle;

		if (!preg_match(SPEC_BOUCLE, $milieu, $match)) {
@@ -918,11 +931,11 @@ function public_phraser_html_dist($texte, $id_parent, &$boucles, $descr, $ligne
			$pos_boucle += $pos_apres ;
		}

		$ligne_altern = $ligne_suite;

		//
		// 2. Recuperer la partie alternative
		//
		$ligne_altern = $ligne_suite;
		$altern_boucle = BALISE_ALT_BOUCLE . $id_boucle . ">";
		$pos_altern = strpos($suite, $altern_boucle);
		if ($pos_altern !== false) {
@@ -933,7 +946,21 @@ function public_phraser_html_dist($texte, $id_parent, &$boucles, $descr, $ligne
			$pos_boucle += $pos_altern;
		}

		$result->ligne = $ligne_avant;
		//
		// 3. Recuperer la partie footer non alternative
		//
		$ligne_postaff = $ligne_suite;
		$postaff_boucle = BALISE_POSTAFF_BOUCLE . $id_boucle . ">";
		$pos_postaff = strpos($suite, $postaff_boucle);
		if ($pos_postaff !== false) {
			$result->postaff = substr($suite, 0, $pos_postaff);
			$pos_postaff += strlen($postaff_boucle);
			$suite = substr($suite, $pos_postaff);
			$ligne_suite += public_compte_ligne($texte, $pos_boucle, $pos_postaff);
			$pos_boucle += $pos_postaff ;
		}

		$result->ligne = $ligne_preaff;

		if ($p = strpos($type, ':')) {
			$result->sql_serveur = substr($type, 0, $p);
@@ -965,9 +992,11 @@ function public_phraser_html_dist($texte, $id_parent, &$boucles, $descr, $ligne
		// reserver la place dans la pile des boucles pour compiler ensuite dans le bon ordre
		// ie les boucles qui apparaissent dans les partie conditionnelles doivent etre compilees apres cette boucle
		$boucles[$id_boucle] = null;
		$result->avant = public_phraser_html_dist($result->avant, $id_parent, $boucles, $descr, $result->ligne);
		$result->preaff = public_phraser_html_dist($result->preaff, $id_parent, $boucles, $descr, $ligne_preaff);
		$result->avant = public_phraser_html_dist($result->avant, $id_parent, $boucles, $descr, $ligne_avant);
		$result->apres = public_phraser_html_dist($result->apres, $id_parent, $boucles, $descr, $ligne_apres);
		$result->altern = public_phraser_html_dist($result->altern, $id_parent, $boucles, $descr, $ligne_altern);
		$result->postaff = public_phraser_html_dist($result->postaff, $id_parent, $boucles, $descr, $ligne_postaff);

		// Prevenir le generateur de code que le squelette est faux
		if ($err_b) {