compass-sourcemaps 0.12.3.sourcemaps.a4836f1 → 0.12.4.sourcemaps.a4836f1

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 (495) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.markdown +29 -29
  3. data/README.markdown +39 -39
  4. data/Rakefile +157 -157
  5. data/VERSION.yml +5 -5
  6. data/bin/compass +45 -45
  7. data/examples/README.markdown +3 -3
  8. data/examples/blueprint_default/config.rb +7 -7
  9. data/examples/blueprint_default/index.html.haml +85 -85
  10. data/examples/blueprint_default/parts/elements.html.haml +282 -282
  11. data/examples/blueprint_default/parts/forms.html.haml +200 -200
  12. data/examples/blueprint_default/parts/grid.html.haml +274 -274
  13. data/examples/blueprint_default/src/ie.scss +3 -3
  14. data/examples/blueprint_default/src/print.scss +3 -3
  15. data/examples/blueprint_default/src/screen.scss +9 -9
  16. data/examples/blueprint_plugins/config.rb +8 -8
  17. data/examples/blueprint_plugins/index.html.haml +96 -96
  18. data/examples/blueprint_plugins/plugins/buttons.html.haml +67 -67
  19. data/examples/blueprint_plugins/plugins/fancy_type.html.haml +100 -100
  20. data/examples/blueprint_plugins/plugins/link_icons.html.haml +61 -61
  21. data/examples/blueprint_plugins/plugins/rtl.html.haml +100 -100
  22. data/examples/blueprint_plugins/src/buttons.scss +47 -47
  23. data/examples/blueprint_plugins/src/ie.scss +3 -3
  24. data/examples/blueprint_plugins/src/link_icons.scss +13 -13
  25. data/examples/blueprint_plugins/src/print.scss +3 -3
  26. data/examples/blueprint_plugins/src/rtl_screen.scss +15 -15
  27. data/examples/blueprint_plugins/src/screen.scss +12 -12
  28. data/examples/blueprint_scoped/src/ie.scss +4 -4
  29. data/examples/blueprint_scoped/src/print.scss +4 -4
  30. data/examples/blueprint_scoped/src/screen.scss +5 -5
  31. data/examples/blueprint_scoped_form/src/ie.scss +3 -3
  32. data/examples/blueprint_scoped_form/src/print.scss +3 -3
  33. data/examples/blueprint_scoped_form/src/screen.scss +15 -15
  34. data/examples/blueprint_semantic/config.rb +7 -7
  35. data/examples/blueprint_semantic/index.html.haml +86 -86
  36. data/examples/blueprint_semantic/parts/fancy_type.html.haml +100 -100
  37. data/examples/blueprint_semantic/parts/liquid.html.haml +100 -100
  38. data/examples/blueprint_semantic/src/ie.scss +3 -3
  39. data/examples/blueprint_semantic/src/liquid.scss +69 -69
  40. data/examples/blueprint_semantic/src/print.scss +3 -3
  41. data/examples/blueprint_semantic/src/screen.scss +69 -69
  42. data/examples/compass/bootstrap.rb +3 -3
  43. data/examples/compass/clean.rb +1 -1
  44. data/examples/compass/compass.html.haml +39 -39
  45. data/examples/compass/config.rb +8 -8
  46. data/examples/compass/pie.html.haml +73 -73
  47. data/examples/compass/sprites.html.haml +37 -37
  48. data/examples/compass/src/bp_layout.scss +18 -18
  49. data/examples/compass/src/compass.scss +46 -46
  50. data/examples/compass/src/pie.scss +110 -110
  51. data/examples/compass/src/sprites.scss +24 -24
  52. data/examples/compass/src/sticky_footer.scss +11 -11
  53. data/examples/compass/src/utilities.scss +108 -108
  54. data/examples/compass/sticky_footer.html.haml +13 -13
  55. data/examples/compass/utilities.html.haml +189 -189
  56. data/examples/css3/bootstrap.rb +3 -3
  57. data/examples/css3/clean.rb +2 -2
  58. data/examples/css3/config.rb +6 -6
  59. data/examples/css3/extensions/fancy-fonts/templates/project/fancy-fonts.sass +10 -10
  60. data/examples/css3/extensions/fancy-fonts/templates/project/manifest.rb +6 -6
  61. data/examples/css3/gradients.html.haml +68 -68
  62. data/examples/css3/index.html.haml +57 -57
  63. data/examples/css3/src/_base.scss +13 -13
  64. data/examples/css3/src/fancy-fonts.scss +13 -13
  65. data/examples/css3/src/gradients.scss +85 -85
  66. data/examples/css3/src/main.scss +108 -108
  67. data/examples/downloader.rb +58 -58
  68. data/examples/ninesixty/bootstrap.rb +4 -4
  69. data/examples/ninesixty/clean.rb +1 -1
  70. data/examples/ninesixty/config.rb +9 -9
  71. data/examples/ninesixty/src/grid.scss +15 -15
  72. data/examples/ninesixty/src/text.scss +8 -8
  73. data/examples/susy/bootstrap.rb +3 -3
  74. data/examples/susy/clean.rb +1 -1
  75. data/examples/susy/config.rb +9 -9
  76. data/examples/susy/src/_base.scss +61 -61
  77. data/examples/susy/src/_defaults.scss +140 -140
  78. data/examples/susy/src/screen.scss +100 -100
  79. data/examples/yui/bootstrap.rb +2 -2
  80. data/examples/yui/clean.rb +1 -1
  81. data/examples/yui/divisions.html.haml +179 -179
  82. data/examples/yui/index.html.haml +19 -19
  83. data/examples/yui/src/screen.scss +13 -13
  84. data/examples/yui/sub_divisions.html.haml +169 -169
  85. data/examples/yui/templates.html.haml +54 -54
  86. data/examples/yui/typography.html.haml +132 -132
  87. data/features/command_line.feature +292 -292
  88. data/features/extensions.feature +27 -27
  89. data/features/step_definitions/command_line_steps.rb +268 -268
  90. data/features/step_definitions/extension_steps.rb +24 -24
  91. data/frameworks/blueprint/stylesheets/_blueprint.scss +37 -37
  92. data/frameworks/blueprint/stylesheets/blueprint/_buttons.scss +100 -100
  93. data/frameworks/blueprint/stylesheets/blueprint/_colors.scss +36 -36
  94. data/frameworks/blueprint/stylesheets/blueprint/_debug.scss +28 -28
  95. data/frameworks/blueprint/stylesheets/blueprint/_fancy-type.scss +88 -88
  96. data/frameworks/blueprint/stylesheets/blueprint/_form.scss +66 -66
  97. data/frameworks/blueprint/stylesheets/blueprint/_grid.scss +258 -258
  98. data/frameworks/blueprint/stylesheets/blueprint/_ie.scss +111 -111
  99. data/frameworks/blueprint/stylesheets/blueprint/_interaction.scss +66 -66
  100. data/frameworks/blueprint/stylesheets/blueprint/_link-icons.scss +37 -37
  101. data/frameworks/blueprint/stylesheets/blueprint/_liquid.scss +152 -152
  102. data/frameworks/blueprint/stylesheets/blueprint/_print.scss +86 -86
  103. data/frameworks/blueprint/stylesheets/blueprint/_reset.scss +2 -2
  104. data/frameworks/blueprint/stylesheets/blueprint/_rtl.scss +121 -121
  105. data/frameworks/blueprint/stylesheets/blueprint/_scaffolding.scss +52 -52
  106. data/frameworks/blueprint/stylesheets/blueprint/_typography.scss +90 -90
  107. data/frameworks/blueprint/stylesheets/blueprint/_utilities.scss +37 -37
  108. data/frameworks/blueprint/stylesheets/blueprint/reset/_utilities.scss +83 -83
  109. data/frameworks/blueprint/templates/basic/ie.sass +4 -4
  110. data/frameworks/blueprint/templates/basic/manifest.rb +30 -30
  111. data/frameworks/blueprint/templates/basic/partials/_base.sass +10 -10
  112. data/frameworks/blueprint/templates/basic/print.sass +4 -4
  113. data/frameworks/blueprint/templates/basic/screen.sass +12 -12
  114. data/frameworks/blueprint/templates/buttons/buttons.sass +49 -49
  115. data/frameworks/blueprint/templates/buttons/buttons/cross.png +0 -0
  116. data/frameworks/blueprint/templates/buttons/buttons/key.png +0 -0
  117. data/frameworks/blueprint/templates/buttons/buttons/tick.png +0 -0
  118. data/frameworks/blueprint/templates/buttons/manifest.rb +17 -17
  119. data/frameworks/blueprint/templates/link_icons/link_icons.sass +13 -13
  120. data/frameworks/blueprint/templates/link_icons/manifest.rb +23 -23
  121. data/frameworks/blueprint/templates/project/ie.sass +16 -16
  122. data/frameworks/blueprint/templates/project/manifest.rb +30 -30
  123. data/frameworks/blueprint/templates/project/partials/_base.sass +11 -11
  124. data/frameworks/blueprint/templates/project/print.sass +7 -7
  125. data/frameworks/blueprint/templates/project/screen.sass +46 -46
  126. data/frameworks/blueprint/templates/semantic/ie.sass +16 -16
  127. data/frameworks/blueprint/templates/semantic/manifest.rb +33 -33
  128. data/frameworks/blueprint/templates/semantic/partials/_base.sass +10 -10
  129. data/frameworks/blueprint/templates/semantic/partials/_form.sass +5 -5
  130. data/frameworks/blueprint/templates/semantic/partials/_page.sass +17 -17
  131. data/frameworks/blueprint/templates/semantic/partials/_two_col.sass +38 -38
  132. data/frameworks/blueprint/templates/semantic/print.sass +4 -4
  133. data/frameworks/blueprint/templates/semantic/screen.sass +14 -14
  134. data/frameworks/compass/stylesheets/_compass.scss +3 -3
  135. data/frameworks/compass/stylesheets/_lemonade.scss +37 -37
  136. data/frameworks/compass/stylesheets/compass/_css3.scss +20 -20
  137. data/frameworks/compass/stylesheets/compass/_layout.scss +3 -3
  138. data/frameworks/compass/stylesheets/compass/_reset-legacy.scss +3 -3
  139. data/frameworks/compass/stylesheets/compass/_reset.scss +3 -3
  140. data/frameworks/compass/stylesheets/compass/_support.scss +40 -40
  141. data/frameworks/compass/stylesheets/compass/_typography.scss +4 -4
  142. data/frameworks/compass/stylesheets/compass/_utilities.scss +9 -9
  143. data/frameworks/compass/stylesheets/compass/css3/_appearance.scss +17 -17
  144. data/frameworks/compass/stylesheets/compass/css3/_background-clip.scss +43 -43
  145. data/frameworks/compass/stylesheets/compass/css3/_background-origin.scss +42 -42
  146. data/frameworks/compass/stylesheets/compass/css3/_background-size.scss +26 -26
  147. data/frameworks/compass/stylesheets/compass/css3/_border-radius.scss +130 -130
  148. data/frameworks/compass/stylesheets/compass/css3/_box-shadow.scss +76 -76
  149. data/frameworks/compass/stylesheets/compass/css3/_box-sizing.scss +13 -13
  150. data/frameworks/compass/stylesheets/compass/css3/_box.scss +111 -111
  151. data/frameworks/compass/stylesheets/compass/css3/_columns.scss +156 -156
  152. data/frameworks/compass/stylesheets/compass/css3/_filter.scss +23 -23
  153. data/frameworks/compass/stylesheets/compass/css3/_font-face.scss +48 -48
  154. data/frameworks/compass/stylesheets/compass/css3/_hyphenation.scss +77 -77
  155. data/frameworks/compass/stylesheets/compass/css3/_images.scss +132 -132
  156. data/frameworks/compass/stylesheets/compass/css3/_inline-block.scss +22 -22
  157. data/frameworks/compass/stylesheets/compass/css3/_opacity.scss +19 -19
  158. data/frameworks/compass/stylesheets/compass/css3/_pie.scss +72 -72
  159. data/frameworks/compass/stylesheets/compass/css3/_regions.scss +21 -21
  160. data/frameworks/compass/stylesheets/compass/css3/_shared.scss +38 -38
  161. data/frameworks/compass/stylesheets/compass/css3/_text-shadow.scss +87 -87
  162. data/frameworks/compass/stylesheets/compass/css3/_transform-legacy.scss +87 -87
  163. data/frameworks/compass/stylesheets/compass/css3/_transform.scss +598 -598
  164. data/frameworks/compass/stylesheets/compass/css3/_transition.scss +221 -221
  165. data/frameworks/compass/stylesheets/compass/css3/_user-interface.scss +17 -17
  166. data/frameworks/compass/stylesheets/compass/layout/_grid-background.scss +178 -178
  167. data/frameworks/compass/stylesheets/compass/layout/_sticky-footer.scss +23 -23
  168. data/frameworks/compass/stylesheets/compass/layout/_stretching.scss +23 -23
  169. data/frameworks/compass/stylesheets/compass/reset/_utilities-legacy.scss +135 -135
  170. data/frameworks/compass/stylesheets/compass/reset/_utilities.scss +142 -142
  171. data/frameworks/compass/stylesheets/compass/typography/_links.scss +3 -3
  172. data/frameworks/compass/stylesheets/compass/typography/_lists.scss +4 -4
  173. data/frameworks/compass/stylesheets/compass/typography/_text.scss +4 -4
  174. data/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss +221 -221
  175. data/frameworks/compass/stylesheets/compass/typography/links/_hover-link.scss +5 -5
  176. data/frameworks/compass/stylesheets/compass/typography/links/_link-colors.scss +28 -28
  177. data/frameworks/compass/stylesheets/compass/typography/links/_unstyled-link.scss +7 -7
  178. data/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss +34 -34
  179. data/frameworks/compass/stylesheets/compass/typography/lists/_horizontal-list.scss +61 -61
  180. data/frameworks/compass/stylesheets/compass/typography/lists/_inline-block-list.scss +50 -50
  181. data/frameworks/compass/stylesheets/compass/typography/lists/_inline-list.scss +44 -44
  182. data/frameworks/compass/stylesheets/compass/typography/text/_ellipsis.scss +25 -25
  183. data/frameworks/compass/stylesheets/compass/typography/text/_force-wrap.scss +12 -12
  184. data/frameworks/compass/stylesheets/compass/typography/text/_nowrap.scss +2 -2
  185. data/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss +68 -68
  186. data/frameworks/compass/stylesheets/compass/utilities/_general.scss +6 -6
  187. data/frameworks/compass/stylesheets/compass/utilities/_links.scss +5 -5
  188. data/frameworks/compass/stylesheets/compass/utilities/_lists.scss +6 -6
  189. data/frameworks/compass/stylesheets/compass/utilities/_print.scss +17 -17
  190. data/frameworks/compass/stylesheets/compass/utilities/_sprites.scss +2 -2
  191. data/frameworks/compass/stylesheets/compass/utilities/_tables.scss +3 -3
  192. data/frameworks/compass/stylesheets/compass/utilities/_text.scss +5 -5
  193. data/frameworks/compass/stylesheets/compass/utilities/color/_contrast.scss +27 -27
  194. data/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss +44 -44
  195. data/frameworks/compass/stylesheets/compass/utilities/general/_float.scss +29 -29
  196. data/frameworks/compass/stylesheets/compass/utilities/general/_hacks.scss +46 -46
  197. data/frameworks/compass/stylesheets/compass/utilities/general/_min.scss +16 -16
  198. data/frameworks/compass/stylesheets/compass/utilities/general/_reset.scss +1 -1
  199. data/frameworks/compass/stylesheets/compass/utilities/general/_tabs.scss +1 -1
  200. data/frameworks/compass/stylesheets/compass/utilities/general/_tag-cloud.scss +18 -18
  201. data/frameworks/compass/stylesheets/compass/utilities/links/_hover-link.scss +3 -3
  202. data/frameworks/compass/stylesheets/compass/utilities/links/_link-colors.scss +3 -3
  203. data/frameworks/compass/stylesheets/compass/utilities/links/_unstyled-link.scss +3 -3
  204. data/frameworks/compass/stylesheets/compass/utilities/lists/_bullets.scss +3 -3
  205. data/frameworks/compass/stylesheets/compass/utilities/lists/_horizontal-list.scss +3 -3
  206. data/frameworks/compass/stylesheets/compass/utilities/lists/_inline-block-list.scss +3 -3
  207. data/frameworks/compass/stylesheets/compass/utilities/lists/_inline-list.scss +3 -3
  208. data/frameworks/compass/stylesheets/compass/utilities/sprites/_base.scss +65 -65
  209. data/frameworks/compass/stylesheets/compass/utilities/sprites/_sprite-img.scss +78 -78
  210. data/frameworks/compass/stylesheets/compass/utilities/tables/_alternating-rows-and-columns.scss +22 -22
  211. data/frameworks/compass/stylesheets/compass/utilities/tables/_borders.scss +33 -33
  212. data/frameworks/compass/stylesheets/compass/utilities/tables/_scaffolding.scss +9 -9
  213. data/frameworks/compass/stylesheets/compass/utilities/text/_ellipsis.scss +3 -3
  214. data/frameworks/compass/stylesheets/compass/utilities/text/_nowrap.scss +3 -3
  215. data/frameworks/compass/stylesheets/compass/utilities/text/_replacement.scss +3 -3
  216. data/frameworks/compass/templates/ellipsis/ellipsis.sass +8 -8
  217. data/frameworks/compass/templates/ellipsis/manifest.rb +26 -26
  218. data/frameworks/compass/templates/ellipsis/xml/ellipsis.xml +13 -13
  219. data/frameworks/compass/templates/extension/manifest.rb +26 -26
  220. data/frameworks/compass/templates/extension/stylesheets/main.sass +1 -1
  221. data/frameworks/compass/templates/extension/templates/project/manifest.rb +2 -2
  222. data/frameworks/compass/templates/extension/templates/project/screen.sass +1 -1
  223. data/frameworks/compass/templates/pie/LICENSE +12 -12
  224. data/frameworks/compass/templates/pie/LICENSE-APACHE2.txt +13 -13
  225. data/frameworks/compass/templates/pie/LICENSE-GPL2.txt +277 -277
  226. data/frameworks/compass/templates/pie/PIE.htc +96 -96
  227. data/frameworks/compass/templates/pie/manifest.rb +39 -39
  228. data/frameworks/compass/templates/pie/pie.scss +73 -73
  229. data/frameworks/compass/templates/project/USAGE.markdown +32 -32
  230. data/frameworks/compass/templates/project/ie.sass +6 -6
  231. data/frameworks/compass/templates/project/manifest.rb +3 -3
  232. data/frameworks/compass/templates/project/print.sass +6 -6
  233. data/frameworks/compass/templates/project/screen.sass +7 -7
  234. data/lib/compass.rb +37 -37
  235. data/lib/compass/actions.rb +115 -115
  236. data/lib/compass/app_integration.rb +39 -39
  237. data/lib/compass/app_integration/rails.rb +18 -18
  238. data/lib/compass/app_integration/stand_alone.rb +22 -22
  239. data/lib/compass/app_integration/stand_alone/configuration_defaults.rb +32 -32
  240. data/lib/compass/app_integration/stand_alone/installer.rb +83 -83
  241. data/lib/compass/browser_support.rb +62 -62
  242. data/lib/compass/commands.rb +12 -12
  243. data/lib/compass/commands/base.rb +44 -44
  244. data/lib/compass/commands/clean_project.rb +79 -79
  245. data/lib/compass/commands/create_project.rb +131 -131
  246. data/lib/compass/commands/default.rb +50 -50
  247. data/lib/compass/commands/extension_command.rb +60 -60
  248. data/lib/compass/commands/generate_grid_background.rb +96 -96
  249. data/lib/compass/commands/help.rb +85 -85
  250. data/lib/compass/commands/imports.rb +35 -35
  251. data/lib/compass/commands/installer_command.rb +32 -32
  252. data/lib/compass/commands/interactive.rb +61 -61
  253. data/lib/compass/commands/list_frameworks.rb +38 -38
  254. data/lib/compass/commands/print_version.rb +99 -99
  255. data/lib/compass/commands/project_base.rb +103 -103
  256. data/lib/compass/commands/project_stats.rb +178 -178
  257. data/lib/compass/commands/project_structure.rb +93 -93
  258. data/lib/compass/commands/registry.rb +40 -40
  259. data/lib/compass/commands/sprite.rb +89 -89
  260. data/lib/compass/commands/stamp_pattern.rb +90 -90
  261. data/lib/compass/commands/unpack_extension.rb +120 -120
  262. data/lib/compass/commands/update_project.rb +139 -139
  263. data/lib/compass/commands/validate_project.rb +77 -77
  264. data/lib/compass/commands/watch_project.rb +170 -170
  265. data/lib/compass/commands/write_configuration.rb +125 -125
  266. data/lib/compass/compiler.rb +200 -200
  267. data/lib/compass/configuration.rb +91 -91
  268. data/lib/compass/configuration/adapters.rb +77 -77
  269. data/lib/compass/configuration/comments.rb +59 -59
  270. data/lib/compass/configuration/data.rb +193 -193
  271. data/lib/compass/configuration/defaults.rb +187 -187
  272. data/lib/compass/configuration/file_data.rb +21 -21
  273. data/lib/compass/configuration/helpers.rb +160 -160
  274. data/lib/compass/configuration/inheritance.rb +304 -304
  275. data/lib/compass/configuration/paths.rb +19 -19
  276. data/lib/compass/configuration/serialization.rb +88 -88
  277. data/lib/compass/dependencies.rb +12 -12
  278. data/lib/compass/errors.rb +11 -11
  279. data/lib/compass/exec.rb +23 -23
  280. data/lib/compass/exec/command_option_parser.rb +23 -23
  281. data/lib/compass/exec/global_options_parser.rb +63 -63
  282. data/lib/compass/exec/helpers.rb +21 -21
  283. data/lib/compass/exec/project_options_parser.rb +66 -66
  284. data/lib/compass/exec/sub_command_ui.rb +51 -51
  285. data/lib/compass/exec/switch_ui.rb +179 -179
  286. data/lib/compass/frameworks.rb +133 -133
  287. data/lib/compass/grid_builder.rb +102 -102
  288. data/lib/compass/installers.rb +3 -3
  289. data/lib/compass/installers/bare_installer.rb +58 -58
  290. data/lib/compass/installers/base.rb +187 -187
  291. data/lib/compass/installers/manifest.rb +161 -161
  292. data/lib/compass/installers/manifest_installer.rb +61 -61
  293. data/lib/compass/installers/template_context.rb +43 -43
  294. data/lib/compass/logger.rb +103 -103
  295. data/lib/compass/quick_cache.rb +15 -15
  296. data/lib/compass/rails.rb +2 -2
  297. data/lib/compass/sass_extensions.rb +10 -10
  298. data/lib/compass/sass_extensions/functions.rb +34 -34
  299. data/lib/compass/sass_extensions/functions/colors.rb +67 -67
  300. data/lib/compass/sass_extensions/functions/constants.rb +74 -74
  301. data/lib/compass/sass_extensions/functions/cross_browser_support.rb +70 -70
  302. data/lib/compass/sass_extensions/functions/display.rb +27 -27
  303. data/lib/compass/sass_extensions/functions/enumerate.rb +6 -6
  304. data/lib/compass/sass_extensions/functions/env.rb +5 -5
  305. data/lib/compass/sass_extensions/functions/font_files.rb +41 -41
  306. data/lib/compass/sass_extensions/functions/gradient_support.rb +540 -540
  307. data/lib/compass/sass_extensions/functions/image_size.rb +113 -113
  308. data/lib/compass/sass_extensions/functions/inline_image.rb +64 -64
  309. data/lib/compass/sass_extensions/functions/lists.rb +101 -101
  310. data/lib/compass/sass_extensions/functions/math.rb +63 -63
  311. data/lib/compass/sass_extensions/functions/selectors.rb +63 -63
  312. data/lib/compass/sass_extensions/functions/sprites.rb +218 -218
  313. data/lib/compass/sass_extensions/functions/urls.rb +266 -266
  314. data/lib/compass/sass_extensions/monkey_patches.rb +3 -3
  315. data/lib/compass/sass_extensions/monkey_patches/browser_support.rb +95 -95
  316. data/lib/compass/sass_extensions/monkey_patches/traversal.rb +23 -23
  317. data/lib/compass/sass_extensions/sprites.rb +19 -19
  318. data/lib/compass/sass_extensions/sprites/engines.rb +25 -25
  319. data/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb +30 -30
  320. data/lib/compass/sass_extensions/sprites/image.rb +151 -151
  321. data/lib/compass/sass_extensions/sprites/image_methods.rb +31 -31
  322. data/lib/compass/sass_extensions/sprites/image_row.rb +46 -46
  323. data/lib/compass/sass_extensions/sprites/layout_methods.rb +158 -158
  324. data/lib/compass/sass_extensions/sprites/row_fitter.rb +91 -91
  325. data/lib/compass/sass_extensions/sprites/sprite_map.rb +86 -86
  326. data/lib/compass/sass_extensions/sprites/sprite_methods.rb +141 -141
  327. data/lib/compass/sprite_importer.rb +116 -116
  328. data/lib/compass/sprite_importer/binding.rb +10 -10
  329. data/lib/compass/sprite_importer/content.erb +80 -80
  330. data/lib/compass/stats.rb +99 -99
  331. data/lib/compass/test_case.rb +38 -38
  332. data/lib/compass/util.rb +29 -29
  333. data/lib/compass/validator.rb +16 -16
  334. data/lib/compass/version.rb +60 -60
  335. data/test/fixtures/extensions/only_stylesheets/compass_init.rb +1 -1
  336. data/test/fixtures/extensions/only_stylesheets/scss/only_stylesheets/foo.scss +3 -3
  337. data/test/fixtures/fonts/bgrove.base64.txt +1 -1
  338. data/test/fixtures/fonts/bgrove.ttf +0 -0
  339. data/test/fixtures/sprites/public/images/ko/starbg26x27.png +0 -0
  340. data/test/fixtures/stylesheets/blueprint/config.rb +14 -14
  341. data/test/fixtures/stylesheets/blueprint/css/ie.css +76 -76
  342. data/test/fixtures/stylesheets/blueprint/css/print.css +56 -56
  343. data/test/fixtures/stylesheets/blueprint/css/screen.css +815 -815
  344. data/test/fixtures/stylesheets/blueprint/css/single-imports/buttons.css +56 -56
  345. data/test/fixtures/stylesheets/blueprint/css/single-imports/colors.css +80 -80
  346. data/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css +11 -11
  347. data/test/fixtures/stylesheets/blueprint/css/single-imports/fancy-type.css +30 -30
  348. data/test/fixtures/stylesheets/blueprint/css/single-imports/form.css +42 -42
  349. data/test/fixtures/stylesheets/blueprint/css/single-imports/grid.css +435 -435
  350. data/test/fixtures/stylesheets/blueprint/css/single-imports/ie.css +76 -76
  351. data/test/fixtures/stylesheets/blueprint/css/single-imports/interaction.css +46 -46
  352. data/test/fixtures/stylesheets/blueprint/css/single-imports/link-icons.css +40 -40
  353. data/test/fixtures/stylesheets/blueprint/css/single-imports/liquid.css +651 -651
  354. data/test/fixtures/stylesheets/blueprint/css/single-imports/print.css +60 -60
  355. data/test/fixtures/stylesheets/blueprint/css/single-imports/reset-utilities.css +75 -75
  356. data/test/fixtures/stylesheets/blueprint/css/single-imports/reset.css +42 -42
  357. data/test/fixtures/stylesheets/blueprint/css/single-imports/rtl.css +437 -437
  358. data/test/fixtures/stylesheets/blueprint/css/single-imports/scaffolding.css +45 -45
  359. data/test/fixtures/stylesheets/blueprint/css/single-imports/typography.css +146 -146
  360. data/test/fixtures/stylesheets/blueprint/css/single-imports/utilities.css +35 -35
  361. data/test/fixtures/stylesheets/blueprint/sass/ie.sass +3 -3
  362. data/test/fixtures/stylesheets/blueprint/sass/print.sass +3 -3
  363. data/test/fixtures/stylesheets/blueprint/sass/screen.sass +18 -18
  364. data/test/fixtures/stylesheets/blueprint/sass/single-imports/buttons.scss +3 -3
  365. data/test/fixtures/stylesheets/blueprint/sass/single-imports/colors.scss +34 -34
  366. data/test/fixtures/stylesheets/blueprint/sass/single-imports/debug.scss +3 -3
  367. data/test/fixtures/stylesheets/blueprint/sass/single-imports/fancy-type.scss +3 -3
  368. data/test/fixtures/stylesheets/blueprint/sass/single-imports/form.scss +4 -4
  369. data/test/fixtures/stylesheets/blueprint/sass/single-imports/grid.scss +2 -2
  370. data/test/fixtures/stylesheets/blueprint/sass/single-imports/ie.scss +2 -2
  371. data/test/fixtures/stylesheets/blueprint/sass/single-imports/interaction.scss +3 -3
  372. data/test/fixtures/stylesheets/blueprint/sass/single-imports/link-icons.scss +12 -12
  373. data/test/fixtures/stylesheets/blueprint/sass/single-imports/liquid.scss +2 -2
  374. data/test/fixtures/stylesheets/blueprint/sass/single-imports/print.scss +4 -4
  375. data/test/fixtures/stylesheets/blueprint/sass/single-imports/reset-utilities.scss +4 -4
  376. data/test/fixtures/stylesheets/blueprint/sass/single-imports/reset.scss +1 -1
  377. data/test/fixtures/stylesheets/blueprint/sass/single-imports/rtl.scss +2 -2
  378. data/test/fixtures/stylesheets/blueprint/sass/single-imports/scaffolding.scss +5 -5
  379. data/test/fixtures/stylesheets/blueprint/sass/single-imports/typography.scss +3 -3
  380. data/test/fixtures/stylesheets/blueprint/sass/single-imports/utilities.scss +3 -3
  381. data/test/fixtures/stylesheets/busted_image_urls/config.rb +29 -29
  382. data/test/fixtures/stylesheets/busted_image_urls/css/screen.css +9 -9
  383. data/test/fixtures/stylesheets/busted_image_urls/sass/screen.sass +13 -13
  384. data/test/fixtures/stylesheets/compass/config.rb +16 -16
  385. data/test/fixtures/stylesheets/compass/css/background-clip.css +10 -10
  386. data/test/fixtures/stylesheets/compass/css/border_radius.css +14 -14
  387. data/test/fixtures/stylesheets/compass/css/box-sizeing.css +9 -9
  388. data/test/fixtures/stylesheets/compass/css/box.css +103 -103
  389. data/test/fixtures/stylesheets/compass/css/box_shadow.css +14 -14
  390. data/test/fixtures/stylesheets/compass/css/columns.css +161 -161
  391. data/test/fixtures/stylesheets/compass/css/filters.css +29 -29
  392. data/test/fixtures/stylesheets/compass/css/fonts.css +4 -4
  393. data/test/fixtures/stylesheets/compass/css/force-wrap.css +9 -9
  394. data/test/fixtures/stylesheets/compass/css/gradients.css +202 -202
  395. data/test/fixtures/stylesheets/compass/css/grid_background.css +71 -71
  396. data/test/fixtures/stylesheets/compass/css/hyphenation.css +16 -16
  397. data/test/fixtures/stylesheets/compass/css/image_size.css +15 -15
  398. data/test/fixtures/stylesheets/compass/css/images.css +8 -8
  399. data/test/fixtures/stylesheets/compass/css/layout.css +16 -16
  400. data/test/fixtures/stylesheets/compass/css/legacy_clearfix.css +26 -26
  401. data/test/fixtures/stylesheets/compass/css/lists.css +151 -151
  402. data/test/fixtures/stylesheets/compass/css/opacity.css +3 -3
  403. data/test/fixtures/stylesheets/compass/css/pie.css +26 -26
  404. data/test/fixtures/stylesheets/compass/css/print.css +11 -11
  405. data/test/fixtures/stylesheets/compass/css/regions.css +7 -7
  406. data/test/fixtures/stylesheets/compass/css/replacement.css +59 -59
  407. data/test/fixtures/stylesheets/compass/css/reset.css +59 -59
  408. data/test/fixtures/stylesheets/compass/css/sprites.css +1262 -1262
  409. data/test/fixtures/stylesheets/compass/css/stretching.css +66 -66
  410. data/test/fixtures/stylesheets/compass/css/text_shadow.css +29 -29
  411. data/test/fixtures/stylesheets/compass/css/transform.css +441 -441
  412. data/test/fixtures/stylesheets/compass/css/transition.css +128 -128
  413. data/test/fixtures/stylesheets/compass/css/user-interface.css +4 -4
  414. data/test/fixtures/stylesheets/compass/css/utilities.css +56 -56
  415. data/test/fixtures/stylesheets/compass/css/vertical_rhythm.css +45 -45
  416. data/test/fixtures/stylesheets/compass/sass/background-clip.scss +7 -7
  417. data/test/fixtures/stylesheets/compass/sass/border_radius.scss +5 -5
  418. data/test/fixtures/stylesheets/compass/sass/box-sizeing.scss +7 -7
  419. data/test/fixtures/stylesheets/compass/sass/box.sass +49 -49
  420. data/test/fixtures/stylesheets/compass/sass/box_shadow.scss +5 -5
  421. data/test/fixtures/stylesheets/compass/sass/columns.scss +28 -28
  422. data/test/fixtures/stylesheets/compass/sass/filters.scss +24 -24
  423. data/test/fixtures/stylesheets/compass/sass/fonts.sass +2 -2
  424. data/test/fixtures/stylesheets/compass/sass/force-wrap.scss +3 -3
  425. data/test/fixtures/stylesheets/compass/sass/gradients.sass +96 -96
  426. data/test/fixtures/stylesheets/compass/sass/grid_background.scss +33 -33
  427. data/test/fixtures/stylesheets/compass/sass/hyphenation.scss +10 -10
  428. data/test/fixtures/stylesheets/compass/sass/image_size.sass +15 -15
  429. data/test/fixtures/stylesheets/compass/sass/images.scss +8 -8
  430. data/test/fixtures/stylesheets/compass/sass/layout.sass +3 -3
  431. data/test/fixtures/stylesheets/compass/sass/legacy_clearfix.scss +14 -14
  432. data/test/fixtures/stylesheets/compass/sass/lists.scss +11 -11
  433. data/test/fixtures/stylesheets/compass/sass/opacity.scss +5 -5
  434. data/test/fixtures/stylesheets/compass/sass/pie.scss +47 -47
  435. data/test/fixtures/stylesheets/compass/sass/print.sass +5 -5
  436. data/test/fixtures/stylesheets/compass/sass/regions.scss +3 -3
  437. data/test/fixtures/stylesheets/compass/sass/replacement.scss +22 -22
  438. data/test/fixtures/stylesheets/compass/sass/reset.sass +12 -12
  439. data/test/fixtures/stylesheets/compass/sass/sprites.scss +13 -13
  440. data/test/fixtures/stylesheets/compass/sass/stretching.sass +33 -33
  441. data/test/fixtures/stylesheets/compass/sass/text_shadow.scss +11 -11
  442. data/test/fixtures/stylesheets/compass/sass/transform.scss +87 -87
  443. data/test/fixtures/stylesheets/compass/sass/transition.scss +24 -24
  444. data/test/fixtures/stylesheets/compass/sass/user-interface.scss +4 -4
  445. data/test/fixtures/stylesheets/compass/sass/utilities.scss +20 -20
  446. data/test/fixtures/stylesheets/compass/sass/vertical_rhythm.scss +15 -15
  447. data/test/fixtures/stylesheets/envtest/config.rb +9 -9
  448. data/test/fixtures/stylesheets/envtest/css/env.css +2 -2
  449. data/test/fixtures/stylesheets/envtest/sass/env.scss +3 -3
  450. data/test/fixtures/stylesheets/error/config.rb +10 -10
  451. data/test/fixtures/stylesheets/error/sass/screen.sass +2 -2
  452. data/test/fixtures/stylesheets/image_urls/config.rb +19 -19
  453. data/test/fixtures/stylesheets/image_urls/css/screen.css +5 -5
  454. data/test/fixtures/stylesheets/image_urls/sass/screen.sass +8 -8
  455. data/test/fixtures/stylesheets/relative/config.rb +10 -10
  456. data/test/fixtures/stylesheets/relative/css/ie.css +1 -1
  457. data/test/fixtures/stylesheets/relative/css/print.css +1 -1
  458. data/test/fixtures/stylesheets/relative/css/screen.css +1 -1
  459. data/test/fixtures/stylesheets/relative/sass/ie.sass +5 -5
  460. data/test/fixtures/stylesheets/relative/sass/print.sass +3 -3
  461. data/test/fixtures/stylesheets/relative/sass/screen.sass +2 -2
  462. data/test/fixtures/stylesheets/uses_only_stylesheets_ext/config.rb +25 -25
  463. data/test/fixtures/stylesheets/uses_only_stylesheets_ext/sass/ie.scss +5 -5
  464. data/test/fixtures/stylesheets/uses_only_stylesheets_ext/sass/print.scss +3 -3
  465. data/test/fixtures/stylesheets/uses_only_stylesheets_ext/sass/screen.scss +6 -6
  466. data/test/fixtures/stylesheets/uses_only_stylesheets_ext/stylesheets/ie.css +5 -5
  467. data/test/fixtures/stylesheets/uses_only_stylesheets_ext/stylesheets/print.css +3 -3
  468. data/test/fixtures/stylesheets/uses_only_stylesheets_ext/stylesheets/screen.css +68 -68
  469. data/test/fixtures/stylesheets/valid/config.rb +9 -9
  470. data/test/fixtures/stylesheets/valid/sass/simple.sass +1 -1
  471. data/test/helpers/command_line.rb +114 -114
  472. data/test/helpers/diff.rb +48 -48
  473. data/test/helpers/io.rb +36 -36
  474. data/test/helpers/rails.rb +55 -55
  475. data/test/helpers/test_case.rb +62 -62
  476. data/test/integrations/compass_test.rb +224 -224
  477. data/test/integrations/sprites_test.rb +843 -843
  478. data/test/test_helper.rb +73 -73
  479. data/test/units/actions_test.rb +23 -23
  480. data/test/units/command_line_test.rb +60 -60
  481. data/test/units/compass_module_test.rb +36 -36
  482. data/test/units/compass_png_test.rb +45 -45
  483. data/test/units/compiler_test.rb +10 -10
  484. data/test/units/configuration_test.rb +440 -440
  485. data/test/units/regressions_test.rb +35 -35
  486. data/test/units/sass_extensions_test.rb +198 -198
  487. data/test/units/sprites/engine_test.rb +47 -47
  488. data/test/units/sprites/image_row_test.rb +57 -57
  489. data/test/units/sprites/image_test.rb +99 -99
  490. data/test/units/sprites/importer_test.rb +90 -90
  491. data/test/units/sprites/layout_test.rb +154 -154
  492. data/test/units/sprites/row_fitter_test.rb +65 -65
  493. data/test/units/sprites/sprite_command_test.rb +54 -54
  494. data/test/units/sprites/sprite_map_test.rb +130 -130
  495. metadata +1304 -1310
