weskit 0.0.2 → 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.
- 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
|