aml 0.1.1.1 → 0.1.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: 1fb94d51490c626603a16de82a5b6888a4db7e7c
4
- data.tar.gz: ebdc4038a88844f7b6fcffb7b8537cf787e64aec
3
+ metadata.gz: 4554e8086f2ded34322b99b7d29197f0d106d547
4
+ data.tar.gz: 6a46a20ef78e5888ffd391c960744d5f3382acce
5
5
  SHA512:
6
- metadata.gz: 867280f2e16f2df3ddd8bdefec4550901d0710701db17fb65ee690dfce94606cbd1d89aca7f6690fd671325de7eb5f29ffddbd84195908b2c8127ba910e631e8
7
- data.tar.gz: 97abab75dd2e85df2f753797a3909c653432a660faefabf20761877ef5ecbcc5efe13ca7402d76a2824d6d72760eaf7e0c693875fb0d75665a4febd278b2db86
6
+ metadata.gz: 984d81c03eecfc52d2bc73376837809fa7ddeb0abbc5dd0dd978df88160693b0cd367332b0ca3d096c367849fd75dcf1d3a69ef03defdf96e1426cb240ec3320
7
+ data.tar.gz: 30632d24ea907aa6884944f770c5c32b8a1308c9ea8d1ef1967a590a8b4fe3f3c41d938f8d6ad3e6474b2787340c94fdd92ba9b39da73d559283bf07108f3ce3
data/bin/aml CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'aml'
3
- AbstractMarkupLanguage::Base.initialize(ARGV.join(' '),0)
3
+ AbstractMarkupLanguage.new(ARGV.join(' '))
data/lib/aml.rb CHANGED
@@ -1,148 +1,11 @@
1
- require 'aml/requirement'
2
- module AbstractMarkupLanguage
3
- @basePath
4
- @watchFile
5
- @makeFile
6
- class Base
7
- def self.initialize(arguments, instance)
8
- error = Error.new()
9
- argument = Argument.new(arguments,error)
10
- argument.required('watch','The required --watch argument has not been defined.')
11
- if(argument.has_requirements? == false)
12
- argument.clear_required
13
- argument.required('build','The required --build argument has not been defined.')
14
- if(argument.has_requirements?)
15
- argument.clear_required
16
- argument.create('watch',argument.read('build'))
17
- argument.create('build','true')
18
- end
19
- else
20
- argument.create('build','false')
21
- end
22
- if argument.has_requirements? and File.exist?(argument.read('watch'))
23
- basePath = File.dirname(argument.read('watch'))
24
- @basePath = basePath
25
- watchFile = File.basename(argument.read('watch'))
26
- @watchFile = watchFile
27
- #Arguments from aml-config
28
- configFile = File.join(basePath,'aml-config')
29
- argument.parse(File.read(configFile)) if File.exist?(configFile)
30
- #Arguments
31
- argument.create('watch',watchFile)
32
- argument.create_if_empty('basePath',basePath)
33
- argument.create_if_empty('fileExtension','html')
34
- argument.create_if_empty('fileOutput',"#{File.basename(argument.read('watch'), ".*")}.#{argument.read('fileExtension')}")
35
- argument.create_if_empty('selfClosing',"area,base,basefont,bgsound,br,col,frame,hr,img,isindex,input,keygen,link,meta,param,source,track,wbr")
36
-
37
- argument.create_if_empty('aml-watch-instance', "#{instance}")
38
-
39
- parse = Parse.new(argument.read('basePath'), argument.read('watch'))
40
- files = []
41
-
42
- #Watch Partials
43
- parse.watch.each do |this|
44
- file = File.join(basePath, this[:bundle] ? File.join(this[:bundle],'partial') : this[:partial] ? 'partial' : '' , this[:file])
45
- files << file
46
- end
47
-
48
- #Watch Mixins
49
- parse.mixin.each do |this|
50
- file = File.join(basePath, this[:bundle] ? File.join(this[:bundle]) : this[:partial] ? 'partial' : '' , this[:file]) if this[:bundle] != false
51
- files << file if file != nil
52
- end
53
-
54
- #Define Core Bundle's Methods, Mixins, & Variables...
55
- core_definition = false
56
- if(File.exists?(File.join(File.dirname(File.expand_path(__FILE__)),'aml','core','mixin.aml')))
57
- bundle = Parse.new(File.join(File.dirname(File.expand_path(__FILE__)), 'aml','core'),'mixin.aml')
58
- definition = Definition.new(bundle.file,"core",false,true,true)
59
- core_definition = true
60
- else
61
- error.log('core',false,'mixin.aml',false,'file does not exist')
62
- end
63
-
64
- if(File.exists?(File.join(File.dirname(File.expand_path(__FILE__)),'aml','core','method.rb')))
65
- begin
66
- class_eval File.read(File.join(File.dirname(File.expand_path(__FILE__)),'aml','core','method.rb'))
67
- rescue Exception => e
68
- x = e.message.match(error.match)
69
- error.log('core',false,"method.rb",x[:line],x[:message])
70
- end
71
- else
72
- error.log('core',false,'method.rb',false,'file does not exist')
73
- end
74
-
75
- #Define --watch Methods, Mixins, & Variables...
76
- if core_definition
77
- definition.add(parse.file,false,true,true,true)
78
- else
79
- definition = Definition.new(parse.file,false,true,true,true)
80
- end
81
-
82
- #Define Additional Bundle Methods & Mixins
83
- definition.bundles.each do |directory,name|
84
- if directory != 'core' then
85
- if File.exists?(File.join(basePath,directory,'method.rb'))
86
- begin
87
- class_eval File.read(File.join(basePath,directory,'method.rb'))
88
- rescue Exception => e
89
- x = e.message.match(error.match)
90
- error.log(directory,false,"method.rb",x[:line],x[:message])
91
- end
92
- else
93
- error.log(directory,false,'method.rb',false,'file does not exist')
94
- end
95
- if File.exists?(File.join(basePath,directory,'mixin.aml'))
96
- bundle = Parse.new(File.join(basePath,directory),'mixin.aml')
97
- definition.add(bundle.file,directory,false,true,true)
98
- else
99
- error.log(directory,false,'mixin.aml',false,'file does not exist')
100
- end
101
- #Watch Additional Bundle Partials
102
- Dir[File.join(basePath,directory,'partial','*.aml')].each do |partial|
103
- files << partial
104
- end
105
- end
106
- end
107
-
108
- #Watch or Build
109
- @makeFile = argument.read('fileOutput')
110
- compile = Compile.new(parse,argument,definition,error)
111
- error.log_delete if error.count == 0
112
- error.log_create if error.count > 0
113
- if argument.read('build') == 'false'
114
- if(error.count == 0)
115
- print "\r\b\e[0KWatching #{files.count} file#{files.count != 1 ? "s" : ""}"" for updates... "
116
- else
117
- print "\r\b\e[0KPlease resolve all issues found in aml-error... "
118
- end
119
- watch = Watch.new(files, arguments, argument.read('aml-watch-instance').to_i+1, argument.read('build'))
120
- else
121
- if(error.count == 0)
122
- puts "Build complete."
123
- else
124
- puts "Please resolve all issues found in aml-error."
125
- end
126
- end
127
- else
128
- if argument.defined('version')
129
- puts Gem.loaded_specs['aml'].version.to_s
130
- else
131
- puts argument.read('watch').to_s.length == 0 ? "Please define the --watch or --build argument." : "File not found."
132
- end
133
- end
134
- end
135
-
136
- def self.makeFile
137
- @makeFile
138
- end
139
-
140
- def self.basePath
141
- @basePath
142
- end
143
-
144
- def self.watchFile
145
- @watchFile
1
+ # Entry Point for Abstract Markup Language
2
+ class AbstractMarkupLanguage
3
+ require "aml/Build"
4
+ def initialize(argument)
5
+ if ['--v', '--version', 'version'].include? argument.downcase
6
+ puts Gem.loaded_specs['aml'].version.to_s
7
+ else
8
+ @build = Build.new(argument)
146
9
  end
