frontendloader 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -6,15 +6,19 @@
6
6
 
7
7
  ##Usage:
8
8
 
9
- fel init
9
+ fel init
10
10
 
11
11
  Creates a config yaml file, where you can name files and variables, and prioritize the loading of certain scripts and styles.
12
12
 
13
- fel compile
13
+ fel compile
14
14
 
15
15
  - Scans the directory containing FrontendLoader.yml for .less files, .mustache templates and .js scripts.
16
16
  - Compiles the .less files down to css.
17
17
  - Joins the mustache templates into a single javascript object: templates = {}
18
18
  - Joins javascript files together (including mustache templates) and yui compresses if set in yml.
19
19
 
20
+ fel watch
21
+
22
+ - Watches for file changes and automatically runs fel compile
23
+
20
24
  **IMPORTANT: Requires less.js & node for .less compilation: see & install http://lesscss.org/#-server-side-usage**
data/bin/fel CHANGED
@@ -6,4 +6,10 @@ when "init"
6
6
  fel.init_app
7
7
  when "compile"
8
8
  fel.compile
9
+ when "listen"
10
+ fel.listen
11
+ when "watch"
12
+ fel.listen
13
+ when "--watch"
14
+ fel.listen
9
15
  end
@@ -1,42 +1,41 @@
1
1
  require 'jscat'
2
2
  require 'filestojs'
3
3
  require 'yaml'
4
+ require 'listen'
4
5
 
5
6
  class FrontendLoader
6
7
 
7
8
  attr_accessor :resources_path
9
+ attr_accessor :settings
8
10
 
9
11
  def initialize
10
- version = '0.0.1'
12
+ version = '0.0.4'
11
13
  @gem_path = Gem.path[0]+"/gems/frontendloader-"+version
12
14
  @resources_path = Gem.path[0]+"/gems/frontendloader-"+version+"/resources"
15
+ @processors = {}
13
16
  end
14
17
 
15
18
  def init_app
16
-
17
19
  if File.exists? 'FrontendLoader.yml' then
18
20
  puts "Frontend Loader already initialized"
19
21
  return false
20
22
  end
21
-
22
23
  config_path = @resources_path+"/FrontendLoader.yml"
