-
-
Save shawnhansen/6081967 to your computer and use it in GitHub Desktop.
This file contains 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' | |
require 'net/http' | |
# JSON parser tag, creating map for use in jekyll markdown | |
# Alex.Heneveld @ Cloudsoft Corp (remove spaces and add the .com) | |
# Released under APL 2.0 | |
# usage: {% jsonball varname from TYPE PARAM %} | |
# | |
# where TYPE is one of {data,var,file,page}, described below | |
# drop this into your _plugins/ folder, then you can write, e.g. | |
# | |
# {% jsonball foo from data { "a": "b" } %} | |
# | |
# and then later refer to {{ foo.a }} to get b inserted | |
# more usefully, you can load it from a variable x, e.g. | |
# {% capture x %}{% include toc.json %}{% endcapture %} | |
# | |
# {% jsonball foo from var x %} | |
# even better, to read from a file, say toc.json | |
# (absolute, or relative to the page being jekylled): | |
# | |
# {% jsonball foo from file toc.json %} | |
# | |
# then e.g. {% for record in jsonball %} {{ record.name }} {% endfor %} | |
# to print out all the name entries (or build a fancy TOC sidebar) | |
# or even better yet, to read from a URL | |
# | |
# {% jsonball feed from url http://www.foo.com/bar.json %} | |
# | |
# then e.g. {% for record in feed %} {{ record.key }} {% endfor %} | |
# and finally, if that json file might itself contain liquid tags, | |
# or need jekylling, treat it as a page and it will get jekylled | |
# (we use this for toc.json reading from subdirs' toc.json files): | |
# | |
# {% jsonball foo from page toc.json %} | |
module JekyllJsonball | |
class JsonballTag < Liquid::Tag | |
def initialize(tag_name, text, tokens) | |
super | |
@text = text | |
end | |
def render(context) | |
if /(.+) from var (.+)/.match(@text) | |
context[$1] = JSON context[$2] | |
return '' | |
end | |
if /(.+) from data (.+)/.match(@text) | |
context[$1] = JSON $2 | |
return '' | |
end | |
if /(.+) from file (.+)/.match(@text) | |
context[$1] = JSON page_relative_file_contents(context, $2.strip) | |
return '' | |
end | |
if /(.+) from page (.+)/.match(@text) | |
context[$1] = JSON jekylled_page_relative_file_contents(context, $2.strip) | |
return '' | |
end | |
if /(.+) from url (.+)/.match(@text) | |
base_url = $2 | |
resp = Net::HTTP.get_response(URI.parse(base_url)) | |
data = resp.body | |
context[$1] = JSON data | |
return '' | |
end | |
# syntax error | |
return 'ERROR:bad_jsonball_syntax' | |
end | |
def page_relative_file_contents(context, filename) | |
jekyllSite = context.registers[:site] | |
dir = jekyllSite.source+'/'+File.dirname(context['page']['url']) | |
if !filename.match(/\/.*/) | |
filename = dir + '/' + filename | |
end | |
file = File.open(filename, "rb") | |
return file.read | |
end | |
def jekylled_page_relative_file_contents(context, filename) | |
jekyllSite = context.registers[:site] | |
targetPage = Jekyll::Page.new(jekyllSite, jekyllSite.source, File.dirname(context['page']['url']), filename) | |
targetPage.render(jekyllSite.layouts, jekyllSite.site_payload) | |
targetPage.output | |
end | |
end | |
end | |
Liquid::Template.register_tag('jsonball', JekyllJsonball::JsonballTag) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment