compass 0.11.alpha.4 → 0.11.beta.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (309) hide show
  1. data/Rakefile +1 -1
  2. data/VERSION.yml +2 -2
  3. data/examples/blueprint_plugins/src/link_icons.scss +1 -1
  4. data/examples/blueprint_semantic/src/liquid.scss +3 -3
  5. data/examples/blueprint_semantic/src/screen.scss +4 -4
  6. data/examples/compass/config.rb +1 -0
  7. data/examples/compass/images/emblem-a043c4f148.png +0 -0
  8. data/examples/compass/images/emblem/favorite.png +0 -0
  9. data/examples/compass/images/emblem/important.png +0 -0
  10. data/examples/compass/images/emblem/photos.png +0 -0
  11. data/examples/compass/images/emblem/readonly.png +0 -0
  12. data/examples/compass/images/emblem/symbolic-link.png +0 -0
  13. data/examples/compass/images/emblem/system.png +0 -0
  14. data/examples/compass/images/emblem/unreadable.png +0 -0
  15. data/examples/compass/images/flag-03c3b29b35.png +0 -0
  16. data/examples/compass/images/flag-21cfbfbfc8.png +0 -0
  17. data/examples/compass/images/flag/ad.png +0 -0
  18. data/examples/compass/images/flag/ae.png +0 -0
  19. data/examples/compass/images/flag/af.png +0 -0
  20. data/examples/compass/images/flag/ag.png +0 -0
  21. data/examples/compass/images/flag/ai.png +0 -0
  22. data/examples/compass/images/flag/al.png +0 -0
  23. data/examples/compass/images/flag/am.png +0 -0
  24. data/examples/compass/images/flag/an.png +0 -0
  25. data/examples/compass/images/flag/ao.png +0 -0
  26. data/examples/compass/images/flag/ar.png +0 -0
  27. data/examples/compass/images/flag/as.png +0 -0
  28. data/examples/compass/images/flag/at.png +0 -0
  29. data/examples/compass/images/flag/au.png +0 -0
  30. data/examples/compass/images/flag/aw.png +0 -0
  31. data/examples/compass/images/flag/ax.png +0 -0
  32. data/examples/compass/images/flag/az.png +0 -0
  33. data/examples/compass/images/flag/ba.png +0 -0
  34. data/examples/compass/images/flag/bb.png +0 -0
  35. data/examples/compass/images/flag/bd.png +0 -0
  36. data/examples/compass/images/flag/be.png +0 -0
  37. data/examples/compass/images/flag/bf.png +0 -0
  38. data/examples/compass/images/flag/bg.png +0 -0
  39. data/examples/compass/images/flag/bh.png +0 -0
  40. data/examples/compass/images/flag/bi.png +0 -0
  41. data/examples/compass/images/flag/bj.png +0 -0
  42. data/examples/compass/images/flag/bm.png +0 -0
  43. data/examples/compass/images/flag/bn.png +0 -0
  44. data/examples/compass/images/flag/bo.png +0 -0
  45. data/examples/compass/images/flag/br.png +0 -0
  46. data/examples/compass/images/flag/bs.png +0 -0
  47. data/examples/compass/images/flag/bt.png +0 -0
  48. data/examples/compass/images/flag/bv.png +0 -0
  49. data/examples/compass/images/flag/bw.png +0 -0
  50. data/examples/compass/images/flag/by.png +0 -0
  51. data/examples/compass/images/flag/bz.png +0 -0
  52. data/examples/compass/images/flag/ca.png +0 -0
  53. data/examples/compass/images/flag/catalonia.png +0 -0
  54. data/examples/compass/images/flag/cc.png +0 -0
  55. data/examples/compass/images/flag/cd.png +0 -0
  56. data/examples/compass/images/flag/cf.png +0 -0
  57. data/examples/compass/images/flag/cg.png +0 -0
  58. data/examples/compass/images/flag/ch.png +0 -0
  59. data/examples/compass/images/flag/ci.png +0 -0
  60. data/examples/compass/images/flag/ck.png +0 -0
  61. data/examples/compass/images/flag/cl.png +0 -0
  62. data/examples/compass/images/flag/cm.png +0 -0
  63. data/examples/compass/images/flag/cn.png +0 -0
  64. data/examples/compass/images/flag/co.png +0 -0
  65. data/examples/compass/images/flag/cr.png +0 -0
  66. data/examples/compass/images/flag/cs.png +0 -0
  67. data/examples/compass/images/flag/cu.png +0 -0
  68. data/examples/compass/images/flag/cv.png +0 -0
  69. data/examples/compass/images/flag/cx.png +0 -0
  70. data/examples/compass/images/flag/cy.png +0 -0
  71. data/examples/compass/images/flag/cz.png +0 -0
  72. data/examples/compass/images/flag/de.png +0 -0
  73. data/examples/compass/images/flag/dj.png +0 -0
  74. data/examples/compass/images/flag/dk.png +0 -0
  75. data/examples/compass/images/flag/dm.png +0 -0
  76. data/examples/compass/images/flag/do.png +0 -0
  77. data/examples/compass/images/flag/dz.png +0 -0
  78. data/examples/compass/images/flag/ec.png +0 -0
  79. data/examples/compass/images/flag/ee.png +0 -0
  80. data/examples/compass/images/flag/eg.png +0 -0
  81. data/examples/compass/images/flag/eh.png +0 -0
  82. data/examples/compass/images/flag/england.png +0 -0
  83. data/examples/compass/images/flag/er.png +0 -0
  84. data/examples/compass/images/flag/es.png +0 -0
  85. data/examples/compass/images/flag/et.png +0 -0
  86. data/examples/compass/images/flag/europeanunion.png +0 -0
  87. data/examples/compass/images/flag/fam.png +0 -0
  88. data/examples/compass/images/flag/fi.png +0 -0
  89. data/examples/compass/images/flag/fj.png +0 -0
  90. data/examples/compass/images/flag/fk.png +0 -0
  91. data/examples/compass/images/flag/fm.png +0 -0
  92. data/examples/compass/images/flag/fo.png +0 -0
  93. data/examples/compass/images/flag/fr.png +0 -0
  94. data/examples/compass/images/flag/ga.png +0 -0
  95. data/examples/compass/images/flag/gb.png +0 -0
  96. data/examples/compass/images/flag/gd.png +0 -0
  97. data/examples/compass/images/flag/ge.png +0 -0
  98. data/examples/compass/images/flag/gf.png +0 -0
  99. data/examples/compass/images/flag/gh.png +0 -0
  100. data/examples/compass/images/flag/gi.png +0 -0
  101. data/examples/compass/images/flag/gl.png +0 -0
  102. data/examples/compass/images/flag/gm.png +0 -0
  103. data/examples/compass/images/flag/gn.png +0 -0
  104. data/examples/compass/images/flag/gp.png +0 -0
  105. data/examples/compass/images/flag/gq.png +0 -0
  106. data/examples/compass/images/flag/gr.png +0 -0
  107. data/examples/compass/images/flag/gs.png +0 -0
  108. data/examples/compass/images/flag/gt.png +0 -0
  109. data/examples/compass/images/flag/gu.png +0 -0
  110. data/examples/compass/images/flag/gw.png +0 -0
  111. data/examples/compass/images/flag/gy.png +0 -0
  112. data/examples/compass/images/flag/hk.png +0 -0
  113. data/examples/compass/images/flag/hm.png +0 -0
  114. data/examples/compass/images/flag/hn.png +0 -0
  115. data/examples/compass/images/flag/hr.png +0 -0
  116. data/examples/compass/images/flag/ht.png +0 -0
  117. data/examples/compass/images/flag/hu.png +0 -0
  118. data/examples/compass/images/flag/id-2.png +0 -0
  119. data/examples/compass/images/flag/ie.png +0 -0
  120. data/examples/compass/images/flag/il.png +0 -0
  121. data/examples/compass/images/flag/in.png +0 -0
  122. data/examples/compass/images/flag/io.png +0 -0
  123. data/examples/compass/images/flag/iq.png +0 -0
  124. data/examples/compass/images/flag/ir.png +0 -0
  125. data/examples/compass/images/flag/is.png +0 -0
  126. data/examples/compass/images/flag/it.png +0 -0
  127. data/examples/compass/images/flag/jm.png +0 -0
  128. data/examples/compass/images/flag/jo.png +0 -0
  129. data/examples/compass/images/flag/jp.png +0 -0
  130. data/examples/compass/images/flag/ke.png +0 -0
  131. data/examples/compass/images/flag/kg.png +0 -0
  132. data/examples/compass/images/flag/kh.png +0 -0
  133. data/examples/compass/images/flag/ki.png +0 -0
  134. data/examples/compass/images/flag/km.png +0 -0
  135. data/examples/compass/images/flag/kn.png +0 -0
  136. data/examples/compass/images/flag/kp.png +0 -0
  137. data/examples/compass/images/flag/kr.png +0 -0
  138. data/examples/compass/images/flag/kw.png +0 -0
  139. data/examples/compass/images/flag/ky.png +0 -0
  140. data/examples/compass/images/flag/kz.png +0 -0
  141. data/examples/compass/images/flag/la.png +0 -0
  142. data/examples/compass/images/flag/lb.png +0 -0
  143. data/examples/compass/images/flag/lc.png +0 -0
  144. data/examples/compass/images/flag/li.png +0 -0
  145. data/examples/compass/images/flag/lk.png +0 -0
  146. data/examples/compass/images/flag/lr.png +0 -0
  147. data/examples/compass/images/flag/ls.png +0 -0
  148. data/examples/compass/images/flag/lt.png +0 -0
  149. data/examples/compass/images/flag/lu.png +0 -0
  150. data/examples/compass/images/flag/lv.png +0 -0
  151. data/examples/compass/images/flag/ly.png +0 -0
  152. data/examples/compass/images/flag/ma.png +0 -0
  153. data/examples/compass/images/flag/mc.png +0 -0
  154. data/examples/compass/images/flag/md.png +0 -0
  155. data/examples/compass/images/flag/me.png +0 -0
  156. data/examples/compass/images/flag/mg.png +0 -0
  157. data/examples/compass/images/flag/mh.png +0 -0
  158. data/examples/compass/images/flag/mk.png +0 -0
  159. data/examples/compass/images/flag/ml.png +0 -0
  160. data/examples/compass/images/flag/mm.png +0 -0
  161. data/examples/compass/images/flag/mn.png +0 -0
  162. data/examples/compass/images/flag/mo.png +0 -0
  163. data/examples/compass/images/flag/mp.png +0 -0
  164. data/examples/compass/images/flag/mq.png +0 -0
  165. data/examples/compass/images/flag/mr.png +0 -0
  166. data/examples/compass/images/flag/ms.png +0 -0
  167. data/examples/compass/images/flag/mt.png +0 -0
  168. data/examples/compass/images/flag/mu.png +0 -0
  169. data/examples/compass/images/flag/mv.png +0 -0
  170. data/examples/compass/images/flag/mw.png +0 -0
  171. data/examples/compass/images/flag/mx.png +0 -0
  172. data/examples/compass/images/flag/my.png +0 -0
  173. data/examples/compass/images/flag/mz.png +0 -0
  174. data/examples/compass/images/flag/na.png +0 -0
  175. data/examples/compass/images/flag/nc.png +0 -0
  176. data/examples/compass/images/flag/ne.png +0 -0
  177. data/examples/compass/images/flag/nf.png +0 -0
  178. data/examples/compass/images/flag/ng.png +0 -0
  179. data/examples/compass/images/flag/ni.png +0 -0
  180. data/examples/compass/images/flag/nl.png +0 -0
  181. data/examples/compass/images/flag/no.png +0 -0
  182. data/examples/compass/images/flag/np.png +0 -0
  183. data/examples/compass/images/flag/nr.png +0 -0
  184. data/examples/compass/images/flag/nu.png +0 -0
  185. data/examples/compass/images/flag/nz.png +0 -0
  186. data/examples/compass/images/flag/om.png +0 -0
  187. data/examples/compass/images/flag/pa.png +0 -0
  188. data/examples/compass/images/flag/pe.png +0 -0
  189. data/examples/compass/images/flag/pf.png +0 -0
  190. data/examples/compass/images/flag/pg.png +0 -0
  191. data/examples/compass/images/flag/ph.png +0 -0
  192. data/examples/compass/images/flag/pk.png +0 -0
  193. data/examples/compass/images/flag/pl.png +0 -0
  194. data/examples/compass/images/flag/pm.png +0 -0
  195. data/examples/compass/images/flag/pn.png +0 -0
  196. data/examples/compass/images/flag/pr.png +0 -0
  197. data/examples/compass/images/flag/ps.png +0 -0
  198. data/examples/compass/images/flag/pt.png +0 -0
  199. data/examples/compass/images/flag/pw.png +0 -0
  200. data/examples/compass/images/flag/py.png +0 -0
  201. data/examples/compass/images/flag/qa.png +0 -0
  202. data/examples/compass/images/flag/re.png +0 -0
  203. data/examples/compass/images/flag/ro.png +0 -0
  204. data/examples/compass/images/flag/rs.png +0 -0
  205. data/examples/compass/images/flag/ru.png +0 -0
  206. data/examples/compass/images/flag/rw.png +0 -0
  207. data/examples/compass/images/flag/sa.png +0 -0
  208. data/examples/compass/images/flag/sb.png +0 -0
  209. data/examples/compass/images/flag/sc.png +0 -0
  210. data/examples/compass/images/flag/scotland.png +0 -0
  211. data/examples/compass/images/flag/sd.png +0 -0
  212. data/examples/compass/images/flag/se.png +0 -0
  213. data/examples/compass/images/flag/sg.png +0 -0
  214. data/examples/compass/images/flag/sh.png +0 -0
  215. data/examples/compass/images/flag/si.png +0 -0
  216. data/examples/compass/images/flag/sj.png +0 -0
  217. data/examples/compass/images/flag/sk.png +0 -0
  218. data/examples/compass/images/flag/sl.png +0 -0
  219. data/examples/compass/images/flag/sm.png +0 -0
  220. data/examples/compass/images/flag/sn.png +0 -0
  221. data/examples/compass/images/flag/so.png +0 -0
  222. data/examples/compass/images/flag/sr.png +0 -0
  223. data/examples/compass/images/flag/st.png +0 -0
  224. data/examples/compass/images/flag/sv.png +0 -0
  225. data/examples/compass/images/flag/sy.png +0 -0
  226. data/examples/compass/images/flag/sz.png +0 -0
  227. data/examples/compass/images/flag/tc.png +0 -0
  228. data/examples/compass/images/flag/td.png +0 -0
  229. data/examples/compass/images/flag/tf.png +0 -0
  230. data/examples/compass/images/flag/tg.png +0 -0
  231. data/examples/compass/images/flag/th.png +0 -0
  232. data/examples/compass/images/flag/tj.png +0 -0
  233. data/examples/compass/images/flag/tk.png +0 -0
  234. data/examples/compass/images/flag/tl.png +0 -0
  235. data/examples/compass/images/flag/tm.png +0 -0
  236. data/examples/compass/images/flag/tn.png +0 -0
  237. data/examples/compass/images/flag/to.png +0 -0
  238. data/examples/compass/images/flag/tr.png +0 -0
  239. data/examples/compass/images/flag/tt.png +0 -0
  240. data/examples/compass/images/flag/tv.png +0 -0
  241. data/examples/compass/images/flag/tw.png +0 -0
  242. data/examples/compass/images/flag/tz.png +0 -0
  243. data/examples/compass/images/flag/ua.png +0 -0
  244. data/examples/compass/images/flag/ug.png +0 -0
  245. data/examples/compass/images/flag/um.png +0 -0
  246. data/examples/compass/images/flag/us.png +0 -0
  247. data/examples/compass/images/flag/uy.png +0 -0
  248. data/examples/compass/images/flag/uz.png +0 -0
  249. data/examples/compass/images/flag/va.png +0 -0
  250. data/examples/compass/images/flag/vc.png +0 -0
  251. data/examples/compass/images/flag/ve.png +0 -0
  252. data/examples/compass/images/flag/vg.png +0 -0
  253. data/examples/compass/images/flag/vi.png +0 -0
  254. data/examples/compass/images/flag/vn.png +0 -0
  255. data/examples/compass/images/flag/vu.png +0 -0
  256. data/examples/compass/images/flag/wales.png +0 -0
  257. data/examples/compass/images/flag/wf.png +0 -0
  258. data/examples/compass/images/flag/ws.png +0 -0
  259. data/examples/compass/images/flag/ye.png +0 -0
  260. data/examples/compass/images/flag/yt.png +0 -0
  261. data/examples/compass/images/flag/za.png +0 -0
  262. data/examples/compass/images/flag/zm.png +0 -0
  263. data/examples/compass/images/flag/zw.png +0 -0
  264. data/examples/compass/sprites.html.haml +37 -0
  265. data/examples/compass/src/sprites.scss +25 -0
  266. data/examples/compass/src/sticky_footer.scss +1 -1
  267. data/examples/compass/src/utilities.scss +1 -1
  268. data/examples/css3/src/gradients.scss +30 -30
  269. data/examples/css3/src/main.scss +13 -19
  270. data/features/rails_integration.feature +32 -0
  271. data/frameworks/blueprint/stylesheets/blueprint/_grid.scss +16 -9
  272. data/frameworks/blueprint/stylesheets/blueprint/_liquid.scss +11 -6
  273. data/frameworks/compass/stylesheets/compass/_support.scss +8 -5
  274. data/frameworks/compass/stylesheets/compass/css3/_images.scss +6 -2
  275. data/frameworks/compass/stylesheets/compass/css3/_opacity.scss +6 -11
  276. data/frameworks/compass/stylesheets/compass/css3/_transform.scss +20 -6
  277. data/frameworks/compass/stylesheets/compass/utilities/sprites/_base.scss +3 -2
  278. data/lib/compass.rb +1 -1
  279. data/lib/compass/app_integration/rails.rb +3 -3
  280. data/lib/compass/app_integration/rails/actionpack2/urls.rb +2 -2
  281. data/lib/compass/app_integration/rails/actionpack3/railtie.rb +39 -11
  282. data/lib/compass/app_integration/rails/configuration_defaults.rb +14 -8
  283. data/lib/compass/browser_support.rb +62 -0
  284. data/lib/compass/commands/print_version.rb +10 -7
  285. data/lib/compass/commands/project_base.rb +1 -1
  286. data/lib/compass/commands/watch_project.rb +17 -0
  287. data/lib/compass/configuration/data.rb +15 -0
  288. data/lib/compass/configuration/helpers.rb +7 -8
  289. data/lib/compass/configuration/inheritance.rb +14 -0
  290. data/lib/compass/configuration/serialization.rb +8 -4
  291. data/lib/compass/sass_extensions/functions.rb +2 -1
  292. data/lib/compass/sass_extensions/functions/colors.rb +2 -3
  293. data/lib/compass/sass_extensions/functions/cross_browser_support.rb +39 -0
  294. data/lib/compass/sass_extensions/functions/gradient_support.rb +87 -379
  295. data/lib/compass/sass_extensions/functions/lists.rb +84 -0
  296. data/lib/compass/sass_extensions/functions/sprites.rb +4 -2
  297. data/lib/compass/sass_extensions/monkey_patches.rb +1 -1
  298. data/lib/compass/sass_extensions/monkey_patches/browser_support.rb +89 -0
  299. data/lib/compass/sprites.rb +4 -4
  300. data/test/fixtures/stylesheets/blueprint/css/screen.css +24 -24
  301. data/test/fixtures/stylesheets/blueprint/css/single-imports/grid.css +24 -24
  302. data/test/fixtures/stylesheets/blueprint/css/single-imports/rtl.css +24 -24
  303. data/test/fixtures/stylesheets/compass/css/gradients.css +21 -6
  304. data/test/fixtures/stylesheets/compass/css/opacity.css +4 -0
  305. data/test/fixtures/stylesheets/compass/css/pie.css +0 -1
  306. data/test/fixtures/stylesheets/compass/sass/gradients.sass +9 -0
  307. data/test/fixtures/stylesheets/compass/sass/opacity.scss +5 -0
  308. data/test/rails_integration_test.rb +3 -3
  309. metadata +272 -4
