Non riesco a capire come creare un filtro o un tag in un plugin jekyll, in modo che possa restituire una directory e scorrere il suo contenuto. Ho trovato questi:Restituisce l'elenco dei file nella directory dal plugin di Jekyll?
http://snippets.dzone.com/posts/show/302
Finora ho:
module Jekyll
class FilesTag < Liquid::Tag
def initialize(tag_name, text, tokens)
super
@text = text
end
def render(context)
#"#{@text} #{Time.now}"
Dir.glob("images/*").each { |i| "#{i}" }
#Dir.glob("images/*")
#Hash[*Dir.glob("images/*").collect { |v| [v, v*2] }.flatten]
end
end
end
Liquid::Template.register_tag('files', Jekyll::FilesTag)
posso tornare con successo l'elenco delle immagini come una stringa e stamparlo con:
{% files test_string %}
Ma per la vita di me, non posso loop ove r l'array, non importa come restituisco l'array/hash da Dir.glob. Voglio solo essere in grado di fare:
{% for image in files %}
image
{% endfor %}
ho intenzione di bisogno di essere in grado di restituire le matrici di cose costantemente per le varie collezioni sarò utilizzando sul sito. Ho solo bisogno di un plugin barebone su cui basarmi.
Grazie!
AGGIORNAMENTO: l'ho parzialmente risolto. Questo metodo funziona ma richiede l'utilizzo di endloop_directory anziché endfor, che mi sembra un po 'brutto. Inoltre, il filtro non è in grado di prendere un parametro come *. {Jpg, png} perché non c'è modo di sfuggire a {} nell'html. Aperto a suggerimenti su come passare una stringa regex in un attributo ...
#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
length = images.length
result = []
context.stack do
images.each_with_index do |item, index|
context[@attributes['iterator']] = item
context['forloop'] =
{
'name' => @attributes['iterator'],
'length' => length,
'index' => index + 1,
'index0' => index,
'rindex' => length - index,
'rindex0' => length - index - 1,
'first' => (index == 0),
'last' => (index == length - 1)
}
result << render_all(@nodelist, context)
end
end
result
end
end
end
Liquid::Template.register_tag('loop_directory', Jekyll::LoopDirectoryTag)
sto indovinando tutti i voti verso il basso sono, perché questo è un commento e non una risposta alla domanda. – jbranchaud