How to show only specific post in Jekyll? - ruby

I'm trying to use Jekyll for creating a simple single page web site. This website will further be used for creating posts like content blocks.
But in my Jekyll site I want only show certain posts and not all of those available.
How to can I get a certain specific post, without using for and if for filtering the posts? Is this possible?
Edit 1:
In order for me get any specific post, I am using following way:
{% for post in site.posts %}
{% if post.title = "my title" %}
<h3> {% post.title %} </h3>
blablabla
{% endif %}
{% endfor %}
So, has anyone found an easy way to display the specific post with "my title", without using for?

Any post with published: false in his front mater will not appear in a {% for post in site.posts %} loop.
But I don't understand your idea to get rid of for and if

Just put published: false in your YAML front matter and run the loop without if statement in your code. Posts with published: false won't be displayed.

Related

Is there "no-parse" block for Liquid?

I'm attempting to write documentation for how to use a custom Liquid tag, yet I cannot figure out how to display the examples, since Liquid keeps wanting to render those tags (even if I put the example code inside code blocks).
The following tag gets executed, instead of treating it as code:
```
{% flink http://www.youtube.com/watch?v=Bt9zSfinwFA "Vertical Video Syndrome - A PSA" %}
```
BB has a [noparse] tag; is there any equivalent way of saying "Do not parse any tags between these two lines" in Liquid?
What you're looking for is the raw tag:
```
{% raw %}
{% flink http://www.youtube.com/watch?v=Bt9zSfinwFA "Vertical Video Syndrome - A PSA" %}
{% endraw %}
```
The documentation for Octopress does something clever in this case.
Whenever they want to display something without rendering it, they wrap it in {{ "<content>" }}, which tells Liquid "Treat the <content> area as a string, and just print it out as-is (which means it gets passed over by the parser searching for tags).
You could wrap the entire line in one of those, but it's enough just to wrap the "begin tag" character {%, like this:
```
{{ "{%" }} flink http://www.youtube.com/watch?v=Bt9zSfinwFA "Vertical Video Syndrome - A PSA" %}
```
The the closing of the tag, %}, doesn't actually need to be escaped, since the parser will ignore any closing tags unless there is an open tag that still "needs a partner".

Is there a way to access rendered content in Jekyll?

