Les retours a la ligne

Mammouth du PHP | 725 Messages

18 avr. 2012, 05:45

Bonjour,

je fais une liste pour un code BBCode:

Code : Tout sélectionner

<img src="form/list_unordered.png" align="absmiddle" width="20" height="20" style="cursor: pointer;" onclick="insertTag('[ul]<?php echo '\n'; ?>[li]','Text1[/li]<?php echo '\n'; ?>[/ul]','textarea');" title = "Liste Simple" />
le code s'insere au textarea comme suite:

Code : Tout sélectionner

[ul] [li]Text1[/li] [/ul]
comme vous voyez les retours a la ligne apres [ul] et avant [/ul], si j'insere un nouveau text (Text2), ca me donne 2 sauts a la ligne, et entre une liste (2 ul) ca me donne 4 sauts a la ligne

Je parse mon code comme suite:

Code : Tout sélectionner

<?php         // parser le code         public final function bbcode() {             $tags = array(                 '\[ul\](.*?)\[\/ul\]' => '<ul>$1</ul>',            '\[ol\](.*?)\[\/ol\]' => '<ol>$1</ol>',            '\[li\](.*?)\[\/li\]' => '<li style="list-style-image: url(\'font_size.png\');">$1</li>',            '\[li=1\](.*?)\[\/li\]' => '<li>$1</li>', ); // closed array                         $this->tags = $tags;                              foreach($this->tags as $k=>$v)        {               $this->text = preg_replace('/'.$k.'/', $v , $this->text);                  }                $this->newText = $this->text;                return($this->newText); } // end function ?>
et je recupere la previsualisation:

Code : Tout sélectionner

$formatageCols    = Isset($_POST['formatageCols'])    ? nl2br($_POST['formatageCols'])    : $formatageCols = Null; include '../Classes/class_bbcode.php'; $f =  new BBCode($formatageCols); $formatageCols = $f->bbcode();              $return_arr["formatageCols"] = $formatageCols;         echo json_encode($return_arr);  

comment puis je faire pour eviter les multitudes saut de lignes et avoir une bonne mise en forme, le probleme est cause par le premier code HTML

merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 avr. 2012, 06:49

Salut,

Si j'ai bien compris, ce qui te gêne c'est les \n que tu ajoute avec le code JS ?
Pourquoi utiliser php pour les retours à la ligne ? (Javascript peux le faire aussi ;) ).

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

18 avr. 2012, 07:05

oui, comment integrer du JS au code HTML, j'ai essaye:
onclick="insertTag('[ul]<script>\n</script>[li]'

ViPHP
ViPHP | 2577 Messages

18 avr. 2012, 09:08

Il doit être possible de jouer sur les marges des tag html avec du css ou des attributs du type : style="margin = 0"
margin peut être remplacer par margin-top et/ou margin-bottom.

Mammouth du PHP | 725 Messages

18 avr. 2012, 11:54

je pense que la solution du JS est mieux, Non!

Mammouth du PHP | 725 Messages

19 avr. 2012, 05:02

comment peut on faire un retour a la ligne avec du JS au sein du code HTML?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

19 avr. 2012, 08:33

"\r\n" dans une chaîne de caractère si c'est dans un textarea. sinon un bon vieux br :)


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

19 avr. 2012, 08:55

insertTag('[ul]<script>\r\n</script>[li]'
ca me donne:

[ul]<script>
</script>[li]Text[/li]<script>
</script>[/ul]

ViPHP
ViPHP | 2577 Messages

19 avr. 2012, 09:30

Ce que j'ai compris, c'est que dans le rendu d'une liste <ul> il apparaît un trop grand espace assimilable à un saut de ligne. Il y a longtemps, j'avais résolu ce problème en "oubliant" la balise <ul>

C'est pour ca que je proposait l'utilisation de <ul style="margin: 0"> ou <ul style="margin-top: 0; margin-bottom: 0">

Mammouth du PHP | 725 Messages

19 avr. 2012, 12:15

Ce que j'ai compris, c'est que dans le rendu d'une liste <ul> il apparaît un trop grand espace assimilable à un saut de ligne. Il y a longtemps, j'avais résolu ce problème en "oubliant" la balise <ul>

C'est pour ca que je proposait l'utilisation de <ul style="margin: 0"> ou <ul style="margin-top: 0; margin-bottom: 0">
je parle de [ul] et retour a la ligne [li], comment le faire en JS sans que ca soit visible au code textarea

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

19 avr. 2012, 13:45

heu je crois que l'on pige pas ce que tu veux faudrait être plus clair.

parce qu'un retour a la ligne qui ne ce vois pas ça n'existe pas hein.

tu veux mettre en page le bbcode ? (pas le rendu) ?

si c'est ça tu le fait dans le code JS c'est suffisant.

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

19 avr. 2012, 16:05

je veux le faire au textarea:
<textarea ....>

ici je mets mes trucs en gras, italic, bla bla, apres je mets ma liste

[ul] // retour a la ligne invisible
[li]text[/li] // retour a la ligne invisible
[/ul] // retour a la ligne invisible

du text encore en gras, italic,..
</textarea>

ViPHP
ViPHP | 2577 Messages

19 avr. 2012, 16:16

Je pense que s'il y a un problème, c'est dans la fonction javascript "insertTag" que l'on ne voit pas.
L'appel à cette fonction me semble bon.

Je pense avoir compris ton problème : lorsque tu cliques sur le bouton d'ajout de liste, ca ajoute des saut de ligne en trop dans la textarea.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

19 avr. 2012, 16:25

[javascript]
onclick="insertTag('[ul]\n[li]\n','Text1[/li]\n[/ul]\n','textarea');"
[/javascript]

Ou avec des " je sais plus si en javascript y a les même problème qu'avec php ^^

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

20 avr. 2012, 05:05

je l'ai laisse comme c'est deja fait en PHP, j'ai filtre les br, n et r par des remplacements:
foreach($this->tags as $k=>$v)
	   {
	  		$this->text = preg_replace('/'.$k.'/', $v , $this->text);  		
			
			$this->text = preg_replace('/\n/', '', $this->text);
			$this->text = preg_replace('/\r/', '', $this->text);
			$this->text = preg_replace('/<ul><br \/>/', '<ul>', $this->text);
			$this->text = preg_replace('/<br \/><\/ul>/', '</ul>', $this->text);
			$this->text = preg_replace('/<\/li><br \/>/', '</li>', $this->text);
	   }
je pense que c'est la meilleur chose a faire, merci a vous :)