diff --git a/lib/rake-pipeline-web-filters.rb b/lib/rake-pipeline-web-filters.rb index 8548ca6..8b41dfd 100644 --- a/lib/rake-pipeline-web-filters.rb +++ b/lib/rake-pipeline-web-filters.rb @@ -17,6 +17,7 @@ module Filters require "rake-pipeline-web-filters/neuter_filter" require "rake-pipeline-web-filters/sass_filter" require "rake-pipeline-web-filters/stylus_filter" +require "rake-pipeline-web-filters/jade_filter" require "rake-pipeline-web-filters/tilt_filter" require "rake-pipeline-web-filters/coffee_script_filter" require "rake-pipeline-web-filters/yui_javascript_filter" diff --git a/lib/rake-pipeline-web-filters/helpers.rb b/lib/rake-pipeline-web-filters/helpers.rb index 4a90880..c921c99 100644 --- a/lib/rake-pipeline-web-filters/helpers.rb +++ b/lib/rake-pipeline-web-filters/helpers.rb @@ -33,6 +33,12 @@ def sass(*args, &block) end alias_method :scss, :sass + # Add a new {JadeFilter} to the pipeline. + # @see JadeFilter#initialize + def jade(*args, &block) + filter(Rake::Pipeline::Web::Filters::JadeFilter, *args, &block) + end + # Add a new {StylusFilter} to the pipeline. # @see StylusFilter#initialize def stylus(*args, &block) diff --git a/lib/rake-pipeline-web-filters/jade_filter.rb b/lib/rake-pipeline-web-filters/jade_filter.rb new file mode 100644 index 0000000..2b52ea2 --- /dev/null +++ b/lib/rake-pipeline-web-filters/jade_filter.rb @@ -0,0 +1,59 @@ +require 'rake-pipeline-web-filters/filter_with_dependencies' + +module Rake::Pipeline::Web::Filters + # A filter that compiles input files written in Jade + # to HTML using the Jade compiler + # + # Requires node and https://npmjs.org/package/jade by + # [sudo] npm install jade -g + # + # @example + # !!!ruby + # Rake::Pipeline.build do + # input "app/assets", "**/*.jade" + # output "public" + # + # # Compile each Jade file under the app/assets + # # directory. + # filter Rake::Pipeline::Web::Filters::JadeFilter + # end + # !!!ruby + # Rake::Pipeline.build do + # input "app/assets", "**/*.jade" + # output "public" + # + # jade :pretty + # end + class JadeFilter < Rake::Pipeline::Filter + include Rake::Pipeline::Web::Filters::FilterWithDependencies + + # @return [Hash] a hash of options to pass to Less + # when compiling. + # @option option :prettify output + attr_reader :options + + def initialize(options={}, &block) + block ||= proc { |input| input.sub(/\.(jade)$/, '.html') } + super(&block) + @options = options + end + + def generate_output(inputs, output) + + inputs.each do |input| + if options[:pretty] + output.write `echo "#{input.read}" | jade -P` + else + output.write `echo "#{input.read}" | jade` + end + end + end + + private + + def external_dependencies + [ ] + end + + end +end diff --git a/rake-pipeline-web-filters.gemspec b/rake-pipeline-web-filters.gemspec index e064a7f..1febaed 100644 --- a/rake-pipeline-web-filters.gemspec +++ b/rake-pipeline-web-filters.gemspec @@ -30,4 +30,5 @@ Gem::Specification.new do |gem| gem.add_development_dependency "json" gem.add_development_dependency "therubyracer" gem.add_development_dependency "stylus" + gem.add_development_dependency "jade" end diff --git a/spec/helpers_spec.rb b/spec/helpers_spec.rb index d40667d..80ae2d5 100644 --- a/spec/helpers_spec.rb +++ b/spec/helpers_spec.rb @@ -33,6 +33,13 @@ def filter end end + describe "#jade" do + it "creates a JadeCompiler" do + dsl.jade + filter.should be_kind_of(Rake::Pipeline::Web::Filters::JadeFilter) + end + end + describe "#tilt" do it "creates a TiltFilter" do dsl.tilt diff --git a/spec/jade_filter_spec.rb b/spec/jade_filter_spec.rb new file mode 100644 index 0000000..8bdc219 --- /dev/null +++ b/spec/jade_filter_spec.rb @@ -0,0 +1,83 @@ +describe "JadeFilter" do + JadeFilter ||= Rake::Pipeline::Web::Filters::JadeFilter + MemoryFileWrapper ||= Rake::Pipeline::SpecHelpers::MemoryFileWrapper + + let(:jade_input) {""" +!!! 5 +html + head + title Hello + body + h1 Hello +""" +} + + let(:expected_html_output) {"""Hello

Hello

""" +} + +let(:expected_prettified_html_output) {"""\ + + + + Hello + + +

Hello

+ +""" +} + + def input_file(name, content) + MemoryFileWrapper.new("/path/to/input", name, "UTF-8", content) + end + + def output_file(name) + MemoryFileWrapper.new("/path/to/output", name, "UTF-8") + end + + def setup_filter(filter, input=jade_input) + filter.file_wrapper_class = MemoryFileWrapper + filter.input_files = [input_file("index.jade", input)] + filter.output_root = "/path/to/output" + filter.rake_application = Rake::Application.new + filter + end + + it "generates output" do + filter = setup_filter JadeFilter.new + + filter.output_files.should == [output_file("index.html")] + + tasks = filter.generate_rake_tasks + tasks.each(&:invoke) + + file = MemoryFileWrapper.files["/path/to/output/index.html"] + file.body.should == expected_html_output + file.encoding.should == "UTF-8" + end + + it "prettifies output" do + filter = setup_filter JadeFilter.new :pretty => true + + filter.output_files.should == [output_file("index.html")] + + tasks = filter.generate_rake_tasks + tasks.each(&:invoke) + + file = MemoryFileWrapper.files["/path/to/output/index.html"] + file.body.should == expected_prettified_html_output + file.encoding.should == "UTF-8" + end + + describe "naming output files" do + it "translates .jade extensions to .html by default" do + filter = setup_filter JadeFilter.new + filter.output_files.first.path.should == "index.html" + end + + it "accepts a block to customize output file names" do + filter = setup_filter(JadeFilter.new { |input| "hbs" }) + filter.output_files.first.path.should == "hbs" + end + end +end