Haml: controla los espacios en blanco alrededor del texto

97

En mi plantilla Rails, me gustaría lograr HTML final a este efecto 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

La plantilla que se acerca:

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

Sin embargo, puede observar que esto produce un espacio entre el enlace y la coma. ¿Existe alguna forma práctica de evitar este espacio en blanco? Sé que hay una sintaxis para eliminar los espacios en blanco alrededor de las etiquetas, pero ¿se puede aplicar esta misma sintaxis solo al texto? Realmente no me gusta la solución de marcado adicional para lograr esto.

Matchu
fuente

Respuestas:

210

Se ha introducido una mejor manera de hacer esto a través de los ayudantes de Haml:

rodear

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

tener éxito :

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

preceder :

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

Para responder a la pregunta 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
Produce:
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
fuente
1
Buen momento, acabo de enterarme de esto leyendo la fuente de Haml. Aparentemente han existido por un tiempo. Es extraño que no los documenten en la página de referencia principal ...
Groxx
1
¿Puede ampliar su respuesta y mostrar para expresar el ejemplo del OP utilizando estos ayudantes (presumiblemente succeedespecíficamente)? Para mí todavía parece no obvio y un poco feo: gist.github.com/1665374
John
16
Siento que me falta algo (mientras miro el recuento de votos positivos), pero la variante exitosa no es equivalente a la original, porque la coma final se representará incluso si @condition == false, lo cual es más feo que el espacio antes de esta coma.
Nash Bridges
2
Me las arreglé para obtener el resultado correcto usando preceder, en lugar de tener éxito. ¡Salud!
Cam
40

También puede hacer esto usando el modificador "recortar espacios en blanco" de Haml. Insertar >después de una declaración Haml evitará que se agreguen espacios en blanco a su alrededor:

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

Sin embargo, como puede ver, el >modificador también quita el espacio en blanco delante del enlace, eliminando el espacio deseado entre las palabras y el enlace. No he encontrado una manera bonita de solucionar esto todavía, excepto para agregar &nbsp;al final de "Lo haré primero", así:

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

Que finalmente produce la salida deseada sin mucha interpolación difícil de leer:

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
fuente
1
Olvidé mencionar que obtuve esto de la hoja de trucos de Haml, que es muy útil: cheat.errtheblog.com/s/haml
Ryan Crispin Heneise
3
Funciona con etiquetas pero no con expresiones; en su ejemplo, ha cambiado su expresión a una etiqueta. Tengo el mismo problema y, lamentablemente, esta no es una solución.
Teflon Ted
1
Me gustaría comentar que &nbsp;tiene un significado especial, no es un espacio en blanco ordinario, es un espacio en blanco que no se rompe, lo que significa que durante el ajuste de palabras, el navegador haría todo lo posible para mantener las palabras &nbsp;unidas y esto no siempre es lo que quieres.
Andrew
1
Además del comentario de Andrew, use en &#032;lugar de &nbsp;solo un espacio en blanco simple.
Daniel AR Werner
12

Muy bien, aquí está la solución con la que me estoy decidiendo:

Ayudante

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

De esa manera, los espacios en blanco se excluyen de forma predeterminada, pero aún puedo incluirlos explícitamente con una línea "\ n". (Necesita la doble barra invertida porque, de lo contrario, HAML la interpreta como una nueva línea real). ¡Avíseme si hay una mejor opción!

Matchu
fuente
Nota para el mundo: finalmente me di cuenta y los trasladé a los ayudantes: P
Matchu
Otra nota para el mundo: estos días, uso la solución de Groxx :)
Matchu
¡Esto es muy útil cuando se trata de haml que genera un archivo de texto! En mi caso, tuve una línea en la que parte de ella se decidió por un "si", que no pude arreglar con la solución de mysamillidea porque no elimina las nuevas líneas, solo mueve la coma antes de la nueva línea. (Aunque estoy de acuerdo en que para la respuesta a la pregunta original, la de mysmallidea es la mejor.)
cesoid
6

