archetype 0.0.1.pre.10 → 0.0.1.pre.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/lib/archetype.rb +0 -4
  3. data/lib/archetype/functions/hash.rb +12 -28
  4. data/lib/archetype/functions/helpers.rb +13 -46
  5. data/lib/archetype/functions/styleguide_memoizer.rb +1 -9
  6. data/lib/archetype/sass_extensions/functions/lists.rb +42 -36
  7. data/lib/archetype/sass_extensions/functions/locale.rb +16 -32
  8. data/lib/archetype/sass_extensions/functions/styleguide.rb +39 -121
  9. data/lib/archetype/sass_extensions/functions/ui.rb +2 -3
  10. data/lib/archetype/sass_extensions/functions/version.rb +6 -11
  11. data/lib/archetype/sass_extensions/monkey_patches.rb +1 -1
  12. data/lib/archetype/version.rb +1 -1
  13. data/stylesheets/archetype/_base.scss +2 -7
  14. data/stylesheets/archetype/_config.scss +1 -8
  15. data/stylesheets/archetype/_hacks.scss +17 -51
  16. data/stylesheets/archetype/_ui.scss +5 -16
  17. data/stylesheets/archetype/base/_h5bp.scss +12 -12
  18. data/stylesheets/archetype/base/_normalize.scss +139 -178
  19. data/stylesheets/archetype/grid/_grid.scss +13 -13
  20. data/stylesheets/archetype/styleguide/components/_buttons.scss +0 -1
  21. data/stylesheets/archetype/util/_debug.scss +4 -4
  22. data/stylesheets/archetype/util/_lists.scss +1 -1
  23. data/stylesheets/archetype/util/_misc.scss +1 -1
  24. data/stylesheets/archetype/util/_rtl.scss +1 -1
  25. data/stylesheets/archetype/util/_spacing.scss +6 -6
  26. data/stylesheets/archetype/util/_styles.scss +10 -27
  27. data/stylesheets/archetype/util/_targeting.scss +1 -1
  28. data/test/fixtures/stylesheets/archetype/config.rb +0 -2
  29. data/test/fixtures/stylesheets/archetype/saved/styleguide/buttons.css +2027 -0
  30. data/test/fixtures/stylesheets/archetype/saved/styleguide/fallback_styles.css +9 -0
  31. data/test/fixtures/stylesheets/archetype/source/styleguide/buttons.scss +1 -5
  32. data/test/fixtures/stylesheets/archetype/source/styleguide/fallback_styles.scss +2 -1
  33. data/test/fixtures/stylesheets/archetype/source/styleguide/nested_styleguides.scss +1 -1
  34. data/test/fixtures/stylesheets/archetype/source/styleguide/selective_state.scss +1 -1
  35. data/test/fixtures/stylesheets/archetype/source/ui/glyph_icon.scss +0 -30
  36. data/test/fixtures/stylesheets/archetype/source/utilities/custom_output_styler.scss +3 -4
  37. data/test/fixtures/stylesheets/archetype/source/utilities/targeting/target-browser.scss +1 -8
  38. data/test/helpers/test_case.rb +2 -2
  39. data/test/integrations/archetype_test.rb +1 -3
  40. data/test/units/sass_extensions_test.rb +25 -18
  41. metadata +6 -29
  42. data/lib/archetype/actions/help.rb +0 -16
  43. data/lib/archetype/actions/theme.rb +0 -73
  44. data/lib/archetype/executor.rb +0 -27
  45. data/test/fixtures/stylesheets/archetype/saved/base.css +0 -349
  46. data/test/fixtures/stylesheets/archetype/saved/hacks/transparent_focusable.css +0 -4
  47. data/test/fixtures/stylesheets/archetype/saved/locale.css +0 -23
  48. data/test/fixtures/stylesheets/archetype/source/base.scss +0 -3
  49. data/test/fixtures/stylesheets/archetype/source/hacks/transparent_focusable.scss +0 -5
  50. data/test/fixtures/stylesheets/archetype/source/locale.scss +0 -43
  51. data/test/fixtures/stylesheets/archetype/source/styleguide/alerts.scss +0 -21
  52. data/test/fixtures/stylesheets/archetype/source/styleguide/drop.scss +0 -101
  53. data/test/fixtures/stylesheets/archetype/source/styleguide/extend.scss +0 -24
  54. data/test/fixtures/stylesheets/archetype/source/styleguide/invalid_structures.scss +0 -85
  55. data/test/fixtures/stylesheets/archetype/source/styleguide/multi_value.scss +0 -18
  56. data/test/fixtures/stylesheets/archetype/source/utilities/associative.scss +0 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 76f9c81397416d6b304275d0be066bd0f7b63bbb
