【问题标题】:How do I customize wintersmith paginator?如何自定义 Wintersmith 分页器?
【发布时间】:2014-04-18 21:54:14
【问题描述】:

我一直在与 Wintersmith 建立一个网站,并且大部分时间都很喜欢它,但我无法理解一些底层机制。我从添加 paginator.coffee 插件的“博客”框架开始。

这个问题需要一些细节,所以最重要的是,我要完成什么:

  1. 将在 /contents/article/ 或 /contents/articles//
  2. 中提取任何文件(markdown、html、json 元数据)
  3. 输出文件位于 /articles/YYYY/MM/DD/title-slug/
  4. /blog.html 列出所有文章,分页。
  5. /contents 下的文件(不在文章中)不被视为博客文章。 Markdown 和 JSON 元数据仍然被处理,但没有永久链接的 URL,不包含在博客列表中,文件/目录结构被更直接地复制过来。

所以,我用这个建议解决了#1:How can I have articles in Wintersmith not in their own subdirectory? 到目前为止,很好,#3 正在工作——分页列表包括所有帖子。 #4 不是问题,这是默认行为。

在#2 我找到了这个解决方案:http://andrewphilipclark.com/2013/11/08/removing-the-boilerplate-from-wintersmith-blog-posts/。正如作者所提到的,他的解决方案(某种程度上)随后被纳入 Wintersmith 大师,所以我尝试相应地设置文件名模板。不幸的是,这适用于 所有 内容,而不仅仅是 /articles 下的内容,所以我的网站的其余部分都被淹没了(中断 #4)。于是我尝试了作者的方法,使用他的代码添加了一个 blogpost.coffee 插件。这会将 /contents/articles 中的所有文件生成到正确的永久链接 URL,但是由于某种原因,分页器现在将不再直接看到 /articles 下的文件(第 1 点)。

我尝试了很多排列和黑客攻击。尝试更改首先加载哪个插件的顺序。尝试让 PaginatorPage 扩展 BlogpostPage 而不是 Page。尝试了很多东西。我终于意识到,即使在检查了 Wintersmith 源代码中的许多核心类之后,我也不明白发生了什么。

具体来说,我无法弄清楚 contents['articles']._.pages 和 .directories 是如何设置的,这似乎是相关的。我也不明白那个下划线是什么。

最终,Jade/CoffeeScript/Markdown 是一个很好的组合,可以最大限度地减少编码并提高清晰度除了,当您想了解幕后发生的事情并且您不了解这些语言时。我花了一点时间来了解 Jade 和 CoffeeScript 的基础知识(Markdown 当然是微不足道的)来了解正在发生的事情。当我不得不深入挖掘 Wintersmith 的来源时,它变得更深了。我承认我也是 node.js 新手,但我认为这里的大问题只是一个神奇的框架。例如,如果一些核心“插件”包含在骨架站点中而不是埋在 node_modules 中,这将是有帮助的,这样好奇的黑客就可以更快地看到事物是如何相互连接的。更详细的文档当然也会有所帮助。从概念上理解内容树、生成器、视图、模板等是一回事,但理解运行时的代码流和关系?我迷路了。

感谢任何帮助。正如我所说,我爱温特史密斯,只是希望我能解除魔法。

【问题讨论】:

    标签: coffeescript pagination wintersmith


    【解决方案1】:

    因为咖啡脚本很垃圾,所以这很难做到。但是,如果您愿意,您可以销毁 paginator.coffee 并将其替换为执行类似操作的简单 javascript 脚本:

    module.exports = function (env, callback) {
    
      function Page() {
        var rtn = new env.plugins.Page();
    
        rtn.getFilename = function() {
          return 'index.html';
        },
    
        rtn.getView = function() {
          return function(env, locals, contents, templates, callback) {
            var error = null;
            var context = {};
            env.utils.extend(context, locals);
            var buffer = new Buffer(templates['index.jade'].fn(context));
            callback(error, buffer);
          };
        };
        return rtn;
      };
    
      /** Generates a custom index page */
      function gen(contents, callback) {
        var p = Page();
        var pages = {'index.page': p};
        var error = null;
        callback(error, pages);
      };
    
      env.registerGenerator('magic', gen);
      callback();
    };
    

    请注意,由于“咖啡脚本魔法”,这里有许多需要跳过的环节,例如确保从 getView() 返回缓冲区,以及“手动”覆盖而不是使用晦涩难懂的咖啡脚本扩展语义。

    Wintersmith 对于如何处理这些功能非常挑剔。如果不调用回调,因为返回的值不是 Stream 或 Buffer,生成的文件将出现在内容摘要中,但不会在构建过程中呈现到磁盘。启用详细日志记录并检查“跳过 foo”消息以检测到这一点。

    【讨论】:

    • 好建议,谢谢。既然我还没有坐下来“学习”咖啡脚本,只是好奇——你为什么说它是垃圾?太多的魔法,听起来像?
    猜你喜欢
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2016-01-18
    • 2021-11-04
    • 2013-03-09
    相关资源
    最近更新 更多