【问题标题】:Jekyll - Map multiple URLs to same Jekyll fileJekyll - 将多个 URL 映射到同一个 Jekyll 文件
【发布时间】:2012-04-02 18:38:22
【问题描述】:

我有一个 Jekyll 的自定义页面:我有一个 news.markdown 文件,如下所示:

{% assign posts_per_page = 5 %}
{% for post in site.categories.ro offset:pagination_skip limit:posts_per_page %}
    ...
    {{ post.content }}
    ...
{% endfor %}
{% include nav.html %}

nav.html_includes 目录中的位置,如下所示:

{% if pagination_skip %}
  {% capture pagination_skip %}
    {{pagination_skip | plus: posts_per_page}}
  {% endcapture %}
{% else %}
  {% assign pagination_skip = posts_per_page %}
{% endif %}

<div class="next">
  <a rel="prev" href="{{site.basepath}}ro/news/{{ pagination_skip }}">Next</a>
</div>

我想要的是将 url .../ro/news/5 映射到 news.markdown 的内容,这样 pagination_skip 就有 5。 10、15 也一样。此外,.../ro/news/0 应尽可能与.../ro/news/ 相同。

我可以这样做吗?怎么样?

我想使用尽可能少的扩展。

【问题讨论】:

    标签: jekyll


    【解决方案1】:

    你试图做错事。您希望动态处理 URL 参数。 Jekyll 是一个静态网络生成器。所以你需要生成所有将被访问的页面。您可以为此使用生成器。请查看页面https://github.com/mojombo/jekyll/wiki/Plugins

    上的生成器部分

    我为您想要做的事情开发了一个生成器,它工作得非常好,我还创建了“上一个”和“下一个”按钮。请看一下并尝试一下。它适用于所有类别(不仅是 ro 类别),但您可以根据需要对其进行自定义。

    文件夹结构

     | -- _plugins
        ` news.rb
     | -- _layouts
        ` news.html
     | -- _includes
        ` nav.html
     | -- _config.yml
     | -- ro
        ` -- _posts
          | -- 2012-04-10-test.textile
          | -- 2012-04-10-test2.textile
          | -- 2012-04-10-test4.textile
          | -- 2012-04-10-test6.textile
          | -- 2012-04-10-test15.textile
          | -- 2012-04-10-test3.textile
          ` -- 2012-04-10-test5.textile
      ` _site
    

    生成器news.rbruby 代码

    module Jekyll
    
      class NewsPage < Page
        def initialize(site, base, dir, category, posts_number, posts_per_page, pagination_skip)
          @site = site
          @base = base
          @dir = dir
          @name = "news_#{pagination_skip}.html"
    
          self.process(@name)
          self.read_yaml(File.join(base, '_layouts'), 'news.html')
          self.data['category'] = category
          self.data['posts_per_page'] = posts_per_page
          self.data['pagination_skip'] = pagination_skip
          if pagination_skip != 0
            self.data['prev_pagination_skip'] = pagination_skip - posts_per_page
          end
          if pagination_skip + posts_per_page < posts_number
            self.data['next_pagination_skip'] = pagination_skip + posts_per_page
          end
        end
      end
    
      class NewsGenerator < Generator
      safe true
        def generate(site)
          if site.layouts.key? 'news'
            dir = site.config['category_dir'] || 'categories'
            site.categories.keys.each do |category|
              posts_number = site.categories[category].length
              pagination_skip = 0;
              posts_per_page = 5;
              begin
                write_news_page(site, File.join(dir, category), category, posts_number, posts_per_page, pagination_skip)
                pagination_skip += posts_per_page;
              end while pagination_skip < posts_number
            end
          end
        end
    
        def write_news_page(site, dir, category, posts_number, posts_per_page, pagination_skip)
          index = NewsPage.new(site, site.source, dir, category, posts_number, posts_per_page, pagination_skip)
          index.render(site.layouts, site.site_payload)
          index.write(site.dest)
          site.pages << index
        end
      end
    end
    

    news.html 文件的布局

    ---
    ---
    
    {% for post in site.categories[page.category] offset:page.pagination_skip limit:page.posts_per_page %}
      {{ post.content }}
    {% endfor %}
    {% include nav.html %}
    

    包含导航nav.html

    <div class="nav">
      {% if page.prev_pagination_skip %}
        <a rel="prev" href="{{site.basepath}}categories/{{page.category}}/news_{{page.prev_pagination_skip}}.html">Prev</a>
      {% endif %}
      {% if page.next_pagination_skip %}
        <a rel="next" href="{{site.basepath}}categories/{{page.category}}/news_{{page.next_pagination_skip}}.html">Prev</a>
      {% endif %}
    </div>
    

    试一试,如果你喜欢,请告诉我。

    【讨论】:

    • 顺便说一句,nav.html没有理由在_includes文件夹中,你可以直接写在news.html中,但我保留了你的结构。
    • 你的意思是:'它不起作用',这是一个编译问题?或者它不能满足你的需要。
    • 它显示空白页面而不是帖子。不过我想我有一个解决方案。
    • 大家好,我用我的本地工作创建了一个存档sp4ce.net/data/pagination_skip.tar。你可以试试看,它不会创建空页面。
    • 是的,这是我的问题。谢谢
    猜你喜欢
    • 2014-08-15
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2010-11-13
    相关资源
    最近更新 更多