wml_action 0.0.2

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.
@@ -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]