Last active
February 23, 2017 07:53
-
-
Save esmevane/01ae111d292796e22e1e to your computer and use it in GitHub Desktop.
[ Jekyll / Ruby / Json ]: Generate json out of Jekyll posts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'json' | |
module Jekyll | |
module JsonContent | |
class Index < Jekyll::Page | |
attr_reader :page | |
def initialize site, base, dir, page | |
@site = site | |
@base = base | |
@dir = dir | |
@name = page.name | |
@page = page | |
self.process @name | |
self.read_yaml File.join(base, '_layouts'), 'api.json' | |
end | |
def permalink | |
page.url.sub(/html$/, 'json') | |
end | |
def output | |
{ title: page.data.fetch('title'), posts: post_list }.to_json | |
end | |
def post_list | |
site.posts.map { |post| Blurb.new(post).output } | |
end | |
end | |
class Page < Jekyll::Page | |
attr_reader :post | |
def initialize site, base, dir, post | |
@site = site | |
@base = base | |
@dir = dir | |
@name = post.name | |
@post = post | |
self.process @name | |
self.read_yaml File.join(base, '_layouts'), 'api.json' | |
end | |
def permalink | |
"#{post.id}.json" | |
end | |
def output | |
Hash.new.tap do |hash| | |
hash[:post] = { title: post.title, content: post.content } | |
hash[:next] = next_output if !post.next.nil? | |
hash[:previous] = prev_output if !post.previous.nil? | |
hash[:related_posts] = RelatedPosts.new(post, site).output | |
end.to_json | |
end | |
def prev_output | |
Blurb.new(post.previous).output | |
end | |
def next_output | |
Blurb.new(post.next).output | |
end | |
end | |
class Blurb | |
attr_reader :post | |
def initialize post | |
@post = post | |
end | |
def output | |
{ title: post.title, excerpt: post.excerpt, url: "#{post.id}.json" } | |
end | |
end | |
class RelatedPosts | |
attr_reader :post, :site | |
def initialize post, site | |
@post = post | |
@site = site | |
end | |
def output | |
return [] unless post.instance_of? Post | |
post.related_posts(site.posts).map { |post| Blurb.new(post).output } | |
end | |
end | |
end | |
class JsonPageGenerator < Generator | |
safe true | |
def generate(site) | |
dir = site.config.fetch('destination') | |
site.posts.each do |post| | |
site.pages << JsonContent::Page.new(site, site.source, dir, post) | |
end | |
index = site.pages.find { |page| page.name == 'index.html' } | |
site.pages << JsonContent::Index.new(site, site.source, dir, index) | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hello, could you tell me how to use it?