@@ -28,7 +28,7 @@ module Compass
28
28
  end
29
29
 
30
30
  def add_project_configuration
31
- Compass.add_project_configuration(options[:configuration_file]) do
31
+ Compass.add_project_configuration(options[:configuration_file], :defaults => Compass.configuration_for(options, "cli_defaults")) do
32
32
  options[:project_type]
33
33
  end
34
34
  end
@@ -69,6 +69,23 @@ module Compass
69
69
  path.create &method(:recompile)
70
70
  end
71
71
  end
72
+ Compass.configuration.watches.each do |glob, callback|
73
+ monitor.path Compass.configuration.project_path do |path|
74
+ path.glob glob
75
+ path.update do |base, relative|
76
+ puts ">>> Change detected to: #{relative}"
77
+ callback.call(base, relative)
78
+ end
79
+ path.create do |base, relative|
80
+ puts ">>> New file detected: #{relative}"
81
+ callback.call(base, relative)
82
+ end
83
+ path.delete do |base, relative|
84
+ puts ">>> File Removed: #{relative}"
85
+ callback.call(base, relative)
86
+ end
87
+ end
88
+ end
72
89
 
73
90
  end
74
91
 
@@ -99,6 +99,21 @@ module Compass
99
99
  end
100
100
  end
101
101
 
