Using variables in conditional expressions in if-statements in Jekyll (with Liquid) - jekyll

I am trying to make a website using Jekyll as a local test for github-pages.
I wrote like the following within my _layouts/default.html, but it seemed that ‘{{ category.name }}’ in the if statement was not recognized as a variable. Can’t we use variables in condition in Jekyll?
{% for category in site.categories %}
{% if page.dir contains ‘{{ category.name }}’ %}
<a href="{{ category.url }}">
{{ category.name }}
</a>
{% endif %}
{% endfor %}
I referred to these manual:
collection
navigation & include

You do not need to put a variable inside double curly braces when evaluating a expression in tags. You simply need to do:
{% if page.dir contains category.name %}

Related

How to list all post categories in Jekyll?

I was thinking of using the following code snippet but it does not return anything...
{% for category in site.categories %}
<li><strong>{{ category.title }}</strong></li>
{% endfor %}
I'm also using Jekyll's original category page generator plugin, but I cannot figure out how to list all the post categories (for a blog page sidebar) that are being used?
Try this:
{% for category in site.categories %}
<li><strong>{{category|first}}</strong></li>
{% endfor %}
Not sure if something has changed, but something bad happened when I used Leon's answer (seemed like the loop never ended and I got an OOM). Here is what did work for me:
{% for category in site.categories %}
{% capture category_name %}{{ category | first }}{% endcapture %}
{{category_name}}
{% endfor %}
Source is the ever-helpful https://blog.webjeda.com/jekyll-categories/

Get page variable from post variable in Jekyll?

I'm iterating over all the posts in my site like so
{% for post in site.posts %}
// code
{% endfor %}
I want to access some variable that I have stored at the page level. How can access it? I wasn't able to find anything after googling for awhile. I want to do something like
{% for post in site.posts %}
post.page.special_var
{% endfor %}
Jekyll support both post and page, so it is depend on you, which type of variable you want to access.
For example here is your post front matter.
---
layout:post
title: jekyll test
categories: jekyll
---
So in head.html, I am using this.
<title>{% if page.title %}{{ page.title }}{% endif %}</title>
I am using page to access that variable because there are too many pages like about or contact or privacy policy that does not belongs to jekyll post,so there you can't use post for example post.title to access that variable.
Now, look out these codes
{% for post in site.categories.jekyll reversed limit:10 %}
<span><a href="{{ post.url }}">{{ post.title}}<a/></span>
{% endfor %}
Here you note that, I am using loop, because I want to access same variable from multiple post, and that variable was jekyll .
Here I am using post.title but you can even use page.title, because it is globally accessible.
For fun :
I am using reversed, so you can order your post in which date you are created, older post will show at first.
I am using limit:10 because, I want to show only 10 post per page.
If you have a special_var variable defined in a post front matter you can get it like this :
{% for post in site.posts %}
<p>This is my var {{ post.special_var }}.</p>
{% endfor %}
See Jekyll documentation here.

Jekyll: code is getting highligheted unwantingly

I've got the following page:
---
layout: default
status: publish
published: true
title: Categories
author:
display_name: lucas
---
{% for category in site.categories %}
<li><a name="{{ category | first }}">{{ category | first }}</a>
<ul>
{% for posts in category %}
{% for post in posts %}
<li>{{ post.title }}</li>
{% endfor %}
{% endfor %}
</ul>
</li>
{% endfor %}
Instead of listing the hrefs per categery, it somehow gets code highlighting:
Can anyone help me out preventing the code getting highlighted? Thanks!
As mentioned by #David Jacquel, .md files are automatically parsed as markdown, in which four space indentations are treated as preformatted code.
I followed his suggestion on my website: change all files to .html. This disabled Markdown parsing in the file. However, if you are unwilling to write in pure HTML and would still like to use Markdown, there is a workaround.
For each element that you would like Markdown to ignore, give it the attribute markdown="0".
For each element that you would like Markdown to parse, give it the attribute markdown="1".
In your case, the following is a possible implementation.
...
<div markdown="0">
{% for category in site.categories %}
<li><a name="{{ category | first }}">{{ category | first }}</a>
<ul>
{% for posts in category %}
{% for post in posts %}
<li>{{ post.title }}</li>
{% endfor %}
{% endfor %}
</ul>
</li>
{% endfor %}
</div>
Is it a .md file ? If yes, try to change for an .html extension.
In markdown four space indentation is used to print code tag.

How to show first post from category in Jekyll with Liquid

I can't find a solution. I have three categories: tuts, news, code.
The newest post is categorized in tuts. But I want to show the last and newest post in news. I tried the following, but obviously it doesn't show anything, because if I limit the loop to the first item, which is the tuts item, the loop stops.
{% for post in site.posts limit:1 %}
{% if post.categories contains 'news' %}
NEWS</strong> › {{ post.title }}
{% endif %}
{% endfor %}
How do I show the first posting from a special category? Can I loop directly through a chosen category like this? If yes, what is the correct syntax?
{% for post in site.posts.categories.news limit:1 %}
NEWS</strong> › {{ post.title }}
{% endfor %}
Yes, it's possible to directly loop all posts for a certain category or tag.
It's just:
{% for post in site.categories['news'] limit:1 %}
{{ post.title }}
{% endfor %}
It's the same for tags, you just have to replace site.categories['news'] by site.tags['news'].

Jekyll code in jekyll

I'm creating a bird's eye view tutorial for Jekyll, to be hosted on Github pages (on my blog that runs on Jekyll). So, I want to put some code there. If I put the following:
{% for post in site.posts %}
{% if post.categories contains '<categoryname>' %}
<h2>
{{ post.title }}
</h2>
{% endif %}
{% endfor %}
(all lines after tabspaces), it doesn't render as code, rather, it executes. How do I stop it from executing and render it as code?
The {%...%} syntax used by Jekyll is part of the Liquid templating engine. To escape these tags, and so show them literally, you should use the raw tag.
You will probably want to combine this with the markdown syntax for code blocks. With Redcarpet you can use the triple backtick syntax. It doesn’t matter if you put the backticks inside the raw tags or the other way round:
{%raw%}
```
{% for post in site.posts %}
{% if post.categories contains '<categoryname>' %}
<h2>
{{ post.title }}
</h2>
{% endif %}
{% endfor %}
```
{%endraw%}
Enclose your code in backticks:
(tested with redcarpet markdown engine)
```
{% for post in site.posts %}
{% if post.categories contains '<categoryname>' %}
<h2>
{{ post.title }}
</h2>
{% endif %}
{% endfor %}
```
There are at least three options exist, taht you can use to format code in Jekyll:
highlight - Jekyll has built in
{% highlight java %}
ValidationResult validationResult = NetLicensing.LicenseeService.validate(context, licenseeNumber);
{% endhighlight %}
example: https://raw.githubusercontent.com/Labs64/netlicensing.io/gh-pages/_drafts/2010-09-16-post-template.md (see Syntax highlighting section)
backtick - GitHub style
```java
ValidationResult validationResult = NetLicensing.LicenseeService.validate(context, licenseeNumber);
```
HTML pre/code - HTML can be included in markdown as well
<pre><code>
ValidationResult validationResult = NetLicensing.LicenseeService.validate(context, licenseeNumber);
<code/></pre>