web-dev-qa-db-fra.com

Haml: contrôler les espaces autour du texte

Dans mon modèle Rails, j'aimerais accomplir le HTML final à cet effet en utilisant HAML:

I will first <a href="http://example.com">link somewhere</a>, then render this half of the sentence if a condition is met

Le modèle qui s'en 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 cependant noter que cela produit un espace entre le lien et la virgule. Existe-t-il un moyen pratique d'éviter cet espace blanc? 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 de balisage supplémentaire pour y parvenir.

94
Matchu

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

surround

= surround '(', ')' do
  %a{:href => "food"} chicken
(<a href='food'>chicken</a>)

réussir :

click
= succeed '.' do
  %a{:href=>"thing"} here
click
<a href='thing'>here</a>.

précéder :

= precede '*' do
  %span.small Not really
*<span class='small'>Not really</span>

Pour répondre à la question d'origine:

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
I will first
<a href="http://example.com">link somewhere</a>,
then render this half of the sentence if a condition is met
207
BoosterStage

Vous pouvez également le faire en utilisant le modificateur "Trim white white" de Haml. Insertion de > après une déclaration Haml empêchera l'ajout d'espaces autour:

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 first<a href='http://example.com'>link somewhere</a>, then render this half of the sentence if a condition is met

Cependant, comme vous pouvez le voir, le > Le modificateur supprime également les espaces devant le lien, supprimant l'espace souhaité entre les mots et le lien. Je n'ai pas encore trouvé de solution à cela, sauf pour ajouter &nbsp; à la fin de "Je vais d'abord", comme ceci:

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

Ce qui produit finalement la sortie souhaitée sans beaucoup d'interpolation difficile à lire:

I will first&nbsp;<span><a href="http://example.com">link somewhere</a></span>, then render this half of the sentence if a condition is met
39
BoosterStage

D'accord, 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 a besoin de la double barre oblique inverse, sinon HAML l'interprète comme une nouvelle ligne réelle.) Faites-moi savoir s'il existe une meilleure option!

12
Matchu

Vous pouvez utiliser la "syntaxe aligator" de HAML

Suppression des espaces blancs:> et <

et <vous donne plus de contrôle sur les espaces près d'une balise. > supprimera tous les espaces entourant une balise, tandis que <supprimera tous les espaces immédiatement dans une balise. Vous pouvez les considérer comme des alligators mangeant les espaces blancs:> fait face à la balise et mange les blancs à l'extérieur, et <fait face à la balise et mange les blancs à l'intérieur. Ils sont placés à la fin d'une définition de balise, après les déclarations de classe, id et attribut, mais avant/ou =.

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

6
Yo Ludke

Vous pouvez le faire pour conserver l'espace de tête:

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

L'espace est entre guillemets.

5
thethinman

Une fois que j'ai adopté ce genre de chose, j'utilise l'interpolation de chaînes:

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 déjà utilisée avec des chaînes précédemment déclarées ou des chaînes générées dynamiquement.

5
Chuck

Bien que cela ne soit pas bien documenté, cela est clairement réalisé en utilisant la conservation des espaces blancs HAML (>) combinée avec un espace ASCII (& # 32;), et non avec des assistants:

%a{:href=>'/home'}> Home link
,&#32; 
%a{:href=>'/page'} Next link

Cela produira ce que vous voulez:

<a href='/home'>Anchor text</a>,&#32;
<a href='/page'>More text</a>

Mais je suis d'accord, HAML doit trouver une meilleure façon de le faire, car elle ajoute des caractères ASCII ASCII inutiles à la page (mais c'est toujours plus efficace que d'utiliser des assistants).

3
ojak

Il y a la syntaxe des crochets d'angle "munching", sinon écrivez une méthode d'aide pour cela.

1
Andrew Vit

Encore une autre option que j'ai utilisée dans le passé:

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

J'ai rencontré un problème similaire et j'ai trouvé cela, alors j'ai pensé publier une autre solution qui ne nécessite pas de méthode d'assistance. Utilisez Ruby interpolation # {} pour encapsuler le lien et les instructions if:

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 dans la version 3.0.18, il peut également fonctionner dans les versions antérieures.

1
biscuits

La solution que j'ai obtenue est:

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 =, bien que = est utilisé pour sortir le résultat du code Rails, mais ici il servira le but.

0
Arslan Ali

La fonction préserver a fonctionné pour moi

.white-space-pre= preserve "TEXT"

0
gtournie

Vous pouvez également toujours faire:

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