processit 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. data/Gemfile +8 -0
  2. data/README +16 -0
  3. data/README.markdown +16 -0
  4. data/bin/processit +49 -0
  5. data/lib/processit.rb +27 -0
  6. data/lib/processit/base.rb +105 -0
  7. data/lib/processit/builder.rb +105 -0
  8. data/lib/processit/context.rb +236 -0
  9. data/lib/processit/processor/charset_normalizer.rb +41 -0
  10. data/lib/processit/processor/ejs_template.rb +37 -0
  11. data/lib/processit/processor/jsmin_template.rb +32 -0
  12. data/lib/processit/processor/jst_processor.rb +33 -0
  13. data/lib/processit/processor/safety_colons.rb +28 -0
  14. data/lib/processit/processors.rb +56 -0
  15. data/lib/processit/setup.rb +17 -0
  16. data/lib/processit/templates/default/config.rb +13 -0
  17. data/lib/processit/templates/default/src/css/bootstrap.css +4883 -0
  18. data/lib/processit/templates/default/src/css/bootstrap.min.css +729 -0
  19. data/lib/processit/templates/default/src/css/main.css +5 -0
  20. data/lib/processit/templates/default/src/css/variables.css +9 -0
  21. data/lib/processit/templates/default/src/img/glyphicons-halflings-white.png +0 -0
  22. data/lib/processit/templates/default/src/img/glyphicons-halflings.png +0 -0
  23. data/lib/processit/templates/default/src/js/application.js +7 -0
  24. data/lib/processit/templates/default/src/js/include.js +3 -0
  25. data/lib/processit/templates/default/src/js/lib/bootstrap.js +1835 -0
  26. data/lib/processit/templates/default/src/js/lib/bootstrap.min.js +7 -0
  27. data/lib/processit/templates/default/src/js/lib/jquery-1.7.2.js +9404 -0
  28. data/lib/processit/templates/default/src/js/lib/jquery-1.7.2.min.js +4 -0
  29. data/lib/processit/templates/default/src/pages/index.haml +19 -0
  30. data/lib/processit/utils.rb +69 -0
  31. data/lib/processit/version.rb +3 -0
  32. metadata +138 -0
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source :rubygems
2
+
3
+ gem "jeweler"
4
+ gem "tilt"
5
+
6
+ group :development do
7
+
8
+ end
data/README ADDED
@@ -0,0 +1,16 @@
1
+ <h1>ProcessMe</h1>
2
+
3
+ <h2>Resources</h2>
4
+
5
+ * [ProcessMe Homepage](http://process-me.org/)
6
+ * [Installing ProcessMe](http://process-me.org/install/)
7
+ * [ProcessMe Reference](http://process-me.org/install/reference/)
8
+
9
+ <h2>Author</h2>
10
+ ProcessMe is written by [Adam Scherer][adam@annconia.com].<br>
11
+ Adam is a Software Architect who likes everything simple.
12
+
13
+ <h2>License</h2>
14
+ Copyright (c) 2012 Adam Scherer<br>
15
+ All Rights Reserved.<br>
16
+ Released under a [slightly modified MIT License][license].
data/README.markdown ADDED
@@ -0,0 +1,16 @@
1
+ # ProcessIt
2
+
3
+ ## Resources
4
+
5
+ * [ProcessMe Homepage](http://process-it.org/)
6
+ * [Installing ProcessMe](http://process-it.org/install/)
7
+ * [ProcessMe Reference](http://process-it.org/install/reference/)
8
+
9
+ ## Author
10
+ ProcessMe is written by [Adam Scherer][adam@annconia.com].<br>
11
+ Adam is a Software Architect who likes everything simple.
12
+
13
+ ## License
14
+ Copyright (c) 2012 Adam Scherer<br>
15
+ All Rights Reserved.<br>
16
+ Released under a [slightly modified MIT License][license].
data/bin/processit ADDED
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'processit'
4
+ require 'optparse'
5
+ require 'shellwords'
6
+
7
+ builder = ProcessIt::Builder.new
8
+
9
+ OptionParser.new do |opts|
10
+ opts.summary_width = 28
11
+ opts.banner = "Usage: processit [options]"
12
+
13
+ def opts.show_usage
14
+ puts self
15
+ exit 1
16
+ end
17
+
18
+ opts.on("-c", "--compile", "Compile the entire source structure") do |name|
19
+ builder.build
20
+ end
21
+
22
+ opts.on("-w", "--watch", "Perform an initial compile and then monitor for changes to compile automatically") do |directory|
23
+ builder.watch
24
+ end
25
+
26
+ opts.on("-n PROJECT_NAME", "--create PROJECT_NAME", "Copy the project template into PROJECT_NAME") do |name|
27
+
28
+ end
29
+
30
+ opts.on_tail("-h", "--help", "Shows this help message") do
31
+ opts.show_usage
32
+ end
33
+
34
+ opts.on_tail("-v", "--version", "Shows version") do
35
+ puts ProcessIt::VERSION
36
+ exit
37
+ end
38
+
39
+ opts.show_usage if ARGV.empty?
40
+
41
+ begin
42
+ opts.order(ARGV) do |filename|
43
+ filenames << File.expand_path(filename)
44
+ end
45
+ rescue OptionParser::ParseError => e
46
+ opts.warn e.message
47
+ opts.show_usage
48
+ end
49
+ end
data/lib/processit.rb ADDED
@@ -0,0 +1,27 @@
1
+ require 'processit/version'
2
+
3
+
4
+ module ProcessIt
5
+
6
+ autoload :EjsTemplate, "processit/processor/ejs_template"
7
+ autoload :JstProcessor, "processit/processor/jst_processor"
8
+ autoload :JsMinTemplate, "processit/processor/jsmin_template"
9
+ autoload :CharsetNormalizer, "processit/processor/charset_normalizer"
10
+ autoload :SafetyColons, "processit/processor/safety_colons"
11
+ autoload :Utils, "processit/utils"
12
+
13
+ require 'processit/processors'
14
+ require 'processit/builder'
15
+ require 'tilt'
16
+ require 'haml'
17
+ require 'yaml'
18
+
19
+ Processors.instance.register_processor '.js', 'js', [Tilt::ERBTemplate, SafetyColons, JsMinTemplate]
20
+ Processors.instance.register_processor '.jst', 'js', [Tilt::ERBTemplate, EjsTemplate]
21
+ Processors.instance.register_processor '.haml', 'html', [Tilt::ERBTemplate, Tilt::HamlTemplate]
22
+ Processors.instance.register_processor '.html', 'html', [Tilt::ERBTemplate]
23
+ Processors.instance.register_processor '.scss', 'css', [Tilt::ERBTemplate, Tilt::ScssTemplate]
24
+ Processors.instance.register_processor '.sass', 'css', [Tilt::ERBTemplate, Tilt::SassTemplate]
25
+ Processors.instance.register_processor '.css', 'css', [Tilt::ERBTemplate, CharsetNormalizer]
26
+
27
+ end
@@ -0,0 +1,105 @@
1
+ module ProcessIt
2
+ class Base
3
+
4
+ include StaticMatic::RenderMixin
5
+ include StaticMatic::BuildMixin
6
+ include StaticMatic::SetupMixin
7
+ include StaticMatic::HelpersMixin
8
+ include StaticMatic::ServerMixin
9
+ include StaticMatic::RescueMixin
10
+
11
+ attr_accessor :configuration
12
+ attr_reader :current_page, :src_dir, :site_dir
13
+
14
+ def current_file
15
+ @current_file_stack[0] || ""
16
+ end
17
+
18
+ def initialize(base_dir, configuration = Configuration.new)
19
+ @configuration = configuration
20
+ @current_page = nil
21
+ @current_file_stack = []
22
+ @base_dir = base_dir
23
+ @src_dir = File.join(@base_dir, "src")
24
+ @site_dir = File.join(@base_dir, "site")
25
+
26
+ if File.exists?(File.join(@src_dir, "layouts", "application.haml"))
27
+ puts "DEPRECATION: layouts/application.haml will be renamed to layouts/default.haml in 0.12.0"
28
+ @default_layout = "application"
29
+ else
30
+ @default_layout = "default"
31
+ end
32
+
33
+ @scope = Object.new
34
+ @scope.instance_variable_set("@staticmatic", self)
35
+
36
+ load_configuration
37
+ configure_compass
38
+
39
+ load_helpers
40
+ end
41
+
42
+ def load_configuration
43
+ configuration = StaticMatic::Configuration.new
44
+ config_file = File.join(@base_dir, "config", "site.rb")
45
+
46
+ if !File.exists?(config_file)
47
+ config_file = File.join(@base_dir, "src", "configuration.rb")
48
+
49
+ if File.exists?(config_file)
50
+ puts "DEPRECATION: #{@base_dir}/src/configuration.rb will be moved to #{@base_dir}/config/site.rb in 0.12.0"
51
+ end
52
+ end
53
+
54
+ if File.exists?(config_file)
55
+ config = File.read(config_file)
56
+ eval(config)
57
+ end
58
+
59
+ @configuration = configuration
60
+ end
61
+
62
+ def base_dir
63
+ @base_dir
64
+ end
65
+
66
+ def run(command)
67
+ puts "Site root is: #{@base_dir}"
68
+
69
+ if %w(build setup preview).include?(command)
70
+ send(command)
71
+ else
72
+ puts "#{command} is not a valid StaticMatic command"
73
+ end
74
+ end
75
+
76
+ # TODO: DRY this _exists? section up
77
+ def template_exists?(name, dir = '')
78
+ File.exists?(File.join(@src_dir, 'pages', dir, "#{name}.haml")) || File.exists?(File.join(@src_dir, 'stylesheets', "#{name}.sass")) || File.exists?(File.join(@src_dir, 'stylesheets', "#{name}.scss"))
79
+ end
80
+
81
+ def layout_exists?(name)
82
+ File.exists? full_layout_path(name)
83
+ end
84
+
85
+ def template_directory?(path)
86
+ File.directory?(File.join(@src_dir, 'pages', path))
87
+ end
88
+
89
+ def full_layout_path(name)
90
+ File.join(@src_dir, "layouts", "#{name}.haml")
91
+ end
92
+
93
+ def configure_compass
94
+ Compass.configuration.project_path = @base_dir
95
+
96
+ compass_config_path = File.join(@base_dir, "config", "compass.rb")
97
+
98
+ if File.exists?(compass_config_path)
99
+ Compass.add_configuration(compass_config_path)
100
+ end
101
+
102
+ configuration.sass_options.merge!(Compass.configuration.to_sass_engine_options)
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,105 @@
1
+ require 'processit/utils'
2
+ require 'processit/processors'
3
+ require 'fileutils'
4
+
5
+ module ProcessIt
6
+ class Builder
7
+
8
+ def initialize(root = ".")
9
+ @base_dir = Dir.pwd
10
+ @src_dir = File.join(@base_dir, "src")
11
+ @site_dir = File.join(@base_dir, "site")
12
+ @html_src_dir = File.join(@src_dir, "pages")
13
+
14
+ @config = YAML.load_file("#{@src_dir}/data/data.yml")
15
+ end
16
+
17
+ def watch
18
+ puts ">>> ProcessMe is watching for changes. Press Ctrl-C to Stop."
19
+
20
+ require 'fssm'
21
+ begin
22
+ FSSM.monitor do |monitor|
23
+ monitor.path @src_dir do |path|
24
+ path.create do |base, relative|
25
+ build
26
+ end
27
+
28
+ path.update do |base, relative|
29
+ build
30
+ end
31
+
32
+ path.delete do |base, relative|
33
+ build
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ def build
41
+ puts ">>> ProcessIt is building your site."
42
+ Dir["#{@src_dir}/**/*"].each do |path|
43
+ next if File.basename(path) =~ /^\_/ or File.directory?(path) # skip partials and directories
44
+
45
+ save_page(path, evaluate(path))
46
+ end
47
+ end
48
+
49
+ def evaluate(path, options = {})
50
+ ext = File.extname(path)
51
+ path = File.absolute_path(path, @src_dir)
52
+ result = ProcessIt::Utils.read_unicode(path)
53
+ Processors.instance.processor(ext)["klasses"].each do |processor|
54
+ begin
55
+ template = processor.new(path) { result }
56
+ result = template.render(self, @config)
57
+ rescue Exception => e
58
+ puts e
59
+ raise
60
+ end
61
+ end
62
+
63
+ result
64
+ end
65
+
66
+ def cms()
67
+
68
+ end
69
+
70
+ def copy_file(from, to)
71
+ FileUtils.cp(from, to)
72
+ end
73
+
74
+ def save_page(path, content)
75
+ ext = File.extname(path)
76
+ file_dir, file_name = File.split(path)
77
+ relative_name = path.sub(/^#{@src_dir}/, '')
78
+ relative_name.chomp!(ext)
79
+ output_ext = Processors.instance.processor(ext)["output_ext"]
80
+ if (output_ext)
81
+ generate_site_file(relative_name, output_ext, content)
82
+ end
83
+ end
84
+
85
+ def generate_site_file(relative_name, extension, content)
86
+
87
+ path = File.join(@site_dir, "#{relative_name}.#{extension}")
88
+ FileUtils.mkdir_p(File.dirname(path))
89
+ File.open(path, 'w+') do |f|
90
+ f << content
91
+ end
92
+
93
+ puts "created #{path}"
94
+ end
95
+
96
+ # Returns a raw template name from a source file path:
97
+ # source_template_from_path("/path/to/site/src/stylesheets/application.sass") -> "application"
98
+ def source_template_from_path(path)
99
+ file_dir, file_name = File.split(path)
100
+ file_name.chomp!(File.extname(file_name))
101
+ [ file_dir, file_name, File.extname(path) ]
102
+ end
103
+
104
+ end
105
+ end
@@ -0,0 +1,236 @@
1
+ require 'base64'
2
+ require 'rack/utils'
3
+ require 'sprockets/errors'
4
+ require 'sprockets/utils'
5
+ require 'pathname'
6
+ require 'set'
7
+
8
+ module ProcessIt
9
+ # `Context` provides helper methods to all `Tilt` processors. They
10
+ # are typically accessed by ERB templates. You can mix in custom
11
+ # helpers by injecting them into `Environment#context_class`. Do not
12
+ # mix them into `Context` directly.
13
+ #
14
+ # environment.context_class.class_eval do
15
+ # include MyHelper
16
+ # def asset_url; end
17
+ # end
18
+ #
19
+ # <%= asset_url "foo.png" %>
20
+ #
21
+ # The `Context` also collects dependencies declared by
22
+ # assets. See `DirectiveProcessor` for an example of this.
23
+ class Context
24
+ attr_reader :environment, :pathname
25
+ attr_reader :_required_paths, :_stubbed_assets
26
+ attr_reader :_dependency_paths, :_dependency_assets
27
+ attr_writer :__LINE__
28
+
29
+ def initialize(environment, logical_path, pathname)
30
+ @environment = environment
31
+ @logical_path = logical_path
32
+ @pathname = pathname
33
+ @__LINE__ = nil
34
+
35
+ @_required_paths = []
36
+ @_stubbed_assets = Set.new
37
+ @_dependency_paths = Set.new
38
+ @_dependency_assets = Set.new([pathname.to_s])
39
+ end
40
+
41
+ # Returns the environment path that contains the file.
42
+ #
43
+ # If `app/javascripts` and `app/stylesheets` are in your path, and
44
+ # current file is `app/javascripts/foo/bar.js`, `root_path` would
45
+ # return `app/javascripts`.
46
+ def root_path
47
+ environment.paths.detect { |path| pathname.to_s[path] }
48
+ end
49
+
50
+ # Returns logical path without any file extensions.
51
+ #
52
+ # 'app/javascripts/application.js'
53
+ # # => 'application'
54
+ #
55
+ def logical_path
56
+ @logical_path.chomp(File.extname(@logical_path))
57
+ end
58
+
59
+ # Returns content type of file
60
+ #
61
+ # 'application/javascript'
62
+ # 'text/css'
63
+ #
64
+ def content_type
65
+ environment.content_type_of(pathname)
66
+ end
67
+
68
+ # Given a logical path, `resolve` will find and return the fully
69
+ # expanded path. Relative paths will also be resolved. An optional
70
+ # `:content_type` restriction can be supplied to restrict the
71
+ # search.
72
+ #
73
+ # resolve("foo.js")
74
+ # # => "/path/to/app/javascripts/foo.js"
75
+ #
76
+ # resolve("./bar.js")
77
+ # # => "/path/to/app/javascripts/bar.js"
78
+ #
79
+ def resolve(path, options = {}, &block)
80
+ pathname = Pathname.new(path)
81
+ attributes = environment.attributes_for(pathname)
82
+
83
+ if pathname.absolute?
84
+ pathname
85
+
86
+ elsif content_type = options[:content_type]
87
+ content_type = self.content_type if content_type == :self
88
+
89
+ if attributes.format_extension
90
+ if content_type != attributes.content_type
91
+ raise ContentTypeMismatch, "#{path} is " +
92
+ "'#{attributes.content_type}', not '#{content_type}'"
93
+ end
94
+ end
95
+
96
+ resolve(path) do |candidate|
97
+ if self.content_type == environment.content_type_of(candidate)
98
+ return candidate
99
+ end
100
+ end
101
+
102
+ raise FileNotFound, "couldn't find file '#{path}'"
103
+ else
104
+ environment.resolve(path, {:base_path => self.pathname.dirname}.merge(options), &block)
105
+ end
106
+ end
107
+
108
+ # `depend_on` allows you to state a dependency on a file without
109
+ # including it.
110
+ #
111
+ # This is used for caching purposes. Any changes made to
112
+ # the dependency file with invalidate the cache of the
113
+ # source file.
114
+ def depend_on(path)
115
+ @_dependency_paths << resolve(path).to_s
116
+ nil
117
+ end
118
+
119
+ # `depend_on_asset` allows you to state an asset dependency
120
+ # without including it.
121
+ #
122
+ # This is used for caching purposes. Any changes that would
123
+ # invalidate the dependency asset will invalidate the source
124
+ # file. Unlike `depend_on`, this will include recursively include
125
+ # the target asset's dependencies.
126
+ def depend_on_asset(path)
127
+ filename = resolve(path).to_s
128
+ @_dependency_assets << filename
129
+ nil
130
+ end
131
+
132
+ # `require_asset` declares `path` as a dependency of the file. The
133
+ # dependency will be inserted before the file and will only be
134
+ # included once.
135
+ #
136
+ # If ERB processing is enabled, you can use it to dynamically
137
+ # require assets.
138
+ #
139
+ # <%= require_asset "#{framework}.js" %>
140
+ #
141
+ def require_asset(path)
142
+ pathname = resolve(path, :content_type => :self)
143
+ depend_on_asset(pathname)
144
+ @_required_paths << pathname.to_s
145
+ nil
146
+ end
147
+
148
+ # `stub_asset` blacklists `path` from being included in the bundle.
149
+ # `path` must be an asset which may or may not already be included
150
+ # in the bundle.
151
+ def stub_asset(path)
152
+ @_stubbed_assets << resolve(path, :content_type => :self).to_s
153
+ nil
154
+ end
155
+
156
+ # Tests if target path is able to be safely required into the
157
+ # current concatenation.
158
+ def asset_requirable?(path)
159
+ pathname = resolve(path)
160
+ content_type = environment.content_type_of(pathname)
161
+ stat = environment.stat(path)
162
+ return false unless stat && stat.file?
163
+ self.content_type.nil? || self.content_type == content_type
164
+ end
165
+
166
+ # Reads `path` and runs processors on the file.
167
+ #
168
+ # This allows you to capture the result of an asset and include it
169
+ # directly in another.
170
+ #
171
+ # <%= evaluate "bar.js" %>
172
+ #
173
+ def evaluate(path, options = {})
174
+ pathname = resolve(path)
175
+ attributes = environment.attributes_for(pathname)
176
+ processors = options[:processors] || attributes.processors
177
+
178
+ if options[:data]
179
+ result = options[:data]
180
+ else
181
+ if environment.respond_to?(:default_external_encoding)
182
+ mime_type = environment.mime_types(pathname.extname)
183
+ encoding = environment.encoding_for_mime_type(mime_type)
184
+ result = Sprockets::Utils.read_unicode(pathname, encoding)
185
+ else
186
+ result = Sprockets::Utils.read_unicode(pathname)
187
+ end
188
+ end
189
+
190
+ processors.each do |processor|
191
+
192
+ begin
193
+ template = processor.new(pathname.to_s) { result }
194
+ result = template.render(self, {})
195
+ rescue Exception => e
196
+ annotate_exception! e
197
+ raise
198
+ end
199
+ end
200
+
201
+ result
202
+ end
203
+
204
+ # Returns a Base64-encoded `data:` URI with the contents of the
205
+ # asset at the specified path, and marks that path as a dependency
206
+ # of the current file.
207
+ #
208
+ # Use `asset_data_uri` from ERB with CSS or JavaScript assets:
209
+ #
210
+ # #logo { background: url(<%= asset_data_uri 'logo.png' %>) }
211
+ #
212
+ # $('<img>').attr('src', '<%= asset_data_uri 'avatar.jpg' %>')
213
+ #
214
+ def asset_data_uri(path)
215
+ depend_on_asset(path)
216
+ asset = environment.find_asset(path)
217
+ base64 = Base64.encode64(asset.to_s).gsub(/\s+/, "")
218
+ "data:#{asset.content_type};base64,#{Rack::Utils.escape(base64)}"
219
+ end
220
+
221
+ private
222
+ # Annotates exception backtrace with the original template that
223
+ # the exception was raised in.
224
+ def annotate_exception!(exception)
225
+ location = pathname.to_s
226
+ location << ":#{@__LINE__}" if @__LINE__
227
+
228
+ exception.extend(Sprockets::EngineError)
229
+ exception.sprockets_annotation = " (in #{location})"
230
+ end
231
+
232
+ def logger
233
+ environment.logger
234
+ end
235
+ end
236
+ end