Jekyll - 组装模型

Jekyll - Assembing a model

我有一些内容来自 yaml 和普通 Jekyll 模式中的 markdown。

我还通过 Jekyll 数据从 API 中提取了各种内容。例如,我可以 link 一个页面与其相关的数据文件如下。

sita.data.API[page.api-id]

这工作得很好。但是,如果前面有 none 可用,我只使用来自 site.data 的图像。我已经做到了这一点,但是我的模板中有各种 if 语句来控制 URL 到图像的输出。

我试图放入一个包含,但这在循环 site.pages 时导致了麻烦,例如,输出一组帖子的缩略图。

我真的很想从 site.data 中提取数据到页面的 Jekyll 模型中。这样所有的默认值和其他逻辑都可以从模板中隐藏起来。我可以遍历 site.pages,而无需在网站上散布大量复制和粘贴代码,也不必尝试将 include 标签推到其设计目的之外。

这可以用插件来完成吗?

否则,我可以使用 gulp 或其他构建步骤,将 markdown 文件和 site.data 中的数据合并到第三组文件中 - 可能是 markdown?这个解决方案感觉像是从 Jekyll 向使用 gatsby 之类的东西迈出了一步。

根据 Jekyll docs

... a generator [plugin] can inject values computed at build time for template variables.

链接页面上有一些非常有用的示例。

module Composite-model
    class Generator < Jekyll::Generator
      priority :lowest
      def generate(site)

        # get the target from collections.
        # you could also target site.page or site.post with various filters.
        customCollection = site.collections['my-collection']

        
        customCollection.each do |item|

          # Get data from another source and link on id.
          apiId = item["api-id"].to_s
          apiData = site.data["api"][apiId]

          # attach data to collection item
          item.data['api-data'] = apiData

          # please forgive the messy logic, first bit of ruby. 
          # Will refactor and update
          if apiData  && apiData["images"]
              singleImage = apiData["images"].length == 1
              item.data['single-image'] = singleImage

              if item["custom-image"].to_s.strip.empty?
                imageUri = apiData['images'][0]['uri'].split('/').last
                image = File.join("/assets/images/", apiId, imageUri)
                item.data['image'] = image
              else
                item.data['image'] = item["custom-image"]
              end
          else
            item.data['image'] = item["custom-image"]
          end    
        end
      end
    end
  end

N.B 看起来您无法从生成器插件中覆盖页面变量。 比如我先尝试直接从front-matter transform item.image。但是,这不起作用,因此页面前端使用自定义图像,然后该生成器首先使用图像。可能值得提出一个不同的问题。