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 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/kpeg_parser.rb lib/weskit/wml/grammars/wml.kpeg)
10
+ puts %x(kpeg -fsvo lib/weskit/wml/parsers/kpeg.rb lib/weskit/wml/grammars/wml.kpeg)
11
11
  end
12
12
  end
@@ -1,3 +1,3 @@
1
1
  module Weskit
2
- VERSION = '0.2.1'
2
+ VERSION = '0.3.0'
3
3
  end
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 kpeg_parser parser root}
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 = KPEGParser
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
- %r{^[a-z][a-z_0-9]*$}
26
+ /^[a-z][a-z_0-9]*$/i
27
27
  end
28
28
  end
29
- end
29
+ end
@@ -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 parse data
29
- data = remove_directives data
30
- parser = KPEGParser.new "#{data}\n"
28
+ def backends
29
+ {
30
+ :kpeg => Parsers::KPEG,
31
+ :simple => Parsers::Simple
32
+ }
33
+ end
31
34
 
32
- unless parser.parse
33
- msg = "#{parser.failure_character} #{parser.failure_info}"
34
- raise Errors::ParseError, msg
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 KPEGParser
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
@@ -3,48 +3,34 @@ require 'wml_spec_helper'
3
3
  describe Weskit::WML::Parser do
4
4
  include WMLHelpers
5
5
 
6
- describe 'parse' do
7
- specify 'ignore preprocessor' do
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
- parsed = Weskit::WML::Parser.string data
14
- parsed.should be_nil
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
- end
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
@@ -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
- hash: 21
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
- date: 2012-10-10 00:00:00 Z
19
- dependencies:
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
- prerelease: false
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
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
40
25
  none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- hash: 11
45
- segments:
46
- - 0
47
- - 9
48
- - 2
49
- - 2
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
- requirement: &id003 !ruby/object:Gem::Requirement
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
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
73
57
  none: false
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- hash: 25
78
- segments:
79
- - 1
80
- - 0
81
- - 7
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
- version_requirements: *id004
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
- hash: 3
171
- segments:
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
- hash: 3
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.11
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: