-
-
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) |
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.
i have come across the same problem. seems like
Liquid::Block
does not provide therender_all
method anymore. Even the regularLiquid::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.