147
10
  end
148
11
  end
@@ -0,0 +1,100 @@
1
+ class Argument
2
+ def initialize(argument={})
3
+ @item = {}
4
+ @item_key = {}
5
+ argument.each do |argument|
6
+ initialize_add(argument)
7
+ end
8
+ end
9
+ def parse(argument)
10
+ arguments = argument.split('--')
11
+ if arguments.count == 1
12
+ arguments = []
13
+ io = argument.split(' ')
14
+ arguments << "build " + io[0] #input file
15
+ if io.count == 2
16
+ arguments << "path " + File.dirname(io[1]) #output path
17
+ arguments << "name " + File.basename(io[1],'.*') #output name
18
+ arguments << "extension " + File.extname(io[1])[1..-1] if io[1].split('.').count > 1 #output extension
19
+ end
20
+ end
21
+ arguments.each do |argument|
22
+ string = argument.split(' ')
23
+ set(string[0], string[1..string.count].join(' ').to_s) if argument.strip.length > 0
24
+ end
25
+ end
26
+ def define(name,value,usage,required=false)
27
+ regex = /\[(?<key>\w)\]/
28
+ keys = []
29
+ name = name.gsub(regex).each do |match|
30
+ match = match.match(regex)[:key]
31
+ keys << match
32
+ match
33
+ end
34
+ @item[name.to_sym] = {
35
+ :value => value,
36
+ :usage => usage,
37
+ :require => required
38
+ }
39
+ @item_key[keys.join.to_sym] = name.to_sym if keys.count > 0
40
+ end
41
+ def set(name, value=nil)
42
+ begin
43
+ @item[_name(name)][:value] = value.to_s
44
+ rescue
45
+ end
46
+ end
47
+ def get(name)
48
+ begin
49
+ @item[_name(name)][:value].to_s
50
+ rescue
51
+ end
52
+ end
53
+ def items
54
+ @item
55
+ end
56
+ def show_help?
57
+ @item.select{|k,v| k == :help and v[:value] != false}.count == 0 ? false : true
58
+ end
59
+ def show_help
60
+ pad = _pad(@item)
61
+ @item.each do |name,data|
62
+ value = data[:value].to_s
63
+ value = nil.to_s if name == :help
64
+ puts "--#{name.to_s.ljust(pad[:name]+1)}\t#{value.ljust(pad[:value]+1)}\t#{data[:usage].ljust(pad[:usage])}"
65
+ end
66
+ end
67
+ def has_requirements?
68
+ @item.select{|k,v| v[:require] == true and v[:value] == nil}.count == 0 ? true : false
69
+ end
70
+ def show_required
71
+ required = @item.select{|k,v| v[:require] == true and v[:value] == nil}
72
+ if required.count == 1
73
+ puts "Please define the --#{required.first.first} argument; #{required.first.last[:usage]}"
74
+ else
75
+ pad = _pad(required)
76
+ required.each do |name,data|
77
+ value = data[:value].to_s
78
+ value = nil.to_s if name == :help
79
+ puts "--#{name.to_s.ljust(pad[:name]+1)}\t#{value.ljust(pad[:value]+1)}\t#{data[:usage].ljust(pad[:usage])}"
80
+ end
81
+ end
82
+ end
83
+ private
84
+ def _name(name)
85
+ if @item.select{|k|k == name.to_sym}.count == 0
86
+ name = @item_key[name.to_sym]
87
+ else
88
+ name = name.to_sym
89
+ end
90
+ end
91
+ def _pad(items)
92
+ pad = {:name=>0,:value=>0,:usage=>0}
93
+ items.each do |name,data|
94
+ pad[:name] = name.to_s.length if name.to_s.length > pad[:name]
95
+ pad[:value] = data[:value].to_s.length if data[:value].to_s.length > pad[:value]
96
+ pad[:usage] = data[:usage].to_s.length if data[:usage].to_s.length > pad[:usage]
97
+ end
98
+ pad
99
+ end
100
+ end
@@ -0,0 +1,203 @@
1
+ class Build
2
+ require "aml/Argument"
3
+ require "aml/Compile"
4
+
5
+ @@structure = []
6
+ @@selfClosing = []
7
+
8
+ def initialize(attribute=nil)
9
+ @argument = Argument.new()
10
+ @argument.define('[b]uild', nil, 'input file path and name', true)
11
+ #@argument.define('[w]atch', false, 'watch for build updates')
12
+ @argument.define('[s]elf[c]losing', true, 'enable self closing tags')
13
+ @argument.define('[p]ath', nil, 'output file path')
14
+ @argument.define('[n]ame', nil, 'output file name')
15
+ @argument.define('[e]xtension', 'html', 'output file extension')
16
+ @argument.define('[o]utput', nil, 'output file path and name')
17
+ @argument.define('[h]elp', false, 'list all arguments')
18
+ @argument.parse(attribute)
19
+ if @argument.get('build') != nil.to_s
20
+ @argument.set('path', File.dirname(@argument.get('build'))) if @argument.get('path') == nil.to_s
21
+ @argument.set('name', File.basename(@argument.get('build'),'.*')) if @argument.get('name') == nil.to_s
22
+ if @argument.get('output') == nil.to_s
23
+ @argument.set('output', File.join(@argument.get('path'), @argument.get('name') + '.' + @argument.get('extension')))
24
+ else
25
+ @argument.set('path', File.dirname(@argument.get('output')))
26
+ @argument.set('name', File.basename(@argument.get('output'),'.*'))
27
+ @argument.set('extension', File.extname(@argument.get('output'))[1..-1])
28
+ end
29
+ end
30
+
31
+ if @argument.get('selfclosing').to_s.downcase == 'true'
32
+ @@selfClosing = %w[area base basefont bgsound br col frame hr img isindex input keygen link meta param source track wbr]
33
+ elsif @argument.get('selfclosing').to_s.downcase != 'false'
34
+ @@selfClosing = @argument.get('selfclosing').to_s.downcase.split(',')
35
+ @argument.set('selfclosing','custom')
36
+ end
37
+
38
+ if @argument.show_help?
39
+ @argument.show_help
40
+ elsif @argument.has_requirements?
41
+ @compile = Compile.new(@argument)
42
+ @compile.process
43
+ @compile.post_process
44
+ if @compile.log.select{|k|k[:fail]==true}.count == 0
45
+ console
46
+ process_complete
47
+ else
48
+ console
49
+ end
50
+ else
51
+ @argument.show_required
52
+ end
53
+ end
54
+
55
+ def console
56
+ @compile.log.each do |log|
57
+ line = log[:line] ? ":#{log[:line]}" : ""
58
+ puts "#{log[:file]}#{line} - #{log[:message]}"
59
+ end
60
+ end
61
+
62
+ def process_complete
63
+ structure = prepare_structure(prepare_string_line_merge(@compile.structure))
64
+ recursive_merge_lines(structure)
65
+ structure.each do |group|
66
+ recursive_close(group,0,0)
67
+ end
68
+ File.open(@argument.get('output'), 'w'){|file|
69
+ struct_count = @@structure.count-1
70
+ @@structure.each_with_index do |line,index|
71
+ new_line = (index < struct_count) ? $/ : ""
72
+ file.write(line+new_line) if line.strip.length > 0
73
+ end
74
+ }
75
+ puts "Build completed."
76
+ end
77
+ private
78
+
79
+ def recursive_close(struct,index=0,index_reset)
80
+ next_index = struct.key?(:line) ? index+1 : index
81
+ tab_index = "\t" * (index-index_reset)
82
+ opening_tag_attributes = ""
83
+ opening_tag = ""
84
+ closing_tag = ""
85
+
86
+ #STRING
87
+ if(struct[:line][:type]==:string)
88
+ opening_tag = struct[:line][:value]
89
+ end
90
+
91
+ #TAG
92
+ if(struct[:line][:type]==:tag)
93
+
94
+ struct[:line][:close] = :self if @@selfClosing.include? struct[:line][:name]
95
+
96
+ opening_tag_attributes = tag_line_attributes(struct[:line],"")
97
+ opening_tag = "<#{struct[:line][:name]}#{opening_tag_attributes}>"
98
+ closing_tag = "</#{struct[:line][:name]}>"
99
+ if struct.key?(:line)
100
+ if struct[:line][:close] == :self
101
+ opening_tag = "<#{struct[:line][:name]}#{opening_tag_attributes} />"
102
+ closing_tag = ""
103
+ end
104
+ if struct[:line][:close] == :none
105
+ closing_tag = ""
106
+ end
107
+ end
108
+ end
109
+ tag_text = struct[:line][:text]
110
+ if struct.key?(:children)
111
+ new_line = "\r\n"
112
+ #Tab Reset
113
+ index_reset = struct[:line][:index]+1 if struct[:line][:reset]
114
+
115
+ tag_text = "#{new_line}#{tab_index}\t#{tag_text}" if tag_text.to_s.length > 0
116
+
117
+ @@structure << "#{tab_index}#{opening_tag}#{tag_text}" if struct.key?(:line)
118
+ struct[:children].each do |struct_children|
119
+ recursive_close(struct_children,next_index,index_reset)
120
+ end
121
+
122
+ @@structure << "#{tab_index}#{closing_tag}" if struct.key?(:line)
123
+ else
124
+ @@structure << "#{tab_index}#{opening_tag}#{tag_text}#{closing_tag}"
125
+ end
126
+ end
127
+
128
+ def tag_line_attributes(line,base="")
129
+ if line[:type] == :tag
130
+ attributes = hash_to_attribute_build(line[:attribute],"",line)
131
+ attributes = " #{attributes}" if(attributes.length > 0)
132
+ end
133
+ end
134
+
135
+ def hash_to_attribute_build(hash,base="",line)
136
+ hash = hash.sort_by{|key, value| key}
137
+ string = ""
138
+ hash.each do |key, value|
139
+ if(value.is_a?(Hash))
140
+ value.sort_by{|key, value| key}
141
+ string << "#{hash_to_attribute_build(value,"#{base}#{key}-",line)} "
142
+ else
143
+ string << "#{base}#{key}=\"#{value}\" " if value.to_s.length > 0
144
+ end
145
+ end
146
+ string.strip
147
+ end
148
+
149
+ def prepare_structure(struct,index=0,pstruct={:line=>false,:children=>[]})
150
+ parent_tags = struct.each_index.select{|i| struct[i][:index] == index}.compact
151
+ parent_struct = []
152
+ parent_tags.each_with_index do |struct_index,index|
153
+ last_struct_index = parent_tags.count > index+1 ? parent_tags[index+1]-1 : parent_tags[index]
154
+ last_struct_index = struct.count if(parent_tags.count == index+1)
155
+ parent_struct << struct[struct_index..last_struct_index]
156
+ end
157
+ parent_struct.each do |parent_structure|
158
+ index_struct = {}
159
+ index_struct[:line] = parent_structure[0]
160
+ c = prepare_structure(parent_structure,index+1)
161
+ index_struct[:children] = c if c.count > 0
162
+ pstruct[:children] << index_struct
163
+ end
164
+ pstruct[:children]
165
+ end
166
+
167
+ def recursive_merge_lines(struct,count=0)
168
+ struct.each_with_index do |group,struct_index|
169
+ group.each_with_index do |line,gindex|
170
+ if line.first == :line
171
+ if line.last[:type] == :string and line.last[:merge]
172
+ next_line = struct[struct_index+1].first
173
+ if next_line.first == :line and next_line.last[:type] == :string
174
+ line.last[:value] += next_line.last[:value]
175
+ line.last[:merge] = next_line.last[:merge]
176
+ line.last[:merge] = struct_index+1 == struct.count ? false : line.last[:merge]
177
+ struct.delete_at struct_index+1
178
+ else
179
+ line.last[:merge] = false
180
+ end
181
+ count +=1 if line.last[:merge]
182
+ end
183
+ else
184
+ recursive_merge_lines(line.last)
185
+ end
186
+ end
187
+ end
188
+ recursive_merge_lines(struct) if count > 0
189
+ end
190
+
191
+ def prepare_string_line_merge(lines)
192
+ regex = /\+\+$/
193
+ lines.each_with_index do |line,index|
194
+ if(line[:type] == :string)
195
+ line[:merge] = line[:value].to_s.match(regex) != nil
196
+ line[:value] = line[:value].to_s.gsub(regex,'') if line[:merge]
197
+ end
198
+ end
199
+ lines
200
+ end
201
+
202
+
203
+ end