Вернуть список файлов в каталоге из плагина Jekyll? - PullRequest
9 голосов
/ 22 марта 2012

Я не могу понять, как создать фильтр или тег в плагине jekyll, чтобы я мог вернуть каталог и просмотреть его содержимое.Я нашел это:

http://pastebin.com/LRfMVN5Y

http://snippets.dzone.com/posts/show/302

Пока у меня есть:

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)

Я могу успешно вернуть список изображенийв виде строки и выведите его с помощью:

{% files test_string %}

Но я не могу зацикливаться на массиве, независимо от того, как я возвращаю массив / хэш из Dir.glob.Я просто хочу иметь возможность:

{% for image in files %}
    image
{% endfor %}

Мне нужно будет иметь возможность постоянно возвращать массивы вещей для различных коллекций, которые я буду использовать на сайте.Мне просто нужен плагин barebones для построения.

Спасибо!


ОБНОВЛЕНИЕ: Я частично решил это.Этот метод работает, но требует использования endloop_directory вместо endfor, что мне немного некрасиво.Кроме того, фильтр не может принимать такой параметр, как *. {Jpg, png}, потому что в html нельзя экранировать {}.Откройте для предложений о том, как передать строку регулярного выражения в атрибуте ...

#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)

Ответы [ 3 ]

1 голос
/ 04 июля 2016

Я нашел здесь плагин: Как вывести список файлов в каталоге с Liquid? , который может помочь:

Jekyll :: DirectoryTag Этот тег позволяетвы перебираете файлы по определенному пути.Тег каталога дает объект файла и объект forloop.Если файлы соответствуют стандартному формату Jekyll, YYYY-MM-DD-file-title, эти атрибуты будут заполнены для этого файлового объекта.

https://github.com/sillylogger/jekyll-directory

0 голосов
/ 10 апреля 2013

В ветке Github есть запрос на извлечение этой функции, которая ожидает слияния с бета-версией Jekyll 1.0.0; они просто ждут окончательного одобрения создателя TPW.

Теперь вы можете просматривать код и копировать его для собственного использования, а также следить за тем, когда происходит слияние. Затем вы можете скачать объединенный Jekyll с этой функцией и использовать его без плагина, выполнив:

gem install jekyll --pre

Какая версия Github даст вам лучшую версию.

Вот PR - новая метка Liquid для распечатки файлов: directory:

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

0 голосов
/ 16 августа 2012

Есть ли конкретная причина, по которой вы используете Jekyll?Кажется, вы хотите что-то более динамичное, в то время как Jekyll предназначен для генерации плоских HTML-файлов.

Возможно, вам будет удобнее использовать что-то вроде Sinatra, где вы можете сделать что-то очень простое, чтобы получить список файлов и перебрать их в шаблоне.

...