-
-
Save jgatjens/8925165 to your computer and use it in GitHub Desktop.
| #usage: | |
| #{% loop_directory directory:images iterator:image filter:*.jpg sort:descending %} | |
| # <img src="{{ image }}" /> | |
| #{% endloop_directory %} | |
| module Jekyll | |
| class LoopDirectoryTag < Liquid::Block | |
| include Liquid::StandardFilters | |
| Syntax = /(#{Liquid::QuotedFragment}+)?/ | |
| def initialize(tag_name, markup, tokens) | |
| @attributes = {} | |
| @attributes['directory'] = ''; | |
| @attributes['iterator'] = 'item'; | |
| @attributes['filter'] = 'item'; | |
| @attributes['sort'] = 'ascending'; | |
| # Parse parameters | |
| if markup =~ Syntax | |
| markup.scan(Liquid::TagAttributes) do |key, value| | |
| @attributes[key] = value | |
| end | |
| else | |
| raise SyntaxError.new("Bad options given to 'loop_directory' plugin.") | |
| end | |
| #if @attributes['directory'].nil? | |
| # raise SyntaxError.new("You did not specify a directory for loop_directory.") | |
| #end | |
| super | |
| end | |
| def render(context) | |
| context.registers[:loop_directory] ||= Hash.new(0) | |
| images = Dir.glob(File.join(@attributes['directory'], @attributes['filter'])) | |
| if @attributes['sort'].casecmp( "descending" ) == 0 | |
| # Find files and sort them reverse-lexically. This means | |
| # that files whose names begin with YYYYMMDD are sorted newest first. | |
| images.sort! {|x,y| y <=> x } | |
| else | |
| # sort normally in ascending order | |
| images.sort! | |
| end | |
| result = [] | |
| context.stack do | |
| # remove filename extension | |
| images.each { |pathname| | |
| context[@attributes['iterator']] = File.basename(pathname, @attributes['filter'].sub('*', '')) | |
| result << render_all(@nodelist, context) | |
| } | |
| # return pathname | |
| # images.each_with_index do |item, index| | |
| # context[@attributes['iterator']] = item | |
| # result << render_all(@nodelist, context) | |
| # end | |
| end | |
| result | |
| end | |
| end | |
| end | |
| Liquid::Template.register_tag('loop_directory', Jekyll::LoopDirectoryTag) |
i have come across the same problem. seems like Liquid::Block does not provide the render_all method anymore. Even the regular Liquid::Block::render() method is marked "For backwards compatibility". Likewise, the whole API for liquid blocks has changed.
I will have a more in-depth look into the problem, but never having wrote a liquid/jekyll module myself, it will not be very successful, i fear.
For a simpler version that works well with the built-in for block and works with current versions of liquid, see https://gitlab.com/baldrian/klimacamp-augsburg/-/blob/91244ae327380714e6d62778598a4bc69917c557/_plugins/list_files.rb. It creates a Page object for each of the files that were found, so if you don't want that, remove the .map do ... end part (you can also remove the site = ... and source = ... lines as well as the comment in that case) – without the map call, you'll get a list of filenames instead of a list of pages. See https://gitlab.com/baldrian/klimacamp-augsburg/-/blob/91244ae327380714e6d62778598a4bc69917c557/feeds/pressemitteilungen.xml#L14-15 for an example usage.
I can't seem to get it work.
my directory for the image folder is /images under root directory.
The frontmatter in the post, I have "photos: /images"
and in my layout html, I have:
{% loop_directory directory: {{ page.photos }} iterator:image filter:*.jpg sort:descending %}
<img src="{{ image }}" />
{% endloop_directory %}
but nothing's showing. What did I do wrong?
@meiadvanture this is like 8 years old or more, try this tho:
{% loop_directory directory:images iterator:image filter:*.jpg sort:descending %}
<img src="{{ image }}" />
{% endloop_directory %}
Not sure about your {{ page.photos }} try it without that first and see.
@jgatjens
https://www.filehosting.org/file/details/830468/website.zip