Haml: Kontrollieren Sie Leerzeichen um Text


97

In meiner Rails-Vorlage möchte ich mit HAML den endgültigen HTML-Code zu diesem Zweck erstellen:

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

Die Vorlage, die nahe kommt:

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

Sie können jedoch feststellen, dass dadurch ein Leerzeichen zwischen dem Link und dem Komma entsteht. Gibt es eine praktische Möglichkeit, dieses Leerzeichen zu vermeiden? Ich weiß, dass es eine Syntax zum Entfernen von Leerzeichen um Tags gibt, aber kann dieselbe Syntax nur auf Text angewendet werden? Ich mag die Lösung von zusätzlichem Markup wirklich nicht, um dies zu erreichen.

Antworten:


210

Ein besserer Weg, dies zu tun, wurde über Hamls Helfer eingeführt:

umgeben

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

erfolgreich :

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

vorausgehen :

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

So beantworten Sie die ursprüngliche Frage:

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

1
Gutes Timing, ich habe es gerade durch Lesen von Hamls Quelle herausgefunden. Anscheinend sind sie schon eine Weile da. Seltsam, dass sie sie nicht auf der Hauptreferenzseite dokumentieren ...
Groxx

1
Können Sie Ihre Antwort erweitern und zeigen, um das Beispiel des OP mit diesen Helfern auszudrücken (vermutlich succeedspeziell)? Für mich scheint es immer noch nicht offensichtlich und ein wenig hässlich: gist.github.com/1665374
John

16
Ich habe das Gefühl, dass mir etwas fehlt (während ich die Anzahl der Upvotes betrachte), aber die erfolgreiche Variante entspricht nicht der ursprünglichen Variante, da nachfolgendes Komma auch dann gerendert wird @condition == false, was hässlicher ist als Leerzeichen vor diesem Komma.
Nash Bridges

2
Ich habe es geschafft, das richtige Ergebnis zu erzielen, indem ich vorangestellt habe, anstatt erfolgreich zu sein. Prost!
Cam

40

Sie können dies auch mit Hamls Modifikator "Trim Whitespace" tun. Durch das Einfügen >nach einer Haml-Deklaration wird verhindert, dass Leerzeichen hinzugefügt werden:

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

produziert:

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

Wie Sie jedoch sehen können, entfernt der >Modifikator auch das Leerzeichen vor dem Link und entfernt den gewünschten Abstand zwischen den Wörtern und dem Link. Ich habe noch keinen schönen Weg gefunden, außer &nbsp;am Ende von "Ich werde zuerst" Folgendes hinzuzufügen :

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

Was schließlich die gewünschte Ausgabe ohne viel schwer lesbare Interpolation erzeugt:

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
Ich habe vergessen zu erwähnen, dass ich dies vom Haml-Spickzettel erhalten habe, was sehr hilfreich ist: cheat.errtheblog.com/s/haml
Ryan Crispin Heneise

3
Es funktioniert mit Tags, aber nicht mit Ausdrücken. In Ihrem Beispiel haben Sie seinen Ausdruck in ein Tag geändert. Ich habe das gleiche Problem und leider ist dies keine Lösung.
Teflon Ted

1
Ich würde bemerken, dass &nbsp;dies eine besondere Bedeutung hat, es ist kein gewöhnliches Leerzeichen - es ist ein nicht unterbrechendes Leerzeichen, was bedeutet, dass der Browser während des Zeilenumbruchs alles tut, um Wörter &nbsp;zusammenzuhalten, und dies ist nicht immer das, was Sie wollen.
Andrew

1
Verwenden Sie zusätzlich zu Andrews Kommentar &#032;anstelle von &nbsp;nur ein einfaches Leerzeichen.
Daniel AR Werner

12

Okay, hier ist die Lösung, auf die ich mich einlasse:

Helfer

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

Aussicht

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

Auf diese Weise wird Leerzeichen standardmäßig ausgeschlossen, aber ich kann es trotzdem explizit in eine "\ n" -Zeile einfügen. (Es benötigt den doppelten Backslash, da HAML ihn ansonsten als tatsächlichen Zeilenumbruch interpretiert.) Lassen Sie mich wissen, ob es eine bessere Option gibt!


Hinweis für die Welt: Ich bin schließlich weise geworden und habe diese zu Helfern verschoben: P
Matchu

Ein weiterer Hinweis für die Welt: In diesen Tagen verwende ich die Lösung von Groxx :)
Matchu

