From c46222fd2c1e02f695b544576f8605676be4d502 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sun, 24 Nov 2013 04:40:17 -0500 Subject: Switch from rdiscount to Pandoc. But, I am still using ERB for the templating; I wrote my own Ruby Pandoc bindings because pandoc-ruby sucks; it has more code but does less. This was slightly painful, as I had to switch all of the articles from my hacked-on metadata format to Pandoc's format. --- pandoc.rb | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 pandoc.rb (limited to 'pandoc.rb') diff --git a/pandoc.rb b/pandoc.rb new file mode 100644 index 0000000..47f638e --- /dev/null +++ b/pandoc.rb @@ -0,0 +1,65 @@ +require 'open3' +require 'json' + +module Pandoc + def self.prog + @prog ||= 'pandoc' + end + def self.prog=(val) + @prog = val + end + def self.load(fmt, input) + cmd = Pandoc::prog + " -t json" + unless fmt.nil? + cmd += " -f " + fmt + end + str = input + if str.respond_to? :read + str = str.read + end + json = '' + Open3::popen3(cmd) do |stdin, stdout, stderr| + stdin.puts(str) + stdin.close + json = stdout.read + end + return Pandoc::AST::new(json) + end + + class AST + def initialize(json) + @js = JSON::parse(json) + end + + def [](key) + Pandoc::AST::js2sane(@js[0]["unMeta"][key]) + end + + def to(format) + cmd = Pandoc::prog + " -f json -t " + format.to_s + output = '' + Open3::popen3(cmd) do |stdin, stdout, stderr| + stdin.puts @js.to_json + stdin.close + output = stdout.read + end + output + end + + def self.js2sane(js) + if js.nil? + return js + end + case js["t"] + when "MetaList" + js["c"].map{|c| js2sane(c)} + when "MetaInlines" + js["c"].map{|c| js2sane(c)}.join() + when "Space" + " " + when "Str" + js["c"] + end + end + end +end -- cgit v1.2.3