4
- data.tar.gz: 92bf858e2784bc85bb687d9836c401718bd26b32
3
+ metadata.gz: 192dd0037d6555124a87aadae4a22c1be1fe080c
4
+ data.tar.gz: 7cc39be2c7bb42aeb4580baf1481ac2d4a1dcd48
5
5
  SHA512:
6
- metadata.gz: 907804823810690498dd247dde990ad9def057416b6b9de4f159cc632054fea8d372739d92c16cebd33357071cf1246b144de9067431247b39041c3cbe16d3f3
7
- data.tar.gz: 4a3ed261f9f1fe3fe3bfe6c1f81d2038bfa96b967531a0c8180f9394bac8ea4f36f2c1fd8e7d484e8baf55ab64cff6200fa6c37c1b120b1e235d162a74077a5f
6
+ metadata.gz: 2a8a13bf6c81307af54fc6ebbcd0a23c40446d3d3d00f73a695aeef338a08ee1de9521a0a78bc8d3e2eecd73b70118470483ddfa82f9a967de627a637fca8e47
7
+ data.tar.gz: 648a999357a50954db62eee54078e250ae061d0f3e579a6473b31f8582080a73e04659161dae47032ed43190753bfe29ef7cccdf38a2af5bbceb0e15473b45bc
data/lib/archetype.rb CHANGED
@@ -33,10 +33,6 @@ module Archetype
33
33
  Compass::Configuration.add_configuration_property(:memoize, "should the memoizer be used to improve compilation speed") do
34
34
  not (Compass.configuration.environment || :development).to_s.include?('dev')
35
35
  end
36
- # testing (for running unit tests)
37
- Compass::Configuration.add_configuration_property(:testing, "is this a testing environment") do
38
- ENV['CI']
39
- end
40
36
  end
41
37
  end
42
38
 
@@ -1,8 +1,6 @@
1
1
  # :stopdoc:
2
2
  # This module extends the native Ruby Hash class to support deep merging
3
3
  # and comparing the difference between hashes.
4
- # This functionality mimics that found in ActiveSupport
5
- # @see https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/hash/deep_merge.rb
6
4
  #
7
5
  module Archetype::Functions::Hash
8
6
  #
@@ -13,10 +11,13 @@ module Archetype::Functions::Hash
13
11
  # *Returns*:
14
12
  # - {Hash} a new hash containing the contents of other_hash and the contents of hsh, deep merged
15
13
  #
16
- def rmerge(other_hash, &block)
17
- dup.rmerge!(other_hash, &block)
14
+ def rmerge(other_hash)
15
+ new_hash = {}
16
+ merge(other_hash) do |key, oldval, newval|
17
+ new_hash[key] = oldval.class == self.class ? oldval.rmerge(newval) : newval
18
+ end
18
19
  end
19
-
20
+
20
21
  #
21
22
  # adds the contents of other_hash to hsh, deep merged
22
23
  #
@@ -25,16 +26,10 @@ module Archetype::Functions::Hash
25
26
  # *Returns*:
26
27
  # - {Hash} the original hash with the addition of the contents of other_hash
27
28
  #
28
- def rmerge!(other_hash, &block)
29
- other_hash.each_pair do |k,v|
30
- tv = self[k]
31
- if tv.is_a?(Hash) && v.is_a?(Hash)
32
- self[k] = tv.rmerge(v, &block)
33
- else
34
- self[k] = block && tv ? block.call(k, tv, v) : v
35
- end
29
+ def rmerge!(other_hash)
30
+ merge!(other_hash) do |key, oldval, newval|
31
+ oldval.class == self.class ? oldval.rmerge!(newval) : newval
36
32
  end
37
- return self
38
33
  end
39
34
 
40
35
  #
@@ -46,7 +41,7 @@ module Archetype::Functions::Hash
46
41
  # - {Hash} a representation of the difference between the two hashes
47
42
  #
48
43
  def diff(other_hash)
49
- (self.keys + other_hash.keys).uniq.inject(Archetype::Hash.new) do |tmp, key|
44
+ (self.keys + other_hash.keys).uniq.inject({}) do |tmp, key|
50
45
  # special comparison for gradients
51
46
  are_gradients = self[key].is_a?(Compass::SassExtensions::Functions::GradientSupport::LinearGradient) and other_hash[key].is_a?(Compass::SassExtensions::Functions::GradientSupport::LinearGradient)