Dies ist sehr hilfreich, wenn es um Haml geht, das eine Textdatei generiert! In meinem Fall hatte ich eine Zeile, in der ein Teil davon durch ein "Wenn" entschieden wurde, das ich mit der Lösung von mysamillidea nicht beheben konnte, weil es keine Zeilenumbrüche entfernt, sondern nur das Komma vor die Zeilenumbruchstelle verschiebt. (Obwohl ich damit einverstanden bin, dass für die Antwort auf die ursprüngliche Frage mysmallidea die beste ist.)
cesoid

6

Sie können die 'Aligator-Syntax' von HAML verwenden

Leerzeichen entfernen:> und <

und <geben Ihnen mehr Kontrolle über das Leerzeichen in der Nähe eines Tags. > entfernt alle Leerzeichen, die ein Tag umgeben, während <alle Leerzeichen sofort innerhalb eines Tags entfernt. Sie können sich diese als Alligatoren vorstellen, die das Leerzeichen essen:> Gesichter aus dem Tag heraus und frisst das Leerzeichen außen und <Gesichter in das Tag und frisst das Leerzeichen innen. Sie werden am Ende einer Tag-Definition nach Klassen-, ID- und Attributdeklarationen, jedoch vor / oder = platziert.

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


5

Ein Ansatz, den ich für diese Art von Dingen gewählt habe, ist die Verwendung der Zeichenfolgeninterpolation:

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

Ich mag das Aussehen der Literalzeichenfolge in der Interpolation nicht, aber ich habe es zuvor mit zuvor deklarierten Zeichenfolgen oder dynamisch generierten Zeichenfolgen verwendet.


Mhm. Das ist meine allgemeine Herangehensweise an solche Dinge, aber ich hatte nie daran gedacht, die Bedingung dort zu verwenden. Es ist eine Schande, dass die Vorlage, die ich verwendet habe, etwas komplexer war als nur eine zweite Hälfte eines Satzes ... aber das ist definitiv eine Erinnerung wert - danke!
Matchu

5

Sie können dies tun, um den führenden Platz zu behalten:

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

Das Leerzeichen steht in Anführungszeichen.


3

Obwohl dies nicht gut dokumentiert ist, wird dies mithilfe der HAML-Leerzeichenerhaltung (>) in Kombination mit einem ASCII-Leerzeichen (& # 32;) und nicht mithilfe von Helfern sauber erreicht:

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

Dies wird produzieren, was Sie wollen:

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

Aber ich stimme zu, HAML muss einen besseren Weg finden, um dies zu tun, da es der Seite unnötige ASCII-Zeichen hinzufügt (aber es ist immer noch effizienter als die Verwendung von Helfern).


1

Es gibt die spitze Klammer "Whitespace Munching" -Syntax, andernfalls schreiben Sie eine Hilfsmethode dafür.


Wie genau würde ein Helfer dafür arbeiten? Meh, ich werde sehen, was ich mir einfallen lassen kann ...
Matchu

Was das Leerzeichen-Munching betrifft, kann ich nicht herausfinden, wie diese Syntax funktioniert, wenn sie nicht in einer Tag-Definition enthalten ist. Mache ich es einfach falsch oder funktioniert diese Syntax ohne Tag nicht?
Matchu

1

Ich bin auf ein ähnliches Problem gestoßen und habe es gefunden. Deshalb dachte ich, ich würde eine andere Lösung veröffentlichen, für die keine Hilfsmethode erforderlich ist. Verwenden Sie die Ruby-Interpolation # {}, um den Link und die if-Anweisungen zu verpacken:

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}

Dies funktioniert in 3.0.18, möglicherweise auch in früheren Versionen.


Zugegeben, Haml ist nicht für Inhalte konzipiert. Dies ist jedoch kein Inhalt, über den wir dort sprechen. Es ist eine Vorlage. Der Autor dieses Blogposts bezieht sich auf Dinge wie das Schreiben einer vollständigen statischen Webseite in Haml, was ich nicht tue. Das von mir bereitgestellte Code-Snippet ist so ziemlich die vollständige .hamlDatei - die Tatsache, dass es einen Link und ein Komma enthält, zeigt in keiner Weise etwas an.
Matchu

1
Ah ich sehe. Ich habe meine Antwort bearbeitet und die Lösung für sich allein gelassen.
Kekse

Obwohl dies funktionieren mag, denke ich, dass es schwierig ist, Markups zu lesen. Verwenden Sie stattdessen einfach die HAML-Whitespace-Modifikatoren <und>, wie andere bereits erwähnt haben, um Ihre HAML sauber und lesbar zu halten.
ToddH

1

Noch eine Option, die ich in der Vergangenheit verwendet habe:

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

0

Sie könnten auch immer tun:

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

0

Die Lösung, die ich zum Arbeiten gebracht habe, ist:

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

Sie können verwenden =, =wird verwendet, um das Ergebnis des Rails-Codes auszugeben, aber hier wird der Zweck Server.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.