Haml: controle o espaço em branco ao redor do texto

97

No meu template Rails, gostaria de realizar o HTML final para este efeito 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

O modelo que se aproxima:

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

Você pode, no entanto, notar que isso produz um espaço entre o link e a vírgula. Existe alguma maneira prática de evitar esse espaço em branco? Eu sei que existe uma sintaxe para remover espaços em branco ao redor das tags, mas essa mesma sintaxe pode ser aplicada apenas ao texto? Eu realmente não gosto da solução de marcação extra para fazer isso.

Matchu
fonte

Respostas:

210

Uma maneira melhor de fazer isso foi introduzida pelos ajudantes de Haml:

cercar

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

ter sucesso :

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

preceder :

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

Para responder à pergunta original:

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
Produz:
I will first
<a href="http://example.com">link somewhere</a>,
then render this half of the sentence if a condition is met
Ryan Crispin Heneise
fonte
1
Bom tempo, acabei de descobrir isso lendo a fonte de Haml. Aparentemente, eles já existem há algum tempo. Estranho que eles não os documentem na página de referência principal ...
Groxx
1
Você pode expandir sua resposta e mostrar o exemplo do OP usando esses ajudantes (presumivelmente succeedespecificamente)? Para mim, ainda parece não óbvio e um pouco feio: gist.github.com/1665374
João
16
Eu sinto que estou perdendo algo (enquanto vejo a contagem de votos positivos), mas a variante de sucesso não é equivalente à original, porque a vírgula final será renderizada mesmo se @condition == false, o que é mais feio do que o espaço antes desta vírgula.
Nash Bridges
2
Consegui obter o resultado correto usando preceder, em vez de obter sucesso. Felicidades!
Câmera de
40

Você também pode fazer isso usando o modificador "trim whitespace" de Haml. Inserir >após uma declaração de Haml evitará que espaços em branco sejam adicionados ao redor dela:

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

produz:

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

No entanto, como você pode ver, o >modificador também remove o espaço em branco na frente do link, removendo o espaço desejado entre as palavras e o link. Eu não descobri uma maneira bonita de contornar isso ainda, exceto para adicionar &nbsp;ao final de "Eu irei primeiro", assim:

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

O que finalmente produz a saída desejada sem muita interpolação de difícil leitura:

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
Ryan Crispin Heneise
fonte
1
Esqueci de mencionar que peguei isso na folha de dicas do Haml
Ryan Crispin Heneise
3
Funciona com tags, mas não com expressões; no seu exemplo, você mudou a expressão dele para uma etiqueta. Eu tenho o mesmo problema e, infelizmente, isso não é uma solução.
Teflon Ted
1
Eu observaria que &nbsp;tem um significado especial para isso, não é um espaço em branco comum - é um espaço em branco sem quebra, o que significa que durante a quebra de linha o navegador faria de tudo para manter as palavras &nbsp;unidas e isso nem sempre é o que você deseja.
Andrew
1
Além do comentário de Andrew, use em &#032;vez de &nbsp;apenas para um espaço em branco simples.
Daniel AR Werner
12

Tudo bem, aqui está a solução que estou escolhendo:

Ajudante

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

Visão

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

Dessa forma, o espaço em branco é excluído por padrão, mas ainda posso incluí-lo explicitamente com uma linha "\ n". (Ele precisa de uma barra invertida dupla porque, caso contrário, o HAML o interpretará como uma nova linha real.) Deixe-me saber se há uma opção melhor por aí!

