aml 0.0.0 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6aea97c2f4ce5ca6518bc5f0a54413a51098a30b
4
- data.tar.gz: ef5e7c9a1c398c09f1313c0ca07cba424e80588f
3
+ metadata.gz: 62586a90cf259bfb9db8e6144d6b617eac6f62f7
4
+ data.tar.gz: 83cd34500258139d04cfd6d91a484ff53aa62fcc
5
5
  SHA512:
6
- metadata.gz: 6747afed28caae4c3d0b61bd0e3e3498003eb62391ee782911b4b2a76a7c0c0483be45218ce168f8bf6520e90fc7af1d43291422565e612342b67c5dc0c0e1ac
7
- data.tar.gz: fa599c7bd3abd6da2f014ada6adec3251fe1e87d6dc84dad263fc7e5ae6c4415c4aaf413cea8f4e0a785e7c27e5032bf33591328d3052e5f57188497cf1c1417
6
+ metadata.gz: f6a5e3848de3b9e91245fcfeb9d74546f38816e285d794601d59461f9dda536ae8ff427c6b0bea8bfa4001657ba8982890808f50786d5a2cfa34942b699dd544
7
+ data.tar.gz: 4ec08e0e48c78777aeda9ffe8563d448e9ee42988e41be19149f87fa5a917a107c399108a7eea97c89665de1562b1e4513210eceafd06b20f9264465496b3516
data/bin/aml ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require 'aml'
3
+ AbstractMarkupLanguage::Base.initialize(ARGV.join(' '))
data/lib/aml.rb CHANGED
@@ -1,5 +1,67 @@
1
- class Aml
2
- def self.hi
3
- puts "Hello world!"
4
- end
5
- end
1
+ module AbstractMarkupLanguage
2
+ class Base
3
+ @@args = {}
4
+ @@args_original = ''
5
+ @@watch = false
6
+ @@p = false
7
+
8
+ def self.initialize(arguments)
9
+ log = Log.new('The following errors have occured:')
10
+ argument = Argument.new(arguments)
11
+ @@args_original = arguments
12
+ argument.required('watch','The required --watch attribute has not been defined.')
13
+ if(argument.has_requirements?)
14
+ if File.exist?(argument.read('watch'))
15
+ basePath = File.dirname(argument.read('watch'))
16
+ argument.create('watch',"#{File.basename(argument.read('watch'))}")
17
+ argument.create_if_empty('basePath',basePath)
18
+ argument.create_if_empty('fileExtension','html')
19
+ argument.create_if_empty('fileOutput',"#{File.basename(argument.read('watch'), ".*")}.#{argument.read('fileExtension')}")
20
+ argument.create_if_empty('selfClosing',"area,base,basefont,bgsound,br,col,frame,hr,img,isindex,input,keygen,link,meta,param,source,track,wbr")
21
+ argument.create_if_empty('sortAttribute','true')
22
+ argument.create_if_empty('singleQuote','false')
23
+ @@args = argument.hash
24
+ @@p = Parse.new(@@args)
25
+ process
26
+ else
27
+ log.add('The file to watch does not exist.')
28
+ argument.missing_required.each do |message|
29
+ log.add(message)
30
+ end
31
+ log.display
32
+ end
33
+ else
34
+ argument.missing_required.each do |message|
35
+ log.add(message)
36
+ end
37
+ log.display
38
+ end
39
+ end
40
+ def self.process
41
+ file = []
42
+ @@watch = Watch.new()
43
+ parse = Parse.new(@@args)
44
+ file << File.join(@@args[:basePath],@@args[:watch])
45
+ parse.process_partials(File.join(@@args[:basePath],@@args[:watch])).each do |partial|
46
+ partial_file = File.join(@@args[:basePath],"~","#{partial[:name]}.aml")
47
+ file << partial_file if File.exist?(partial_file)
48
+ end
49
+ @@watch.process(file)
50
+ message = "Watching #{file[0]}"
51
+ message += " and #{file.count-1} partial" if file.count >= 2
52
+ message += "s" if file.count >= 3
53
+ message += "...\r\n"
54
+ puts message
55
+ @@watch.watch
56
+ end
57
+
58
+ def file_update(name)
59
+ puts "updating #{@@args[:watch]} - #{name} has been updated..."
60
+ @@p.init(File.join(@@args[:basePath],@@args[:watch]),@@args)
61
+ end
62
+ end
63
+ end
64
+ require 'aml/argument'
65
+ require 'aml/log'
66
+ require 'aml/watch'
67
+ require 'aml/parse'
@@ -0,0 +1,65 @@
1
+ class Argument
2
+
3
+ @@argumental = {}
4
+ @@required = {}
5
+
6
+ def initialize(arguments)
7
+ arguments = arguments.split('--')
8
+ arguments.each do |argument|
9
+ string = argument.split(' ')
10
+ create(string[0],string[1..string.count].join(' ')) if argument.strip.length > 0
11
+ end
12
+ end
13
+
14
+ def hash
15
+ return @@argumental
16
+ end
17
+
18
+ def required(name,message)
19
+ @@required[name.to_sym] = {:message=>message.strip, :defined=>false}
20
+ end
21
+
22
+ def has_requirements?
23
+ @@required.each do|key,hash|
24
+ hash[:defined] = true if(@@argumental.select{|k,v| k.to_s == key.to_s}.count == 1)
25
+ end
26
+ @@required.select{|k,v| v[:defined] == false}.count == 0 ? true : false
27
+ end
28
+
29
+ def missing_required
30
+ message = []
31
+ @@required.select{|k,v| v[:defined] == false}.each do |attribute,hash|
32
+ message << hash[:message]
33
+ end
34
+ message
35
+ end
36
+
37
+ def create(name,value)
38
+ @@argumental[name.to_sym] = value.strip if(value.length > 0)
39
+ end
40
+
41
+ def create_if_empty(name,value)
42
+ create(name,value) if @@argumental.select{|k,v| k.to_s == name}.count == 0
43
+ end
44
+
45
+ def read(name)
46
+ @@argumental[name.to_sym]
47
+ end
48
+
49
+ def update(name,value)
50
+ create(name,value)
51
+ end
52
+
53
+ def update_append(name,value)
54
+ create(name,"#{value}#{read(name)}")
55
+ end
56
+
57
+ def update_prepend(name,value)
58
+ create(name,"#{read(name)}#{value}")
59
+ end
60
+
61
+ def delete(name)
62
+ @@argumental = @@argumental.select{|k,v| k.to_s != name}
63
+ end
64
+
65
+ end
data/lib/aml/log.rb ADDED
@@ -0,0 +1,25 @@
1
+ class Log
2
+
3
+ @@introduction = false
4
+ @@message = []
5
+
6
+ def initialize(introduction=false)
7
+ @@introduction = introduction
8
+ end
9
+
10
+ def introduction(message)
11
+ @@introduction = message
12
+ end
13
+
14
+ def add(message)
15
+ @@message << message
16
+ end
17
+
18
+ def display(introduction=true)
19
+ puts @@introduction if(@@introduction != false) and introduction
20
+ @@message.each do |message|
21
+ puts "- #{message}"
22
+ end
23
+ end
24
+
25
+ end
data/lib/aml/parse.rb ADDED
@@ -0,0 +1,504 @@
1
+ class Parse
2
+ @@aml = {
3
+ :argumenthash => {},
4
+ :argument => {
5
+ :tag_attribute_sort => true,
6
+ :tag_attribute_double_quote => true
7
+ },
8
+ :regex => {
9
+ :tag => /(?<!%)%([\w|-]+)([#|\.|][\w|-]+)?([#|\.|][\w|-]+)?(\/)?(\{.+\})?(.+)?/,
10
+ :mixin => /%\(([^~][\w|-]+)\)(\{.+\})?[^\{]?/,
11
+ :partial => /(%)\(\~([\w|-]+)\)/,
12
+ :def_mixin => /^%%([^-][\w|-]+)(\(.+\))?\{/,
13
+ :end_mixin => /^\}$/,
14
+ :def_var => /^\s*?\@(\w+)\s?=\s?(.+)(?=$)/,
15
+ :package => /^::([\w|-]+)(\{(.+?)\})?$/,
16
+ :empty => /^$/,
17
+ :string => //
18
+ },
19
+ :argument => /@\(\:(\w+)\)/,
20
+ :variable => {
21
+ :store => [],
22
+ :regex => /\@\((\w+)(?=\))\)/
23
+ },
24
+ :threeline => /<(.+)(\s.+?)?>\r\n\t{1,}(.+)\n\t{1,}<\/\1>/,
25
+ :comment => {
26
+ :store => [],
27
+ :regex => /\s?%!--([^$]+?)--%/
28
+ },
29
+ :file => {
30
+ :name => nil,
31
+ :param => {},
32
+ :path => '',
33
+ :index => 0
34
+ },
35
+ :log => {
36
+ :error => [],
37
+ :warning => []
38
+ },
39
+ :struct => {
40
+ :file => [],
41
+ :mixin => [],
42
+ :markup => [],
43
+ :partial => [],
44
+ :selftag => ['area','base','basefont','bgsound','br','col','frame','hr','img','isindex','input','keygen','link','meta','param','source','track','wbr']
45
+ }
46
+ }
47
+
48
+ def initialize(args={})
49
+ @@aml[:argumenthash] = args
50
+ end
51
+
52
+ def init(file=nil,args={},index=0,output_to_file=false)
53
+ file_read(file)
54
+ @@aml[:file][:path] = File.dirname(file)
55
+ variable_structure
56
+ partial_structure
57
+ ##package_structure
58
+ mixin_structure
59
+ markup_structure
60
+ markup_structure_block
61
+ @@aml[:argumenthash] = args
62
+ end
63
+
64
+ def file_read(file)
65
+ clean_structures
66
+ line = 0
67
+ File.open(file,"r").each_line do |string|
68
+ file_structure(line+=1,string)
69
+ end
70
+ #puts @@aml[:struct][:file]
71
+ end
72
+
73
+ def clean_structures
74
+ @@aml[:variable][:store] = []
75
+ @@aml[:struct] = {
76
+ :file => [],
77
+ :mixin => [],
78
+ :markup => [],
79
+ :partial => [],
80
+ :selftag => ['area','base','basefont','bgsound','br','col','frame','hr','img','isindex','input','keygen','link','meta','param','source','track','wbr']
81
+ }
82
+ end
83
+
84
+ def file_structure(line,string,baseIndex=0)
85
+ type = false
86
+ @@aml[:regex].each do |line_type,regex|
87
+ if(string.match(regex))
88
+ type = line_type.to_s
89
+ break
90
+ end
91
+ end
92
+ @@aml[:struct][:file] << {:line => line, :type => type, :index => string.match(/^\t{0,}/).to_s.length+baseIndex, :within_mixin => false, :string => string.strip}
93
+ end
94
+
95
+ def variable_structure
96
+ @@aml[:struct][:file].each do |line|
97
+ if line[:string].to_s.length > 0
98
+ match = line[:string].match(@@aml[:regex][:def_var])
99
+ @@aml[:variable][:store] << {:line => line[:line], :name => match[1], :value => match[2]} if match
100
+ end
101
+ end
102
+ variable_structure_replacements
103
+ variable_structure_string_lines
104
+ end
105
+
106
+ def variable_structure_replacements
107
+ @@aml[:struct][:file].each do |line|
108
+ if line[:string].to_s.length > 0
109
+ if(line[:string].match(@@aml[:variable][:regex]))
110
+ line[:string] = line[:string].gsub(@@aml[:variable][:regex], @@aml[:variable][:store].select{|k|k[:name] == "#{$1}" and k[:line] <= line[:line]}.last[:value])
111
+ end
112
+ end
113
+ end
114
+ end
115
+
116
+ def variable_structure_string_lines
117
+ @@aml[:struct][:file].each do |line|
118
+ if(line[:type] == 'string')
119
+ string = "#{line[:string]}"
120
+ type = false
121
+ @@aml[:regex].each do |line_type,regex|
122
+ if(line[:string].match(regex))
123
+ type = line_type.to_s
124
+ break
125
+ end
126
+ end
127
+ line[:type] = type
128
+ line[:string] = string
129
+ end
130
+ end
131
+ end
132
+
133
+ def partial_structure
134
+ @@aml[:struct][:file].each do |line|
135
+ if(line[:type] == 'partial')
136
+ match = line[:string].match(@@aml[:regex][:partial])
137
+ if(@@aml[:struct][:partial].select{|k|k[:name] == match[2]}.count == 0)
138
+ @@aml[:struct][:partial] << {
139
+ :name => match[2],
140
+ :path => File.join(@@aml[:file][:path],'~'),
141
+ :exists => File.exist?("#{File.join(@@aml[:file][:path],'~','')}#{match[2]}.aml")
142
+ }
143
+ end
144
+ end
145
+ end
146
+ #puts "----- Partials"
147
+ #puts @@aml[:struct][:partial]
148
+ #puts "-----"
149
+ end
150
+
151
+
152
+ def mixin_structure
153
+ @@aml[:struct][:file].each do |line|
154
+ if(line[:type] == 'def_mixin')
155
+ match = line[:string].match(@@aml[:regex][:def_mixin])
156
+ @@aml[:struct][:mixin][@@aml[:struct][:mixin].count] = {:name => match[1], :param => match[2].nil? ? false : eval("{#{match[2][1..-2]}}"), :begin_def => line[:line], :end_def => nil}
157
+ elsif(line[:type] == 'end_mixin')
158
+ @@aml[:struct][:mixin][@@aml[:struct][:mixin].count-1][:end_def] = line[:line]
159
+ end
160
+ end
161
+ mixin_structure_build
162
+ end
163
+
164
+ def mixin_structure_build
165
+ @@aml[:struct][:mixin].each_with_index do |mixin,i|
166
+ within_mixin = @@aml[:struct][:file][mixin[:begin_def]..mixin[:end_def]-2]
167
+ within_mixin.each do |line|
168
+ line[:within_mixin] = true
169
+ end
170
+ @@aml[:struct][:mixin][i][:struct] = within_mixin
171
+ end
172
+ end
173
+
174
+ def markup_structure
175
+ #file_structure(@aml[:struct][:file].count+1,"\r\n") if(@aml[:struct][:file].last[:index] == 0)
176
+ @@aml[:struct][:file].each do |line|
177
+ if(line[:within_mixin] == false)
178
+ markup_line = line.clone
179
+ case line[:type]
180
+ when 'tag'
181
+ markup_structure_line_tag(markup_line,line[:index])
182
+ when 'string'
183
+ markup_structure_line_string(markup_line,line[:index])
184
+ when 'mixin'
185
+ markup_structure_line_mixin(markup_line,line[:index])
186
+ when 'partial'
187
+ markup_structure_line_partial(markup_line,line[:index])
188
+ end
189
+ end
190
+ end
191
+ end
192
+
193
+ def markup_structure_line_tag(line,baseIndex)
194
+ if line[:string].to_s.length > 0
195
+ match = line[:string].match(@@aml[:regex][:tag])
196
+ data = line.merge({:selftag => match[4].nil? == false, :param => match[5].nil? ? {} : eval("#{match[5]}"), :match => match[1..-2]})
197
+ data[:param]["#{data[:match][1][0] == '#' ? 'id' : 'class'}".to_sym] = data[:match][1][1..-1] if(data[:match][1])
198
+ data[:param]["#{data[:match][2][0] == '#' ? 'id' : 'class'}".to_sym] = data[:match][2][1..-1] if(data[:match][2])
199
+ @@aml[:struct][:selftag].each do|tag|
200
+ if(match[1] == tag)
201
+ data[:selftag] = true
202
+ break
203
+ end
204
+ end
205
+ @@aml[:struct][:markup] << data
206
+ if(match[6].nil? == false) then
207
+ @@aml[:struct][:markup] << {:line => line[:line], :type=> 'string', :index => line[:index]+1, :within_mixin => line[:within_mixin], :string => "#{match[6].to_s.strip!}", :selftag => true, :match => []}
208
+ end
209
+
210
+ end
211
+ end
212
+
213
+ def markup_structure_line_string(line,baseIndex)
214
+ #line[:string] = line[:string].gsub(@aml[:argument], get_argument_for(line,"#{$1}").to_s) if(line[:within_mixin] and line[:string].to_s.length > 0 and line[:string].match(@aml[:argument]))
215
+ if(line[:within_mixin] and line[:string].to_s.length > 0)
216
+ line[:string] = line[:string].gsub(@@aml[:argument]){|m|get_argument_for(line, "#{$1}".to_s)}
217
+ end
218
+ @@aml[:struct][:markup] << line.merge({:param => false, :selftag => true, :match => []})
219
+ end
220
+
221
+ def markup_structure_line_mixin(line,baseIndex)
222
+ #puts "#{line[:string]} - #{baseIndex}"
223
+ match = "#{line[:string]}".match(@@aml[:regex][:mixin])
224
+ param = match[2].nil? ? false : eval("{#{match[2][1..-2]}}")
225
+ exists = false
226
+ @@aml[:struct][:mixin].each do |mixin_index|
227
+ if(mixin_index[:name] == match[1])
228
+ mixin_index[:struct].each do |mixin_line|
229
+ markup_line = mixin_line.clone
230
+ markup_line[:index] = (markup_line[:index]-1) + line[:index]
231
+
232
+ markup_line[:mixin] = {
233
+ :name => mixin_index[:name],
234
+ :param => param
235
+ }
236
+
237
+ markup_line[:string] = markup_line[:string].gsub(@@aml[:argument]){|m|get_argument_for(markup_line, "#{$1}".to_s)}
238
+
239
+ case markup_line[:type]
240
+ when 'tag'
241
+ markup_structure_line_tag(markup_line,markup_line[:index])
242
+ when 'string'
243
+ markup_structure_line_string(markup_line,markup_line[:index])
244
+ when 'mixin'
245
+ markup_structure_line_mixin(markup_line,markup_line[:index])
246
+ when 'partial'
247
+ markup_structure_line_partial(markup_line,markup_line[:index])
248
+ end
249
+ end
250
+ exists = true
251
+ break
252
+ end
253
+ end
254
+ if(exists == false)
255
+ #log('warning', "The mixin <#{match[1]}> called on line <#{line[:line]}> does not exist")
256
+ end
257
+ end
258
+
259
+ def markup_structure_line_partial(line,baseIndex)
260
+ match = line[:string].match(@@aml[:regex][:partial])
261
+ if(@@aml[:struct][:partial].select{|k|k[:name]==match[2]}.count == 1)
262
+ partial = @@aml[:struct][:partial].select{|k|k[:name]==match[2]}.first
263
+ if partial[:exists]
264
+ line = 0
265
+ File.open(File.join("#{partial[:path]}","#{partial[:name]}.aml"),"r").each_line do |string|
266
+ file_structure(line+=1,string,baseIndex)
267
+ end
268
+ else
269
+ #log('warning', "The partial <#{match[2]}> called on line <#{line[:line]}> does not exist in path <#{partial[:path]}>.")
270
+ end
271
+ end
272
+ end
273
+
274
+ def get_argument_for(line,argument)
275
+ value = line[:mixin][:param].select{|k,x|k.to_s==argument}[argument.to_sym] if(line.has_key?(:mixin) and line[:mixin].has_key?(:param) and line[:mixin][:param] != false)
276
+ value = @@aml[:struct][:mixin].select{|k| line[:mixin][:name] == k[:name] and line[:line] > k[:begin_def] and line[:line] < k[:end_def]}.last[:param].select{|k,x|k.to_s==argument}[argument.to_sym] if(value.nil?)
277
+ return value
278
+ end
279
+
280
+ def hash_to_attribute(hash)
281
+ attribute = hash_to_attribute_build(hash).strip
282
+ attribute = " #{attribute}" if(attribute.length > 0)
283
+ end
284
+
285
+ def hash_to_attribute_build(hash,base="")
286
+ hash = hash.sort_by{|key, value| key}
287
+ string = ""
288
+ hash.each do |key, value|
289
+ if(value.is_a?(Hash))
290
+ value.sort_by{|key, value| key}
291
+ string << "#{hash_to_attribute_build(value,"#{base}#{key}-")} "
292
+ else
293
+ string << "#{base}#{key}=\"#{value}\" "
294
+ end
295
+ end
296
+ string.strip
297
+ end
298
+
299
+ def close_open_tag(open_tag,close=[])
300
+ if(open_tag.count >= 2)
301
+ if(open_tag[0][:tag] == open_tag[1][:tag])
302
+ if(open_tag[0][:closing] == false and open_tag[1][:closing] != open_tag[0][:closing])
303
+ close_open_tag(open_tag[2...open_tag.count],close)
304
+ else
305
+ close << open_tag[0]
306
+ close_open_tag(open_tag[1...open_tag.count],close)
307
+ end
308
+ else
309
+ close << open_tag[0]
310
+ close_open_tag(open_tag[1...open_tag.count],close)
311
+ end
312
+ else
313
+ close << open_tag[0] if(open_tag.count == 1)
314
+ end
315
+ close
316
+ end
317
+
318
+ def close_tags(output,high_index_force=false)
319
+ high_index = 0
320
+ if(high_index_force != false)
321
+ high_index = high_index_force
322
+ else
323
+ output.each do |line|
324
+ high_index = line[:index] if(line[:index] > high_index and line[:tag] != false)
325
+ end
326
+ end
327
+ open_tag = []
328
+ output.each_with_index do |line,index|
329
+ if(line[:index] == high_index and line[:tag] != false)
330
+ line[:number] = index
331
+ open_tag << line
332
+ end
333
+ end
334
+ tags_to_close = close_open_tag(open_tag)
335
+ offset = 0
336
+ tags_to_close.reverse.each do |line|
337
+ closeTag = line
338
+ output.each_with_index do |line,index|
339
+ if(index > closeTag[:number])
340
+ if(line[:index] == closeTag[:index] or line[:index] <= closeTag[:index]-1)
341
+ output.insert(index, {:index => closeTag[:index], :tag => closeTag[:tag], :string => "</#{closeTag[:tag]}>"})
342
+ break
343
+ end
344
+ end
345
+ end
346
+ end
347
+ if(high_index > 1)
348
+ output = close_tags(output,high_index-1)
349
+ end
350
+ output
351
+ end
352
+
353
+
354
+
355
+ def markup_structure_block
356
+ #@@aml[:struct][:markup].each do |line|
357
+ #puts "#{' '*line[:index]}#{line[:string]}\r\n"
358
+ #end
359
+
360
+ markup = []
361
+ @@aml[:struct][:markup].each_with_index do |line,i|
362
+ string = ""
363
+ tag = false
364
+ if(line[:match][0].nil?) then
365
+ string = line[:string]
366
+ else
367
+ tag = line[:match][0]
368
+ selftag = ''
369
+ selftag = ' /' if(line[:selftag] and @@aml[:struct][:selftag].include? line[:match][0])
370
+ string = "<#{line[:match][0]}#{hash_to_attribute(line[:param])}#{selftag}>"
371
+ end
372
+ markup << {:line => i+1, :index => line[:index], :tag => (line[:selftag]) ? false : tag, :string => string}
373
+ end
374
+ @@aml[:struct][:markup] = markup
375
+ markup = []
376
+ @@aml[:struct][:markup] = markup_block
377
+
378
+ output = ''
379
+ @@aml[:struct][:markup].each do |block|
380
+ block = markup_block_resursive(block[:block]).reverse
381
+ output += markup_block_group(block).to_s + "\r\n"
382
+ end
383
+ File.open("#{File.join(@@aml[:argumenthash][:basePath],@@aml[:argumenthash][:fileOutput])}", 'w'){|f| f.write(output.strip!)}
384
+ end
385
+
386
+ def markup_block(begin_line=0,struct=[])
387
+ def_block = []
388
+ end_block = false
389
+ index_one = false
390
+ end_line = begin_line
391
+ @@aml[:struct][:markup].each_with_index do |line,i|
392
+ if(line[:line] >= begin_line and end_block == false)
393
+ index_one = true if(line[:index] > 0)
394
+ end_block = true if(line[:index] == 0 and index_one)
395
+ if(end_block == false)
396
+ def_block << line
397
+ end_line = line[:line]
398
+ end
399
+ else
400
+ @@aml[:struct][:markup].delete_if{|x| x[:line] <= end_line}
401
+ break
402
+ end
403
+ end
404
+ if(@@aml[:struct][:markup].count > 0 and @@aml[:struct][:markup].select{|k|k[:line]}.last[:line] > end_line)
405
+ markup_block(end_line+1,struct)
406
+ end
407
+ struct << {:line => {:begin=>begin_line, :end => end_line}, :block => def_block}
408
+ struct.flatten.reverse
409
+ end
410
+
411
+ def markup_block_resursive(markup,struct=[])
412
+ def_block = []
413
+ last_index = 0
414
+ markup.each do |line|
415
+ if(line[:index] >= last_index)
416
+ def_block << line
417
+ last_index = line[:index]
418
+ else
419
+ markup_block_resursive(markup.select{|k|k[:line]>=line[:line]},struct)
420
+ break
421
+ end
422
+ end
423
+ struct << def_block
424
+ end
425
+
426
+ def markup_block_group(blocks)
427
+ #puts blocks
428
+ #puts "-"
429
+ output = []
430
+ zeroIndex = []
431
+ lastLine = false
432
+ blocks.each_with_index do |block,index|
433
+
434
+ block.each_with_index do |line,i|
435
+ if(line[:index]>0)
436
+ #set next line
437
+ nextLine = false
438
+ nextLine = block[i+1] if(block.count > i+1)
439
+ output << {:index => line[:index], :tag => line[:tag], :closing => false, :string => line[:string]}
440
+ #close tags on same index
441
+ if(nextLine and nextLine[:index] == line[:index])
442
+ output << {:index => line[:index], :tag => line[:tag], :closing => true, :string => "</#{line[:tag]}>"} if(line[:tag] != false)
443
+ line[:tag] = false
444
+ end
445
+
446
+ else
447
+ #add line to zeroIndex, close tags in reverse order
448
+ output << {:index => line[:index], :tag => line[:tag], :closing => false, :string => line[:string]}
449
+ #line[:tag] = false
450
+ zeroIndex << line
451
+
452
+ if(lastLine and lastLine[:index] == 0)
453
+ output << {:index => lastLine[:index], :tag => lastLine[:tag], :closing => true, :string => "</#{lastLine[:tag]}>"} if(lastLine[:tag] != false)
454
+ lastLine[:tag] = false
455
+ end
456
+ end
457
+ lastLine = line
458
+ end
459
+
460
+ end
461
+
462
+ #close zero index tags
463
+ zeroIndex = zeroIndex.drop(zeroIndex.count-1) if @@aml[:struct][:file].select{|k|k[:index] != 0}.count == 0
464
+ zeroIndex.reverse.each do |line|
465
+ output << {:index => line[:index], :tag=> line[:tag], :closing => true, :string => "</#{line[:tag]}>"} if(line[:tag] != false and line[:index] == 0)
466
+ end
467
+
468
+ #go up the chain in reverse (recursive) to find unclosed tags
469
+ output = close_tags(output)
470
+ sout = ""
471
+ output.each do |line|
472
+ sout += "#{' '*line[:index]}#{line[:string]}\r\n"
473
+ end
474
+ sout.strip!
475
+ end
476
+
477
+
478
+
479
+
480
+
481
+
482
+
483
+ def process_package
484
+ end
485
+
486
+ def process_partials(file)
487
+ partial = []
488
+ File.open(file,"r").each_line do |string|
489
+ type = false
490
+ @@aml[:regex].each do |line_type,regex|
491
+ if(string.match(regex))
492
+ type = line_type.to_s
493
+ break
494
+ end
495
+ end
496
+ if(type == 'partial')
497
+ match = string.match(@@aml[:regex][:partial])
498
+ partial << {:name=>match[2]}
499
+ end
500
+ end
501
+ partial
502
+ end
503
+
504
+ end
data/lib/aml/watch.rb ADDED
@@ -0,0 +1,37 @@
1
+ class Watch
2
+ def initialize
3
+ end
4
+
5
+ def process(filenames)
6
+ filenames = [filenames] if(filenames.kind_of?String)
7
+ @last_mtimes = {}
8
+ filenames.each do |filename|
9
+ @last_mtimes[filename] = File.stat(filename).mtime
10
+ end
11
+ @filenames = filenames
12
+ end
13
+
14
+ def watch(sleep=1)
15
+ loop do
16
+ begin
17
+ Kernel.sleep sleep until file_updated?
18
+ rescue SystemExit,Interrupt
19
+ puts "\r\n"
20
+ Kernel.exit
21
+ end
22
+ end
23
+ end
24
+
25
+ def file_updated?
26
+ @filenames.each do |filename|
27
+ mtime = File.stat(filename).mtime
28
+ updated = @last_mtimes[filename] < mtime
29
+ @last_mtimes[filename] = mtime
30
+ if(updated)
31
+ AbstractMarkupLanguage::Base.new.file_update(filename)
32
+ return true
33
+ end
34
+ end
35
+ return false
36
+ end
37
+ end
metadata CHANGED
@@ -1,24 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Esquivias
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-03-15 00:00:00.000000000 Z
11
+ date: 2013-05-07 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: A simple abstract (x)html markup language focused on static (x)html file
14
- genaration.
15
- email: daniel.esquivias@gmail.com
16
- executables: []
13
+ description: Abstract Markup Language is a robust and feature rich markup language
14
+ designed to avoid repetition and promote clear, well-indented markup.
15
+ email: daniel@aml-info.org
16
+ executables:
17
+ - aml
17
18
  extensions: []
18
19
  extra_rdoc_files: []
19
20
  files:
20
21
  - lib/aml.rb
21
- homepage: http://rubygems.org/gems/aml
22
+ - lib/aml/argument.rb
23
+ - lib/aml/log.rb
24
+ - lib/aml/watch.rb
25
+ - lib/aml/parse.rb
26
+ - bin/aml
27
+ homepage: https://aml-info.org/
22
28
  licenses:
23
29
  - MIT
24
30
  metadata: {}
@@ -30,7 +36,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - '>='
32
38
  - !ruby/object:Gem::Version
33
- version: '0'
39
+ version: 2.0.0
34
40
  required_rubygems_version: !ruby/object:Gem::Requirement
35
41
  requirements:
36
42
  - - '>='
@@ -38,7 +44,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
38
44
  version: '0'
39
45
  requirements: []
40
46
  rubyforge_project:
41
- rubygems_version: 2.0.3
47
+ rubygems_version: 2.0.0
42
48
  signing_key:
43
49
  specification_version: 4
44
50
  summary: Abstract Markup Language