Haml: controlla gli spazi bianchi attorno al testo


97

Nel mio modello Rails, vorrei realizzare l'HTML finale a questo effetto usando HAML:

I will first <a href="http://example.com">link somewhere</a>, 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

Tuttavia, potresti 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 sintassi per rimuovere gli spazi bianchi attorno ai tag, ma questa stessa sintassi può essere applicata solo al testo? Non mi piace davvero la soluzione di markup extra per ottenere questo risultato.

Risposte:


210

Un modo migliore per farlo è stato introdotto tramite gli helper di Haml:

circondare

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

riuscire :

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

precedere :

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

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

1
Bel tempismo, l'ho appena scoperto leggendo la fonte di Haml. A quanto pare sono in giro da un po '. Strano che non li documentino nella pagina di riferimento principale ...
Groxx

1
Puoi espandere la tua risposta e mostrare di esprimere l'esempio dell'OP usando questi aiutanti (presumibilmente in modo succeedspecifico)? A me sembra ancora poco ovvio e un po 'brutto: gist.github.com/1665374
John

16
Mi sento come se mi mancasse qualcosa (mentre guardo il conteggio dei voti positivi), ma la variante riuscita non è equivalente a quella originale, perché la virgola finale verrà visualizzata anche se @condition == false, che è più brutta dello spazio prima di questa virgola.
Nash Bridges

2
Sono riuscito a ottenere il risultato corretto usando precede, piuttosto che avere successo. Saluti!
Cam

40

Puoi farlo anche usando il modificatore "trim whitespace" di Haml. L'inserimento >dopo una dichiarazione Haml impedirà l'aggiunta di spazi bianchi attorno ad essa:

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

Tuttavia, come puoi vedere, il >modificatore rimuove anche lo spazio bianco davanti al collegamento, rimuovendo lo spazio desiderato tra le parole e il collegamento. Non ho ancora trovato un modo carino per aggirare questo, tranne per aggiungere &nbsp;alla fine di "Lo farò per primo", in questo modo:

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

Che finalmente produce l'output desiderato senza molte interpolazioni di difficile lettura:

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

1
Ho dimenticato di dire che l'ho preso dal cheat sheet di Haml, che è molto utile: cheat.errtheblog.com/s/haml
Ryan Crispin Heneise

3
Funziona con i tag ma non con le espressioni; nel tuo esempio hai cambiato la sua espressione in un tag. Ho lo stesso problema e purtroppo questa non è una soluzione.
Teflon Ted

1
Vorrei sottolineare che &nbsp;ha un significato speciale, non è un normale spazio bianco - è uno spazio bianco non interrotto, il che significa che durante il wrapping delle parole il browser farebbe di tutto per mantenere le parole legate &nbsp;insieme e questo non è sempre quello che vuoi.
Andrew

1
Oltre al commento di Andrew, usa &#032;invece di &nbsp;solo per un semplice spazio bianco.
Daniel AR Werner

12

Bene, ecco la soluzione su cui sto stabilendo:

Helper

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

Visualizza

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, gli spazi vengono esclusi per impostazione predefinita, ma posso comunque includerli esplicitamente con una riga "\ n". (Ha bisogno della doppia barra rovesciata perché altrimenti HAML lo interpreta come un vero ritorno a capo.) Fammi sapere se c'è un'opzione migliore là fuori!


Nota per il mondo: alla fine mi sono reso conto e ho spostato questi agli aiutanti: P
Matchu

Un'altra nota al mondo: in questi giorni, uso la soluzione di Groxx :)
Matchu

Questo è molto utile quando si tratta di haml che genera un file di testo! Nel mio caso avevo una riga in cui parte di essa è stata decisa da un "se", che non ho potuto correggere con la soluzione di mysamillidea perché non elimina le nuove righe, sposta solo la virgola prima della nuova riga. (Anche se sono d'accordo che per la risposta alla domanda originale quella di mysmallidea è la migliore.)
cesoid

6

Puoi usare la 'sintassi di aligatore' di HAML

Rimozione di spazi bianchi:> e <

e <ti danno un maggiore controllo sugli spazi bianchi vicino a un tag. > rimuoverà tutti gli spazi bianchi che circondano un tag, mentre <rimuoverà tutti gli spazi bianchi immediatamente all'interno di un tag. Puoi immaginarli come alligatori che mangiano lo spazio bianco:> si affaccia fuori dal tag e mangia lo spazio bianco all'esterno e <si affaccia nel tag e mangia lo spazio bianco all'interno. Sono posizionati alla fine di una definizione di tag, dopo le dichiarazioni di classe, id e attributo ma prima / o =.

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


5

Una volta che l'approccio che ho adottato per questo genere di cose è usare l'interpolazione di 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 usata con stringhe dichiarate in precedenza o stringhe generate dinamicamente prima.


Mhm. Questo è il mio approccio generale a cose del genere, ma non avevo mai pensato di usare il condizionale lì dentro. È un peccato che il modello effettivo che stavo usando si sia rivelato un po 'più complesso di una semplice seconda metà di una frase ... ma vale sicuramente la pena ricordarlo - grazie!
Matchu

5

Puoi farlo per mantenere lo spazio iniziale:

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

Lo spazio è tra virgolette.


3

Sebbene non sia ben documentato, ciò si ottiene in modo pulito utilizzando la conservazione degli spazi bianchi HAML (>) combinata con uno spazio ASCII (& # 32;) e non con gli helper:

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

Questo produrrà ciò che desideri:

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

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'uso degli helper).


1

C'è la sintassi "sgranocchiare spazi bianchi" tra parentesi angolari, altrimenti scrivi un metodo di supporto per essa.


Come sarebbe esattamente un aiutante per quel lavoro? Meh, vedrò cosa posso
inventare

Per quanto riguarda lo sgranocchiare spazi bianchi, non riesco a capire come far funzionare quella sintassi se non è su una sorta di definizione di tag. Sto solo sbagliando o la sintassi non funziona senza tag?
Matchu

1

Mi sono imbattuto in un problema simile e l'ho trovato, quindi ho pensato di pubblicare un'altra soluzione che non richiede un metodo di supporto. Usa l'interpolazione 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 nella 3.0.18, potrebbe funzionare anche nelle versioni precedenti.


Certo, Haml non è progettato per i contenuti. Tuttavia, non è questo il contenuto di cui stiamo parlando. È un modello. L'autore di quel post sul blog si riferisce a cose come la scrittura di una pagina web statica completa in Haml, che non è quello che sto facendo. Lo snippet di codice che ho fornito è praticamente il .hamlfile completo : il fatto che includa un collegamento e una virgola in realtà non indica nulla in entrambi i casi.
Matchu

1
Ah, capisco. Ho modificato la mia risposta, lasciando la soluzione da sola.
biscotti

Sebbene possa funzionare, penso che renda il markup difficile da leggere. Invece usa solo i modificatori di spazio bianco HAML <e> come altre persone hanno menzionato, il che mantiene il tuo HAML pulito e leggibile.
ToddH

1

Un'altra opzione che ho usato in passato:

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

0

Puoi anche fare sempre:

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

0

La soluzione che ho ottenuto lavorando è:

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à allo scopo.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.