weskit 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -3
- data/.rspec +1 -0
- data/.travis.yml +4 -0
- data/Gemfile +2 -2
- data/LICENSE +339 -0
- data/README.md +135 -0
- data/Rakefile +4 -0
- data/lib/weskit/mp/adapter.rb +81 -0
- data/lib/weskit/mp/connection.rb +74 -0
- data/lib/weskit/mp/errors/error.rb +3 -0
- data/lib/weskit/mp/errors/response_error.rb +3 -0
- data/lib/weskit/mp/worker.rb +35 -0
- data/lib/weskit/mp.rb +13 -0
- data/lib/weskit/version.rb +1 -1
- data/lib/weskit/wml/attribute.rb +65 -0
- data/lib/weskit/wml/attributes.rb +16 -0
- data/lib/weskit/wml/builder.rb +66 -0
- data/lib/weskit/wml/element.rb +34 -0
- data/lib/weskit/wml/elements.rb +27 -0
- data/lib/weskit/wml/errors/error.rb +3 -0
- data/lib/weskit/wml/errors/invalid_identifier.rb +3 -0
- data/lib/weskit/wml/errors/invalid_item.rb +3 -0
- data/lib/weskit/wml/errors/invalid_option.rb +3 -0
- data/lib/weskit/wml/errors/invalid_parameters.rb +3 -0
- data/lib/weskit/wml/errors/parse_error.rb +3 -0
- data/lib/weskit/wml/errors/read_error.rb +3 -0
- data/lib/weskit/wml/extensions/object.rb +19 -0
- data/lib/weskit/wml/formatter.rb +82 -0
- data/lib/weskit/wml/formatters/ansi_color.rb +49 -0
- data/lib/weskit/wml/formatters/ansi_color_attribute.rb +31 -0
- data/lib/weskit/wml/formatters/ansi_color_element.rb +22 -0
- data/lib/weskit/wml/formatters/attribute.rb +62 -0
- data/lib/weskit/wml/formatters/element.rb +44 -0
- data/lib/weskit/wml/formatters/item_formatter.rb +17 -0
- data/lib/weskit/wml/grammars/wml.treetop +195 -0
- data/lib/weskit/wml/item.rb +89 -0
- data/lib/weskit/wml/items.rb +29 -0
- data/lib/weskit/wml/mixins/container.rb +96 -0
- data/lib/weskit/wml/mixins/grammar.rb +17 -0
- data/lib/weskit/wml/mixins/searchable.rb +43 -0
- data/lib/weskit/wml/mixins/validator.rb +29 -0
- data/lib/weskit/wml/parser.rb +47 -0
- data/lib/weskit/wml/root.rb +17 -0
- data/lib/weskit/wml/wml.rb +1580 -0
- data/lib/weskit/wml.rb +12 -6
- data/lib/weskit.rb +2 -2
- data/spec/spec_helper.rb +1 -0
- data/spec/wml/attribute_spec.rb +51 -0
- data/spec/wml/attributes_spec.rb +19 -0
- data/spec/wml/builder_spec.rb +52 -0
- data/spec/wml/element_spec.rb +20 -0
- data/spec/wml/elements_spec.rb +25 -0
- data/spec/wml/formatter_spec.rb +42 -0
- data/spec/wml/item_spec.rb +25 -0
- data/spec/wml/items_spec.rb +15 -0
- data/spec/wml/parser_spec.rb +60 -0
- data/spec/wml/root_spec.rb +15 -0
- data/spec/wml_helpers.rb +40 -0
- data/spec/wml_matchers.rb +17 -0
- data/spec/wml_shared_examples.rb +68 -0
- data/spec/wml_spec_helper.rb +5 -0
- data/weskit.gemspec +8 -5
- metadata +192 -50
- data/README +0 -2
- data/lib/weskit/lobby/bot.rb +0 -85
- data/lib/weskit/lobby/bot_error.rb +0 -3
- data/lib/weskit/lobby.rb +0 -11
- data/lib/weskit/wml/node.rb +0 -76
- data/lib/weskit/wml/node_array.rb +0 -25
- data/lib/weskit/wml/node_error.rb +0 -3
- data/lib/weskit/wml/reader.rb +0 -67
- data/lib/weskit/wml/reader_error.rb +0 -3
- data/lib/weskit/wml/string_extensions.rb +0 -59
metadata
CHANGED
@@ -1,82 +1,224 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: weskit
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 2
|
10
|
-
version: 0.0.2
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- f6p
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
12
|
+
date: 2012-09-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: awesome_print
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: polyglot
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: term-ansicolor
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: treetop
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :runtime
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
description: Tools for interacting with Wesnoth Markup Language, MP Server and such.
|
111
|
+
email:
|
23
112
|
- filip.pyda@gmail.com
|
24
113
|
executables: []
|
25
|
-
|
26
114
|
extensions: []
|
27
|
-
|
28
115
|
extra_rdoc_files: []
|
29
|
-
|
30
|
-
files:
|
116
|
+
files:
|
31
117
|
- .gitignore
|
118
|
+
- .rspec
|
119
|
+
- .travis.yml
|
32
120
|
- Gemfile
|
33
|
-
-
|
121
|
+
- LICENSE
|
122
|
+
- README.md
|
34
123
|
- Rakefile
|
35
124
|
- lib/weskit.rb
|
36
|
-
- lib/weskit/
|
37
|
-
- lib/weskit/
|
38
|
-
- lib/weskit/
|
125
|
+
- lib/weskit/mp.rb
|
126
|
+
- lib/weskit/mp/adapter.rb
|
127
|
+
- lib/weskit/mp/connection.rb
|
128
|
+
- lib/weskit/mp/errors/error.rb
|
129
|
+
- lib/weskit/mp/errors/response_error.rb
|
130
|
+
- lib/weskit/mp/worker.rb
|
39
131
|
- lib/weskit/version.rb
|
40
132
|
- lib/weskit/wml.rb
|
41
|
-
- lib/weskit/wml/
|
42
|
-
- lib/weskit/wml/
|
43
|
-
- lib/weskit/wml/
|
44
|
-
- lib/weskit/wml/
|
45
|
-
- lib/weskit/wml/
|
46
|
-
- lib/weskit/wml/
|
133
|
+
- lib/weskit/wml/attribute.rb
|
134
|
+
- lib/weskit/wml/attributes.rb
|
135
|
+
- lib/weskit/wml/builder.rb
|
136
|
+
- lib/weskit/wml/element.rb
|
137
|
+
- lib/weskit/wml/elements.rb
|
138
|
+
- lib/weskit/wml/errors/error.rb
|
139
|
+
- lib/weskit/wml/errors/invalid_identifier.rb
|
140
|
+
- lib/weskit/wml/errors/invalid_item.rb
|
141
|
+
- lib/weskit/wml/errors/invalid_option.rb
|
142
|
+
- lib/weskit/wml/errors/invalid_parameters.rb
|
143
|
+
- lib/weskit/wml/errors/parse_error.rb
|
144
|
+
- lib/weskit/wml/errors/read_error.rb
|
145
|
+
- lib/weskit/wml/extensions/object.rb
|
146
|
+
- lib/weskit/wml/formatter.rb
|
147
|
+
- lib/weskit/wml/formatters/ansi_color.rb
|
148
|
+
- lib/weskit/wml/formatters/ansi_color_attribute.rb
|
149
|
+
- lib/weskit/wml/formatters/ansi_color_element.rb
|
150
|
+
- lib/weskit/wml/formatters/attribute.rb
|
151
|
+
- lib/weskit/wml/formatters/element.rb
|
152
|
+
- lib/weskit/wml/formatters/item_formatter.rb
|
153
|
+
- lib/weskit/wml/grammars/wml.treetop
|
154
|
+
- lib/weskit/wml/item.rb
|
155
|
+
- lib/weskit/wml/items.rb
|
156
|
+
- lib/weskit/wml/mixins/container.rb
|
157
|
+
- lib/weskit/wml/mixins/grammar.rb
|
158
|
+
- lib/weskit/wml/mixins/searchable.rb
|
159
|
+
- lib/weskit/wml/mixins/validator.rb
|
160
|
+
- lib/weskit/wml/parser.rb
|
161
|
+
- lib/weskit/wml/root.rb
|
162
|
+
- lib/weskit/wml/wml.rb
|
163
|
+
- spec/spec_helper.rb
|
164
|
+
- spec/wml/attribute_spec.rb
|
165
|
+
- spec/wml/attributes_spec.rb
|
166
|
+
- spec/wml/builder_spec.rb
|
167
|
+
- spec/wml/element_spec.rb
|
168
|
+
- spec/wml/elements_spec.rb
|
169
|
+
- spec/wml/formatter_spec.rb
|
170
|
+
- spec/wml/item_spec.rb
|
171
|
+
- spec/wml/items_spec.rb
|
172
|
+
- spec/wml/parser_spec.rb
|
173
|
+
- spec/wml/root_spec.rb
|
174
|
+
- spec/wml_helpers.rb
|
175
|
+
- spec/wml_matchers.rb
|
176
|
+
- spec/wml_shared_examples.rb
|
177
|
+
- spec/wml_spec_helper.rb
|
47
178
|
- weskit.gemspec
|
48
179
|
homepage: https://github.com/f6p/weskit
|
49
180
|
licenses: []
|
50
|
-
|
51
181
|
post_install_message:
|
52
182
|
rdoc_options: []
|
53
|
-
|
54
|
-
require_paths:
|
183
|
+
require_paths:
|
55
184
|
- lib
|
56
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
185
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
186
|
none: false
|
58
|
-
requirements:
|
59
|
-
- -
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
|
62
|
-
segments:
|
187
|
+
requirements:
|
188
|
+
- - ! '>='
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: '0'
|
191
|
+
segments:
|
63
192
|
- 0
|
64
|
-
|
65
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
193
|
+
hash: -4565766782065065646
|
194
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
195
|
none: false
|
67
|
-
requirements:
|
68
|
-
- -
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
|
71
|
-
segments:
|
196
|
+
requirements:
|
197
|
+
- - ! '>='
|
198
|
+
- !ruby/object:Gem::Version
|
199
|
+
version: '0'
|
200
|
+
segments:
|
72
201
|
- 0
|
73
|
-
|
202
|
+
hash: -4565766782065065646
|
74
203
|
requirements: []
|
75
|
-
|
76
204
|
rubyforge_project:
|
77
|
-
rubygems_version: 1.8.
|
205
|
+
rubygems_version: 1.8.24
|
78
206
|
signing_key:
|
79
207
|
specification_version: 3
|
80
208
|
summary: Ruby utilies for BfW
|
81
|
-
test_files:
|
82
|
-
|
209
|
+
test_files:
|
210
|
+
- spec/spec_helper.rb
|
211
|
+
- spec/wml/attribute_spec.rb
|
212
|
+
- spec/wml/attributes_spec.rb
|
213
|
+
- spec/wml/builder_spec.rb
|
214
|
+
- spec/wml/element_spec.rb
|
215
|
+
- spec/wml/elements_spec.rb
|
216
|
+
- spec/wml/formatter_spec.rb
|
217
|
+
- spec/wml/item_spec.rb
|
218
|
+
- spec/wml/items_spec.rb
|
219
|
+
- spec/wml/parser_spec.rb
|
220
|
+
- spec/wml/root_spec.rb
|
221
|
+
- spec/wml_helpers.rb
|
222
|
+
- spec/wml_matchers.rb
|
223
|
+
- spec/wml_shared_examples.rb
|
224
|
+
- spec/wml_spec_helper.rb
|
data/README
DELETED
data/lib/weskit/lobby/bot.rb
DELETED
@@ -1,85 +0,0 @@
|
|
1
|
-
require 'weskit/wml'
|
2
|
-
|
3
|
-
module Weskit::Lobby
|
4
|
-
require 'socket'
|
5
|
-
require 'stringio'
|
6
|
-
require 'zlib'
|
7
|
-
|
8
|
-
class Bot
|
9
|
-
def initialize nickname, options = {}
|
10
|
-
defaults = {
|
11
|
-
:debug => false,
|
12
|
-
:port => 15000,
|
13
|
-
:server => 'server.wesnoth.org',
|
14
|
-
:version => '1.10.0'
|
15
|
-
}
|
16
|
-
options = defaults.merge options
|
17
|
-
|
18
|
-
@server = options[:server]
|
19
|
-
@port = options[:port]
|
20
|
-
@version = options[:version]
|
21
|
-
|
22
|
-
@reader = Weskit::WML::Reader.new
|
23
|
-
@nickname = nickname
|
24
|
-
end
|
25
|
-
|
26
|
-
def connect_and &operations
|
27
|
-
@socket = TCPSocket.new @server, @port
|
28
|
-
basic_communication
|
29
|
-
response = read_wml
|
30
|
-
@socket.close
|
31
|
-
|
32
|
-
@socket = TCPSocket.new response.redirect[:host], response.redirect[:port]
|
33
|
-
basic_communication
|
34
|
-
|
35
|
-
raise "Server send node other than 'mustlogin'" if read_wml.mustlogin.nil?
|
36
|
-
send_wml 'login', :selective_ping => 1, :username => @nickname
|
37
|
-
raise "Server send node other than 'join_lobby'" if read_wml.join_lobby.nil?
|
38
|
-
|
39
|
-
result = yield self
|
40
|
-
|
41
|
-
sleep 3
|
42
|
-
@socket.close
|
43
|
-
result
|
44
|
-
end
|
45
|
-
|
46
|
-
def read_wml
|
47
|
-
wml = @reader.read_str read_str
|
48
|
-
puts "\e[0;33mRecieve MWL\e[0m:\n#{wml}" if @debug
|
49
|
-
wml
|
50
|
-
end
|
51
|
-
|
52
|
-
def send_wml node, contents = {}
|
53
|
-
wml = @reader.read_hsh({node => contents}).to_s
|
54
|
-
puts "\e[0;32mSend MWL\e[0m:\n#{wml}" if @debug
|
55
|
-
send_str wml
|
56
|
-
end
|
57
|
-
|
58
|
-
private
|
59
|
-
|
60
|
-
def basic_communication
|
61
|
-
handshake
|
62
|
-
raise "Server send node other than 'version'" if read_wml.version.empty?
|
63
|
-
send_wml 'version', :version => @version
|
64
|
-
end
|
65
|
-
|
66
|
-
def handshake
|
67
|
-
@socket.send "\x00" * 4, 0
|
68
|
-
@socket.read 4
|
69
|
-
end
|
70
|
-
|
71
|
-
def read_str
|
72
|
-
msg_size = @socket.read(4).unpack('N').first
|
73
|
-
msg_data = @socket.read(msg_size)
|
74
|
-
Zlib::GzipReader.new(StringIO.new(msg_data)).read
|
75
|
-
end
|
76
|
-
|
77
|
-
def send_str msg
|
78
|
-
gzw = Zlib::GzipWriter.new StringIO.new
|
79
|
-
gzw.write msg.to_s
|
80
|
-
gzm = gzw.close
|
81
|
-
size = [gzm.size].pack('N')
|
82
|
-
@socket.send(size + gzm.string, 0)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
data/lib/weskit/lobby.rb
DELETED
data/lib/weskit/wml/node.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
module Weskit::WML
|
2
|
-
class Node
|
3
|
-
FALSE_ATTR_VALS = ["no", "false", "off", "uninitialized"]
|
4
|
-
TRUE_ATTR_VALS = ["yes", "true", "on"]
|
5
|
-
|
6
|
-
attr_reader :name, :parent
|
7
|
-
|
8
|
-
def add element
|
9
|
-
return false unless element.kind_of? Node
|
10
|
-
@nodes << element ; true
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.create name = '', parent = nil
|
14
|
-
new name, parent
|
15
|
-
end
|
16
|
-
|
17
|
-
def initialize name = '', parent = nil
|
18
|
-
name = normalize name
|
19
|
-
name = (name.empty?) ? 'root' : name
|
20
|
-
raise(NodeError, "Node name can consist only of '#{StringExtensions::VALID_CHARS}'") unless name =~ /^#{StringExtensions::VALID_CHARS}+$/
|
21
|
-
raise(NodeError, "Attempt to set inproper parent node") unless parent.kind_of? Node or parent == nil
|
22
|
-
@attributes, @name, @nodes, @parent = {}, name, [], parent
|
23
|
-
end
|
24
|
-
|
25
|
-
def method_missing method
|
26
|
-
nodes = @nodes.select {|node| node.name == normalize(method)}
|
27
|
-
NodeArray.new.replace nodes
|
28
|
-
end
|
29
|
-
|
30
|
-
def to_ary
|
31
|
-
end
|
32
|
-
|
33
|
-
def to_s indent_width = 1
|
34
|
-
indent_width -= 1 if @name == 'root'
|
35
|
-
|
36
|
-
base_indentation = " " * 4
|
37
|
-
contents_indentation = base_indentation * indent_width
|
38
|
-
closing_tag_indentation = base_indentation * (indent_width > 0 ? indent_width - 1 : 0)
|
39
|
-
|
40
|
-
attr_str = @attributes.keys.sort.inject('') {|string, key| string << "#{contents_indentation}#{key}=\"#{@attributes[key]}\"\n"}
|
41
|
-
node_str = @nodes.inject('') {|string, node| string << "#{contents_indentation}#{node.to_s(indent_width + 1)}\n"}
|
42
|
-
|
43
|
-
(@name == 'root') ? "#{attr_str}#{node_str}" : "[#{name}]\n#{attr_str}#{node_str}#{closing_tag_indentation}[/#{name}]"
|
44
|
-
end
|
45
|
-
|
46
|
-
def [] key
|
47
|
-
value = @attributes[normalize key]
|
48
|
-
|
49
|
-
if FALSE_ATTR_VALS.include? value then false
|
50
|
-
elsif TRUE_ATTR_VALS.include? value then true
|
51
|
-
else value
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def []= key, value
|
56
|
-
key, value = normalize(key), value.to_s
|
57
|
-
|
58
|
-
# This one can cause problems as looks there is no escaping strategy on the server side
|
59
|
-
#unless value == '"'
|
60
|
-
# single_quotes, double_quotes = value.scan('"').size, value.scan('""').size
|
61
|
-
# if (single_quotes > 0) and ((double_quotes == 0) or (single_quotes.to_f % double_quotes.to_f > 0))
|
62
|
-
# raise(NodeError, "Found unescaped double quotes inside attribute value")
|
63
|
-
# end
|
64
|
-
# @attributes[key] = value.gsub('"', '""')
|
65
|
-
#end
|
66
|
-
|
67
|
-
@attributes[key] = value
|
68
|
-
end
|
69
|
-
|
70
|
-
private
|
71
|
-
|
72
|
-
def normalize name
|
73
|
-
name.to_s.strip
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module Weskit::WML
|
2
|
-
class NodeArray < Array
|
3
|
-
def [] key
|
4
|
-
unless key.is_a? Integer
|
5
|
-
return first[key] unless empty?
|
6
|
-
nil
|
7
|
-
else
|
8
|
-
super key
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def []= key, value
|
13
|
-
(key.is_a? Integer) ? super(key, value) : (first[key] = value) unless empty?
|
14
|
-
end
|
15
|
-
|
16
|
-
def method_missing method
|
17
|
-
nodes = inject([]) {|array, element| array + element.send(method) if element.kind_of? Node}
|
18
|
-
NodeArray.new.replace nodes
|
19
|
-
end
|
20
|
-
|
21
|
-
def to_wml
|
22
|
-
inject('') {|string, item| string << "#{item}\n" if item.kind_of? Node}
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/lib/weskit/wml/reader.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
module Weskit::WML
|
2
|
-
class Reader
|
3
|
-
def read_hsh hash, name = '', parent = nil
|
4
|
-
current_node = Node.new name, parent
|
5
|
-
hash.each {|key,val| (val.kind_of? Hash) ? current_node.add(read_hsh(val, key, current_node)) : current_node[key] = val}
|
6
|
-
current_node
|
7
|
-
end
|
8
|
-
|
9
|
-
def read_str string
|
10
|
-
parse string
|
11
|
-
end
|
12
|
-
|
13
|
-
def read_uri uri
|
14
|
-
require 'open-uri'
|
15
|
-
require 'stringio'
|
16
|
-
require 'zlib'
|
17
|
-
|
18
|
-
begin
|
19
|
-
content = open(uri) {|u| u.read}
|
20
|
-
rescue
|
21
|
-
raise ReaderError, "Failed to open specified uri"
|
22
|
-
ensure
|
23
|
-
content = Zlib::GzipReader.new(StringIO.new(content)).read rescue content
|
24
|
-
end
|
25
|
-
|
26
|
-
parse content
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def parse content
|
32
|
-
current_node, node_stack = Node.new, []
|
33
|
-
multiline_mode, multiline_name, multiline_value = false, '', []
|
34
|
-
|
35
|
-
content.strip.each_line do |line|
|
36
|
-
line = line.chomp.extend StringExtensions
|
37
|
-
|
38
|
-
if multiline_mode
|
39
|
-
if line.end_of_attr?
|
40
|
-
multiline_value << line.rstrip.chomp('"')
|
41
|
-
multiline_value = multiline_value.join("\n")
|
42
|
-
current_node[multiline_name] = multiline_value
|
43
|
-
multiline_mode, multiline_name, multiline_value = false, '', []
|
44
|
-
else
|
45
|
-
multiline_value << line
|
46
|
-
end
|
47
|
-
elsif line.attribute?
|
48
|
-
if line.multiline_attr?
|
49
|
-
multiline_mode, multiline_name = true, line.attribute_name
|
50
|
-
multiline_value << line.attribute_value
|
51
|
-
else
|
52
|
-
current_node[line.attribute_name] = line.attribute_value
|
53
|
-
end
|
54
|
-
elsif line.opening_tag?
|
55
|
-
node_stack.push current_node
|
56
|
-
current_node = Node.create line.tag_name, node_stack.last
|
57
|
-
elsif line.closing_tag?
|
58
|
-
raise(ReaderError, "Opening tag '#{current_node.name}' does not match closing tag '#{line.tag_name}'") if current_node.name != line.tag_name
|
59
|
-
node_stack.last.add current_node
|
60
|
-
current_node = node_stack.pop
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
current_node
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
module Weskit::WML
|
2
|
-
module StringExtensions
|
3
|
-
VALID_CHARS = '[A-Za-z0-9_]'
|
4
|
-
|
5
|
-
def attribute_name
|
6
|
-
@values[0]
|
7
|
-
end
|
8
|
-
|
9
|
-
def attribute_value
|
10
|
-
@values[1]
|
11
|
-
end
|
12
|
-
|
13
|
-
def multiline_attr?
|
14
|
-
return true if include?('="') and (last_character != '"')
|
15
|
-
false
|
16
|
-
end
|
17
|
-
|
18
|
-
def end_of_attr?
|
19
|
-
return true if (last_character == '"')
|
20
|
-
false
|
21
|
-
end
|
22
|
-
|
23
|
-
def last_character
|
24
|
-
rstrip[-1,1]
|
25
|
-
end
|
26
|
-
|
27
|
-
def tag_name
|
28
|
-
@values[0]
|
29
|
-
end
|
30
|
-
|
31
|
-
def opening_tag?
|
32
|
-
wml_check(/^\[(#{VALID_CHARS}+?)\]$/)
|
33
|
-
end
|
34
|
-
|
35
|
-
def closing_tag?
|
36
|
-
wml_check(/^\[\/(#{VALID_CHARS}+?)\]$/)
|
37
|
-
end
|
38
|
-
|
39
|
-
def attribute?
|
40
|
-
# If there is unallowed char in fron of '=' line wont be considereda as an attribute
|
41
|
-
# Multiline attributes need to have double quotes next to equal sign
|
42
|
-
wml_check(/^(#{VALID_CHARS}+?)="?(.+?)"?$/)
|
43
|
-
end
|
44
|
-
|
45
|
-
private
|
46
|
-
|
47
|
-
def wml_check expression
|
48
|
-
matches = self.strip.match expression
|
49
|
-
|
50
|
-
if matches
|
51
|
-
@values = [matches[1], matches[2]]
|
52
|
-
return true
|
53
|
-
else
|
54
|
-
@values = [nil, nil]
|
55
|
-
return false
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|