2012-03-22 14 views
9

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://pastebin.com/LRfMVN5Y

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) 

risposta

-4

C'è un motivo specifico che si sta utilizzando Jekyll? Sembra che tu voglia qualcosa di più dinamico, mentre Jekyll è progettato per generare file HTML flat.

Potresti essere più felice utilizzando qualcosa come Sinatra, in cui puoi fare qualcosa di molto semplice per prendere l'elenco dei file e scorrere su di essi in un modello.

+1

sto indovinando tutti i voti verso il basso sono, perché questo è un commento e non una risposta alla domanda. – jbranchaud

0

C'è una richiesta di pull sul ramo principale Github per questa caratteristica che aspetta di essere unita a Jekyll 1.0.0beta; stanno solo aspettando l'approvazione finale del creatore TPW.

È possibile visualizzare il codice e copiarlo per uso personale e tenere d'occhio quando viene unito. Quindi è possibile scaricare la fusione Jekyll con quella caratteristica e utilizzarlo senza un plugin, facendo:

gem install jekyll --pre

che vi porterà la versione bordo da Github.

Ecco il PR - Nuova etichetta liquido per l'elenco dei file: directory:

https://github.com/mojombo/jekyll/pull/585

Problemi correlati