archetype 1.0.0.alpha.2 → 1.0.0.alpha.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +67 -3
- data/README.md +1 -1
- data/VERSION +1 -1
- data/lib/archetype.rb +4 -0
- data/lib/archetype/actions/migrate.rb +10 -0
- data/lib/archetype/extensions.rb +35 -1
- data/lib/archetype/functions/helpers.rb +8 -0
- data/lib/archetype/functions/styleguide_memoizer.rb +1 -1
- data/lib/archetype/sass_extensions/functions/environment.rb +1 -1
- data/lib/archetype/sass_extensions/functions/lists.rb +2 -1
- data/lib/archetype/sass_extensions/functions/styleguide.rb +45 -88
- data/lib/archetype/sass_extensions/functions/styleguide/components.rb +230 -1
- data/lib/archetype/sass_extensions/functions/styleguide/constants.rb +0 -1
- data/lib/archetype/sass_extensions/functions/styleguide/grammar.rb +66 -5
- data/lib/archetype/sass_extensions/functions/styleguide/helpers.rb +36 -1
- data/lib/archetype/sass_extensions/functions/styleguide/resolve.rb +12 -2
- data/lib/archetype/sass_extensions/functions/styleguide/styles.rb +6 -3
- data/lib/archetype/sass_extensions/functions/styleguide/themes.rb +2 -1
- data/lib/archetype/sass_extensions/functions/ui/glyphs.rb +1 -1
- data/lib/archetype/sass_extensions/functions/ui/scopes.rb +4 -4
- data/lib/archetype/sass_extensions/functions/util/debug.rb +1 -1
- data/lib/archetype/sass_extensions/functions/util/hacks.rb +4 -8
- data/lib/archetype/sass_extensions/functions/util/images.rb +11 -8
- data/lib/archetype/sass_extensions/functions/util/misc.rb +34 -1
- data/lib/archetype/sass_extensions/functions/util/spacing.rb +1 -1
- data/stylesheets/archetype/hacks/_hacks.scss +1 -1
- data/stylesheets/archetype/styleguide/_styleguide.scss +2 -0
- data/stylesheets/archetype/util/_styles.scss +165 -125
- data/stylesheets/archetype/util/_targeting.scss +62 -54
- data/templates/example/screen.scss +2 -0
- data/templates/project/manifest.rb +1 -1
- metadata +24 -12
@@ -20,7 +20,6 @@ module Archetype::SassExtensions::Styleguide
|
|
20
20
|
MULTIMIXINS = %w(target-browser)
|
21
21
|
# NOTE: these are no longer used/needed if you're using the map structures
|
22
22
|
ADDITIVES = FALLBACKS + [DROP, INHERIT, STYLEGUIDE] + MULTIMIXINS
|
23
|
-
@@archetype_styleguide_mutex = Mutex.new
|
24
23
|
@@styleguide_themes ||= nil
|
25
24
|
# :startdoc:
|
26
25
|
|
@@ -1,5 +1,35 @@
|
|
1
1
|
module Archetype::SassExtensions::Styleguide
|
2
2
|
|
3
|
+
#
|
4
|
+
# exposes the grammar used when interpreting styleguide calls
|
5
|
+
#
|
6
|
+
# *Parameters*:
|
7
|
+
# - <tt>sentence</tt> {String|List} the sentence describing the component
|
8
|
+
# - <tt>theme</tt> {String} the theme to use
|
9
|
+
# - <tt>state</tt> {String} the name of a state to return
|
10
|
+
# *Returns*:
|
11
|
+
# - {Map} a map including the `identifier` and `modifiers`
|
12
|
+
def _styleguide_grammar(sentence, theme = nil, state = nil)
|
13
|
+
keys = ['identifier', 'modifiers', 'token']
|
14
|
+
id, modifiers, token = grammar(sentence, theme, state)
|
15
|
+
|
16
|
+
# if the id is empty, then it means that the sentence didn't contain a valid component id
|
17
|
+
# so we set everything to `null`
|
18
|
+
unless id
|
19
|
+
id = null
|
20
|
+
modifiers = null
|
21
|
+
# otherwise we ensure that we're sending back appropriate values
|
22
|
+
else
|
23
|
+
id = identifier(id)
|
24
|
+
modifiers = modifiers.empty? ? null : list(modifiers.map{|m| identifier(m)}, :space)
|
25
|
+
end
|
26
|
+
|
27
|
+
return Sass::Script::Value::Map.new({
|
28
|
+
identifier('identifier') => id,
|
29
|
+
identifier('modifiers') => modifiers
|
30
|
+
});
|
31
|
+
end
|
32
|
+
|
3
33
|
private
|
4
34
|
|
5
35
|
#
|
@@ -13,11 +43,28 @@ module Archetype::SassExtensions::Styleguide
|
|
13
43
|
# - {Array} an array containing the identifer, modifiers, and a token
|
14
44
|
#
|
15
45
|
def grammar(sentence, theme = nil, state = nil)
|
46
|
+
_styleguide_debug "converting `#{sentence}` to grammar", :grammar
|
16
47
|
theme = get_theme(theme)
|
17
48
|
components = theme[:components]
|
18
49
|
# get a list of valid ids
|
19
50
|
styleguideIds = components.keys
|
20
|
-
|
51
|
+
|
52
|
+
# convert the sentence to a string and then split into an array
|
53
|
+
# this ensures that all the pieces are treated as strings and not other primitive types (e.g. a list of strings in the middle of a sentence)
|
54
|
+
sentence = helpers.to_str(sentence).split
|
55
|
+
|
56
|
+
# update the sentence to be aware of it's current styleguide context
|
57
|
+
withins = []
|
58
|
+
styleguide_stack.reverse_each do |context|
|
59
|
+
sentence << 'in'
|
60
|
+
context = context.to_a
|
61
|
+
sentence.concat(context)
|
62
|
+
withins.concat(context)
|
63
|
+
end
|
64
|
+
unless withins.empty?
|
65
|
+
sentence << 'within'
|
66
|
+
sentence.concat(withins)
|
67
|
+
end
|
21
68
|
|
22
69
|
id, modifiers = grammarize(sentence, styleguideIds)
|
23
70
|
|
@@ -30,6 +77,13 @@ module Archetype::SassExtensions::Styleguide
|
|
30
77
|
# maybe in the case where we're looking for strict keys on the lookup?
|
31
78
|
modifiers = modifiers.uniq
|
32
79
|
token = memoizer.tokenize(theme[:name], extensions, id, modifiers, state)
|
80
|
+
if id
|
81
|
+
_styleguide_debug "the computed grammar is...", :grammar
|
82
|
+
_styleguide_debug " identifier: #{id}", :grammar
|
83
|
+
unless modifiers.empty?
|
84
|
+
_styleguide_debug " modifiers: #{modifiers.join(', ')}", :grammar
|
85
|
+
end
|
86
|
+
end
|
33
87
|
return id, modifiers, token
|
34
88
|
end
|
35
89
|
|
@@ -46,7 +100,7 @@ module Archetype::SassExtensions::Styleguide
|
|
46
100
|
sentence = sentence.to_a
|
47
101
|
id = nil
|
48
102
|
modifiers = []
|
49
|
-
|
103
|
+
unless sentence.empty?
|
50
104
|
prefix = ''
|
51
105
|
order = ''
|
52
106
|
# these define various attributes for modifiers (e.g. `button with a shadow`)
|
@@ -54,16 +108,23 @@ module Archetype::SassExtensions::Styleguide
|
|
54
108
|
# these are things that are useless to us, so we just leave them out
|
55
109
|
ignore = %w(a an also the this that is was it)
|
56
110
|
# these are our context switches (e.g. `headline in a button`)
|
57
|
-
|
111
|
+
local_contexts = %w(in)
|
112
|
+
# these are the contexts that match all surrounding items
|
113
|
+
global_contexts = %w(within)
|
114
|
+
|
58
115
|
sentence.each do |item|
|
59
116
|
item = item.value if not item.is_a?(String)
|
60
117
|
# find the ID
|
61
118
|
if id.nil? and ids.include?(item) and prefix.empty? and order.empty?
|
62
119
|
id = item
|
63
|
-
# if it's a `context`, we need to increase the depth and reset the prefix
|
64
|
-
elsif
|
120
|
+
# if it's a `local context`, we need to increase the depth and reset the prefix
|
121
|
+
elsif local_contexts.include?(item)
|
65
122
|
order = "#{item}-#{order}"
|
66
123
|
prefix = ''
|
124
|
+
# if it's a `global context`, we need to reset the order, but also update the prefix
|
125
|
+
elsif global_contexts.include?(item)
|
126
|
+
order = ''#"#{item}-"
|
127
|
+
prefix = "#{item}-"
|
67
128
|
# if it's an `extra`, we update the prefix
|
68
129
|
elsif extras.include?(item)
|
69
130
|
prefix = "#{item}-"
|
@@ -6,6 +6,41 @@ module Archetype::SassExtensions::Styleguide
|
|
6
6
|
Archetype::Functions::StyleguideMemoizer
|
7
7
|
end
|
8
8
|
|
9
|
+
#
|
10
|
+
# ouputs a debug message for styleguide / component methods
|
11
|
+
#
|
12
|
+
# valid types...
|
13
|
+
# :get, :get_granular, :diff, :add, :extend, :remove, :freeze, :grammar, :drop, :inherit, :resolve, :extract
|
14
|
+
#
|
15
|
+
def _styleguide_debug(msg, type = :all)
|
16
|
+
debug = Compass.configuration.styleguide_debug
|
17
|
+
debug = :all if debug == true
|
18
|
+
debug = [debug] unless debug.is_a? Array
|
19
|
+
if debug.include?(type) || debug.include?(:all)
|
20
|
+
begin
|
21
|
+
if msg.is_a? String
|
22
|
+
helpers.debug("[archetype:styleguide] #{msg}")
|
23
|
+
else
|
24
|
+
puts ">" * 50
|
25
|
+
pp msg
|
26
|
+
puts "<" * 50
|
27
|
+
end
|
28
|
+
rescue
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# helper for operations that need to happen within a mutex
|
35
|
+
#
|
36
|
+
def _styleguide_mutex_helper(id = nil, theme = nil)
|
37
|
+
(@@archetype_styleguide_mutex ||= Mutex.new).synchronize do
|
38
|
+
if block_given?
|
39
|
+
id.nil? ? yield : yield(helpers.to_str(id), get_theme(theme))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
9
44
|
#
|
10
45
|
# normalize the styleguide definition into a hash representative of the definition
|
11
46
|
#
|
@@ -24,7 +59,7 @@ module Archetype::SassExtensions::Styleguide
|
|
24
59
|
end
|
25
60
|
|
26
61
|
def self.reset!(filename = nil)
|
27
|
-
@@archetype_styleguide_mutex.synchronize do
|
62
|
+
(@@archetype_styleguide_mutex ||= Mutex.new).synchronize do
|
28
63
|
if filename.nil?
|
29
64
|
@@styleguide_themes = {}
|
30
65
|
else
|
@@ -22,7 +22,10 @@ module Archetype::SassExtensions::Styleguide
|
|
22
22
|
if not drop.nil?
|
23
23
|
drop.to_a.each do |key|
|
24
24
|
key = helpers.to_str(key)
|
25
|
-
|
25
|
+
if not SPECIAL.include?(key)
|
26
|
+
_styleguide_debug "dropping styles for `#{key}`", :drop
|
27
|
+
obj.delete(key)
|
28
|
+
end
|
26
29
|
end
|
27
30
|
merger.delete(DROP)
|
28
31
|
end
|
@@ -84,6 +87,7 @@ module Archetype::SassExtensions::Styleguide
|
|
84
87
|
# - <tt>key</tt> {String} the key we care about
|
85
88
|
#
|
86
89
|
def special_drop_key(obj, tmp, key)
|
90
|
+
_styleguide_debug "dropping styles for `#{key}`", :drop
|
87
91
|
if SPECIAL.include?(key)
|
88
92
|
if not (obj[key].nil? or obj[key].empty?)
|
89
93
|
tmp[key] = Archetype::Hash.new
|
@@ -108,6 +112,7 @@ module Archetype::SassExtensions::Styleguide
|
|
108
112
|
#
|
109
113
|
def resolve_dependents(id, value, theme = nil, context = nil, obj = nil)
|
110
114
|
return value if value.nil?
|
115
|
+
debug = Compass.configuration.styleguide_debug
|
111
116
|
# we have to create a clone here as the passed in value is volatile and we're performing destructive changes
|
112
117
|
value = value.clone
|
113
118
|
# check that we're dealing with a hash
|
@@ -126,7 +131,10 @@ module Archetype::SassExtensions::Styleguide
|
|
126
131
|
if not inherit.empty?
|
127
132
|
# create a temporary object and extract the nested styles
|
128
133
|
tmp = Archetype::Hash.new
|
129
|
-
inherit.each
|
134
|
+
inherit.each do |related|
|
135
|
+
_styleguide_debug "inheriting from `#{helpers.to_str(related)}`", :inherit
|
136
|
+
tmp = tmp.rmerge(extract_styles(id, related, true, theme, context))
|
137
|
+
end
|
130
138
|
# remove the inheritance key and update the styles
|
131
139
|
value.delete(INHERIT)
|
132
140
|
inherit = extract_styles(id, inherit, true, theme, context)
|
@@ -136,6 +144,8 @@ module Archetype::SassExtensions::Styleguide
|
|
136
144
|
end
|
137
145
|
end
|
138
146
|
# return whatever we got
|
147
|
+
_styleguide_debug "after resolving dependents...", :resolve
|
148
|
+
_styleguide_debug value, :resolve
|
139
149
|
return value
|
140
150
|
end
|
141
151
|
|
@@ -24,14 +24,15 @@ module Archetype::SassExtensions::Styleguide
|
|
24
24
|
out = out.clone
|
25
25
|
return Archetype::Hash.new if out == null
|
26
26
|
# if it's not strict, find anything that matched
|
27
|
-
|
27
|
+
unless strict
|
28
28
|
modifiers = modifiers.split
|
29
29
|
context.each do |key, definition|
|
30
30
|
modifier = grammarize(key.split(' '))[1].join(' ')
|
31
|
-
|
31
|
+
unless modifier == DEFAULT
|
32
32
|
match = true
|
33
33
|
modifier = modifier.split
|
34
34
|
if modifier[0] == REGEX
|
35
|
+
_styleguide_debug "finding regex matches", :extract
|
35
36
|
# if it's a regex pattern, test if it matches
|
36
37
|
match = modifiers.join(' ') =~ /#{modifier[1].gsub(/\A"|"\Z/, '')}/i
|
37
38
|
else
|
@@ -40,6 +41,7 @@ module Archetype::SassExtensions::Styleguide
|
|
40
41
|
end
|
41
42
|
# if it matched, process it
|
42
43
|
if match
|
44
|
+
_styleguide_debug "`#{key}` is a matching variant", :extract
|
43
45
|
tmp = resolve_dependents(id, definition, theme[:name], nil, out)
|
44
46
|
out, tmp = post_resolve_drops(out, tmp)
|
45
47
|
out = out.rmerge(tmp) if not helpers.is_value(tmp, :nil)
|
@@ -112,13 +114,14 @@ module Archetype::SassExtensions::Styleguide
|
|
112
114
|
extracted = extract_styles(id, modifiers, false, theme)
|
113
115
|
# we can delete anything that had a value of `nil` as we won't be outputting those
|
114
116
|
extracted.delete_if { |k,v| helpers.is_value(v, :nil) }
|
117
|
+
_styleguide_debug extracted, :get_granular
|
115
118
|
# expose the result to the block
|
116
119
|
extracted
|
117
120
|
end
|
118
121
|
styles = styles.rmerge(extracted)
|
119
122
|
elsif not helpers.is_value(sentence, :nil)
|
120
123
|
msg = modifiers.length > 0 ? "please specify one of: #{modifiers.sort.join(', ')}" : "there are no registered components"
|
121
|
-
helpers.warn("[#{Archetype.name}:styleguide:
|
124
|
+
helpers.warn("[#{Archetype.name}:styleguide:identifier] `#{helpers.to_str(sentence)}` does not contain an identifier. #{msg}")
|
122
125
|
end
|
123
126
|
end
|
124
127
|
|
@@ -21,7 +21,7 @@ module Archetype::SassExtensions::Styleguide
|
|
21
21
|
theme_name = helpers.to_str(theme || environment.var('CONFIG_THEME') || Archetype.name)
|
22
22
|
key = nil
|
23
23
|
begin
|
24
|
-
key = environment.options[:css_filename]
|
24
|
+
key = environment.options[:css_filename]
|
25
25
|
end
|
26
26
|
# if we're aggressively memoizing, store everything across the session
|
27
27
|
if Compass.configuration.memoize == :aggressive or not key
|
@@ -34,6 +34,7 @@ module Archetype::SassExtensions::Styleguide
|
|
34
34
|
theme[:name] ||= theme_name
|
35
35
|
theme[:components] ||= {}
|
36
36
|
theme[:extensions] ||= []
|
37
|
+
theme[:frozen] ||= Set.new
|
37
38
|
return theme
|
38
39
|
end
|
39
40
|
|
@@ -75,7 +75,7 @@ module Archetype::SassExtensions::UI::Glyphs
|
|
75
75
|
def register_glyph_library(key, library)
|
76
76
|
registry = archetype_glyphs_registry
|
77
77
|
# if it's already in the registry, just return the current list
|
78
|
-
if is_null(registry[key])
|
78
|
+
if helpers.is_null(registry[key])
|
79
79
|
registry = registry.dup
|
80
80
|
registry[key] = library
|
81
81
|
registry = Sass::Script::Value::Map.new(registry)
|
@@ -14,7 +14,7 @@ module Archetype::SassExtensions::UI::Scopes
|
|
14
14
|
# we need a dup as the Hash is frozen
|
15
15
|
breakpoints = registered_breakpoints.dup
|
16
16
|
force = force.nil? ? false : force.value
|
17
|
-
not_registered = breakpoints[key].nil? || is_null(breakpoints[key])
|
17
|
+
not_registered = breakpoints[key].nil? || helpers.is_null(breakpoints[key])
|
18
18
|
# if there's no key registered...
|
19
19
|
if force || not_registered
|
20
20
|
# just register the value
|
@@ -61,9 +61,9 @@ module Archetype::SassExtensions::UI::Scopes
|
|
61
61
|
modifier_separator = environment.var('CONFIG_BEM_MODIFIER_SEPARATOR')
|
62
62
|
modifier_separator = modifier_separator.nil? ? '--' : modifier_separator.value
|
63
63
|
|
64
|
-
context = is_null(context)
|
65
|
-
element = is_null(element)
|
66
|
-
modifier = is_null(modifier)
|
64
|
+
context = helpers.is_null(context) ? '' : context.value
|
65
|
+
element = helpers.is_null(element) ? nil : element.value
|
66
|
+
modifier = helpers.is_null(modifier) ? nil : modifier.value
|
67
67
|
|
68
68
|
selector = context
|
69
69
|
|
@@ -13,7 +13,7 @@ module Archetype::SassExtensions::Util::Debug
|
|
13
13
|
return bool(false) unless (environment.var('CONFIG_DEBUG_ENVS') || []).to_a.include?(archetype_env)
|
14
14
|
# then check if the debug flag/override is truthy
|
15
15
|
# if the param is non-null, then use it
|
16
|
-
return iff unless is_null(iff)
|
16
|
+
return iff unless helpers.is_null(iff)
|
17
17
|
# otherwise, use `CONFIG_DEBUG`
|
18
18
|
return environment.var('CONFIG_DEBUG') || bool(false)
|
19
19
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Archetype::SassExtensions::Util::Hacks
|
2
2
|
|
3
3
|
#
|
4
|
-
# parse a CSS content string and format it for injection into
|
4
|
+
# parse a CSS content string and format it for injection into innerText
|
5
5
|
#
|
6
6
|
# *Parameters*:
|
7
7
|
# - <tt>$content</tt> {String} the CSS content string
|
@@ -10,14 +10,10 @@ module Archetype::SassExtensions::Util::Hacks
|
|
10
10
|
#
|
11
11
|
def _ie_pseudo_content(content)
|
12
12
|
content = helpers.to_str(content)
|
13
|
-
#
|
14
|
-
content
|
15
|
-
# convert char codes (and remove single trailing whitespace if present) (e.g. \2079 -> ⁹)
|
16
|
-
content = content.gsub(/\\([\da-fA-F]{4})\s?/, '&#x\1;')
|
17
|
-
# escape tags and cleanup quotes
|
18
|
-
content = content.gsub(/\</, '<').gsub(/\>/, '>')
|
13
|
+
# convert char codes (e.g. `\2079` -> `\u2079`)
|
14
|
+
content.gsub!(/\\([\da-fA-F]{4})\s?/, ['\1'.hex].pack('U*'))
|
19
15
|
# cleanup quotes
|
20
|
-
content
|
16
|
+
content.gsub!(/\A"|"\Z/, '').gsub!(/\"/, '\\"')
|
21
17
|
return identifier(content)
|
22
18
|
end
|
23
19
|
|
@@ -24,8 +24,7 @@ module Archetype::SassExtensions::Util::Images
|
|
24
24
|
# - {Boolean} is the sprite set
|
25
25
|
#
|
26
26
|
def _archetype_check_sprite(map)
|
27
|
-
|
28
|
-
return bool(status)
|
27
|
+
return bool(_is_sprite_valid(map))
|
29
28
|
end
|
30
29
|
Sass::Script::Functions.declare :_archetype_check_sprite, [:map]
|
31
30
|
|
@@ -41,7 +40,7 @@ module Archetype::SassExtensions::Util::Images
|
|
41
40
|
# - {Sprite} the sprite object or `null`
|
42
41
|
#
|
43
42
|
def _archetype_sprite(map, sprite, offset_x = number(0), offset_y = number(0))
|
44
|
-
return null unless
|
43
|
+
return null unless _is_sprite_valid(map)
|
45
44
|
return sprite(map, sprite, offset_x, offset_y)
|
46
45
|
end
|
47
46
|
Sass::Script::Functions.declare :_archetype_sprite, [:map, :sprite, :offset_x, :offset_y]
|
@@ -58,7 +57,7 @@ module Archetype::SassExtensions::Util::Images
|
|
58
57
|
# - {List} the sprite position or `null`
|
59
58
|
#
|
60
59
|
def _archetype_sprite_position(map, sprite, offset_x = number(0), offset_y = number(0))
|
61
|
-
return null unless
|
60
|
+
return null unless _is_sprite_valid(map)
|
62
61
|
return sprite_position(map, sprite, offset_x, offset_y)
|
63
62
|
end
|
64
63
|
Sass::Script::Functions.declare :_archetype_sprite_position, [:map, :sprite, :offset_x, :offset_y]
|
@@ -72,7 +71,7 @@ module Archetype::SassExtensions::Util::Images
|
|
72
71
|
# - {String} the sprite URL or `null`
|
73
72
|
#
|
74
73
|
def _archetype_sprite_url(map)
|
75
|
-
return null unless
|
74
|
+
return null unless _is_sprite_valid(map)
|
76
75
|
return sprite_url(map)
|
77
76
|
end
|
78
77
|
Sass::Script::Functions.declare :_archetype_sprite_url, [:map]
|
@@ -87,7 +86,7 @@ module Archetype::SassExtensions::Util::Images
|
|
87
86
|
# - {ImageFile} the image or `null`
|
88
87
|
#
|
89
88
|
def _archetype_sprite_file(map, sprite)
|
90
|
-
return null unless
|
89
|
+
return null unless _is_sprite_valid(map)
|
91
90
|
return sprite_file(map, sprite)
|
92
91
|
end
|
93
92
|
Sass::Script::Functions.declare :_archetype_sprite_file, [:map, :sprite]
|
@@ -102,7 +101,7 @@ module Archetype::SassExtensions::Util::Images
|
|
102
101
|
# - {Number} the width of the image or `null`
|
103
102
|
#
|
104
103
|
def _archetype_image_width(image)
|
105
|
-
return null if is_null(image)
|
104
|
+
return null if helpers.is_null(image)
|
106
105
|
return image_width(image)
|
107
106
|
end
|
108
107
|
Sass::Script::Functions.declare :_archetype_image_width, [:image]
|
@@ -117,13 +116,17 @@ module Archetype::SassExtensions::Util::Images
|
|
117
116
|
# - {Number} the height of the image or `null`
|
118
117
|
#
|
119
118
|
def _archetype_image_height(image)
|
120
|
-
return null if is_null(image)
|
119
|
+
return null if helpers.is_null(image)
|
121
120
|
return image_height(image)
|
122
121
|
end
|
123
122
|
Sass::Script::Functions.declare :_archetype_image_height, [:image]
|
124
123
|
|
125
124
|
private
|
126
125
|
|
126
|
+
def _is_sprite_valid(map)
|
127
|
+
return !global_sprites_disabled? && !(helpers.is_null(map) || !map.value)
|
128
|
+
end
|
129
|
+
|
127
130
|
def global_sprites_disabled?
|
128
131
|
sprites_disabled = environment.var('CONFIG_DISABLE_STYLEGUIDE_SPRITES')
|
129
132
|
return sprites_disabled.respond_to?(:value) ? sprites_disabled.value : false
|
@@ -124,7 +124,7 @@ module Archetype::SassExtensions::Util::Misc
|
|
124
124
|
def do_once(name)
|
125
125
|
registry = do_once_registry
|
126
126
|
# if it's already in the registry, just return `false`
|
127
|
-
return bool(false) if
|
127
|
+
return bool(false) if registry.include?(name)
|
128
128
|
# update the registry with the identifier
|
129
129
|
registry = list(registry.dup.push(name), :comma)
|
130
130
|
environment.global_env.set_var('REGISTRY_DO_ONCE', registry)
|
@@ -202,6 +202,35 @@ module Archetype::SassExtensions::Util::Misc
|
|
202
202
|
return best_match
|
203
203
|
end
|
204
204
|
|
205
|
+
def _archetype_within_mixin(contexts)
|
206
|
+
stack = archetype_mixin_stack
|
207
|
+
contexts = contexts.is_a?(Sass::Script::Value::List) ? contexts.to_a : [contexts]
|
208
|
+
contexts.each do |context|
|
209
|
+
return bool(true) if stack.include?(context.to_s.gsub(/_/, '-').downcase )
|
210
|
+
end
|
211
|
+
return bool(false)
|
212
|
+
end
|
213
|
+
|
214
|
+
def _archetype_mixin_called_recursively()
|
215
|
+
stack = archetype_mixin_stack
|
216
|
+
current = stack.shift
|
217
|
+
return bool(stack.include?(current))
|
218
|
+
end
|
219
|
+
|
220
|
+
#
|
221
|
+
# normalizes a property
|
222
|
+
#
|
223
|
+
# *Parameters*:
|
224
|
+
# - <tt>$property</tt> {String} the property
|
225
|
+
# *Returns*:
|
226
|
+
# - {String} the normalized property
|
227
|
+
#
|
228
|
+
def _archetype_normalize_property(property)
|
229
|
+
return null if helpers.is_null(property)
|
230
|
+
property = helpers.to_str(property)
|
231
|
+
return identifier(property.gsub(/\:.*/, ''))
|
232
|
+
end
|
233
|
+
|
205
234
|
private
|
206
235
|
|
207
236
|
@@archetype_ui_mutex = Mutex.new
|
@@ -213,6 +242,10 @@ private
|
|
213
242
|
end
|
214
243
|
end
|
215
244
|
|
245
|
+
def archetype_mixin_stack
|
246
|
+
@environment.stack.frames.select {|f| f.is_mixin?}.reverse!.map! {|f| f.name.gsub(/_/, '-').downcase }
|
247
|
+
end
|
248
|
+
|
216
249
|
def do_once_registry
|
217
250
|
(environment.var('REGISTRY_DO_ONCE') || []).to_a
|
218
251
|
end
|