nodifier 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + '/indentation'
2
+
3
+ class JsonNodeFormatter
4
+ include Indentation
5
+
6
+ def format(nodes)
7
+ if nodes.is_a?(Node)
8
+ return "{\n#{format_single_node(nodes, 1)}\n}"
9
+ end
10
+
11
+ json = nodes.map { |node|
12
+ format_single_node(node, 1)
13
+ }.join(",\n")
14
+
15
+ "{\n#{json}\n}"
16
+ end
17
+
18
+ private
19
+ def format_single_node(node, indent_level = 0)
20
+ key, value = node.label.split(/:\s*/)
21
+
22
+ return indent("\"#{key}\": #{value_or_null(value)}", indent_level) if node.children.empty?
23
+
24
+ json = indent("\"#{key}\": {", indent_level)
25
+
26
+ first_child = true
27
+ node.children.each do |child|
28
+ json << "," if not first_child
29
+ json << "\n"
30
+ json << format_single_node(child, indent_level + 1)
31
+ first_child = false
32
+ end
33
+
34
+ json << "\n"
35
+ json << indent("}", indent_level)
36
+
37
+ json
38
+ end
39
+
40
+ def value_or_null(value)
41
+ return 'null' if value.nil?
42
+ "\"#{value}\""
43
+ end
44
+ end
@@ -2,10 +2,12 @@ require File.dirname(__FILE__) + '/indentation'
2
2
  require File.dirname(__FILE__) + '/nodes'
3
3
  require File.dirname(__FILE__) + '/formatter_state'
4
4
  require File.dirname(__FILE__) + '/xml_node_formatter'
5
+ require File.dirname(__FILE__) + '/json_node_formatter'
5
6
 
6
7
  class Node
7
8
  include Indentation
8
9
 
10
+ @@json_formatter = JsonNodeFormatter.new
9
11
  @@xml_formatter = XmlNodeFormatter.new
10
12
 
11
13
  attr_reader :label
@@ -37,6 +39,10 @@ class Node
37
39
  s
38
40
  end
39
41
 
42
+ def to_json
43
+ @@json_formatter.format self
44
+ end
45
+
40
46
  def to_xml
41
47
  @@xml_formatter.format self
42
48
  end
@@ -1,12 +1,13 @@
1
1
  class Nodes < Array
2
2
  def to_s(indent_level = 0, &formatter_block)
3
- s = ''
3
+ map { |node| node.to_s(indent_level, &formatter_block) }.join("\n")
4
+ end
4
5
 
5
- each do |node|
6
- s << "\n" unless s.empty?
7
- s << node.to_s(indent_level, &formatter_block)
8
- end
6
+ def to_json
7
+ map { |node| node.to_json }.join("\n")
8
+ end
9
9
 
10
- s
10
+ def to_xml
11
+ map { |node| node.to_xml }.join("\n")
11
12
  end
12
13
  end
@@ -4,14 +4,25 @@ require File.dirname(__FILE__) + '/node'
4
4
  class XmlNodeFormatter
5
5
  include Indentation
6
6
 
7
- def format(node, indent_level = 0)
7
+ def format(nodes, indent_level = 0)
8
+ if nodes.is_a?(Node)
9
+ return format_single_node(nodes, indent_level)
10
+ end
11
+
12
+ nodes.map { |node|
13
+ format_single_node(node, indent_level)
14
+ }.join("\n")
15
+ end
16
+
17
+ private
18
+ def format_single_node(node, indent_level = 0)
8
19
  return indent("<#{node.label} />", indent_level) if node.children.empty?
9
20
 
10
21
  xml = indent("<#{node.label}>", indent_level)
11
22
 
12
23
  node.children.each do |child|
13
24
  xml << "\n"
14
- xml << format(child, indent_level + 1)
25
+ xml << format_single_node(child, indent_level + 1)
15
26
  end
16
27
 
17
28
  xml << "\n"
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: nodifier
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.5
5
+ version: 0.1.6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Daniel Tao
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-11-03 00:00:00 Z
13
+ date: 2011-11-04 00:00:00 Z
14
14
  dependencies: []
15
15
 
16
16
  description: A simple Ruby library for parsing plain text into a node-based structure
@@ -24,6 +24,7 @@ extra_rdoc_files: []
24
24
  files:
25
25
  - lib/formatter_state.rb
26
26
  - lib/indentation.rb
27
+ - lib/json_node_formatter.rb
27
28
  - lib/node.rb
28
29
  - lib/node_parser.rb
29
30
  - lib/nodes.rb