23
- guard_path = @resources_path+"/Guardfile"
24
+ # guard_path = @resources_path+"/Guardfile"
24
25
  %x[cp #{config_path} FrontendLoader.yml]
25
- %x[cp #{guard_path} Guardfile]
26
+ # %x[cp #{guard_path} Guardfile]
26
27
  puts "Created basic FrontendLoader app, check FrontendLoader.yml for config"
28
+ puts "To automatically compile upon file saves, run \"fel listen\""
27
29
  end
28
30
 
29
31
  def boilerplate
30
32
  load_settings
31
33
  end
32
-
33
34
 
34
35
  def load_settings
35
-
36
36
  if ! File.exists? 'FrontendLoader.yml' then
37
37
  init_app
38
38
  end
39
-
40
39
  begin
41
40
  @settings = YAML.load_file('FrontendLoader.yml')
42
41
  return true
@@ -46,113 +45,142 @@ class FrontendLoader
46
45
  end
47
46
  end
48
47
 
48
+
49
49
  def compile
50
50
  return false unless load_settings
51
-
52
- #less
53
-
54
- less_files = Dir.glob("*.less")
55
51
 
56
- if less_files.length > 0 then
57
-
58
- less_files.delete("style.less")
59
- less_string = ""
60
- less_files.each { |file|
61
- puts "Loading #{file}..."
62
- file = file.gsub(".less","")
63
- less_string = less_string + "@import '#{file}'; \n"
64
- File.open('style.less','w') { |f|
65
- f.write(less_string)
66
- }
67
- }
68
- %x[lessc style.less style.css]
69
- # %x[rm style.less]
70
-
52
+ #CSS
53
+ if @settings['css']['enabled'] then
54
+ css_source_files = Dir.glob("*.#{@settings['css']['format']}")
55
+ if @settings['css']['prioritize'] then
56
+ css_source_files = prioritize_files(css_source_files,@settings['css']['prioritize'])
57
+ end
58
+ if @settings['css']['ignore']
59
+ css_source_files = clean_ignored_files(css_source_files,@settings['css']['ignore'])
60
+ end
61
+ begin
62
+ css_processor_found = require "processors/#{@settings['css']['format']}.rb"
63
+ rescue Exception => e
64
+ puts "No processor for #{@settings['css']['format']} found"
65
+ css_processor_found = false
66
+ end
67
+ if css_processor_found then
68
+ css_processor = CSS_Processor.new
69
+ css_processor.process(css_source_files)
70
+ end
71
+ puts "Compiled css into css.css"
71
72
  end
72
73
 
73
-
74
74
  #TEMPLATES
75
-
76
- template_joiner = FilesToJs.new({
77
- :file_dir => '.',
78
- :file_format => @settings['templates']['format'],
79
- :js_object_name => @settings['templates']['varname'],
80
- :output => @settings['templates']['varname']+".js",
81
- })
82
- template_joiner.write_js
83
-
84
-
85
-
86
- #Javascript (includes joined templates)
87
-
88
-
89
- javascript = JsCat.new({
90
- :js_dir => '.',
91
- :prioritize => @settings['javascript']['prioritize'],
92
- :ignore => ['js.js'],
93
- :compress => @settings['javascript']['compress'],
94
- :output => 'js.js'
95
- })
96
-
97
- %x[rm templates.js]
75
+ if @settings['templates']['enabled'] then
76
+ template_files = Dir.glob("*.#{@settings['templates']['format']}")
77
+ if @settings['templates']['prioritize'] then
78
+ template_files = prioritize_files(template_files,@settings['templates']['prioritize'])
79
+ end
80
+ if @settings['templates']['ignore'] then
81
+ template_files = clean_ignored_files(template_files,@settings['templates']['ignore'])
82
+ end
83
+ templates_source = "#{@settings['templates']['varname']} = {};\n"
84
+ template_files.each {|file|
85
+ template_markup = File.read(file)
86
+ template_markup.gsub!("\n","")
87
+ template_markup.gsub!("\"","\\\"")
88
+ template_markup = template_markup.strip.gsub(/\s{2,}/, ' ')
89
+ templates_source << "#{@settings['templates']['varname']}['#{file.split('.')[0]}'] = \"#{template_markup}\";\n"
90
+ }
91
+ puts "Compiled templates into #{@settings['templates']['varname']} variable"
92
+ else
93
+ templates_source = ""
94
+ end
98
95
 
99
- puts "Compiled into js.js and style.css"
96
+ #JS
97
+ if @settings['javascript']['enabled'] then
98
+ js_source_files = Dir.glob("*.js")
99
+ if @settings['javascript']['prioritize'] then
100
+ js_source_files = prioritize_files(js_source_files,@settings['javascript']['prioritize'])
101
+ end
102
+ # if @settings['javascript']['ignore'].class != Array then
103
+ # @settings['javascript']['ignore'] = []
104
+ # end
105
+ if @settings['javascript']['ignore'] then
106
+ js_source_files = clean_ignored_files(js_source_files,(@settings['javascript']['ignore'] << 'js.js'))
107
+ end
108
+ js_source = ""
109
+ js_source_files.each { |file|
110
+ js_source << File.read(file)+"\n"
111
+ }
112
+ js_source << templates_source
113
+ if @settings['javascript']['jsmin'] then
114
+ begin
115
+ jsmin = require "jsmin"
116
+ rescue Exception => e
117
+ puts "JSmin not installed"
118
+ end
119
+ if jsmin then
120
+ js_source = JSMin.minify(js_source)
121
+ end
122
+ end
123
+ if @settings['javascript']['yui'] then
124
+ begin
125
+ yui = require "yui/compressor"
126
+ rescue Exception => e
127
+ puts "YUI compressor gem not installed"
128
+ end
129
+ if yui then
130
+ compressor = YUI::JavaScriptCompressor.new
131
+ js_source = compressor.compress(js_source)
132
+ end
133
+ end
134
+ File.open('js.js','w') { |f|
135
+ f.write(js_source)
136
+ }
137
+ puts "Compiled javascript into js.js"
138
+ end
100
139
 
101
140
  end
102
141
 
103
-
104
- def create_view(view_title)
105
- return false unless load_settings
106
-
107
- style_format = @settings['css']['framework']
108
- style_directory = @settings['css']['directory']
109
- style_string = ".#{view_title} {
110
-
111
- }
112
- "
113
-
114
- if File.exists? "#{view_title}.#{@settings['css']['framework']}" then
115
- puts "View already exists"
116
- return false
142
+ def prioritize_files(files, priority_files=[],path="")
143
+ if priority_files.class != Array then
144
+ priority_files = []
117
145
  end
118
-
119
-
120
- File.open("#{style_directory}/#{view_title}.less",'w') { |f|
121
- f.write(style_string)
122
- }
123
-
124
- classwords = view_title.split('_')
125
- classwords.each {|word|
126
- word.capitalize!
127
- }
128
-
129
- classname = classwords.join
130
-
131
- if classwords.last != "View" then classname = classname+"View" end
132
-
133
- js_directory = @settings['javascript']['directory']
134
-
135
- js_string = ""
136
-
137
- viewtemplate = File.open("#{@resources_path}/js/mootools/View.js",'r').read
138
- js_string = js_string+viewtemplate.gsub('VIEWCLASSNAME',classname).gsub('VIEWTITLE',view_title)
139
-
140
-
141
- File.open("#{js_directory}/#{classname}.js",'w') { |f|
142
- f.write(js_string)
146
+ priority_files.uniq.each {|file|
147
+ if files.include? file then
148
+ files.delete file
149
+ else
150
+ priority_files.delete file
151
+ end
143
152
  }
144
-
145
- templates_directory = @settings['templates']['directory']
146
- templates_format = @settings['templates']['format']
147
-
148
- File.open("#{templates_directory}/#{view_title}.#{templates_format}",'w') { |f|
149
- f.write("")
153
+ prioritized_files = priority_files + files
154
+ return prioritized_files
155
+ end
156
+
157
+ def clean_ignored_files(files, ignored_files=[],path="")
158
+ if ignored_files.class != Array then
159
+ ignored_files = []
160
+ end
161
+ cleaned_list = []
162
+ ignored_files.uniq.each {|file|
163
+ if files.include? file then
164
+ files.delete file
165
+ end
150
166
  }
151
-
167
+ return files
168
+ end
169
+
152
170
 
171
+ def listen
172
+ begin
173
+ listener = Listen.to("./", :filter => %r{(.*).(js|css|less|scss|mustache|handlebars|html)}, :ignore => [/js.js/,/style.css/]) do
174
+ compile
175
+ end
176
+ listener = listener.ignore(/js.js/,/style.css/)
177
+ rescue Exception => e
178
+ puts "\nListening stopped"
179
+ end
153
180
  end
154
181
 
155
182
 
183
+
156
184
 
157
185
 
158
186
 
@@ -0,0 +1,16 @@
1
+ class CSS_Processor
2
+ def process(less_files)
3
+ if less_files.length > 0 then
4
+ less_files.delete("style.less")
5
+ less_string = ""
6
+ less_files.each { |file|
7
+ file = file.gsub(".less","")
8
+ less_string = less_string + "@import '#{file}'; \n"
9
+ File.open('style.less','w') { |f|
10
+ f.write(less_string)
11
+ }
12
+ }
13
+ %x[lessc style.less style.css]
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ require "sass"
2
+
3
+ class CSS_Processor
4
+ def process(files)
5
+ scss_string = ""
6
+ files.each { |file|
7
+ scss_string << File.read(file)+"\n"
8
+ }
9
+ engine = Sass::Engine.new(scss_string, :syntax => :scss)
10
+ css = engine.render
11
+ File.open('style.css','w') { |f|
12
+ f.write(css)
13
+ }
14
+ end
15
+ end
@@ -1,23 +1,27 @@
1
- # FRONTENDLOADER CONFIG
1
+ # FrontendLoader Configuration
2
2
 
3
3
  javascript:
4
- framework: "mootools"
5
- directory: "."
6
- compress: false
4
+ enabled: true
5
+ yui: true
6
+ jsmin: true
7
7
  prioritize:
8
+ - priority.js
8
9
  ignore:
9
- -"js.js"
10
-
10
+ - ignored.js
11
11
 
12
12
  css:
13
- framework: "less"
14
- directory: "."
13
+ enabled: true
14
+ format: scss
15
15
  prioritize:
16
+ - priority.scss
16
17
  ignore:
17
-
18
+ - ignored.scss
18
19
 
19
20
  templates:
20
- format: "mustache"
21
- varname: "templates"
22
- directory: "."
21
+ enabled: true
22
+ format: mustache
23
+ varname: templates
24
+ prioritize:
25
+ - priority.mustache
23
26
  ignore:
27
+ - ignored.mustache
data/resources/Guardfile CHANGED
@@ -1,6 +1,6 @@
1
1
  # FrontendLoader Guardfile
2
2
 
3
- ignore_paths 'js.js','templates.js', 'lfc.js'
3
+ ignore_paths 'js.js','templates.js'
4
4
 
5
5
  guard 'shell' do
6
6
  watch(/(.*).js/) {|m| `fel compile` }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: frontendloader
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,31 +12,9 @@ bindir: bin
12
12
  cert_chain: []
13
13
  date: 2011-10-28 00:00:00.000000000Z
14
14
  dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: jscat
17
- requirement: &70154404499240 !ruby/object:Gem::Requirement
18
- none: false
19
- requirements:
20
- - - ! '>='
21
- - !ruby/object:Gem::Version
22
- version: 1.0.2
23
- type: :runtime
24
- prerelease: false
25
- version_requirements: *70154404499240
26
- - !ruby/object:Gem::Dependency
27
- name: filestojs
28
- requirement: &70154404498760 !ruby/object:Gem::Requirement
29
- none: false
30
- requirements:
31
- - - ! '>='
32
- - !ruby/object:Gem::Version
33
- version: 1.0.1
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: *70154404498760
37
15
  - !ruby/object:Gem::Dependency
38
16
  name: guard
39
- requirement: &70154404498300 !ruby/object:Gem::Requirement
17
+ requirement: &70147735023720 !ruby/object:Gem::Requirement
40
18
  none: false
41
19
  requirements:
42
20
  - - ! '>='
@@ -44,10 +22,10 @@ dependencies:
44
22
  version: 0.8.8
45
23
  type: :runtime
46
24
  prerelease: false
47
- version_requirements: *70154404498300
25
+ version_requirements: *70147735023720
48
26
  - !ruby/object:Gem::Dependency
49
27
  name: guard-shell
50
- requirement: &70154404497780 !ruby/object:Gem::Requirement
28
+ requirement: &70147735022900 !ruby/object:Gem::Requirement
51
29
  none: false
52
30
  requirements:
53
31
  - - ! '>='
@@ -55,7 +33,7 @@ dependencies:
55
33
  version: 0.2.0
56
34
  type: :runtime
57
35
  prerelease: false
58
- version_requirements: *70154404497780
36
+ version_requirements: *70147735022900
59
37
  description: Accelerated front end development
60
38
  email: dan@explodingbox.com
61
39
  executables:
@@ -65,6 +43,8 @@ extra_rdoc_files: []
65
43
  files:
66
44
  - README.rdoc
67
45
  - lib/FrontEndLoader.rb
46
+ - lib/processors/less.rb
47
+ - lib/processors/scss.rb
68
48
  - resources/FrontEndLoader.yml
69
49
  - resources/Guardfile
70
50
  - bin/fel
@@ -94,3 +74,4 @@ specification_version: 3
94
74
  summary: A command line interface for rapid creation of web app interfaces, compiling
95
75
  less, js and mustache files into two requests
96
76
  test_files: []
77
+ has_rdoc: true