simple-compass 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.
Files changed (102) hide show
  1. data/.gitignore +2 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +6 -0
  4. data/Gemfile.lock +26 -0
  5. data/Rakefile +8 -0
  6. data/lib/simple-compass.rb +17 -0
  7. data/lib/simple-compass/sass/functions/display.rb +27 -0
  8. data/lib/simple-compass/sass/functions/lists.rb +101 -0
  9. data/lib/simple-compass/sass/functions/selectors.rb +64 -0
  10. data/lib/simple-compass/sass/functions/sprites.rb +218 -0
  11. data/lib/simple-compass/version.rb +3 -0
  12. data/sass/compass.scss +1 -0
  13. data/sass/compass/_css3.scss +20 -0
  14. data/sass/compass/_layout.scss +3 -0
  15. data/sass/compass/_reset-legacy.scss +3 -0
  16. data/sass/compass/_reset.scss +3 -0
  17. data/sass/compass/_support.scss +40 -0
  18. data/sass/compass/_typography.scss +4 -0
  19. data/sass/compass/_utilities.scss +9 -0
  20. data/sass/compass/css3/_appearance.scss +17 -0
  21. data/sass/compass/css3/_background-clip.scss +43 -0
  22. data/sass/compass/css3/_background-origin.scss +42 -0
  23. data/sass/compass/css3/_background-size.scss +26 -0
  24. data/sass/compass/css3/_border-radius.scss +130 -0
  25. data/sass/compass/css3/_box-shadow.scss +76 -0
  26. data/sass/compass/css3/_box-sizing.scss +13 -0
  27. data/sass/compass/css3/_box.scss +111 -0
  28. data/sass/compass/css3/_columns.scss +157 -0
  29. data/sass/compass/css3/_filter.scss +23 -0
  30. data/sass/compass/css3/_font-face.scss +48 -0
  31. data/sass/compass/css3/_hyphenation.scss +77 -0
  32. data/sass/compass/css3/_images.scss +132 -0
  33. data/sass/compass/css3/_inline-block.scss +22 -0
  34. data/sass/compass/css3/_opacity.scss +19 -0
  35. data/sass/compass/css3/_pie.scss +73 -0
  36. data/sass/compass/css3/_regions.scss +22 -0
  37. data/sass/compass/css3/_shared.scss +38 -0
  38. data/sass/compass/css3/_text-shadow.scss +87 -0
  39. data/sass/compass/css3/_transform-legacy.scss +87 -0
  40. data/sass/compass/css3/_transform.scss +598 -0
  41. data/sass/compass/css3/_transition.scss +221 -0
  42. data/sass/compass/css3/_user-interface.scss +17 -0
  43. data/sass/compass/layout/_grid-background.scss +178 -0
  44. data/sass/compass/layout/_sticky-footer.scss +23 -0
  45. data/sass/compass/layout/_stretching.scss +24 -0
  46. data/sass/compass/reset/_utilities-legacy.scss +135 -0
  47. data/sass/compass/reset/_utilities.scss +142 -0
  48. data/sass/compass/typography/_links.scss +3 -0
  49. data/sass/compass/typography/_lists.scss +4 -0
  50. data/sass/compass/typography/_text.scss +4 -0
  51. data/sass/compass/typography/_vertical_rhythm.scss +221 -0
  52. data/sass/compass/typography/links/_hover-link.scss +5 -0
  53. data/sass/compass/typography/links/_link-colors.scss +28 -0
  54. data/sass/compass/typography/links/_unstyled-link.scss +7 -0
  55. data/sass/compass/typography/lists/_bullets.scss +34 -0
  56. data/sass/compass/typography/lists/_horizontal-list.scss +61 -0
  57. data/sass/compass/typography/lists/_inline-block-list.scss +50 -0
  58. data/sass/compass/typography/lists/_inline-list.scss +44 -0
  59. data/sass/compass/typography/text/_ellipsis.scss +25 -0
  60. data/sass/compass/typography/text/_force-wrap.scss +12 -0
  61. data/sass/compass/typography/text/_nowrap.scss +2 -0
  62. data/sass/compass/typography/text/_replacement.scss +68 -0
  63. data/sass/compass/utilities/_color.scss +1 -0
  64. data/sass/compass/utilities/_general.scss +6 -0
  65. data/sass/compass/utilities/_links.scss +5 -0
  66. data/sass/compass/utilities/_lists.scss +6 -0
  67. data/sass/compass/utilities/_print.scss +17 -0
  68. data/sass/compass/utilities/_sprites.scss +2 -0
  69. data/sass/compass/utilities/_tables.scss +3 -0
  70. data/sass/compass/utilities/_text.scss +5 -0
  71. data/sass/compass/utilities/color/_contrast.scss +28 -0
  72. data/sass/compass/utilities/general/_clearfix.scss +44 -0
  73. data/sass/compass/utilities/general/_float.scss +30 -0
  74. data/sass/compass/utilities/general/_hacks.scss +46 -0
  75. data/sass/compass/utilities/general/_min.scss +16 -0
  76. data/sass/compass/utilities/general/_reset.scss +2 -0
  77. data/sass/compass/utilities/general/_tabs.scss +1 -0
  78. data/sass/compass/utilities/general/_tag-cloud.scss +18 -0
  79. data/sass/compass/utilities/links/_hover-link.scss +3 -0
  80. data/sass/compass/utilities/links/_link-colors.scss +3 -0
  81. data/sass/compass/utilities/links/_unstyled-link.scss +3 -0
  82. data/sass/compass/utilities/lists/_bullets.scss +3 -0
  83. data/sass/compass/utilities/lists/_horizontal-list.scss +3 -0
  84. data/sass/compass/utilities/lists/_inline-block-list.scss +3 -0
  85. data/sass/compass/utilities/lists/_inline-list.scss +3 -0
  86. data/sass/compass/utilities/sprites/_base.scss +66 -0
  87. data/sass/compass/utilities/sprites/_sprite-img.scss +79 -0
  88. data/sass/compass/utilities/tables/_alternating-rows-and-columns.scss +22 -0
  89. data/sass/compass/utilities/tables/_borders.scss +33 -0
  90. data/sass/compass/utilities/tables/_scaffolding.scss +9 -0
  91. data/sass/compass/utilities/text/_ellipsis.scss +3 -0
  92. data/sass/compass/utilities/text/_nowrap.scss +3 -0
  93. data/sass/compass/utilities/text/_replacement.scss +3 -0
  94. data/simple-compass.gemspec +21 -0
  95. data/spec/fixtures/headings_test.sass +2 -0
  96. data/spec/fixtures/opacity_test.sass +7 -0
  97. data/spec/fixtures/reset_test.sass +1 -0
  98. data/spec/headings_spec.rb +9 -0
  99. data/spec/opacity_spec.rb +9 -0
  100. data/spec/reset_spec.rb +9 -0
  101. data/spec/spec_helper.rb +7 -0
  102. metadata +169 -0
