ページごと、投稿ごとにJekyllにHTMLファイルとJSONファイルを作成させたいです。これは、私の Jekyll ブログの JSON API を提供するためのものです。たとえば、投稿には、/posts/2012/01/01/my-post.html
または/posts/2012/01/01/my-post.json
Jekyll プラグインがあるかどうか、またはそのようなプラグインを作成して 2 つのファイル セットを並べて生成する方法を知っている人はいますか?
私もこのようなものを探していたので、Ruby を少し学び、Jekyll ブログ投稿の JSON 表現を生成するスクリプトを作成しました。私はまだそれに取り組んでいますが、そのほとんどはそこにあります。
これを Gruntjs、Sass、Backbonejs、Requirejs、Coffeescript と組み合わせました。必要に応じて、Github にある私の jekyll-backbone プロジェクトをご覧ください。
# encoding: utf-8
#
# Title:
# ======
# Jekyll to JSON Generator
#
# Description:
# ============
# A plugin for generating JSON representations of your
# site content for easy use with JS MVC frameworks like Backbone.
#
# Author:
# ======
# Jezen Thomas
# jezenthomas@gmail.com
# http://jezenthomas.com
module Jekyll
require 'json'
class JSONGenerator < Generator
safe true
priority :low
def generate(site)
# Converter for .md > .html
converter = site.getConverterImpl(Jekyll::Converters::Markdown)
# Iterate over all posts
site.posts.each do |post|
# Encode the HTML to JSON
hash = { "content" => converter.convert(post.content)}
title = post.title.downcase.tr(' ', '-').delete("’!")
# Start building the path
path = "_site/dist/"
# Add categories to path if they exist
if (post.data['categories'].class == String)
path << post.data['categories'].tr(' ', '/')
elsif (post.data['categories'].class == Array)
path << post.data['categories'].join('/')
end
# Add the sanitized post title to complete the path
path << "/#{title}"
# Create the directories from the path
FileUtils.mkpath(path) unless File.exists?(path)
# Create the JSON file and inject the data
f = File.new("#{path}/raw.json", "w+")
f.puts JSON.generate(hash)
end
end
end
end
require 'json'
module Jekyll
class JSONPostGenerator < Generator
safe true
def generate(site)
site.posts.each do |post|
render_json(post,site)
end
site.pages.each do |page|
render_json(page,site)
end
end
def render_json(post, site)
#add `json: false` to YAML to prevent JSONification
if post.data.has_key? "json" and !post.data["json"]
return
end
path = post.destination( site.source )
#only act on post/pages index in /index.html
return if /\/index\.html$/.match(path).nil?
#change file path
path['/index.html'] = '.json'
#render post using no template(s)
post.render( {}, site.site_payload)
#prepare output for JSON
post.data["related_posts"] = related_posts(post,site)
output = post.to_liquid
output["next"] = output["next"].id unless output["next"].nil?
output["previous"] = output["previous"].id unless output["previous"].nil?
#write
#todo, figure out how to overwrite post.destination
#so we can just use post.write
FileUtils.mkdir_p(File.dirname(path))
File.open(path, 'w') do |f|
f.write(output.to_json)
end
end
def related_posts(post, site)
related = []
return related unless post.instance_of?(Post)
post.related_posts(site.posts).each do |post|
related.push :url => post.url, :id => post.id, :title => post.to_liquid["title"]
end
related
end
end
end
どちらもあなたが望むことを正確に行う必要があります。
必要に応じて、これを実現する方法が 2 つあります。レイアウトを使用してタスクを達成する場合は、 Generatorを使用します。サイトの各ページをループして、ページの新しい .json バージョンを生成します。オプションで、site.config またはページの YAML フロントマターに変数が存在することを条件として、生成されるページを作成できます。Jekyll は、ジェネレーターを使用して、ページごとの投稿数が指定されたインデックスにブログ投稿をスライスして処理します。
2 番目の方法は、コンバーターを使用することです(同じリンク、下にスクロールします)。コンバーターを使用すると、コンテンツに対して任意のコードを実行して、別の形式に変換できます。これがどのように機能するかの例については、Jekyll に付属のマークダウン コンバーターを確認してください。
これはいいアイデアだと思います!