nodifier 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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