102
+ def watch(glob, &block)
103
+ @watches ||= []
104
+ @watches << [glob, block]
105
+ end
106
+
107
+ def watches
108
+ if defined?(@watches)
109
+ @watches
110
+ elsif inherited_data.respond_to?(:watches)
111
+ inherited_data.watches
112
+ else
113
+ []
114
+ end
115
+ end
116
+
102
117
  # Require a compass plugin and capture that it occured so that the configuration serialization works next time.
103
118
  def require(lib)
104
119
  (self.required_libraries ||= []) << lib
@@ -27,16 +27,18 @@ module Compass
27
27
  @configuration = data
28
28
  end
29
29
 
30
- def configuration_for(config, filename = nil)
31
- if config.is_a?(Compass::Configuration::Data)
30
+ def configuration_for(config, filename = nil, defaults = nil)
31
+ if config.nil?
32
+ nil
33
+ elsif config.is_a?(Compass::Configuration::Data)
32
34
  config
33
35
  elsif config.respond_to?(:read)
34
36
  filename ||= config.to_s if config.is_a?(Pathname)
35
- Compass::Configuration::Data.new_from_string(config.read, filename)
37
+ Compass::Configuration::Data.new_from_string(config.read, filename, defaults)
36
38
  elsif config.is_a?(Hash)
