Haml: controlla gli spazi bianchi attorno al testo

Nel mio modello Rails, mi piacerebbe realizzare l’HTML finale a questo effetto usando HAML:

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

Il modello che si avvicina:

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

Si può, tuttavia, notare che questo produce uno spazio tra il collegamento e la virgola. C’è un modo pratico per evitare questo spazio bianco? So che esiste una syntax per rimuovere gli spazi bianchi attorno ai tag, ma questa stessa syntax può essere applicata solo al testo? Non mi piace davvero la soluzione del markup extra per raggiungere questo objective.

Un modo migliore per farlo è stato introdotto dagli aiutanti di Haml:

circondare

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

produce:

 (chicken) 

avere successo :

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

produce:

 click here. 

precedere :

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

produce:

 *Not really 

Per rispondere alla domanda originale:

 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 

produce:

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

Puoi farlo anche usando il modificatore di “spazio bianco” di Haml. Inserimento > dopo una dichiarazione Haml impedirà l’aggiunta di spazi bianchi attorno ad esso:

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

produce:

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

Tuttavia, come puoi vedere, il modificatore > rimuove anche gli spazi bianchi davanti al link, rimuovendo lo spazio desiderato tra le parole e il link. Non ho ancora capito bene questo aspetto, tranne che per aggiungere   alla fine di “I will first”, in questo modo:

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

Che finalmente produce l’output desiderato senza molte interpolazioni difficili da leggere:

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

Bene, ecco la soluzione su cui mi sto ambientando:

aiutante

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

vista

 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 

In questo modo, lo spazio bianco è escluso di default, ma posso ancora includerlo esplicitamente con una riga “\ n”. (Ha bisogno del doppio backslash perché altrimenti HAML lo interpreta come una newline effettiva.) Fatemi sapere se c’è un’opzione migliore là fuori!

Puoi utilizzare la ‘syntax aligator’ di HAML

Rimozione spazi bianchi:> e <

e rimuoverà tutti gli spazi bianchi che circondano un tag, mentre guarda fuori dal tag e mangia lo spazio bianco all’esterno, e

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

Una volta che ho adottato questo tipo di cose, è necessario utilizzare l’interpolazione delle stringhe:

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

Non mi piace l’aspetto della stringa letterale nell’interpolazione, ma l’ho usato con stringhe precedentemente dichiarate o stringhe generate dynamicmente prima.

Puoi farlo per mantenere lo spazio principale:

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

Lo spazio è tra virgolette.

Anche se non ben documentato, questo è ottenuto in modo pulito usando la conservazione dello spazio bianco HAML (>) combinata con uno spazio ASCII (& # 32;), e non con gli helper:

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

Questo produrrà quello che vuoi:

 Anchor text,  More text 

Ma sono d’accordo, HAML ha bisogno di trovare un modo migliore per farlo, poiché aggiunge caratteri ASCII non necessari alla pagina (ma è ancora più efficiente dell’utilizzo di helper).

C’è la syntax della parentesi angular “whitespace munching”, altrimenti scrivere un metodo di supporto per questo.

Mi sono imbattuto in un problema simile e ho trovato questo, quindi ho pensato di pubblicare un’altra soluzione che non richiede un metodo di supporto. Usa l’interpolazione # {} di Ruby per racchiudere il link e le istruzioni 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} 

Funziona in 3.0.18, potrebbe funzionare anche nelle versioni precedenti.

Ancora un’altra opzione che ho usato in passato:

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

Potresti anche fare sempre:

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

La soluzione che ho ottenuto è:

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

Puoi usare = , sebbene = sia usato per produrre il risultato del codice Rails, ma qui servirà lo scopo.

La funzione preservare ha funzionato per me

.white-space-pre= preserve "TEXT"