forked from AntonNguyen/JavaScriptNext.tmLanguage
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathyaml-to-plist.rb
More file actions
executable file
·49 lines (43 loc) · 1.71 KB
/
yaml-to-plist.rb
File metadata and controls
executable file
·49 lines (43 loc) · 1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env ruby
# encoding: UTF-8
require 'yaml'
require 'rexml/document'
class PlistWriter
PLIST_STUB_DOC = %q[
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"></plist>]
def initialize(root_object)
@document = REXML::Document.new PLIST_STUB_DOC
@current_node = @document.root
process(root_object)
end
def build_element(name, text = nil)
@current_node.add_element(name.to_s).tap do |new_node|
new_node.add_text(text.to_s.dup) unless text.nil?
next unless block_given?
_current_node = @current_node
@current_node = new_node
yield
@current_node = _current_node
end
end
def process(object)
case object
when Hash then build_element :dict do object.each { |k, v| build_element(:key, k); process(v) } end
when Array then build_element :array do object.each { |e| process(e) } end
when String then build_element :string , object
when Integer then build_element :integer, object
when Float then build_element :real , object
when Date then build_element :date , object.to_time(:utc).iso8601
when Time, DateTime then build_element :date , object.to_time.utc.iso8601
when FalseClass then build_element :false
when TrueClass then build_element :true
else raise "Unexpected object of class #{object.class.name}"
end
end
def to_s
"".tap { |s| f = REXML::Formatters::Pretty.new(indentation=4); f.compact = true; f.write(@document, s) }
end
end
puts PlistWriter.new(YAML::load(ARGF.read)) if $0 == __FILE__