37
39
  Compass::Configuration::Data.new(filename, config)
38
40
  elsif config.is_a?(String)
39
- Compass::Configuration::Data.new_from_file(config)
41
+ Compass::Configuration::Data.new_from_file(config, defaults)
40
42
  elsif config.is_a?(Symbol)
41
43
  Compass::AppIntegration.lookup(config).configuration
42
44
  else
@@ -74,10 +76,7 @@ module Compass
74
76
  options = args.last.is_a?(Hash) ? args.pop : {}
75
77
  configuration_file_path = args.shift || detect_configuration_file
76
78
  raise ArgumentError, "Too many arguments" if args.any?
77
- if configuration_file_path && File.exists?(configuration_file_path)
78
-
79
- data = configuration_for(configuration_file_path)
80
-
79
+ if data = configuration_for(configuration_file_path, nil, configuration_for(options[:defaults]))
81
80
  if data.raw_project_type
82
81
  add_configuration(data.raw_project_type.to_sym)
83
82
  elsif options[:project_type]
@@ -87,6 +87,16 @@ module Compass
87
87
  self
88
88
  end
89
89
 
90
+ def reset_inheritance!
91
+ self.inherited_data = nil
92
+ end
93
+
94
+ def with_defaults(data)
95
+ inherit_from!(data)
96
+ yield
97
+ reset_inheritance!
98
+ end
99
+
90
100
  def unset!(attribute)
