compass-core 1.0.0.alpha.13
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.
- checksums.yaml +7 -0
- data/LICENSE.txt +22 -0
- data/VERSION +1 -0
- data/data/caniuse.json +1 -0
- data/data/caniuse_extras/css-placeholder.json +171 -0
- data/lib/compass-core.rb +1 -0
- data/lib/compass/browser_support.rb +62 -0
- data/lib/compass/configuration.rb +168 -0
- data/lib/compass/configuration/data.rb +178 -0
- data/lib/compass/configuration/defaults.rb +197 -0
- data/lib/compass/configuration/inheritance.rb +304 -0
- data/lib/compass/configuration/paths.rb +19 -0
- data/lib/compass/core.rb +64 -0
- data/lib/compass/core/caniuse.rb +282 -0
- data/lib/compass/core/sass_extensions.rb +10 -0
- data/lib/compass/core/sass_extensions/functions.rb +39 -0
- data/lib/compass/core/sass_extensions/functions/colors.rb +67 -0
- data/lib/compass/core/sass_extensions/functions/configuration.rb +162 -0
- data/lib/compass/core/sass_extensions/functions/constants.rb +74 -0
- data/lib/compass/core/sass_extensions/functions/cross_browser_support.rb +269 -0
- data/lib/compass/core/sass_extensions/functions/display.rb +32 -0
- data/lib/compass/core/sass_extensions/functions/enumerate.rb +7 -0
- data/lib/compass/core/sass_extensions/functions/env.rb +60 -0
- data/lib/compass/core/sass_extensions/functions/font_files.rb +41 -0
- data/lib/compass/core/sass_extensions/functions/gradient_support.rb +616 -0
- data/lib/compass/core/sass_extensions/functions/image_size.rb +117 -0
- data/lib/compass/core/sass_extensions/functions/inline_image.rb +64 -0
- data/lib/compass/core/sass_extensions/functions/lists.rb +101 -0
- data/lib/compass/core/sass_extensions/functions/math.rb +92 -0
- data/lib/compass/core/sass_extensions/functions/selectors.rb +64 -0
- data/lib/compass/core/sass_extensions/functions/urls.rb +297 -0
- data/lib/compass/core/sass_extensions/monkey_patches.rb +3 -0
- data/lib/compass/core/sass_extensions/monkey_patches/browser_support.rb +118 -0
- data/lib/compass/core/sass_extensions/monkey_patches/traversal.rb +23 -0
- data/lib/compass/core/version.rb +5 -0
- data/lib/compass/error.rb +5 -0
- data/stylesheets/_compass.scss +3 -0
- data/stylesheets/_lemonade.scss +38 -0
- data/stylesheets/compass/_configuration.scss +54 -0
- data/stylesheets/compass/_css3.scss +21 -0
- data/stylesheets/compass/_layout.scss +3 -0
- data/stylesheets/compass/_reset-legacy.scss +3 -0
- data/stylesheets/compass/_reset.scss +3 -0
- data/stylesheets/compass/_support.scss +441 -0
- data/stylesheets/compass/_typography.scss +4 -0
- data/stylesheets/compass/_utilities.scss +9 -0
- data/stylesheets/compass/css3/_animation.scss +122 -0
- data/stylesheets/compass/css3/_appearance.scss +17 -0
- data/stylesheets/compass/css3/_background-clip.scss +35 -0
- data/stylesheets/compass/css3/_background-origin.scss +37 -0
- data/stylesheets/compass/css3/_background-size.scss +19 -0
- data/stylesheets/compass/css3/_border-radius.scss +107 -0
- data/stylesheets/compass/css3/_box-shadow.scss +88 -0
- data/stylesheets/compass/css3/_box-sizing.scss +15 -0
- data/stylesheets/compass/css3/_box.scss +85 -0
- data/stylesheets/compass/css3/_columns.scss +210 -0
- data/stylesheets/compass/css3/_deprecated-support.scss +272 -0
- data/stylesheets/compass/css3/_filter.scss +50 -0
- data/stylesheets/compass/css3/_flexbox.scss +156 -0
- data/stylesheets/compass/css3/_font-face.scss +48 -0
- data/stylesheets/compass/css3/_hyphenation.scss +71 -0
- data/stylesheets/compass/css3/_images.scss +139 -0
- data/stylesheets/compass/css3/_inline-block.scss +31 -0
- data/stylesheets/compass/css3/_opacity.scss +23 -0
- data/stylesheets/compass/css3/_pie.scss +1 -0
- data/stylesheets/compass/css3/_regions.scss +27 -0
- data/stylesheets/compass/css3/_selection.scss +59 -0
- data/stylesheets/compass/css3/_shared.scss +5 -0
- data/stylesheets/compass/css3/_text-shadow.scss +82 -0
- data/stylesheets/compass/css3/_transform.scss +590 -0
- data/stylesheets/compass/css3/_transition.scss +171 -0
- data/stylesheets/compass/css3/_user-interface.scss +71 -0
- data/stylesheets/compass/layout/_grid-background.scss +178 -0
- data/stylesheets/compass/layout/_sticky-footer.scss +23 -0
- data/stylesheets/compass/layout/_stretching.scss +24 -0
- data/stylesheets/compass/reset/_utilities-legacy.scss +135 -0
- data/stylesheets/compass/reset/_utilities.scss +142 -0
- data/stylesheets/compass/typography/_links.scss +3 -0
- data/stylesheets/compass/typography/_lists.scss +4 -0
- data/stylesheets/compass/typography/_text.scss +4 -0
- data/stylesheets/compass/typography/_units.scss +152 -0
- data/stylesheets/compass/typography/_vertical_rhythm.scss +300 -0
- data/stylesheets/compass/typography/links/_hover-link.scss +5 -0
- data/stylesheets/compass/typography/links/_link-colors.scss +28 -0
- data/stylesheets/compass/typography/links/_unstyled-link.scss +7 -0
- data/stylesheets/compass/typography/lists/_bullets.scss +34 -0
- data/stylesheets/compass/typography/lists/_horizontal-list.scss +63 -0
- data/stylesheets/compass/typography/lists/_inline-block-list.scss +50 -0
- data/stylesheets/compass/typography/lists/_inline-list.scss +47 -0
- data/stylesheets/compass/typography/text/_ellipsis.scss +25 -0
- data/stylesheets/compass/typography/text/_force-wrap.scss +12 -0
- data/stylesheets/compass/typography/text/_nowrap.scss +2 -0
- data/stylesheets/compass/typography/text/_replacement.scss +68 -0
- data/stylesheets/compass/utilities/_color.scss +1 -0
- data/stylesheets/compass/utilities/_general.scss +6 -0
- data/stylesheets/compass/utilities/_links.scss +5 -0
- data/stylesheets/compass/utilities/_lists.scss +6 -0
- data/stylesheets/compass/utilities/_print.scss +17 -0
- data/stylesheets/compass/utilities/_sass.scss +2 -0
- data/stylesheets/compass/utilities/_sprites.scss +2 -0
- data/stylesheets/compass/utilities/_tables.scss +3 -0
- data/stylesheets/compass/utilities/_text.scss +5 -0
- data/stylesheets/compass/utilities/color/_brightness.scss +12 -0
- data/stylesheets/compass/utilities/color/_contrast.scss +52 -0
- data/stylesheets/compass/utilities/general/_clearfix.scss +44 -0
- data/stylesheets/compass/utilities/general/_float.scss +38 -0
- data/stylesheets/compass/utilities/general/_hacks.scss +65 -0
- data/stylesheets/compass/utilities/general/_min.scss +16 -0
- data/stylesheets/compass/utilities/general/_reset.scss +2 -0
- data/stylesheets/compass/utilities/general/_tabs.scss +1 -0
- data/stylesheets/compass/utilities/general/_tag-cloud.scss +18 -0
- data/stylesheets/compass/utilities/links/_hover-link.scss +3 -0
- data/stylesheets/compass/utilities/links/_link-colors.scss +3 -0
- data/stylesheets/compass/utilities/links/_unstyled-link.scss +3 -0
- data/stylesheets/compass/utilities/lists/_bullets.scss +3 -0
- data/stylesheets/compass/utilities/lists/_horizontal-list.scss +3 -0
- data/stylesheets/compass/utilities/lists/_inline-block-list.scss +3 -0
- data/stylesheets/compass/utilities/lists/_inline-list.scss +3 -0
- data/stylesheets/compass/utilities/sass/_lists.scss +16 -0
- data/stylesheets/compass/utilities/sass/_maps.scss +19 -0
- data/stylesheets/compass/utilities/sprites/_base.scss +92 -0
- data/stylesheets/compass/utilities/sprites/_sprite-img.scss +81 -0
- data/stylesheets/compass/utilities/tables/_alternating-rows-and-columns.scss +22 -0
- data/stylesheets/compass/utilities/tables/_borders.scss +38 -0
- data/stylesheets/compass/utilities/tables/_scaffolding.scss +9 -0
- data/stylesheets/compass/utilities/text/_ellipsis.scss +3 -0
- data/stylesheets/compass/utilities/text/_nowrap.scss +3 -0
- data/stylesheets/compass/utilities/text/_replacement.scss +3 -0
- data/templates/ellipsis/ellipsis.sass +9 -0
- data/templates/ellipsis/manifest.rb +27 -0
- data/templates/ellipsis/xml/ellipsis.xml +14 -0
- data/templates/extension/manifest.rb +26 -0
- data/templates/extension/stylesheets/main.sass +1 -0
- data/templates/extension/templates/project/manifest.rb +2 -0
- data/templates/extension/templates/project/screen.sass +2 -0
- data/templates/project/USAGE.markdown +32 -0
- data/templates/project/ie.sass +6 -0
- data/templates/project/manifest.rb +4 -0
- data/templates/project/print.sass +6 -0
- data/templates/project/screen.sass +7 -0
- metadata +241 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Compass::Configuration::Paths
|
|
2
|
+
|
|
3
|
+
TRAILING_SEPARATOR = %r{.(/|#{Regexp.escape(File::SEPARATOR)})$}
|
|
4
|
+
|
|
5
|
+
def strip_trailing_separator(*attributes)
|
|
6
|
+
attributes.each do |attr|
|
|
7
|
+
alias_method "#{attr}_with_trailing_separator".to_sym, attr
|
|
8
|
+
class_eval %Q{
|
|
9
|
+
def #{attr} # def css_dir
|
|
10
|
+
path = #{attr}_with_trailing_separator # path = css_dir_with_trailing_separator
|
|
11
|
+
if path.to_s =~ TRAILING_SEPARATOR # if path =~ TRAILING_SEPARATOR
|
|
12
|
+
path = path[0..-($1.length+1)] # path = path[0..-($1.length+1)]
|
|
13
|
+
end # end
|
|
14
|
+
path # path
|
|
15
|
+
end # end
|
|
16
|
+
}
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
data/lib/compass/core.rb
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require "compass/core/version"
|
|
2
|
+
|
|
3
|
+
module Compass
|
|
4
|
+
module Core
|
|
5
|
+
class << self
|
|
6
|
+
attr_accessor :module_deprecation_warning_issued
|
|
7
|
+
end
|
|
8
|
+
def base_directory(*subdirs)
|
|
9
|
+
File.expand_path(File.join(File.dirname(__FILE__), '..', "..", *subdirs))
|
|
10
|
+
end
|
|
11
|
+
def lib_directory(*subdirs)
|
|
12
|
+
File.expand_path(File.join(File.dirname(__FILE__), "..", *subdirs))
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
module_function :base_directory, :lib_directory
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
module HasDeprecatedConstantsFromCore
|
|
19
|
+
def self.extended(base)
|
|
20
|
+
new_base = base.name.sub(/^Compass/,"Compass::Core")
|
|
21
|
+
base.class_eval <<-RUBY
|
|
22
|
+
def self.const_missing(const_name)
|
|
23
|
+
puts "cannot find \#{const_name}"
|
|
24
|
+
if #{new_base}.const_defined?(const_name)
|
|
25
|
+
unless Compass::Core.module_deprecation_warning_issued
|
|
26
|
+
Compass::Core.module_deprecation_warning_issued = true
|
|
27
|
+
Compass::Util.compass_warn(
|
|
28
|
+
"DEPRECATED: #{base.name}::\#{const_name} has been moved to " +
|
|
29
|
+
"#{new_base}::\#{const_name}.\\n" +
|
|
30
|
+
"Please update \#{caller[0]}")
|
|
31
|
+
end
|
|
32
|
+
#{new_base}.const_get(const_name)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
RUBY
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
extend HasDeprecatedConstantsFromCore
|
|
40
|
+
|
|
41
|
+
module SassExtensions
|
|
42
|
+
extend HasDeprecatedConstantsFromCore
|
|
43
|
+
|
|
44
|
+
module Functions
|
|
45
|
+
extend HasDeprecatedConstantsFromCore
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
require "sass"
|
|
51
|
+
require "sass/plugin"
|
|
52
|
+
require "compass/core/caniuse"
|
|
53
|
+
require 'compass/core/sass_extensions'
|
|
54
|
+
require 'compass/error'
|
|
55
|
+
require 'compass/browser_support'
|
|
56
|
+
require 'compass/configuration'
|
|
57
|
+
|
|
58
|
+
if defined?(Compass::Frameworks)
|
|
59
|
+
Compass::Frameworks.register(
|
|
60
|
+
"compass",
|
|
61
|
+
:stylesheets_directory => Compass::Core.base_directory("stylesheets"),
|
|
62
|
+
:templates_directory => Compass::Core.base_directory("templates")
|
|
63
|
+
)
|
|
64
|
+
end
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
require 'multi_json'
|
|
2
|
+
require 'singleton'
|
|
3
|
+
class Compass::Core::CanIUse
|
|
4
|
+
include Singleton
|
|
5
|
+
|
|
6
|
+
DATA_FILE_NAME = File.join(Compass::Core.base_directory, "data", "caniuse.json")
|
|
7
|
+
DATA_FEATURE_FILES = Dir.glob(File.join(Compass::Core.base_directory, "data", "caniuse_extras", "**", "*.json"))
|
|
8
|
+
|
|
9
|
+
def initialize
|
|
10
|
+
@data = MultiJson.load(File.read(DATA_FILE_NAME))
|
|
11
|
+
# support ad-hoc features
|
|
12
|
+
DATA_FEATURE_FILES.each do |feature_file|
|
|
13
|
+
feature_name = File.basename(feature_file, ".json")
|
|
14
|
+
# if the feature doesn't exist in the master `caniuse.json`
|
|
15
|
+
if @data["data"][feature_name].nil?
|
|
16
|
+
@data["data"][feature_name] = MultiJson.load(File.read(feature_file))
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# The browser names from caniuse are ugly.
|
|
22
|
+
PUBLIC_BROWSER_NAMES = Hash.new {|h, k| k}
|
|
23
|
+
PUBLIC_BROWSER_NAMES.update(
|
|
24
|
+
"and_chr" => "android-chrome",
|
|
25
|
+
"and_ff" => "android-firefox",
|
|
26
|
+
"android" => "android",
|
|
27
|
+
"bb" => "blackberry",
|
|
28
|
+
"chrome" => "chrome",
|
|
29
|
+
"firefox" => "firefox",
|
|
30
|
+
"ie" => "ie",
|
|
31
|
+
"ie_mob" => "ie-mobile",
|
|
32
|
+
"ios_saf" => "ios-safari",
|
|
33
|
+
"op_mini" => "opera-mini",
|
|
34
|
+
"op_mob" => "opera-mobile",
|
|
35
|
+
"opera" => "opera",
|
|
36
|
+
"safari" => "safari"
|
|
37
|
+
)
|
|
38
|
+
CAN_I_USE_NAMES = Hash.new {|h, k| k}
|
|
39
|
+
CAN_I_USE_NAMES.update(PUBLIC_BROWSER_NAMES.invert)
|
|
40
|
+
|
|
41
|
+
# Returns all the known browsers according to caniuse
|
|
42
|
+
def browsers
|
|
43
|
+
@browsers ||= @data["agents"].keys.map{|b| PUBLIC_BROWSER_NAMES[b] }.sort
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Returns the prefix corresponding to a particular browser
|
|
47
|
+
def prefix(browser, version = nil)
|
|
48
|
+
assert_valid_browser browser
|
|
49
|
+
assert_valid_version browser, version if version
|
|
50
|
+
data = browser_data(browser)
|
|
51
|
+
p = if data["prefix_exceptions"] && data["prefix_exceptions"][version]
|
|
52
|
+
data["prefix_exceptions"][version]
|
|
53
|
+
else
|
|
54
|
+
data["prefix"]
|
|
55
|
+
end
|
|
56
|
+
"-#{p}"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# returns all possible prefixes a browser might use.
|
|
60
|
+
def all_prefixes(browser)
|
|
61
|
+
assert_valid_browser browser
|
|
62
|
+
data = browser_data(browser)
|
|
63
|
+
prefixes = ["-#{data["prefix"]}"]
|
|
64
|
+
if data["prefix_exceptions"]
|
|
65
|
+
prefixes += data["prefix_exceptions"].values.uniq.map{|p| "-#{p}"}
|
|
66
|
+
end
|
|
67
|
+
prefixes
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# returns the prefixes needed by the list of browsers given
|
|
71
|
+
def prefixes(browsers = browsers)
|
|
72
|
+
result = browsers.map{|b| all_prefixes(b) }
|
|
73
|
+
result.flatten!
|
|
74
|
+
result.uniq!
|
|
75
|
+
result.sort!
|
|
76
|
+
result
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def browser_ranges(capability, prefix = nil, include_unprefixed_versions = true)
|
|
80
|
+
assert_valid_capability capability
|
|
81
|
+
browsers = prefix.nil? ? browsers() : browsers_with_prefix(prefix)
|
|
82
|
+
browsers.inject({}) do |m, browser|
|
|
83
|
+
browser_versions = versions(browser)
|
|
84
|
+
min_version = find_first_prefixed_version(browser, browser_versions, capability, prefix)
|
|
85
|
+
if min_version
|
|
86
|
+
max_version = if include_unprefixed_versions
|
|
87
|
+
browser_versions.last
|
|
88
|
+
else
|
|
89
|
+
find_first_prefixed_version(browser, browser_versions.reverse, capability, prefix)
|
|
90
|
+
end
|
|
91
|
+
m.update(browser => [min_version, max_version])
|
|
92
|
+
end
|
|
93
|
+
m
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def find_first_prefixed_version(browser, versions, capability, prefix)
|
|
98
|
+
versions.find do |version|
|
|
99
|
+
support = browser_support(browser, version, capability)
|
|
100
|
+
if prefix.nil?
|
|
101
|
+
support !~ /\bn\b/ && support !~ /\bx\b/
|
|
102
|
+
else
|
|
103
|
+
actual_prefix = prefix(browser, version)
|
|
104
|
+
support !~ /\bn\b/ && support =~ /\bx\b/ && prefix == actual_prefix
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# @overload omitted_usage(browser, min_supported_version)
|
|
110
|
+
# How many users would be omitted if support for the given browser starts
|
|
111
|
+
# with the given version.
|
|
112
|
+
#
|
|
113
|
+
# @overload omitted_usage(browser, min_unsupported_version, max_unsupported_version)
|
|
114
|
+
# How many users would be omitted if the browsers with version
|
|
115
|
+
def omitted_usage(browser, min_version, max_version = nil)
|
|
116
|
+
versions = versions(browser)
|
|
117
|
+
if max_version.nil?
|
|
118
|
+
assert_valid_version browser, min_version
|
|
119
|
+
else
|
|
120
|
+
assert_valid_version browser, min_version, max_version
|
|
121
|
+
end
|
|
122
|
+
usage = 0
|
|
123
|
+
in_range = max_version.nil?
|
|
124
|
+
versions.each do |version|
|
|
125
|
+
break if max_version.nil? && version == min_version
|
|
126
|
+
in_range = true if (!max_version.nil? && version == min_version)
|
|
127
|
+
usage += usage(browser, version) if in_range
|
|
128
|
+
break if !max_version.nil? && version == max_version
|
|
129
|
+
end
|
|
130
|
+
return usage
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# returns the list of browsers that use the given prefix
|
|
134
|
+
def browsers_with_prefix(prefix)
|
|
135
|
+
assert_valid_prefix prefix
|
|
136
|
+
prefix = "-" + prefix unless prefix.start_with?("-")
|
|
137
|
+
browsers.select {|b| all_prefixes(b).include?(prefix) }
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
SPEC_VERSION_MATCHERS = Hash.new do |h, k|
|
|
141
|
+
h[k] = /##{k}\b/
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
CAPABILITY_MATCHERS = {
|
|
145
|
+
:full_support => lambda {|support, capability| !support ^ (capability =~ /\by\b/) },
|
|
146
|
+
:partial_support => lambda {|support, capability| !support ^ (capability =~ /\ba\b/) },
|
|
147
|
+
:prefixed => lambda {|support, capability| !support ^ (capability =~ /\bx\b/) },
|
|
148
|
+
:spec_versions => lambda {|versions, capability| versions.any? {|v| capability =~ SPEC_VERSION_MATCHERS[v] } }
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
# Return whether the capability matcher the options specified.
|
|
152
|
+
# For each capability option in the options the capability will need to match it.
|
|
153
|
+
def capability_matches(support, capability_options_list)
|
|
154
|
+
capability_options_list.any? do |capability_options|
|
|
155
|
+
capability_options.all? {|c, v| CAPABILITY_MATCHERS[c].call(v, support)}
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# returns the percentage of users (0-100) that would be affected if the prefix
|
|
160
|
+
# was not used with the given capability.
|
|
161
|
+
def prefixed_usage(prefix, capability, capability_options_list)
|
|
162
|
+
assert_valid_prefix prefix
|
|
163
|
+
assert_valid_capability capability
|
|
164
|
+
usage = 0
|
|
165
|
+
browsers_with_prefix(prefix).each do |browser|
|
|
166
|
+
versions(browser).each do |version|
|
|
167
|
+
next unless prefix == prefix(browser, version)
|
|
168
|
+
support = browser_support(browser, version, capability)
|
|
169
|
+
if capability_matches(support, capability_options_list) and support =~ /\bx\b/
|
|
170
|
+
usage += usage(browser, version)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
usage
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def next_version(browser, version)
|
|
178
|
+
versions = versions(browser)
|
|
179
|
+
index = versions.index(version)
|
|
180
|
+
index < versions.length - 1 ? versions[index + 1] : nil
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def previous_version(browser, version)
|
|
184
|
+
versions = versions(browser)
|
|
185
|
+
index = versions.index(version)
|
|
186
|
+
index > 0 ? versions[index - 1] : nil
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Returns whether the given minimum version of a browser
|
|
190
|
+
# requires the use of a prefix for the stated capability.
|
|
191
|
+
def requires_prefix(browser, min_version, capability, capability_options_list)
|
|
192
|
+
assert_valid_browser browser
|
|
193
|
+
assert_valid_capability capability
|
|
194
|
+
found_version = false
|
|
195
|
+
versions(browser).each do |version|
|
|
196
|
+
found_version ||= version == min_version
|
|
197
|
+
next unless found_version
|
|
198
|
+
support = browser_support(browser, version, capability)
|
|
199
|
+
if capability_matches(support, capability_options_list) and support =~ /\bx\b/
|
|
200
|
+
return prefix(browser, version)
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
raise ArgumentError, "#{min_version} is not a version for #{browser}" unless found_version
|
|
204
|
+
nil
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# Returns the versions of a browser. If the min_usage parameter is provided,
|
|
208
|
+
# only those versions having met the threshold of user percentage.
|
|
209
|
+
#
|
|
210
|
+
# @param min_usage a decimal number betwee 0 and 100
|
|
211
|
+
def versions(browser, min_usage = 0)
|
|
212
|
+
assert_valid_browser browser
|
|
213
|
+
versions = browser_data(browser)["versions"].compact
|
|
214
|
+
return versions if min_usage == 0
|
|
215
|
+
versions.select {|v| browser_data(browser)["usage_global"][v] > min_usage }
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# The list of capabilities tracked by caniuse.
|
|
219
|
+
def capabilities
|
|
220
|
+
@capabilities ||= @data["data"].keys.select do |cap|
|
|
221
|
+
cats = @data["data"][cap]["categories"]
|
|
222
|
+
cats.any?{|cat| cat =~ /CSS/ }
|
|
223
|
+
end.sort
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# the usage % for a given browser version.
|
|
227
|
+
def usage(browser, version)
|
|
228
|
+
browser_data(browser)["usage_global"][version]
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def inspect
|
|
233
|
+
"#{self.class.name}(#{browsers.join(", ")})"
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
# the browser data assocated with a given capability
|
|
237
|
+
def capability_data(capability)
|
|
238
|
+
@data["data"][capability]
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
def browser_support(browser, version, capability)
|
|
242
|
+
capability_data(capability)["stats"][CAN_I_USE_NAMES[browser]][version]
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
# the metadata assocated with a given browser
|
|
246
|
+
def browser_data(browser)
|
|
247
|
+
@data["agents"][CAN_I_USE_NAMES[browser]]
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
# efficiently checks if a prefix is valid
|
|
251
|
+
def assert_valid_prefix(prefix)
|
|
252
|
+
@known_prefixes ||= Set.new(prefixes(browsers))
|
|
253
|
+
unless @known_prefixes.include?(prefix)
|
|
254
|
+
raise ArgumentError, "#{prefix} is not known browser prefix."
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
# efficiently checks if a browser is valid
|
|
259
|
+
def assert_valid_browser(browser)
|
|
260
|
+
@known_browsers ||= Set.new(browsers)
|
|
261
|
+
unless @known_browsers.include?(browser)
|
|
262
|
+
raise ArgumentError, "#{browser} is not known browser."
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
# efficiently checks if a capability is valid
|
|
267
|
+
def assert_valid_capability(capability)
|
|
268
|
+
@known_capabilities ||= Set.new(capabilities)
|
|
269
|
+
unless @known_capabilities.include?(capability)
|
|
270
|
+
raise ArgumentError, "#{capability} is not known browser capability."
|
|
271
|
+
end
|
|
272
|
+
nil
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def assert_valid_version(browser, *versions)
|
|
276
|
+
versions.each do |v|
|
|
277
|
+
unless versions(browser).include?(v)
|
|
278
|
+
raise ArgumentError, "#{v} is not known version for #{browser}."
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
require 'sass'
|
|
2
|
+
unless Sass::Script::Functions.methods.grep(/\Adeclare\Z/).any?
|
|
3
|
+
raise LoadError, "It looks like you've got an incompatible version of Sass. This often happens when you have an old haml gem installed. Please upgrade Haml to v3.1 or above."
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
module Compass::Core::SassExtensions
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
require 'compass/core/sass_extensions/functions'
|
|
10
|
+
require 'compass/core/sass_extensions/monkey_patches'
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module Compass::Core::SassExtensions::Functions
|
|
2
|
+
module SassDeclarationHelper
|
|
3
|
+
def declare(*args)
|
|
4
|
+
Sass::Script::Functions.declare(*args)
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
%w(
|
|
10
|
+
selectors enumerate urls display
|
|
11
|
+
inline_image image_size constants gradient_support
|
|
12
|
+
font_files lists colors math
|
|
13
|
+
env cross_browser_support configuration
|
|
14
|
+
).each do |func|
|
|
15
|
+
require "compass/core/sass_extensions/functions/#{func}"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
module Sass::Script::Functions
|
|
19
|
+
include Compass::Core::SassExtensions::Functions::Configuration
|
|
20
|
+
include Compass::Core::SassExtensions::Functions::Selectors
|
|
21
|
+
include Compass::Core::SassExtensions::Functions::Enumerate
|
|
22
|
+
include Compass::Core::SassExtensions::Functions::Urls
|
|
23
|
+
include Compass::Core::SassExtensions::Functions::Display
|
|
24
|
+
include Compass::Core::SassExtensions::Functions::InlineImage
|
|
25
|
+
include Compass::Core::SassExtensions::Functions::ImageSize
|
|
26
|
+
include Compass::Core::SassExtensions::Functions::GradientSupport::Functions
|
|
27
|
+
include Compass::Core::SassExtensions::Functions::FontFiles
|
|
28
|
+
include Compass::Core::SassExtensions::Functions::Constants
|
|
29
|
+
include Compass::Core::SassExtensions::Functions::Lists
|
|
30
|
+
include Compass::Core::SassExtensions::Functions::Colors
|
|
31
|
+
include Compass::Core::SassExtensions::Functions::Math
|
|
32
|
+
include Compass::Core::SassExtensions::Functions::CrossBrowserSupport
|
|
33
|
+
include Compass::Core::SassExtensions::Functions::Env
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Wierd that this has to be re-included to pick up sub-modules. Ruby bug?
|
|
37
|
+
class Sass::Script::Functions::EvaluationContext
|
|
38
|
+
include Sass::Script::Functions
|
|
39
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module Compass::Core::SassExtensions::Functions::Colors
|
|
2
|
+
|
|
3
|
+
# a genericized version of lighten/darken so that negative values can be used.
|
|
4
|
+
def adjust_lightness(color, amount)
|
|
5
|
+
assert_type color, :Color
|
|
6
|
+
assert_type amount, :Number
|
|
7
|
+
color.with(:lightness => Sass::Util.restrict(color.lightness + amount.value, 0..100))
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Scales a color's lightness by some percentage.
|
|
11
|
+
# If the amount is negative, the color is scaled darker, if positive, it is scaled lighter.
|
|
12
|
+
# This will never return a pure light or dark color unless the amount is 100%.
|
|
13
|
+
def scale_lightness(color, amount)
|
|
14
|
+
assert_type color, :Color
|
|
15
|
+
assert_type amount, :Number
|
|
16
|
+
color.with(:lightness => scale_color_value(color.lightness, amount.value))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# a genericized version of saturation/desaturate so that negative values can be used.
|
|
20
|
+
def adjust_saturation(color, amount)
|
|
21
|
+
assert_type color, :Color
|
|
22
|
+
assert_type amount, :Number
|
|
23
|
+
color.with(:saturation => Sass::Util.restrict(color.saturation + amount.value, 0..100))
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Scales a color's saturation by some percentage.
|
|
27
|
+
# If the amount is negative, the color is desaturated, if positive, it is saturated.
|
|
28
|
+
# This will never return a pure saturated or desaturated color unless the amount is 100%.
|
|
29
|
+
def scale_saturation(color, amount)
|
|
30
|
+
assert_type color, :Color
|
|
31
|
+
assert_type amount, :Number
|
|
32
|
+
color.with(:saturation => scale_color_value(color.saturation, amount.value))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def shade(color, percentage)
|
|
36
|
+
assert_type color, :Color
|
|
37
|
+
assert_type percentage, :Number
|
|
38
|
+
black = Sass::Script::Color.new([0, 0, 0])
|
|
39
|
+
mix(black, color, percentage)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def tint(color, percentage)
|
|
43
|
+
assert_type color, :Color
|
|
44
|
+
assert_type percentage, :Number
|
|
45
|
+
white = Sass::Script::Color.new([255, 255, 255])
|
|
46
|
+
mix(white, color, percentage)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# returns an IE hex string for a color with an alpha channel
|
|
50
|
+
# suitable for passing to IE filters.
|
|
51
|
+
def ie_hex_str(color)
|
|
52
|
+
assert_type color, :Color
|
|
53
|
+
alpha = (color.alpha * 255).round
|
|
54
|
+
alphastr = alpha.to_s(16).rjust(2, '0')
|
|
55
|
+
Sass::Script::String.new("##{alphastr}#{color.send(:hex_str)[1..-1]}".upcase)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
def scale_color_value(value, amount)
|
|
60
|
+
if amount > 0
|
|
61
|
+
value += (100 - value) * (amount / 100.0)
|
|
62
|
+
elsif amount < 0
|
|
63
|
+
value += value * amount / 100.0
|
|
64
|
+
end
|
|
65
|
+
value
|
|
66
|
+
end
|
|
67
|
+
end
|