nanoc:按项目名称或标识符测试编译规则的问题

时间:2013-11-15 10:44:10

标签: ruby nanoc

我在nanoc规则中使用以下测试,通过将它们与具有相同名称的布局进行匹配来编译多个目录中的各种内容(包括部分内容)。

现在我已经为每个内容目录添加了索引文件,但这些文件需要默认布局。如果我将一个名为'index:'的项添加到'index.md'文件中的元数据中,这显然可行。

---
title: 'This page title'
index: 'y'
---

...但是检查if @item[:index]似乎有点笨拙,所以我一直在尝试(好吧,黑客攻击)找到一种方法从元数据中省略'index:'并通过nanoc rep name或identifier进行测试 - 请参阅以下代码中已注释掉的if语句:

layouts = ['layoutone','layouttwo','layoutetc']

layouts.each  do |dir|
  compile "/#{dir}/*" do
    # if item.identifier == "/#{dir}/index/"
    # if item.identifier =~ %r{/\w/index/}
    # if @item.rep_named(:index)
    if @item[:index]
     filter :kramdown
      layout "default"
    elsif @item[:inc]
      filter :erb
      filter :kramdown
      layout "#{dir}"
    else
      filter :kramdown
      layout "#{dir}"
    end
  end
end

我注释掉的行中的语法/逻辑出了什么问题?

编辑:

我在这里错过了令人眼花缭乱的显而易见:只需在与/content/dir_name.md相同的级别添加/content/dir_name/*即可创建/dir_name/index.html/dir_name/*.html,并将规则应用于{{1}文件。

1 个答案:

答案 0 :(得分:1)

您是否在nanoc.yaml之后更改了nanoc create-site?因为我记得默认情况下,nanoc中的标识符不包含源文件名的最后index部分。

假设,文件content/dirA/index.markdown将具有标识符/dirA/或其他内容,并编译为content/dirA/index.html。这可能是您index正则表达式没有命中的原因。

是的,有点棘手,但是nanoc很棒。

更新

我找到了一种告诉内容文件名的方法:item.raw_filename

This document表示它仅适用于二进制文件,而且在我的实验中也适用于文本文件。

# in compile block of Rules
item.identifier
# => "/aaa/"
item.raw_filename
# => "content/aaa.markdown"