Puede utilizar la 'sintaxis de cocodrilo' de HAML

Eliminación de espacios en blanco:> y <

y <le dan más control sobre los espacios en blanco cerca de una etiqueta. > eliminará todos los espacios en blanco que rodean una etiqueta, mientras que <eliminará todos los espacios en blanco inmediatamente dentro de una etiqueta. Puede pensar en ellos como caimanes que se comen el espacio en blanco:> se enfrenta a la etiqueta y se come el espacio en blanco en el exterior, y <se enfrenta a la etiqueta y se come el espacio en blanco en el interior. Se colocan al final de una definición de etiqueta, después de las declaraciones de clase, id y atributo, pero antes de / o =.

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

Yo Ludke
fuente
5

Una vez que me acerqué a este tipo de cosas es usar la interpolación de cadenas:

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

No me gusta el aspecto de la cadena literal en la interpolación, pero la he usado con cadenas declaradas previamente o cadenas generadas dinámicamente antes.

Arrojar
fuente
Mhm. Ese es mi enfoque general para cosas como esa, pero nunca había pensado en usar el condicional allí. Es una pena que la plantilla real que estaba usando resultó ser un poco más compleja que solo la segunda mitad de una oración ... pero definitivamente vale la pena recordarlo, ¡gracias!
Matchu
5

Puede hacer esto para mantener el espacio principal:

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

El espacio está entre comillas.

thethinman
fuente
3

Aunque no está bien documentado, esto se logra limpiamente usando la preservación de espacios en blanco HAML (>) combinada con un espacio ASCII (& # 32;), y no con ayudantes:

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

Esto producirá lo que quieres:

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

Pero estoy de acuerdo, HAML necesita encontrar una mejor manera de hacer esto, ya que agrega caracteres ASCII innecesarios a la página (pero aún es más eficiente que usar ayudantes).

ojak
fuente
1

Existe la sintaxis de "masticar espacios en blanco" entre corchetes; de lo contrario, escribe un método auxiliar para ello.

Andrew Vit
fuente
¿Cómo funcionaría exactamente un ayudante para eso? Meh, veré qué se me ocurre ...
Matchu
En cuanto a masticar espacios en blanco, no puedo averiguar cómo hacer que esa sintaxis funcione si no está en algún tipo de definición de etiqueta. ¿Lo estoy haciendo mal o esa sintaxis no funciona sin una etiqueta?
Matchu
1

Me encontré con un problema similar y encontré esto, así que pensé en publicar otra solución que no requiera un método auxiliar. Utilice la interpolación de Ruby # {} para envolver el enlace y las declaraciones 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}

Esto funciona en 3.0.18, también puede funcionar en versiones anteriores.

galletas
fuente
Por supuesto, Haml no está diseñado para contenido. Sin embargo, esto no es contenido del que estamos hablando allí. Es una plantilla. El autor de esa publicación de blog se refiere a cosas como escribir una página web estática completa en Haml, que no es lo que estoy haciendo. El fragmento de código que proporcioné es prácticamente el .hamlarchivo completo ; el hecho de que incluya un enlace y una coma no indica nada de ninguna manera.
Matchu
1
Ah, ya veo. He editado mi respuesta, dejando que la solución se sostenga por sí sola.
galletas
Si bien esto puede funcionar, creo que dificulta la lectura del marcado. En su lugar, utilice los modificadores de espacios en blanco de HAML <y> como han mencionado otras personas, lo que mantiene su HAML limpio y legible.
ToddH
1

Otra opción más que he usado en el pasado:

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

También puedes hacer siempre:

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

La solución que obtuve es:

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

Puede usar =, aunque =se usa para generar el resultado del código de Rails, pero aquí servirá el propósito.

Arslan Ali
fuente
0

La función de preservar funcionó para mí

.white-space-pre= preserve "TEXT"

gtournie
fuente