From 8f776e542b49d11bca71e3920ef8d53daf41a21c Mon Sep 17 00:00:00 2001 From: labocho Date: Thu, 10 Nov 2016 20:50:09 +0900 Subject: [PATCH] add mt2json command --- Gemfile.lock | 8 +++--- exe/mt2json | 30 ++++++++++++++++++++++ lib/movable_type_format/collection.rb | 4 +++ lib/movable_type_format/entry.rb | 23 +++++++++++++++-- lib/movable_type_format/section/base.rb | 7 +++++ lib/movable_type_format/section/comment.rb | 12 +++++++++ lib/movable_type_format/section/ping.rb | 12 +++++++++ 7 files changed, 90 insertions(+), 6 deletions(-) create mode 100755 exe/mt2json diff --git a/Gemfile.lock b/Gemfile.lock index 542a345..e95d15f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,16 +1,16 @@ PATH remote: . specs: - movable_type_format (0.1.0) + movable_type_format (0.1.1) activemodel (~> 3.2.1) GEM remote: https://rubygems.org/ specs: - activemodel (3.2.22) - activesupport (= 3.2.22) + activemodel (3.2.22.5) + activesupport (= 3.2.22.5) builder (~> 3.0.0) - activesupport (3.2.22) + activesupport (3.2.22.5) i18n (~> 0.6, >= 0.6.4) multi_json (~> 1.0) builder (3.0.4) diff --git a/exe/mt2json b/exe/mt2json new file mode 100755 index 0000000..e151436 --- /dev/null +++ b/exe/mt2json @@ -0,0 +1,30 @@ +#!/usr/bin/env ruby +require "movable_type_format" +require "optparse" +require "json" + +def sort_hash_keys(obj) + case obj + when Hash + obj.keys.sort.inject({}){|h, k| h[k] = sort_hash_keys(obj[k]); h } + when Array + obj.map{|a| sort_hash_keys(a) } + else + obj + end +end + +options = { + compact_output: false, +} +OptionParser.new do |o| + o.on("-c", "--compact-output"){|b| options[:compact_output] = b } + o.parse!(ARGV) +end + +entries = MovableTypeFormat::Parser.parse(ARGF).map{|e| sort_hash_keys(e.serialize) } +if options[:compact_output] + puts JSON.generate(entries) +else + puts JSON.pretty_generate(entries) +end diff --git a/lib/movable_type_format/collection.rb b/lib/movable_type_format/collection.rb index e7fe717..8ebc99b 100644 --- a/lib/movable_type_format/collection.rb +++ b/lib/movable_type_format/collection.rb @@ -7,5 +7,9 @@ def to_mt def +(another) self.class.new(super) end + + def serialize + to_a.map(&:serialize) + end end end diff --git a/lib/movable_type_format/entry.rb b/lib/movable_type_format/entry.rb index 4184092..1dd409b 100644 --- a/lib/movable_type_format/entry.rb +++ b/lib/movable_type_format/entry.rb @@ -12,6 +12,25 @@ def sections @sections ||= Collection.new end + def serialize + serialized = {} + + ( Section::Base::NAMES_OF_SINGLE_SECTION + + MovableTypeFormat::Field::KEYS_FOR_METADATA).each do |s| + next if s == "CATEGORY" + method = s.downcase.gsub(/ /, "_") + if v = send(method) + serialized[method] = v + end + end + + serialized["categories"] = categories if categories.any? + serialized["comments"] = comments.serialize if comments.any? + serialized["pings"] = pings.serialize if pings.any? + + serialized + end + Section::Base::NAMES_OF_SINGLE_SECTION.each do |section_name| name = section_name.downcase.gsub(/ /, "_") define_method name do @@ -51,7 +70,7 @@ def metadata=(v) end def comments - sections.select{|s| s.name == "COMMENT" }.freeze + Collection.new(sections.select{|s| s.name == "COMMENT" }).freeze end def comments=(v) @@ -60,7 +79,7 @@ def comments=(v) end def pings - sections.select{|s| s.name == "PING" }.freeze + Collection.new(sections.select{|s| s.name == "PING" }).freeze end def pings=(v) diff --git a/lib/movable_type_format/section/base.rb b/lib/movable_type_format/section/base.rb index 5ae6091..233fa64 100644 --- a/lib/movable_type_format/section/base.rb +++ b/lib/movable_type_format/section/base.rb @@ -57,6 +57,13 @@ def name @name end + def serialize + { "name" => name, + "fields" => fields.inject({}){|h, f| h[f.key] = f.value; h }, + "body" => body, + } + end + def to_mt buffer = "" buffer << "#{name}:\n" unless metadata? diff --git a/lib/movable_type_format/section/comment.rb b/lib/movable_type_format/section/comment.rb index d867471..9be2387 100644 --- a/lib/movable_type_format/section/comment.rb +++ b/lib/movable_type_format/section/comment.rb @@ -6,6 +6,18 @@ class Comment < Base def initialize(fields = Collection.new, body = nil) super "COMMENT", fields, body end + + def serialize + serialized = {} + MovableTypeFormat::Field::KEYS_FOR_COMMENT.each do |s| + method = s.downcase.gsub(/ /, "_") + if v = send(method) + serialized[method] = v + end + end + serialized["body"] = body + serialized + end end end end diff --git a/lib/movable_type_format/section/ping.rb b/lib/movable_type_format/section/ping.rb index fe05ed7..3f270d5 100644 --- a/lib/movable_type_format/section/ping.rb +++ b/lib/movable_type_format/section/ping.rb @@ -6,6 +6,18 @@ class Ping < Base def initialize(fields = Collection.new, body = nil) super "PING", fields, body end + + def serialize + serialized = {} + MovableTypeFormat::Field::KEYS_FOR_PING.each do |s| + method = s.downcase.gsub(/ /, "_") + if v = send(method) + serialized[method] = v + end + end + serialized["body"] = body + serialized + end end end end