-
-
Save boynoiz/5179e57ff851670d10cd to your computer and use it in GitHub Desktop.
Rakefile - less to sass a.k.a. less2sass or less2scss
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# less to scss based on http://stackoverflow.com/a/19167099/2363935 | |
namespace :convert do | |
task :less_to_scss do | |
source_glob = "resources/assets/less/*.less" | |
dest_dir = "resources/assets/sass/" | |
rm_r dest_dir rescue nil | |
mkdir_p(dest_dir) | |
file_map = {} | |
# copy the files | |
Dir.glob(source_glob).each do |source_file| | |
# puts "\tWorking on #{source_file}" | |
basename = File.basename(source_file, '.less') | |
dest_filename = "_#{basename}.scss" | |
dest_file = File.join(dest_dir, dest_filename) | |
# track the file mapping for a replace later | |
file_map["#{basename}.less"] = dest_filename | |
cp source_file, dest_file | |
# convert_file(source_file, dest_file) | |
end | |
# do the conversion | |
Dir.glob("#{dest_dir}/*.scss").each do |file_name| | |
puts "Converting #{file_name}" | |
text = File.read(file_name) | |
# http://stackoverflow.com/a/19167099/2363935 | |
# 1. replace @ with $ | |
text = text.gsub(/@(?!import|media|keyframes|-)/, '$') | |
# 2. replace mixins | |
text = text.gsub(/\.([\w\-]*)\s*\((.*)\)\s*\{/, '@mixin \1(\2){') | |
# 3. replace includes | |
text = text.gsub(/\.([\w\-]*\s*;)/, '@include \1') | |
# 3. a) replace no param mixin includes with empty parens | |
text = text.gsub(/@include\ ([\w\-]*\s*;)/, '@include \1()') | |
# 3. b) I'm terrible with regex, 3a makes a ';()', so fix it | |
text = text.gsub(/;\(\)/, '();') | |
# 4. replace string literals | |
text = text.gsub(/~"(.*)"/, '#{"\1"}') | |
# 5. replace all the file maps | |
file_map.each do |less, scss| | |
text = text.gsub(less, scss) | |
end | |
File.open(file_name, 'w') { |file| file.puts text } | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment