line-tree 0.1.0

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.
Files changed (2) hide show
  1. data/lib/line-tree.rb +54 -0
  2. metadata +55 -0
data/lib/line-tree.rb ADDED
@@ -0,0 +1,54 @@
1
+ class LineTree
2
+
3
+ def initialize(lines)
4
+ a = lines.split(/\r?\n|\r(?!\n)/)
5
+ pattern = %r((\s+)?(((\/|.)[^\s]+)\s)?([^$]+))
6
+ a.map!{|x| x.match(pattern).captures.values_at(0,2,4)}
7
+
8
+ new_a, history = [], []
9
+ history << new_a
10
+ build_tree(a, new_a, 0, history)
11
+ @a = new_a
12
+ end
13
+
14
+ def to_a()
15
+ @a
16
+ end
17
+
18
+ private
19
+
20
+ def build_tree(a, new_a, prev_indent, history=[])
21
+ if a.length > 0 then
22
+ x = a.shift
23
+ n = x.shift
24
+ cur_indent = n ? n.length : 0
25
+ indent, xr = build_branch(a, new_a, cur_indent, prev_indent, x, history )
26
+
27
+ if xr then
28
+ history.pop
29
+ cur_indent, xr = build_branch(a, history[-1] || new_a, indent, prev_indent, xr, history )
30
+ return [cur_indent, xr] if xr
31
+ end
32
+ end
33
+ end
34
+
35
+ def build_branch(a, new_a, cur_indent, prev_indent, x, history=[])
36
+ if cur_indent > prev_indent then
37
+ new_a = history[-1]
38
+ new_inner_a = [x]
39
+ new_a << new_inner_a
40
+ history << new_inner_a
41
+ build_tree(a, history[-2], cur_indent, history)
42
+ elsif cur_indent == prev_indent then
43
+ history.pop
44
+ new_a = history[-1] if history[-1]
45
+ new_inner_a = [x]
46
+ new_a << new_inner_a
47
+ history << new_inner_a
48
+ build_tree(a, new_inner_a, cur_indent, history)
49
+ else
50
+ # revert to the earlier new_a
51
+ return [cur_indent, x]
52
+ end
53
+ end
54
+ end
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: line-tree
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors: []
7
+
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-04-04 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Line-tree parses indented lines of text and returns an array representing a tree structure.
17
+ email:
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - lib/line-tree.rb
26
+ has_rdoc: true
27
+ homepage:
28
+ licenses: []
29
+
30
+ post_install_message:
31
+ rdoc_options: []
32
+
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: "0"
40
+ version:
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ version:
47
+ requirements: []
48
+
49
+ rubyforge_project:
50
+ rubygems_version: 1.3.5
51
+ signing_key:
52
+ specification_version: 3
53
+ summary: line-tree
54
+ test_files: []
55
+