rake-pipeline-web-filters-fork 0.6.0
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.
- data/.gitignore +19 -0
- data/.rspec +1 -0
- data/.travis.yml +11 -0
- data/.yardopts +2 -0
- data/Gemfile +6 -0
- data/README.markdown +58 -0
- data/README.yard +25 -0
- data/Rakefile +10 -0
- data/lib/rake-pipeline-web-filters.rb +31 -0
- data/lib/rake-pipeline-web-filters/cache_buster_filter.rb +42 -0
- data/lib/rake-pipeline-web-filters/chained_filter.rb +116 -0
- data/lib/rake-pipeline-web-filters/coffee_script_filter.rb +41 -0
- data/lib/rake-pipeline-web-filters/filter_with_dependencies.rb +27 -0
- data/lib/rake-pipeline-web-filters/gzip_filter.rb +59 -0
- data/lib/rake-pipeline-web-filters/handlebars_filter.rb +62 -0
- data/lib/rake-pipeline-web-filters/helpers.rb +138 -0
- data/lib/rake-pipeline-web-filters/iife_filter.rb +38 -0
- data/lib/rake-pipeline-web-filters/jade_filter.rb +61 -0
- data/lib/rake-pipeline-web-filters/less_filter.rb +55 -0
- data/lib/rake-pipeline-web-filters/markdown_filter.rb +70 -0
- data/lib/rake-pipeline-web-filters/minispade_filter.rb +63 -0
- data/lib/rake-pipeline-web-filters/neuter_filter.rb +110 -0
- data/lib/rake-pipeline-web-filters/sass_filter.rb +87 -0
- data/lib/rake-pipeline-web-filters/stylus_filter.rb +59 -0
- data/lib/rake-pipeline-web-filters/tilt_filter.rb +70 -0
- data/lib/rake-pipeline-web-filters/uglify_filter.rb +82 -0
- data/lib/rake-pipeline-web-filters/version.rb +9 -0
- data/lib/rake-pipeline-web-filters/yui_css_filter.rb +70 -0
- data/lib/rake-pipeline-web-filters/yui_javascript_filter.rb +59 -0
- data/rake-pipeline-web-filters.gemspec +33 -0
- data/spec/cache_buster_filter_spec.rb +108 -0
- data/spec/chained_filter_spec.rb +79 -0
- data/spec/coffee_script_filter_spec.rb +113 -0
- data/spec/gzip_filter_spec.rb +52 -0
- data/spec/handlebars_filter_spec.rb +73 -0
- data/spec/helpers_spec.rb +146 -0
- data/spec/iife_filter_spec.rb +58 -0
- data/spec/jade_filter_spec.rb +92 -0
- data/spec/less_filter_spec.rb +62 -0
- data/spec/markdown_filter_spec.rb +89 -0
- data/spec/minispade_filter_spec.rb +82 -0
- data/spec/neuter_filter_spec.rb +216 -0
- data/spec/sass_filter_spec.rb +152 -0
- data/spec/spec_helper.rb +28 -0
- data/spec/stylus_filter_spec.rb +72 -0
- data/spec/support/spec_helpers/file_utils.rb +33 -0
- data/spec/support/spec_helpers/filters.rb +37 -0
- data/spec/support/spec_helpers/input_helpers.rb +23 -0
- data/spec/support/spec_helpers/memory_file_wrapper.rb +38 -0
- data/spec/support/spec_helpers/memory_manifest.rb +19 -0
- data/spec/tilt_filter_spec.rb +82 -0
- data/spec/uglify_filter_spec.rb +128 -0
- data/spec/yui_css_filter_spec.rb +91 -0
- data/spec/yui_javascript_filter_spec.rb +71 -0
- metadata +308 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
module Rake::Pipeline::Web::Filters
|
2
|
+
# A filter that converts handlebars templates to javascript
|
3
|
+
# and stores them in a defined variable.
|
4
|
+
#
|
5
|
+
# @example
|
6
|
+
# !!!ruby
|
7
|
+
# Rake::Pipeline.build do
|
8
|
+
# input "**/*.handlebars"
|
9
|
+
# output "public"
|
10
|
+
#
|
11
|
+
# # Compile each handlebars file to JS
|
12
|
+
# handlebars
|
13
|
+
# end
|
14
|
+
class HandlebarsFilter < Rake::Pipeline::Filter
|
15
|
+
|
16
|
+
include Rake::Pipeline::Web::Filters::FilterWithDependencies
|
17
|
+
|
18
|
+
# @return [Hash] a hash of options for generate_output
|
19
|
+
attr_reader :options
|
20
|
+
|
21
|
+
# @param [Hash] options
|
22
|
+
# options to pass to the output generator
|
23
|
+
# @option options [Array] :target
|
24
|
+
# the variable to store templates in
|
25
|
+
# @option options [Array] :compile_open
|
26
|
+
# the js to wrap template contents in
|
27
|
+
# @option options [Array] :compile_close
|
28
|
+
# the js to wrap template contents in
|
29
|
+
# @param [Proc] block a block to use as the Filter's
|
30
|
+
# {#output_name_generator}.
|
31
|
+
def initialize(options={},&block)
|
32
|
+
# Convert .handlebars file extensions to .js
|
33
|
+
block ||= proc { |input| input.sub(/\.handlebars|\.hbs$/, '.js') }
|
34
|
+
super(&block)
|
35
|
+
@options = {
|
36
|
+
:target =>'Ember.TEMPLATES',
|
37
|
+
:wrapper_proc => proc { |source| "Ember.Handlebars.compile(#{source});" },
|
38
|
+
:key_name_proc => proc { |input| File.basename(input.path, File.extname(input.path)) }
|
39
|
+
}.merge(options)
|
40
|
+
end
|
41
|
+
|
42
|
+
def generate_output(inputs, output)
|
43
|
+
|
44
|
+
inputs.each do |input|
|
45
|
+
# The name of the template is the filename, sans extension
|
46
|
+
name = options[:key_name_proc].call(input)
|
47
|
+
|
48
|
+
# Read the file and escape it so it's a valid JS string
|
49
|
+
source = input.read.to_json
|
50
|
+
|
51
|
+
# Write out a JS file, saved to target, wrapped in compiler
|
52
|
+
output.write "#{options[:target]}['#{name}']=#{options[:wrapper_proc].call(source)}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def external_dependencies
|
59
|
+
[ 'json' ]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
module Rake::Pipeline::Web::Filters
|
2
|
+
# Extends the Rake::Pipeline DSL to include shortcuts
|
3
|
+
# for adding filters to the pipeline.
|
4
|
+
#
|
5
|
+
# Instead of:
|
6
|
+
# !!!ruby
|
7
|
+
# match("*.scss") do
|
8
|
+
# filter Rake::Pipeline::Web::Filters::SassFilter, :syntax => :sass
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# You can do:
|
12
|
+
# !!!ruby
|
13
|
+
# match("*.scss") do
|
14
|
+
# sass :syntax => :sass
|
15
|
+
# end
|
16
|
+
module PipelineHelpers
|
17
|
+
# Add a new {MinispadeFilter} to the pipeline.
|
18
|
+
# @see MinispadeFilter#initialize
|
19
|
+
def minispade(*args, &block)
|
20
|
+
filter(Rake::Pipeline::Web::Filters::MinispadeFilter, *args, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Add a new {NeuterFilter} to the pipeline.
|
24
|
+
# @see NeuterFilter#initialize
|
25
|
+
def neuter(*args, &block)
|
26
|
+
filter(Rake::Pipeline::Web::Filters::NeuterFilter, *args, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Add a new {SassFilter} to the pipeline.
|
30
|
+
# @see SassFilter#initialize
|
31
|
+
def sass(*args, &block)
|
32
|
+
filter(Rake::Pipeline::Web::Filters::SassFilter, *args, &block)
|
33
|
+
end
|
34
|
+
alias_method :scss, :sass
|
35
|
+
|
36
|
+
# Add a new {JadeFilter} to the pipeline.
|
37
|
+
# @see JadeFilter#initialize
|
38
|
+
def jade(*args, &block)
|
39
|
+
filter(Rake::Pipeline::Web::Filters::JadeFilter, *args, &block)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Add a new {StylusFilter} to the pipeline.
|
43
|
+
# @see StylusFilter#initialize
|
44
|
+
def stylus(*args, &block)
|
45
|
+
filter(Rake::Pipeline::Web::Filters::StylusFilter, *args, &block)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Add a new {TiltFilter} to the pipeline.
|
49
|
+
# @see TiltFilter#initialize
|
50
|
+
def tilt(*args, &block)
|
51
|
+
filter(Rake::Pipeline::Web::Filters::TiltFilter, *args, &block)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Add a new {MarkdownFilter} to the pipeline.
|
55
|
+
# @see MarkdownFilter#initialize
|
56
|
+
def markdown(*args, &block)
|
57
|
+
filter(Rake::Pipeline::Web::Filters::MarkdownFilter, *args, &block)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Add a new {CacheBusterFilter} to the pipeline.
|
61
|
+
# @see CacheBusterFilter#initialize
|
62
|
+
def cache_buster(&block)
|
63
|
+
filter(Rake::Pipeline::Web::Filters::CacheBusterFilter, &block)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Add a new {CoffeeScriptFilter} to the pipeline.
|
67
|
+
# @see CoffeeScriptFilter#initialize
|
68
|
+
def coffee_script(*args, &block)
|
69
|
+
filter(Rake::Pipeline::Web::Filters::CoffeeScriptFilter, *args, &block)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Add a new {YUIJavaScriptFilter} to the pipeline.
|
73
|
+
# @see YUIJavaScriptFilter#initialize
|
74
|
+
def yui_javascript(*args, &block)
|
75
|
+
filter(Rake::Pipeline::Web::Filters::YUIJavaScriptFilter, *args, &block)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Add a new {YUICssFilter} to the pipeline.
|
79
|
+
# @see YUICssFilter#initialize
|
80
|
+
def yui_css(*args, &block)
|
81
|
+
filter(Rake::Pipeline::Web::Filters::YUICssFilter, *args, &block)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Add a new {GzipFilter} to the pipeline.
|
85
|
+
# @see GzipFilter#initialize
|
86
|
+
def gzip(&block)
|
87
|
+
filter(Rake::Pipeline::Web::Filters::GzipFilter, &block)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Add a new {UglifyFilter} to the pipeline.
|
91
|
+
# @see UglifyFilter#initialize
|
92
|
+
def uglify(*args, &block)
|
93
|
+
filter(Rake::Pipeline::Web::Filters::UglifyFilter, *args, &block)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Add a new {LessFilter} to the pipeline.
|
97
|
+
# @see LessFilter#initialize
|
98
|
+
def less(*args, &block)
|
99
|
+
filter(Rake::Pipeline::Web::Filters::LessFilter, *args, &block)
|
100
|
+
end
|
101
|
+
|
102
|
+
# Add a new {HandlebarsFilter} to the pipeline.
|
103
|
+
# @see HandlebarsFilter#initialize
|
104
|
+
def handlebars(*args, &block)
|
105
|
+
filter(Rake::Pipeline::Web::Filters::HandlebarsFilter, *args, &block)
|
106
|
+
end
|
107
|
+
#
|
108
|
+
# Add a new {IifeFilter} to the pipeline.
|
109
|
+
# @see IifeFilter#initialize
|
110
|
+
def iife(*args, &block)
|
111
|
+
filter(Rake::Pipeline::Web::Filters::IifeFilter, *args, &block)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
module ProjectHelpers
|
116
|
+
# Register a filter class for a particular file extension
|
117
|
+
# and add a ChainedFilter as a before filter.
|
118
|
+
#
|
119
|
+
# If this is the first use of +register+, it will set up
|
120
|
+
# the before filter. Subsequent uses will just update the
|
121
|
+
# types hash.
|
122
|
+
#
|
123
|
+
# @see ChainedFilter
|
124
|
+
def register(extension, klass)
|
125
|
+
if @types_hash
|
126
|
+
@types_hash[extension] = klass
|
127
|
+
else
|
128
|
+
@types_hash = { extension => klass }
|
129
|
+
before_filter ChainedFilter, { :types => @types_hash }
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
require "rake-pipeline/dsl"
|
136
|
+
|
137
|
+
Rake::Pipeline::DSL::PipelineDSL.send(:include, Rake::Pipeline::Web::Filters::PipelineHelpers)
|
138
|
+
Rake::Pipeline::DSL::ProjectDSL.send(:include, Rake::Pipeline::Web::Filters::ProjectHelpers)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Rake::Pipeline::Web::Filters
|
2
|
+
# A filter that wraps input files in an IIFE (immediately invoked functional expression)
|
3
|
+
#
|
4
|
+
#
|
5
|
+
# @example
|
6
|
+
# !!!ruby
|
7
|
+
# Rake::Pipeline.build do
|
8
|
+
# input "app/assets", "**/*.js"
|
9
|
+
# output "public"
|
10
|
+
#
|
11
|
+
# # Wrap each file in: (function() { ... })();"
|
12
|
+
# filter Rake::Pipeline::Web::Filters::IifeFilter
|
13
|
+
# end
|
14
|
+
class IifeFilter < Rake::Pipeline::Filter
|
15
|
+
# @param [Proc] block a block to use as the Filter's
|
16
|
+
# {#output_name_generator}.
|
17
|
+
def initialize(&block)
|
18
|
+
block ||= proc { |input| input }
|
19
|
+
super(&block)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Implement the {#generate_output} method required by
|
23
|
+
# the {Filter} API. Wraps each input in an IIFE.
|
24
|
+
#
|
25
|
+
# @param [Array<FileWrapper>] inputs an Array of
|
26
|
+
# {FileWrapper} objects representing the inputs to
|
27
|
+
# this filter.
|
28
|
+
# @param [FileWrapper] output a single {FileWrapper}
|
29
|
+
# object representing the output.
|
30
|
+
def generate_output(inputs, output)
|
31
|
+
inputs.each do |input|
|
32
|
+
output.write "(function() {\n"
|
33
|
+
output.write input.read
|
34
|
+
output.write "})();"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'rake-pipeline-web-filters/filter_with_dependencies'
|
2
|
+
|
3
|
+
module Rake::Pipeline::Web::Filters
|
4
|
+
# A filter that compiles input files written in Jade
|
5
|
+
# to HTML using the Jade compiler
|
6
|
+
#
|
7
|
+
# Requires node and https://npmjs.org/package/jade by
|
8
|
+
# [sudo] npm install jade -g
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# !!!ruby
|
12
|
+
# Rake::Pipeline.build do
|
13
|
+
# input "app/assets", "**/*.jade"
|
14
|
+
# output "public"
|
15
|
+
#
|
16
|
+
# # Compile each Jade file under the app/assets
|
17
|
+
# # directory.
|
18
|
+
# filter Rake::Pipeline::Web::Filters::JadeFilter
|
19
|
+
# end
|
20
|
+
# !!!ruby
|
21
|
+
# Rake::Pipeline.build do
|
22
|
+
# input "app/assets", "**/*.jade"
|
23
|
+
# output "public"
|
24
|
+
#
|
25
|
+
# jade :pretty
|
26
|
+
# end
|
27
|
+
class JadeFilter < Rake::Pipeline::Filter
|
28
|
+
include Rake::Pipeline::Web::Filters::FilterWithDependencies
|
29
|
+
|
30
|
+
# @return [Hash] a hash of options to pass to Less
|
31
|
+
# when compiling.
|
32
|
+
# @option option :prettify output
|
33
|
+
attr_reader :options
|
34
|
+
|
35
|
+
def initialize(options={}, &block)
|
36
|
+
block ||= proc { |input| input.sub(/\.(jade)$/, '.html') }
|
37
|
+
super(&block)
|
38
|
+
@options = options
|
39
|
+
end
|
40
|
+
|
41
|
+
def generate_output(inputs, output)
|
42
|
+
|
43
|
+
inputs.each do |input|
|
44
|
+
if options[:pretty]
|
45
|
+
`jade < #{input.root}/#{input.path} -P --path #{input.root}/#{input.path} > #{output.root}/#{output.path}`
|
46
|
+
else
|
47
|
+
`jade < #{input.root}/#{input.path} --path #{input.root}/#{input.path} > #{output.root}/#{output.path}`
|
48
|
+
end
|
49
|
+
out = output.read
|
50
|
+
output.write out
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def external_dependencies
|
57
|
+
[ ]
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'rake-pipeline-web-filters/filter_with_dependencies'
|
2
|
+
|
3
|
+
module Rake::Pipeline::Web::Filters
|
4
|
+
# A filter that accepts a series of inputs and translates
|
5
|
+
# them using the Tilt template interface, which will attempt
|
6
|
+
# to guess which template language to use based on the input
|
7
|
+
# file extension.
|
8
|
+
#
|
9
|
+
# Requires {https://rubygems.org/gems/less-js less-js}
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# !!!ruby
|
13
|
+
# Rake::Pipeline.build do
|
14
|
+
# input "app/assets", "**/*.less"
|
15
|
+
# output "public"
|
16
|
+
#
|
17
|
+
# # Compile each less file with Less.js
|
18
|
+
# filter Rake::Pipeline::Web::Filters::LessFilter
|
19
|
+
# end
|
20
|
+
class LessFilter < Rake::Pipeline::Filter
|
21
|
+
include Rake::Pipeline::Web::Filters::FilterWithDependencies
|
22
|
+
|
23
|
+
# @return [Hash] a hash of options to pass to Less
|
24
|
+
# when compiling.
|
25
|
+
attr_reader :options
|
26
|
+
|
27
|
+
# @param [Proc] block a block to use as the Filter's
|
28
|
+
# {#output_name_generator}.
|
29
|
+
def initialize(options={}, context = nil, &block)
|
30
|
+
block ||= proc { |input| input.sub(/\.less$/, '.css') }
|
31
|
+
super(&block)
|
32
|
+
@options = options
|
33
|
+
end
|
34
|
+
|
35
|
+
# Implement the {#generate_output} method required by
|
36
|
+
# the {Filter} API. Attempts to compile each input file
|
37
|
+
# with LessJs.
|
38
|
+
#
|
39
|
+
# @param [Array<FileWrapper>] inputs an Array of
|
40
|
+
# {FileWrapper} objects representing the inputs to
|
41
|
+
# this filter.
|
42
|
+
# @param [FileWrapper] output a single {FileWrapper}
|
43
|
+
# object representing the output.
|
44
|
+
def generate_output(inputs, output)
|
45
|
+
parser = Less::Parser.new options
|
46
|
+
inputs.each do |input|
|
47
|
+
output.write parser.parse(input.read).to_css
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def external_dependencies
|
52
|
+
[ 'less' ]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Rake::Pipeline::Web::Filters
|
2
|
+
# A filter that compiles input files written in Markdown
|
3
|
+
# to Markdown using the Redcarpet compiler.
|
4
|
+
#
|
5
|
+
# @example
|
6
|
+
# !!!ruby
|
7
|
+
# Rake::Pipeline.build do
|
8
|
+
# input "app/assets", "**/*.md"
|
9
|
+
# output "public"
|
10
|
+
#
|
11
|
+
# # Compile each .md file under the app/assets
|
12
|
+
# # directory.
|
13
|
+
# filter Rake::Pipeline::Web::Filters::MarkdownFilter
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
class MarkdownFilter < Rake::Pipeline::Filter
|
17
|
+
|
18
|
+
# @param [Hash] options options to pass to the markdown
|
19
|
+
# compiler
|
20
|
+
# @see http://rubydoc.info/gems/redcarpet/2.0.0/frames for more information
|
21
|
+
# about options
|
22
|
+
# @option options [#call] :compiler If you wish to use a different
|
23
|
+
# Markdown compiler, you can do so by passing anything that responds
|
24
|
+
# to `:call`, which will be passed the Markdown text and any
|
25
|
+
# options (other than `:compiler`).
|
26
|
+
# @option options [Redcarpet::Render::Base] :renderer a
|
27
|
+
# Redcarpet renderer. Used only if using the default compiler.
|
28
|
+
# @param [Proc] block a block to use as the Filter's
|
29
|
+
# {#output_name_generator}.
|
30
|
+
def initialize(options={}, &block)
|
31
|
+
block ||= proc { |input| input.sub(/\.(md|mdown|mkdown|markdown)$/, '.html') }
|
32
|
+
super(&block)
|
33
|
+
@compiler = options.delete(:compiler)
|
34
|
+
@options = options
|
35
|
+
end
|
36
|
+
|
37
|
+
# Implement the {#generate_output} method required by
|
38
|
+
# the {Filter} API. Compiles each input file with Sass.
|
39
|
+
#
|
40
|
+
# @param [Array<FileWrapper>] inputs an Array of
|
41
|
+
# {FileWrapper} objects representing the inputs to
|
42
|
+
# this filter.
|
43
|
+
# @param [FileWrapper] output a single {FileWrapper}
|
44
|
+
# object representing the output.
|
45
|
+
def generate_output(inputs, output)
|
46
|
+
inputs.each do |input|
|
47
|
+
output.write compile(input.read)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def compile(markdown)
|
54
|
+
if @compiler
|
55
|
+
@compiler.call(markdown, @options)
|
56
|
+
else
|
57
|
+
default_compiler.render(markdown)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def default_compiler
|
62
|
+
@default_renderer ||= begin
|
63
|
+
require 'redcarpet'
|
64
|
+
renderer = @options.delete(:renderer) || Redcarpet::Render::HTML.new
|
65
|
+
Redcarpet::Markdown.new(renderer, @options)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Rake::Pipeline::Web::Filters
|
2
|
+
# A filter that wraps JavaScript files in a minispade.register closure
|
3
|
+
# for use in minispade.
|
4
|
+
#
|
5
|
+
# @example
|
6
|
+
# !!!ruby
|
7
|
+
# Rake::Pipeline.build do
|
8
|
+
# input "app/assets", "**/*.js"
|
9
|
+
# output "public"
|
10
|
+
#
|
11
|
+
# # Wrap each JS file in a minispade.register closure.
|
12
|
+
# filter Rake::Pipeline::Web::Filters::MinispadeFilter
|
13
|
+
# end
|
14
|
+
class MinispadeFilter < Rake::Pipeline::Filter
|
15
|
+
|
16
|
+
# @param [Hash] options
|
17
|
+
# @option options [Boolean] :use_strict Whether to add "use strict" to
|
18
|
+
# each outputted function; defaults to false.
|
19
|
+
# @option options [Proc] :module_id_generator a proc to use to generate
|
20
|
+
# the minispade module id.
|
21
|
+
# @option options [Boolean] :rewrite_requires If true, change calls to
|
22
|
+
# +require+ in the source to +minispade.require+.
|
23
|
+
# @option options [Boolean] :string If true, compiles the output as
|
24
|
+
# a String instead of a closure. This means that @sourceURL can be
|
25
|
+
# appended for good stack traces and debugging.
|
26
|
+
def initialize(options = {})
|
27
|
+
super()
|
28
|
+
@use_strict = options[:use_strict]
|
29
|
+
@module_id_generator = options[:module_id_generator] ||
|
30
|
+
proc { |input| input.fullpath.sub(Dir.pwd, '') }
|
31
|
+
@rewrite_requires = options[:rewrite_requires]
|
32
|
+
@string_module = options[:string]
|
33
|
+
end
|
34
|
+
|
35
|
+
# Implement the {#generate_output} method required by
|
36
|
+
# the {Filter} API. Wraps each input file in a minispade.register
|
37
|
+
# closure.
|
38
|
+
#
|
39
|
+
# @param [Array<FileWrapper>] inputs an Array of
|
40
|
+
# {FileWrapper} objects representing the inputs to
|
41
|
+
# this filter.
|
42
|
+
# @param [FileWrapper] output a single {FileWrapper}
|
43
|
+
# object representing the output.
|
44
|
+
def generate_output(inputs, output)
|
45
|
+
inputs.each do |input|
|
46
|
+
code = input.read
|
47
|
+
code.gsub!(%r{^\s*require\s*\(\s*}, 'minispade.require(') if @rewrite_requires
|
48
|
+
code.gsub!(%r{^\s*requireAll\s*\(\s*}, 'minispade.requireAll(') if @rewrite_requires
|
49
|
+
code = %["use strict";\n] + code if @use_strict
|
50
|
+
|
51
|
+
module_id = @module_id_generator.call(input)
|
52
|
+
|
53
|
+
if @string_module
|
54
|
+
contents = %{(function() {#{code}\n})();\n/*@if (@_jscript) @else @*/\n//@ sourceURL=#{module_id}\n/*@end@*/}.to_json
|
55
|
+
else
|
56
|
+
contents = "function() {#{code}\n}"
|
57
|
+
end
|
58
|
+
ret = "minispade.register('#{module_id}', #{contents});"
|
59
|
+
output.write ret
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|