coffeescript - 如何自定义 Wintersmith 分页器?

标签 coffeescript pagination wintersmith

我一直在与 Wintersmith 一起建立一个网站,并且非常喜欢它,但我无法理解一些幕后机制。我从添加 paginator.coffee 插件的“博客”骨架开始。

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

  1. 任何文件(markdown、html、json 元数据)都将在/contents/article/ 或/contents/articles// 中选取
  2. 输出文件位于/articles/YYYY/MM/DD/title-slug/
  3. /blog.html 列出所有文章,分页。
  4. /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 master 中,所以我尝试相应地设置 filenameTemplate 。不幸的是,这适用于所有内容,而不仅仅是/articles下的内容,因此我网站的其余部分都被淹没了(破坏#4)。于是我尝试了作者的方法,使用他的代码添加了一个 blogpost.coffee 插件。这会将/contents/articles 中的所有文件生成到正确的永久链接 URL 中,但是由于某种原因,分页器现在将不再看到直接位于/articles 下的文件(第 1 点)。

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

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

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

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

最佳答案

因为 CoffeeScript 很垃圾,所以这很难做到。但是,如果您愿意,您可以销毁 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();
};

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

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

关于coffeescript - 如何自定义 Wintersmith 分页器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22390911/

相关文章:

perl - 需要有关分层数据分页的建议

coffeescript - Wintersmith:错误加载插件 './node_modules/wintersmith-coffee/' 时出错:找不到模块 './plugin'

javascript - 为什么将foreignObject附加到SVG中会破坏jquery ui的调整大小?

coffeescript - 无法在 ubuntu LTS 上安装 CoffeeScript

将 coffeescript 转换为 javascript 或已编译的 java 可执行文件的 Java 库?

node.js - 对 Wintersmith 中部署的开箱即用支持

javascript - 在 CoffeeScript 中查找调用函数调用的类

php - 在 laravel 5.2 中使用 pagination() 的 distinct() 不起作用

iPhone UITableView 分页结果