archetype 0.0.1.pre.1 → 0.0.1.pre.3.00dfd9a

Sign up to get free protection for your applications and to get access to all the features.
Files changed (185) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +88 -0
  3. data/LICENSE +16 -0
  4. data/README.md +87 -1
  5. data/VERSION.yml +6 -0
  6. data/lib/README.rdoc +4 -0
  7. data/lib/archetype.rb +45 -0
  8. data/lib/archetype/functions.rb +9 -0
  9. data/lib/archetype/functions/hash.rb +149 -0
  10. data/lib/archetype/functions/helpers.rb +125 -0
  11. data/lib/archetype/functions/styleguide_memoizer.rb +61 -0
  12. data/lib/archetype/sass_extensions.rb +6 -0
  13. data/lib/archetype/sass_extensions/functions.rb +14 -0
  14. data/lib/archetype/sass_extensions/functions/environment.rb +14 -0
  15. data/lib/archetype/sass_extensions/functions/lists.rb +284 -0
  16. data/lib/archetype/sass_extensions/functions/locale.rb +77 -0
  17. data/lib/archetype/sass_extensions/functions/numbers.rb +19 -0
  18. data/lib/archetype/sass_extensions/functions/styleguide.rb +406 -0
  19. data/lib/archetype/sass_extensions/functions/ui.rb +59 -0
  20. data/lib/archetype/sass_extensions/functions/version.rb +95 -0
  21. data/lib/archetype/version.rb +75 -0
  22. data/stylesheets/_archetype.scss +2 -0
  23. data/stylesheets/archetype/_base.scss +46 -0
  24. data/stylesheets/archetype/_config.scss +366 -0
  25. data/stylesheets/archetype/_grid.scss +3 -0
  26. data/stylesheets/archetype/_hacks.scss +72 -0
  27. data/stylesheets/archetype/_init.scss +23 -0
  28. data/stylesheets/archetype/_styleguide.scss +6 -0
  29. data/stylesheets/archetype/_ui.scss +326 -0
  30. data/stylesheets/archetype/_util.scss +12 -0
  31. data/stylesheets/archetype/base/_h5bp.scss +307 -0
  32. data/stylesheets/archetype/base/_hybrid.scss +25 -0
  33. data/stylesheets/archetype/base/_normalize.scss +595 -0
  34. data/stylesheets/archetype/base/_reset.scss +72 -0
  35. data/stylesheets/archetype/grid/_config.scss +14 -0
  36. data/stylesheets/archetype/grid/_grid.scss +391 -0
  37. data/stylesheets/archetype/styleguide/_components.scss +25 -0
  38. data/stylesheets/archetype/styleguide/_helpers.scss +215 -0
  39. data/stylesheets/archetype/styleguide/_primitives.scss +10 -0
  40. data/stylesheets/archetype/styleguide/_styleguide.scss +41 -0
  41. data/stylesheets/archetype/styleguide/components/_alerts.scss +59 -0
  42. data/stylesheets/archetype/styleguide/components/_annotations.scss +27 -0
  43. data/stylesheets/archetype/styleguide/components/_bristol.scss +15 -0
  44. data/stylesheets/archetype/styleguide/components/_button_groups.scss +47 -0
  45. data/stylesheets/archetype/styleguide/components/_button_toolbars.scss +17 -0
  46. data/stylesheets/archetype/styleguide/components/_buttons.scss +338 -0
  47. data/stylesheets/archetype/styleguide/components/_canvas.scss +15 -0
  48. data/stylesheets/archetype/styleguide/components/_carets.scss +336 -0
  49. data/stylesheets/archetype/styleguide/components/_closes.scss +63 -0
  50. data/stylesheets/archetype/styleguide/components/_container.scss +27 -0
  51. data/stylesheets/archetype/styleguide/components/_copy.scss +85 -0
  52. data/stylesheets/archetype/styleguide/components/_flyouts.scss +52 -0
  53. data/stylesheets/archetype/styleguide/components/_headings.scss +33 -0
  54. data/stylesheets/archetype/styleguide/components/_headlines.scss +63 -0
  55. data/stylesheets/archetype/styleguide/components/_hovercards.scss +27 -0
  56. data/stylesheets/archetype/styleguide/components/_icons.scss +17 -0
  57. data/stylesheets/archetype/styleguide/components/_identities.scss +34 -0
  58. data/stylesheets/archetype/styleguide/components/_links.scss +66 -0
  59. data/stylesheets/archetype/styleguide/components/_loaders.scss +154 -0
  60. data/stylesheets/archetype/styleguide/components/_menu_items.scss +31 -0
  61. data/stylesheets/archetype/styleguide/components/_module.scss +15 -0
  62. data/stylesheets/archetype/styleguide/components/_pullquotes.scss +29 -0
  63. data/stylesheets/archetype/styleguide/components/_punchcut.scss +18 -0
  64. data/stylesheets/archetype/styleguide/components/_tooltips.scss +28 -0
  65. data/stylesheets/archetype/styleguide/primitives/_animations.scss +17 -0
  66. data/stylesheets/archetype/styleguide/primitives/_dimensions.scss +50 -0
  67. data/stylesheets/archetype/styleguide/primitives/_glyphs.scss +11 -0
  68. data/stylesheets/archetype/styleguide/primitives/_misc.scss +8 -0
  69. data/stylesheets/archetype/styleguide/primitives/_palettes.scss +94 -0
  70. data/stylesheets/archetype/styleguide/primitives/_shadows.scss +23 -0
  71. data/stylesheets/archetype/styleguide/primitives/_sprites.scss +46 -0
  72. data/stylesheets/archetype/styleguide/primitives/_textures.scss +10 -0
  73. data/stylesheets/archetype/styleguide/primitives/_typography.scss +56 -0
  74. data/stylesheets/archetype/util/_debug.scss +40 -0
  75. data/stylesheets/archetype/util/_lists.scss +57 -0
  76. data/stylesheets/archetype/util/_misc.scss +108 -0
  77. data/stylesheets/archetype/util/_rtl.scss +279 -0
  78. data/stylesheets/archetype/util/_spacing.scss +78 -0
  79. data/stylesheets/archetype/util/_styles.scss +466 -0
  80. data/stylesheets/archetype/util/_targeting.scss +210 -0
  81. data/stylesheets/archetype/util/_units.scss +18 -0
  82. data/templates/example/index.html +40 -0
  83. data/templates/example/manifest.rb +13 -0
  84. data/templates/example/screen.scss +99 -0
  85. data/templates/example/vendor/archetype/animations/loaders/large/large.png +0 -0
  86. data/templates/example/vendor/archetype/animations/loaders/large/large_dark.png +0 -0
  87. data/templates/example/vendor/archetype/animations/loaders/large/large_dark_static.png +0 -0
  88. data/templates/example/vendor/archetype/animations/loaders/large/large_static.png +0 -0
  89. data/templates/example/vendor/archetype/animations/loaders/medium/medium.png +0 -0
  90. data/templates/example/vendor/archetype/animations/loaders/medium/medium_dark.png +0 -0
  91. data/templates/example/vendor/archetype/animations/loaders/medium/medium_dark_static.png +0 -0
  92. data/templates/example/vendor/archetype/animations/loaders/medium/medium_static.png +0 -0
  93. data/templates/example/vendor/archetype/animations/loaders/small/small.png +0 -0
  94. data/templates/example/vendor/archetype/animations/loaders/small/small_dark.png +0 -0
  95. data/templates/example/vendor/archetype/animations/loaders/small/small_dark_static.png +0 -0
  96. data/templates/example/vendor/archetype/animations/loaders/small/small_static.png +0 -0
  97. data/templates/example/vendor/archetype/fontawesome-webfont.eot +0 -0
  98. data/templates/example/vendor/archetype/fontawesome-webfont.svg +255 -0
  99. data/templates/example/vendor/archetype/fontawesome-webfont.ttf +0 -0
  100. data/templates/example/vendor/archetype/fontawesome-webfont.woff +0 -0
  101. data/templates/project/manifest.rb +9 -0
  102. data/templates/project/screen.scss +1 -0
  103. data/templates/project/vendor/archetype/animations/loaders/large/large.png +0 -0
  104. data/templates/project/vendor/archetype/animations/loaders/large/large_dark.png +0 -0
  105. data/templates/project/vendor/archetype/animations/loaders/large/large_dark_static.png +0 -0
  106. data/templates/project/vendor/archetype/animations/loaders/large/large_static.png +0 -0
  107. data/templates/project/vendor/archetype/animations/loaders/medium/medium.png +0 -0
  108. data/templates/project/vendor/archetype/animations/loaders/medium/medium_dark.png +0 -0
  109. data/templates/project/vendor/archetype/animations/loaders/medium/medium_dark_static.png +0 -0
  110. data/templates/project/vendor/archetype/animations/loaders/medium/medium_static.png +0 -0
  111. data/templates/project/vendor/archetype/animations/loaders/small/small.png +0 -0
  112. data/templates/project/vendor/archetype/animations/loaders/small/small_dark.png +0 -0
  113. data/templates/project/vendor/archetype/animations/loaders/small/small_dark_static.png +0 -0
  114. data/templates/project/vendor/archetype/animations/loaders/small/small_static.png +0 -0
  115. data/templates/project/vendor/archetype/fontawesome-webfont.eot +0 -0
  116. data/templates/project/vendor/archetype/fontawesome-webfont.svg +255 -0
  117. data/templates/project/vendor/archetype/fontawesome-webfont.ttf +0 -0
  118. data/templates/project/vendor/archetype/fontawesome-webfont.woff +0 -0
  119. data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.eot +0 -0
  120. data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.svg +255 -0
  121. data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.ttf +0 -0
  122. data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.woff +0 -0
  123. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large.png +0 -0
  124. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large_dark.png +0 -0
  125. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large_dark_static.png +0 -0
  126. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large_static.png +0 -0
  127. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium.png +0 -0
  128. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium_dark.png +0 -0
  129. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium_dark_static.png +0 -0
  130. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium_static.png +0 -0
  131. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small.png +0 -0
  132. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small_dark.png +0 -0
  133. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small_dark_static.png +0 -0
  134. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small_static.png +0 -0
  135. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/sprites/hovercard_tip.png +0 -0
  136. data/test/fixtures/stylesheets/archetype/config.rb +19 -0
  137. data/test/fixtures/stylesheets/archetype/expected/b.css +14 -0
  138. data/test/fixtures/stylesheets/archetype/expected/base.css +349 -0
  139. data/test/fixtures/stylesheets/archetype/expected/hacks/ie_pseudo.css +11 -0
  140. data/test/fixtures/stylesheets/archetype/expected/locale.css +23 -0
  141. data/test/fixtures/stylesheets/archetype/expected/styleguide/buttons.css +2091 -0
  142. data/test/fixtures/stylesheets/archetype/expected/styleguide/fallback_styles.css +9 -0
  143. data/test/fixtures/stylesheets/archetype/expected/styleguide/nested_styleguides.css +24 -0
  144. data/test/fixtures/stylesheets/archetype/expected/styleguide/selective_state.css +174 -0
  145. data/test/fixtures/stylesheets/archetype/expected/ui/glyph_icon.css +37 -0
  146. data/test/fixtures/stylesheets/archetype/expected/ui/hide_element.css +8 -0
  147. data/test/fixtures/stylesheets/archetype/expected/ui/stroke.css +17 -0
  148. data/test/fixtures/stylesheets/archetype/expected/ui/triangle.css +35 -0
  149. data/test/fixtures/stylesheets/archetype/expected/utilities/associative.css +9 -0
  150. data/test/fixtures/stylesheets/archetype/expected/utilities/if-set.css +9 -0
  151. data/test/fixtures/stylesheets/archetype/expected/utilities/spacing/horizontal-spacing.css +29 -0
  152. data/test/fixtures/stylesheets/archetype/expected/utilities/spacing/vertical-spacing.css +29 -0
  153. data/test/fixtures/stylesheets/archetype/expected/utilities/styles/filter.css +11 -0
  154. data/test/fixtures/stylesheets/archetype/expected/utilities/styles/font-family.css +16 -0
  155. data/test/fixtures/stylesheets/archetype/expected/utilities/styles/z-index.css +15 -0
  156. data/test/fixtures/stylesheets/archetype/expected/utilities/targeting/target-browser.css +100 -0
  157. data/test/fixtures/stylesheets/archetype/expected/utilities/targeting/target-os.css +55 -0
  158. data/test/fixtures/stylesheets/archetype/source/b.scss +9 -0
  159. data/test/fixtures/stylesheets/archetype/source/base.scss +3 -0
  160. data/test/fixtures/stylesheets/archetype/source/hacks/ie_pseudo.scss +13 -0
  161. data/test/fixtures/stylesheets/archetype/source/locale.scss +43 -0
  162. data/test/fixtures/stylesheets/archetype/source/styleguide/buttons.scss +18 -0
  163. data/test/fixtures/stylesheets/archetype/source/styleguide/fallback_styles.scss +22 -0
  164. data/test/fixtures/stylesheets/archetype/source/styleguide/nested_styleguides.scss +40 -0
  165. data/test/fixtures/stylesheets/archetype/source/styleguide/selective_state.scss +22 -0
  166. data/test/fixtures/stylesheets/archetype/source/ui/glyph_icon.scss +13 -0
  167. data/test/fixtures/stylesheets/archetype/source/ui/hide_element.scss +5 -0
  168. data/test/fixtures/stylesheets/archetype/source/ui/stroke.scss +13 -0
  169. data/test/fixtures/stylesheets/archetype/source/ui/triangle.scss +13 -0
  170. data/test/fixtures/stylesheets/archetype/source/utilities/associative.scss +24 -0
  171. data/test/fixtures/stylesheets/archetype/source/utilities/if-set.scss +16 -0
  172. data/test/fixtures/stylesheets/archetype/source/utilities/spacing/horizontal-spacing.scss +27 -0
  173. data/test/fixtures/stylesheets/archetype/source/utilities/spacing/vertical-spacing.scss +27 -0
  174. data/test/fixtures/stylesheets/archetype/source/utilities/styles/filter.scss +9 -0
  175. data/test/fixtures/stylesheets/archetype/source/utilities/styles/font-family.scss +9 -0
  176. data/test/fixtures/stylesheets/archetype/source/utilities/styles/z-index.scss +18 -0
  177. data/test/fixtures/stylesheets/archetype/source/utilities/targeting/target-browser.scss +70 -0
  178. data/test/fixtures/stylesheets/archetype/source/utilities/targeting/target-os.scss +42 -0
  179. data/test/helpers/diff.rb +49 -0
  180. data/test/helpers/io.rb +36 -0
  181. data/test/helpers/test_case.rb +62 -0
  182. data/test/integrations/archetype_test.rb +126 -0
  183. data/test/test_helper.rb +26 -0
  184. data/test/units/sass_extensions_test.rb +207 -0
  185. metadata +303 -15
