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 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: