diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 2cb044a..f8d09ee 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -3,3 +3,4 @@ * Martin Kuckert @MKuckert * Ivan Lazarevic @kopipejst * Matt DuVall @mduvall twitter:@mduvall_ +* Mekka Okereke @mekka @mekkaokereke diff --git a/Gemfile b/Gemfile index fa46110..6509c70 100644 --- a/Gemfile +++ b/Gemfile @@ -6,6 +6,8 @@ gemspec # optional runtime dependencies gem "sass" gem "compass" +gem "therubyracer" +gem "less", :require => false gem "rake", :require => false gem "debugger" diff --git a/lib/csscss/cli.rb b/lib/csscss/cli.rb index afb217d..b536a2d 100644 --- a/lib/csscss/cli.rb +++ b/lib/csscss/cli.rb @@ -16,31 +16,64 @@ def run execute end + def gem_installed?(gem_name) + begin + require gem_name + rescue LoadError + return false + end + true + end + + def load_sass_file(filename) + if !gem_installed?('sass') then + puts "Must install sass gem before parsing sass/scss files" + exit 1 + end + + sass_options = {cache:false} + sass_options[:load_paths] = Compass.configuration.sass_load_paths if @compass + begin + Sass::Engine.for_file(filename, sass_options).render + rescue Sass::SyntaxError => e + if e.message =~ /compass/ && !@compass + puts "Enable --compass option to use compass's extensions" + exit 1 + else + raise e + end + end + end + + def load_less_file(filename) + if !gem_installed?('less') then + puts "Must install less gem before parsing less files (try \"gem install less\", or add less to your Gemfile)" + exit 1 + end + + begin + contents = open(filename) {|f| f.read } + Less::Parser.new.parse(contents).to_css + rescue Less::ParseError => e + puts "Less parse error" + exit 1 + end + end + + def load_css_file(filename) + open(filename) {|f| f.read } + end + def execute warn_old_debug_flag if ENV["CSSCSS_DEBUG"] - all_contents = @argv.map do |filename| + all_contents= @argv.map do |filename| if %w(.scss .sass).include?(File.extname(filename).downcase) && !(filename =~ URI.regexp) - begin - require "sass" - rescue LoadError - abort "Must install sass gem before parsing sass/scss files" - end - - sass_options = {cache:false} - sass_options[:load_paths] = Compass.configuration.sass_load_paths if @compass - begin - Sass::Engine.for_file(filename, sass_options).render - rescue Sass::SyntaxError => e - if e.message =~ /compass/ && !@compass - puts "Enable --compass option to use compass's extensions" - exit 1 - else - raise e - end - end + load_sass_file(filename) + elsif %w(.less).include?(File.extname(filename).downcase) && !(filename =~ URI.regexp) + load_less_file(filename) else - open(filename) {|f| f.read } + load_css_file(filename) end end.join("\n") diff --git a/test/csscss/cli_test.rb b/test/csscss/cli_test.rb new file mode 100644 index 0000000..7fbcd77 --- /dev/null +++ b/test/csscss/cli_test.rb @@ -0,0 +1,41 @@ +require "test_helper.rb" + +module Csscss + + def less_gem_installed + begin + require "less" + rescue LoadError + puts "Less Gem does not appear to be installed. Skipping Less tests" + false + end + true + end + + describe CLI do + it "parses valid less and sass files the same as css files" do + css_types = [] + + css_check = Csscss::CLI.new("filename") + css_file = css_check.load_css_file("test/csscss/test_input_files/test.css") + #css_types.push css_file + + if (css_check.gem_installed?('less')) then + less_check = Csscss::CLI.new("filename") + less_file = less_check.load_less_file("test/csscss/test_input_files/test.less") + css_types.push less_file + else + puts "Less not installed, skipping less parsing tests..." + end + + if (css_check.gem_installed?('sass')) then + sass_check = Csscss::CLI.new("filename") + sass_file = sass_check.load_sass_file("test/csscss/test_input_files/test.sass") + css_types.push sass_file + else + puts "Sass not installed, skipping sass parsing tests..." + end + + end + end +end diff --git a/test/csscss/test_input_files/test.css b/test/csscss/test_input_files/test.css new file mode 100644 index 0000000..de89b33 --- /dev/null +++ b/test/csscss/test_input_files/test.css @@ -0,0 +1,2 @@ +.me { border: 1px solid; } +.me2 { border: 1px solid; } diff --git a/test/csscss/test_input_files/test.less b/test/csscss/test_input_files/test.less new file mode 100644 index 0000000..0275dd2 --- /dev/null +++ b/test/csscss/test_input_files/test.less @@ -0,0 +1,14 @@ +.me { + border: 1px solid; + font-family: Arial; + background: #005555; +} + +.me2 +{ + border: 1px solid; + font-family: Arial; + background: #005555; +} + + diff --git a/test/csscss/test_input_files/test.sass b/test/csscss/test_input_files/test.sass new file mode 100644 index 0000000..fd0bc52 --- /dev/null +++ b/test/csscss/test_input_files/test.sass @@ -0,0 +1,13 @@ +.me + border: 1px solid + font-family: Arial + background: #005555 + + +.me2 + border: 1px solid + font-family: Arial + background: #005555 + + +