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

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 (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