From f93f64016664a1d652353aec76828a80ab8368c7 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Mon, 12 Aug 2002 00:56:35 +0000
Subject: [PATCH] =?UTF-8?q?Traitement=20des=20listes=20=C3=A0=20puces=20et?=
 =?UTF-8?q?=20des=20listes=20num=C3=A9rot=C3=A9es,=20corrig=C3=A9=20sur=20?=
 =?UTF-8?q?la=20plan=20syntaxique=20(Michael=20Parienti)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/inc_texte.php3 | 71 +++++++++++++++++++++++++++++--------------
 1 file changed, 49 insertions(+), 22 deletions(-)

diff --git a/ecrire/inc_texte.php3 b/ecrire/inc_texte.php3
index cb3981717b..d35e826d39 100644
--- a/ecrire/inc_texte.php3
+++ b/ecrire/inc_texte.php3
@@ -552,43 +552,70 @@ function typo($letexte) {
 }
 
 
-// Les listes a puce
-function traiter_listes_a_puce ($texte) {
+
+//
+// Traitement des listes
+//
+function traiter_listes ($texte) {
 	$parags = split ("\n[[:space:]]*\n", $texte);
 	unset($texte);
 
 	// chaque paragraphe est traite a part
 	while (list(,$para) = each($parags)) {
 		$niveau = 0;
-		$lignes = split("\n-\*", "\n" . $para);
+		$lignes = explode("\n-", "\n" . $para);
 
 		// ne pas toucher a la premiere ligne
 		list(,$debut) = each($lignes);
 		$texte .= $debut;
 
-		// chaque item a sa profondeur = nb d'etoiles (dont une a ete mangee par le split)
+		// chaque item a sa profondeur = nb d'etoiles
+		unset ($type);
 		while (list(,$item) = each($lignes)) {
-			ereg("^(\**)[[:space:]]*(.*)", $item, $regs);
-			$profond = 1+strlen($regs[1]);
-			unset ($ajout);
-			while ($profond > $niveau) {
-				$niveau ++;
-				$ajout .= "<ul>";
+			ereg("^(\**|#*)[[:space:]]*(.*)", $item, $regs);
+			$profond = strlen($regs[1]);
+
+			if ($profond > 0) {
+				unset ($ajout);
+
+				// changement de type de liste : il faut descendre un
+				// niveau plus bas, fermer ce niveau, et remonter
+				$nouv_type = (substr($item,0,1) == '*') ? 'ul' : 'ol';
+				$change_type = ($type AND ($type <> $nouv_type)) ? 1 : 0;
+				$type = $nouv_type;
+
+				if ($niveau == $profond && !$change_type) {
+					$ajout = "</li>";
+				}
+				while ($niveau > $profond - $change_type) {
+					$ajout .= $pile_li[$niveau];
+					$ajout .= $pile_type[$niveau];
+					$niveau --;
+					unset ($pile_li[$niveau]);
+				}
+				while ($niveau < $profond) {
+					$niveau ++;
+					$ajout .= "<$type class=\"spip\">";
+					$pile_type[$niveau] = "</$type>";
+				}
+				$ajout .= "<li class=\"spip\">";
+				$pile_li[$profond] = "</li>";
 			}
-			while ($profond < $niveau) {
-				$niveau --;
-				$ajout .= "</ul>";
+			else { 
+				$ajout = "\n- ";	// puce normale
 			}
 
-			if ($ajout)
-				$texte .= $ajout ."<li>". $regs[2];
-			else
-				$texte .= "</li><li>" . $regs[2];
+			$texte .= $ajout . $regs[2];
 		}
 
 		// retour sur terre
-		while ($niveau -- > 0)
-			$texte .= "</li></ul>";
+		unset ($ajout);
+		while ($niveau > 0) {
+			$ajout .= $pile_li[$niveau];
+			$ajout .= $pile_type[$niveau];
+			$niveau --;
+		}
+		$texte .= $ajout;
 
 		// paragraphe
 		$texte .= "\n\n";
@@ -814,9 +841,9 @@ function traiter_raccourcis($letexte, $les_echap = false, $traiter_les_notes = '
 
 	$letexte = trim($letexte);
 
-	// les listes a puce
-	if (ereg("\n-\*", "\n".$letexte))
-		$letexte = traiter_listes_a_puce($letexte);
+	// les listes
+	if (ereg("\n-[*#]", "\n".$letexte))
+		$letexte = traiter_listes($letexte);
 
 	// autres raccourcis
 	if ($flag_str_replace && !$flag_preg_replace) {
-- 
GitLab