weskit 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 [![Build Status](https://secure.travis-ci.org/f6p/weskit.png?branch=master)](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:
|