2013-05-26 3 views
6

Ich benutze Jekyll auf GitHub Pages, um ein Blog zu erstellen und möchte die Länge der page.title Zeichenfolge an die Liquid-Vorlage in der YAML-Front-Angelegenheit in jedem Beitrag übergeben. Ich war nicht in der Lage, einen einfachen Weg zu finden, dies zu tun. Mit Blick auf die Liquid For Designers Guide konnte ich sehen, dass es zwei Arten von Markup unterstützt:Wie kann ich die Größe/Länge eines Strings in Jekylls Liquid Templates vergleichen?

  • Output Markup - Begrenzt durch doppelte geschweifte Klammern {{ }}, können Sie Ausgangsvariablen, die zu Ihrer Vorlage übergeben werden, entweder in der YAML Front Materie wie page.title in Jekyll, oder die globalen Site-Level-Variablen in _config.yml. Um den Titel des Posts oder der Seite auszugeben, würden Sie {{ page.title }} verwenden.

  • Tag Markup - Begrenzt durch geschweifte Klammern und Prozente {% %}, werden diese für die Logik in Ihren Vorlagen verwendet. Wenn Aussagen, Schleifen, diese Art von Dingen.

Anscheinend gibt es viele Filter, die Sie mit dem Output Markup und Sie ausgeben kann, die Länge einer Zeichenfolge übergeben an der Vorlage {{ page.title | size }} unter Verwendung verwenden können.

Allerdings, was ich in meiner Vorlage tun möchte, ist der Titel der Seite mit einem <h1>, <h2> oder <h3> Header abhängig von der Länge des Titels.

Ich kann sowieso nicht herausfinden, das Markup und die Ausgabe Markup zu mischen.

Ich kann die Größe von page.title auf die Seite mit {{ page.title | size }} ausgeben, ich kann jedoch nicht herausfinden, wie man die Länge in einer if-Anweisung verwendet. Dies liefert auch eine String-Repräsentation und keine Zahl.

Kennt jemand mit mehr Erfahrung mit Liquid, wie man das macht?

Idealerweise was würde Ich mag zu tun ist etwas entlang der Linien von dieser:

{% if page.title | size > 5 %} 

Antwort

10

Ich werde diese Lösung veröffentlichen, die ich auf jemandes Blog gefunden habe. Es ist der einzige Weg, den ich bisher gefunden habe, um so sicher die Länge einer übergebenen Saite zu erhalten und mit etwas anderem als einer geraden Gleichheit zu vergleichen. Um den Vergleich durchzuführen, müssen Sie Subtraktionen durchführen und die Differenz verwenden. Die Methode ist in dieser blog post written by Ben Dunlap umrissen. Es ist immer noch eine Art Workaround, aber es ist clever und es scheint, als würde es immer funktionieren. Könnte nicht so effizient sein, wenn Sie ein if, elsif, sonst mit mehreren Klauseln machen wollten, aber Sie könnten immer noch mehrere Unterschiede machen und es funktionieren lassen. Grundsätzlich würden Sie dies in meinem Fall tun:

{% capture difference %}{{ page.title | size | minus:20 }}{% endcapture %} 

{% unless difference contains '-' %}  // 20 characters or less 
    <h3>{{ page.title }}</h3>     // show smaller header 
{% else %}         // More than 20 characters 
    <h2>{{ page.title }}</h2>     // show larger header 
{% endunless %} 

Art klug, aber auch irgendwie ein Hack. Wenn jemand einen besseren Weg findet, lass es mich wissen.

+0

Es ist eine sehr hässliche Lösung, aber es funktioniert wie erwartet, so ist dies eine gute Antwort. –

6

Sie wollen zuerst den Wert in einer Variablen erfassen:

{% capture title_size %}{{ page.title | size }}{% endcapture %} 

{% if title_size > 5 %} 
    // do your stuff here... 
{% endif %} 

capture in der zugehörigen wird ganz unten auf dieser Seite: https://github.com/shopify/liquid/wiki/liquid-for-designers

+4

Ich gebe zu, dass ich das Capture-Tag übersehen habe. Das sieht ungefähr so ​​aus, wie ich es will. Dies ist jedoch immer noch nicht funktioniert, weil die 'size' Filter einen String zurückgibt und es wirft und Fehler und wird nicht bauen, wenn sie gegen eine Reihe verglichen. –

+0

@CoryGross 'size' gibt keinen String, sondern'erfassen' es einen String macht ... ;-) –

2

Obwohl es keine offensichtliche Möglichkeit gibt, eine Zeichenfolge in eine Ganzzahl in einer Liquid-Vorlage umzuwandeln, können Sie dies umgekehrt tun (dh eine ganze Zahl in eine Zeichenfolge umsetzen), indem Sie das {% capture %}-Tag verwenden, das nur die Ganzzahlvariable ausgibt . Der Grund dafür ist, dass die Aufnahme immer eine Filterung zurückgibt.

Vor diesem Hintergrund können Sie Jekyll tatsächlich Trick einen Vergleich zwischen einer ganzen Zahl und einem String zu tun, zumindest wenn man einen einfachen Gleichheitstest machen will.

, Dies nicht das Problem dieser Frage lösen, aber hier auf der Suche für jedermann nützlich genug ist, so dass ich werde es trotzdem posten. In diesem Beispiel möchten wir die Länge eines Seitentitels mit der Größe eines Arrays vergleichen. Fragen Sie nicht, warum :)

{% capture title_size %}{{ page.title | size }}{% endcapture %} 

{% if title_size == some_array.size %} 
    This will never be reached, because some_array.size is an integer and title_size a string 
{% endif %} 

{% capture some_array_size_str %}{{ some_array.size }}{% endcapture %} 

{% if title_size == some_array_size_str %} 
    But this will! 
{% endif %} 
3

Als Randbemerkung, Länge comparaison auch funktioniert:

{% if site.posts.length > 0 %} 
    blablabla... 
{% endif %} 
15

Ich habe in dieser Suche nach Links in meinem Fußzeilen mit der Flüssigkeit Syntax zu tun und es ist tot einfach.

{% assign thesize = variable.size %} 
{% if thesize > 5 %} 
    Do stuff here. 
{% endif %} 

Funktioniert für das, was ich mindestens tue, dachte nur, dass ich es dort rauswerfen würde. Ich hatte Probleme mit Erfassung aufgrund der Tatsache, dass es automatisch als String gespeichert ist.

Dann wieder

{% if variable.size > 5 %} 
     Do stuff here. 
{% endif %} 

sollte ebenso gut funktionieren.

Verwandte Themen