52
47
  eq_gradients = are_gradients ? (self[key].to_s == other_hash[key].to_s) : true
@@ -133,17 +128,6 @@ private
133
128
  end
134
129
  end
135
130
 
136
- # this shims the Hash functionality to ensure we have an ordered hash guarantee
137
- module Archetype
138
- if RUBY_VERSION < '1.9'
139
- require 'hashery/ordered_hash'
140
- class Hash < Hashery::OrderedHash
141
- include Archetype::Functions::Hash
142
- end
143
- else
144
- class Hash < ::Hash
145
- include Archetype::Functions::Hash
146
- end
147
- end
131
+ class Hash
132
+ include Archetype::Functions::Hash
148
133
  end
149
-
@@ -24,8 +24,7 @@ private
24
24
  def self.hash_to_list(hsh, depth = 0, separator = :comma)
25
25
  if hsh.is_a? Hash
26
26
  list = []
27
- hsh.each do |key, item|
28
- item = [key, item]
27
+ hsh.each do |item|
29
28
  # if its a hash, convert it to a List
30
29
  if item.is_a? Hash or item.is_a? Array
31
30
  tmp = []
@@ -55,56 +54,30 @@ private
55
54
  #
56
55
  def self.list_to_hash(list, depth = 0, nest = [], additives = [])
57
56
  list = list.to_a
58
- previous = nil
59
- hsh = Archetype::Hash.new
57
+ hsh = {}
60
58
  list.each do |item|
61
59
  item = item.to_a
62
-
63
60
  # convert the key to a string and strip off quotes
64
- key = to_str(item[0], ' ' , :quotes)
65
- # capture the value
61
+ key = to_str(item[0]).gsub(/\A"|"\Z/, '')
66
62
  value = item[1]
67
-
68
63
  if key != 'nil'
69
- if is_value(value, :blank)
70
- if previous.nil?
71
- previous = key
72
- next
73
- else
74
- value = item[0]
75
- key = previous
76
- previous = nil
77
- end
78
- elsif not previous.nil?
79
- # if we got here, something is wrong with the structure
80
- list.shift if to_str(list[0]) == previous # remove the first item if it's the previous key, which is now the parent key
81
- list = list[0].to_a # now the remaining items were munged, so split them out
82
- hsh = Archetype::Hash.new
83
- hsh[previous] = list_to_hash(list, depth - 1, nest, additives)
84
- return hsh
85
- end
86
- end
87
-
88
- # update the hash if we have a valid key and hash
89
- if key != 'nil' and not is_value(value, :blank)
90
64
  # check if if it's a nesting hash
91
65
  nested = nest.include?(key)
92
66
  # if it's nested or we haven't reached out depth, recurse
93
67
  if nested or depth > 0
94
68
  value = list_to_hash(value, nested ? depth + 1 : depth - 1, nest, additives)
95
69
  end
96
-
97
- if additives.include?(key)
98
- hsh[key] ||= []
99
- hsh[key].push(value)
100
- else
101
- hsh[key] = value
70
+ # update the hash key
71
+ if not is_value(value, :blank)
72
+ if additives.include?(key)
73
+ hsh[key] ||= []
74
+ hsh[key].push(value)
75
+ else
76
+ hsh[key] = value
77
+ end
102
78
  end
103
79
  end
104
80
  end
105
-
106
- logger.record(:warning, "one of your data structures is ambiguous, please double check near `#{previous}`") if not previous.nil?
107
-
108
81
  return hsh
109
82
  end
110
83
 
@@ -117,12 +90,8 @@ private
117
90
  # *Returns*:
118
91
  # - {String} the converted String
119
92
  #
120
- def self.to_str(value, separator = ' ', strip = nil)
121
- if not value.is_a?(String)
122
- value = ((value.to_a).each{ |i| i.nil? ? 'nil' : (i.is_a?(String) ? i : i.value) }).join(separator || '')
123
- end
124
- strip = /\A"|"\Z/ if strip == :quotes
125
- return strip.nil? ? value : value.gsub(strip, '')
93
+ def self.to_str(value, separator = ' ')
94
+ return value.is_a?(String) ? value : ((value.to_a).each{ |i| i.is_a?(String) ? i : i.value }).join(separator || '')
126
95
  end
127
96
 
128
97
  #
@@ -140,13 +109,11 @@ private
140
109
  when :blank
141
110
  is_it = false
142
111
  value = value.value if value.is_a?(Sass::Script::String)
