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.
Files changed (73) hide show
  1. data/.gitignore +4 -3
  2. data/.rspec +1 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +2 -2
  5. data/LICENSE +339 -0
  6. data/README.md +135 -0
  7. data/Rakefile +4 -0
  8. data/lib/weskit/mp/adapter.rb +81 -0
  9. data/lib/weskit/mp/connection.rb +74 -0
  10. data/lib/weskit/mp/errors/error.rb +3 -0
  11. data/lib/weskit/mp/errors/response_error.rb +3 -0
  12. data/lib/weskit/mp/worker.rb +35 -0
  13. data/lib/weskit/mp.rb +13 -0
  14. data/lib/weskit/version.rb +1 -1
  15. data/lib/weskit/wml/attribute.rb +65 -0
  16. data/lib/weskit/wml/attributes.rb +16 -0
  17. data/lib/weskit/wml/builder.rb +66 -0
  18. data/lib/weskit/wml/element.rb +34 -0
  19. data/lib/weskit/wml/elements.rb +27 -0
  20. data/lib/weskit/wml/errors/error.rb +3 -0
  21. data/lib/weskit/wml/errors/invalid_identifier.rb +3 -0
  22. data/lib/weskit/wml/errors/invalid_item.rb +3 -0
  23. data/lib/weskit/wml/errors/invalid_option.rb +3 -0
  24. data/lib/weskit/wml/errors/invalid_parameters.rb +3 -0
  25. data/lib/weskit/wml/errors/parse_error.rb +3 -0
  26. data/lib/weskit/wml/errors/read_error.rb +3 -0
  27. data/lib/weskit/wml/extensions/object.rb +19 -0
  28. data/lib/weskit/wml/formatter.rb +82 -0
  29. data/lib/weskit/wml/formatters/ansi_color.rb +49 -0
  30. data/lib/weskit/wml/formatters/ansi_color_attribute.rb +31 -0
  31. data/lib/weskit/wml/formatters/ansi_color_element.rb +22 -0
  32. data/lib/weskit/wml/formatters/attribute.rb +62 -0
  33. data/lib/weskit/wml/formatters/element.rb +44 -0
  34. data/lib/weskit/wml/formatters/item_formatter.rb +17 -0
  35. data/lib/weskit/wml/grammars/wml.treetop +195 -0
  36. data/lib/weskit/wml/item.rb +89 -0
  37. data/lib/weskit/wml/items.rb +29 -0
  38. data/lib/weskit/wml/mixins/container.rb +96 -0
  39. data/lib/weskit/wml/mixins/grammar.rb +17 -0
  40. data/lib/weskit/wml/mixins/searchable.rb +43 -0
  41. data/lib/weskit/wml/mixins/validator.rb +29 -0
  42. data/lib/weskit/wml/parser.rb +47 -0
  43. data/lib/weskit/wml/root.rb +17 -0
  44. data/lib/weskit/wml/wml.rb +1580 -0
  45. data/lib/weskit/wml.rb +12 -6
  46. data/lib/weskit.rb +2 -2
  47. data/spec/spec_helper.rb +1 -0
  48. data/spec/wml/attribute_spec.rb +51 -0
  49. data/spec/wml/attributes_spec.rb +19 -0
  50. data/spec/wml/builder_spec.rb +52 -0
  51. data/spec/wml/element_spec.rb +20 -0
  52. data/spec/wml/elements_spec.rb +25 -0
  53. data/spec/wml/formatter_spec.rb +42 -0
  54. data/spec/wml/item_spec.rb +25 -0
  55. data/spec/wml/items_spec.rb +15 -0
  56. data/spec/wml/parser_spec.rb +60 -0
  57. data/spec/wml/root_spec.rb +15 -0
  58. data/spec/wml_helpers.rb +40 -0
  59. data/spec/wml_matchers.rb +17 -0
  60. data/spec/wml_shared_examples.rb +68 -0
  61. data/spec/wml_spec_helper.rb +5 -0
  62. data/weskit.gemspec +8 -5
  63. metadata +192 -50
  64. data/README +0 -2
  65. data/lib/weskit/lobby/bot.rb +0 -85
  66. data/lib/weskit/lobby/bot_error.rb +0 -3
  67. data/lib/weskit/lobby.rb +0 -11
  68. data/lib/weskit/wml/node.rb +0 -76
  69. data/lib/weskit/wml/node_array.rb +0 -25
  70. data/lib/weskit/wml/node_error.rb +0 -3
  71. data/lib/weskit/wml/reader.rb +0 -67
  72. data/lib/weskit/wml/reader_error.rb +0 -3
  73. 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
- hash: 27
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
- date: 2012-03-15 00:00:00 Z
19
- dependencies: []
20
-
21
- description: Pls do me a favor and do not look at sources if you dont have to. Thx!
22
- email:
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
- - README
121
+ - LICENSE
122
+ - README.md
34
123
  - Rakefile
35
124
  - lib/weskit.rb
36
- - lib/weskit/lobby.rb
37
- - lib/weskit/lobby/bot.rb
38
- - lib/weskit/lobby/bot_error.rb
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/node.rb
42
- - lib/weskit/wml/node_array.rb
43
- - lib/weskit/wml/node_error.rb
44
- - lib/weskit/wml/reader.rb
45
- - lib/weskit/wml/reader_error.rb
46
- - lib/weskit/wml/string_extensions.rb
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
- hash: 3
62
- segments:
187
+ requirements:
188
+ - - ! '>='
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ segments:
63
192
  - 0
64
- version: "0"
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
- hash: 3
71
- segments:
196
+ requirements:
197
+ - - ! '>='
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ segments:
72
201
  - 0
73
- version: "0"
202
+ hash: -4565766782065065646
74
203
  requirements: []
75
-
76
204
  rubyforge_project:
77
- rubygems_version: 1.8.11
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
@@ -1,2 +0,0 @@
1
- Pls do me a favor and do not look at sources if you dont have to. Thx!
2
-
@@ -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
@@ -1,3 +0,0 @@
1
- module Weskit::Lobby
2
- class BotError < StandardError ; end
3
- end
data/lib/weskit/lobby.rb DELETED
@@ -1,11 +0,0 @@
1
- module Weskit
2
- module Lobby
3
- end
4
- end
5
-
6
- directory = File.dirname __FILE__
7
- files = File.join directory, 'lobby', '*.rb'
8
-
9
- Dir[files].each do |file|
10
- require file
11
- end
@@ -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
@@ -1,3 +0,0 @@
1
- module Weskit::WML
2
- class NodeError < StandardError ; end
3
- end
@@ -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,3 +0,0 @@
1
- module Weskit::WML
2
- class ReaderError < StandardError ; end
3
- 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