Haml: contrôle les espaces autour du texte

Dans mon modèle Rails, je voudrais accomplir le HTML final à cet effet en utilisant HAML:

I will first link somewhere, then render this half of the sentence if a condition is met 

Le modèle qui se rapproche:

 I will first = link_to 'link somewhere', 'http://example.com' - if @condition , then render this half of the sentence if a condition is met 

Vous pouvez toutefois noter que cela produit un espace entre le lien et la virgule. Existe-t-il un moyen pratique d’éviter cet espace? Je sais qu’il existe une syntaxe pour supprimer les espaces autour des balises, mais cette même syntaxe peut-elle être appliquée uniquement au texte? Je n’aime vraiment pas la solution du balisage supplémentaire pour accomplir cela.

Une meilleure façon de le faire a été introduite par les assistants de Haml:

entourer

 = surround '(', ')' do %a{:href => "https://stackoverflow.com/questions/1311428/haml-control-whitespace-around-text/food"} chicken 

Produit:

 (chicken) 

réussir :

 click = succeed '.' do %a{:href=>"https://stackoverflow.com/questions/1311428/haml-control-whitespace-around-text/thing"} here 

Produit:

 click here. 

précéder :

 = precede '*' do %span.small Not really 

Produit:

 *Not really 

Pour répondre à la question initiale:

 I will first = succeed ',' do = link_to 'link somewhere', 'http://example.com' - if @condition then render this half of the sentence if a condition is met 

Produit:

 I will first link somewhere, then render this half of the sentence if a condition is met 

Vous pouvez également le faire en utilisant le modificateur Haml “sortingm whitepace”. L’insertion > après une déclaration Haml empêchera l’ajout d’espaces:

 I will first %a{:href => 'http://example.com'}> link somewhere - if @condition , then render this half of the sentence if a condition is met 

produit:

 I will firstlink somewhere, then render this half of the sentence if a condition is met 

Cependant, comme vous pouvez le voir, le modificateur > supprime également les espaces devant le lien, supprimant ainsi l’espace souhaité entre les mots et le lien. Je n’ai pas encore trouvé le moyen de contourner ce problème, sauf pour append   à la fin de “je vais d’abord”, comme ça:

 I will first  %a{:href => 'http://example.com'}> link somewhere - if @condition , then render this half of the sentence if a condition is met 

Qui produit finalement la sortie souhaitée sans beaucoup d’interpolation difficile à lire:

 I will first link somewhere, then render this half of the sentence if a condition is met 

Bon, voici la solution sur laquelle je m’installe:

Assistant

 def one_line(&block) haml_concat capture_haml(&block).gsub("\n", '').gsub('\\n', "\n") end 

Vue

 I will first - one_line do = link_to 'link somewhere', 'http://example.com' - if @condition , then render this half of the sentence \\n if a condition is met 

De cette façon, les espaces sont exclus par défaut, mais je peux toujours l’inclure explicitement avec une ligne “\ n”. (Il faut une double barre oblique inverse car sinon HAML l’interprète comme une nouvelle ligne.) Faites-moi savoir s’il existe une meilleure option!

Vous pouvez utiliser la syntaxe “aligator” de HAML

Suppression d’espaces:> et <

et supprime tous les espaces entourant une balise, tandis que fait face à l’étiquette et mange les espaces à l’extérieur, et

http://haml.info/docs/yardoc/file.REFERENCE.html#whitespace_removal__et_

Une fois l’approche que j’ai prise à ce genre de chose est d’utiliser l’interpolation de chaîne:

 I will first #{link_to 'Link somewhere'}#{', then render this half of the sentence if a condition is met' if condition} 

Je n’aime pas l’apparence de la chaîne littérale dans l’interpolation, mais je l’ai utilisée avec des chaînes précédemment déclarées ou des chaînes générées dynamicment auparavant.

Vous pouvez le faire pour conserver l’espace principal:

 %a{:href => 'http://example.com'}>= ' link somewhere' 

L’espace est dans les citations.

Bien que cela ne soit pas bien documenté, ceci est réalisé de manière nette en utilisant la préservation des espaces blancs HAML (>) combinée à un espace ASCII (& # 32;), et non avec des helpers:

 %a{:href=>'https://stackoverflow.com/home'}> Home link ,  %a{:href=>'https://stackoverflow.com/page'} Next link 

Cela produira ce que vous voulez:

 Anchor text,  More text 

Mais je suis d’accord, HAML doit trouver une meilleure façon de procéder, car elle ajoute des caractères ASCII inutiles à la page (mais c’est encore plus efficace que d’utiliser des helpers).

Il y a la syntaxe de la parenthèse “whitepace munching”, sinon écrivez une méthode d’assistance pour cela.

Je suis tombé sur un problème similaire et je l’ai trouvé, alors j’ai pensé publier une autre solution qui ne nécessite pas de méthode d’assistance. Utilisez l’interpolation Ruby # {} pour envelopper le lien et si les instructions:

 I will first #{link_to 'link somewhere', 'http://example.com'}#{if true : ", then render this half of the sentence if a condition is met" end} 

Cela fonctionne en 3.0.18, il peut également fonctionner dans les versions précédentes.

Encore une autre option que j’ai utilisée par le passé:

 - if @condition %span> , then some more text after the link. 

Vous pouvez aussi toujours faire:

 = link_to url_path do = ["part_1", "part_2"].join(", ") 

La solution que j’ai mise au point est la suivante:

 I will first = link_to 'link somewhere', 'http://example.com' - if @condition = ", then render this half of the sentence if a condition is met" 

Vous pouvez utiliser = , si = est utilisé pour afficher le résultat du code Rails, mais ici, il servira le but.

La fonction de conservation a fonctionné pour moi

.white-space-pre= preserve "TEXT"