143
- is_it = value.nil?
144
112
  is_it = value.empty? if value.is_a?(String)
145
113
  is_it = value.to_a.empty? if value.is_a?(Sass::Script::List) or value.is_a?(Array)
146
114
  when :nil
147
115
  is_it = false
148
116
  value = value.value if value.is_a?(Sass::Script::String)
149
- is_it = value.nil?
150
117
  is_it = value == 'nil' if value.is_a?(String)
151
118
  is_it = to_str(value) == 'nil' if value.is_a?(Sass::Script::List) or value.is_a?(Array)
152
119
  end
@@ -50,7 +50,7 @@ private
50
50
  end
51
51
 
52
52
  #
53
- # invalidate the memoizer for the theme
53
+ # invalidate the entire memoizer for the theme
54
54
  #
55
55
  # *Parameters*:
56
56
  # - <tt>theme</tt> {String} the theme name
@@ -58,12 +58,4 @@ private
58
58
  def self.clear(theme)
59
59
  @components[theme] = {}
60
60
  end
61
-
62
-
63
- #
64
- # resets the entire memoizer
65
- #
66
- def self.reset!
67
- @components = {}
68
- end
69
61
  end
@@ -6,7 +6,7 @@ require 'archetype/functions/helpers'
6
6
  module Archetype::SassExtensions::Lists
7
7
  #
8
8
  # replace an index in a list
9
- #
9
+ #
10
10
  # *Parameters*:
11
11
  # - <tt>$list</tt> {List} the list to replace from
12
12
  # - <tt>$value</tt> {\*} the value to replace (if nil, it's a removal)
@@ -47,8 +47,8 @@ module Archetype::SassExtensions::Lists
47
47
  def list_remove(list, idx = false, separator = nil)
48
48
  return list_replace(list, idx, nil, separator)
49
49
  end
50
- Sass::Script::Functions.declare :list_remove, [:list, :idx]
51
- Sass::Script::Functions.declare :list_remove, [:list, :idx, :separator]
50
+ Sass::Script::Functions.declare :list_replace, [:list, :idx]
51
+ Sass::Script::Functions.declare :list_replace, [:list, :idx, :separator]
52
52
 
53
53
  #
54
54
  # insert an item into a list
@@ -67,9 +67,41 @@ module Archetype::SassExtensions::Lists
67
67
  return list if (not idx or idx == Sass::Script::Bool.new(false)) or value.nil?
68
68
  return list_replace(list, idx, value, separator, -1)
69
69
  end
70
- Sass::Script::Functions.declare :list_insert, [:list, :idx]
71
- Sass::Script::Functions.declare :list_insert, [:list, :idx, :value]
72
- Sass::Script::Functions.declare :list_insert, [:list, :idx, :value, :separator]
70
+ Sass::Script::Functions.declare :list_replace, [:list, :idx]
71
+ Sass::Script::Functions.declare :list_replace, [:list, :idx, :value]
72
+ Sass::Script::Functions.declare :list_replace, [:list, :idx, :value, :separator]
73
+
74
+ #
75
+ # sort a list
76
+ #
77
+ # *Parameters*:
78
+ # - <tt>$list</tt> {List} the list to sort
79
+ # - <tt>$reverse</tt> {Boolean} sort the list in reverse order
80
+ # *Returns*:
81
+ # - {List} the sorted list
82
+ #
83
+ # TODO - this is failing, fix this
84
+ #def list_sort(list, reverse = false)
85
+ # separator = list.separator if list.is_a?(Sass::Script::List)
86
+ # list = list.to_a.sort
87
+ # list = list.reverse if (reverse == Sass::Script::Bool.new(true))
88
+ # return Sass::Script::List.new(list, separator)
89
+ #end
90
+
91
+ #
92
+ # reverse order a list
93
+ #
94
+ # *Parameters*:
95
+ # - <tt>$list</tt> {List} the list to reverse
96
+ # *Returns*:
97
+ # - {List} the reversed list
98
+ #
99
+ # TODO - this is failing, fix this
100
+ #def list_reverse(list)
101
+ # separator = list.separator if list.is_a?(Sass::Script::List)
102
+ # list = list.to_a.reverse
103
+ # return Sass::Script::List.new(list, separator)
104
+ #end
73
105
 
74
106
  #
75
107
  # add values(s) to a list
@@ -144,7 +176,7 @@ module Archetype::SassExtensions::Lists
144
176
  # - <tt>$haystack</tt> {List} input list
145
177
  # - <tt>$needle</tt> {List} the value(s) to search for
146
178
  # *Returns*:
