archetype 0.0.1.pre.13 → 1.0.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (253) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +97 -24
  3. data/README.md +11 -5
  4. data/VERSION +1 -0
  5. data/lib/archetype.rb +30 -18
  6. data/lib/archetype/actions/migrate.rb +152 -0
  7. data/lib/archetype/actions/theme.rb +6 -7
  8. data/lib/archetype/executor.rb +21 -7
  9. data/lib/archetype/extensions.rb +57 -0
  10. data/lib/archetype/functions.rb +2 -3
  11. data/lib/archetype/functions/css.rb +70 -0
  12. data/lib/archetype/functions/css/constants.rb +247 -0
  13. data/lib/archetype/functions/css/helpers.rb +265 -0
  14. data/lib/archetype/functions/css/routers.rb +28 -0
  15. data/lib/archetype/functions/css/routers/animation.rb +55 -0
  16. data/lib/archetype/functions/css/routers/background.rb +38 -0
  17. data/lib/archetype/functions/css/routers/border.rb +151 -0
  18. data/lib/archetype/functions/css/routers/list.rb +63 -0
  19. data/lib/archetype/functions/css/routers/margin_padding.rb +40 -0
  20. data/lib/archetype/functions/css/routers/outline.rb +56 -0
  21. data/lib/archetype/functions/css/routers/overflow.rb +11 -0
  22. data/lib/archetype/functions/css/routers/target.rb +38 -0
  23. data/lib/archetype/functions/css/routers/transition.rb +48 -0
  24. data/lib/archetype/functions/css/shorthands.rb +43 -0
  25. data/lib/archetype/functions/css/shorthands/animation.rb +18 -0
  26. data/lib/archetype/functions/css/shorthands/background.rb +68 -0
  27. data/lib/archetype/functions/css/shorthands/border.rb +102 -0
  28. data/lib/archetype/functions/hash.rb +3 -149
  29. data/lib/archetype/functions/hash/extend.rb +74 -0
  30. data/lib/archetype/functions/hash/shim.rb +48 -0
  31. data/lib/archetype/functions/helpers.rb +231 -22
  32. data/lib/archetype/functions/styleguide_memoizer.rb +18 -1
  33. data/lib/archetype/sass_extensions.rb +1 -3
  34. data/lib/archetype/sass_extensions/functions.rb +15 -1
  35. data/lib/archetype/sass_extensions/functions/environment.rb +152 -1
  36. data/lib/archetype/sass_extensions/functions/lists.rb +95 -45
  37. data/lib/archetype/sass_extensions/functions/locale.rb +107 -28
  38. data/lib/archetype/sass_extensions/functions/numbers.rb +118 -4
  39. data/lib/archetype/sass_extensions/functions/strings.rb +53 -0
  40. data/lib/archetype/sass_extensions/functions/styleguide.rb +43 -375
  41. data/lib/archetype/sass_extensions/functions/styleguide/components.rb +25 -0
  42. data/lib/archetype/sass_extensions/functions/styleguide/constants.rb +27 -0
  43. data/lib/archetype/sass_extensions/functions/styleguide/grammar.rb +80 -0
  44. data/lib/archetype/sass_extensions/functions/styleguide/helpers.rb +36 -0
  45. data/lib/archetype/sass_extensions/functions/styleguide/resolve.rb +159 -0
  46. data/lib/archetype/sass_extensions/functions/styleguide/styles.rb +146 -0
  47. data/lib/archetype/sass_extensions/functions/styleguide/themes.rb +40 -0
  48. data/lib/archetype/sass_extensions/functions/ui.rb +7 -57
  49. data/lib/archetype/sass_extensions/functions/ui/glyphs.rb +118 -0
  50. data/lib/archetype/sass_extensions/functions/ui/scopes.rb +96 -0
  51. data/lib/archetype/sass_extensions/functions/util.rb +14 -0
  52. data/lib/archetype/sass_extensions/functions/util/debug.rb +22 -0
  53. data/lib/archetype/sass_extensions/functions/util/hacks.rb +44 -0
  54. data/lib/archetype/sass_extensions/functions/util/images.rb +132 -0
  55. data/lib/archetype/sass_extensions/functions/util/misc.rb +220 -0
  56. data/lib/archetype/sass_extensions/functions/util/spacing.rb +83 -0
  57. data/lib/archetype/sass_extensions/functions/version.rb +12 -17
  58. data/lib/archetype/version.rb +1 -1
  59. data/stylesheets/archetype/_config.scss +1 -389
  60. data/stylesheets/archetype/_core.scss +15 -0
  61. data/stylesheets/archetype/_hacks.scss +4 -120
  62. data/stylesheets/archetype/_init.scss +4 -22
  63. data/stylesheets/archetype/_required.scss +3 -0
  64. data/stylesheets/archetype/_reset.scss +3 -0
  65. data/stylesheets/archetype/_styleguide.scss +2 -6
  66. data/stylesheets/archetype/_ui.scss +2 -358
  67. data/stylesheets/archetype/_util.scss +3 -10
  68. data/stylesheets/archetype/config/_core.scss +14 -0
  69. data/stylesheets/archetype/config/_environment.scss +19 -0
  70. data/stylesheets/archetype/config/_formatting.scss +63 -0
  71. data/stylesheets/archetype/config/_glyphs.scss +252 -0
  72. data/stylesheets/archetype/config/_resets.scss +7 -0
  73. data/stylesheets/archetype/config/_resolution.scss +3 -0
  74. data/stylesheets/archetype/config/_spacing.scss +5 -0
  75. data/stylesheets/archetype/config/_targeting.scss +18 -0
  76. data/stylesheets/archetype/config/_theme.scss +3 -0
  77. data/stylesheets/archetype/config/_typography.scss +56 -0
  78. data/stylesheets/archetype/config/_units.scss +2 -0
  79. data/stylesheets/archetype/config/_vars.scss +10 -0
  80. data/stylesheets/archetype/hacks/_core.scss +4 -0
  81. data/stylesheets/archetype/hacks/_hacks.scss +160 -0
  82. data/stylesheets/archetype/hacks/_init.scss +2 -0
  83. data/stylesheets/archetype/styleguide/_core.scss +4 -0
  84. data/stylesheets/archetype/styleguide/_init.scss +1 -0
  85. data/stylesheets/archetype/styleguide/_styleguide.scss +41 -18
  86. data/stylesheets/archetype/ui/_accessibility.scss +41 -0
  87. data/stylesheets/archetype/ui/_breakpoints.scss +19 -0
  88. data/stylesheets/archetype/ui/_core.scss +10 -0
  89. data/stylesheets/archetype/ui/_elements.scss +98 -0
  90. data/stylesheets/archetype/ui/_glyphs.scss +244 -0
  91. data/stylesheets/archetype/ui/_init.scss +5 -0
  92. data/stylesheets/archetype/ui/_layout.scss +37 -0
  93. data/stylesheets/archetype/ui/_locale.scss +12 -0
  94. data/stylesheets/archetype/ui/_scopes.scss +42 -0
  95. data/stylesheets/archetype/util/_core.scss +8 -0
  96. data/stylesheets/archetype/util/_debug.scss +9 -21
  97. data/stylesheets/archetype/util/_init.scss +1 -0
  98. data/stylesheets/archetype/util/_misc.scss +21 -86
  99. data/stylesheets/archetype/util/_spacing.scss +9 -40
  100. data/stylesheets/archetype/util/_styles.scss +189 -178
  101. data/stylesheets/archetype/util/_targeting.scss +51 -68
  102. data/templates/example/manifest.rb +2 -2
  103. data/templates/example/screen.scss +0 -1
  104. data/templates/project/manifest.rb +3 -8
  105. metadata +93 -263
  106. data/bin/archetype +0 -3
  107. data/lib/archetype/sass_extensions/monkey_patches.rb +0 -3
  108. data/lib/archetype/sass_extensions/monkey_patches/handle_include_loop.rb +0 -13
  109. data/stylesheets/archetype/_base.scss +0 -54
  110. data/stylesheets/archetype/_grid.scss +0 -3
  111. data/stylesheets/archetype/base/_h5bp.scss +0 -307
  112. data/stylesheets/archetype/base/_hybrid.scss +0 -25
  113. data/stylesheets/archetype/base/_normalize.scss +0 -634
  114. data/stylesheets/archetype/base/_reset.scss +0 -72
  115. data/stylesheets/archetype/grid/_config.scss +0 -14
  116. data/stylesheets/archetype/grid/_grid.scss +0 -391
  117. data/stylesheets/archetype/styleguide/_components.scss +0 -25
  118. data/stylesheets/archetype/styleguide/_helpers.scss +0 -215
  119. data/stylesheets/archetype/styleguide/_primitives.scss +0 -10
  120. data/stylesheets/archetype/styleguide/components/_alerts.scss +0 -59
  121. data/stylesheets/archetype/styleguide/components/_annotations.scss +0 -27
  122. data/stylesheets/archetype/styleguide/components/_bristol.scss +0 -15
  123. data/stylesheets/archetype/styleguide/components/_button_groups.scss +0 -47
  124. data/stylesheets/archetype/styleguide/components/_button_toolbars.scss +0 -17
  125. data/stylesheets/archetype/styleguide/components/_buttons.scss +0 -339
  126. data/stylesheets/archetype/styleguide/components/_canvas.scss +0 -15
  127. data/stylesheets/archetype/styleguide/components/_carets.scss +0 -336
  128. data/stylesheets/archetype/styleguide/components/_closes.scss +0 -63
  129. data/stylesheets/archetype/styleguide/components/_container.scss +0 -27
  130. data/stylesheets/archetype/styleguide/components/_copy.scss +0 -85
  131. data/stylesheets/archetype/styleguide/components/_flyouts.scss +0 -52
  132. data/stylesheets/archetype/styleguide/components/_headings.scss +0 -33
  133. data/stylesheets/archetype/styleguide/components/_headlines.scss +0 -64
  134. data/stylesheets/archetype/styleguide/components/_hovercards.scss +0 -27
  135. data/stylesheets/archetype/styleguide/components/_icons.scss +0 -17
  136. data/stylesheets/archetype/styleguide/components/_identities.scss +0 -34
  137. data/stylesheets/archetype/styleguide/components/_links.scss +0 -68
  138. data/stylesheets/archetype/styleguide/components/_loaders.scss +0 -154
  139. data/stylesheets/archetype/styleguide/components/_menu_items.scss +0 -31
  140. data/stylesheets/archetype/styleguide/components/_module.scss +0 -15
  141. data/stylesheets/archetype/styleguide/components/_pullquotes.scss +0 -29
  142. data/stylesheets/archetype/styleguide/components/_punchcut.scss +0 -18
  143. data/stylesheets/archetype/styleguide/components/_tooltips.scss +0 -28
  144. data/stylesheets/archetype/styleguide/primitives/_animations.scss +0 -17
  145. data/stylesheets/archetype/styleguide/primitives/_dimensions.scss +0 -50
  146. data/stylesheets/archetype/styleguide/primitives/_glyphs.scss +0 -11
  147. data/stylesheets/archetype/styleguide/primitives/_misc.scss +0 -8
  148. data/stylesheets/archetype/styleguide/primitives/_palettes.scss +0 -94
  149. data/stylesheets/archetype/styleguide/primitives/_shadows.scss +0 -23
  150. data/stylesheets/archetype/styleguide/primitives/_sprites.scss +0 -46
  151. data/stylesheets/archetype/styleguide/primitives/_textures.scss +0 -10
  152. data/stylesheets/archetype/styleguide/primitives/_typography.scss +0 -56
  153. data/stylesheets/archetype/util/_lists.scss +0 -57
  154. data/stylesheets/archetype/util/_rtl.scss +0 -279
  155. data/stylesheets/archetype/util/_units.scss +0 -18
  156. data/templates/project/screen.scss +0 -1
  157. data/templates/project/vendor/archetype/animations/loaders/large/large.png +0 -0
  158. data/templates/project/vendor/archetype/animations/loaders/large/large_dark.png +0 -0
  159. data/templates/project/vendor/archetype/animations/loaders/large/large_dark_static.png +0 -0
  160. data/templates/project/vendor/archetype/animations/loaders/large/large_static.png +0 -0
  161. data/templates/project/vendor/archetype/animations/loaders/medium/medium.png +0 -0
  162. data/templates/project/vendor/archetype/animations/loaders/medium/medium_dark.png +0 -0
  163. data/templates/project/vendor/archetype/animations/loaders/medium/medium_dark_static.png +0 -0
  164. data/templates/project/vendor/archetype/animations/loaders/medium/medium_static.png +0 -0
  165. data/templates/project/vendor/archetype/animations/loaders/small/small.png +0 -0
  166. data/templates/project/vendor/archetype/animations/loaders/small/small_dark.png +0 -0
  167. data/templates/project/vendor/archetype/animations/loaders/small/small_dark_static.png +0 -0
  168. data/templates/project/vendor/archetype/animations/loaders/small/small_static.png +0 -0
  169. data/templates/project/vendor/archetype/fontawesome-webfont.eot +0 -0
  170. data/templates/project/vendor/archetype/fontawesome-webfont.svg +0 -255
  171. data/templates/project/vendor/archetype/fontawesome-webfont.ttf +0 -0
  172. data/templates/project/vendor/archetype/fontawesome-webfont.woff +0 -0
  173. data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.eot +0 -0
  174. data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.svg +0 -255
  175. data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.ttf +0 -0
  176. data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.woff +0 -0
  177. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders-s7889ccc8c1.png +0 -0
  178. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large.png +0 -0
  179. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large_dark.png +0 -0
  180. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large_dark_static.png +0 -0
  181. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large_static.png +0 -0
  182. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium.png +0 -0
  183. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium_dark.png +0 -0
  184. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium_dark_static.png +0 -0
  185. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium_static.png +0 -0
  186. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small.png +0 -0
  187. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small_dark.png +0 -0
  188. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small_dark_static.png +0 -0
  189. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small_static.png +0 -0
  190. data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/sprites/hovercard_tip.png +0 -0
  191. data/test/fixtures/stylesheets/archetype/config.rb +0 -21
  192. data/test/fixtures/stylesheets/archetype/source/b.scss +0 -9
  193. data/test/fixtures/stylesheets/archetype/source/base.scss +0 -3
  194. data/test/fixtures/stylesheets/archetype/source/hacks/ie_pseudo.scss +0 -13
  195. data/test/fixtures/stylesheets/archetype/source/hacks/transparent_focusable.scss +0 -5
  196. data/test/fixtures/stylesheets/archetype/source/locale.scss +0 -43
  197. data/test/fixtures/stylesheets/archetype/source/styleguide/alerts.scss +0 -21
  198. data/test/fixtures/stylesheets/archetype/source/styleguide/buttons.scss +0 -18
  199. data/test/fixtures/stylesheets/archetype/source/styleguide/drop.scss +0 -101
  200. data/test/fixtures/stylesheets/archetype/source/styleguide/extend.scss +0 -24
  201. data/test/fixtures/stylesheets/archetype/source/styleguide/fallback_styles.scss +0 -23
  202. data/test/fixtures/stylesheets/archetype/source/styleguide/invalid_structures.scss +0 -85
  203. data/test/fixtures/stylesheets/archetype/source/styleguide/multi_value.scss +0 -18
  204. data/test/fixtures/stylesheets/archetype/source/styleguide/nested_styleguides.scss +0 -40
  205. data/test/fixtures/stylesheets/archetype/source/styleguide/selective_state.scss +0 -22
  206. data/test/fixtures/stylesheets/archetype/source/ui/glyph_icon.scss +0 -35
  207. data/test/fixtures/stylesheets/archetype/source/ui/hide_element.scss +0 -5
  208. data/test/fixtures/stylesheets/archetype/source/ui/stroke.scss +0 -13
  209. data/test/fixtures/stylesheets/archetype/source/ui/triangle.scss +0 -13
  210. data/test/fixtures/stylesheets/archetype/source/utilities/associative.scss +0 -24
  211. data/test/fixtures/stylesheets/archetype/source/utilities/custom_output_styler.scss +0 -22
  212. data/test/fixtures/stylesheets/archetype/source/utilities/if-set.scss +0 -16
  213. data/test/fixtures/stylesheets/archetype/source/utilities/spacing/horizontal-spacing.scss +0 -27
  214. data/test/fixtures/stylesheets/archetype/source/utilities/spacing/vertical-spacing.scss +0 -27
  215. data/test/fixtures/stylesheets/archetype/source/utilities/styles/filter.scss +0 -9
  216. data/test/fixtures/stylesheets/archetype/source/utilities/styles/font-family.scss +0 -9
  217. data/test/fixtures/stylesheets/archetype/source/utilities/styles/z-index.scss +0 -18
  218. data/test/fixtures/stylesheets/archetype/source/utilities/targeting/target-browser.scss +0 -77
  219. data/test/fixtures/stylesheets/archetype/source/utilities/targeting/target-os.scss +0 -42
  220. data/test/fixtures/stylesheets/archetype/tmp/b.css +0 -14
  221. data/test/fixtures/stylesheets/archetype/tmp/base.css +0 -349
  222. data/test/fixtures/stylesheets/archetype/tmp/hacks/ie_pseudo.css +0 -11
  223. data/test/fixtures/stylesheets/archetype/tmp/hacks/transparent_focusable.css +0 -4
  224. data/test/fixtures/stylesheets/archetype/tmp/locale.css +0 -23
  225. data/test/fixtures/stylesheets/archetype/tmp/styleguide/alerts.css +0 -711
  226. data/test/fixtures/stylesheets/archetype/tmp/styleguide/buttons.css +0 -2119
  227. data/test/fixtures/stylesheets/archetype/tmp/styleguide/drop.css +0 -63
  228. data/test/fixtures/stylesheets/archetype/tmp/styleguide/extend.css +0 -11
  229. data/test/fixtures/stylesheets/archetype/tmp/styleguide/fallback_styles.css +0 -10
  230. data/test/fixtures/stylesheets/archetype/tmp/styleguide/invalid_structures.css +0 -21
  231. data/test/fixtures/stylesheets/archetype/tmp/styleguide/multi_value.css +0 -13
  232. data/test/fixtures/stylesheets/archetype/tmp/styleguide/nested_styleguides.css +0 -28
  233. data/test/fixtures/stylesheets/archetype/tmp/styleguide/selective_state.css +0 -177
  234. data/test/fixtures/stylesheets/archetype/tmp/ui/glyph_icon.css +0 -127
  235. data/test/fixtures/stylesheets/archetype/tmp/ui/hide_element.css +0 -8
  236. data/test/fixtures/stylesheets/archetype/tmp/ui/stroke.css +0 -17
  237. data/test/fixtures/stylesheets/archetype/tmp/ui/triangle.css +0 -35
  238. data/test/fixtures/stylesheets/archetype/tmp/utilities/associative.css +0 -9
  239. data/test/fixtures/stylesheets/archetype/tmp/utilities/custom_output_styler.css +0 -8
  240. data/test/fixtures/stylesheets/archetype/tmp/utilities/if-set.css +0 -9
  241. data/test/fixtures/stylesheets/archetype/tmp/utilities/spacing/horizontal-spacing.css +0 -29
  242. data/test/fixtures/stylesheets/archetype/tmp/utilities/spacing/vertical-spacing.css +0 -29
  243. data/test/fixtures/stylesheets/archetype/tmp/utilities/styles/filter.css +0 -11
  244. data/test/fixtures/stylesheets/archetype/tmp/utilities/styles/font-family.css +0 -16
  245. data/test/fixtures/stylesheets/archetype/tmp/utilities/styles/z-index.css +0 -15
  246. data/test/fixtures/stylesheets/archetype/tmp/utilities/targeting/target-browser.css +0 -105
  247. data/test/fixtures/stylesheets/archetype/tmp/utilities/targeting/target-os.css +0 -55
  248. data/test/helpers/diff.rb +0 -49
  249. data/test/helpers/io.rb +0 -36
  250. data/test/helpers/test_case.rb +0 -62
  251. data/test/integrations/archetype_test.rb +0 -126
  252. data/test/test_helper.rb +0 -26
  253. data/test/units/sass_extensions_test.rb +0 -200