91
101
  @set_attributes ||= {}
92
102
  send("#{attribute}=", nil)
@@ -99,6 +109,10 @@ module Compass
99
109
  @set_attributes[attribute]
100
110
  end
101
111
 
112
+ def any_attributes_set?
113
+ @set_attributes && @set_attributes.size > 0
114
+ end
115
+
102
116
  def default_for(attribute)
103
117
  method = "default_#{attribute}".to_sym
104
118
  if respond_to?(method)
@@ -8,15 +8,19 @@ module Compass
8
8
  end
9
9
 
10
10
  module ClassMethods
11
- def new_from_file(config_file)
11
+ def new_from_file(config_file, defaults = nil)
12
12
  data = Data.new(config_file)
13
- data._parse(config_file)
13
+ data.with_defaults(defaults) do
14
+ data._parse(config_file)
15
+ end
14
16
  data
15
17
  end
16
18
 
17
- def new_from_string(contents, filename)
19
+ def new_from_string(contents, filename, defaults = nil)
18
20
  data = Data.new(filename)
19
- data.parse_string(contents, filename)
21
+ data.with_defaults(defaults) do
22
+ data.parse_string(contents, filename)
23
+ end
20
24
  data
21
25
  end
22
26
  end
@@ -4,7 +4,7 @@ end
4
4
  %w(
5
5
  selectors enumerate urls display
6
6
  inline_image image_size constants gradient_support
7
- font_files lists colors trig sprites
7
+ font_files lists colors trig sprites cross_browser_support
8
8
  ).each do |func|
9
9
  require "compass/sass_extensions/functions/#{func}"
10
10
  end
@@ -23,6 +23,7 @@ module Sass::Script::Functions
23
23
  include Compass::SassExtensions::Functions::Colors
24
24
  include Compass::SassExtensions::Functions::Trig
25
25
  include Compass::SassExtensions::Functions::Sprites
26
+ include Compass::SassExtensions::Functions::CrossBrowserSupport
26
27
  end
27
28
 
28
29
  # Wierd that this has to be re-included to pick up sub-modules. Ruby bug?
@@ -1,11 +1,10 @@
1
1
  module Compass::SassExtensions::Functions::Colors
2
- include Compass::Util
3
2
 
4
3
  # a genericized version of lighten/darken so that negative values can be used.
5
4
  def adjust_lightness(color, amount)
6
5
  assert_type color, :Color
7
6
  assert_type amount, :Number
8
- color.with(:lightness => restrict(color.lightness + amount.value, 0..100))
7
+ color.with(:lightness => Compass::Util.restrict(color.lightness + amount.value, 0..100))
9
8
  end
10
9
 
11
10
  # Scales a color's lightness by some percentage.
@@ -21,7 +20,7 @@ module Compass::SassExtensions::Functions::Colors
21
20
  def adjust_saturation(color, amount)
22
21
  assert_type color, :Color
23
22
  assert_type amount, :Number
24
- color.with(:saturation => restrict(color.saturation + amount.value, 0..100))
23
+ color.with(:saturation => Compass::Util.restrict(color.saturation + amount.value, 0..100))
25
24
  end
26
25
 
27
26
  # Scales a color's saturation by some percentage.
@@ -0,0 +1,39 @@
1
+ module Compass::SassExtensions::Functions::CrossBrowserSupport
2
+ # Check if any of the arguments passed require a vendor prefix.
3
+ def prefixed(prefix, *args)
4
+ aspect = prefix.value.sub(/^-/,"")
5
+ needed = args.any?{|a| a.respond_to?(:supports?) && a.supports?(aspect)}
6
+ Sass::Script::Bool.new(needed)
7
+ end
8
+
9
+ %w(webkit moz o ms svg pie css2).each do |prefix|
10
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
11
+ # Syntactic sugar to apply the given prefix
12
+ # -moz($arg) is the same as calling prefix(-moz, $arg)
13
+ def _#{prefix}(*args)
14
+ prefix("#{prefix}", *args)
15
+ end
16
+ RUBY
17
+ end
18
+
19
+ def prefix(prefix, *objects)
20
+ prefix = prefix.value if prefix.is_a?(Sass::Script::String)
21
+ prefix = prefix[1..-1] if prefix[0] == ?-
22
+ if objects.size > 1
23
+ self.prefix(prefix, Sass::Script::List.new(objects, :comma))
24
+ else
25
+ object = objects.first
26
+ if object.is_a?(Sass::Script::List)
27
+ Sass::Script::List.new(object.value.map{|e|
28
+ self.prefix(prefix, e)
29
+ }, object.separator)
30
+ elsif object.respond_to?(:supports?) && object.supports?(prefix) && object.respond_to?(:"to_#{prefix}")
31
+ object.options = options
32
+ object.send(:"to_#{prefix}")
33
+ else
34
+ object
35
+ end
36
+ end
37
+ end
38
+
39
+ end
@@ -1,322 +1,6 @@
1
1
  module Compass::SassExtensions::Functions::GradientSupport
2
2
 
