wml_action 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,318 @@
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.4.11
4
+ # from Racc grammer file "".
5
+ #
6
+
7
+ require 'racc/parser.rb'
8
+
9
+ #
10
+ # generated by racc
11
+ #
12
+ require 'wml_action/lexer.rex'
13
+ require 'wml_action/tag'
14
+ require 'wml_action/log'
15
+
16
+ module WMLAction
17
+ class Parser < Racc::Parser
18
+
19
+ module_eval(<<'...end parser.y/module_eval...', 'parser.y', 49)
20
+ include Log
21
+
22
+ ...end parser.y/module_eval...
23
+ ##### State transition tables begin ###
24
+
25
+ racc_action_table = [
26
+ 4, 8, 14, 16, 17, 18, 22, 24, 25, 26,
27
+ 27, 29, 19, 4, 18, 21, 4, 7, 5, 30,
28
+ 31, 32 ]
29
+
30
+ racc_action_check = [
31
+ 6, 6, 6, 6, 6, 6, 18, 18, 18, 18,
32
+ 18, 19, 6, 15, 19, 15, 0, 5, 1, 23,
33
+ 27, 30 ]
34
+
35
+ racc_action_pointer = [
36
+ 14, 18, nil, nil, nil, 17, -2, nil, nil, nil,
37
+ nil, nil, nil, nil, nil, 11, nil, nil, -2, 7,
38
+ nil, nil, nil, 6, nil, nil, nil, 9, nil, nil,
39
+ 12, nil, nil ]
40
+
41
+ racc_action_default = [
42
+ -1, -26, -2, -3, -5, -26, -26, 33, -4, -6,
43
+ -7, -8, -9, -10, -11, -26, -14, -15, -16, -26,
44
+ -12, -13, -17, -18, -19, -20, -21, -26, -24, -25,
45
+ -26, -22, -23 ]
46
+
47
+ racc_goto_table = [
48
+ 3, 12, 10, 6, 9, 1, 11, 2, 13, 15,
49
+ 23, nil, nil, nil, 28, 20 ]
50
+
51
+ racc_goto_check = [
52
+ 3, 7, 6, 4, 5, 1, 3, 2, 8, 9,
53
+ 10, nil, nil, nil, 7, 3 ]
54
+
55
+ racc_goto_pointer = [
56
+ nil, 5, 7, 0, -1, -2, -4, -5, 2, 3,
57
+ -8 ]
58
+
59
+ racc_goto_default = [
60
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
61
+ nil ]
62
+
63
+ racc_reduce_table = [
64
+ 0, 0, :racc_error,
65
+ 0, 16, :_reduce_none,
66
+ 1, 16, :_reduce_2,
67
+ 1, 17, :_reduce_3,
68
+ 3, 18, :_reduce_4,
69
+ 0, 19, :_reduce_5,
70
+ 2, 19, :_reduce_6,
71
+ 1, 20, :_reduce_none,
72
+ 1, 20, :_reduce_8,
73
+ 1, 20, :_reduce_none,
74
+ 1, 20, :_reduce_none,
75
+ 1, 20, :_reduce_11,
76
+ 2, 21, :_reduce_12,
77
+ 2, 21, :_reduce_13,
78
+ 1, 24, :_reduce_none,
79
+ 1, 24, :_reduce_none,
80
+ 1, 22, :_reduce_16,
81
+ 2, 22, :_reduce_17,
82
+ 2, 22, :_reduce_18,
83
+ 2, 22, :_reduce_19,
84
+ 2, 22, :_reduce_20,
85
+ 1, 25, :_reduce_21,
86
+ 2, 25, :_reduce_22,
87
+ 3, 25, :_reduce_23,
88
+ 2, 23, :_reduce_24,
89
+ 2, 23, :_reduce_25 ]
90
+
91
+ racc_reduce_n = 26
92
+
93
+ racc_shift_n = 33
94
+
95
+ racc_token_table = {
96
+ false => 0,
97
+ :error => 1,
98
+ :OTAG => 2,
99
+ :CTAG => 3,
100
+ :MACRO => 4,
101
+ "+" => 5,
102
+ "-" => 6,
103
+ :ATTR => 7,
104
+ :APLAIN => 8,
105
+ :AMACRO => 9,
106
+ :ANUMBER => 10,
107
+ :ASTR => 11,
108
+ :UNDERSC => 12,
109
+ :APLUS => 13,
110
+ :SLASH => 14 }
111
+
112
+ racc_nt_base = 15
113
+
114
+ racc_use_result_var = true
115
+
116
+ Racc_arg = [
117
+ racc_action_table,
118
+ racc_action_check,
119
+ racc_action_default,
120
+ racc_action_pointer,
121
+ racc_goto_table,
122
+ racc_goto_check,
123
+ racc_goto_default,
124
+ racc_goto_pointer,
125
+ racc_nt_base,
126
+ racc_reduce_table,
127
+ racc_token_table,
128
+ racc_shift_n,
129
+ racc_reduce_n,
130
+ racc_use_result_var ]
131
+
132
+ Racc_token_to_s_table = [
133
+ "$end",
134
+ "error",
135
+ "OTAG",
136
+ "CTAG",
137
+ "MACRO",
138
+ "\"+\"",
139
+ "\"-\"",
140
+ "ATTR",
141
+ "APLAIN",
142
+ "AMACRO",
143
+ "ANUMBER",
144
+ "ASTR",
145
+ "UNDERSC",
146
+ "APLUS",
147
+ "SLASH",
148
+ "$start",
149
+ "target",
150
+ "wml_doc",
151
+ "tag",
152
+ "contents",
153
+ "content",
154
+ "action",
155
+ "attribute",
156
+ "filter",
157
+ "aop",
158
+ "string_val" ]
159
+
160
+ Racc_debug_parser = false
161
+
162
+ ##### State transition tables end #####
163
+
164
+ # reduce 0 omitted
165
+
166
+ # reduce 1 omitted
167
+
168
+ module_eval(<<'.,.,', 'parser.y', 3)
169
+ def _reduce_2(val, _values, result)
170
+ log.debug 'Found a target'
171
+ result
172
+ end
173
+ .,.,
174
+
175
+ module_eval(<<'.,.,', 'parser.y', 5)
176
+ def _reduce_3(val, _values, result)
177
+ log.debug 'Found a doc'
178
+ result
179
+ end
180
+ .,.,
181
+
182
+ module_eval(<<'.,.,', 'parser.y', 7)
183
+ def _reduce_4(val, _values, result)
184
+ log.debug("Creating tag #{val[0]}"); return Tag.new(name: val[0], content: val[1])
185
+ result
186
+ end
187
+ .,.,
188
+
189
+ module_eval(<<'.,.,', 'parser.y', 9)
190
+ def _reduce_5(val, _values, result)
191
+ return []
192
+ result
193
+ end
194
+ .,.,
195
+
196
+ module_eval(<<'.,.,', 'parser.y', 10)
197
+ def _reduce_6(val, _values, result)
198
+ log.debug("Append #{val[1]} to #{val[0]}"); return val[0]? val[0].push(val[1]) : [val[1]]
199
+ result
200
+ end
201
+ .,.,
202
+
203
+ # reduce 7 omitted
204
+
205
+ module_eval(<<'.,.,', 'parser.y', 13)
206
+ def _reduce_8(val, _values, result)
207
+ log.debug "Found a content subtag #{val[0]}"
208
+ result
209
+ end
210
+ .,.,
211
+
212
+ # reduce 9 omitted
213
+
214
+ # reduce 10 omitted
215
+
216
+ module_eval(<<'.,.,', 'parser.y', 16)
217
+ def _reduce_11(val, _values, result)
218
+ log.debug "Found a macro #{val[0]}"; return Tag::Macro[val[0]]
219
+ result
220
+ end
221
+ .,.,
222
+
223
+ module_eval(<<'.,.,', 'parser.y', 18)
224
+ def _reduce_12(val, _values, result)
225
+ log.debug "Found a action tag #{val[0]}:#{val[1]}"; return Tag::Action[val[1],val[0]]
226
+ result
227
+ end
228
+ .,.,
229
+
230
+ module_eval(<<'.,.,', 'parser.y', 19)
231
+ def _reduce_13(val, _values, result)
232
+ log.debug "Found a action mac #{val[0]}:#{val[1]}"; return Tag::Action[Tag::Macro[val[1]],val[0]]
233
+ result
234
+ end
235
+ .,.,
236
+
237
+ # reduce 14 omitted
238
+
239
+ # reduce 15 omitted
240
+
241
+ module_eval(<<'.,.,', 'parser.y', 24)
242
+ def _reduce_16(val, _values, result)
243
+ log.debug "Found empty attribute: #{val[0]}"; return Tag::Attribute[val[0],'']
244
+ result
245
+ end
246
+ .,.,
247
+
248
+ module_eval(<<'.,.,', 'parser.y', 25)
249
+ def _reduce_17(val, _values, result)
250
+ log.debug "Found plain attribute: #{val[0]}:#{val[1]}"; return Tag::Attribute[val[0],val[1]]
251
+ result
252
+ end
253
+ .,.,
254
+
255
+ module_eval(<<'.,.,', 'parser.y', 26)
256
+ def _reduce_18(val, _values, result)
257
+ log.debug "Found string attribute: #{val[0]}:#{val[1]}"; return Tag::Attribute[val[0],val[1]]
258
+ result
259
+ end
260
+ .,.,
261
+
262
+ module_eval(<<'.,.,', 'parser.y', 27)
263
+ def _reduce_19(val, _values, result)
264
+ log.debug "Found macro attribute: #{val[0]}:#{val[1]}"; return Tag::Attribute[val[0],val[1]]
265
+ result
266
+ end
267
+ .,.,
268
+
269
+ module_eval(<<'.,.,', 'parser.y', 28)
270
+ def _reduce_20(val, _values, result)
271
+ log.debug "Found numeric attribute: #{val[0]}:#{val[1]}"; return Tag::Attribute[val[0],val[1]]
272
+ result
273
+ end
274
+ .,.,
275
+
276
+ module_eval(<<'.,.,', 'parser.y', 30)
277
+ def _reduce_21(val, _values, result)
278
+ return " #{val[0]}"
279
+ result
280
+ end
281
+ .,.,
282
+
283
+ module_eval(<<'.,.,', 'parser.y', 31)
284
+ def _reduce_22(val, _values, result)
285
+ return ' '+val[0]+' '+val[1]
286
+ result
287
+ end
288
+ .,.,
289
+
290
+ module_eval(<<'.,.,', 'parser.y', 32)
291
+ def _reduce_23(val, _values, result)
292
+ return val[0] + '+' + val[2]
293
+ result
294
+ end
295
+ .,.,
296
+
297
+ module_eval(<<'.,.,', 'parser.y', 34)
298
+ def _reduce_24(val, _values, result)
299
+ log.debug "Found an attribute filter #{val[1]}"; return Tag::Filter[val[1]]
300
+ result
301
+ end
302
+ .,.,
303
+
304
+ module_eval(<<'.,.,', 'parser.y', 35)
305
+ def _reduce_25(val, _values, result)
306
+ log.debug "Found a macro filter #{val[1]}"; return Tag::Filter[Tag::Macro[val[1]]]
307
+ result
308
+ end
309
+ .,.,
310
+
311
+ def _reduce_none(val, _values, result)
312
+ val[0]
313
+ end
314
+
315
+ end # class Parser
316
+ end # module WMLAction
317
+
318
+
@@ -0,0 +1,52 @@
1
+ class WMLAction::Parser
2
+ rule
3
+ target : /* nothing */
4
+ | wml_doc { log.debug 'Found a target' }
5
+
6
+ wml_doc : tag { log.debug 'Found a doc' }
7
+
8
+ tag : OTAG contents CTAG { log.debug("Creating tag #{val[0]}"); return Tag.new(name: val[0], content: val[1]) }
9
+
10
+ contents : /* nothing */ { return [] }
11
+ | contents content { log.debug("Append #{val[1]} to #{val[0]}"); return val[0]? val[0].push(val[1]) : [val[1]] }
12
+
13
+ content : action
14
+ | tag { log.debug "Found a content subtag #{val[0]}" }
15
+ | attribute
16
+ | filter
17
+ | MACRO { log.debug "Found a macro #{val[0]}"; return Tag::Macro[val[0]] }
18
+
19
+ action : aop tag { log.debug "Found a action tag #{val[0]}:#{val[1]}"; return Tag::Action[val[1],val[0]] }
20
+ | aop MACRO { log.debug "Found a action mac #{val[0]}:#{val[1]}"; return Tag::Action[Tag::Macro[val[1]],val[0]] }
21
+
22
+ aop : '+'
23
+ | '-'
24
+
25
+ attribute : ATTR { log.debug "Found empty attribute: #{val[0]}"; return Tag::Attribute[val[0],''] }
26
+ | ATTR APLAIN { log.debug "Found plain attribute: #{val[0]}:#{val[1]}"; return Tag::Attribute[val[0],val[1]] }
27
+ | ATTR string_val { log.debug "Found string attribute: #{val[0]}:#{val[1]}"; return Tag::Attribute[val[0],val[1]] }
28
+ | ATTR AMACRO { log.debug "Found macro attribute: #{val[0]}:#{val[1]}"; return Tag::Attribute[val[0],val[1]] }
29
+ | ATTR ANUMBER { log.debug "Found numeric attribute: #{val[0]}:#{val[1]}"; return Tag::Attribute[val[0],val[1]] }
30
+
31
+ string_val : ASTR { return " #{val[0]}" }
32
+ | UNDERSC ASTR { return ' '+val[0]+' '+val[1] }
33
+ | string_val APLUS AMACRO { return val[0] + '+' + val[2] }
34
+
35
+ filter : SLASH attribute { log.debug "Found an attribute filter #{val[1]}"; return Tag::Filter[val[1]] }
36
+ | SLASH MACRO { log.debug "Found a macro filter #{val[1]}"; return Tag::Filter[Tag::Macro[val[1]]] }
37
+
38
+ end
39
+
40
+ ---- header ----
41
+ #
42
+ # generated by racc
43
+ #
44
+ require 'wml_action/lexer.rex'
45
+ require 'wml_action/tag'
46
+ require 'wml_action/log'
47
+
48
+ ---- inner ----
49
+ include Log
50
+
51
+ ---- footer ----
52
+
@@ -0,0 +1,144 @@
1
+ require 'wml_action/log'
2
+ require 'set'
3
+
4
+ module WMLAction
5
+ class Tag
6
+ include Log
7
+
8
+ attr_accessor :name,:subs,:attrs,:macros,:filter, :actions
9
+
10
+ Attribute = Struct.new(:name, :value) do
11
+ def to_s(indent=0, dummy=0)
12
+ "#{name}=#{value}"
13
+ end
14
+ end
15
+
16
+ Macro = Struct.new(:value) do
17
+ def to_s(indent=0, dummy=0)
18
+ value.to_s
19
+ end
20
+ end
21
+
22
+ Action = Struct.new(:object, :action) do
23
+ def to_s(indent=0, dummy=0)
24
+ "#{action} #{object.to_s(indent,0)}"
25
+ end
26
+ end
27
+
28
+ Filter = Struct.new(:value) do
29
+ def to_s(indent=0, dummy=0)
30
+ "/ #{ value }"
31
+ end
32
+ end
33
+
34
+ def initialize(values={})
35
+ @name=values[:name]||""
36
+ @subs=values[:subs]||Array.new
37
+ @attrs=values[:attrs]||Hash.new
38
+ @macros=values[:macros]||Set.new
39
+ @filter=values[:filter]||Array.new
40
+ @actions=values[:actions]||Array.new
41
+ load_content( values[:content] ) if values.key? :content
42
+ end
43
+
44
+ def <<(content)
45
+ case content
46
+ when Action then @actions << content
47
+ when Attribute then @attrs.merge!( Hash[*content] )
48
+ when Macro then @macros.add( content.value )
49
+ when Filter then @filter << content.value
50
+ when Tag then @subs << content
51
+ else raise TypeError.new("Can not add #{content.class}: #{content} to a Tag")
52
+ end
53
+ return self
54
+ end
55
+
56
+ def load_content(contents)
57
+ contents.each { |c| self<<c }
58
+ end
59
+
60
+ def to_s(indent=0,indent_first_line=1)
61
+ i=indent
62
+ t="\t"
63
+ ifl=indent_first_line
64
+ return <<-EOS.gsub(/^\s+\|/, '').gsub(/^$\n/,'')
65
+ |#{t*i*ifl}[#{@name}]
66
+ |#{(@filter.map { |f| "#{t*(i+1)}/ #{f}" }).join("\n")}
67
+ |#{(@actions.map { |a| "#{t*(i+1)}#{a.to_s(i+1)}" }).join("\n")}
68
+ |#{(@attrs.map { |k,v| "#{t*(i+1)}#{k}=#{v}" }).join("\n")}
69
+ |#{(@macros.map { |m| "#{t*(i+1)}#{m}" }).join("\n")}
70
+ |#{(@subs.map { |s| "#{s.to_s(i+1)}" }).join("\n")}
71
+ |#{t*i}[/#{@name}]
72
+ EOS
73
+ end
74
+
75
+ def merge(other)
76
+ return self unless @name == other.name
77
+ return self unless match?( other.filter )
78
+ log.info "Merging [#{@name}] section with [#{other.name}] with filter: #{other.filter}"
79
+ other.attrs.each_pair do |key,value|
80
+ log.debug "Processing key: #{key}=#{value}"
81
+ @attrs.store(key,value)
82
+ end
83
+ other.macros.each do |macro|
84
+ log.debug "Adding macro: #{macro}"
85
+ @macros<<(macro)
86
+ end
87
+ other.subs.each do |other_sub|
88
+ @subs.map { |sub| sub.merge(other_sub) }
89
+ end
90
+ other.actions.each do |a|
91
+ case a.action
92
+ when '+' then self << a.object
93
+ when '-' then delete( a.object )
94
+ else raise NoMethodError.new("Don't know what to do with #{a.action} action")
95
+ end
96
+ end
97
+ return self
98
+ end
99
+
100
+ def delete(content)
101
+ case content
102
+ when Tag then @subs.delete_if { |s| content.name == s.name && s.match?( content.filter ) }
103
+ when Macro then @macros.delete(content.value)
104
+ end
105
+ end
106
+
107
+ def match?( filter )
108
+ return true if filter.empty?
109
+ filter.each do |f|
110
+ case f
111
+ when Attribute then return false unless attr_value?( f )
112
+ when Macro then return false unless macro?( f )
113
+ end
114
+ end
115
+ return true
116
+ end
117
+
118
+ def attr_value?( attr )
119
+ @attrs[attr.name] == attr.value
120
+ end
121
+
122
+ def attr?( attr )
123
+ @attrs.key?(attr.name)
124
+ end
125
+
126
+ def macro?( macro )
127
+ @macros.include?(macro.value)
128
+ end
129
+
130
+ def sub?( sub )
131
+ ( @subs.keep_if { |s| s.name == sub.name && s.match?(sub.filter) } ).empty?
132
+ end
133
+
134
+ def filter?(filter)
135
+ @filter.include?(filter)
136
+ end
137
+
138
+ def action?(action)
139
+ @actions.include?(action)
140
+ end
141
+
142
+ end
143
+
144
+ end
@@ -0,0 +1,3 @@
1
+ module WMLAction
2
+ VERSION = "0.0.2"
3
+ end
data/lib/wml_action.rb ADDED
@@ -0,0 +1,9 @@
1
+ require "wml_action/version"
2
+ require "wml_action/tag"
3
+ require "wml_action/cli"
4
+ require "wml_action/document"
5
+ require "wml_action/parser.tab"
6
+ require 'wml_action/log'
7
+
8
+ module WMLAction
9
+ end
@@ -0,0 +1,79 @@
1
+ require "wml_action"
2
+ require "debugger"
3
+
4
+ module WMLAction
5
+
6
+ describe Document do
7
+
8
+ it 'should read a tag' do
9
+ d = Document.from_file('spec/fixtures/tag.cfg')
10
+ expect(d.root.name).to eq "tag"
11
+ end
12
+
13
+ it "should read inners" do
14
+ d = Document.from_file('spec/fixtures/inners.cfg')
15
+ s = d.root
16
+ expect(s.subs.length).to eq 3
17
+ expect(s.subs[0].name).to eq "inner"
18
+ expect(s.subs[1].name).to eq "multitag"
19
+ expect(s.subs[2].name).to eq "multitag"
20
+ end
21
+
22
+ it "should read atributes" do
23
+ d = Document.from_file('spec/fixtures/attributes.cfg')
24
+ s = d.root
25
+ expect(s.attrs.length).to eq 5
26
+ expect(s.attrs).to include "number"
27
+ expect(s.attrs["number"]).to eq 50
28
+ expect(s.attrs).to include "plain"
29
+ expect(s.attrs["plain"]).to eq "One, Another"
30
+ expect(s.attrs).to include "macrosed"
31
+ expect(s.attrs["macrosed"]).to eq "{AMACRO}"
32
+ expect(s.attrs).to include "likedigit"
33
+ expect(s.attrs["likedigit"]).to eq '0.1:0.2'
34
+ expect(s.attrs).to include "empty"
35
+ expect(s.attrs["empty"]).to eq ''
36
+ end
37
+
38
+ it "should read string attributes" do
39
+ d = Document.from_file('spec/fixtures/strings.cfg')
40
+ s = d.root
41
+ expect(s.attrs.length).to eq 5
42
+ expect(s.attrs).to include "simple"
43
+ expect(s.attrs).to include "underscored"
44
+ expect(s.attrs).to include "multiline"
45
+ expect(s.attrs).to include "macrosed"
46
+ expect(s.attrs["simple"]).to eq ' "Hello"'
47
+ expect(s.attrs["underscored"]).to eq ' _ "Long Hello"'
48
+ expect(s.attrs["multiline"]).to eq " \"This is \nvery long\nlong string\""
49
+ expect(s.attrs["macrosed"]).to eq " \"This amount\"+{AMOUNT}"
50
+ end
51
+
52
+ it "should read macros" do
53
+ d = Document.from_file('spec/fixtures/macros.cfg')
54
+ s = d.root
55
+ expect(s.macros).to include "{USEFUL_MACRO}"
56
+ end
57
+
58
+ it "should read filters" do
59
+ d = Document.from_file('spec/fixtures/filter.cfg')
60
+ s = d.root
61
+ expect(s.filter.length).to eq 2
62
+ expect(s.filter[0]).to eq Tag::Attribute['type','flying']
63
+ expect(s.filter[1]).to eq Tag::Macro['{FIRST_STRIKE}']
64
+ end
65
+
66
+ it "should read actions" do
67
+ d = Document.from_file('spec/fixtures/actions.cfg')
68
+ s = d.root
69
+ expect(s.actions.length).to eq 4
70
+ expect(s.actions).to include Tag::Action[Tag::Macro['{VARIABLES}'],'+']
71
+ expect(s.actions).to include Tag::Action[Tag::Macro['{ABILITIES}'],'-']
72
+ expect(s.actions[2].action).to eq "+"
73
+ expect(s.actions[2].object.name).to eq "attack"
74
+ expect(s.actions[3].action).to eq "-"
75
+ expect(s.actions[3].object.name).to eq "resists"
76
+ end
77
+
78
+ end
79
+ end
@@ -0,0 +1,14 @@
1
+ [unit]
2
+
3
+ + {VARIABLES}
4
+
5
+ - {ABILITIES}
6
+
7
+ + [attack]
8
+ damage=10
9
+ [/attack]
10
+
11
+ - [resists]
12
+ [/resists]
13
+
14
+ [/unit]
@@ -0,0 +1,15 @@
1
+ #Footman
2
+ [unit_type]
3
+ + [powershot]
4
+ strength=2
5
+ [/powershot]
6
+ [attack]
7
+ / type=melee
8
+ damage=4
9
+ [/attack]
10
+ + description= _ "Strong.
11
+
12
+ Very strong."
13
+ hp=100
14
+ - {SET_VARIABLES}
15
+ [/unit_type]
@@ -0,0 +1,7 @@
1
+ [tag]
2
+ number=50
3
+ plain=One, Another
4
+ macrosed={AMACRO}
5
+ likedigit=0.1:0.2
6
+ empty=
7
+ [/tag]
@@ -0,0 +1,4 @@
1
+ [unit]
2
+ / type=flying
3
+ / {FIRST_STRIKE}
4
+ [/unit]
@@ -0,0 +1,11 @@
1
+ [tag]
2
+ [inner]
3
+ [/inner]
4
+
5
+ [multitag]
6
+ attr=1
7
+ [/multitag]
8
+ [multitag]
9
+ attr=2
10
+ [/multitag]
11
+ [/tag]
@@ -0,0 +1,3 @@
1
+ [tag]
2
+ {USEFUL_MACRO}
3
+ [/tag]
@@ -0,0 +1,8 @@
1
+ #Footman
2
+ [unit_type]
3
+ description= _ "Strong.
4
+
5
+ Very strong."
6
+ hp=100
7
+ {SET_VARIABLES}
8
+ [/unit_type]
@@ -0,0 +1,9 @@
1
+ [tag]
2
+ simple= "Hello"
3
+ underscored= _ "Long Hello"
4
+ multiline= "This is
5
+ very long
6
+ long string"
7
+ macrosed= "This amount"+{AMOUNT}
8
+ complex=_"This amount"+{AMOUNT}+{AMOUNT_NEW}
9
+ [/tag]
@@ -0,0 +1,2 @@
1
+ [tag]
2
+ [/tag]