@@ -0,0 +1,2 @@
1
+ .sass-cache
2
+ pkg
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'simple-compass', :path => '.'
6
+ gem 'rspec'
@@ -0,0 +1,26 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ simple-compass (0.0.1)
5
+ sass
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ diff-lcs (1.2.1)
11
+ rspec (2.13.0)
12
+ rspec-core (~> 2.13.0)
13
+ rspec-expectations (~> 2.13.0)
14
+ rspec-mocks (~> 2.13.0)
15
+ rspec-core (2.13.0)
16
+ rspec-expectations (2.13.0)
17
+ diff-lcs (>= 1.1.3, < 2.0)
18
+ rspec-mocks (2.13.0)
19
+ sass (3.2.6)
20
+
21
+ PLATFORMS
22
+ ruby
23
+
24
+ DEPENDENCIES
25
+ rspec
26
+ simple-compass!
@@ -0,0 +1,8 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec) do |spec|
5
+ spec.verbose = false
6
+ end
7
+
8
+ task :default => :spec
@@ -0,0 +1,17 @@
1
+ require 'sass'
2
+
3
+ module Compass
4
+ module Frameworks
5
+ def self.register(name, options = {})
6
+ Sass.load_paths << options[:stylesheets_directory]
7
+ end
8
+ end
9
+ end
10
+
11
+ root_dir = File.join(File.dirname(__FILE__), '..')
12
+
13
+ sass_dir = File.expand_path File.join root_dir, 'sass'
14
+ Sass.load_paths << sass_dir
15
+
16
+ functions_dir = File.expand_path File.join root_dir, 'lib', 'simple-compass', 'sass', 'functions'
17
+ Dir[File.join(functions_dir, "**/*.rb")].each { |f| require f }
@@ -0,0 +1,27 @@
1
+ module Sass::Script::Functions
2
+ DEFAULT_DISPLAY = {
3
+ :block => %w{address article aside blockquote center dir div dd details dl dt fieldset
4
+ figcaption figure form footer frameset h1 h2 h3 h4 h5 h6 hr header hgroup
5
+ isindex menu nav noframes noscript ol p pre section summary ul},
6
+ :inline => %w{a abbr acronym audio b basefont bdo big br canvas cite code command
7
+ datalist dfn em embed font i img input keygen kbd label mark meter output
8
+ progress q rp rt ruby s samp select small span strike strong sub
9
+ sup textarea time tt u var video wbr},
10
+ :"inline-block" => %w{img},
11
+ :table => %w{table},
12
+ :"list-item" => %w{li},
13
+ :"table-row-group" => %w{tbody},
14
+ :"table-header-group" => %w{thead},
15
+ :"table-footer-group" => %w{tfoot},
16
+ :"table-row" => %w{tr},
17
+ :"table-cell" => %w{th td},
18
+ :"html5-block" => %w{article aside details figcaption figure footer header hgroup menu nav section summary},
19
+ :"html5-inline" => %w{audio canvas command datalist embed keygen mark meter output progress rp rt ruby time video wbr},
20
+ }
21
+ DEFAULT_DISPLAY[:html5] = (DEFAULT_DISPLAY[:"html5-block"] + DEFAULT_DISPLAY[:"html5-inline"]).sort
22
+ # returns a comma delimited string for all the
23
+ # elements according to their default css3 display value.
24
+ def elements_of_type(display)
25
+ Sass::Script::String.new(DEFAULT_DISPLAY.fetch(display.value.to_sym).join(", "))
26
+ end
27
+ end
@@ -0,0 +1,101 @@
1
+ module Sass::Script::Functions
2
+
3
+ # Returns true when the object is false, an empty string, or an empty list
4
+ def blank(obj)
5
+ case obj
6
+ when Sass::Script::Bool
7
+ Sass::Script::Bool.new !obj.to_bool
8
+ when Sass::Script::String
9
+ Sass::Script::Bool.new obj.value.strip.size == 0
10
+ when Sass::Script::List
11
+ Sass::Script::Bool.new obj.value.size == 0 || obj.value.all?{|el| blank(el).to_bool}
12
+ else
13
+ Sass::Script::Bool.new false
14
+ end
15
+ end
16
+
17
+ # Returns a new list after removing any non-true values
18
+ def compact(*args)
19
+ sep = :comma
20
+ if args.size == 1 && args.first.is_a?(Sass::Script::List)
21
+ list = args.first
22
+ args = list.value
23
+ sep = list.separator
24
+ end
25
+ Sass::Script::List.new(args.reject{|a| !a.to_bool}, sep)
26
+ end
27
+
28
+ # Get the nth value from a list
29
+ def _compass_nth(list, place)
30
+ assert_type list, :List
31
+ if place.value == "first"
32
+ list.value.first
33
+ elsif place.value == "last"
34
+ list.value.last
35
+ else
36
+ list.value[place.value - 1]
37
+ end
38
+ end
39
+
40
+ # Returns a list object from a value that was passed.
41
+ # This can be used to unpack a space separated list that got turned
42
+ # into a string by sass before it was passed to a mixin.
43
+ def _compass_list(arg)
44
+ if arg.is_a?(Sass::Script::List)
45
+ Sass::Script::List.new(arg.value.dup, arg.separator)
46
+ else
47
+ Sass::Script::List.new([arg], :space)
48
+ end
49
+ end
50
+
51
+ # If the argument is a list, it will return a new list that is space delimited
52
+ # Otherwise it returns a new, single element, space-delimited list.
53
+ def _compass_space_list(list)
54
+ if list.is_a?(Sass::Script::List)
55
+ Sass::Script::List.new(list.value.dup, :space)
56
+ else
57
+ Sass::Script::List.new([list], :space)
58
+ end
59
+ end
60
+
61
+ # Returns the size of the list.
62
+ def _compass_list_size(list)
63
+ assert_list list
64
+ Sass::Script::Number.new(list.value.size)
65
+ end
66
+
67
+ # slice a sublist from a list
68
+ def _compass_slice(list, start_index, end_index = nil)
69
+ end_index ||= Sass::Script::Number.new(-1)
70
+ start_index = start_index.value
71
+ end_index = end_index.value
72
+ start_index -= 1 unless start_index < 0
73
+ end_index -= 1 unless end_index < 0
74
+ Sass::Script::List.new list.values[start_index..end_index], list.separator
75
+ end
76
+
77
+ # removes the given values from the list.
78
+ def reject(list, *values)
79
+ Sass::Script::List.new(list.value.reject{|v| values.any?{|o| v == o}}, list.separator)
80
+ end
81
+
82
+ # returns the first value of a space delimited list.
83
+ def first_value_of(list)
84
+ if list.is_a?(Sass::Script::String)
85
+ Sass::Script::String.new(list.value.split(/\s+/).first)
86
+ elsif defined?(Sass::Script::List) && list.is_a?(Sass::Script::List)
87
+ list.value.first
88
+ else
89
+ list
90
+ end
91
+ end
92
+
93
+ protected
94
+
95
+ def assert_list(value)
96
+ unless value.is_a?(Sass::Script::List)
97
+ raise ArgumentError.new("#{value.inspect} is not a list")
98
+ end
99
+ end
100
+
101
+ end
@@ -0,0 +1,64 @@
1
+ module Sass::Script::Functions
2
+ COMMA_SEPARATOR = /\s*,\s*/
3
+
4
+ # Permute multiple selectors each of which may be comma delimited, the end result is
5
+ # a new selector that is the equivalent of nesting each under the previous selector.
6
+ # To illustrate, the following mixins are equivalent:
7
+ # =mixin-a(!selector1, !selector2, !selector3)
8
+ # #{!selector1}
9
+ # #{selector2}
10
+ # #{selector3}
11
+ # width: 2px
12
+ # =mixin-b(!selector1, !selector2)
13
+ # #{nest(!selector, !selector2, !selector3)}
14
+ # width: 2px
15
+ def nest(*arguments)
16
+ nested = arguments.map{|a| a.value}.inject do |memo,arg|
17
+ ancestors = memo.split(COMMA_SEPARATOR)
18
+ descendants = arg.split(COMMA_SEPARATOR)
19
+ ancestors.map{|a| descendants.map{|d| "#{a} #{d}"}.join(", ")}.join(", ")
20
+ end
21
+ Sass::Script::String.new(nested)
22
+ end
23
+
24
+ # Permute two selectors, the first may be comma delimited.
25
+ # The end result is a new selector that is the equivalent of nesting the second
26
+ # selector under the first one in a sass file and preceding it with an &.
27
+ # To illustrate, the following mixins are equivalent:
28
+ # =mixin-a(!selector, !to_append)
29
+ # #{!selector}
30
+ # &#{!to_append}
31
+ # width: 2px
32
+ # =mixin-b(!selector, !to_append)
33
+ # #{append_selector(!selector, !to_append)}
34
+ # width: 2px
35
+ def append_selector(selector, to_append)
36
+ ancestors = selector.value.split(COMMA_SEPARATOR)
37
+ descendants = to_append.value.split(COMMA_SEPARATOR)
38
+ nested = ancestors.map{|a| descendants.map{|d| "#{a}#{d}"}.join(", ")}.join(", ")
39
+ Sass::Script::String.new(nested)
40
+ end
41
+
42
+ # Return the header selectors for the levels indicated
43
+ # Defaults to all headers h1 through h6
44
+ # For example:
45
+ # headers(all) => h1, h2, h3, h4, h5, h6
46
+ # headers(4) => h1, h2, h3, h4
47
+ # headers(2,4) => h2, h3, h4
48
+ def headers(from = nil, to = nil)
49
+ if from && !to
50
+ if from.is_a?(Sass::Script::String) && from.value == "all"
51
+ from = Sass::Script::Number.new(1)
52
+ to = Sass::Script::Number.new(6)
53
+ else
54
+ to = from
55
+ from = Sass::Script::Number.new(1)
56
+ end
57
+ else
58
+ from ||= Sass::Script::Number.new(1)
59
+ to ||= Sass::Script::Number.new(6)
60
+ end
61
+ Sass::Script::String.new((from.value..to.value).map{|n| "h#{n}"}.join(", "))
62
+ end
63
+ alias headings headers
64
+ end
@@ -0,0 +1,218 @@
1
+ module Sass::Script::Functions
2
+ ZERO = Sass::Script::Number::new(0)
3
+ VALID_SELECTORS = %w(hover active target)
4
+ # Provides a consistent interface for getting a variable in ruby
5
+ # from a keyword argument hash that accounts for underscores/dash equivalence
6
+ # and allows the caller to pass a symbol instead of a string.
7
+ module VariableReader
8
+ def get_var(variable_name)
9
+ self[variable_name.to_s.gsub(/-/,"_")]
10
+ end
11
+ end
12
+
13
+ #Returns a list of all sprite names
14
+ def sprite_names(map)
15
+ Sass::Script::List.new(map.sprite_names.map { |f| Sass::Script::String.new(f) }, ' ')
16
+ end
17
+ Sass::Script::Functions.declare :sprite_names, [:map]
18
+
19
+ # Returns the system path of the sprite file
20
+ def sprite_path(map)
21
+ Sass::Script::String.new(map.name_and_hash)
22
+ end
23
+ Sass::Script::Functions.declare :sprite_path, [:map]
24
+
25
+ # Returns the sprite file as an inline image
26
+ # @include "icon/*.png";
27
+ # #{$icon-sprite-base-class} {
28
+ # background-image: inline-sprite($icon-sprites);
29
+ # }
30
+ def inline_sprite(map)
31
+ verify_map(map, "sprite-url")
32
+ map.generate
33
+ inline_image(sprite_path(map))
34
+ end
35
+ Sass::Script::Functions.declare :inline_sprite, [:map]
36
+
37
+ # Creates a Compass::SassExtensions::Sprites::SpriteMap object. A sprite map, when used in a property is the same
38
+ # as calling sprite-url. So the following background properties are equivalent:
39
+ #
40
+ # $icons: sprite-map("icons/*.png");
41
+ # background: sprite-url($icons) no-repeat;
42
+ # background: $icons no-repeat;
43
+ #
44
+ # The sprite map object will generate the sprite map image, if necessary,
45
+ # the first time it is converted to a url. Simply constructing it has no side-effects.
46
+ def sprite_map(glob, kwargs = {})
47
+ kwargs.extend VariableReader
48
+ Compass::SassExtensions::Sprites::SpriteMap.from_uri(glob, self, kwargs)
49
+ end
50
+ Sass::Script::Functions.declare :sprite_map, [:glob], :var_kwargs => true
51
+
52
+ # Returns the image and background position for use in a single shorthand property:
53
+ #
54
+ # $icons: sprite-map("icons/*.png"); // contains icons/new.png among others.
55
+ # background: sprite($icons, new) no-repeat;
56
+ #
57
+ # Becomes:
58
+ #
59
+ # background: url('/images/icons.png?12345678') 0 -24px no-repeat;
60
+ def sprite(map, sprite, offset_x = ZERO, offset_y = ZERO)
61
+ sprite = convert_sprite_name(sprite)
62
+ verify_map(map)
63
+ unless sprite.is_a?(Sass::Script::String)
64
+ raise Sass::SyntaxError, %Q(The second argument to sprite() must be a sprite name. See http://beta.compass-style.org/help/tutorials/spriting/ for more information.)
65
+ end
66
+ url = sprite_url(map)
67
+ position = sprite_position(map, sprite, offset_x, offset_y)
68
+ Sass::Script::List.new([url] + position.value, :space)
69
+ end
70
+ Sass::Script::Functions.declare :sprite, [:map, :sprite]
71
+ Sass::Script::Functions.declare :sprite, [:map, :sprite, :offset_x]
72
+ Sass::Script::Functions.declare :sprite, [:map, :sprite, :offset_x, :offset_y]
73
+
74
+ # Returns the name of a sprite map
75
+ # The name is derived from the folder than contains the sprites.
76
+ def sprite_map_name(map)
77
+ verify_map(map, "sprite-map-name")
78
+ Sass::Script::String.new(map.name)
79
+ end
80
+ Sass::Script::Functions.declare :sprite_name, [:sprite]
81
+
82
+ # Returns the path to the original image file for the sprite with the given name
83
+ def sprite_file(map, sprite)
84
+ sprite = convert_sprite_name(sprite)
85
+ verify_map(map, "sprite")
86
+ verify_sprite(sprite)
87
+ if image = map.image_for(sprite.value)
88
+ Sass::Script::String.new(image.file)
89
+ else
90
+ missing_image!(map, sprite)
91
+ end
92
+ end
93
+ Sass::Script::Functions.declare :sprite_file, [:map, :sprite]
94
+
95
+ # Returns boolean if sprite has a parent
96
+ def sprite_does_not_have_parent(map, sprite)
97
+ sprite = convert_sprite_name(sprite)
98
+ verify_map map
99
+ verify_sprite sprite
100
+ Sass::Script::Bool.new map.image_for(sprite.value).parent.nil?
101
+ end
102
+
103
+ Sass::Script::Functions.declare :sprite_does_not_have_parent, [:map, :sprite]
104
+
105
+ # Returns boolean if sprite has the selector
106
+ def sprite_has_selector(map, sprite, selector)
107
+ sprite = convert_sprite_name(sprite)
108
+ verify_map map
109
+ verify_sprite sprite
110
+ unless VALID_SELECTORS.include?(selector.value)
111
+ raise Sass::SyntaxError, "Invalid Selctor did you mean one of: #{VALID_SELECTORS.join(', ')}"
112
+ end
113
+ Sass::Script::Bool.new map.send(:"has_#{selector.value}?", sprite.value)
114
+ end
115
+
116
+ Sass::Script::Functions.declare :sprite_has_selector, [:map, :sprite, :selector]
117
+
118
+
119
+ # Returns a url to the sprite image.
120
+ def sprite_url(map)
121
+ verify_map(map, "sprite-url")
122
+ map.generate
123
+ generated_image_url(Sass::Script::String.new("#{map.path}-s#{map.uniqueness_hash}.png"))
124
+ end
125
+ Sass::Script::Functions.declare :sprite_url, [:map]
126
+
127
+ # Returns the position for the original image in the sprite.
128
+ # This is suitable for use as a value to background-position:
129
+ #
130
+ # $icons: sprite-map("icons/*.png");
131
+ # background-position: sprite-position($icons, new);
132
+ #
133
+ # Might generate something like:
134
+ #
135
+ # background-position: 0 -34px;
136
+ #
137
+ # You can adjust the background relative to this position by passing values for
138
+ # `$offset-x` and `$offset-y`:
139
+ #
140
+ # $icons: sprite-map("icons/*.png");
141
+ # background-position: sprite-position($icons, new, 3px, -2px);
142
+ #
143
+ # Would change the above output to:
144
+ #
145
+ # background-position: 3px -36px;
146
+ def sprite_position(map, sprite = nil, offset_x = ZERO, offset_y = ZERO)
147
+ assert_type offset_x, :Number
148
+ assert_type offset_y, :Number
149
+ sprite = convert_sprite_name(sprite)
150
+ verify_map(map, "sprite-position")
151
+ unless sprite && sprite.is_a?(Sass::Script::String)
152
+ raise Sass::SyntaxError, %Q(The second argument to sprite-position must be a sprite name. See http://beta.compass-style.org/help/tutorials/spriting/ for more information.)
153
+ end
154
+ image = map.image_for(sprite.value)
155
+ unless image
156
+ missing_image!(map, sprite)
157
+ end
158
+ if offset_x.unit_str == "%"
159
+ x = offset_x # CE: Shouldn't this be a percentage of the total width?
160
+ else
161
+ x = offset_x.value - image.left
162
+ x = Sass::Script::Number.new(x, x == 0 ? [] : ["px"])
163
+ end
164
+ y = offset_y.value - image.top
165
+ y = Sass::Script::Number.new(y, y == 0 ? [] : ["px"])
166
+ Sass::Script::List.new([x, y],:space)
167
+ end
168
+ Sass::Script::Functions.declare :sprite_position, [:map]
169
+ Sass::Script::Functions.declare :sprite_position, [:map, :sprite]
170
+ Sass::Script::Functions.declare :sprite_position, [:map, :sprite, :offset_x]
171
+ Sass::Script::Functions.declare :sprite_position, [:map, :sprite, :offset_x, :offset_y]
172
+
173
+ def sprite_image(*args)
174
+ raise Sass::SyntaxError, %Q(The sprite-image() function has been replaced by sprite(). See http://compass-style.org/help/tutorials/spriting/ for more information.)
175
+ end
176
+
177
+ protected
178
+
179
+ def reversed_color_names
180
+ if Sass::Script::Color.const_defined?(:HTML4_COLORS_REVERSE)
181
+ Sass::Script::Color::HTML4_COLORS_REVERSE
182
+ else
183
+ Sass::Script::Color::COLOR_NAMES_REVERSE
184
+ end
185
+ end
186
+
187
+ def convert_sprite_name(sprite)
188
+ case sprite
189
+ when Sass::Script::Color
190
+ Sass::Script::String.new(reversed_color_names[sprite.rgb])
191
+ when Sass::Script::Bool
192
+ Sass::Script::String.new(sprite.to_s)
193
+ else
194
+ sprite
195
+ end
196
+ end
197
+
198
+ def verify_map(map, error = "sprite")
199
+ unless map.is_a?(Compass::SassExtensions::Sprites::SpriteMap)
200
+ missing_sprite!(error)
201
+ end
202
+ end
203
+
204
+ def verify_sprite(sprite)
205
+ unless sprite.is_a?(Sass::Script::String)
206
+ raise Sass::SyntaxError, %Q(The second argument to sprite() must be a sprite name. See http://beta.compass-style.org/help/tutorials/spriting/ for more information.)
207
+ end
208
+ end
209
+
210
+ def missing_image!(map, sprite)
211
+ raise Sass::SyntaxError, "No sprite called #{sprite} found in sprite map #{map.path}/#{map.name}. Did you mean one of: #{map.sprite_names.join(", ")}"
212
+ end
213
+
214
+ def missing_sprite!(function_name)
215
+ raise Sass::SyntaxError, %Q(The first argument to #{function_name}() must be a sprite map. See http://beta.compass-style.org/help/tutorials/spriting/ for more information.)
216
+ end
217
+
218
+ end