5 votes

Rails : Empêcher simple_format d'ajouter des sauts de ligne aux listes ?

Voici l'entrée HTML :

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

<ul>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
</ul>

Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Si je fais passer ça par la fonction simple_format la sortie est :

<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>

<p><ul>
<br />  <li>Item 1</li>
<br />  <li>Item 2</li>
<br />  <li>Item 3</li>
</ul></p>

<p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>

Remarquez le <br /> avant chaque élément de la liste.

Comment puis-je obtenir simple_format de ne pas faire ça ?

En fin de compte, ce que je veux faire, c'est ajouter des balises de paragraphe autour du contenu qui n'est pas déjà enveloppé dans une sorte de balise (c'est-à-dire blockquote, ul, ol).

7voto

Michael Taylor Points 101

J'ai rencontré le même problème. Voici comment le résoudre !

Enveloppez la sortie simple_format dans un div comme ceci :

<div class="single-spacing">
  <%= simple_format @your_content %>          
</div>

Ajoutez ensuite ceci à votre fichier CSS :

.single-spacing {
  ul br {
    display: none;
  }
}

Ou, quand vous voulez vraiment br dans une liste, vous pouvez ajouter ce CSS à la place :

.single-spacing{
  ul li br:first-child, ol li br:first-child {
    display: none;
  }
}

J'ai essayé d'ajouter cette classe au format simple_format lui-même (qui est une option), mais cela n'a pas fonctionné pour une raison quelconque. En le plaçant dans un DIV, ça marche.

Je ne sais pas pourquoi simple_format ajoute ces éléments supplémentaires.
à une simple liste, mais hey ho.

Michael

0voto

Barlow Points 2890

Pour autant que je sache, simple_format est conçu pour fonctionner uniquement autour des sauts de ligne ' \n (qui sont créés lorsque vous appuyez sur la touche Entrée)

simple_format crée un <br /> para \n et <p> para \n\n

simple_format n'est pas vraiment conçu pour fonctionner avec les entrées html existantes, mais plutôt pour les champs text_area des bases de données et les chaînes de texte, etc.

voir la documentation de rails pour des exemples : ActionView - simple_format

Nous vous suggérons d'envelopper l'ensemble de vos données à l'aide de la balise content_tag :

    <%= content_tag :p, :class => "strong" do -%>
      Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

      <ul>
       <li>Item 1</li>
       <li>Item 2</li>
       <li>Item 3</li>
     </ul>

     Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    <% end -%>

ou, si possible, formatez votre html sans saut de ligne :

  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

  <ul> <li>Item 1 </li> <li>Item 2</li> <li>Item 3</li> </ul>

  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Ces deux solutions sont plutôt bricolées, la meilleure solution serait que toutes les entrées soient stockées en html avant d'être appelées pour être affichées. Mais ne sachant pas comment vous obtenez l'entrée, il est difficile de suggérer un moyen de le faire.

0voto

Dima Melnik Points 614

Vous pouvez essayer de désactiver désinfecter param

simple_format html_input, {}, sanitize: false}

et ça marchera, mais vous devez garder à l'esprit qu'il n'y a pas de désinfectant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X