@@ -0,0 +1,25 @@
1
+ module Archetype::SassExtensions::Styleguide
2
+
3
+ private
4
+
5
+ #
6
+ # check whether or not a component (or a component extension) has already been defined
7
+ #
8
+ # *Parameters*:
9
+ # - <tt>id</tt> {String} the component identifier
10
+ # - <tt>theme</tt> {String} the theme to insert the component into
11
+ # - <tt>extension</tt> {String} the name of the extension
12
+ # - <tt>force</tt> {Boolean} if true, forcibly extend the component
13
+ # *Returns*:
14
+ # - {Boolean} whether or not the component/extension exists
15
+ #
16
+ def component_exists(id, theme = nil, extension = nil, force = false)
17
+ status = false
18
+ theme = get_theme(theme) if not theme.is_a? Hash
19
+ id = helpers.to_str(id)
20
+ # determine the status of the component
21
+ status = (extension.nil?) ? (not theme[:components][id].nil?) : theme[:extensions].include?(extension)
22
+ return (status and not force and Compass.configuration.memoize)
23
+ end
24
+
25
+ end
@@ -0,0 +1,27 @@
1
+ module Archetype::SassExtensions::Styleguide
2
+
3
+ private
4
+
5
+ # :stopdoc:
6
+ INHERIT = 'inherit'
7
+ STYLEGUIDE = 'styleguide'
8
+ DROP = 'drop'
9
+ DEFAULT = 'default'
10
+ REGEX = 'regex'
11
+ SPECIAL = %w(states selectors)
12
+ STATES = SPECIAL[0]
13
+ DROPALL = %w(all true)
14
+ MESSAGE_PREFIX = "[#{Archetype.name}:{origin}:{phase}] --- `"
15
+ MESSAGE_SUFFIX = "` ---"
16
+ # these are unique CSS keys that can be exploited to provide fallback functionality by providing a second value
17
+ # e.g color: red; color: rgba(255,0,0, 0.8);
18
+ FALLBACKS = %w(background background-image background-color border border-bottom border-bottom-color border-color border-left border-left-color border-right border-right-color border-top border-top-color clip color layer-background-color outline outline-color white-space extend)
19
+ # these are mixins that make sense to run multiple times within a block
20
+ MULTIMIXINS = %w(target-browser)
21
+ # NOTE: these are no longer used/needed if you're using the map structures
22
+ ADDITIVES = FALLBACKS + [DROP, INHERIT, STYLEGUIDE] + MULTIMIXINS
23
+ @@archetype_styleguide_mutex = Mutex.new
24
+ @@styleguide_themes ||= nil
25
+ # :startdoc:
26
+
27
+ end
@@ -0,0 +1,80 @@
1
+ module Archetype::SassExtensions::Styleguide
2
+
3
+ private
4
+
5
+ #
6
+ # given a sentence, deconstruct it into it's identifier and verbages
7
+ #
8
+ # *Parameters*:
9
+ # - <tt>sentence</tt> {String|List} the sentence describing the component
10
+ # - <tt>theme</tt> {String} the theme to use
11
+ # - <tt>state</tt> {String} the name of a state to return
12
+ # *Returns*:
13
+ # - {Array} an array containing the identifer, modifiers, and a token
14
+ #
15
+ def grammar(sentence, theme = nil, state = nil)
16
+ theme = get_theme(theme)
17
+ components = theme[:components]
18
+ # get a list of valid ids
19
+ styleguideIds = components.keys
20
+ sentence = sentence.split if sentence.is_a? String
21
+
22
+ id, modifiers = grammarize(sentence, styleguideIds)
23
+
24
+ # if there was no id, return a list of valid IDs for reporting
25
+ modifiers = styleguideIds if id.nil?
26
+ # get the list of currenty installed component extensions
27
+ extensions = theme[:extensions] if not id.nil?
28
+ # TODO - low - eoneill: make sure we always want to return unique modifiers
29
+ # i can't think of a case where we wouldn't want to remove dups
30
+ # maybe in the case where we're looking for strict keys on the lookup?
31
+ modifiers = modifiers.uniq
32
+ token = memoizer.tokenize(theme[:name], extensions, id, modifiers, state)
33
+ return id, modifiers, token
34
+ end
35
+
36
+ #
37
+ # given a sentence, convert it to it's internal representation
38
+ #
39
+ # *Parameters*:
40
+ # - <tt>sentence</tt> {Array|List} the sentence describing the component
41
+ # - <tt>ids</tt> {Array} the list of identifiers
42
+ # *Returns*:
43
+ # - {Array} an array containing the identifer and modifiers
44
+ #
45
+ def grammarize(sentence, ids = [])
46
+ sentence = sentence.to_a
47
+ id = nil
48
+ modifiers = []
49
+ if not sentence.empty?
50
+ prefix = ''
51
+ order = ''
52
+ # these define various attributes for modifiers (e.g. `button with a shadow`)
53
+ extras = %w(on with without)
54
+ # these are things that are useless to us, so we just leave them out
55
+ ignore = %w(a an also the this that is was it)
56
+ # these are our context switches (e.g. `headline in a button`)
57
+ contexts = %w(in within)
58
+ sentence.each do |item|
59
+ item = item.value if not item.is_a?(String)
60
+ # find the ID
61
+ if id.nil? and ids.include?(item) and prefix.empty? and order.empty?
62
+ id = item
63
+ # if it's a `context`, we need to increase the depth and reset the prefix
64
+ elsif contexts.include?(item)
65
+ order = "#{item}-#{order}"
66
+ prefix = ''
67
+ # if it's an `extra`, we update the prefix
68
+ elsif extras.include?(item)
69
+ prefix = "#{item}-"
70
+ # finally, check that it's not on the ignore (useless) list. if it is, we just skip over it
71
+ # (maybe this should be the first thing we check?)
72
+ elsif not ignore.include?(item)
73
+ modifiers.push("#{order}#{prefix}#{item}")
74
+ end
75
+ end
76
+ end
77
+ return id, modifiers
78
+ end
79
+
80
+ end
@@ -0,0 +1,36 @@
1
+ module Archetype::SassExtensions::Styleguide
2
+
3
+ private
4
+
5
+ def memoizer
6
+ Archetype::Functions::StyleguideMemoizer
7
+ end
8
+
9
+ #
10
+ # normalize the styleguide definition into a hash representative of the definition
11
+ #
12
+ # *Parameters*:
13
+ # - <tt>definition</tt> {String|List|Hash|Map} the styleguide definition
14
+ # *Returns*:
15
+ # - {Hash} the normalized hash representing the styleguide definition
16
+ #
17
+ def normalize_styleguide_definition(definition)
18
+ # if it's not a map, we got a description, which we need to convert
19
+ definition = get_styles([definition], nil, nil) if not definition.is_a?(Sass::Script::Value::Map)
20
+ # now convert the map to a hash if needed
21
+ definition = helpers.data_to_hash(definition) if not definition.is_a?(Hash)
22
+ definition = resolve_runtime_locale_values(definition)
23
+ return definition
24
+ end
25
+
26
+ def self.reset!(filename = nil)
27
+ @@archetype_styleguide_mutex.synchronize do
28
+ if filename.nil?
29
+ @@styleguide_themes = {}
30
+ else
31
+ (@@styleguide_themes ||= {}).delete(filename.hash)
32
+ end
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,159 @@
1
+ module Archetype::SassExtensions::Styleguide
2
+
3
+ private
4
+
5
+ #
6
+ # given two objects, resolve the chain of dropped styles
7
+ # this runs after having already resolved the dropped styles and merged
8
+ #
9
+ # *Parameters*:
10
+ # - <tt>obj</tt> {Hash} the source object
11
+ # - <tt>merger</tt> {Hash} the object to be merged in
12
+ # *Returns*:
13
+ # - {Array.<Hash>} the resulting `obj` and `merger` objects
14
+ #
15
+ def post_resolve_drops(obj, merger)
16
+ # just return if it's nil
17
+ return [obj, merger] if helpers.is_value(obj, :nil) or helpers.is_value(merger, :nil)
18
+ # if it's a Sass::List, this is really an empty hash, so return a new hash
19
+ return [obj, Archetype::Hash.new] if merger.is_a?(Sass::Script::Value::List)
20
+ drop = merger[DROP]
21
+ keys = obj.keys
22
+ if not drop.nil?
23
+ drop.to_a.each do |key|
24
+ key = helpers.to_str(key)
25
+ obj.delete(key) if not SPECIAL.include?(key)
26
+ end
27
+ merger.delete(DROP)
28
+ end
29
+ SPECIAL.each do |special|
30
+ if obj[special].is_a?(Hash) and merger[special].is_a?(Hash)
31
+ obj[special], merger[special] = post_resolve_drops(obj[special], merger[special])
32
+ end
33
+ end
34
+ return [obj, merger]
35
+ end
36
+
37
+ #
38
+ # given two objects, resolve the chain of dropped styles
39
+ #
40
+ # *Parameters*:
41
+ # - <tt>value</tt> {Hash} the source object
42
+ # - <tt>obj</tt> {Hash} the object to be merged in
43
+ # - <tt>is_special</tt> {Boolean} whether this is from a SPECIAL branch of a Hash
44
+ # *Returns*:
45
+ # - {Array.<Hash>} the resulting value
46
+ #
47
+ def resolve_drops(value, obj, is_special = false)
48
+ return value if not (value.is_a?(Hash) and obj.is_a?(Hash))
49
+ keys = obj.keys
50
+ drop = value[DROP]
51
+ if not drop.nil?
52
+ tmp = Archetype::Hash.new
53
+ if DROPALL.include?(helpers.to_str(drop))
54
+ if not keys.nil?
55
+ keys.each do |key|
56
+ special_drop_key(obj, tmp, key)
57
+ end
58
+ end
59
+ else
60
+ drop.to_a.each do |key|
61
+ key = helpers.to_str(key)
62
+ special_drop_key(obj, tmp, key)
63
+ end
64
+ end
65
+ value.delete(DROP) if not is_special
66
+ value = tmp.rmerge(value)
67
+ end
68
+ # suppress warnings from hashery (warning: multiple values for a block parameter (2 for 1))
69
+ ::Sass::Util.silence_warnings do
70
+ value.each do |key|
71
+ value[key] = resolve_drops(value[key], obj[key], key, SPECIAL.include?(key)) if not value[key].nil?
72
+ end
73
+ end
74
+ return value
75
+ end
76
+
77
+
78
+ #
79
+ # helper method for resolve_drops
80
+ #
81
+ # *Parameters*:
82
+ # - <tt>obj</tt> {Hash} the object
83
+ # - <tt>tmp</tt> {Hash} the temporary object
84
+ # - <tt>key</tt> {String} the key we care about
85
+ #
86
+ def special_drop_key(obj, tmp, key)
87
+ if SPECIAL.include?(key)
88
+ if not (obj[key].nil? or obj[key].empty?)
89
+ tmp[key] = Archetype::Hash.new
90
+ tmp[key][DROP] = obj[key].keys
91
+ end
92
+ else
93
+ tmp[key] = null
94
+ end
95
+ end
96
+
97
+ #
98
+ # resolve any dependent references from the component
99
+ #
100
+ # *Parameters*:
101
+ # - <tt>id</tt> {String} the component identifier
102
+ # - <tt>value</tt> {Hash} the current value
103
+ # - <tt>theme</tt> {String} the theme to use
104
+ # - <tt>context</tt> {Hash} the context to work in
105
+ # - <tt>keys</tt> {Array} list of the external keys
106
+ # *Returns*:
107
+ # - {Hash} a hash of the resolved styles
108
+ #
109
+ def resolve_dependents(id, value, theme = nil, context = nil, obj = nil)
110
+ return value if value.nil?
111
+ # we have to create a clone here as the passed in value is volatile and we're performing destructive changes
112
+ value = value.clone
113
+ # check that we're dealing with a hash
114
+ if value.is_a?(Hash)
115
+ # check for dropped styles
116
+ value = resolve_drops(value, obj)
117
+
118
+ # check for inheritance
119
+ inherit = value[INHERIT]
120
+ if not inherit.nil?
121
+ if helpers.is_value(inherit, :hashy)
122
+ inherit = helpers.meta_to_array(inherit)
123
+ else
124
+ inherit = [inherit.to_a]
125
+ end
126
+ if not inherit.empty?
127
+ # create a temporary object and extract the nested styles
128
+ tmp = Archetype::Hash.new
129
+ inherit.each { |related| tmp = tmp.rmerge(extract_styles(id, related, true, theme, context)) }
130
+ # remove the inheritance key and update the styles
131
+ value.delete(INHERIT)
132
+ inherit = extract_styles(id, inherit, true, theme, context)
133
+ value = inherit.rmerge(value)
134
+ value = tmp.rmerge(value)
135
+ end
136
+ end
137
+ end
138
+ # return whatever we got
139
+ return value
140
+ end
141
+
142
+ #
143
+ # this helps to resolve any runtime locale values
144
+ #
145
+ def resolve_runtime_locale_values(hsh)
146
+ hsh.each do |key, value|
147
+ if value.is_a?(Hash)
148
+ meta = value[helpers::META[:meta]]
149
+ if meta && (meta.to_h)[helpers::META[:decorators][:runtime_locales]]
150
+ hsh[key] = get_runtime_locale_value(value)
151
+ else
152
+ hsh[key] = resolve_runtime_locale_values(value)
153
+ end
154
+ end
155
+ end
156
+ return hsh
157
+ end
158
+
159
+ end
@@ -0,0 +1,146 @@
1
+ module Archetype::SassExtensions::Styleguide
2
+
3
+ private
4
+
5
+ #
6
+ # interface for extracting styles in the styleguide references
7
+ #
8
+ # *Parameters*:
9
+ # - <tt>id</tt> {String} the component identifier
10
+ # - <tt>modifiers</tt> {Array} the component modifiers
11
+ # - <tt>strict</tt> {Boolean} is it a strict lookup?
12
+ # - <tt>theme</tt> {String} the theme to use
13
+ # - <tt>context</tt> {Hash} the context to work in
14
+ # *Returns*:
15
+ # - {Hash} a hash of the extracted styles
16
+ #
17
+ def extract_styles(id, modifiers, strict = false, theme = nil, context = nil)
18
+ theme = get_theme(theme)
19
+ context ||= theme[:components][id] || Archetype::Hash.new
20
+ modifiers = helpers.to_str(modifiers)
21
+ return Archetype::Hash.new if helpers.is_value(context, :nil) or context.empty?
22
+ # push on the defaults first
23
+ out = (strict ? resolve_dependents(id, context[modifiers], theme[:name], context) : context[DEFAULT]) || Archetype::Hash.new
24
+ out = out.clone
25
+ return Archetype::Hash.new if out == null
26
+ # if it's not strict, find anything that matched
27
+ if not strict
28
+ modifiers = modifiers.split
29
+ context.each do |key, definition|
30
+ modifier = grammarize(key.split(' '))[1].join(' ')
31
+ if modifier != DEFAULT
32
+ match = true
33
+ modifier = modifier.split
34
+ if modifier[0] == REGEX
35
+ # if it's a regex pattern, test if it matches
36
+ match = modifiers.join(' ') =~ /#{modifier[1].gsub(/\A"|"\Z/, '')}/i
37
+ else
38
+ # otherwise, if the modifier isn't in our list of modifiers, it's not valid and just move on
39
+ modifier.each { |i| match = false if not modifiers.include?(i) }
40
+ end
41
+ # if it matched, process it
42
+ if match
43
+ tmp = resolve_dependents(id, definition, theme[:name], nil, out)
44
+ out, tmp = post_resolve_drops(out, tmp)
45
+ out = out.rmerge(tmp) if not helpers.is_value(tmp, :nil)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ if out.is_a? Hash
51
+ # recompose the special keys and extract any nested/inherited styles
52
+ # this lets us define special states and elements
53
+ SPECIAL.each do |special_key|
54
+ special = out[special_key] || Archetype::Hash.new
55
+ if special == null
56
+ out[special_key] = Archetype::Hash.new
57
+ else
58
+ tmp = Archetype::Hash.new
59
+ special.each { |key, value| tmp[key] = extract_styles(key, key, true, theme[:name], special) }
60
+ out[special_key] = tmp if not tmp.empty?
61
+ end
62
+ end
63
+
64
+ # check for nested styleguides
65
+ styleguide = out[STYLEGUIDE]
66
+ if not styleguide.nil?
67
+ if helpers.is_value(styleguide, :hashy)
68
+ styleguide = helpers.meta_to_array(styleguide)
69
+ else
70
+ styleguide = [styleguide]
71
+ end
72
+ if not styleguide.empty?
73
+ styles = get_styles(styleguide, theme[:name])
74
+ out.delete(STYLEGUIDE)
75
+ out = styles.rmerge(out)
76
+ end
77
+ end
78
+ end
79
+ return out
80
+ end
81
+
82
+ #
83
+ # driver method for converting a sentence into a list of styles
84
+ #
85
+ # *Parameters*:
86
+ # - <tt>description</tt> {String|List|Array} the description of the component
87
+ # - <tt>theme</tt> {String} the theme to use
88
+ # - <tt>state</tt> {String} the name of a state to return
89
+ # *Returns*:
90
+ # - {Hash} the styles
91
+ #
92
+ def get_styles(description, theme = nil, state = nil)
93
+ styles = Archetype::Hash.new
94
+
95
+ all_states = state.nil? || state == null || state == Sass::Script::Value::Bool::FALSE
96
+
97
+ # debug message
98
+ message = []
99
+ message_extras = []
100
+
101
+ # for each description, extract the associated styles
102
+ description.to_a.each do |sentence|
103
+ # if we have a hash, it denotes multiple values, so we need to convert this back to an array and recurse
104
+ return get_styles(helpers.meta_to_array(sentence)) if helpers.is_value(sentence, :hashy)
105
+ message << sentence
106
+ # get the grammar from the sentence
107
+ id, modifiers, token = grammar(sentence, theme, state)
108
+ if id
109
+ # check memoizer
110
+ extracted = memoizer.fetch_or_create(theme, token) do
111
+ # fetch additional styles
112
+ extracted = extract_styles(id, modifiers, false, theme)
113
+ # we can delete anything that had a value of `nil` as we won't be outputting those
114
+ extracted.delete_if { |k,v| helpers.is_value(v, :nil) }
115
+ # expose the result to the block
116
+ extracted
117
+ end
118
+ styles = styles.rmerge(extracted)
119
+ elsif not helpers.is_value(sentence, :nil)
120
+ msg = modifiers.length > 0 ? "please specify one of: #{modifiers.sort.join(', ')}" : "there are no registered components"
121
+ helpers.warn("[#{Archetype.name}:styleguide:missing_identifier] `#{helpers.to_str(sentence)}` does not contain an identifier. #{msg}")
122
+ end
123
+ end
124
+
125
+ message = message.join(', ')
126
+ message_extras << "theme: #{theme}" if not theme.nil? and not [environment.var('CONFIG_THEME'), Archetype.name].include?(theme)
127
+ message_extras << "state: #{state}" if not all_states
128
+ if not message_extras.empty?
129
+ message << " (#{message_extras.join(', ')})"
130
+ end
131
+
132
+ # now that we've collected all of our styles, if we requested a single state, merge that state upstream
133
+ if not (all_states or styles[STATES].nil? or styles[STATES].empty?)
134
+ state = helpers.to_str(state)
135
+ state = styles[STATES][state]
136
+ # remove any nested/special keys
137
+ SPECIAL.each do |special|
138
+ styles.delete(special)
139
+ end
140
+ styles = styles.merge(state) if not (state.nil? or state.empty?)
141
+ end
142
+
143
+ return helpers.add_meta_message(styles, "#{MESSAGE_PREFIX}#{message}#{MESSAGE_SUFFIX}")
144
+ end
145
+
146
+ end