espaços em branco de controle em torno do texto: Haml
-
19-09-2019 - |
Pergunta
No meu modelo Rails, eu gostaria de realizar HTML final para esse 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 chega perto:
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, nota que esta produz um espaço entre a ligação ea vírgula. Existe alguma maneira prática para evitar este espaço em branco? Eu sei que há sintaxe para remover espaço em branco em torno de tags, mas pode ser aplicada esta mesma sintaxe para texto apenas? Eu realmente não gosto da solução de marcação extra para fazer isso.
Solução
A melhor maneira de fazer isso foi introduzida através de ajudantes de Haml:
??envolvente
= surround '(', ')' do
%a{:href => "food"} chicken
produz:
(<a href='food'>chicken</a>)
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
Outras dicas
Você também pode fazer isso usando modificador "espaços em branco guarnição" da Haml. Inserindo >
após uma declaração Haml irá evitar espaços em branco de ser adicionado à sua volta:
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 retira o espaço em branco na frente do link, removendo o espaço desejado entre as palavras e o link. Eu ainda não descobri uma maneira muito redor isso ainda, exceto para adicionar
para o final do "Eu vou primeiro", assim:
I will first
%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 <span><a href="http://example.com">link somewhere</a></span>, then render this half of the sentence if a condition is met
Tudo bem, aqui está a solução que eu estou de se estabelecer em:
Helper
def one_line(&block)
haml_concat capture_haml(&block).gsub("\n", '').gsub('\\n', "\n")
end
Ver
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, espaços em branco são excluídos por padrão, mas ainda posso incluí-lo explicitamente com um "\ n" linha. (Precisa do duplo barra invertida porque senão HAML interpreta como uma nova linha real.) Deixe-me saber se há uma opção melhor lá fora!
Você pode usar o 'sintaxe aligator' de HAML
Whitespace Remoção:> e <
e
Irá remover todos os espaços em torno de um tag, enquanto enfrenta fora da tag e come o espaço em branco do lado de fora, e
http://haml.info/docs/yardoc/file.REFERENCE. html # whitespace_removal__and_
Uma vez abordagem que eu tomei a este tipo de coisa é usar 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}
Eu não gosto da aparência da cadeia literal da interpolação, mas eu usei-o com cordas tenham sido previamente declarados ou seqüências geradas dinamicamente antes.
Você pode fazer isso para manter o espaço à esquerda:
%a{:href => 'http://example.com'}>= ' link somewhere'
O espaço é nas citações.
Apesar de não ser bem documentado, este é claramente conseguido usando HAML espaços de preservação (>) combinado com um espaço ASCII (& # 32;), e não com os ajudantes:
%a{:href=>'/home'}> Home link
, 
%a{:href=>'/page'} Next link
Isto irá produzir o que você quer:
<a href='/home'>Anchor text</a>, 
<a href='/page'>More text</a>
Mas eu concordo, HAML precisa chegar a uma maneira melhor de fazer isso, pois não adicionar caracteres ASCII desnecessários para a página (mas ainda é mais eficiente do que usar ajudantes).
Há o suporte de ângulo "espaços em branco mastigando" sintaxe, caso contrário, escrever um método auxiliar para ele.
me deparei com um problema semelhante e encontrei este, então eu pensei que eu ia postar uma outra solução que não requer um método auxiliar. Use Rubi interpolação # {} para embrulhar o link e se afirmações:
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 em 3.0.18, ele também pode funcionar em versões anteriores.
No entanto, outra opção que eu usei no passado:
- if @condition
%span> , then some more text after the link.
Você também pode sempre fazer:
= link_to url_path do
= ["part_1", "part_2"].join(", ")
A solução que eu fui trabalhar é:
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 =
é usada para a saída do resultado de código Rails, mas aqui ele vai servidor o efeito.
O preservar função funcionou para mim
.white-space-pre= preserve "TEXT"