merb-less-more 0.0.1
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/LICENSE +20 -0
- data/README +6 -0
- data/Rakefile +108 -0
- data/TODO +1 -0
- data/lib/merb-less-more/controller_extension.rb +7 -0
- data/lib/merb-less-more/more.rb +142 -0
- data/lib/merb-less-more.rb +19 -0
- metadata +83 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 YOUR NAME
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
GEM_NAME = "merb-less-more"
|
2
|
+
GEM_VERSION = "0.0.1"
|
3
|
+
AUTHOR = "Spencer Steffen"
|
4
|
+
EMAIL = "spencer@citrusme.com"
|
5
|
+
HOMEPAGE = "http://citrusme.com/"
|
6
|
+
SUMMARY = "Merb plugin for less css support."
|
7
|
+
|
8
|
+
|
9
|
+
begin
|
10
|
+
require 'jeweler'
|
11
|
+
Jeweler::Tasks.new do |gemspec|
|
12
|
+
gemspec.name = GEM_NAME
|
13
|
+
gemspec.platform = Gem::Platform::RUBY
|
14
|
+
gemspec.has_rdoc = true
|
15
|
+
gemspec.extra_rdoc_files = ["README", "LICENSE", "TODO"]
|
16
|
+
gemspec.summary = SUMMARY
|
17
|
+
gemspec.description = SUMMARY
|
18
|
+
gemspec.author = AUTHOR
|
19
|
+
gemspec.email = EMAIL
|
20
|
+
gemspec.homepage = HOMEPAGE
|
21
|
+
gemspec.add_dependency('merb-core', '>= 1.1.0')
|
22
|
+
gemspec.require_path = 'lib'
|
23
|
+
gemspec.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{lib,spec}/**/*")
|
24
|
+
end
|
25
|
+
Jeweler::GemcutterTasks.new
|
26
|
+
rescue LoadError
|
27
|
+
puts "Jeweler not available. Install it with: gem install jeweler"
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
#
|
32
|
+
#
|
33
|
+
#
|
34
|
+
#
|
35
|
+
#require 'rake/gempackagetask'
|
36
|
+
#
|
37
|
+
##require 'merb-core'
|
38
|
+
##require 'merb-core/tasks/merb'
|
39
|
+
#
|
40
|
+
#spec = Gem::Specification.new do |s|
|
41
|
+
#
|
42
|
+
#end
|
43
|
+
#
|
44
|
+
#
|
45
|
+
#begin
|
46
|
+
# require 'jeweler'
|
47
|
+
# Jeweler::Tasks.new do |gemspec|
|
48
|
+
# # Attributes omitted.
|
49
|
+
#
|
50
|
+
#
|
51
|
+
#
|
52
|
+
# puts "WTf #{gemspec}"
|
53
|
+
#
|
54
|
+
#
|
55
|
+
# end
|
56
|
+
# Jeweler::GemcutterTasks.new
|
57
|
+
#rescue LoadError
|
58
|
+
# puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
59
|
+
#end
|
60
|
+
#
|
61
|
+
#
|
62
|
+
###Rake::GemPackageTask.new(spec) do |pkg|
|
63
|
+
### pkg.gem_spec = spec
|
64
|
+
###end
|
65
|
+
###
|
66
|
+
###desc "install the plugin as a gem"
|
67
|
+
###task :build do
|
68
|
+
### pkg.gem_spec = spec
|
69
|
+
###
|
70
|
+
### #Merb::RakeHelper.install(GEM_NAME, :version => GEM_VERSION)
|
71
|
+
###
|
72
|
+
###
|
73
|
+
###end
|
74
|
+
####
|
75
|
+
####desc "Uninstall the gem"
|
76
|
+
####task :uninstall do
|
77
|
+
#### Merb::RakeHelper.uninstall(GEM_NAME, :version => GEM_VERSION)
|
78
|
+
####end
|
79
|
+
###
|
80
|
+
###desc "Create a gemspec file"
|
81
|
+
###task :gemspec do
|
82
|
+
### File.open("#{GEM_NAME}.gemspec", "w") do |file|
|
83
|
+
### file.puts spec.to_ruby
|
84
|
+
### end
|
85
|
+
###end
|
86
|
+
###
|
87
|
+
####begin
|
88
|
+
#### require 'spec'
|
89
|
+
#### require 'spec/rake/spectask'
|
90
|
+
####
|
91
|
+
#### task :default => [ :spec ]
|
92
|
+
####
|
93
|
+
#### desc 'Run specifications'
|
94
|
+
#### Spec::Rake::SpecTask.new(:spec) do |t|
|
95
|
+
#### t.spec_opts << '--options' << 'spec/spec.opts' if File.exists?('spec/spec.opts')
|
96
|
+
#### t.spec_opts << '--color' << '--format' << 'specdoc'
|
97
|
+
#### begin
|
98
|
+
#### require 'rcov'
|
99
|
+
#### t.rcov_opts << '--exclude' << 'spec'
|
100
|
+
#### t.rcov_opts << '--text-summary'
|
101
|
+
#### t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
|
102
|
+
#### rescue LoadError
|
103
|
+
#### # rcov not installed
|
104
|
+
#### end
|
105
|
+
#### end
|
106
|
+
####rescue LoadError
|
107
|
+
#### # rspec not installed
|
108
|
+
####end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
# Less::More provides methods for parsing LESS files in a rails application to CSS target files.
|
2
|
+
#
|
3
|
+
# When Less::More.parse is called, all files in Less::More.source_path will be parsed using LESS
|
4
|
+
# and saved as CSS files in Less::More.destination_path. If Less::More.compression is set to true,
|
5
|
+
# extra line breaks will be removed to compress the CSS files.
|
6
|
+
#
|
7
|
+
# By default, Less::More.parse will be called for each request in `development` environment and on
|
8
|
+
# application initialization in `production` environment.
|
9
|
+
|
10
|
+
begin
|
11
|
+
require 'less'
|
12
|
+
rescue LoadError => e
|
13
|
+
e.message << " (You may need to install the less gem)"
|
14
|
+
raise e
|
15
|
+
end
|
16
|
+
|
17
|
+
class Less::More
|
18
|
+
HEADER = %{/*\n\n\n\n\n\tThis file was auto generated by Less (http://lesscss.org). To change the contents of this file, edit %s instead.\n\n\n\n\n*/}
|
19
|
+
|
20
|
+
class << self
|
21
|
+
# Less::More.compression = true/false --- compress generated css ? (default: false)
|
22
|
+
# Less::More.header = true/false --- insert editing warning into css ? (default: true)
|
23
|
+
# Less::More.destination_path = 'css' --- put css into public/??? (default: stylesheets)
|
24
|
+
# Less::More.source_path = 'public/stylesheets/less' --- where do less files live? (default: app/stylesheets)
|
25
|
+
attr_writer :compression, :header, :destination_path, :source_path
|
26
|
+
|
27
|
+
def header
|
28
|
+
@header.nil? ? true : @header
|
29
|
+
end
|
30
|
+
|
31
|
+
def destination_path
|
32
|
+
@destination_path || 'stylesheets'
|
33
|
+
end
|
34
|
+
|
35
|
+
def source_path
|
36
|
+
@source_path || 'app/stylesheets'
|
37
|
+
end
|
38
|
+
|
39
|
+
def compression
|
40
|
+
@compression
|
41
|
+
end
|
42
|
+
|
43
|
+
# Generates the .css from a .less or .lss file in Less::More.source_path matching
|
44
|
+
# the given parameters.
|
45
|
+
#
|
46
|
+
# Less::More.generate("screen.less")
|
47
|
+
# Less::More.generate("subdirectories/here/homepage.less")
|
48
|
+
def generate(source)
|
49
|
+
generated = to_dot_css(path_to_destination(source))
|
50
|
+
path_to_source = File.join(Merb.root, source_path, source)
|
51
|
+
|
52
|
+
# check if the destination file exists, and compare the modified times to see if it needs to be written
|
53
|
+
if mtime(generated) >= mtime_including_imports(path_to_source)
|
54
|
+
# up to date, nothing to do!
|
55
|
+
else
|
56
|
+
# css file does not exist or is out of date
|
57
|
+
css = if File.extname(path_to_source) == ".css"
|
58
|
+
# vanilla css nothing to do!
|
59
|
+
File.read(path_to_source)
|
60
|
+
else
|
61
|
+
# less or lss file, compile it
|
62
|
+
css = compile(path_to_source)
|
63
|
+
css.delete!("\n") if compression # TODO: use real compression !
|
64
|
+
css = (HEADER % [File.join(source_path, source)]) << css if header
|
65
|
+
css
|
66
|
+
end
|
67
|
+
|
68
|
+
# write the css
|
69
|
+
FileUtils.mkdir_p File.dirname(generated)
|
70
|
+
File.open(generated, "w"){|f| f.write css }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Generates all the .css files
|
75
|
+
def generate_all
|
76
|
+
all_less_files.each do |path|
|
77
|
+
generate(relative_to_source_path(path))
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Removes all generated css files.
|
82
|
+
def remove_all_generated
|
83
|
+
all_less_files.each do |path|
|
84
|
+
css_path = to_dot_css(relative_to_source_path(path))
|
85
|
+
css_file = path_to_destination(css_path)
|
86
|
+
File.delete(css_file) if File.file?(css_file)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Array of paths of less source files.
|
91
|
+
def all_less_files
|
92
|
+
all = Dir[File.join(Merb.root, source_path, "**", "*.{css,less,lss}")]
|
93
|
+
all.reject{|path| File.basename(path) =~ /^_/ }
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def mtime(file)
|
99
|
+
return 0 unless File.file?(file)
|
100
|
+
File.mtime(file).to_i
|
101
|
+
end
|
102
|
+
|
103
|
+
# consider imports for mtime
|
104
|
+
# just 1 level deep so we do not get any looping/nesting errors
|
105
|
+
def mtime_including_imports(file)
|
106
|
+
mtimes = [mtime(file)]
|
107
|
+
File.readlines(file).each do |line|
|
108
|
+
if line =~ /^\s*@import ['"]([^'"]+)/
|
109
|
+
imported = File.join(File.dirname(file), $1)
|
110
|
+
mtimes << if imported =~ /\.le?ss$/ # complete path given ?
|
111
|
+
mtime(imported)
|
112
|
+
else # we need to add .less or .lss
|
113
|
+
[mtime("#{imported}.less"), mtime("#{imported}.lss")].max
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
mtimes.max
|
118
|
+
end
|
119
|
+
|
120
|
+
def compile(file)
|
121
|
+
begin
|
122
|
+
engine = File.open(file){|f| Less::Engine.new(f) }
|
123
|
+
engine.to_css
|
124
|
+
rescue Exception => e
|
125
|
+
e.message << "\nFrom #{file}"
|
126
|
+
raise e
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def to_dot_css(path)
|
131
|
+
path.to_s.sub(/(le?|c)ss$/, "css")
|
132
|
+
end
|
133
|
+
|
134
|
+
def path_to_destination(path)
|
135
|
+
File.join(Merb.root, "public", destination_path, path)
|
136
|
+
end
|
137
|
+
|
138
|
+
def relative_to_source_path(path)
|
139
|
+
path.to_s.sub(File.join(Merb.root, source_path), '')[1..-1]
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# make sure we're running inside Merb
|
2
|
+
if defined?(Merb::Plugins)
|
3
|
+
|
4
|
+
# Merb gives you a Merb::Plugins.config hash...feel free to put your stuff in your piece of it
|
5
|
+
Merb::Plugins.config[:more] = {
|
6
|
+
:chickens => false
|
7
|
+
}
|
8
|
+
|
9
|
+
Merb::BootLoader.before_app_loads do
|
10
|
+
require File.join(File.dirname(__FILE__), "merb-less-more", "more.rb")
|
11
|
+
require File.join(File.dirname(__FILE__), "merb-less-more", "controller_extension.rb")
|
12
|
+
end
|
13
|
+
|
14
|
+
Merb::BootLoader.after_app_loads do
|
15
|
+
# code that can be required after the application loads
|
16
|
+
end
|
17
|
+
|
18
|
+
#Merb::Plugins.add_rakefiles "merb-less-more/merbtasks"
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: merb-less-more
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Spencer Steffen
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-04-08 00:00:00 -07:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: merb-core
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 1
|
29
|
+
- 1
|
30
|
+
- 0
|
31
|
+
version: 1.1.0
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
description: Merb plugin for less css support.
|
35
|
+
email: spencer@citrusme.com
|
36
|
+
executables: []
|
37
|
+
|
38
|
+
extensions: []
|
39
|
+
|
40
|
+
extra_rdoc_files:
|
41
|
+
- LICENSE
|
42
|
+
- README
|
43
|
+
- TODO
|
44
|
+
files:
|
45
|
+
- LICENSE
|
46
|
+
- README
|
47
|
+
- Rakefile
|
48
|
+
- TODO
|
49
|
+
- lib/merb-less-more.rb
|
50
|
+
- lib/merb-less-more/controller_extension.rb
|
51
|
+
- lib/merb-less-more/more.rb
|
52
|
+
has_rdoc: true
|
53
|
+
homepage: http://citrusme.com/
|
54
|
+
licenses: []
|
55
|
+
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options:
|
58
|
+
- --charset=UTF-8
|
59
|
+
require_paths:
|
60
|
+
- lib
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
segments:
|
66
|
+
- 0
|
67
|
+
version: "0"
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
version: "0"
|
75
|
+
requirements: []
|
76
|
+
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 1.3.6
|
79
|
+
signing_key:
|
80
|
+
specification_version: 3
|
81
|
+
summary: Merb plugin for less css support.
|
82
|
+
test_files: []
|
83
|
+
|