147
- # - {Number|Boolean} if an item is found, returns the index, otherwise returns false
179
+ # - {Number|Bool} if an item is found, returns the index, otherwise returns false
148
180
  #
149
181
  def index2(haystack, needle)
150
182
  haystack = haystack.to_a
@@ -178,14 +210,14 @@ module Archetype::SassExtensions::Lists
178
210
  # *Parameters*:
179
211
  # - <tt>$list</tt> {List} the list to search in
180
212
  # - <tt>$key</tt> {String} the key identifier (name)
181
- # - <tt>$strict</tt> {Boolean} if true, does a strict match against the key
213
+ # - <tt>$strict</tt> {Bool} if true, does a strict match against the key
182
214
  # *Returns*:
183
215
  # - {*} the data associated with $key
184
216
  #
185
217
  def associative(list, key, strict = false)
186
218
  separator = list.separator if list.is_a?(Sass::Script::List)
187
219
  list = helpers.list_to_hash(list)
188
- item = list[helpers.to_str(key, ' ' , :quotes)]
220
+ item = list[helpers.to_str(key)]
189
221
  item ||= list.first[1] if not strict
190
222
  return Sass::Script::List.new([], separator) if item.nil?
191
223
  return helpers.hash_to_list(item, 0, separator) if item.is_a?(Array) or item.is_a?(Hash)
@@ -211,33 +243,7 @@ module Archetype::SassExtensions::Lists
211
243
  list = list.rmerge(extender)
212
244
  return helpers.hash_to_list(list, 0, separator)
213
245
  end