Matchu
fonte
Nota para o mundo: Eu finalmente percebi e movi estes para ajudantes: P
Matchu
Outra nota para o mundo: hoje em dia, uso a solução da Groxx :)
Matchu
Isso é muito útil quando se trata de haml que gera um arquivo de texto! No meu caso, eu tinha uma linha em que parte dela foi decidida por um "se", que não pude corrigir com a solução de mysamillidea porque ela não remove novas linhas, apenas move a vírgula antes da nova linha. (Embora eu concorde que para a resposta à pergunta original, mysmallidea's é a melhor.)
cesóide
6

Você pode usar a 'sintaxe do aligator' do HAML

Remoção de espaços em branco:> e <

e <oferecem mais controle sobre o espaço em branco próximo a uma tag. > irá remover todos os espaços em branco ao redor de uma tag, enquanto <irá remover todos os espaços em branco imediatamente dentro de uma tag. Você pode pensar neles como crocodilos comendo o espaço em branco:> enfrenta a marca e come o espaço em branco do lado de fora, e <enfrenta a marca e come o espaço em branco do lado de dentro. Eles são colocados no final de uma definição de tag, depois das declarações de classe, id e atributo, mas antes de / ou =.

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

Yo Ludke
fonte
5

Uma vez que me aproximei desse tipo de coisa, usei interpolação de string:

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

Não gosto da aparência da string literal na interpolação, mas já a usei com strings declaradas anteriormente ou geradas dinamicamente antes.

Mandril
fonte
Mhm. Essa é a minha abordagem geral para coisas assim, mas nunca pensei em usar a condicional lá. É uma pena que o modelo real que eu estava usando acabou sendo um pouco mais complexo do que apenas a segunda metade de uma frase ... mas definitivamente vale a pena lembrar - obrigado!
Matchu
5

Você pode fazer isso para manter a liderança:

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

O espaço está entre aspas.

thinman
fonte
3

Embora não seja bem documentado, isso é alcançado de forma limpa usando a preservação de espaços em branco HAML (>) combinada com um espaço ASCII (& # 32;), e não com auxiliares:

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

Isso produzirá o que você deseja:

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

Mas eu concordo, o HAML precisa encontrar uma maneira melhor de fazer isso, pois adiciona caracteres ASCII desnecessários à página (mas ainda é mais eficiente do que usar auxiliares).

Ojak
fonte
1

Existe a sintaxe de "mastigação de espaços em branco" entre colchetes, caso contrário, escreva um método auxiliar para ela.

Andrew Vit
fonte
Como exatamente um ajudante para esse trabalho? Meh, vou ver o que posso fazer ...
Matchu
Quanto à mastigação de espaços em branco, não consigo descobrir como fazer essa sintaxe funcionar se não for em algum tipo de definição de tag. Estou apenas fazendo errado ou essa sintaxe não funciona sem uma tag?
Matchu
1

Eu me deparei com um problema semelhante e achei isso, então pensei em postar outra solução que não requer um método auxiliar. Use a interpolação Ruby # {} para envolver o link e as instruções 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}

Isso funciona no 3.0.18, mas também pode funcionar em versões anteriores.

biscoitos
fonte
É verdade que Haml não foi projetado para conteúdo. Não é sobre o conteúdo que estamos falando, no entanto. É um modelo. O autor dessa postagem do blog está se referindo a coisas como escrever uma página da web estática completa em Haml, que não é o que estou fazendo. O trecho de código que forneci é praticamente o .hamlarquivo completo - o fato de incluir um link e uma vírgula realmente não indica nada.
Matchu
1
Ah, entendo. Eu editei minha resposta, deixando a solução por conta própria.
biscoitos de
Embora isso possa funcionar, acho que torna a marcação difícil de ler. Em vez disso, apenas use os modificadores de espaço em branco HAML <e> como outras pessoas mencionaram, o que mantém seu HAML limpo e legível.
ToddH,
1

Mais uma opção que usei no passado:

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

Você também pode fazer sempre:

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

A solução que consegui funcionar é:

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

Você pode usar =, embora =seja usado para gerar o resultado do código Rails, mas aqui servirá para o propósito.

Arslan Ali
fonte
0

A função preservar funcionou para mim

.white-space-pre= preserve "TEXT"

gtournie
fonte