UNPKG

jekyll

Version:

A blog-aware, static site generator in Ruby

423 lines (375 loc) 12.9 kB
--- layout: docs title: Templates permalink: /docs/templates/ --- Jekyll uses the [Liquid](https://github.com/Shopify/liquid/wiki) templating language to process templates. All of the standard Liquid [tags](https://github.com/Shopify/liquid/wiki/Liquid-for-Designers#tags) and [filters](https://github.com/Shopify/liquid/wiki/Liquid-for-Designers#standard-filters) are supported. Jekyll even adds a few handy filters and tags of its own to make common tasks easier. ## Filters <div class="mobile-side-scroller"> <table> <thead> <tr> <th>Description</th> <th><span class="filter">Filter</span> and <span class="output">Output</span></th> </tr> </thead> <tbody> <tr> <td> <p class="name"><strong>Date to XML Schema</strong></p> <p>Convert a Date into XML Schema (ISO 8601) format.</p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ site.time | date_to_xmlschema }}{% endraw %}</code> </p> <p> <code class="output">2008-11-07T13:07:54-08:00</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>Date to RFC-822 Format</strong></p> <p>Convert a Date into the RFC-822 format used for RSS feeds.</p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ site.time | date_to_rfc822 }}{% endraw %}</code> </p> <p> <code class="output">Mon, 07 Nov 2008 13:07:54 -0800</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>Date to String</strong></p> <p>Convert a date to short format.</p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ site.time | date_to_string }}{% endraw %}</code> </p> <p> <code class="output">07 Nov 2008</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>Date to Long String</strong></p> <p>Format a date to long format.</p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ site.time | date_to_long_string }}{% endraw %}</code> </p> <p> <code class="output">07 November 2008</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>Where</strong></p> <p>Select all the objects in an array where the key has the given value.</p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ site.members | where:"graduation_year","2014" }}{% endraw %}</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>Group By</strong></p> <p>Group an array's items by a given property.</p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ site.members | group_by:"graduation_year" }}{% endraw %}</code> </p> <p> <code class="output">[{"name"=>"2013", "items"=>[...]}, {"name"=>"2014", "items"=>[...]}]</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>XML Escape</strong></p> <p>Escape some text for use in XML.</p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ page.content | xml_escape }}{% endraw %}</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>CGI Escape</strong></p> <p> CGI escape a string for use in a URL. Replaces any special characters with appropriate %XX replacements. </p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ "foo,bar;baz?" | cgi_escape }}{% endraw %}</code> </p> <p> <code class="output">foo%2Cbar%3Bbaz%3F</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>URI Escape</strong></p> <p> URI escape a string. </p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ "foo, bar \baz?" | uri_escape }}{% endraw %}</code> </p> <p> <code class="output">foo,%20bar%20%5Cbaz?</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>Number of Words</strong></p> <p>Count the number of words in some text.</p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ page.content | number_of_words }}{% endraw %}</code> </p> <p> <code class="output">1337</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>Array to Sentence</strong></p> <p>Convert an array into a sentence. Useful for listing tags.</p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ page.tags | array_to_sentence_string }}{% endraw %}</code> </p> <p> <code class="output">foo, bar, and baz</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>Markdownify</strong></p> <p>Convert a Markdown-formatted string into HTML.</p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ page.excerpt | markdownify }}{% endraw %}</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>Converting Sass/SCSS</strong></p> <p>Convert a Sass- or SCSS-formatted string into CSS.</p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ some_scss | scssify }}{% endraw %}</code> <code class="filter">{% raw %}{{ some_sass | sassify }}{% endraw %}</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>Slugify</strong></p> <p>Convert a string into a lowercase URL "slug". See below for options.</p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ "The _config.yml file" | slugify }}{% endraw %}</code> </p> <p> <code class="output">the-config-yml-file</code> </p> <p> <code class="filter">{% raw %}{{ "The _config.yml file" | slugify: 'pretty' }}{% endraw %}</code> </p> <p> <code class="output">the-_config.yml-file</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>Data To JSON</strong></p> <p>Convert Hash or Array to JSON.</p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ site.data.projects | jsonify }}{% endraw %}</code> </p> </td> </tr> <tr> <td> <p class="name"><strong>Sort</strong></p> <p>Sort an array. Optional arguments for hashes: 1.&nbsp;property name 2.&nbsp;nils order (<em>first</em> or <em>last</em>).</p> </td> <td class="align-center"> <p> <code class="filter">{% raw %}{{ page.tags | sort }}{% endraw %}</code> </p> <p> <code class="filter">{% raw %}{{ site.posts | sort: 'author' }}{% endraw %}</code> </p> <p> <code class="filter">{% raw %}{{ site.pages | sort: 'title', 'last' }}{% endraw %}</code> </p> </td> </tr> </tbody> </table> </div> ### Options for the `slugify` filter The `slugify` filter accepts an option, each specifying what to filter. The default is `default`. The are as follows (with what they filter): - `none`: no characters - `raw`: spaces - `default`: spaces and non-alphanumeric characters - `pretty`: spaces and non-alphanumeric characters except for `._~!$&'()+,;=@` ## Tags ### Includes If you have small page fragments that you wish to include in multiple places on your site, you can use the `include` tag. {% highlight ruby %} {% raw %}{% include footer.html %}{% endraw %} {% endhighlight %} Jekyll expects all include files to be placed in an `_includes` directory at the root of your source directory. This will embed the contents of `<source>/_includes/footer.html` into the calling file. <div class="note"> <h5>ProTip™: Use variables as file name</h5> <p> The name of the file you wish to embed can be literal (as in the example above), or you can use a variable, using liquid-like variable syntax as in <code>{% raw %}{% include {{my_variable}} %}{% endraw %}</code>. </p> </div> You can also pass parameters to an include: {% highlight ruby %} {% raw %}{% include footer.html param="value" %}{% endraw %} {% endhighlight %} These parameters are available via Liquid in the include: {% highlight ruby %} {% raw %}{{ include.param }}{% endraw %} {% endhighlight %} #### Including files relative to another file You can also choose to include file fragments relative to the current file: {% highlight ruby %} {% raw %}{% include_relative somedir/footer.html %}{% endraw %} {% endhighlight %} You won't need to place your included content within the `_includes` directory. Instead, the inclusion is specifically relative to the file where the tag is being used. For example, if `_posts/2014-09-03-my-file.markdown` uses the `include_relative` tag, the included file must be within the `_posts` directory, or one of its subdirectories. You cannot include files in other locations. All the other capabilities of the `include` tag are available to the `include_relative` tag, such as using variables. ### Code snippet highlighting Jekyll has built in support for syntax highlighting of [over 100 languages](http://pygments.org/languages/) thanks to [Pygments](http://pygments.org/). To use Pygments, you must have Python installed on your system and set `highlighter` to `pygments` in your site's configuration file. Alternatively, you can use [Rouge](https://github.com/jayferd/rouge) to highlight your code snippets. It doesn't support as many languages as Pygments does but it should fit in most cases and it's written in pure Ruby ; you don't need Python on your system! To render a code block with syntax highlighting, surround your code as follows: {% highlight text %} {% raw %} {% highlight ruby %} def foo puts 'foo' end {% endhighlight %} {% endraw %} {% endhighlight %} The argument to the `highlight` tag (`ruby` in the example above) is the language identifier. To find the appropriate identifier to use for the language you want to highlight, look for the “short name” on the [Pygments' Lexers page](http://pygments.org/docs/lexers/) or the [Rouge wiki](https://github.com/jayferd/rouge/wiki/List-of-supported-languages-and-lexers). #### Line numbers There is a second argument to `highlight` called `linenos` that is optional. Including the `linenos` argument will force the highlighted code to include line numbers. For instance, the following code block would include line numbers next to each line: {% highlight text %} {% raw %} {% highlight ruby linenos %} def foo puts 'foo' end {% endhighlight %} {% endraw %} {% endhighlight %} #### Stylesheets for syntax highlighting In order for the highlighting to show up, you’ll need to include a highlighting stylesheet. For an example stylesheet you can look at [syntax.css](https://github.com/mojombo/tpw/tree/master/css/syntax.css). These are the same styles as used by GitHub and you are free to use them for your own site. If you use `linenos`, you might want to include an additional CSS class definition for the `.lineno` class in `syntax.css` to distinguish the line numbers from the highlighted code. ### Post URL If you would like to include a link to a post on your site, the `post_url` tag will generate the correct permalink URL for the post you specify. {% highlight text %} {% raw %} {% post_url 2010-07-21-name-of-post %} {% endraw %} {% endhighlight %} If you organize your posts in subdirectories, you need to include subdirectory path to the post: {% highlight text %} {% raw %} {% post_url /subdir/2010-07-21-name-of-post %} {% endraw %} {% endhighlight %} There is no need to include the file extension when using the `post_url` tag. You can also use this tag to create a link to a post in Markdown as follows: {% highlight text %} {% raw %} [Name of Link]({% post_url 2010-07-21-name-of-post %}) {% endraw %} {% endhighlight %} ### Gist Use the `gist` tag to easily embed a GitHub Gist onto your site. This works with public or secret gists: {% highlight text %} {% raw %} {% gist parkr/931c1c8d465a04042403 %} {% endraw %} {% endhighlight %} You may also optionally specify the filename in the gist to display: {% highlight text %} {% raw %} {% gist parkr/931c1c8d465a04042403 jekyll-private-gist.markdown %} {% endraw %} {% endhighlight %}