214
- Sass::Script::Functions.declare :associative_merge, [:list, :extender]
215
-
216
- #
217
- # given a string of styles, convert it into a key-value pair list
218
- #
219
- # *Parameters*:
220
- # - <tt>$string</tt> {String} the string to convert
221
- # *Returns*:
222
- # - <tt>$list</tt> {List} the converted list of styles
223
- #
224
- def _style_string_to_list(string = '')
225
- # convert to string and strip all comments
226
- string = helpers.to_str(string, ' ').gsub(/\/\*[^\*\/]*\*\//, '')
227
- # then split it on each rule
228
- tmp = string.split(';')
229
- styles = []
230
- # and for each rule break it into it's key-value pairs
231
- tmp.each do |rule|
232
- kvp = []
233
- rule.split(':').each do |str|
234
- kvp.push Sass::Script::String.new(str)
235
- end
236
- styles.push Sass::Script::List.new(kvp, :comma)
237
- end
238
- # the recompose the list
239
- return Sass::Script::List.new(styles, :comma)
240
- end
246
+ Sass::Script::Functions.declare :list_extend, [:list, :extender]
241
247
 
242
248
  private
243
249
  def helpers
@@ -3,36 +3,17 @@
3
3
  #
4
4
  module Archetype::SassExtensions::Locale
5
5
  #
6
- # get the current locale specified in config or test a list of locales against the current locale
6
+ # get the current locale specified in config
7
7
  #
8
- # *Parameters*:
9
- # - <tt>$locales</tt> {List} the list of locales to test
10
8
  # *Returns*:
11
- # - {String|Boolean} the current locale or whether or not the current locale is in the test set
9
+ # - {String} the current locale
12
10
  #
13
- def locale(locales = nil)
14
- locale = (Compass.configuration.locale || 'en_US').to_s
15
- # if the locales are nil, just return the current locale
16
- return Sass::Script::String.new(locale) if locales.nil?
17
- locales = locales.to_a.collect{|i| i.to_s}
18
- # add wild card support for language or territory
19
- match = locale.match(LOCALE_PATTERN)
20
- # language with wildcard territory
21
- language = match[1] + '_'
22
- # territory with wildcard language
23
- territory = '_' + match[2]
24
- # for each item, look it up in the alias list
25
- locales.each do |key|
26
- if a = locale_aliases[key]
27
- locales.delete(key)
28
- locales.concat(a)
29
- end
30
- end
31
- return Sass::Script::Bool.new(locales.include?(locale) || locales.include?(language) || locales.include?(territory))
11
+ def locale
12
+ return Sass::Script::String.new(Compass.configuration.locale || 'en_US')
32
13
  end
33
14
 
34
15
  #
35
- # test a list of locales against the current locale (this is now just an alias for locales(), for back-compat)
16
+ # test a list of locales against the current locale (supports an alias map)
36
17
  #
37
18
  # *Parameters*:
38
19
  # - <tt>$locales</tt> {List} the list of locales to test
@@ -40,9 +21,16 @@ module Archetype::SassExtensions::Locale
40
21
  # - {Boolean} is the current locale in the list or not
41
22
  #
42
23
  def lang(locales)
43
- return locale(locales)
24
+ locales = locales.to_a.collect{|i| i.to_s}
25
+ locales.each do |key|
26
+ if a = locale_aliases[key]
27
+ locales.delete(key)
28
+ locales.concat(a)
29
+ end
30
+ end
31
+ return Sass::Script::Bool.new(locales.include?(locale.to_s))
44
32
  end
45
-
33
+
46
34
  #
47
35
  # get the current reading direction
48
36
  #
@@ -55,9 +43,6 @@ module Archetype::SassExtensions::Locale
55
43
  end
56
44
 
57
45
  private
58
-
59
- LOCALE_PATTERN = /([a-z]{2})[-_]?([a-z]{2}?)/i
60
-
61
46
  #
62
47
  # provides an alias mapping for locale names
63
48
  #
@@ -67,9 +52,8 @@ private
67
52
  # TODO - make this easily extensible
68
53
  def locale_aliases
69
54
  if @locale_aliases.nil?
70
- a = {
71
- 'CJK' => ['ja_JP', 'ko_KR', 'zh_TW', 'zh_CN']
72
- }
55
+ a = {}
56
+ a['CJK'] = ['ja_JP', 'ko_KR', 'zh_TW', 'zh_CN']
73
57
  @locale_aliases = a
74
58
  end
75
59
  return @locale_aliases
@@ -15,13 +15,10 @@ module Archetype::SassExtensions::Styleguide
15
15
  DEFAULT = 'default'
16
16
  REGEX = 'regex'
17
17
  SPECIAL = %w(states selectors)
18
- DROPALL = %w(all true)
19
18
  # these are unique CSS keys that can be exploited to provide fallback functionality by providing a second value
20
19
  # e.g color: red; color: rgba(255,0,0, 0.8);
21
- FALLBACKS = %w(background background-image background-color border border-bottom border-bottom-color border-color border-left border-left-color border-right border-right-color border-top border-top-color clip color layer-background-color outline outline-color white-space extend)
22
- # these are mixins that make sense to run multiple times within a block
23
- MULTIMIXINS = %w(target-browser)
24
- ADDITIVES = FALLBACKS + [DROP, INHERIT, STYLEGUIDE] + MULTIMIXINS
20
+ FALLBACKS = %w(background background-image background-color border border-bottom border-bottom-color border-color border-left border-left-color border-right border-right-color border-top border-top-color clip color layer-background-color outline outline-color white-space)
21
+ ADDITIVES = FALLBACKS + [DROP, INHERIT, STYLEGUIDE]
25
22
  @@archetype_styleguide_mutex = Mutex.new
26
23
  # :startdoc:
27
24
 
@@ -79,7 +76,7 @@ module Archetype::SassExtensions::Styleguide
79
76
  extensions = theme[:extensions]
80
77
  return Sass::Script::Bool.new(false) if component_exists(id, theme, extension, force)
81
78
  extensions.push(extension)
82
- components[id] = (components[id] ||= Archetype::Hash.new).rmerge(helpers.list_to_hash(data, 1, SPECIAL, ADDITIVES))
79
+ components[id] = (components[id] ||= {}).rmerge(helpers.list_to_hash(data, 1, SPECIAL, ADDITIVES))
83
80
  return Sass::Script::Bool.new(true)
84
81
  end
85
82
  end
@@ -101,7 +98,7 @@ module Archetype::SassExtensions::Styleguide
101
98
  #
102
99
  def styleguide_component_exists(id, theme = nil, extension = nil, force = false)
103
100
  @@archetype_styleguide_mutex.synchronize do
104
- extension = helpers.to_str(extension).hash if not extension.nil?
101
+ extension = helpers.to_str(extension) if not extension.nil?
105
102
  return Sass::Script::Bool.new( component_exists(id, theme, extension, force) )
106
103
  end
107
104
  end
@@ -226,34 +223,29 @@ private
226
223
  #
227
224
  def extract_styles(id, modifiers, strict = false, theme = nil, context = nil)
228
225
  theme = get_theme(theme)
229
- context ||= theme[:components][id] || Archetype::Hash.new
226
+ context ||= theme[:components][id] || {}
230
227
  modifiers = helpers.to_str(modifiers)
231
- return Archetype::Hash.new if context.nil? or context.empty?
228
+ return {} if context.nil? or context.empty?
232
229
  # push on the defaults first
233
- out = (strict ? resolve_dependents(id, context[modifiers], theme[:name], context) : context[DEFAULT]) || Archetype::Hash.new
230
+ out = (strict ? resolve_dependents(id, context[modifiers], theme[:name], context) : context[DEFAULT]) || {}
234
231
  out = out.clone
235
232
  # if it's not strict, find anything that matched
236
233
  if not strict
237
234
  modifiers = modifiers.split
238
- context.each do |key, definition|
239
- definition = [key, definition]
235
+ context.each do |definition|
240
236
  modifier = definition[0]
241
237
  if modifier != DEFAULT
242
238
  match = true
243
239
  modifier = modifier.split
244
240
  if modifier[0] == REGEX
245
241
  # if it's a regex pattern, test if it matches
246
- match = modifiers.join(' ') =~ /#{modifier[1].gsub(/\A"|"\Z/, '')}/i
242
+ match = modifiers.join(' ') =~ /#{modifiers[1].gsub(/\A"|"\Z/, '')}/i
247
243
  else
248
244
  # otherwise, if the modifier isn't in our list of modifiers, it's not valid and just move on
249
245
  modifier.each { |i| match = false if not modifiers.include?(i) }
250
246
  end
251
247
  # if it matched, process it
252
- if match
253
- tmp = resolve_dependents(id, definition[1], theme[:name], nil, out)
254
- out, tmp = post_resolve_drops(out, tmp)
255
- out = out.rmerge(tmp)
256
- end
248
+ out = out.rmerge(resolve_dependents(id, definition[1], theme[:name], nil, out.keys)) if match
257
249
  end
258
250
  end
259
251
  end
@@ -261,19 +253,15 @@ private
261
253
  # this lets us define special states and elements
262
254
  SPECIAL.each do |special_key|
263
255
  if out.is_a? Hash
264
- special = out[special_key] || Archetype::Hash.new
265
- if special == 'nil'
266
- out[special_key] = Archetype::Hash.new
267
- else
268
- tmp = Archetype::Hash.new
269
- special.each { |key, value| tmp[key] = extract_styles(key, key, true, theme[:name], special) }
270
- out[special_key] = tmp if not tmp.empty?
271
- end
256
+ special = out[special_key]
257
+ tmp = {}
258
+ (special || {}).each { |key, value| tmp[key] = extract_styles(key, key, true, theme[:name], special) }
259
+ out[special_key] = tmp if not tmp.empty?
272
260
  end
273
261
  end
274
262
  # check for nested styleguides
275
263
  styleguide = out[STYLEGUIDE]
276
- if not (styleguide.nil? or styleguide.empty?)
264
+ if styleguide and not styleguide.empty?
277
265
  styles = get_styles(styleguide, theme[:name])
278
266
  out.delete(STYLEGUIDE)
279
267
  out = styles.rmerge(out)
@@ -281,87 +269,6 @@ private
281
269
  return out
282
270
  end
283
271
 
284
- #
285
- # given two objects, resolve the chain of dropped styles
286
- # this runs after having already resolved the dropped styles and merged
287
- #
288
- # *Parameters*:
289
- # - <tt>obj</tt> {Hash} the source object
290
- # - <tt>merger</tt> {Hash} the object to be merged in
291
- # *Returns*:
292
- # - {Array.<Hash>} the resulting `obj` and `merger` objects
293
- #
294
- def post_resolve_drops(obj, merger)
295
- return [obj, merger] if obj.nil? or merger.nil?
296
- drop = merger[DROP]
297
- keys = obj.keys
298
- if not drop.nil?
299
- drop.to_a.each do |key|
300
- key = helpers.to_str(key)
301
- obj.delete(key) if not SPECIAL.include?(key)
302
- end
303
- merger.delete(DROP)
304
- else
305
- end
306
- SPECIAL.each do |special|
307
- if obj[special].is_a?(Hash) and merger[special].is_a?(Hash)
308
- obj[special], merger[special] = post_resolve_drops(obj[special], merger[special])
309
- end
310
- end
311
- return [obj, merger]
312
- end
313
-
314
- #
315
- # given two objects, resolve the chain of dropped styles
316
- #
317
- # *Parameters*:
318
- # - <tt>value</tt> {Hash} the source object
319
- # - <tt>obj</tt> {Hash} the object to be merged in
320
- # - <tt>is_special</tt> {Boolean} whether this is from a SPECIAL branch of a Hash
321
- # *Returns*:
322
- # - {Array.<Hash>} the resulting value
323
- #
324
- def resolve_drops(value, obj, is_special = false)
325
- return value if not (value.is_a?(Hash) and obj.is_a?(Hash))
326
- keys = obj.keys
327
- drop = value[DROP]
328
- if not drop.nil?
329
- tmp = Archetype::Hash.new
330
- if DROPALL.include?(helpers.to_str(drop))
331
- if not keys.nil?
332
- keys.each do |key|
333
- if SPECIAL.include?(key)
334
- if not (obj[key].nil? or obj[key].empty?)
335
- tmp[key] = Archetype::Hash.new
336
- tmp[key][DROP] = obj[key].keys
337
- end
338
- else
339
- tmp[key] = 'nil'
340
- end
341
- end
342
- end
343
- else
344
- drop.to_a.each do |key|
345
- key = helpers.to_str(key)
346
- if SPECIAL.include?(key)
347
- if not (obj[key].nil? or obj[key].empty?)
348
- tmp[key] = Archetype::Hash.new
349
- tmp[key][DROP] = obj[key].keys
350
- end
351
- else
352
- tmp[key] = 'nil'
353
- end
354
- end
355
- end
356
- value.delete(DROP) if not is_special
357
- value = tmp.rmerge(value)
358
- end
359
- value.each do |key|
360
- value[key] = resolve_drops(value[key], obj[key], key, SPECIAL.include?(key)) if not value[key].nil?
361
- end
362
- return value
363
- end
364
-
365
272
  #
366
273
  # resolve any dependent references from the component
367
274
  #
@@ -374,19 +281,33 @@ private
374
281
  # *Returns*:
375
282
  # - {Hash} a hash of the resolved styles
376
283
  #
377
- def resolve_dependents(id, value, theme = nil, context = nil, obj = nil)
284
+ def resolve_dependents(id, value, theme = nil, context = nil, keys = nil)
378
285
  # we have to create a clone here as the passed in value is volatile and we're performing destructive changes
379
286
  value = value.clone
380
287
  # check that we're dealing with a hash
381
288
  if value.is_a?(Hash)
382
289
  # check for dropped styles
383
- value = resolve_drops(value, obj)
384
-
290
+ drop = value[DROP]
291
+ if not drop.nil?
292
+ tmp = {}
293
+ if %w(all true).include?(helpers.to_str(drop)) and not keys.nil? and not keys.empty?
294
+ keys.each do |key|
295
+ tmp[key] = 'nil'
296
+ end
297
+ else
298
+ drop = drop.to_a
299
+ drop.each do |key|
300
+ tmp[helpers.to_str(key)] = 'nil'
301
+ end
302
+ end
303
+ value.delete(DROP)
304
+ value = tmp.rmerge(value)
305
+ end
385
306
  # check for inheritance
386
307
  inherit = value[INHERIT]
387
- if not (inherit.nil? or inherit.empty?)
308
+ if inherit and not inherit.empty?
388
309
  # create a temporary object and extract the nested styles
389
- tmp = Archetype::Hash.new
310
+ tmp = {}
390
311
  inherit.each { |related| tmp = tmp.rmerge(extract_styles(id, related, true, theme, context)) }
391
312
  # remove the inheritance key and update the styles
392
313
  value.delete(INHERIT)
@@ -407,18 +328,14 @@ private
407
328
  #
408
329
  def get_theme(theme)
409
330
  theme_name = helpers.to_str(theme || 'archetype')
410
- theme = _get_persisted_theme(theme_name)
331
+ @@styleguide_themes ||= {}
332
+ theme = @@styleguide_themes[theme_name] ||= {}
411
333
  theme[:name] ||= theme_name
412
334
  theme[:components] ||= {}
413
335
  theme[:extensions] ||= []
414
336
  return theme
415
337
  end
416
338
 
417
- def _get_persisted_theme(theme_name)
418
- theme = Thread.current[:styleguide_themes] ||= {}
419
- theme[theme_name] ||= {}
420
- end
421
-
422
339
  #
423
340
  # driver method for converting a sentence into a list of styles
424
341
  #
@@ -431,8 +348,9 @@ private
431
348
  #
432
349
  def get_styles(description, theme = nil, state = 'false')
433
350
  state = helpers.to_str(state)
434
- styles = Archetype::Hash.new
435
- description.to_a.each do |sentence|
351
+ description = description.to_a
352
+ styles = {}
353
+ description.each do |sentence|
436
354
  # get the grammar from the sentence
437
355
  id, modifiers, token = grammar(sentence, theme, state)
438
356
  if id