3
- module ListFreeSassSupport
4
- class List < Sass::Script::Literal
5
- attr_accessor :values
6
- def children
7
- values
8
- end
9
- def value
10
- # duck type to a Sass List
11
- values
12
- end
13
- def initialize(*values)
14
- self.values = values
15
- end
16
- def join_with
17
- ", "
18
- end
19
- def inspect
20
- to_s
21
- end
22
- def to_s(options = self.options)
23
- values.map {|v| v.to_s }.join(join_with)
24
- end
25
- def size
26
- values.size
27
- end
28
- end
29
-
30
- class SpaceList < List
31
- def join_with
32
- " "
33
- end
34
- end
35
-
36
- # given a position list, return a corresponding position in percents
37
- def grad_point(position)
38
- position = position.is_a?(Sass::Script::String) ? position.value : position.to_s
39
- position = if position[" "]
40
- if position =~ /(top|bottom|center) (left|right|center)/
41
- "#{$2} #{$1}"
42
- else
43
- position
44
- end
45
- else
46
- case position
47
- when /top|bottom/
48
- "center #{position}"
49
- when /left|right/
50
- "#{position} center"
51
- when /center/
52
- "center center"
53
- else
54
- "#{position} center"
55
- end
56
- end
57
- position = position.
58
- gsub(/top/, "0%").
59
- gsub(/bottom/, "100%").
60
- gsub(/left/,"0%").
61
- gsub(/right/,"100%").
62
- gsub(/center/, "50%")
63
- SpaceList.new(*position.split(/ /).map{|s| Sass::Script::String.new(s)})
64
- end
65
-
66
- def color_stops(*args)
67
- List.new(*args.map do |arg|
68
- case arg
69
- when ColorStop
70
- arg
71
- when Sass::Script::Color
72
- ColorStop.new(arg)
73
- when Sass::Script::String
74
- # We get a string as the result of concatenation
75
- # So we have to reparse the expression
76
- parse_color_stop(arg)
77
- else
78
- raise Sass::SyntaxError, "Not a valid color stop: #{arg.class.name}: #{arg}"
79
- end
80
- end)
81
- end
82
-
83
- # Returns a comma-delimited list after removing any non-true values
84
- def compact(*args)
85
- List.new(*args.reject{|a| !a.to_bool})
86
- end
87
-
88
- # Returns a list object from a value that was passed.
89
- # This can be used to unpack a space separated list that got turned
90
- # into a string by sass before it was passed to a mixin.
91
- def _compass_list(arg)
92
- return arg if arg.is_a?(List)
93
- values = case arg
94
- when Sass::Script::String
95
- expr = Sass::Script::Parser.parse(arg.value, 0, 0)
96
- if expr.is_a?(Sass::Script::Operation)
97
- extract_list_values(expr)
98
- elsif expr.is_a?(Sass::Script::Funcall)
99
- expr.perform(Sass::Environment.new) #we already evaluated the args in context so no harm in using a fake env
100
- else
101
- [arg]
102
- end
103
- else
104
- [arg]
105
- end
106
-
107
- SpaceList.new(*values)
108
- end
109
-
110
- def _compass_space_list(list)
111
- if list.is_a?(List) && !list.is_a?(SpaceList)
112
- SpaceList.new(*list.values)
113
- elsif list.is_a?(SpaceList)
114
- list
115
- else
116
- SpaceList.new(list)
117
- end
118
- end
119
-
120
- def _compass_list_size(list)
121
- Sass::Script::Number.new(list.size)
122
- end
123
-
124
- # slice a sublist from a list
125
- def _compass_slice(list, start_index, end_index = nil)
126
- end_index ||= Sass::Script::Number.new(-1)
127
- start_index = start_index.value
128
- end_index = end_index.value
129
- start_index -= 1 unless start_index < 0
130
- end_index -= 1 unless end_index < 0
131
- list.class.new *list.values[start_index..end_index]
132
- end
133
-
134
- # Check if any of the arguments passed have a tendency towards vendor prefixing.
135
- def prefixed(prefix, *args)
136
- method = prefix.value.sub(/^-/,"to_").to_sym
137
- args.map!{|a| a.is_a?(List) ? a.values : a}.flatten!
138
- Sass::Script::Bool.new(args.any?{|a| a.respond_to?(method)})
139
- end
140
-
141
- %w(webkit moz o ms svg pie css2).each do |prefix|
142
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
143
- def _#{prefix}(*args)
144
- List.new(*args.map! {|a| add_prefix(:to_#{prefix}, a)})
145
- end
146
- RUBY
147
- end
148
-
149
- protected
150
-
151
- def add_prefix(prefix_method, object)
152
- if object.is_a?(List)
153
- object.class.new(object.value.map{|e|
154
- add_prefix(prefix_method, e)
155
- })
156
- elsif object.respond_to?(prefix_method)
157
- object.options = options
158
- object.send(prefix_method)
159
- else
160
- object
161
- end
162
- end
163
-
164
- def color_stop?(arg)
165
- parse_color_stop(arg)
166
- rescue
167
- nil
168
- end
169
-
170
- def assert_list(value)
171
- unless value.is_a?(List)
172
- raise ArgumentError.new("#{value.inspect} is not a list")
173
- end
174
- end
175
-
176
- end
177
-
178
- module ListBasedSassSupport
179
- # given a position list, return a corresponding position in percents
180
- def grad_point(position)
181
- position = unless position.is_a?(Sass::Script::List)
182
- Sass::Script::List.new([position], :space)
183
- else
184
- Sass::Script::List.new(position.value.dup, position.separator)
185
- end
186
- position.value.reject!{|p| p.is_a?(Sass::Script::Number) && p.numerator_units.include?("deg")}
187
- if (position.value.first.value =~ /top|bottom/) or (position.value.last.value =~ /left|right/)
188
- # browsers are pretty forgiving of reversed positions so we are too.
189
- position.value.reverse!
190
- end
191
- if position.value.size == 1
192
- if position.value.first.value =~ /top|bottom/
193
- position.value.unshift Sass::Script::String.new("center")
194
- elsif position.value.first.value =~ /left|right/
195
- position.value.push Sass::Script::String.new("center")
196
- end
197
- end
198
- position.value.map! do |p|
199
- case p.value
200
- when /top|left/
201
- Sass::Script::Number.new(0, ["%"])
202
- when /bottom|right/
203
- Sass::Script::Number.new(100, ["%"])
204
- when /center/
205
- Sass::Script::Number.new(50, ["%"])
206
- else
207
- p
208
- end
209
- end
210
- position
211
- end
212
-
213
- def color_stops(*args)
214
- Sass::Script::List.new(args.map do |arg|
215
- case arg
216
- when ColorStop
217
- arg
218
- when Sass::Script::Color
219
- ColorStop.new(arg)
220
- when Sass::Script::List
221
- ColorStop.new(*arg.value)
222
- else
223
- raise Sass::SyntaxError, "Not a valid color stop: #{arg.class.name}: #{arg}"
224
- end
225
- end, :comma)
226
- end
227
-
228
- # Returns a comma-delimited list after removing any non-true values
229
- def compact(*args)
230
- sep = :comma
231
- if args.size == 1 && args.first.is_a?(Sass::Script::List)
232
- args = args.first.value
233
- sep = args.first.separator
234
- end
235
- Sass::Script::List.new(args.reject{|a| !a.to_bool}, sep)
236
- end
237
-
238
- # Returns a list object from a value that was passed.
239
- # This can be used to unpack a space separated list that got turned
240
- # into a string by sass before it was passed to a mixin.
241
- def _compass_list(arg)
242
- if arg.is_a?(Sass::Script::List)
243
- Sass::Script::List.new(arg.value.dup, arg.separator)
244
- else
245
- Sass::Script::List.new([arg], :space)
246
- end
247
- end
248
-
249
- def _compass_space_list(list)
250
- if list.is_a?(Sass::Script::List)
251
- Sass::Script::List.new(list.value.dup, :space)
252
- else
253
- Sass::Script::List.new([list], :space)
254
- end
255
- end
256
-
257
- def _compass_list_size(list)
258
- assert_list list
259
- Sass::Script::Number.new(list.value.size)
260
- end
261
-
262
- # slice a sublist from a list
263
- def _compass_slice(list, start_index, end_index = nil)
264
- end_index ||= Sass::Script::Number.new(-1)
265
- start_index = start_index.value
266
- end_index = end_index.value
267
- start_index -= 1 unless start_index < 0
268
- end_index -= 1 unless end_index < 0
269
- Sass::Script::List.new list.values[start_index..end_index], list.separator
270
- end
271
-
272
- # Check if any of the arguments passed have a tendency towards vendor prefixing.
273
- def prefixed(prefix, *args)
274
- method = prefix.value.sub(/^-/,"to_").to_sym
275
- 2.times do
276
- args.map!{|a| a.is_a?(Sass::Script::List) ? a.value : a}.flatten!
277
- end
278
- Sass::Script::Bool.new(args.any?{|a| a.respond_to?(method)})
279
- end
280
-
281
- %w(webkit moz o ms svg pie css2).each do |prefix|
282
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
283
- def _#{prefix}(*args)
284
- Sass::Script::List.new(args.map! {|a| add_prefix(:to_#{prefix}, a)}, :comma)
285
- end
286
- RUBY
287
- end
288
-
289
- protected
290
-
291
- def add_prefix(prefix_method, object)
292
- if object.is_a?(Sass::Script::List)
293
- Sass::Script::List.new(object.value.map{|e|
294
- add_prefix(prefix_method, e)
295
- }, object.separator)
296
- elsif object.respond_to?(prefix_method)
297
- object.options = options
298
- object.send(prefix_method)
299
- else
300
- object
301
- end
302
- end
303
-
304
- def color_stop?(arg)
305
- arg.is_a?(ColorStop) ||
306
- (arg.is_a?(Sass::Script::List) && ColorStop.new(*arg.value)) ||
307
- ColorStop.new(arg)
308
- rescue
309
- nil
310
- end
311
-
312
- def assert_list(value)
313
- unless value.is_a?(Sass::Script::List)
314
- raise ArgumentError.new("#{value.inspect} is not a list")
315
- end
316
- end
317
-
318
- end
319
-
3
+ GRADIENT_ASPECTS = %w(webkit moz svg pie css2).freeze
320
4
 
321
5
  class ColorStop < Sass::Script::Literal
322
6
  attr_accessor :color, :stop
@@ -372,6 +56,12 @@ module Compass::SassExtensions::Functions::GradientSupport
372
56
  s << color_stops.to_s(options)
373
57
  s << ")"
374
58
  end
59
+ def supports?(aspect)
60
+ GRADIENT_ASPECTS.include?(aspect)
61
+ end
62
+ def has_aspect?
63
+ true
64
+ end
375
65
  def to_webkit(options = self.options)
376
66
  args = [
377
67
  grad_point(position_and_angle || _center_position),
@@ -421,6 +111,12 @@ module Compass::SassExtensions::Functions::GradientSupport
421
111
  s << color_stops.to_s(options)
422
112
  s << ")"
423
113
  end
114
+ def supports?(aspect)
115
+ GRADIENT_ASPECTS.include?(aspect)
116
+ end
117
+ def has_aspect?
118
+ true
119
+ end
424
120
  def to_webkit(options = self.options)
425
121
  args = []
426
122
  args << grad_point(position_and_angle || Sass::Script::String.new("top"))
@@ -447,11 +143,53 @@ module Compass::SassExtensions::Functions::GradientSupport
447
143
 
448
144
  module Functions
449
145
 
450
- # While supporting sass 3.1 and older versions, we need two different implementations.
451
- if defined?(Sass::Script::List)
452
- include ListBasedSassSupport
453
- else
454
- include ListFreeSassSupport
146
+ # given a position list, return a corresponding position in percents
147
+ def grad_point(position)
148
+ position = unless position.is_a?(Sass::Script::List)
149
+ Sass::Script::List.new([position], :space)
150
+ else
151
+ Sass::Script::List.new(position.value.dup, position.separator)
152
+ end
153
+ position.value.reject!{|p| p.is_a?(Sass::Script::Number) && p.numerator_units.include?("deg")}
154
+ if (position.value.first.value =~ /top|bottom/) or (position.value.last.value =~ /left|right/)
155
+ # browsers are pretty forgiving of reversed positions so we are too.
156
+ position.value.reverse!
157
+ end
158
+ if position.value.size == 1
159
+ if position.value.first.value =~ /top|bottom/
160
+ position.value.unshift Sass::Script::String.new("center")
161
+ elsif position.value.first.value =~ /left|right/
162
+ position.value.push Sass::Script::String.new("center")
163
+ end
164
+ end
165
+ position.value.map! do |p|
166
+ case p.value
167
+ when /top|left/
168
+ Sass::Script::Number.new(0, ["%"])
169
+ when /bottom|right/
170
+ Sass::Script::Number.new(100, ["%"])
171
+ when /center/
172
+ Sass::Script::Number.new(50, ["%"])
173
+ else
174
+ p
175
+ end
176
+ end
177
+ position
178
+ end
179
+
180
+ def color_stops(*args)
181
+ Sass::Script::List.new(args.map do |arg|
182
+ case arg
183
+ when ColorStop
184
+ arg
185
+ when Sass::Script::Color
186
+ ColorStop.new(arg)
187
+ when Sass::Script::List
188
+ ColorStop.new(*arg.value)
189
+ else
190
+ raise Sass::SyntaxError, "Not a valid color stop: #{arg.class.name}: #{arg}"
191
+ end
192
+ end, :comma)
455
193
  end
456
194
 
457
195
  def radial_gradient(position_and_angle, shape_and_size, *color_stops)
@@ -508,7 +246,7 @@ module Compass::SassExtensions::Functions::GradientSupport
508
246
  end
509
247
 
510
248
  def color_stops_in_percentages(color_list)
511
- assert_list(color_list)
249
+ assert_type color_list, :List
512
250
  color_list = normalize_stops(color_list)
513
251
  max = color_list.value.last.stop
514
252
  last_value = nil
@@ -527,13 +265,13 @@ module Compass::SassExtensions::Functions::GradientSupport
527
265
 
528
266
  # returns the end position of the gradient from the color stop
529
267
  def grad_end_position(color_list, radial = Sass::Script::Bool.new(false))
530
- assert_list(color_list)
268
+ assert_type color_list, :List
531
269
  default = Sass::Script::Number.new(100)
532
270
  grad_position(color_list, Sass::Script::Number.new(color_list.value.size), default, radial)
533
271
  end
534
272
 
535
273
  def grad_position(color_list, index, default, radial = Sass::Script::Bool.new(false))
536
- assert_list(color_list)
274
+ assert_type color_list, :List
537
275
  stop = color_list.value[index.value - 1].stop
538
276
  if stop && radial.to_bool
539
277
  orig_stop = stop
@@ -576,55 +314,16 @@ module Compass::SassExtensions::Functions::GradientSupport
576
314
  inline_image_string(svg.gsub(/\s+/, ' '), 'image/svg+xml')
577
315
  end
578
316
 
579
- # Get the nth value from a list
580
- def _compass_nth(list, place)
581
- assert_list list
582
- if place.value == "first"
583
- list.value.first
584
- elsif place.value == "last"
585
- list.value.last
586
- else
587
- list.value[place.value - 1]
588
- end
589
- end
590
-
591
- def blank(obj)
592
- case obj
593
- when Sass::Script::Bool
594
- Sass::Script::Bool.new !obj.to_bool
595
- when Sass::Script::String
596
- Sass::Script::Bool.new obj.value.strip.size == 0
597
- when Sass::Script::List
598
- Sass::Script::Bool.new obj.value.size == 0 || obj.value.all?{|el| blank(el).to_bool}
599
- else
600
- Sass::Script::Bool.new false
601
- end
602
- end
603
-
604
317
  private
605
318
 
606
- # After using the sass script parser to parse a string, this reconstructs
607
- # a list from operands to the space/concat operation
608
- def extract_list_values(operation)
609
- left = operation.instance_variable_get("@operand1")
610
- right = operation.instance_variable_get("@operand2")
611
- left = extract_list_values(left) if left.is_a?(Sass::Script::Operation)
612
- right = extract_list_values(right) if right.is_a?(Sass::Script::Operation)
613
- left = literalize(left) unless left.is_a?(Array)
614
- right = literalize(right) unless right.is_a?(Array)
615
- Array(left) + Array(right)
616
- end
617
- # Makes a literal from other various script nodes.
618
- def literalize(node)
619
- case node
620
- when Sass::Script::Literal
621
- node
622
- when Sass::Script::Funcall
623
- node.perform(Sass::Environment.new)
624
- else
625
- Sass::Script::String.new(node.to_s)
626
- end
319
+ def color_stop?(arg)
320
+ arg.is_a?(ColorStop) ||
321
+ (arg.is_a?(Sass::Script::List) && ColorStop.new(*arg.value)) ||
322
+ ColorStop.new(arg)
323
+ rescue
324
+ nil
627
325
  end
326
+
628
327
  def normalize_stops(color_list)
629
328
  positions = color_list.value.map{|obj| obj.dup}
630
329
  # fill in the start and end positions, if unspecified
@@ -715,23 +414,32 @@ EOS
715
414
  end
716
415
 
717
416
  def _center_position
718
- if defined?(Sass::Script::List)
719
- Sass::Script::List.new([
720
- Sass::Script::String.new("center"),
721
- Sass::Script::String.new("center")
722
- ],:space)
723
- else
724
- Sass::Script::String.new("center center")
725
- end
417
+ Sass::Script::List.new([
418
+ Sass::Script::String.new("center"),
419
+ Sass::Script::String.new("center")
420
+ ],:space)
726
421
  end
727
422
 
728
423
  end
424
+
425
+ module Assertions
426
+ def assert_type(value, type, name = nil)
427
+ return if value.is_a?(Sass::Script.const_get(type))
428
+ err = "#{value.inspect} is not a #{type.to_s.downcase}"
429
+ err = "$#{name}: " + err if name
430
+ raise ArgumentError.new(err)
431
+ end
432
+ end
433
+
729
434
  class LinearGradient < Sass::Script::Literal
435
+ include Assertions
730
436
  include Functions
731
437
  include Compass::SassExtensions::Functions::Constants
732
438
  include Compass::SassExtensions::Functions::InlineImage
733
439
  end
440
+
734
441
  class RadialGradient < Sass::Script::Literal
442
+ include Assertions
735
443
  include Functions
736
444
  include Compass::SassExtensions::Functions::Constants
737
445
  include Compass::SassExtensions::Functions::InlineImage