Essayer d'utiliser handlebars.js pour les modèles, mais la bibliothèque semble ignorer les nouvelles lignes.
Quelle est la bonne façon de gérer les nouvelles lignes? Doivent-ils être remplacés manuellement après l'action de création de modèles?
Il ne le fait pas automatiquement, mais en utilisant la fonction d'aide, cela peut être réalisé:
JS:
Handlebars.registerHelper('breaklines', function(text) {
text = Handlebars.Utils.escapeExpression(text);
text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
return new Handlebars.SafeString(text);
});
Modèle HTML:
<div>
{{breaklines description}}
</div>
En insérant trois accolades au lieu des deux classiques, vous pouvez demander au guidon d'arrêter ses techniques normales d'échappement des expressions html telles que <br>
et <p>
;
Par exemple, sur le site Web du guidon:
"Guidon HTML-échappe les valeurs renvoyées par un {{expression}}
. Si vous ne voulez pas que le guidon échappe à une valeur, utilisez le "triple-stash", {{{
. "
<div class="entry">
<h1>{{title}}</h1>
<div class="body">
{{{body}}}
</div>
</div>
dans ce contexte:
{
title: "All about <p> Tags",
body: "<p>This is a post about <p> tags</p>"
}
résulte en:
<div class="entry">
<h1>All About <p> Tags</h1>
<div class="body">
<p>This is a post about <p> tags</p>
</div>
</div>
Voici deux approches que je préfère à la réponse actuellement acceptée:
white-space: pre-wrap;
ou white-space: pre;
sur l'élément où vous souhaitez conserver les sauts de ligne (autorisant ou supprimant le retour à la ligne naturel respectivement). Si vous voulez que les séquences d'espaces soient réduites, c'est ainsi que le texte en HTML est normalement présenté, utilisez white-space: pre-line;
mais notez que IE8 et les versions antérieures ne prennent pas en charge cela. https://developer.mozilla.org/en-US/docs/Web/CSS/white-spaceOu voici une version de l'assistant de modèle qui ne nécessite pas de copier-coller de code externe:
Template.registerHelper('breaklines', function (text) {
text = Blaze._escape(text);
text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
return new Spacebars.SafeString(text);
});
Voir https://github.com/meteor/meteor/blob/devel/packages/blaze/preamble.js pour Blaze._escape
Toute solution qui utilise des staches triples ouvrira votre application aux attaques XSS, sauf si vous implémentez quelque chose pour assainir le HTML.
Je suggère d'utiliser le <pre>
tag plutôt que de créer un assistant personnalisé.
J'ai utilisé le code publié par @Uri et c'était très utile.
Mais je me suis rendu compte que lorsque j'inscris l'assistant, le paramètre de fonction qu'il reçoit n'est pas le texte, mais la fonction qui est appelée à l'intérieur du modèle Handlebars. J'ai donc d'abord dû l'appeler pour obtenir le texte.
Afin de clarifier, je devais faire:
Handlebars.registerHelper('breaklines', function(descriptionFunction) {
text = descriptionFunction();
text = Handlebars.Utils.escapeExpression(text);
text = text.toString();
text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
return new Handlebars.SafeString(text);
});
C'est la seule façon dont je pourrais le faire fonctionner.
Pour d'autres comme moi qui suivaient le code de démarrage et ne savaient pas pourquoi aucun code HTML n'apparaissait.
in documentation des expressions du guidon il indique
Guidon HTML-échappe les valeurs renvoyées par une {{expression}}. Si vous ne voulez pas que le guidon échappe à une valeur, utilisez le "triple-stash", {{{