In Jekyll, is there any way to access the rendered content of a post from another page?
Here's the scenario: Suppose I wanted to create a blog index page listing a bunch of posts. Each post uses a different layout (text, photo, tweet, etc). Is there a way to get Jekyll to render each post with the layout specified inside of that post and then hand me the rendered content so that I can put it into a summary page?
(I'm 97% sure I saw this exact question asked and answered somewhere here on Stack Overflow, but I cannot for the life of me find it. If anyone could point me to it, I would be most grateful! Of course, original solutions are also appreciated!)
(Edited to make it clear that I want dynamic access to rendered content. Not after the fact in the _sites directory, but while building the site.)
post.layoutis the layout of one post, it's default is post
So, i think, you can do this
{% for post in site.posts %}
{% if post.layout == 'layout1' %}
do something, such as put it into an array ...
{% else if post.layout == 'layout2' %} // here 'else if' may not correct liquid syntax
do something else
{% endif %}
{% endfor %}

Jekyll loops for posts and other section

I use Jekyll for more than 3 month now. I have made several blogs with it, but I have one question I couldn't find the answer anywhere.
In order to render all your posts , all the markdown files in the _posts, I use a for loop like this one for instance :
{% for post in site.posts %}
{{post.title}}
{% endfor %}
I want to do the same with my projects. I created a _projects folder and tried to render them by using :
{% for project in site.projects %}
{{project.title}}
{% endfor %}
But Jekyll doesn't seem to recognize the _projects folder. What should I do to get the same results ?
This is not the way custom post types work in Jekyll. You can however put a _posts directory in another directory and build custom categories this way.
Suppose you would have your projects organized under projects/_posts, then your template would have to look something like this:
{% for post in site.categories.projects %}
{{ post.title }}
{% endfor %}
Found it in Jekyll's Github Issues
Now we have Jekyll Collections
"Add the following to your site’s _config.yml file, replacing
my_collection with the name of your collection."
For example you should add:
collections:
- projects
Then of course, you could use it in your template in the most easy way:
{% for project in site.projects %}
{{project.title}}
{% endfor %}

Jekyll templates using django-like liquid blocks / inheritance

I'm getting into Jekyll in a big way and would like to use it as a general front-end development platform, but am running up against the limitations of the Liquid templating language, specifically its difference to Django templating.
I discovered the liquid-inheritance gem, which adds the all-important Extends and Block syntax from Django. This blog post extends the gem further to suit Jekyll's file system:
http://www.sameratiani.com/2011/10/22/get-jekyll-working-with-liquid-inheritance.html
The problem is that it doesn't appear to implement blocks in exactly the same way Django does, which essentially renders the gem useless.
I have two jekyll "layouts" called - for the sake of understanding - parent.html and child.html. Neither of these contain YAML sections.
Parent
<html>
{% block foo %} {% endblock %}
</html>
Child
{% extends _layouts/parent.html %}
{% block foo %}
<div>
Bar comes next:
{% block bar %} {% endblock %}
</div>
{% endblock %}
And then I have a jekyll page which includes a YAML section thus:
---
title: test
---
{% extends _layouts/child.html %}
{% block bar %}My title is {{ page.title }} {% endblock %}
What I'd expect:
<html>
<div>
Bar comes next:
My title is test
</div>
</html>
What I get:
<html>
<div>
Bar comes next:
</div>
</html>My title is test
It seems something is failing to treat the blocks in mypage.html as being eligible for insertion into the suitable places of parent/child, although it's clearly still doing something.
I'm not a ruby developer and am reasonably new to Jekyll, so I need help identifying what part of this stack is failing. The liquid-inheritance issues on github suggest others are experiencing this block nesting problem: https://github.com/danwrong/liquid-inheritance/issues/3
I've tried several of the forks of liquid-inheritance, many of which apparently fix that problem regex, but none seem to solve this.
Is what i'm tring to do fundamentally impossible? It seems like I'm at least 85% of the way there and the final bit needs fixing.
I'm not sure this is ever going to work within Jekyll. I might be wrong, but here's my reasoning:
Each page is rendered out using do_layout in https://github.com/mojombo/jekyll/blob/master/lib/jekyll/convertible.rb
This works recursively - it processes the content of the page, then processes the page's layout, then that layout's layout and so on and so forth, passing the YAML variables up the chain (so they're always available in parent templates as {{ page.whatever}}).
This means that the only things which get passed up are the YAML values, and whatever the value of 'content' is after it has been processed by Liquid. I don't know how it is done elsewhere, but that seems incompatible with the idea of blocks, as they'd require you to pass up the two blocks separately.
Fundamentally, it seems to me that the issue is that Jekyll already has a simple form of inheritance - via the "layout" attribute that you can give to a layout. Fundamentally, I think that this is compatible with liquid-templating.
All that said, I'm not sure that you've exhausted the limits of using YAML, _includes, and template logic. If you're at the point of putting Django style blocks into your content, why not just do something like this:
Content:
---
title: some title
secondary_content: |
Here is some *secondary* content that will be [markdownified](http://example.com).
It can run to multiple lines and include
* Lists
* Good things
* Etc
---
And here is the main content, as per usual
Template:
<html>
<article>
<h1>{{ page.title }}</h1>
{{ content }}
</article>
<aside>
{{ page.secondary_content | markdownify}}
</aside>
If you wanted to keep your templates clean, and have different content for different types of pages, you could use various includes:
Template:
<aside>
{% include sidebar_negotiation.html %}
</aside>
_includes/sidebar_negotiation.html:
{% if page.type = 'foo' %}
{% include sidebar_foo.html %}
{% else if page.type = 'bar' %}
{% include sidebar_bar.html %}
{% endif %}
And then put your page type specific stuff in those files. Obviously you could include it directly, but it is probably nice to abstract it out. Those includes will get all of the variables in the YAML.
If none of this is a win, you could always try Hyde: http://hyde.github.com/ which is written in Python, uses Jinja2 (basically Django templates++), and does the same sort of thing.

Display all images from a directory on a Jekyll powered website

It doesn't necessarily have to be something Jekyll uses.
Basically I'm creating a gallery that will use lightbox. I want to load all the images from a directory (_site\images\gallery) for the lightbox to display and their thumbnails (to be determined and created).
What would be the best way to go about this? I already have lightbox set up and tested (no thumbnails).
Thanks in advance.
Jekyll doesn't have a way to "list the contents of a folder".
You can do a very approximate thing by using the yaml front though.
In the "gallery page", include a section with the file names of the images:
---
images:
- a.jpg
- b.jpg
- c.jpg
<other properties, like title, etc>
---
Then, when you want to list your images, produce the links with a loop. I'm not familiar with lighbox's syntax for images, but it will probably look like similar to this:
<ul class="something">
{% for image in page.images %}
<li class="something">
<a rel="something" class="something" href="/path/to/images/dir/{{ image }}" />
</li>
{% endfor %}
</ul>
(I have put "something" on every place when I'm not sure about something. It might be possible that you will have to remove some "somethings" completely. You will have to modify /path/to/images/dir/ to where your images are)
Once the html is changed to work with lightbox, the only thing you have to do to add a new image is: a) putting it in the images directory and b) Edit the gallery page, and introduce the new image name in the list.
It's not as convenient as having the list "automatically generated", but it's very close.
Listing the jpg files in the current directory in Jekyll can be done like this:
{% for file in site.static_files %}
{% assign pageurl = page.url | replace: 'index.html', '' %}
{% if file.path contains pageurl %}
{% if file.extname == '.jpg' or file.extname == '.jpeg' or file.extname == '.JPG' or file.extname == '.JPEG' %}
<img src="{{ file.path }}" />
{% endif %}
{% endif %}
{% endfor %}
More about this solution can be found here: http://jekyllrb.com/docs/static-files/. I have created a lightbox extension for Jekyll that is listed on my page Jekyll without plugins. Check it out!
Try https://github.com/simoarpe/azores-image-gallery
DISCLAIMER: I'm the author.
I've tried some of the projects already available on Github but most of them are discontinued or partially working and in the end, I decided to implement something on my own starting from the good bits found around.
The result is Azores Image Gallery.
For a more detailed explanation check the README file.
I love Jekyll plugins.
Try one of these: Jekyll Gallery, Jekyll Gallery Generator, or Folder Gallery.
Check out the Ruby file for each plugin and modify the image tag generated to include the class for lightbox. That should do the trick. Don't forget to include the lightbox css file in your default template page.

Resources