archetype 0.0.1.pre.13 → 1.0.0.alpha.1
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 +97 -24
- data/README.md +11 -5
- data/VERSION +1 -0
- data/lib/archetype.rb +30 -18
- data/lib/archetype/actions/migrate.rb +152 -0
- data/lib/archetype/actions/theme.rb +6 -7
- data/lib/archetype/executor.rb +21 -7
- data/lib/archetype/extensions.rb +57 -0
- data/lib/archetype/functions.rb +2 -3
- data/lib/archetype/functions/css.rb +70 -0
- data/lib/archetype/functions/css/constants.rb +247 -0
- data/lib/archetype/functions/css/helpers.rb +265 -0
- data/lib/archetype/functions/css/routers.rb +28 -0
- data/lib/archetype/functions/css/routers/animation.rb +55 -0
- data/lib/archetype/functions/css/routers/background.rb +38 -0
- data/lib/archetype/functions/css/routers/border.rb +151 -0
- data/lib/archetype/functions/css/routers/list.rb +63 -0
- data/lib/archetype/functions/css/routers/margin_padding.rb +40 -0
- data/lib/archetype/functions/css/routers/outline.rb +56 -0
- data/lib/archetype/functions/css/routers/overflow.rb +11 -0
- data/lib/archetype/functions/css/routers/target.rb +38 -0
- data/lib/archetype/functions/css/routers/transition.rb +48 -0
- data/lib/archetype/functions/css/shorthands.rb +43 -0
- data/lib/archetype/functions/css/shorthands/animation.rb +18 -0
- data/lib/archetype/functions/css/shorthands/background.rb +68 -0
- data/lib/archetype/functions/css/shorthands/border.rb +102 -0
- data/lib/archetype/functions/hash.rb +3 -149
- data/lib/archetype/functions/hash/extend.rb +74 -0
- data/lib/archetype/functions/hash/shim.rb +48 -0
- data/lib/archetype/functions/helpers.rb +231 -22
- data/lib/archetype/functions/styleguide_memoizer.rb +18 -1
- data/lib/archetype/sass_extensions.rb +1 -3
- data/lib/archetype/sass_extensions/functions.rb +15 -1
- data/lib/archetype/sass_extensions/functions/environment.rb +152 -1
- data/lib/archetype/sass_extensions/functions/lists.rb +95 -45
- data/lib/archetype/sass_extensions/functions/locale.rb +107 -28
- data/lib/archetype/sass_extensions/functions/numbers.rb +118 -4
- data/lib/archetype/sass_extensions/functions/strings.rb +53 -0
- data/lib/archetype/sass_extensions/functions/styleguide.rb +43 -375
- data/lib/archetype/sass_extensions/functions/styleguide/components.rb +25 -0
- data/lib/archetype/sass_extensions/functions/styleguide/constants.rb +27 -0
- data/lib/archetype/sass_extensions/functions/styleguide/grammar.rb +80 -0
- data/lib/archetype/sass_extensions/functions/styleguide/helpers.rb +36 -0
- data/lib/archetype/sass_extensions/functions/styleguide/resolve.rb +159 -0
- data/lib/archetype/sass_extensions/functions/styleguide/styles.rb +146 -0
- data/lib/archetype/sass_extensions/functions/styleguide/themes.rb +40 -0
- data/lib/archetype/sass_extensions/functions/ui.rb +7 -57
- data/lib/archetype/sass_extensions/functions/ui/glyphs.rb +118 -0
- data/lib/archetype/sass_extensions/functions/ui/scopes.rb +96 -0
- data/lib/archetype/sass_extensions/functions/util.rb +14 -0
- data/lib/archetype/sass_extensions/functions/util/debug.rb +22 -0
- data/lib/archetype/sass_extensions/functions/util/hacks.rb +44 -0
- data/lib/archetype/sass_extensions/functions/util/images.rb +132 -0
- data/lib/archetype/sass_extensions/functions/util/misc.rb +220 -0
- data/lib/archetype/sass_extensions/functions/util/spacing.rb +83 -0
- data/lib/archetype/sass_extensions/functions/version.rb +12 -17
- data/lib/archetype/version.rb +1 -1
- data/stylesheets/archetype/_config.scss +1 -389
- data/stylesheets/archetype/_core.scss +15 -0
- data/stylesheets/archetype/_hacks.scss +4 -120
- data/stylesheets/archetype/_init.scss +4 -22
- data/stylesheets/archetype/_required.scss +3 -0
- data/stylesheets/archetype/_reset.scss +3 -0
- data/stylesheets/archetype/_styleguide.scss +2 -6
- data/stylesheets/archetype/_ui.scss +2 -358
- data/stylesheets/archetype/_util.scss +3 -10
- data/stylesheets/archetype/config/_core.scss +14 -0
- data/stylesheets/archetype/config/_environment.scss +19 -0
- data/stylesheets/archetype/config/_formatting.scss +63 -0
- data/stylesheets/archetype/config/_glyphs.scss +252 -0
- data/stylesheets/archetype/config/_resets.scss +7 -0
- data/stylesheets/archetype/config/_resolution.scss +3 -0
- data/stylesheets/archetype/config/_spacing.scss +5 -0
- data/stylesheets/archetype/config/_targeting.scss +18 -0
- data/stylesheets/archetype/config/_theme.scss +3 -0
- data/stylesheets/archetype/config/_typography.scss +56 -0
- data/stylesheets/archetype/config/_units.scss +2 -0
- data/stylesheets/archetype/config/_vars.scss +10 -0
- data/stylesheets/archetype/hacks/_core.scss +4 -0
- data/stylesheets/archetype/hacks/_hacks.scss +160 -0
- data/stylesheets/archetype/hacks/_init.scss +2 -0
- data/stylesheets/archetype/styleguide/_core.scss +4 -0
- data/stylesheets/archetype/styleguide/_init.scss +1 -0
- data/stylesheets/archetype/styleguide/_styleguide.scss +41 -18
- data/stylesheets/archetype/ui/_accessibility.scss +41 -0
- data/stylesheets/archetype/ui/_breakpoints.scss +19 -0
- data/stylesheets/archetype/ui/_core.scss +10 -0
- data/stylesheets/archetype/ui/_elements.scss +98 -0
- data/stylesheets/archetype/ui/_glyphs.scss +244 -0
- data/stylesheets/archetype/ui/_init.scss +5 -0
- data/stylesheets/archetype/ui/_layout.scss +37 -0
- data/stylesheets/archetype/ui/_locale.scss +12 -0
- data/stylesheets/archetype/ui/_scopes.scss +42 -0
- data/stylesheets/archetype/util/_core.scss +8 -0
- data/stylesheets/archetype/util/_debug.scss +9 -21
- data/stylesheets/archetype/util/_init.scss +1 -0
- data/stylesheets/archetype/util/_misc.scss +21 -86
- data/stylesheets/archetype/util/_spacing.scss +9 -40
- data/stylesheets/archetype/util/_styles.scss +189 -178
- data/stylesheets/archetype/util/_targeting.scss +51 -68
- data/templates/example/manifest.rb +2 -2
- data/templates/example/screen.scss +0 -1
- data/templates/project/manifest.rb +3 -8
- metadata +93 -263
- data/bin/archetype +0 -3
- data/lib/archetype/sass_extensions/monkey_patches.rb +0 -3
- data/lib/archetype/sass_extensions/monkey_patches/handle_include_loop.rb +0 -13
- data/stylesheets/archetype/_base.scss +0 -54
- data/stylesheets/archetype/_grid.scss +0 -3
- data/stylesheets/archetype/base/_h5bp.scss +0 -307
- data/stylesheets/archetype/base/_hybrid.scss +0 -25
- data/stylesheets/archetype/base/_normalize.scss +0 -634
- data/stylesheets/archetype/base/_reset.scss +0 -72
- data/stylesheets/archetype/grid/_config.scss +0 -14
- data/stylesheets/archetype/grid/_grid.scss +0 -391
- data/stylesheets/archetype/styleguide/_components.scss +0 -25
- data/stylesheets/archetype/styleguide/_helpers.scss +0 -215
- data/stylesheets/archetype/styleguide/_primitives.scss +0 -10
- data/stylesheets/archetype/styleguide/components/_alerts.scss +0 -59
- data/stylesheets/archetype/styleguide/components/_annotations.scss +0 -27
- data/stylesheets/archetype/styleguide/components/_bristol.scss +0 -15
- data/stylesheets/archetype/styleguide/components/_button_groups.scss +0 -47
- data/stylesheets/archetype/styleguide/components/_button_toolbars.scss +0 -17
- data/stylesheets/archetype/styleguide/components/_buttons.scss +0 -339
- data/stylesheets/archetype/styleguide/components/_canvas.scss +0 -15
- data/stylesheets/archetype/styleguide/components/_carets.scss +0 -336
- data/stylesheets/archetype/styleguide/components/_closes.scss +0 -63
- data/stylesheets/archetype/styleguide/components/_container.scss +0 -27
- data/stylesheets/archetype/styleguide/components/_copy.scss +0 -85
- data/stylesheets/archetype/styleguide/components/_flyouts.scss +0 -52
- data/stylesheets/archetype/styleguide/components/_headings.scss +0 -33
- data/stylesheets/archetype/styleguide/components/_headlines.scss +0 -64
- data/stylesheets/archetype/styleguide/components/_hovercards.scss +0 -27
- data/stylesheets/archetype/styleguide/components/_icons.scss +0 -17
- data/stylesheets/archetype/styleguide/components/_identities.scss +0 -34
- data/stylesheets/archetype/styleguide/components/_links.scss +0 -68
- data/stylesheets/archetype/styleguide/components/_loaders.scss +0 -154
- data/stylesheets/archetype/styleguide/components/_menu_items.scss +0 -31
- data/stylesheets/archetype/styleguide/components/_module.scss +0 -15
- data/stylesheets/archetype/styleguide/components/_pullquotes.scss +0 -29
- data/stylesheets/archetype/styleguide/components/_punchcut.scss +0 -18
- data/stylesheets/archetype/styleguide/components/_tooltips.scss +0 -28
- data/stylesheets/archetype/styleguide/primitives/_animations.scss +0 -17
- data/stylesheets/archetype/styleguide/primitives/_dimensions.scss +0 -50
- data/stylesheets/archetype/styleguide/primitives/_glyphs.scss +0 -11
- data/stylesheets/archetype/styleguide/primitives/_misc.scss +0 -8
- data/stylesheets/archetype/styleguide/primitives/_palettes.scss +0 -94
- data/stylesheets/archetype/styleguide/primitives/_shadows.scss +0 -23
- data/stylesheets/archetype/styleguide/primitives/_sprites.scss +0 -46
- data/stylesheets/archetype/styleguide/primitives/_textures.scss +0 -10
- data/stylesheets/archetype/styleguide/primitives/_typography.scss +0 -56
- data/stylesheets/archetype/util/_lists.scss +0 -57
- data/stylesheets/archetype/util/_rtl.scss +0 -279
- data/stylesheets/archetype/util/_units.scss +0 -18
- data/templates/project/screen.scss +0 -1
- data/templates/project/vendor/archetype/animations/loaders/large/large.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/large/large_dark.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/large/large_dark_static.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/large/large_static.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/medium/medium.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/medium/medium_dark.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/medium/medium_dark_static.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/medium/medium_static.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/small/small.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/small/small_dark.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/small/small_dark_static.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/small/small_static.png +0 -0
- data/templates/project/vendor/archetype/fontawesome-webfont.eot +0 -0
- data/templates/project/vendor/archetype/fontawesome-webfont.svg +0 -255
- data/templates/project/vendor/archetype/fontawesome-webfont.ttf +0 -0
- data/templates/project/vendor/archetype/fontawesome-webfont.woff +0 -0
- data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.eot +0 -0
- data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.svg +0 -255
- data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.ttf +0 -0
- data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.woff +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders-s7889ccc8c1.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large_dark.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large_dark_static.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large_static.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium_dark.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium_dark_static.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium_static.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small_dark.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small_dark_static.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small_static.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/sprites/hovercard_tip.png +0 -0
- data/test/fixtures/stylesheets/archetype/config.rb +0 -21
- data/test/fixtures/stylesheets/archetype/source/b.scss +0 -9
- data/test/fixtures/stylesheets/archetype/source/base.scss +0 -3
- data/test/fixtures/stylesheets/archetype/source/hacks/ie_pseudo.scss +0 -13
- data/test/fixtures/stylesheets/archetype/source/hacks/transparent_focusable.scss +0 -5
- data/test/fixtures/stylesheets/archetype/source/locale.scss +0 -43
- data/test/fixtures/stylesheets/archetype/source/styleguide/alerts.scss +0 -21
- data/test/fixtures/stylesheets/archetype/source/styleguide/buttons.scss +0 -18
- data/test/fixtures/stylesheets/archetype/source/styleguide/drop.scss +0 -101
- data/test/fixtures/stylesheets/archetype/source/styleguide/extend.scss +0 -24
- data/test/fixtures/stylesheets/archetype/source/styleguide/fallback_styles.scss +0 -23
- data/test/fixtures/stylesheets/archetype/source/styleguide/invalid_structures.scss +0 -85
- data/test/fixtures/stylesheets/archetype/source/styleguide/multi_value.scss +0 -18
- data/test/fixtures/stylesheets/archetype/source/styleguide/nested_styleguides.scss +0 -40
- data/test/fixtures/stylesheets/archetype/source/styleguide/selective_state.scss +0 -22
- data/test/fixtures/stylesheets/archetype/source/ui/glyph_icon.scss +0 -35
- data/test/fixtures/stylesheets/archetype/source/ui/hide_element.scss +0 -5
- data/test/fixtures/stylesheets/archetype/source/ui/stroke.scss +0 -13
- data/test/fixtures/stylesheets/archetype/source/ui/triangle.scss +0 -13
- data/test/fixtures/stylesheets/archetype/source/utilities/associative.scss +0 -24
- data/test/fixtures/stylesheets/archetype/source/utilities/custom_output_styler.scss +0 -22
- data/test/fixtures/stylesheets/archetype/source/utilities/if-set.scss +0 -16
- data/test/fixtures/stylesheets/archetype/source/utilities/spacing/horizontal-spacing.scss +0 -27
- data/test/fixtures/stylesheets/archetype/source/utilities/spacing/vertical-spacing.scss +0 -27
- data/test/fixtures/stylesheets/archetype/source/utilities/styles/filter.scss +0 -9
- data/test/fixtures/stylesheets/archetype/source/utilities/styles/font-family.scss +0 -9
- data/test/fixtures/stylesheets/archetype/source/utilities/styles/z-index.scss +0 -18
- data/test/fixtures/stylesheets/archetype/source/utilities/targeting/target-browser.scss +0 -77
- data/test/fixtures/stylesheets/archetype/source/utilities/targeting/target-os.scss +0 -42
- data/test/fixtures/stylesheets/archetype/tmp/b.css +0 -14
- data/test/fixtures/stylesheets/archetype/tmp/base.css +0 -349
- data/test/fixtures/stylesheets/archetype/tmp/hacks/ie_pseudo.css +0 -11
- data/test/fixtures/stylesheets/archetype/tmp/hacks/transparent_focusable.css +0 -4
- data/test/fixtures/stylesheets/archetype/tmp/locale.css +0 -23
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/alerts.css +0 -711
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/buttons.css +0 -2119
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/drop.css +0 -63
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/extend.css +0 -11
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/fallback_styles.css +0 -10
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/invalid_structures.css +0 -21
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/multi_value.css +0 -13
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/nested_styleguides.css +0 -28
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/selective_state.css +0 -177
- data/test/fixtures/stylesheets/archetype/tmp/ui/glyph_icon.css +0 -127
- data/test/fixtures/stylesheets/archetype/tmp/ui/hide_element.css +0 -8
- data/test/fixtures/stylesheets/archetype/tmp/ui/stroke.css +0 -17
- data/test/fixtures/stylesheets/archetype/tmp/ui/triangle.css +0 -35
- data/test/fixtures/stylesheets/archetype/tmp/utilities/associative.css +0 -9
- data/test/fixtures/stylesheets/archetype/tmp/utilities/custom_output_styler.css +0 -8
- data/test/fixtures/stylesheets/archetype/tmp/utilities/if-set.css +0 -9
- data/test/fixtures/stylesheets/archetype/tmp/utilities/spacing/horizontal-spacing.css +0 -29
- data/test/fixtures/stylesheets/archetype/tmp/utilities/spacing/vertical-spacing.css +0 -29
- data/test/fixtures/stylesheets/archetype/tmp/utilities/styles/filter.css +0 -11
- data/test/fixtures/stylesheets/archetype/tmp/utilities/styles/font-family.css +0 -16
- data/test/fixtures/stylesheets/archetype/tmp/utilities/styles/z-index.css +0 -15
- data/test/fixtures/stylesheets/archetype/tmp/utilities/targeting/target-browser.css +0 -105
- data/test/fixtures/stylesheets/archetype/tmp/utilities/targeting/target-os.css +0 -55
- data/test/helpers/diff.rb +0 -49
- data/test/helpers/io.rb +0 -36
- data/test/helpers/test_case.rb +0 -62
- data/test/integrations/archetype_test.rb +0 -126
- data/test/test_helper.rb +0 -26
- data/test/units/sass_extensions_test.rb +0 -200
|
@@ -1,149 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
#
|
|
7
|
-
module Archetype::Functions::Hash
|
|
8
|
-
#
|
|
9
|
-
# recursively merge two hashes with deep merging
|
|
10
|
-
#
|
|
11
|
-
# *Parameters*:
|
|
12
|
-
# - +other_hash+ {Hash} the other hash to merge with
|
|
13
|
-
# *Returns*:
|
|
14
|
-
# - {Hash} a new hash containing the contents of other_hash and the contents of hsh, deep merged
|
|
15
|
-
#
|
|
16
|
-
def rmerge(other_hash, &block)
|
|
17
|
-
dup.rmerge!(other_hash, &block)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
#
|
|
21
|
-
# adds the contents of other_hash to hsh, deep merged
|
|
22
|
-
#
|
|
23
|
-
# *Parameters*:
|
|
24
|
-
# - +other_hash+ {Hash} the other hash to merge with
|
|
25
|
-
# *Returns*:
|
|
26
|
-
# - {Hash} the original hash with the addition of the contents of other_hash
|
|
27
|
-
#
|
|
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
|
|
36
|
-
end
|
|
37
|
-
return self
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
#
|
|
41
|
-
# get the difference of another hash
|
|
42
|
-
#
|
|
43
|
-
# *Parameters*:
|
|
44
|
-
# - +other_hash+ {Hash} the other hash to compare against
|
|
45
|
-
# *Returns*:
|
|
46
|
-
# - {Hash} a representation of the difference between the two hashes
|
|
47
|
-
#
|
|
48
|
-
def diff(other_hash)
|
|
49
|
-
(self.keys + other_hash.keys).uniq.inject(Archetype::Hash.new) do |tmp, key|
|
|
50
|
-
# special comparison for gradients
|
|
51
|
-
are_gradients = self[key].is_a?(Compass::SassExtensions::Functions::GradientSupport::LinearGradient) and other_hash[key].is_a?(Compass::SassExtensions::Functions::GradientSupport::LinearGradient)
|
|
52
|
-
eq_gradients = are_gradients ? (self[key].to_s == other_hash[key].to_s) : true
|
|
53
|
-
unless self[key] == other_hash[key] and eq_gradients
|
|
54
|
-
if self[key].kind_of?(Hash) && other_hash[key].kind_of?(Hash)
|
|
55
|
-
tmp[key] = self[key].diff(other_hash[key])
|
|
56
|
-
else
|
|
57
|
-
tmp[key] = other_hash[key] || css_defaults(key)
|
|
58
|
-
# if the key is `filter-gradient` and it was removed, we need to change the key to `ie-filter`
|
|
59
|
-
tmp['ie-filter'] = css_defaults('ie-filter') if key == 'filter-gradient' and tmp[key].nil?
|
|
60
|
-
# if it came back as `nil` we couldn't understand it or it has no default, so axe it
|
|
61
|
-
tmp.delete(key) if tmp[key].nil?
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
tmp
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
private
|
|
69
|
-
#
|
|
70
|
-
# returns a best guess for the default CSS value of a given property
|
|
71
|
-
#
|
|
72
|
-
# *Parameters*:
|
|
73
|
-
# - <tt>key</tt> {String} the property to lookup
|
|
74
|
-
# *Returns*:
|
|
75
|
-
# - {Sass::String|Sass::Number} the default value
|
|
76
|
-
#
|
|
77
|
-
def css_defaults(key)
|
|
78
|
-
if @css_defaults.nil?
|
|
79
|
-
s = {}
|
|
80
|
-
# color
|
|
81
|
-
s['color'] = 'inherit'
|
|
82
|
-
# text
|
|
83
|
-
s['font'] = s['font-size'] = s['font-family'] = s['font-style'] = s['font-variant'] = s['font-weight'] = 'inherit'
|
|
84
|
-
s['text-decoration'] = s['text-transform'] = 'none'
|
|
85
|
-
s['text-align'] = 'left'
|
|
86
|
-
s['text-indent'] = 0
|
|
87
|
-
s['text-justify'] = 'auto'
|
|
88
|
-
s['text-overflow'] = 'clip'
|
|
89
|
-
s['line-height'] = 'normal'
|
|
90
|
-
# backgrounds
|
|
91
|
-
s['background'] = 'none'
|
|
92
|
-
s['background-color'] = 'transparent'
|
|
93
|
-
s['background-image'] = 'none'
|
|
94
|
-
s['background-repeat'] = 'repeat'
|
|
95
|
-
s['background-position'] = 'left top'
|
|
96
|
-
s['background-attachment'] = 'scroll'
|
|
97
|
-
s['background-clip'] = 'border-box'
|
|
98
|
-
s['background-size'] = 'auto'
|
|
99
|
-
s['background-origin'] = 'padding-box'
|
|
100
|
-
# borders
|
|
101
|
-
s['border'] = s['border-top'] = s['border-left'] = s['border-bottom'] = s['border-right'] = 'none'
|
|
102
|
-
s['border-color'] = s['border-top-color'] = s['border-left-color'] = s['border-bottom-color'] = s['border-right-color'] = 'transparent'
|
|
103
|
-
s['border-width'] = s['border-top-width'] = s['border-left-width'] = s['border-bottom-width'] = s['border-right-width'] = 0
|
|
104
|
-
s['border-style'] = s['border-top-style'] = s['border-left-style'] = s['border-bottom-style'] = s['border-right-style'] = 'solid'
|
|
105
|
-
# border-radius
|
|
106
|
-
s['border-radius'] = s['border-top-left-radius'] = s['border-top-right-radius'] = s['border-bottom-left-radius'] = s['border-bottom-right-radius'] = 0
|
|
107
|
-
# margin
|
|
108
|
-
s['margin'] = s['margin-top'] = s['margin-left'] = s['margin-bottom'] = s['margin-right'] = 0
|
|
109
|
-
# padding
|
|
110
|
-
s['padding'] = s['padding-top'] = s['padding-left'] = s['padding-bottom'] = s['padding-right'] = 0
|
|
111
|
-
# shadows
|
|
112
|
-
s['text-shadow'] = s['box-shadow'] = 'none'
|
|
113
|
-
# width/height
|
|
114
|
-
s['height'] = s['width'] = 'auto'
|
|
115
|
-
s['min-width'] = s['max-width'] = s['min-height'] = s['max-height'] = 'none'
|
|
116
|
-
# position
|
|
117
|
-
s['position'] = 'static'
|
|
118
|
-
s['top'] = s['right'] = s['bottom'] = s['left'] = 'auto'
|
|
119
|
-
s['clear'] = s['float'] = 'none'
|
|
120
|
-
# misc
|
|
121
|
-
s['overflow'] = 'visible'
|
|
122
|
-
s['opacity'] = 1
|
|
123
|
-
s['visibility'] = 'visible'
|
|
124
|
-
s['ie-filter'] = 'gradient(enabled=false)'
|
|
125
|
-
s['z-index'] = 0
|
|
126
|
-
# --------------------
|
|
127
|
-
@css_defaults = s
|
|
128
|
-
end
|
|
129
|
-
value = @css_defaults[key]
|
|
130
|
-
value = Sass::Script::String.new(value) if value.is_a? String
|
|
131
|
-
value = Sass::Script::Number.new(value) if value.is_a? Numeric
|
|
132
|
-
return value
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
|
|
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
|
|
148
|
-
end
|
|
149
|
-
|
|
1
|
+
%w(extend shim).each do |dep|
|
|
2
|
+
require "archetype/functions/hash/#{dep}"
|
|
3
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# :stopdoc:
|
|
2
|
+
# This module extends the native Ruby Hash class to support deep merging
|
|
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
|
+
#
|
|
7
|
+
module Archetype::Functions::Hash
|
|
8
|
+
#
|
|
9
|
+
# recursively merge two hashes with deep merging
|
|
10
|
+
#
|
|
11
|
+
# *Parameters*:
|
|
12
|
+
# - +other_hash+ {Hash} the other hash to merge with
|
|
13
|
+
# *Returns*:
|
|
14
|
+
# - {Hash} a new hash containing the contents of other_hash and the contents of hsh, deep merged
|
|
15
|
+
#
|
|
16
|
+
def rmerge(other_hash, &block)
|
|
17
|
+
dup.rmerge!(other_hash, &block)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
# adds the contents of other_hash to hsh, deep merged
|
|
22
|
+
#
|
|
23
|
+
# *Parameters*:
|
|
24
|
+
# - +other_hash+ {Hash} the other hash to merge with
|
|
25
|
+
# *Returns*:
|
|
26
|
+
# - {Hash} the original hash with the addition of the contents of other_hash
|
|
27
|
+
#
|
|
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
|
|
36
|
+
end
|
|
37
|
+
return self
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
#
|
|
41
|
+
# get the difference of another hash
|
|
42
|
+
#
|
|
43
|
+
# *Parameters*:
|
|
44
|
+
# - +other_hash+ {Hash} the other hash to compare against
|
|
45
|
+
# *Returns*:
|
|
46
|
+
# - {Hash} a representation of the difference between the two hashes
|
|
47
|
+
#
|
|
48
|
+
def diff(other_hash)
|
|
49
|
+
(self.keys + other_hash.keys).uniq.inject(Archetype::Hash.new) do |tmp, key|
|
|
50
|
+
item_1, item_2 = self[key], other_hash[key]
|
|
51
|
+
# special comparison for gradients
|
|
52
|
+
are_gradients = (item_1.class == item_2.class) && (item_1.is_a?(Compass::Core::SassExtensions::Functions::GradientSupport::LinearGradient) or item_1.is_a?(Compass::Core::SassExtensions::Functions::GradientSupport::RadialGradient))
|
|
53
|
+
eq_gradients = are_gradients ? (item_1.to_s == item_2.to_s) : true
|
|
54
|
+
unless item_1 == item_2 and eq_gradients
|
|
55
|
+
if item_1.kind_of?(Hash) and item_2.kind_of?(Hash)
|
|
56
|
+
tmp[key] = item_1.diff(item_2)
|
|
57
|
+
else
|
|
58
|
+
tmp[key] = item_2 || Archetype::Functions::CSS.default(key)
|
|
59
|
+
# if the key is `filter-gradient` and it was removed, we need to change the key to `ie-filter`
|
|
60
|
+
tmp['ie-filter'] = Archetype::Functions::CSS.default('ie-filter') if key == 'filter-gradient' and tmp[key].nil?
|
|
61
|
+
# if it came back as `nil` we couldn't understand it or it has no default, so axe it
|
|
62
|
+
tmp.delete(key) if tmp[key].nil?
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
tmp
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
unless self.respond_to?(:to_h)
|
|
70
|
+
def to_h
|
|
71
|
+
return self
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# :stopdoc:
|
|
2
|
+
# this shims the Hash functionality to ensure we have an ordered hash guarantee
|
|
3
|
+
module Archetype
|
|
4
|
+
if RUBY_VERSION < '1.9'
|
|
5
|
+
require 'hashery/ordered_hash'
|
|
6
|
+
class Hash < Hashery::OrderedHash
|
|
7
|
+
include Archetype::Functions::Hash
|
|
8
|
+
|
|
9
|
+
# make select behave like its 1.9+ counterpart
|
|
10
|
+
def select
|
|
11
|
+
hsh = ::Archetype::Hash.new
|
|
12
|
+
self.each do |key, value|
|
|
13
|
+
hsh[key] = value if yield(key, value)
|
|
14
|
+
end
|
|
15
|
+
return hsh
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# make select! behave like its 1.9+ counterpart
|
|
19
|
+
def select!
|
|
20
|
+
self.each do |key, value|
|
|
21
|
+
self.delete[key] unless yield(key, value)
|
|
22
|
+
end
|
|
23
|
+
return self
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# make reject behave like its 1.9+ counterpart
|
|
27
|
+
def reject
|
|
28
|
+
hsh = ::Archetype::Hash.new
|
|
29
|
+
self.each do |key, value|
|
|
30
|
+
hsh[key] = value unless yield(key, value)
|
|
31
|
+
end
|
|
32
|
+
return hsh
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# make reject! behave like its 1.9+ counterpart
|
|
36
|
+
def reject!
|
|
37
|
+
self.each do |key, value|
|
|
38
|
+
self.delete[key] if yield(key, value)
|
|
39
|
+
end
|
|
40
|
+
return self
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
else
|
|
44
|
+
class Hash < ::Hash
|
|
45
|
+
include Archetype::Functions::Hash
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -2,7 +2,18 @@
|
|
|
2
2
|
# This module provides a set of helper functions and methods for working with Sass literals.
|
|
3
3
|
#
|
|
4
4
|
module Archetype::Functions::Helpers
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
# used for archetype meta objects on a Map
|
|
7
|
+
META = {
|
|
8
|
+
:meta => '-archetype-meta',
|
|
9
|
+
:has_multiples => 'has-multiple-values',
|
|
10
|
+
:values => 'values',
|
|
11
|
+
:message => 'message',
|
|
12
|
+
:original => 'original',
|
|
13
|
+
:decorators => {
|
|
14
|
+
:runtime_locales => 'has-runtime-locales'
|
|
15
|
+
}
|
|
16
|
+
}
|
|
6
17
|
|
|
7
18
|
#
|
|
8
19
|
# provides a convenience interface to the Compass::Logger
|
|
@@ -12,14 +23,21 @@ private
|
|
|
12
23
|
end
|
|
13
24
|
|
|
14
25
|
#
|
|
15
|
-
#
|
|
26
|
+
# provides a convenience interface for logging warnings
|
|
27
|
+
#
|
|
28
|
+
def self.warn(msg)
|
|
29
|
+
logger.record(:warning, msg)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
#
|
|
33
|
+
# convert an Archetype::Hash to a Sass::Script::Value::List
|
|
16
34
|
#
|
|
17
35
|
# *Parameters*:
|
|
18
|
-
# - <tt>hsh</tt> {Hash} the hash to convert
|
|
36
|
+
# - <tt>hsh</tt> {Archetype::Hash} the hash to convert
|
|
19
37
|
# - <tt>depth</tt> {Integer} the depth to walk down into the hash
|
|
20
|
-
# - <tt>separator</tt> {Symbol} the separator to use for the Sass::List
|
|
38
|
+
# - <tt>separator</tt> {Symbol} the separator to use for the Sass::Script::Value::List
|
|
21
39
|
# *Returns*:
|
|
22
|
-
# - {Sass::List} the converted list
|
|
40
|
+
# - {Sass::Script::Value::List} the converted list
|
|
23
41
|
#
|
|
24
42
|
def self.hash_to_list(hsh, depth = 0, separator = :comma)
|
|
25
43
|
if hsh.is_a? Hash
|
|
@@ -31,35 +49,47 @@ private
|
|
|
31
49
|
tmp = []
|
|
32
50
|
item[1] = [item[1]] if not item[1].is_a? Array
|
|
33
51
|
item[1].each do |i|
|
|
34
|
-
list.push Sass::Script::List.new([Sass::Script::String.new(item[0]), hash_to_list(i, depth + 1)], separator)
|
|
52
|
+
list.push Sass::Script::Value::List.new([Sass::Script::Value::String.new(item[0]), hash_to_list(i, depth + 1)], separator)
|
|
35
53
|
end
|
|
36
54
|
end
|
|
37
55
|
end
|
|
38
|
-
return Sass::Script::List.new(list, separator)
|
|
56
|
+
return Sass::Script::Value::List.new(list, separator)
|
|
39
57
|
end
|
|
40
58
|
# if its an array, cast to a List
|
|
41
|
-
return Sass::Script::List.new(hsh, separator) if hsh.is_a? Array
|
|
59
|
+
return Sass::Script::Value::List.new(hsh, separator) if hsh.is_a? Array
|
|
42
60
|
# otherwise just return it
|
|
43
61
|
return hsh
|
|
44
62
|
end
|
|
45
63
|
|
|
46
64
|
#
|
|
47
|
-
# convert a Sass::List to
|
|
65
|
+
# convert a Sass::Script::Value::List to an Archetype::Hash
|
|
48
66
|
#
|
|
49
67
|
# *Parameters*:
|
|
50
|
-
# - <tt>list</tt> {Sass::List} the list to convert
|
|
68
|
+
# - <tt>list</tt> {Sass::Script::Value::List} the list to convert
|
|
51
69
|
# - <tt>depth</tt> {Integer} the depth to reach into nested Lists
|
|
52
70
|
# - <tt>nest</tt> {Array} a list of keys to treat as nested objects
|
|
71
|
+
# - <tt>additives</tt> {Array} a list of keys that are additive
|
|
53
72
|
# *Returns*:
|
|
54
|
-
# - {Hash} the converted hash
|
|
73
|
+
# - {Archetype::Hash} the converted hash
|
|
55
74
|
#
|
|
56
75
|
def self.list_to_hash(list, depth = 0, nest = [], additives = [])
|
|
57
76
|
list = list.to_a
|
|
58
77
|
previous = nil
|
|
59
78
|
hsh = Archetype::Hash.new
|
|
79
|
+
dups = Set.new
|
|
60
80
|
list.each do |item|
|
|
61
81
|
item = item.to_a
|
|
62
82
|
|
|
83
|
+
# if a 3rd item exists, we probably forgot a comma or parens somewhere
|
|
84
|
+
if previous.nil? and not item[2].nil?
|
|
85
|
+
msg = "[#{Archetype.name}:hash] you're likely missing a comma or parens in your data structure"
|
|
86
|
+
begin
|
|
87
|
+
warn("#{msg}: #{item}")
|
|
88
|
+
rescue
|
|
89
|
+
warn(msg)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
63
93
|
# convert the key to a string and strip off quotes
|
|
64
94
|
key = to_str(item[0], ' ' , :quotes)
|
|
65
95
|
# capture the value
|
|
@@ -77,7 +107,7 @@ private
|
|
|
77
107
|
end
|
|
78
108
|
elsif not previous.nil?
|
|
79
109
|
# if we got here, something is wrong with the structure
|
|
80
|
-
list
|
|
110
|
+
list = list[1..-1] if to_str(list[0]) == previous # remove the first item if it's the previous key, which is now the parent key
|
|
81
111
|
list = list[0].to_a # now the remaining items were munged, so split them out
|
|
82
112
|
hsh = Archetype::Hash.new
|
|
83
113
|
hsh[previous] = list_to_hash(list, depth - 1, nest, additives)
|
|
@@ -97,39 +127,214 @@ private
|
|
|
97
127
|
if additives.include?(key)
|
|
98
128
|
hsh[key] ||= []
|
|
99
129
|
hsh[key].push(value)
|
|
130
|
+
dups << key
|
|
100
131
|
else
|
|
101
132
|
hsh[key] = value
|
|
102
133
|
end
|
|
103
134
|
end
|
|
104
135
|
end
|
|
105
136
|
|
|
106
|
-
|
|
137
|
+
dups.each do |key|
|
|
138
|
+
# convert it's array of values into a meta object
|
|
139
|
+
hsh[key] = self.array_to_meta(hsh[key])
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
warn("[#{Archetype.name}:hash] one of your data structures is ambiguous, please double check near `#{previous}`") unless (previous.nil? or previous.empty?)
|
|
107
143
|
|
|
108
144
|
return hsh
|
|
109
145
|
end
|
|
110
146
|
|
|
147
|
+
#
|
|
148
|
+
# convert a Sass::Script::Value::List or Sass::Script::Value::Map to an Archetype::Hash
|
|
149
|
+
#
|
|
150
|
+
# *Parameters*:
|
|
151
|
+
# - <tt>data</tt> {Sass::Script::Value::List|Sass::Script::Value::Map} the data to convert
|
|
152
|
+
# - <tt>depth</tt> {Integer} the depth to reach into nested Lists
|
|
153
|
+
# - <tt>nest</tt> {Array} a list of keys to treat as nested objects
|
|
154
|
+
# - <tt>additives</tt> {Array} a list of keys that are additive
|
|
155
|
+
# *Returns*:
|
|
156
|
+
# - {Archetype::Hash} the converted hash
|
|
157
|
+
#
|
|
158
|
+
def self.data_to_hash(data, depth = 0, nest = [], additives = [])
|
|
159
|
+
method = data.is_a?(Sass::Script::Value::Map) ? :map_to_hash : :list_to_hash
|
|
160
|
+
return self.method(method).call(data, depth, nest, additives)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
#
|
|
164
|
+
# converts a Sass::Script::Value::Map to an Archetype::Hash
|
|
165
|
+
# - <tt>data</tt> {Sass::Script::Value::Map} the map to convert
|
|
166
|
+
# - <tt>depth</tt> {Integer} the depth to reach into nested Lists
|
|
167
|
+
# - <tt>nest</tt> {Array} a list of keys to treat as nested objects
|
|
168
|
+
# - <tt>additives</tt> {Array} a list of keys that are additive
|
|
169
|
+
# *Returns*:
|
|
170
|
+
# - {Archetype::Hash} the converted hash
|
|
171
|
+
#
|
|
172
|
+
def self.map_to_hash(data, depth = 0, nest = [], additives = [])
|
|
173
|
+
data = data.to_h if data.respond_to?(:to_h)
|
|
174
|
+
hsh = Archetype::Hash.new
|
|
175
|
+
# recurisvely convert sub-maps into a hash
|
|
176
|
+
data.each do |key, value|
|
|
177
|
+
key = to_str(key, ' ' , :quotes)
|
|
178
|
+
hsh[key] = value.is_a?(Sass::Script::Value::Map) ? map_to_hash(value) : value
|
|
179
|
+
end
|
|
180
|
+
return hsh
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
#
|
|
184
|
+
# convert an Archetype::Hash to a Sass::Script::Value::Map
|
|
185
|
+
#
|
|
186
|
+
# *Parameters*:
|
|
187
|
+
# - <tt>hsh</tt> {Archetype::Hash} the hash to convert
|
|
188
|
+
# - <tt>depth</tt> {Integer} the depth to walk down into the hash
|
|
189
|
+
# - <tt>separator</tt> {Symbol} the separator to use for the Sass::Script::Value::List
|
|
190
|
+
# *Returns*:
|
|
191
|
+
# - {Sass::Script::Value::List} the converted list
|
|
192
|
+
#
|
|
193
|
+
def self.hash_to_map(hsh)
|
|
194
|
+
if hsh.is_a? Hash
|
|
195
|
+
new_hsh = Archetype::Hash.new
|
|
196
|
+
hsh.each do |key, item|
|
|
197
|
+
new_hsh[Sass::Script::Value::String.new(key)] = (item.is_a? Hash) ? self.hash_to_map(item) : item
|
|
198
|
+
end
|
|
199
|
+
else
|
|
200
|
+
new_hsh = {}
|
|
201
|
+
end
|
|
202
|
+
return Sass::Script::Value::Map.new(new_hsh)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
#
|
|
206
|
+
# convert an array of values into a Sass map with meta data
|
|
207
|
+
#
|
|
208
|
+
# *Example*:
|
|
209
|
+
# array_to_meta([1, "foo", "bar", 2, "baz"])
|
|
210
|
+
# #=> ((-archetype-meta: (has-multiple-values: true), values: (1, "foo", "bar", 2, "baz")))
|
|
211
|
+
# *Parameters*:
|
|
212
|
+
# - <tt>array</tt> {Array} the array to convert
|
|
213
|
+
# *Returns*:
|
|
214
|
+
# - {Sass::Script::Value::Map} the converted map
|
|
215
|
+
#
|
|
216
|
+
def self.array_to_meta(array)
|
|
217
|
+
return array[0] if array.size == 1
|
|
218
|
+
return Sass::Script::Value::Map.new({
|
|
219
|
+
Sass::Script::Value::String.new(META[:meta]) => Sass::Script::Value::Map.new({
|
|
220
|
+
Sass::Script::Value::String.new(META[:has_multiples]) => Sass::Script::Value::Bool.new(true)
|
|
221
|
+
}),
|
|
222
|
+
Sass::Script::Value::String.new(META[:values]) => Sass::Script::Value::List.new(array, :comma)
|
|
223
|
+
})
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
#
|
|
227
|
+
# convert a Sass map with meta data to an array of values
|
|
228
|
+
#
|
|
229
|
+
# *Example*:
|
|
230
|
+
# meta_to_array(((-archetype-meta: (has-multiple-values: true), values: (1, "foo", "bar", 2, "baz"))))
|
|
231
|
+
# #=> [1, "foo", "bar", 2, "baz"]
|
|
232
|
+
# *Parameters*:
|
|
233
|
+
# - <tt>map</tt> {Sass::Script::Value::Map} the map to convert
|
|
234
|
+
# *Returns*:
|
|
235
|
+
# - {Array} the converted array
|
|
236
|
+
#
|
|
237
|
+
def self.meta_to_array(map)
|
|
238
|
+
hash = map.is_a?(Sass::Script::Value::Map) ? map_to_hash(map) : map
|
|
239
|
+
if hash.is_a?(Hash)
|
|
240
|
+
meta = hash[META[:meta]]
|
|
241
|
+
if not meta.nil? and not meta[META[:has_multiples]].nil? and meta[META[:has_multiples]]
|
|
242
|
+
return (hash[META[:values]] || []).to_a
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
# dunno what we got, but it wasn't meta enough, so just return the original map
|
|
246
|
+
return map
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
#
|
|
250
|
+
# decorates a value into a meta object
|
|
251
|
+
#
|
|
252
|
+
# *Parameters*:
|
|
253
|
+
# - <tt>value</tt> {*} the value to decorate
|
|
254
|
+
# *Returns*:
|
|
255
|
+
# - {Sass::Script::Value::Map} the decorated map
|
|
256
|
+
#
|
|
257
|
+
def self.meta_decorate(value, decorator)
|
|
258
|
+
return Sass::Script::Value::Null.new if is_null(value)
|
|
259
|
+
return Sass::Script::Value::Map.new({
|
|
260
|
+
Sass::Script::Value::String.new(META[:meta]) => Sass::Script::Value::Map.new({
|
|
261
|
+
Sass::Script::Value::String.new(META[:decorators][decorator] || decorator) => Sass::Script::Value::Bool.new(true)
|
|
262
|
+
}),
|
|
263
|
+
Sass::Script::Value::String.new(META[:original]) => value
|
|
264
|
+
})
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
#
|
|
268
|
+
# adds a meta message to the hash
|
|
269
|
+
#
|
|
270
|
+
# *Parameters*:
|
|
271
|
+
# - <tt>hash</tt> {Hash} the hash to store the message onto
|
|
272
|
+
# - <tt>message</tt> {String} the message to store
|
|
273
|
+
# *Returns*:
|
|
274
|
+
# - {Hash} the hash with the injected message
|
|
275
|
+
#
|
|
276
|
+
def self.add_meta_message(hash, message)
|
|
277
|
+
hash[META[:meta]] = Sass::Script::Value::Map.new({
|
|
278
|
+
Sass::Script::Value::String.new(META[:message]) => Sass::Script::Value::String.new(message)
|
|
279
|
+
})
|
|
280
|
+
return hash
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
#
|
|
284
|
+
# retrieves a meta message from a hash
|
|
285
|
+
#
|
|
286
|
+
# *Parameters*:
|
|
287
|
+
# - <tt>hash</tt> {Hash} the hash to retrieve the message from
|
|
288
|
+
# *Returns*:
|
|
289
|
+
# - {String} the meta message stored on the hash
|
|
290
|
+
#
|
|
291
|
+
def self.get_meta_message(hash)
|
|
292
|
+
if not hash[META[:meta]].nil?
|
|
293
|
+
meta = map_to_hash(hash[META[:meta]])
|
|
294
|
+
message = meta[META[:message]]
|
|
295
|
+
return message.to_s if not message.nil?
|
|
296
|
+
end
|
|
297
|
+
return nil
|
|
298
|
+
end
|
|
299
|
+
|
|
111
300
|
#
|
|
112
301
|
# convert things to a String
|
|
113
302
|
#
|
|
114
303
|
# *Parameters*:
|
|
115
|
-
# - <tt>value</tt> {String|Sass::String|Sass::List} the thing to convert
|
|
116
|
-
# - <tt>separator</tt> {String} the separator to use for joining Sass::List
|
|
304
|
+
# - <tt>value</tt> {String|Sass::Script::Value::String|Sass::Script::Value::List} the thing to convert
|
|
305
|
+
# - <tt>separator</tt> {String} the separator to use for joining Sass::Script::Value::List
|
|
306
|
+
# - <tt>strip</tt> {\*} the properties to strip from the resulting string
|
|
117
307
|
# *Returns*:
|
|
118
308
|
# - {String} the converted String
|
|
119
309
|
#
|
|
120
310
|
def self.to_str(value, separator = ' ', strip = nil)
|
|
121
311
|
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 || '')
|
|
312
|
+
value = ((value.to_a).each{ |i| i.nil? ? 'nil' : (i.is_a?(String) ? i : i.is_a?(Array) ? to_str(i, separator, strip) : i.value) }).join(separator || '')
|
|
123
313
|
end
|
|
124
314
|
strip = /\A"|"\Z/ if strip == :quotes
|
|
125
315
|
return strip.nil? ? value : value.gsub(strip, '')
|
|
126
316
|
end
|
|
127
317
|
|
|
128
318
|
#
|
|
129
|
-
# test
|
|
319
|
+
# simple test for `null` or `nil` (deprecated) value. this is here for back-compat support with old `nil` syntax
|
|
320
|
+
#
|
|
321
|
+
# *Parameters*:
|
|
322
|
+
# - <tt>$value</tt> {*} the value to test
|
|
323
|
+
# *Returns*:
|
|
324
|
+
# - {Boolean} whether or not the value is null
|
|
325
|
+
#
|
|
326
|
+
def self.is_null(value)
|
|
327
|
+
return true if value.nil?
|
|
328
|
+
is_deprecated_nil = (value.is_a?(Sass::Script::Value::String) && value.value == 'nil')
|
|
329
|
+
#helpers.warn("[#{Archetype.name}:nil] the usage of `nil` will be removed in a future release, please use the Sass standard `null`")
|
|
330
|
+
return value.is_a?(Sass::Script::Value::Null) || is_deprecated_nil
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
#
|
|
334
|
+
# test a value for various conditions
|
|
130
335
|
#
|
|
131
336
|
# *Parameters*:
|
|
132
|
-
# - <tt>value</tt> {String|Array|Sass::String|Sass::List} the thing to test
|
|
337
|
+
# - <tt>value</tt> {String|Array|Sass::Script::Value::String|Sass::Script::Value::List} the thing to test
|
|
133
338
|
# - <tt>test</tt> {Symbol} the test to perform [:blank|:nil]
|
|
134
339
|
# *Returns*:
|
|
135
340
|
# - {Boolean} whether or not the value is nil/blank
|
|
@@ -139,16 +344,20 @@ private
|
|
|
139
344
|
case test
|
|
140
345
|
when :blank
|
|
141
346
|
is_it = false
|
|
142
|
-
value = value.value if value.is_a?(Sass::Script::String)
|
|
347
|
+
value = value.value if value.is_a?(Sass::Script::Value::String)
|
|
143
348
|
is_it = value.nil?
|
|
144
349
|
is_it = value.empty? if value.is_a?(String)
|
|
145
|
-
is_it = value.to_a.empty? if value.is_a?(Sass::Script::List) or value.is_a?(Array)
|
|
350
|
+
is_it = value.to_a.empty? if value.is_a?(Sass::Script::Value::List) or value.is_a?(Array)
|
|
146
351
|
when :nil
|
|
147
352
|
is_it = false
|
|
148
|
-
value = value.value if value.is_a?(Sass::Script::String)
|
|
353
|
+
value = value.value if value.is_a?(Sass::Script::Value::String)
|
|
149
354
|
is_it = value.nil?
|
|
150
355
|
is_it = value == 'nil' if value.is_a?(String)
|
|
151
|
-
is_it =
|
|
356
|
+
is_it = value.empty? if value.is_a?(Hash)
|
|
357
|
+
is_it = to_str(value) == 'nil' if value.is_a?(Sass::Script::Value::List) or value.is_a?(Array)
|
|
358
|
+
is_it = true if value.is_a?(Sass::Script::Value::Null)
|
|
359
|
+
when :hashy
|
|
360
|
+
is_it = value.is_a?(Hash) || value.is_a?(Sass::Script::Value::Map)
|
|
152
361
|
end
|
|
153
362
|
return is_it
|
|
154
363
|
end
|