2013-05-26 3 views
6

私はブログを構築するためにGitHub PagesでJekyllを使用しており、page.title文字列の長さを各投稿のYAMLフロントマターでLiquid Templateに渡したいと思っています。私はこれを行う簡単な方法を理解することができませんでした。二重の中括弧{{ }}で区切り、することができますあなたのテンプレートに渡される出力変数のいずれかで -JekyllのLiquidテンプレートで文字列のサイズと長さを比較するにはどうすればよいですか?

  • 出力マークアップLiquid For Designers Guideを見て、私はそれがマークアップの2種類をサポートしていることを見ることができましたJekyllのpage.titleなどのYAMLフロント・マテリアル、または_config.ymlのグローバル・サイト・レベル変数。投稿またはページのタイトルを出力するには、{{ page.title }}を使用します。

  • タグマークアップ - 中括弧とパーセントで区切って、{% %}で、これはテンプレートのロジックに使用されます。 if文、ループ、その種類のもの。

はどうやらそこにあなたが出力マークアップで使用できるフィルタがたくさんあり、あなたの出力{{ page.title | size }}を使用して、テンプレートに渡された文字列の長さをすることができます。

私のテンプレートでは、タイトルの長さによって、<h1><h2>、または<h3>ヘッダーのいずれかを使用してページのタイトルをレンダリングします。

とにかくタグマークアップと出力マークアップを混在させることはできません。

page.titleのサイズを{{ page.title | size }}というページに出力することはできますが、if文で長さを使用する方法はわかりません。これは数値ではなく文字列表現も返します。

Liquidの経験が豊富な方は、これを行う方法を知っていますか?

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

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

captureがで詳述されている:あなたが最初の変数の値をキャプチャしたい

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

答えて

10

私は誰かのブログで見つけたこの解決策を投稿します。それは私がこれまでに見つけた唯一の方法であり、渡された文字列の長さを安全に取得し、まっすぐ平等以外のものを使って比較します。比較を行うには、減算を行い、その差を使用する必要があります。この方法は、blog post written by Ben Dunlapに概説されている。それはまだ解決策のようなものですが、それは賢明で、いつもうまくいくようです。 if、elsif、else節が複数ある場合は効率的ではないかもしれませんが、複数の相違点をとりあげて動作させることは可能です。基本的に私の場合はこれを行うでしょう:

{% 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 %} 

種類は巧妙ですが、ハックの種類もあります。もし誰かがもっと良い方法を思いついたら私に知らせてください。

+0

これは非常に醜い解決策ですが、期待通りに機能するので、これは良い答えです。 –

6

理想的には、私がやりたいことは、この線に沿って何かでありますこのページの最下部: https://github.com/shopify/liquid/wiki/liquid-for-designers

+4

私は 'capture'タグを見落としたことを認めます。それは私が欲しいもののように見える。しかし、これは 'size'フィルタが文字列を返し、それが投げられてエラーになり、数値と比較してビルドされないので、まだ動作しません。 –

+0

@CoryGross 'size'は文字列を返しませんが、' capture'はそれを文字列にします;;-) –

2

Liquidテンプレートで文字列を整数にキャストする明白な方法はありませんが、整数変数を出力するだけの{% capture %}タグを使用することで、逆の方法(つまり、整数を文字列にキャスト)できます。これは、キャプチャが常にsteringを返すためです。

これを念頭に置いて、少なくとも単純な等価性テストを実行する場合は、Jekyllをトリックして整数と文字列を比較することができます。

これはこの問題の問題を解決するものではありませんが、ここを見ている人にとっては十分に役立ちますので、とにかく投稿します。この例では、ページタイトルの長さを配列のサイズと比較したいと考えています。側の注意点として、なぜ:)

{% 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

に聞かないでください、長さcomparaisonも動作します:私は液体の構文を使用して、私のフッター内のリンクをしているため、このに見てきたし、それはだ

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

死んだ単純な。私は、少なくともやっている何のため

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

作品は、ちょうど私がそこにそれを投げるだろうと思っていました。キャプチャを使用する際には、自動的に文字列として格納されるという問題がありました。

その後、再び、

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

も同様に均等に動作するはずです。

関連する問題