weskit 0.2.1 → 0.3.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/README.markdown +10 -0
- data/Rakefile +1 -1
- data/lib/weskit/version.rb +1 -1
- data/lib/weskit/wml.rb +2 -1
- data/lib/weskit/wml/grammars/wml.kpeg +7 -7
- data/lib/weskit/wml/mixins/container.rb +2 -2
- data/lib/weskit/wml/mixins/validator.rb +4 -4
- data/lib/weskit/wml/parser.rb +14 -22
- data/lib/weskit/wml/{kpeg_parser.rb → parsers/kpeg.rb} +17 -17
- data/lib/weskit/wml/parsers/simple.rb +99 -0
- data/lib/weskit/wml/preprocessor.rb +27 -0
- data/spec/wml/parser_spec.rb +18 -31
- data/spec/wml/preprocessor_spec.rb +25 -0
- data/spec/wml_shared_examples.rb +87 -1
- metadata +73 -88
data/README.markdown
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
Weskit [](http://travis-ci.org/f6p/weskit)
|
2
|
+
====================================================================================================================
|
3
|
+
|
4
|
+
Weskit gem consists of tools for interaction with Wesnoth Markup Langage and Wesnoth infrastructure.
|
5
|
+
For more details please check out generated documentation and source code.
|
6
|
+
|
7
|
+
#### Modules
|
8
|
+
|
9
|
+
* MP - basic interaction with multiplayer server
|
10
|
+
* WML - parsing and manipulation of WML documents
|
data/Rakefile
CHANGED
@@ -7,6 +7,6 @@ task :default => :spec
|
|
7
7
|
namespace :parser do
|
8
8
|
desc 'Re-build KPEGParser'
|
9
9
|
task :rebuild do
|
10
|
-
puts %x(kpeg -fsvo lib/weskit/wml/
|
10
|
+
puts %x(kpeg -fsvo lib/weskit/wml/parsers/kpeg.rb lib/weskit/wml/grammars/wml.kpeg)
|
11
11
|
end
|
12
12
|
end
|
data/lib/weskit/version.rb
CHANGED
data/lib/weskit/wml.rb
CHANGED
@@ -13,5 +13,6 @@ w = Weskit::WML
|
|
13
13
|
w.require_all %w{validator grammar searchable container}, :mixins
|
14
14
|
w.require_all %w{object}, :extensions
|
15
15
|
w.require_all %w{error invalid_identifier invalid_item invalid_option invalid_parameters parse_error read_error}, :errors
|
16
|
+
w.require_all %w(kpeg simple), :parsers
|
16
17
|
w.require_all %w{item_formatter attribute element ansi_color ansi_color_attribute ansi_color_element}, :formatters
|
17
|
-
w.require_all %w{item items attribute attributes builder element elements formatter
|
18
|
+
w.require_all %w{item items attribute attributes builder element elements formatter preprocessor parser root}
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# Parser =======================================================================
|
2
2
|
|
3
3
|
%% header {
|
4
|
-
module Weskit::WML
|
4
|
+
module Weskit::WML::Parsers
|
5
5
|
}
|
6
6
|
|
7
|
-
%% name =
|
7
|
+
%% name = KPEG
|
8
8
|
|
9
9
|
%% {
|
10
10
|
attr_accessor :result
|
@@ -35,11 +35,11 @@ contents = items?:i { i.to_a }
|
|
35
35
|
# Attributes -------------------------------------------------------------------
|
36
36
|
|
37
37
|
single_attr = - id:n - '=' - val:v - eol
|
38
|
-
{ Attribute.new n, *v }
|
38
|
+
{ Weskit::WML::Attribute.new n, *v }
|
39
39
|
multiple_attrs = - ids:n - '=' - vals:v - eol
|
40
40
|
{ n.reduce(Array.new) do |attrs, name|
|
41
41
|
value =v.shift or [nil]
|
42
|
-
attrs << Attribute.new(name, *value)
|
42
|
+
attrs << Weskit::WML::Attribute.new(name, *value)
|
43
43
|
end }
|
44
44
|
|
45
45
|
attribute = blk_lines single_attr:a blk_lines { a }
|
@@ -64,9 +64,9 @@ vals = vals:v1 - ',' - vals:v2 { v1 + v2 }
|
|
64
64
|
# Elements ---------------------------------------------------------------------
|
65
65
|
|
66
66
|
amendment = - amending_tag:n - eol contents:c - closing_tag(n) - eol
|
67
|
-
{ Element.new(n, :amendment => true).push *c }
|
67
|
+
{ Weskit::WML::Element.new(n, :amendment => true).push *c }
|
68
68
|
regular = - opening_tag:n - eol contents:c - closing_tag(n) - eol
|
69
|
-
{ Element.new(n).push *c }
|
69
|
+
{ Weskit::WML::Element.new(n).push *c }
|
70
70
|
|
71
71
|
element = blk_lines (amendment | regular):e blk_lines { e }
|
72
72
|
|
@@ -88,4 +88,4 @@ blk_lines = (- eol)*
|
|
88
88
|
|
89
89
|
# Root -------------------------------------------------------------------------
|
90
90
|
|
91
|
-
root = contents:c { c.empty? ? nil : Root.new.push(*c) }
|
91
|
+
root = contents:c { c.empty? ? nil : Weskit::WML::Root.new.push(*c) }
|
@@ -5,7 +5,7 @@ module Weskit::WML::Mixins
|
|
5
5
|
extend Forwardable
|
6
6
|
include ::Weskit::WML::Mixins::Validator
|
7
7
|
|
8
|
-
def_delegators :contents, :each, :empty?, :first, :last, :size, :to_a
|
8
|
+
def_delegators :contents, :each, :empty?, :first, :last, :size, :to_a, :to_ary
|
9
9
|
|
10
10
|
def [] key
|
11
11
|
case key
|
@@ -93,4 +93,4 @@ module Weskit::WML::Mixins
|
|
93
93
|
contents.select {|i| i.is_a? constant}
|
94
94
|
end
|
95
95
|
end
|
96
|
-
end
|
96
|
+
end
|
@@ -10,20 +10,20 @@ module Weskit::WML::Mixins
|
|
10
10
|
|
11
11
|
def raise_if_invalid identifier
|
12
12
|
unless "#{identifier}".match identifier_pattern
|
13
|
-
raise ::Weskit::WML::Errors::InvalidIdentifier, "Invalid identifier"
|
13
|
+
raise ::Weskit::WML::Errors::InvalidIdentifier, "Invalid identifier: #{identifier}"
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
17
|
def raise_if_missing object, method
|
18
18
|
unless object.respond_to? "#{method}="
|
19
|
-
raise ::Weskit::WML::Errors::InvalidOption, "Object doesn't have #{method}"
|
19
|
+
raise ::Weskit::WML::Errors::InvalidOption, "Object doesn't have: #{method}"
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
private
|
24
24
|
|
25
25
|
def identifier_pattern
|
26
|
-
|
26
|
+
/^[a-z][a-z_0-9]*$/i
|
27
27
|
end
|
28
28
|
end
|
29
|
-
end
|
29
|
+
end
|
data/lib/weskit/wml/parser.rb
CHANGED
@@ -7,11 +7,11 @@ module Weskit::WML
|
|
7
7
|
private_class_method :new
|
8
8
|
|
9
9
|
class << self
|
10
|
-
def string str
|
11
|
-
parse str
|
10
|
+
def string str, bck = :kpeg
|
11
|
+
parse str, bck
|
12
12
|
end
|
13
13
|
|
14
|
-
def uri uri
|
14
|
+
def uri uri, bck = :kpeg
|
15
15
|
begin
|
16
16
|
str = open(uri).read
|
17
17
|
rescue
|
@@ -20,33 +20,25 @@ module Weskit::WML
|
|
20
20
|
str = Zlib::GzipReader.new(StringIO.new str).read rescue str
|
21
21
|
end
|
22
22
|
|
23
|
-
parse str
|
23
|
+
parse str, bck
|
24
24
|
end
|
25
25
|
|
26
26
|
private
|
27
27
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
28
|
+
def backends
|
29
|
+
{
|
30
|
+
:kpeg => Parsers::KPEG,
|
31
|
+
:simple => Parsers::Simple
|
32
|
+
}
|
33
|
+
end
|
31
34
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
35
|
+
def parse data, backend
|
36
|
+
data = Preprocessor.new(data).remove_directives
|
37
|
+
parser = backends[backend].new "#{data}\n"
|
36
38
|
|
39
|
+
parser.parse
|
37
40
|
parser.result
|
38
41
|
end
|
39
|
-
|
40
|
-
# It removes directives because:
|
41
|
-
# - prepreocessor isn't supported anyway
|
42
|
-
# - adding rules for directives hinders performance
|
43
|
-
# - it will remove lines nested inside multiline strings
|
44
|
-
# if they match preprocessor directive pattern
|
45
|
-
def remove_directives data
|
46
|
-
ary = data.split "\n"
|
47
|
-
ary.reject! {|i| i.match /\A\s*(\#|\{)/}
|
48
|
-
ary.join "\n"
|
49
|
-
end
|
50
42
|
end
|
51
43
|
end
|
52
44
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
module Weskit::WML
|
2
|
-
class
|
1
|
+
module Weskit::WML::Parsers
|
2
|
+
class KPEG
|
3
3
|
# :stopdoc:
|
4
4
|
|
5
5
|
# This is distinct from setup_parser so that a standalone parser
|
@@ -569,7 +569,7 @@ class KPEGParser
|
|
569
569
|
return _tmp
|
570
570
|
end
|
571
571
|
|
572
|
-
# single_attr = - id:n - "=" - val:v - eol { Attribute.new n, *v }
|
572
|
+
# single_attr = - id:n - "=" - val:v - eol { Weskit::WML::Attribute.new n, *v }
|
573
573
|
def _single_attr
|
574
574
|
|
575
575
|
_save = self.pos
|
@@ -616,7 +616,7 @@ class KPEGParser
|
|
616
616
|
self.pos = _save
|
617
617
|
break
|
618
618
|
end
|
619
|
-
@result = begin; Attribute.new n, *v ; end
|
619
|
+
@result = begin; Weskit::WML::Attribute.new n, *v ; end
|
620
620
|
_tmp = true
|
621
621
|
unless _tmp
|
622
622
|
self.pos = _save
|
@@ -628,7 +628,7 @@ class KPEGParser
|
|
628
628
|
return _tmp
|
629
629
|
end
|
630
630
|
|
631
|
-
# multiple_attrs = - ids:n - "=" - vals:v - eol { n.reduce(Array.new) do |attrs, name| value =v.shift or [nil] attrs << Attribute.new(name, *value) end }
|
631
|
+
# multiple_attrs = - ids:n - "=" - vals:v - eol { n.reduce(Array.new) do |attrs, name| value =v.shift or [nil] attrs << Weskit::WML::Attribute.new(name, *value) end }
|
632
632
|
def _multiple_attrs
|
633
633
|
|
634
634
|
_save = self.pos
|
@@ -677,7 +677,7 @@ class KPEGParser
|
|
677
677
|
end
|
678
678
|
@result = begin; n.reduce(Array.new) do |attrs, name|
|
679
679
|
value =v.shift or [nil]
|
680
|
-
attrs << Attribute.new(name, *value)
|
680
|
+
attrs << Weskit::WML::Attribute.new(name, *value)
|
681
681
|
end ; end
|
682
682
|
_tmp = true
|
683
683
|
unless _tmp
|
@@ -1085,7 +1085,7 @@ class KPEGParser
|
|
1085
1085
|
return _tmp
|
1086
1086
|
end
|
1087
1087
|
|
1088
|
-
# amendment = - amending_tag:n - eol contents:c - closing_tag(n) - eol { Element.new(n, :amendment => true).push *c }
|
1088
|
+
# amendment = - amending_tag:n - eol contents:c - closing_tag(n) - eol { Weskit::WML::Element.new(n, :amendment => true).push *c }
|
1089
1089
|
def _amendment
|
1090
1090
|
|
1091
1091
|
_save = self.pos
|
@@ -1137,7 +1137,7 @@ class KPEGParser
|
|
1137
1137
|
self.pos = _save
|
1138
1138
|
break
|
1139
1139
|
end
|
1140
|
-
@result = begin; Element.new(n, :amendment => true).push *c ; end
|
1140
|
+
@result = begin; Weskit::WML::Element.new(n, :amendment => true).push *c ; end
|
1141
1141
|
_tmp = true
|
1142
1142
|
unless _tmp
|
1143
1143
|
self.pos = _save
|
@@ -1149,7 +1149,7 @@ class KPEGParser
|
|
1149
1149
|
return _tmp
|
1150
1150
|
end
|
1151
1151
|
|
1152
|
-
# regular = - opening_tag:n - eol contents:c - closing_tag(n) - eol { Element.new(n).push *c }
|
1152
|
+
# regular = - opening_tag:n - eol contents:c - closing_tag(n) - eol { Weskit::WML::Element.new(n).push *c }
|
1153
1153
|
def _regular
|
1154
1154
|
|
1155
1155
|
_save = self.pos
|
@@ -1201,7 +1201,7 @@ class KPEGParser
|
|
1201
1201
|
self.pos = _save
|
1202
1202
|
break
|
1203
1203
|
end
|
1204
|
-
@result = begin; Element.new(n).push *c ; end
|
1204
|
+
@result = begin; Weskit::WML::Element.new(n).push *c ; end
|
1205
1205
|
_tmp = true
|
1206
1206
|
unless _tmp
|
1207
1207
|
self.pos = _save
|
@@ -1461,7 +1461,7 @@ class KPEGParser
|
|
1461
1461
|
return _tmp
|
1462
1462
|
end
|
1463
1463
|
|
1464
|
-
# root = contents:c { c.empty? ? nil : Root.new.push(*c) }
|
1464
|
+
# root = contents:c { c.empty? ? nil : Weskit::WML::Root.new.push(*c) }
|
1465
1465
|
def _root
|
1466
1466
|
|
1467
1467
|
_save = self.pos
|
@@ -1472,7 +1472,7 @@ class KPEGParser
|
|
1472
1472
|
self.pos = _save
|
1473
1473
|
break
|
1474
1474
|
end
|
1475
|
-
@result = begin; c.empty? ? nil : Root.new.push(*c) ; end
|
1475
|
+
@result = begin; c.empty? ? nil : Weskit::WML::Root.new.push(*c) ; end
|
1476
1476
|
_tmp = true
|
1477
1477
|
unless _tmp
|
1478
1478
|
self.pos = _save
|
@@ -1490,8 +1490,8 @@ class KPEGParser
|
|
1490
1490
|
Rules[:_item] = rule_info("item", "(attribute | attributes | element)")
|
1491
1491
|
Rules[:_items] = rule_info("items", "(items:i1 items:i2 { i1 + i2 } | item:i { (i.is_a? Array) ? i : [i] })")
|
1492
1492
|
Rules[:_contents] = rule_info("contents", "items?:i { i.to_a }")
|
1493
|
-
Rules[:_single_attr] = rule_info("single_attr", "- id:n - \"=\" - val:v - eol { Attribute.new n, *v }")
|
1494
|
-
Rules[:_multiple_attrs] = rule_info("multiple_attrs", "- ids:n - \"=\" - vals:v - eol { n.reduce(Array.new) do |attrs, name| value =v.shift or [nil] attrs << Attribute.new(name, *value) end }")
|
1493
|
+
Rules[:_single_attr] = rule_info("single_attr", "- id:n - \"=\" - val:v - eol { Weskit::WML::Attribute.new n, *v }")
|
1494
|
+
Rules[:_multiple_attrs] = rule_info("multiple_attrs", "- ids:n - \"=\" - vals:v - eol { n.reduce(Array.new) do |attrs, name| value =v.shift or [nil] attrs << Weskit::WML::Attribute.new(name, *value) end }")
|
1495
1495
|
Rules[:_attribute] = rule_info("attribute", "blk_lines single_attr:a blk_lines { a }")
|
1496
1496
|
Rules[:_attributes] = rule_info("attributes", "blk_lines multiple_attrs:a blk_lines { a }")
|
1497
1497
|
Rules[:_code] = rule_info("code", "< /<<.*?>>/m > { [strip_chars(text, 2), {:code => true}] }")
|
@@ -1502,8 +1502,8 @@ class KPEGParser
|
|
1502
1502
|
Rules[:_i18n] = rule_info("i18n", "\"_\" - (in_brackets | in_quotes):s { [s[0], {:translatable => true}] }")
|
1503
1503
|
Rules[:_val] = rule_info("val", "(val:v1 - \"+\" sp_lf val:v2 { v1[0] += v2[0] ; v1 } | escaped | i18n | code | in_brackets | in_quotes | raw)")
|
1504
1504
|
Rules[:_vals] = rule_info("vals", "(vals:v1 - \",\" - vals:v2 { v1 + v2 } | val:v { [v] })")
|
1505
|
-
Rules[:_amendment] = rule_info("amendment", "- amending_tag:n - eol contents:c - closing_tag(n) - eol { Element.new(n, :amendment => true).push *c }")
|
1506
|
-
Rules[:_regular] = rule_info("regular", "- opening_tag:n - eol contents:c - closing_tag(n) - eol { Element.new(n).push *c }")
|
1505
|
+
Rules[:_amendment] = rule_info("amendment", "- amending_tag:n - eol contents:c - closing_tag(n) - eol { Weskit::WML::Element.new(n, :amendment => true).push *c }")
|
1506
|
+
Rules[:_regular] = rule_info("regular", "- opening_tag:n - eol contents:c - closing_tag(n) - eol { Weskit::WML::Element.new(n).push *c }")
|
1507
1507
|
Rules[:_element] = rule_info("element", "blk_lines (amendment | regular):e blk_lines { e }")
|
1508
1508
|
Rules[:_amending_tag] = rule_info("amending_tag", "\"[+\" id:n \"]\" { n }")
|
1509
1509
|
Rules[:_closing_tag] = rule_info("closing_tag", "\"[/\" id:n \"]\" &{ n == m }")
|
@@ -1514,7 +1514,7 @@ class KPEGParser
|
|
1514
1514
|
Rules[:__hyphen_] = rule_info("-", "sp*")
|
1515
1515
|
Rules[:_sp_lf] = rule_info("sp_lf", "(sp | eol)*")
|
1516
1516
|
Rules[:_blk_lines] = rule_info("blk_lines", "(- eol)*")
|
1517
|
-
Rules[:_root] = rule_info("root", "contents:c { c.empty? ? nil : Root.new.push(*c) }")
|
1517
|
+
Rules[:_root] = rule_info("root", "contents:c { c.empty? ? nil : Weskit::WML::Root.new.push(*c) }")
|
1518
1518
|
# :startdoc:
|
1519
1519
|
end
|
1520
1520
|
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module Weskit::WML::Parsers
|
2
|
+
class Simple
|
3
|
+
attr_accessor :result
|
4
|
+
|
5
|
+
def initialize data
|
6
|
+
@data = data.to_s
|
7
|
+
end
|
8
|
+
|
9
|
+
def parse
|
10
|
+
root = Weskit::WML::Root.new
|
11
|
+
stack = []
|
12
|
+
current = root
|
13
|
+
|
14
|
+
lines.each do |line|
|
15
|
+
line.strip!
|
16
|
+
|
17
|
+
if attribute? line
|
18
|
+
current << Weskit::WML::Attribute.new(*current_attribute)
|
19
|
+
|
20
|
+
elsif amending_tag? line
|
21
|
+
stack.push current
|
22
|
+
current = Weskit::WML::Element.new(current_tag, :amendment => true)
|
23
|
+
|
24
|
+
elsif closing_tag? line
|
25
|
+
if current.name != current_tag
|
26
|
+
raise Weskit::WML::Errors::ParseError
|
27
|
+
end
|
28
|
+
stack.last << current
|
29
|
+
current = stack.pop
|
30
|
+
|
31
|
+
elsif opening_tag? line
|
32
|
+
stack.push current
|
33
|
+
current = Weskit::WML::Element.new(current_tag)
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
@result = root.empty? ? nil : root
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def lines
|
44
|
+
@data.lines.collect &:strip
|
45
|
+
end
|
46
|
+
|
47
|
+
def attribute? line
|
48
|
+
!!(@current_match = line.match attribute)
|
49
|
+
end
|
50
|
+
|
51
|
+
def tag? line, prefix
|
52
|
+
!!(@current_match = line.match tag(prefix))
|
53
|
+
end
|
54
|
+
|
55
|
+
def amending_tag? line
|
56
|
+
tag? line, '\+'
|
57
|
+
end
|
58
|
+
|
59
|
+
def closing_tag? line
|
60
|
+
tag? line, '\/'
|
61
|
+
end
|
62
|
+
|
63
|
+
def opening_tag? line
|
64
|
+
tag? line, ''
|
65
|
+
end
|
66
|
+
|
67
|
+
def data_rule
|
68
|
+
'(.+)'
|
69
|
+
end
|
70
|
+
|
71
|
+
def id_rule
|
72
|
+
'([a-z][0-9a-z_]*)'
|
73
|
+
end
|
74
|
+
|
75
|
+
def attribute
|
76
|
+
/#{id_rule}\s*=\s*_?\s*#{data_rule}/i
|
77
|
+
end
|
78
|
+
|
79
|
+
def tag prefix
|
80
|
+
/\[#{prefix}#{id_rule}\]/i
|
81
|
+
end
|
82
|
+
|
83
|
+
def current_attribute
|
84
|
+
tmp = @current_match[1..2].collect &:strip
|
85
|
+
|
86
|
+
tmp[0] = tmp.first.to_sym
|
87
|
+
|
88
|
+
tmp.last.gsub! /^"|"$/, ''
|
89
|
+
tmp.last.gsub! '""', '"'
|
90
|
+
tmp.last.strip!
|
91
|
+
|
92
|
+
tmp
|
93
|
+
end
|
94
|
+
|
95
|
+
def current_tag
|
96
|
+
@current_match[1].to_sym
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Weskit::WML
|
2
|
+
class Preprocessor
|
3
|
+
attr_reader :data
|
4
|
+
|
5
|
+
def initialize data
|
6
|
+
@data = data.to_s
|
7
|
+
end
|
8
|
+
|
9
|
+
def remove_directives
|
10
|
+
directives.reduce(@data) {|r, d| r.gsub d, ''}
|
11
|
+
end
|
12
|
+
|
13
|
+
def directives
|
14
|
+
[
|
15
|
+
/#define.+?#enddef/m,
|
16
|
+
/#undef.+/,
|
17
|
+
|
18
|
+
/#ifn?def.+?#endif/m,
|
19
|
+
/#ifn?have.+?#endif/m,
|
20
|
+
/#ifn?ver.+?#endif/m,
|
21
|
+
/#endif/,
|
22
|
+
|
23
|
+
/\{.*?\}/
|
24
|
+
]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/spec/wml/parser_spec.rb
CHANGED
@@ -3,48 +3,34 @@ require 'wml_spec_helper'
|
|
3
3
|
describe Weskit::WML::Parser do
|
4
4
|
include WMLHelpers
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
data = <<-DOC
|
9
|
-
{~/path/to.cfg}
|
10
|
-
#undef SOME_STUFF
|
11
|
-
DOC
|
6
|
+
context 'with KPEG backend' do
|
7
|
+
let(:backend) { :kpeg }
|
12
8
|
|
13
|
-
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
specify 'empty lines' do
|
18
|
-
parsed = Weskit::WML::Parser.string document_with_empty_lines
|
19
|
-
parsed.should_not be_nil
|
9
|
+
it_should_behave_like 'basic parser' do
|
10
|
+
let(:parser) { backend }
|
20
11
|
end
|
21
12
|
|
22
13
|
context 'attribute' do
|
23
|
-
specify 'raw' do
|
24
|
-
parsed = Weskit::WML::Parser.string 'a=b'
|
25
|
-
parsed[:a].should match_value_of(:b)
|
26
|
-
end
|
27
|
-
|
28
14
|
specify 'code' do
|
29
|
-
parsed = Weskit::WML::Parser.string ' a= <<b>> '
|
15
|
+
parsed = Weskit::WML::Parser.string ' a= <<b>> ', backend
|
30
16
|
parsed[:a].attribute.should be_code
|
31
17
|
parsed[:a].should match_value_of(:b)
|
32
18
|
end
|
33
19
|
|
34
20
|
specify 'concated' do
|
35
|
-
parsed = Weskit::WML::Parser.string ' a= _ "a" + 1 '
|
21
|
+
parsed = Weskit::WML::Parser.string ' a= _ "a" + 1 ', backend
|
36
22
|
parsed[:a].attribute.should be_translatable
|
37
23
|
parsed[:a].should match_value_of(:a1)
|
38
24
|
end
|
39
25
|
|
40
26
|
specify 'multiline' do
|
41
|
-
parsed = Weskit::WML::Parser.string %Q{a= "b \n c"}
|
27
|
+
parsed = Weskit::WML::Parser.string %Q{a= "b \n c"}, backend
|
42
28
|
parsed[:a].attribute.should be_multiline
|
43
29
|
parsed[:a].should match_value_of("b \n c")
|
44
30
|
end
|
45
31
|
|
46
32
|
specify 'multiple' do
|
47
|
-
parsed = Weskit::WML::Parser.string %Q{ a, b = _"a", <<b>> }
|
33
|
+
parsed = Weskit::WML::Parser.string %Q{ a, b = _"a", <<b>> }, backend
|
48
34
|
|
49
35
|
parsed[:a].attribute.should be_translatable
|
50
36
|
parsed[:a].should match_value_of(:a)
|
@@ -53,13 +39,8 @@ describe Weskit::WML::Parser do
|
|
53
39
|
parsed[:b].should match_value_of(:b)
|
54
40
|
end
|
55
41
|
|
56
|
-
specify 'escape sequence' do
|
57
|
-
parsed = Weskit::WML::Parser.string %Q{ a= "b "" c" }
|
58
|
-
parsed[:a].should match_value_of('b " c')
|
59
|
-
end
|
60
|
-
|
61
42
|
specify 'translatable' do
|
62
|
-
parsed = Weskit::WML::Parser.string ' a= _ "b" '
|
43
|
+
parsed = Weskit::WML::Parser.string ' a= _ "b" ', backend
|
63
44
|
parsed[:a].attribute.should be_translatable
|
64
45
|
parsed[:a].should match_value_of(:b)
|
65
46
|
end
|
@@ -67,14 +48,20 @@ describe Weskit::WML::Parser do
|
|
67
48
|
|
68
49
|
context 'element' do
|
69
50
|
specify 'default' do
|
70
|
-
parsed = Weskit::WML::Parser.string "[foo]\n[/foo]"
|
51
|
+
parsed = Weskit::WML::Parser.string "[foo]\n[/foo]", backend
|
71
52
|
parsed[0].should have_identifier_of(:foo)
|
72
53
|
end
|
73
54
|
|
74
55
|
specify 'amending' do
|
75
|
-
parsed = Weskit::WML::Parser.string document_with_amendment
|
56
|
+
parsed = Weskit::WML::Parser.string document_with_amendment, backend
|
76
57
|
parsed[0][:bat].should match_value_of(:baz)
|
77
58
|
end
|
78
59
|
end
|
79
60
|
end
|
80
|
-
|
61
|
+
|
62
|
+
context 'with Simple backend' do
|
63
|
+
it_should_behave_like 'basic parser' do
|
64
|
+
let(:parser) { :simple }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'wml_spec_helper'
|
2
|
+
|
3
|
+
describe Weskit::WML::Preprocessor do
|
4
|
+
specify 'removes directives' do
|
5
|
+
document = <<-DOC
|
6
|
+
#define TEST
|
7
|
+
a=b
|
8
|
+
#enddef
|
9
|
+
|
10
|
+
#undef TEST
|
11
|
+
{TEST}
|
12
|
+
|
13
|
+
#ifdef TEST
|
14
|
+
{TEST}
|
15
|
+
#else
|
16
|
+
#ifdef BAR
|
17
|
+
{BAR}
|
18
|
+
#endif
|
19
|
+
#endif
|
20
|
+
DOC
|
21
|
+
|
22
|
+
preprocessed = Weskit::WML::Preprocessor.new(document).remove_directives
|
23
|
+
preprocessed.strip.should be_empty
|
24
|
+
end
|
25
|
+
end
|
data/spec/wml_shared_examples.rb
CHANGED
@@ -43,6 +43,49 @@ shared_examples_for 'a container' do
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
shared_examples_for 'basic parser' do
|
47
|
+
context 'ignores' do
|
48
|
+
specify 'directives' do
|
49
|
+
data = <<-DOC
|
50
|
+
{~/path/to.cfg}
|
51
|
+
#undef SOME_STUFF
|
52
|
+
DOC
|
53
|
+
|
54
|
+
parsed = Weskit::WML::Parser.string data, parser
|
55
|
+
parsed.should be_nil
|
56
|
+
end
|
57
|
+
|
58
|
+
specify 'blank lines' do
|
59
|
+
parsed = Weskit::WML::Parser.string document_with_empty_lines, parser
|
60
|
+
parsed.should_not be_nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'attribute' do
|
65
|
+
specify 'raw' do
|
66
|
+
parsed = Weskit::WML::Parser.string 'a=b', parser
|
67
|
+
parsed[:a].should match_value_of(:b)
|
68
|
+
end
|
69
|
+
|
70
|
+
specify 'escape sequence' do
|
71
|
+
parsed = Weskit::WML::Parser.string %Q{ a= "b "" c" }, parser
|
72
|
+
parsed[:a].should match_value_of('b " c')
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'element' do
|
77
|
+
specify 'default' do
|
78
|
+
parsed = Weskit::WML::Parser.string "[foo]\n[/foo]", parser
|
79
|
+
parsed[0].should have_identifier_of(:foo)
|
80
|
+
end
|
81
|
+
|
82
|
+
specify 'amending' do
|
83
|
+
parsed = Weskit::WML::Parser.string document_with_amendment, parser
|
84
|
+
parsed[0][:bat].should match_value_of(:baz)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
46
89
|
shared_examples_for 'a searchable' do
|
47
90
|
specify 'append amending elements' do
|
48
91
|
searchable << Weskit::WML::Element.new(:bar)
|
@@ -65,4 +108,47 @@ shared_examples_for 'a searchable' do
|
|
65
108
|
item.name == :b
|
66
109
|
end.size.should eq(2)
|
67
110
|
end
|
68
|
-
end
|
111
|
+
end
|
112
|
+
|
113
|
+
shared_examples_for 'basic parser' do
|
114
|
+
context 'ignores' do
|
115
|
+
specify 'directives' do
|
116
|
+
data = <<-DOC
|
117
|
+
{~/path/to.cfg}
|
118
|
+
#undef SOME_STUFF
|
119
|
+
DOC
|
120
|
+
|
121
|
+
parsed = Weskit::WML::Parser.string data, parser
|
122
|
+
parsed.should be_nil
|
123
|
+
end
|
124
|
+
|
125
|
+
specify 'blank lines' do
|
126
|
+
parsed = Weskit::WML::Parser.string document_with_empty_lines, parser
|
127
|
+
parsed.should_not be_nil
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context 'attribute' do
|
132
|
+
specify 'raw' do
|
133
|
+
parsed = Weskit::WML::Parser.string 'a=b', parser
|
134
|
+
parsed[:a].should match_value_of(:b)
|
135
|
+
end
|
136
|
+
|
137
|
+
specify 'escape sequence' do
|
138
|
+
parsed = Weskit::WML::Parser.string %Q{ a= "b "" c" }, parser
|
139
|
+
parsed[:a].should match_value_of('b " c')
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'element' do
|
144
|
+
specify 'default' do
|
145
|
+
parsed = Weskit::WML::Parser.string "[foo]\n[/foo]", parser
|
146
|
+
parsed[0].should have_identifier_of(:foo)
|
147
|
+
end
|
148
|
+
|
149
|
+
specify 'amending' do
|
150
|
+
parsed = Weskit::WML::Parser.string document_with_amendment, parser
|
151
|
+
parsed[0][:bat].should match_value_of(:baz)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
metadata
CHANGED
@@ -1,102 +1,93 @@
|
|
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.3.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
- 1
|
10
|
-
version: 0.2.1
|
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
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-11-13 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: kpeg
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
18
|
+
requirements:
|
26
19
|
- - ~>
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 55
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
- 10
|
32
|
-
- 0
|
20
|
+
- !ruby/object:Gem::Version
|
33
21
|
version: 0.10.0
|
34
22
|
type: :development
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: rake
|
38
23
|
prerelease: false
|
39
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
25
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.10.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
|
50
37
|
version: 0.9.2.2
|
51
38
|
type: :development
|
52
|
-
version_requirements: *id002
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: rspec
|
55
39
|
prerelease: false
|
56
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.9.2.2
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
57
49
|
none: false
|
58
|
-
requirements:
|
50
|
+
requirements:
|
59
51
|
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
hash: 35
|
62
|
-
segments:
|
63
|
-
- 2
|
64
|
-
- 11
|
65
|
-
- 0
|
52
|
+
- !ruby/object:Gem::Version
|
66
53
|
version: 2.11.0
|
67
54
|
type: :development
|
68
|
-
version_requirements: *id003
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: term-ansicolor
|
71
55
|
prerelease: false
|
72
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
57
|
none: false
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.11.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: term-ansicolor
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
82
69
|
version: 1.0.7
|
83
70
|
type: :runtime
|
84
|
-
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.0.7
|
85
78
|
description: Tools for interacting with Wesnoth Markup Language, MP Server and such.
|
86
|
-
email:
|
79
|
+
email:
|
87
80
|
- filip.pyda@gmail.com
|
88
81
|
executables: []
|
89
|
-
|
90
82
|
extensions: []
|
91
|
-
|
92
83
|
extra_rdoc_files: []
|
93
|
-
|
94
|
-
files:
|
84
|
+
files:
|
95
85
|
- .gitignore
|
96
86
|
- .rspec
|
97
87
|
- .travis.yml
|
98
88
|
- Gemfile
|
99
89
|
- LICENSE
|
90
|
+
- README.markdown
|
100
91
|
- README.md
|
101
92
|
- Rakefile
|
102
93
|
- lib/weskit.rb
|
@@ -131,12 +122,14 @@ files:
|
|
131
122
|
- lib/weskit/wml/grammars/wml.kpeg
|
132
123
|
- lib/weskit/wml/item.rb
|
133
124
|
- lib/weskit/wml/items.rb
|
134
|
-
- lib/weskit/wml/kpeg_parser.rb
|
135
125
|
- lib/weskit/wml/mixins/container.rb
|
136
126
|
- lib/weskit/wml/mixins/grammar.rb
|
137
127
|
- lib/weskit/wml/mixins/searchable.rb
|
138
128
|
- lib/weskit/wml/mixins/validator.rb
|
139
129
|
- lib/weskit/wml/parser.rb
|
130
|
+
- lib/weskit/wml/parsers/kpeg.rb
|
131
|
+
- lib/weskit/wml/parsers/simple.rb
|
132
|
+
- lib/weskit/wml/preprocessor.rb
|
140
133
|
- lib/weskit/wml/root.rb
|
141
134
|
- spec/spec_helper.rb
|
142
135
|
- spec/wml/attribute_spec.rb
|
@@ -148,6 +141,7 @@ files:
|
|
148
141
|
- spec/wml/item_spec.rb
|
149
142
|
- spec/wml/items_spec.rb
|
150
143
|
- spec/wml/parser_spec.rb
|
144
|
+
- spec/wml/preprocessor_spec.rb
|
151
145
|
- spec/wml/root_spec.rb
|
152
146
|
- spec/wml_helpers.rb
|
153
147
|
- spec/wml_matchers.rb
|
@@ -156,38 +150,29 @@ files:
|
|
156
150
|
- weskit.gemspec
|
157
151
|
homepage: https://github.com/f6p/weskit
|
158
152
|
licenses: []
|
159
|
-
|
160
153
|
post_install_message:
|
161
154
|
rdoc_options: []
|
162
|
-
|
163
|
-
require_paths:
|
155
|
+
require_paths:
|
164
156
|
- lib
|
165
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
157
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
166
158
|
none: false
|
167
|
-
requirements:
|
168
|
-
- -
|
169
|
-
- !ruby/object:Gem::Version
|
170
|
-
|
171
|
-
|
172
|
-
- 0
|
173
|
-
version: "0"
|
174
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
|
+
requirements:
|
160
|
+
- - ! '>='
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: '0'
|
163
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
164
|
none: false
|
176
|
-
requirements:
|
177
|
-
- -
|
178
|
-
- !ruby/object:Gem::Version
|
179
|
-
|
180
|
-
segments:
|
181
|
-
- 0
|
182
|
-
version: "0"
|
165
|
+
requirements:
|
166
|
+
- - ! '>='
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '0'
|
183
169
|
requirements: []
|
184
|
-
|
185
170
|
rubyforge_project:
|
186
|
-
rubygems_version: 1.8.
|
171
|
+
rubygems_version: 1.8.24
|
187
172
|
signing_key:
|
188
173
|
specification_version: 3
|
189
174
|
summary: Ruby utilies for BfW
|
190
|
-
test_files:
|
175
|
+
test_files:
|
191
176
|
- spec/spec_helper.rb
|
192
177
|
- spec/wml/attribute_spec.rb
|
193
178
|
- spec/wml/attributes_spec.rb
|
@@ -198,9 +183,9 @@ test_files:
|
|
198
183
|
- spec/wml/item_spec.rb
|
199
184
|
- spec/wml/items_spec.rb
|
200
185
|
- spec/wml/parser_spec.rb
|
186
|
+
- spec/wml/preprocessor_spec.rb
|
201
187
|
- spec/wml/root_spec.rb
|
202
188
|
- spec/wml_helpers.rb
|
203
189
|
- spec/wml_matchers.rb
|
204
190
|
- spec/wml_shared_examples.rb
|
205
191
|
- spec/wml_spec_helper.rb
|
206
|
-
has_rdoc:
|