@@ -1,540 +1,540 @@
1
- module Compass::SassExtensions::Functions::GradientSupport
2
-
3
- GRADIENT_ASPECTS = %w(webkit moz svg pie css2 o owg).freeze
4
-
5
- class ColorStop < Sass::Script::Literal
6
- attr_accessor :color, :stop
7
- def children
8
- [color, stop].compact
9
- end
10
- def initialize(color, stop = nil)
11
- unless Sass::Script::Color === color ||
12
- Sass::Script::Funcall === color ||
13
- (Sass::Script::String === color && color.value == "transparent")
14
- raise Sass::SyntaxError, "Expected a color. Got: #{color}"
15
- end
16
- if stop && !stop.is_a?(Sass::Script::Number)
17
- raise Sass::SyntaxError, "Expected a number. Got: #{stop}"
18
- end
19
- self.color, self.stop = color, stop
20
- end
21
- def inspect
22
- to_s
23
- end
24
- def self.color_to_s(c)
25
- if c.is_a?(Sass::Script::String)
26
- c.value.dup
27
- else
28
- c.inspect.dup
29
- end
30
- end
31
-
32
- def to_s(options = self.options)
33
- s = self.class.color_to_s(color)
34
- if stop
35
- s << " "
36
- if stop.unitless?
37
- s << stop.times(Sass::Script::Number.new(100, ["%"])).inspect
38
- else
39
- s << stop.inspect
40
- end
41
- end
42
- s
43
- end
44
- end
45
-
46
- module Gradient
47
-
48
- def self.included(base)
49
- base.extend ClassMethods
50
- end
51
-
52
- module ClassMethods
53
- def standardized_prefix(prefix)
54
- class_eval %Q{
55
- def to_#{prefix}(options = self.options)
56
- Sass::Script::String.new("-#{prefix}-\#{to_s(options)}")
57
- end
58
- }
59
- end
60
- end
61
-
62
- def inspect
63
- to_s
64
- end
65
-
66
- def supports?(aspect)
67
- GRADIENT_ASPECTS.include?(aspect)
68
- end
69
-
70
- def has_aspect?
71
- true
72
- end
73
-
74
- def angle?(value)
75
- value.is_a?(Sass::Script::Number) &&
76
- value.numerator_units.size == 1 &&
77
- value.numerator_units.first == "deg" &&
78
- value.denominator_units.empty?
79
- end
80
-
81
- end
82
-
83
- class RadialGradient < Sass::Script::Literal
84
- include Gradient
85
-
86
- attr_accessor :position, :shape_and_size, :color_stops
87
-
88
- def children
89
- [color_stops, position, shape_and_size].compact
90
- end
91
-
92
- def initialize(position, shape_and_size, color_stops)
93
- unless color_stops.value.size >= 2
94
- raise Sass::SyntaxError, "At least two color stops are required for a radial-gradient"
95
- end
96
- if angle?(position)
97
- raise Sass::SyntaxError, "CSS no longer allows angles in radial-gradients."
98
- end
99
- self.position = position
100
- self.shape_and_size = shape_and_size
101
- self.color_stops = color_stops
102
- end
103
-
104
- def to_s(options = self.options)
105
- s = "radial-gradient("
106
- s << position.to_s(options) << ", " if position
107
- s << shape_and_size.to_s(options) << ", " if shape_and_size
108
- s << color_stops.to_s(options)
109
- s << ")"
110
- end
111
-
112
- standardized_prefix :webkit
113
- standardized_prefix :moz
114
- standardized_prefix :o
115
-
116
- def to_owg(options = self.options)
117
- args = [
118
- grad_point(position || _center_position),
119
- Sass::Script::String.new("0"),
120
- grad_point(position || _center_position),
121
- grad_end_position(color_stops, Sass::Script::Bool.new(true)),
122
- grad_color_stops(color_stops)
123
- ]
124
- args.each {|a| a.options = options}
125
- Sass::Script::String.new("-webkit-gradient(radial, #{args.join(', ')})")
126
- end
127
-
128
- def to_svg(options = self.options)
129
- # XXX Add shape support if possible
130
- radial_svg_gradient(color_stops, position || _center_position)
131
- end
132
-
133
- def to_pie(options = self.options)
134
- Compass::Logger.new.record(:warning, "PIE does not support radial-gradient.")
135
- Sass::Script::String.new("-pie-radial-gradient(unsupported)")
136
- end
137
-
138
- def to_css2(options = self.options)
139
- Sass::Script::String.new("")
140
- end
141
- end
142
-
143
- class LinearGradient < Sass::Script::Literal
144
- include Gradient
145
-
146
- attr_accessor :color_stops, :position_or_angle
147
-
148
- def children
149
- [color_stops, position_or_angle].compact
150
- end
151
-
152
- def initialize(position_or_angle, color_stops)
153
- unless color_stops.value.size >= 2
154
- raise Sass::SyntaxError, "At least two color stops are required for a linear-gradient"
155
- end
156
- self.position_or_angle = position_or_angle
157
- self.color_stops = color_stops
158
- end
159
-
160
- def to_s(options = self.options)
161
- s = "linear-gradient("
162
- s << position_or_angle.to_s(options) << ", " if position_or_angle
163
- s << color_stops.to_s(options)
164
- s << ")"
165
- end
166
-
167
- standardized_prefix :webkit
168
- standardized_prefix :moz
169
- standardized_prefix :o
170
-
171
- def supports?(aspect)
172
- # I don't know how to support degree-based gradients in old webkit gradients (owg) or svg so we just disable them.
173
- if %w(owg svg).include?(aspect) && position_or_angle.is_a?(Sass::Script::Number) && position_or_angle.numerator_units.include?("deg")
174
- false
175
- else
176
- super
177
- end
178
- end
179
-
180
- # Output the original webkit gradient syntax
181
- def to_owg(options = self.options)
182
- args = []
183
- args << grad_point(position_or_angle || Sass::Script::String.new("top"))
184
- args << linear_end_position(position_or_angle, color_stops)
185
- args << grad_color_stops(color_stops)
186
- args.each{|a| a.options = options}
187
- Sass::Script::String.new("-webkit-gradient(linear, #{args.join(', ')})")
188
- end
189
-
190
- def to_svg(options = self.options)
191
- linear_svg_gradient(color_stops, position_or_angle || Sass::Script::String.new("top"))
192
- end
193
-
194
- def to_pie(options = self.options)
195
- # PIE just uses the standard rep, but the property is prefixed so
196
- # the presence of this attribute helps flag when to render a special rule.
197
- Sass::Script::String.new to_s(options)
198
- end
199
-
200
- def to_css2(options = self.options)
201
- Sass::Script::String.new("")
202
- end
203
- end
204
-
205
- module Functions
206
- # given a position list, return a corresponding position in percents
207
- # otherwise, returns the original argument
208
- def grad_point(position)
209
- original_value = position
210
- position = unless position.is_a?(Sass::Script::List)
211
- Sass::Script::List.new([position], :space)
212
- else
213
- Sass::Script::List.new(position.value.dup, position.separator)
214
- end
215
- # Handle unknown arguments by passing them along untouched.
216
- unless position.value.all?{|p| is_position(p).to_bool }
217
- return original_value
218
- end
219
- if (position.value.first.value =~ /top|bottom/) or (position.value.last.value =~ /left|right/)
220
- # browsers are pretty forgiving of reversed positions so we are too.
221
- position.value.reverse!
222
- end
223
- if position.value.size == 1
224
- if position.value.first.value =~ /top|bottom/
225
- position.value.unshift Sass::Script::String.new("center")
226
- elsif position.value.first.value =~ /left|right/
227
- position.value.push Sass::Script::String.new("center")
228
- end
229
- end
230
- position.value.map! do |p|
231
- case p.value
232
- when /top|left/
233
- Sass::Script::Number.new(0, ["%"])
234
- when /bottom|right/
235
- Sass::Script::Number.new(100, ["%"])
236
- when /center/
237
- Sass::Script::Number.new(50, ["%"])
238
- else
239
- p
240
- end
241
- end
242
- position
243
- end
244
-
245
- def color_stops(*args)
246
- Sass::Script::List.new(args.map do |arg|
247
- if ColorStop === arg
248
- arg
249
- elsif Sass::Script::Color === arg
250
- ColorStop.new(arg)
251
- elsif Sass::Script::List === arg
252
- ColorStop.new(*arg.value)
253
- elsif Sass::Script::String === arg && arg.value == "transparent"
254
- ColorStop.new(arg)
255
- else
256
- raise Sass::SyntaxError, "Not a valid color stop: #{arg.class.name}: #{arg}"
257
- end
258
- end, :comma)
259
- end
260
-
261
- def radial_gradient(position_or_angle, shape_and_size, *color_stops)
262
- # Have to deal with variable length/meaning arguments.
263
- if color_stop?(shape_and_size)
264
- color_stops.unshift(shape_and_size)
265
- shape_and_size = nil
266
- elsif list_of_color_stops?(shape_and_size)
267
- # Support legacy use of the color-stops() function
268
- color_stops = shape_and_size.value + color_stops
269
- shape_and_size = nil
270
- end
271
- shape_and_size = nil if shape_and_size && !shape_and_size.to_bool # nil out explictly passed falses
272
- # ditto for position_or_angle
273
- if color_stop?(position_or_angle)
274
- color_stops.unshift(position_or_angle)
275
- position_or_angle = nil
276
- elsif list_of_color_stops?(position_or_angle)
277
- color_stops = position_or_angle.value + color_stops
278
- position_or_angle = nil
279
- end
280
- position_or_angle = nil if position_or_angle && !position_or_angle.to_bool
281
-
282
- # Support legacy use of the color-stops() function
283
- if color_stops.size == 1 && list_of_color_stops?(color_stops.first)
284
- color_stops = color_stops.first.value
285
- end
286
- RadialGradient.new(position_or_angle, shape_and_size, send(:color_stops, *color_stops))
287
- end
288
-
289
- def linear_gradient(position_or_angle, *color_stops)
290
- if color_stop?(position_or_angle)
291
- color_stops.unshift(position_or_angle)
292
- position_or_angle = nil
293
- elsif list_of_color_stops?(position_or_angle)
294
- color_stops = position_or_angle.value + color_stops
295
- position_or_angle = nil
296
- end
297
- position_or_angle = nil if position_or_angle && !position_or_angle.to_bool
298
-
299
- # Support legacy use of the color-stops() function
300
- if color_stops.size == 1 && (stops = list_of_color_stops?(color_stops.first))
301
- color_stops = stops
302
- end
303
- LinearGradient.new(position_or_angle, send(:color_stops, *color_stops))
304
- end
305
-
306
- # returns color-stop() calls for use in webkit.
307
- def grad_color_stops(color_list)
308
- stops = color_stops_in_percentages(color_list).map do |stop, color|
309
- "color-stop(#{stop.inspect}, #{ColorStop.color_to_s(color)})"
310
- end
311
- Sass::Script::String.new(stops.join(", "))
312
- end
313
-
314
- def color_stops_in_percentages(color_list)
315
- assert_type color_list, :List
316
- color_list = normalize_stops(color_list)
317
- max = color_list.value.last.stop
318
- last_value = nil
319
- color_stops = color_list.value.map do |pos|
320
- # have to convert absolute units to percentages for use in color stop functions.
321
- stop = pos.stop
322
- stop = stop.div(max).times(Sass::Script::Number.new(100,["%"])) if stop.numerator_units == max.numerator_units && max.numerator_units != ["%"]
323
- # Make sure the color stops are specified in the right order.
324
- if last_value && stop.numerator_units == last_value.numerator_units && stop.denominator_units == last_value.denominator_units && (stop.value * 1000).round < (last_value.value * 1000).round
325
- raise Sass::SyntaxError.new("Color stops must be specified in increasing order. #{stop.value} came after #{last_value.value}.")
326
- end
327
- last_value = stop
328
- [stop, pos.color]
329
- end
330
- end
331
-
332
- # only used for webkit
333
- def linear_end_position(position_or_angle, color_list)
334
- start_point = grad_point(position_or_angle || Sass::Script::String.new("top"))
335
- end_point = grad_point(opposite_position(position_or_angle || Sass::Script::String.new("top")))
336
- end_target = color_list.value.last.stop
337
-
338
- if color_list.value.last.stop && color_list.value.last.stop.numerator_units == ["px"]
339
- new_end = color_list.value.last.stop.value
340
- if start_point.value.first == end_point.value.first && start_point.value.last.value == 0
341
- # this means top-to-bottom
342
- end_point.value[1] = Sass::Script::Number.new(end_target.value)
343
- elsif start_point.value.last == end_point.value.last && start_point.value.first.value == 0
344
- # this implies left-to-right
345
- end_point.value[0] = Sass::Script::Number.new(end_target.value)
346
- end
347
- end
348
- end_point
349
- end
350
-
351
- # returns the end position of the gradient from the color stop
352
- def grad_end_position(color_list, radial = Sass::Script::Bool.new(false))
353
- assert_type color_list, :List
354
- default = Sass::Script::Number.new(100)
355
- grad_position(color_list, Sass::Script::Number.new(color_list.value.size), default, radial)
356
- end
357
-
358
- def grad_position(color_list, index, default, radial = Sass::Script::Bool.new(false))
359
- assert_type color_list, :List
360
- stop = color_list.value[index.value - 1].stop
361
- if stop && radial.to_bool
362
- orig_stop = stop
363
- if stop.unitless?
364
- if stop.value <= 1
365
- # A unitless number is assumed to be a percentage when it's between 0 and 1
366
- stop = stop.times(Sass::Script::Number.new(100, ["%"]))
367
- else
368
- # Otherwise, a unitless number is assumed to be in pixels
369
- stop = stop.times(Sass::Script::Number.new(1, ["px"]))
370
- end
371
- end
372
- if stop.numerator_units == ["%"] && color_list.value.last.stop && color_list.value.last.stop.numerator_units == ["px"]
373
- stop = stop.times(color_list.value.last.stop).div(Sass::Script::Number.new(100, ["%"]))
374
- end
375
- Compass::Logger.new.record(:warning, "Webkit only supports pixels for the start and end stops for radial gradients. Got: #{orig_stop}") if stop.numerator_units != ["px"]
376
- stop.div(Sass::Script::Number.new(1, stop.numerator_units, stop.denominator_units))
377
- elsif stop
378
- stop
379
- else
380
- default
381
- end
382
- end
383
-
384
- def linear_svg_gradient(color_stops, start)
385
- x1, y1 = *grad_point(start).value
386
- x2, y2 = *grad_point(opposite_position(start)).value
387
- stops = color_stops_in_percentages(color_stops)
388
-
389
- svg = linear_svg(stops, x1, y1, x2, y2)
390
- inline_image_string(svg.gsub(/\s+/, ' '), 'image/svg+xml')
391
- end
392
-
393
- def radial_svg_gradient(color_stops, center)
394
- cx, cy = *grad_point(center).value
395
- r = grad_end_position(color_stops, Sass::Script::Bool.new(true))
396
- stops = color_stops_in_percentages(color_stops)
397
-
398
- svg = radial_svg(stops, cx, cy, r)
399
- inline_image_string(svg.gsub(/\s+/, ' '), 'image/svg+xml')
400
- end
401
-
402
- private
403
-
404
- def color_stop?(arg)
405
- arg.is_a?(ColorStop) ||
406
- (arg.is_a?(Sass::Script::List) && ColorStop.new(*arg.value)) ||
407
- ColorStop.new(arg)
408
- rescue
409
- nil
410
- end
411
-
412
- def normalize_stops(color_list)
413
- positions = color_list.value.map{|obj| obj.dup}
414
- # fill in the start and end positions, if unspecified
415
- positions.first.stop = Sass::Script::Number.new(0) unless positions.first.stop
416
- positions.last.stop = Sass::Script::Number.new(100, ["%"]) unless positions.last.stop
417
- # fill in empty values
418
- for i in 0...positions.size
419
- if positions[i].stop.nil?
420
- num = 2.0
421
- for j in (i+1)...positions.size
422
- if positions[j].stop
423
- positions[i].stop = positions[i-1].stop.plus((positions[j].stop.minus(positions[i-1].stop)).div(Sass::Script::Number.new(num)))
424
- break
425
- else
426
- num += 1
427
- end
428
- end
429
- end
430
- end
431
- # normalize unitless numbers
432
- positions.each do |pos|
433
- if pos.stop.unitless? && pos.stop.value <= 1
434
- pos.stop = pos.stop.times(Sass::Script::Number.new(100, ["%"]))
435
- elsif pos.stop.unitless?
436
- pos.stop = pos.stop.times(Sass::Script::Number.new(1, ["px"]))
437
- end
438
- end
439
- if (positions.last.stop.eq(Sass::Script::Number.new(0, ["px"])).to_bool ||
440
- positions.last.stop.eq(Sass::Script::Number.new(0, ["%"])).to_bool)
441
- raise Sass::SyntaxError.new("Color stops must be specified in increasing order")
442
- end
443
- if defined?(Sass::Script::List)
444
- Sass::Script::List.new(positions, color_list.separator)
445
- else
446
- color_list.class.new(*positions)
447
- end
448
- end
449
-
450
- def parse_color_stop(arg)
451
- return ColorStop.new(arg) if arg.is_a?(Sass::Script::Color)
452
- return nil unless arg.is_a?(Sass::Script::String)
453
- color = stop = nil
454
- expr = Sass::Script::Parser.parse(arg.value, 0, 0)
455
- case expr
456
- when Sass::Script::Color
457
- color = expr
458
- when Sass::Script::Funcall
459
- color = expr
460
- when Sass::Script::Operation
461
- unless [:concat, :space].include?(expr.instance_variable_get("@operator"))
462
- # This should never happen.
463
- raise Sass::SyntaxError, "Couldn't parse a color stop from: #{arg.value}"
464
- end
465
- color = expr.instance_variable_get("@operand1")
466
- stop = expr.instance_variable_get("@operand2")
467
- else
468
- raise Sass::SyntaxError, "Couldn't parse a color stop from: #{arg.value}"
469
- end
470
- ColorStop.new(color, stop)
471
- end
472
-
473
- def list_of_color_stops?(arg)
474
- if arg.respond_to?(:value)
475
- arg.value.is_a?(Array) && arg.value.all?{|a| color_stop?(a)} ? arg.value : nil
476
- elsif arg.is_a?(Array)
477
- arg.all?{|a| color_stop?(a)} ? arg : nil
478
- end
479
- end
480
-
481
- def linear_svg(color_stops, x1, y1, x2, y2)
482
- transform = ''
483
- if angle?(position_or_angle)
484
- transform = %Q{ gradientTransform = "rotate(#{position_or_angle.value})"}
485
- end
486
- gradient = %Q{<linearGradient id="grad" gradientUnits="userSpaceOnUse" x1="#{x1}" y1="#{y1}" x2="#{x2}" y2="#{y2}"#{transform}>#{color_stops_svg(color_stops)}</linearGradient>}
487
- svg(gradient)
488
- end
489
-
490
- def radial_svg(color_stops, cx, cy, r)
491
- gradient = %Q{<radialGradient id="grad" gradientUnits="userSpaceOnUse" cx="#{cx}" cy="#{cy}" r="#{r}">#{color_stops_svg(color_stops)}</radialGradient>}
492
- svg(gradient)
493
- end
494
-
495
- # color_stops = array of: [stop, color]
496
- def color_stops_svg(color_stops)
497
- color_stops.each.map{ |stop, color|
498
- %{<stop offset="#{stop.to_s}" stop-color="#{color.inspect}"/>}
499
- }.join
500
- end
501
-
502
- def svg(gradient)
503
- svg = <<-EOS
504
- <?xml version="1.0" encoding="utf-8"?>
505
- <svg version="1.1" xmlns="http://www.w3.org/2000/svg"><defs>#{gradient}</defs><rect x="0" y="0" width="100%" height="100%" fill="url(#grad)" /></svg>
506
- EOS
507
- end
508
-
509
- def _center_position
510
- Sass::Script::List.new([
511
- Sass::Script::String.new("center"),
512
- Sass::Script::String.new("center")
513
- ],:space)
514
- end
515
-
516
- end
517
-
518
- module Assertions
519
- def assert_type(value, type, name = nil)
520
- return if value.is_a?(Sass::Script.const_get(type))
521
- err = "#{value.inspect} is not a #{type.to_s.downcase}"
522
- err = "$#{name}: " + err if name
523
- raise ArgumentError.new(err)
524
- end
525
- end
526
-
527
- class LinearGradient < Sass::Script::Literal
528
- include Assertions
529
- include Functions
530
- include Compass::SassExtensions::Functions::Constants
531
- include Compass::SassExtensions::Functions::InlineImage
532
- end
533
-
534
- class RadialGradient < Sass::Script::Literal
535
- include Assertions
536
- include Functions
537
- include Compass::SassExtensions::Functions::Constants
538
- include Compass::SassExtensions::Functions::InlineImage
539
- end
540
- end
1
+ module Compass::SassExtensions::Functions::GradientSupport
2
+
3
+ GRADIENT_ASPECTS = %w(webkit moz svg pie css2 o owg).freeze
4
+
5
+ class ColorStop < Sass::Script::Literal
6
+ attr_accessor :color, :stop
7
+ def children
8
+ [color, stop].compact
9
+ end
10
+ def initialize(color, stop = nil)
11
+ unless Sass::Script::Color === color ||
12
+ Sass::Script::Funcall === color ||
13
+ (Sass::Script::String === color && color.value == "transparent")
14
+ raise Sass::SyntaxError, "Expected a color. Got: #{color}"
15
+ end
16
+ if stop && !stop.is_a?(Sass::Script::Number)
17
+ raise Sass::SyntaxError, "Expected a number. Got: #{stop}"
18
+ end
19
+ self.color, self.stop = color, stop
20
+ end
21
+ def inspect
22
+ to_s
23
+ end
24
+ def self.color_to_s(c)
25
+ if c.is_a?(Sass::Script::String)
26
+ c.value.dup
27
+ else
28
+ c.inspect.dup
29
+ end
30
+ end
31
+
32
+ def to_s(options = self.options)
33
+ s = self.class.color_to_s(color)
34
+ if stop
35
+ s << " "
36
+ if stop.unitless?
37
+ s << stop.times(Sass::Script::Number.new(100, ["%"])).inspect
38
+ else
39
+ s << stop.inspect
40
+ end
41
+ end
42
+ s
43
+ end
44
+ end
45
+
46
+ module Gradient
47
+
48
+ def self.included(base)
49
+ base.extend ClassMethods
50
+ end
51
+
52
+ module ClassMethods
53
+ def standardized_prefix(prefix)
54
+ class_eval %Q{
55
+ def to_#{prefix}(options = self.options)
56
+ Sass::Script::String.new("-#{prefix}-\#{to_s(options)}")
57
+ end
58
+ }
59
+ end
60
+ end
61
+
62
+ def inspect
63
+ to_s
64
+ end
65
+
66
+ def supports?(aspect)
67
+ GRADIENT_ASPECTS.include?(aspect)
68
+ end
69
+
70
+ def has_aspect?
71
+ true
72
+ end
73
+
74
+ def angle?(value)
75
+ value.is_a?(Sass::Script::Number) &&
76
+ value.numerator_units.size == 1 &&
77
+ value.numerator_units.first == "deg" &&
78
+ value.denominator_units.empty?
79
+ end
80
+
81
+ end
82
+
83
+ class RadialGradient < Sass::Script::Literal
84
+ include Gradient
85
+
86
+ attr_accessor :position, :shape_and_size, :color_stops
87
+
88
+ def children
89
+ [color_stops, position, shape_and_size].compact
90
+ end
91
+
92
+ def initialize(position, shape_and_size, color_stops)
93
+ unless color_stops.value.size >= 2
94
+ raise Sass::SyntaxError, "At least two color stops are required for a radial-gradient"
95
+ end
96
+ if angle?(position)
97
+ raise Sass::SyntaxError, "CSS no longer allows angles in radial-gradients."
98
+ end
99
+ self.position = position
100
+ self.shape_and_size = shape_and_size
101
+ self.color_stops = color_stops
102
+ end
103
+
104
+ def to_s(options = self.options)
105
+ s = "radial-gradient("
106
+ s << position.to_s(options) << ", " if position
107
+ s << shape_and_size.to_s(options) << ", " if shape_and_size
108
+ s << color_stops.to_s(options)
109
+ s << ")"
110
+ end
111
+
112
+ standardized_prefix :webkit
113
+ standardized_prefix :moz
114
+ standardized_prefix :o
115
+
116
+ def to_owg(options = self.options)
117
+ args = [
118
+ grad_point(position || _center_position),
119
+ Sass::Script::String.new("0"),
120
+ grad_point(position || _center_position),
121
+ grad_end_position(color_stops, Sass::Script::Bool.new(true)),
122
+ grad_color_stops(color_stops)
123
+ ]
124
+ args.each {|a| a.options = options}
125
+ Sass::Script::String.new("-webkit-gradient(radial, #{args.join(', ')})")
126
+ end
127
+
128
+ def to_svg(options = self.options)
129
+ # XXX Add shape support if possible
130
+ radial_svg_gradient(color_stops, position || _center_position)
131
+ end
132
+
133
+ def to_pie(options = self.options)
134
+ Compass::Logger.new.record(:warning, "PIE does not support radial-gradient.")
135
+ Sass::Script::String.new("-pie-radial-gradient(unsupported)")
136
+ end
137
+
138
+ def to_css2(options = self.options)
139
+ Sass::Script::String.new("")
140
+ end
141
+ end
142
+
143
+ class LinearGradient < Sass::Script::Literal
144
+ include Gradient
145
+
146
+ attr_accessor :color_stops, :position_or_angle
147
+
148
+ def children
149
+ [color_stops, position_or_angle].compact
150
+ end
151
+
152
+ def initialize(position_or_angle, color_stops)
153
+ unless color_stops.value.size >= 2
154
+ raise Sass::SyntaxError, "At least two color stops are required for a linear-gradient"
155
+ end
156
+ self.position_or_angle = position_or_angle
157
+ self.color_stops = color_stops
158
+ end
159
+
160
+ def to_s(options = self.options)
161
+ s = "linear-gradient("
162
+ s << position_or_angle.to_s(options) << ", " if position_or_angle
163
+ s << color_stops.to_s(options)
164
+ s << ")"
165
+ end
166
+
167
+ standardized_prefix :webkit
168
+ standardized_prefix :moz
169
+ standardized_prefix :o
170
+
171
+ def supports?(aspect)
172
+ # I don't know how to support degree-based gradients in old webkit gradients (owg) or svg so we just disable them.
173
+ if %w(owg svg).include?(aspect) && position_or_angle.is_a?(Sass::Script::Number) && position_or_angle.numerator_units.include?("deg")
174
+ false
175
+ else
176
+ super
177
+ end
178
+ end
179
+
180
+ # Output the original webkit gradient syntax
181
+ def to_owg(options = self.options)
182
+ args = []
183
+ args << grad_point(position_or_angle || Sass::Script::String.new("top"))
184
+ args << linear_end_position(position_or_angle, color_stops)
185
+ args << grad_color_stops(color_stops)
186
+ args.each{|a| a.options = options}
187
+ Sass::Script::String.new("-webkit-gradient(linear, #{args.join(', ')})")
188
+ end
189
+
190
+ def to_svg(options = self.options)
191
+ linear_svg_gradient(color_stops, position_or_angle || Sass::Script::String.new("top"))
192
+ end
193
+
194
+ def to_pie(options = self.options)
195
+ # PIE just uses the standard rep, but the property is prefixed so
196
+ # the presence of this attribute helps flag when to render a special rule.
197
+ Sass::Script::String.new to_s(options)
198
+ end
199
+
200
+ def to_css2(options = self.options)
201
+ Sass::Script::String.new("")
202
+ end
203
+ end
204
+
205
+ module Functions
206
+ # given a position list, return a corresponding position in percents
207
+ # otherwise, returns the original argument
208
+ def grad_point(position)
209
+ original_value = position
210
+ position = unless position.is_a?(Sass::Script::List)
211
+ Sass::Script::List.new([position], :space)
212
+ else
213
+ Sass::Script::List.new(position.value.dup, position.separator)
214
+ end
215
+ # Handle unknown arguments by passing them along untouched.
216
+ unless position.value.all?{|p| is_position(p).to_bool }
217
+ return original_value
218
+ end
219
+ if (position.value.first.value =~ /top|bottom/) or (position.value.last.value =~ /left|right/)
220
+ # browsers are pretty forgiving of reversed positions so we are too.
221
+ position.value.reverse!
222
+ end
223
+ if position.value.size == 1
224
+ if position.value.first.value =~ /top|bottom/
225
+ position.value.unshift Sass::Script::String.new("center")
226
+ elsif position.value.first.value =~ /left|right/
227
+ position.value.push Sass::Script::String.new("center")
228
+ end
229
+ end
230
+ position.value.map! do |p|
231
+ case p.value
232
+ when /top|left/
233
+ Sass::Script::Number.new(0, ["%"])
234
+ when /bottom|right/
235
+ Sass::Script::Number.new(100, ["%"])
236
+ when /center/
237
+ Sass::Script::Number.new(50, ["%"])
238
+ else
239
+ p
240
+ end
241
+ end
242
+ position
243
+ end
244
+
245
+ def color_stops(*args)
246
+ Sass::Script::List.new(args.map do |arg|
247
+ if ColorStop === arg
248
+ arg
249
+ elsif Sass::Script::Color === arg
250
+ ColorStop.new(arg)
251
+ elsif Sass::Script::List === arg
252
+ ColorStop.new(*arg.value)
253
+ elsif Sass::Script::String === arg && arg.value == "transparent"
254
+ ColorStop.new(arg)
255
+ else
256
+ raise Sass::SyntaxError, "Not a valid color stop: #{arg.class.name}: #{arg}"
257
+ end
258
+ end, :comma)
259
+ end
260
+
261
+ def radial_gradient(position_or_angle, shape_and_size, *color_stops)
262
+ # Have to deal with variable length/meaning arguments.
263
+ if color_stop?(shape_and_size)
264
+ color_stops.unshift(shape_and_size)
265
+ shape_and_size = nil
266
+ elsif list_of_color_stops?(shape_and_size)
267
+ # Support legacy use of the color-stops() function
268
+ color_stops = shape_and_size.value + color_stops
269
+ shape_and_size = nil
270
+ end
271
+ shape_and_size = nil if shape_and_size && !shape_and_size.to_bool # nil out explictly passed falses
272
+ # ditto for position_or_angle
273
+ if color_stop?(position_or_angle)
274
+ color_stops.unshift(position_or_angle)
275
+ position_or_angle = nil
276
+ elsif list_of_color_stops?(position_or_angle)
277
+ color_stops = position_or_angle.value + color_stops
278
+ position_or_angle = nil
279
+ end
280
+ position_or_angle = nil if position_or_angle && !position_or_angle.to_bool
281
+
282
+ # Support legacy use of the color-stops() function
283
+ if color_stops.size == 1 && list_of_color_stops?(color_stops.first)
284
+ color_stops = color_stops.first.value
285
+ end
286
+ RadialGradient.new(position_or_angle, shape_and_size, send(:color_stops, *color_stops))
287
+ end
288
+
289
+ def linear_gradient(position_or_angle, *color_stops)
290
+ if color_stop?(position_or_angle)
291
+ color_stops.unshift(position_or_angle)
292
+ position_or_angle = nil
293
+ elsif list_of_color_stops?(position_or_angle)
294
+ color_stops = position_or_angle.value + color_stops
295
+ position_or_angle = nil
296
+ end
297
+ position_or_angle = nil if position_or_angle && !position_or_angle.to_bool
298
+
299
+ # Support legacy use of the color-stops() function
300
+ if color_stops.size == 1 && (stops = list_of_color_stops?(color_stops.first))
301
+ color_stops = stops
302
+ end
303
+ LinearGradient.new(position_or_angle, send(:color_stops, *color_stops))
304
+ end
305
+
306
+ # returns color-stop() calls for use in webkit.
307
+ def grad_color_stops(color_list)
308
+ stops = color_stops_in_percentages(color_list).map do |stop, color|
309
+ "color-stop(#{stop.inspect}, #{ColorStop.color_to_s(color)})"
310
+ end
311
+ Sass::Script::String.new(stops.join(", "))
312
+ end
313
+
314
+ def color_stops_in_percentages(color_list)
315
+ assert_type color_list, :List
316
+ color_list = normalize_stops(color_list)
317
+ max = color_list.value.last.stop
318
+ last_value = nil
319
+ color_stops = color_list.value.map do |pos|
320
+ # have to convert absolute units to percentages for use in color stop functions.
321
+ stop = pos.stop
322
+ stop = stop.div(max).times(Sass::Script::Number.new(100,["%"])) if stop.numerator_units == max.numerator_units && max.numerator_units != ["%"]
323
+ # Make sure the color stops are specified in the right order.
324
+ if last_value && stop.numerator_units == last_value.numerator_units && stop.denominator_units == last_value.denominator_units && (stop.value * 1000).round < (last_value.value * 1000).round
325
+ raise Sass::SyntaxError.new("Color stops must be specified in increasing order. #{stop.value} came after #{last_value.value}.")
326
+ end
327
+ last_value = stop
328
+ [stop, pos.color]
329
+ end
330
+ end
331
+
332
+ # only used for webkit
333
+ def linear_end_position(position_or_angle, color_list)
334
+ start_point = grad_point(position_or_angle || Sass::Script::String.new("top"))
335
+ end_point = grad_point(opposite_position(position_or_angle || Sass::Script::String.new("top")))
336
+ end_target = color_list.value.last.stop
337
+
338
+ if color_list.value.last.stop && color_list.value.last.stop.numerator_units == ["px"]
339
+ new_end = color_list.value.last.stop.value
340
+ if start_point.value.first == end_point.value.first && start_point.value.last.value == 0
341
+ # this means top-to-bottom
342
+ end_point.value[1] = Sass::Script::Number.new(end_target.value)
343
+ elsif start_point.value.last == end_point.value.last && start_point.value.first.value == 0
344
+ # this implies left-to-right
345
+ end_point.value[0] = Sass::Script::Number.new(end_target.value)
346
+ end
347
+ end
348
+ end_point
349
+ end
350
+
351
+ # returns the end position of the gradient from the color stop
352
+ def grad_end_position(color_list, radial = Sass::Script::Bool.new(false))
353
+ assert_type color_list, :List
354
+ default = Sass::Script::Number.new(100)
355
+ grad_position(color_list, Sass::Script::Number.new(color_list.value.size), default, radial)
356
+ end
357
+
358
+ def grad_position(color_list, index, default, radial = Sass::Script::Bool.new(false))
359
+ assert_type color_list, :List
360
+ stop = color_list.value[index.value - 1].stop
361
+ if stop && radial.to_bool
362
+ orig_stop = stop
363
+ if stop.unitless?
364
+ if stop.value <= 1
365
+ # A unitless number is assumed to be a percentage when it's between 0 and 1
366
+ stop = stop.times(Sass::Script::Number.new(100, ["%"]))
367
+ else
368
+ # Otherwise, a unitless number is assumed to be in pixels
369
+ stop = stop.times(Sass::Script::Number.new(1, ["px"]))
370
+ end
371
+ end
372
+ if stop.numerator_units == ["%"] && color_list.value.last.stop && color_list.value.last.stop.numerator_units == ["px"]
373
+ stop = stop.times(color_list.value.last.stop).div(Sass::Script::Number.new(100, ["%"]))
374
+ end
375
+ Compass::Logger.new.record(:warning, "Webkit only supports pixels for the start and end stops for radial gradients. Got: #{orig_stop}") if stop.numerator_units != ["px"]
376
+ stop.div(Sass::Script::Number.new(1, stop.numerator_units, stop.denominator_units))
377
+ elsif stop
378
+ stop
379
+ else
380
+ default
381
+ end
382
+ end
383
+
384
+ def linear_svg_gradient(color_stops, start)
385
+ x1, y1 = *grad_point(start).value
386
+ x2, y2 = *grad_point(opposite_position(start)).value
387
+ stops = color_stops_in_percentages(color_stops)
388
+
389
+ svg = linear_svg(stops, x1, y1, x2, y2)
390
+ inline_image_string(svg.gsub(/\s+/, ' '), 'image/svg+xml')
391
+ end
392
+
393
+ def radial_svg_gradient(color_stops, center)
394
+ cx, cy = *grad_point(center).value
395
+ r = grad_end_position(color_stops, Sass::Script::Bool.new(true))
396
+ stops = color_stops_in_percentages(color_stops)
397
+
398
+ svg = radial_svg(stops, cx, cy, r)
399
+ inline_image_string(svg.gsub(/\s+/, ' '), 'image/svg+xml')
400
+ end
401
+
402
+ private
403
+
404
+ def color_stop?(arg)
405
+ arg.is_a?(ColorStop) ||
406
+ (arg.is_a?(Sass::Script::List) && ColorStop.new(*arg.value)) ||
407
+ ColorStop.new(arg)
408
+ rescue
409
+ nil
410
+ end
411
+
412
+ def normalize_stops(color_list)
413
+ positions = color_list.value.map{|obj| obj.dup}
414
+ # fill in the start and end positions, if unspecified
415
+ positions.first.stop = Sass::Script::Number.new(0) unless positions.first.stop
416
+ positions.last.stop = Sass::Script::Number.new(100, ["%"]) unless positions.last.stop
417
+ # fill in empty values
418
+ for i in 0...positions.size
419
+ if positions[i].stop.nil?
420
+ num = 2.0
421
+ for j in (i+1)...positions.size
422
+ if positions[j].stop
423
+ positions[i].stop = positions[i-1].stop.plus((positions[j].stop.minus(positions[i-1].stop)).div(Sass::Script::Number.new(num)))
424
+ break
425
+ else
426
+ num += 1
427
+ end
428
+ end
429
+ end
430
+ end
431
+ # normalize unitless numbers
432
+ positions.each do |pos|
433
+ if pos.stop.unitless? && pos.stop.value <= 1
434
+ pos.stop = pos.stop.times(Sass::Script::Number.new(100, ["%"]))
435
+ elsif pos.stop.unitless?
436
+ pos.stop = pos.stop.times(Sass::Script::Number.new(1, ["px"]))
437
+ end
438
+ end
439
+ if (positions.last.stop.eq(Sass::Script::Number.new(0, ["px"])).to_bool ||
440
+ positions.last.stop.eq(Sass::Script::Number.new(0, ["%"])).to_bool)
441
+ raise Sass::SyntaxError.new("Color stops must be specified in increasing order")
442
+ end
443
+ if defined?(Sass::Script::List)
444
+ Sass::Script::List.new(positions, color_list.separator)
445
+ else
446
+ color_list.class.new(*positions)
447
+ end
448
+ end
449
+
450
+ def parse_color_stop(arg)
451
+ return ColorStop.new(arg) if arg.is_a?(Sass::Script::Color)
452
+ return nil unless arg.is_a?(Sass::Script::String)
453
+ color = stop = nil
454
+ expr = Sass::Script::Parser.parse(arg.value, 0, 0)
455
+ case expr
456
+ when Sass::Script::Color
457
+ color = expr
458
+ when Sass::Script::Funcall
459
+ color = expr
460
+ when Sass::Script::Operation
461
+ unless [:concat, :space].include?(expr.instance_variable_get("@operator"))
462
+ # This should never happen.
463
+ raise Sass::SyntaxError, "Couldn't parse a color stop from: #{arg.value}"
464
+ end
465
+ color = expr.instance_variable_get("@operand1")
466
+ stop = expr.instance_variable_get("@operand2")
467
+ else
468
+ raise Sass::SyntaxError, "Couldn't parse a color stop from: #{arg.value}"
469
+ end
470
+ ColorStop.new(color, stop)
471
+ end
472
+
473
+ def list_of_color_stops?(arg)
474
+ if arg.respond_to?(:value)
475
+ arg.value.is_a?(Array) && arg.value.all?{|a| color_stop?(a)} ? arg.value : nil
476
+ elsif arg.is_a?(Array)
477
+ arg.all?{|a| color_stop?(a)} ? arg : nil
478
+ end
479
+ end
480
+
481
+ def linear_svg(color_stops, x1, y1, x2, y2)
482
+ transform = ''
483
+ if angle?(position_or_angle)
484
+ transform = %Q{ gradientTransform = "rotate(#{position_or_angle.value})"}
485
+ end
486
+ gradient = %Q{<linearGradient id="grad" gradientUnits="userSpaceOnUse" x1="#{x1}" y1="#{y1}" x2="#{x2}" y2="#{y2}"#{transform}>#{color_stops_svg(color_stops)}</linearGradient>}
487
+ svg(gradient)
488
+ end
489
+
490
+ def radial_svg(color_stops, cx, cy, r)
491
+ gradient = %Q{<radialGradient id="grad" gradientUnits="userSpaceOnUse" cx="#{cx}" cy="#{cy}" r="#{r}">#{color_stops_svg(color_stops)}</radialGradient>}
492
+ svg(gradient)
493
+ end
494
+
495
+ # color_stops = array of: [stop, color]
496
+ def color_stops_svg(color_stops)
497
+ color_stops.each.map{ |stop, color|
498
+ %{<stop offset="#{stop.to_s}" stop-color="#{color.inspect}"/>}
499
+ }.join
500
+ end
501
+
502
+ def svg(gradient)
503
+ svg = <<-EOS
504
+ <?xml version="1.0" encoding="utf-8"?>
505
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg"><defs>#{gradient}</defs><rect x="0" y="0" width="100%" height="100%" fill="url(#grad)" /></svg>
506
+ EOS
507
+ end
508
+
509
+ def _center_position
510
+ Sass::Script::List.new([
511
+ Sass::Script::String.new("center"),
512
+ Sass::Script::String.new("center")
513
+ ],:space)
514
+ end
515
+
516
+ end
517
+
518
+ module Assertions
519
+ def assert_type(value, type, name = nil)
520
+ return if value.is_a?(Sass::Script.const_get(type))
521
+ err = "#{value.inspect} is not a #{type.to_s.downcase}"
522
+ err = "$#{name}: " + err if name
523
+ raise ArgumentError.new(err)
524
+ end
525
+ end
526
+
527
+ class LinearGradient < Sass::Script::Literal
528
+ include Assertions
529
+ include Functions
530
+ include Compass::SassExtensions::Functions::Constants
531
+ include Compass::SassExtensions::Functions::InlineImage
532
+ end
533
+
534
+ class RadialGradient < Sass::Script::Literal
535
+ include Assertions
536
+ include Functions
537
+ include Compass::SassExtensions::Functions::Constants
538
+ include Compass::SassExtensions::Functions::InlineImage
539
+ end
540
+ end