@@ -0,0 +1,61 @@
1
+ # :stopdoc:
2
+ # This module implements a memoizer for caching styleguide() invocations.
3
+ #
4
+ module Archetype::Functions::StyleguideMemoizer
5
+ private
6
+ # memoized store for components we've already computed
7
+ @components ||= {}
8
+
9
+ #
10
+ # get the token for a styleguide reference given the current state of the theme
11
+ #
12
+ # *Parameters*:
13
+ # - <tt>theme</tt> {String} the theme name
14
+ # - <tt>extensions</tt> {Array} the list of currently installed extensions
15
+ # - <tt>id</tt> {String} the component identifier
16
+ # - <tt>modifiers</tt> {Array} the list of modifiers
17
+ # - <tt>state</tt> {String} the name of the state
18
+ # *Returns*:
19
+ # - {Fixnum} whether or not the value is nil/blank
20
+ #
21
+ def self.tokenize(theme, extensions, id, modifiers, state)
22
+ return nil if extensions.nil? or id.nil?
23
+ return "#{id}::#{(modifiers.to_a.sort + extensions).join('$')}::#{state}".hash
24
+ end
25
+
26
+ #
27
+ # add a value to the memoizer given a token
28
+ #
29
+ # *Parameters*:
30
+ # - <tt>theme</tt> {String} the theme name
31
+ # - <tt>token</tt> {Fixnum} the token to register
32
+ # - <tt>value</tt> {Hash} the value to store
33
+ #
34
+ def self.add(theme, token, value)
35
+ (@components[theme] ||= {})[token] = value if Compass.configuration.memoize
36
+ end
37
+
38
+ #
39
+ # fetch a value from the memoizer given a token
40
+ #
41
+ # *Parameters*:
42
+ # - <tt>theme</tt> {String} the theme name
43
+ # - <tt>token</tt> {Fixnum} the token to lookup
44
+ # *Returns*:
45
+ # - <tt>value</tt> {Hash} the value from the memoizer
46
+ #
47
+ def self.fetch(theme, token)
48
+ return false if token.nil?
49
+ return (@components[theme] ||= {})[token]
50
+ end
51
+
52
+ #
53
+ # invalidate the entire memoizer for the theme
54
+ #
55
+ # *Parameters*:
56
+ # - <tt>theme</tt> {String} the theme name
57
+ #
58
+ def self.clear(theme)
59
+ @components[theme] = {}
60
+ end
61
+ end
@@ -0,0 +1,6 @@
1
+ # :stopdoc:
2
+ # This module exposes the available methods to Sass
3
+ module Archetype::SassExtensions
4
+ end
5
+
6
+ require 'archetype/sass_extensions/functions'
@@ -0,0 +1,14 @@
1
+ %w(lists styleguide ui locale numbers version environment).each do |func|
2
+ require "archetype/sass_extensions/functions/#{func}"
3
+ end
4
+
5
+ # :stopdoc:
6
+ module Sass::Script::Functions
7
+ include Archetype::SassExtensions::Lists
8
+ include Archetype::SassExtensions::Styleguide
9
+ include Archetype::SassExtensions::UI
10
+ include Archetype::SassExtensions::Locale
11
+ include Archetype::SassExtensions::Numbers
12
+ include Archetype::SassExtensions::Version
13
+ include Archetype::SassExtensions::Environment
14
+ end
@@ -0,0 +1,14 @@
1
+ #
2
+ # Archetype environment
3
+ #
4
+ module Archetype::SassExtensions::Environment
5
+ #
6
+ # get the current environment (this is similar to compass_env)
7
+ #
8
+ # *Returns*:
9
+ # - {String} the current environment the compiler is running in
10
+ #
11
+ def archetype_env
12
+ return Sass::Script::String.new((Compass.configuration.environment || :development).to_s)
13
+ end
14
+ end
@@ -0,0 +1,284 @@
1
+ require 'archetype/functions/helpers'
2
+
3
+ #
4
+ # This module provides a set of Sass functions for working with Sass::List
5
+ #
6
+ module Archetype::SassExtensions::Lists
7
+ #
8
+ # replace an index in a list
9
+ #
10
+ # *Parameters*:
11
+ # - <tt>$list</tt> {List} the list to replace from
12
+ # - <tt>$value</tt> {\*} the value to replace (if nil, it's a removal)
13
+ # - <tt>$idx</tt> {Number} the index to replace
14
+ # - <tt>$separator</tt> {String} the separator to use [auto|comma|space]
15
+ # *Returns*:
16
+ # - {List} the list with replaced index
17
+ #
18
+ def list_replace(list, idx = false, value = nil, separator = nil)
19
+ # return early if the index is invalid (no operation)
20
+ return list if (not idx or idx == Sass::Script::Bool.new(false))
21
+ separator ||= list.separator if list.is_a?(Sass::Script::List)
22
+ # if $value is `nil`, make sure we can use it
23
+ value = nil if value == Sass::Script::String.new('nil')
24
+ # cast and zero-index $idx
25
+ idx = (idx.value) - 1
26
+ # cast list to a ruby array
27
+ list = list.to_a
28
+ # remove or replace the given value
29
+ list.delete_at(idx) if value.nil?
30
+ list[idx,1] = value if not value.nil?
31
+ return Sass::Script::List.new(list, separator)
32
+ end
33
+ Sass::Script::Functions.declare :list_replace, [:list, :idx]
34
+ Sass::Script::Functions.declare :list_replace, [:list, :idx, :value]
35
+ Sass::Script::Functions.declare :list_replace, [:list, :idx, :value, :separator]
36
+
37
+ #
38
+ # remove an index from a list
39
+ #
40
+ # *Parameters*:
41
+ # - <tt>$list</tt> {List} the list to remove from
42
+ # - <tt>$idx</tt> {Number} the index to remove
43
+ # - <tt>$separator</tt> {String} the separator to use [auto|comma|space]
44
+ # *Returns*:
45
+ # - {List} the list with removed index
46
+ #
47
+ def list_remove(list, idx = false, separator = nil)
48
+ return list_replace(list, idx, nil, separator)
49
+ end
50
+ Sass::Script::Functions.declare :list_remove, [:list, :idx]
51
+ Sass::Script::Functions.declare :list_remove, [:list, :idx, :separator]
52
+
53
+ #
54
+ # insert an item into a list
55
+ #
56
+ # *Parameters*:
57
+ # - <tt>$list</tt> {List} the list to insert into
58
+ # - <tt>$idx</tt> {Number} the index to insert at
59
+ # - <tt>$value</tt> {\*} the value to insert
60
+ # - <tt>$separator</tt> {String} the separator to use [auto|comma|space]
61
+ # *Returns*:
62
+ # - {List} the list with inserted value
63
+ #
64
+ def list_insert(list, idx = false, value = nil, separator = nil)
65
+ value = nil if value == Sass::Script::String.new('nil')
66
+ # return early if the index is invalid (no operation) or $value is `nil`
67
+ return list if (not idx or idx == Sass::Script::Bool.new(false)) or value.nil?
68
+ return list_replace(list, idx, value, separator, -1)
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]
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
105
+
106
+ #
107
+ # add values(s) to a list
108
+ #
109
+ # *Parameters*:
110
+ # - <tt>$list</tt> {List} the list operate on
111
+ # - <tt>$values</tt> {List|Number|String} the value(s) to add to the list
112
+ # *Returns*:
113
+ # - {List} the final list
114
+ #
115
+ def list_add(list, values)
116
+ return list_math(list, values, :plus)
117
+ end
118
+
119
+ #
120
+ # subtract values(s) from a list
121
+ #
122
+ # *Parameters*:
123
+ # - <tt>$list</tt> {List} the list operate on
124
+ # - <tt>$values</tt> {List|Number|String} the value(s) to subtract from the list
125
+ # *Returns*:
126
+ # - {List} the final list
127
+ #
128
+ def list_subtract(list, values)
129
+ return list_math(list, values, :minus)
130
+ end
131
+
132
+ #
133
+ # multiply values(s) into a list
134
+ #
135
+ # *Parameters*:
136
+ # - <tt>$list</tt> {List} the list operate on
137
+ # - <tt>$values</tt> {List|Number|String} the value(s) to multiply into the list
138
+ # *Returns*:
139
+ # - {List} the final list
140
+ #
141
+ def list_multiply(list, values)
142
+ return list_math(list, values, :times)
143
+ end
144
+
145
+ #
146
+ # divide values(s) into a list
147
+ #
148
+ # *Parameters*:
149
+ # - <tt>$list</tt> {List} the list operate on
150
+ # - <tt>$values</tt> {List|Number|String} the value(s) to divide into the list
151
+ # *Returns*:
152
+ # - {List} the final list
153
+ #
154
+ def list_divide(list, values)
155
+ return list_math(list, values, :div)
156
+ end
157
+
158
+ #
159
+ # list modulus value(s)
160
+ #
161
+ # *Parameters*:
162
+ # - <tt>$list</tt> {List} the list operate on
163
+ # - <tt>$values</tt> {List|Number|String} the value(s) to modulus into the list
164
+ # *Returns*:
165
+ # - {List} the final list
166
+ #
167
+ def list_mod(list, values)
168
+ return list_math(list, values, :mod)
169
+ end
170
+
171
+ #
172
+ # find if any set of values is in a list
173
+ # this is similar to `index()`, but allows $values to contain multiple values to test against
174
+ #
175
+ # *Parameters*:
176
+ # - <tt>$haystack</tt> {List} input list
177
+ # - <tt>$needle</tt> {List} the value(s) to search for
178
+ # *Returns*:
179
+ # - {Number|Bool} if an item is found, returns the index, otherwise returns false
180
+ #
181
+ def index2(haystack, needle)
182
+ haystack = haystack.to_a
183
+ needle = needle.to_a
184
+ index = haystack.index(haystack.detect { |i| needle.include?(i) })
185
+ if index
186
+ return Sass::Script::Number.new(index + 1)
187
+ else
188
+ return Sass::Script::Bool.new(false)
189
+ end
190
+ end
191
+
192
+ #
193
+ # treats a list cyclically (never out of bounds, just wraps around)
194
+ #
195
+ # *Parameters*:
196
+ # - <tt>$list</tt> {List} the list
197
+ # - <tt>$idx</tt> {Number} the index
198
+ # *Returns*:
199
+ # - {*} the nth item in the List
200
+ #
201
+ def nth_cyclic(list, n = 1)
202
+ n = n.to_i if n.is_a?(Sass::Script::Number)
203
+ list = list.to_a
204
+ return list[(n - 1) % list.size]
205
+ end
206
+
207
+ #
208
+ # find a key within a nested list of ordered pairs
209
+ #
210
+ # *Parameters*:
211
+ # - <tt>$list</tt> {List} the list to search in
212
+ # - <tt>$key</tt> {String} the key identifier (name)
213
+ # - <tt>$strict</tt> {Bool} if true, does a strict match against the key
214
+ # *Returns*:
215
+ # - {*} the data associated with $key
216
+ #
217
+ def associative(list, key, strict = false)
218
+ separator = list.separator if list.is_a?(Sass::Script::List)
219
+ list = helpers.list_to_hash(list)
220
+ item = list[helpers.to_str(key, ' ' , :quotes)]
221
+ item ||= list.first[1] if not strict
222
+ return Sass::Script::List.new([], separator) if item.nil?
223
+ return helpers.hash_to_list(item, 0, separator) if item.is_a?(Array) or item.is_a?(Hash)
224
+ # no conversion needed, so just return
225
+ return item
226
+ end
227
+ Sass::Script::Functions.declare :associative, [:list, :key]
228
+ Sass::Script::Functions.declare :associative, [:list, :key, :strict]
229
+
230
+ #
231
+ # extend a key-value paired list with another
232
+ #
233
+ # *Parameters*:
234
+ # - <tt>$list</tt> {List} the list to extend to
235
+ # - <tt>$extender</tt> {List} the list to extend with
236
+ # *Returns*:
237
+ # - <tt>$list</tt> {List} the extended list
238
+ #
239
+ def associative_merge(list, extender, kwargs = {})
240
+ separator = list.separator if list.is_a?(Sass::Script::List)
241
+ list = helpers.list_to_hash(list)
242
+ extender = helpers.list_to_hash(extender)
243
+ list = list.rmerge(extender)
244
+ return helpers.hash_to_list(list, 0, separator)
245
+ end
246
+ Sass::Script::Functions.declare :associative_merge, [:list, :extender]
247
+
248
+ private
249
+ def helpers
250
+ @helpers ||= Archetype::Functions::Helpers
251
+ end
252
+
253
+ #
254
+ # perform math operations on a list
255
+ #
256
+ # *Parameters*:
257
+ # - <tt>list</tt> {Sass::List} the list operate on
258
+ # - <tt>values</tt> {Sass::List|Sass::Number|Sass::String} the value(s) perform with
259
+ # - <tt>method</tt> {Symbol} the method to perform [:plus|:minus|:times|:div|:mod]
260
+ # *Returns*:
261
+ # - {Sass::List} the final list
262
+ #
263
+ def list_math(list, values, method = :plus)
264
+ separator = list.separator if list.is_a?(Sass::Script::List)
265
+ values = values.to_a
266
+ list = list.to_a
267
+ values.fill(values[0], 0..(list.size - 1)) if values.size < list.size
268
+ list = [list, values].transpose.map do |x|
269
+ case method
270
+ when :plus
271
+ x[0].plus(x[1])
272
+ when :minus
273
+ x[0].minus(x[1])
274
+ when :times
275
+ x[0].times(x[1])
276
+ when :div
277
+ x[0].div(x[1])
278
+ when :mod
279
+ x[0].mod(x[1])
280
+ end
281
+ end
282
+ return Sass::Script::List.new(list, separator)
283
+ end
284
+ end
@@ -0,0 +1,77 @@
1
+ #
2
+ # This module provides an interface for localization.
3
+ #
4
+ module Archetype::SassExtensions::Locale
5
+ #
6
+ # get the current locale specified in config or test a list of locales against the current locale
7
+ #
8
+ # *Parameters*:
9
+ # - <tt>$locales</tt> {List} the list of locales to test
10
+ # *Returns*:
11
+ # - {String|Boolean} the current locale or whether or not the current locale is in the test set
12
+ #
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))
32
+ end
33
+
34
+ #
35
+ # test a list of locales against the current locale (this is now just an alias for locales(), for back-compat)
36
+ #
37
+ # *Parameters*:
38
+ # - <tt>$locales</tt> {List} the list of locales to test
39
+ # *Returns*:
40
+ # - {Boolean} is the current locale in the list or not
41
+ #
42
+ def lang(locales)
43
+ return locale(locales)
44
+ end
45
+
46
+ #
47
+ # get the current reading direction
48
+ #
49
+ # *Returns*:
50
+ # - {String} is the current reading direction [ltr|rtl]
51
+ #
52
+ def reading_direction
53
+ direction = Compass.configuration.reading || 'ltr'
54
+ return Sass::Script::String.new(direction == 'rlt' ? 'rtl' : 'ltr')
55
+ end
56
+
57
+ private
58
+
59
+ LOCALE_PATTERN = /([a-z]{2})[-_]?([a-z]{2}?)/i
60
+
61
+ #
62
+ # provides an alias mapping for locale names
63
+ #
64
+ # *Returns*:
65
+ # - {Hash} a hash of aliases
66
+ #
67
+ # TODO - make this easily extensible
68
+ def locale_aliases
69
+ if @locale_aliases.nil?
70
+ a = {
71
+ 'CJK' => ['ja_JP', 'ko_KR', 'zh_TW', 'zh_CN']
72
+ }
73
+ @locale_aliases = a
74
+ end
75
+ return @locale_aliases
76
+ end
77
+ end