haml_ejs 0.0.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.
Files changed (358) hide show
  1. data/.yardopts +11 -0
  2. data/CONTRIBUTING +3 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.md +68 -0
  5. data/Rakefile +419 -0
  6. data/VERSION +1 -0
  7. data/VERSION_NAME +1 -0
  8. data/bin/haml +9 -0
  9. data/bin/html2haml +7 -0
  10. data/extra/update_watch.rb +13 -0
  11. data/init.rb +18 -0
  12. data/lib/haml.rb +49 -0
  13. data/lib/haml/buffer.rb +297 -0
  14. data/lib/haml/compiler.rb +486 -0
  15. data/lib/haml/engine.rb +312 -0
  16. data/lib/haml/error.rb +22 -0
  17. data/lib/haml/exec.rb +362 -0
  18. data/lib/haml/filters.rb +388 -0
  19. data/lib/haml/haml_ejs.rb +57 -0
  20. data/lib/haml/helpers.rb +608 -0
  21. data/lib/haml/helpers/action_view_extensions.rb +57 -0
  22. data/lib/haml/helpers/action_view_mods.rb +257 -0
  23. data/lib/haml/helpers/xss_mods.rb +165 -0
  24. data/lib/haml/html.rb +412 -0
  25. data/lib/haml/html/erb.rb +141 -0
  26. data/lib/haml/parser.rb +760 -0
  27. data/lib/haml/railtie.rb +19 -0
  28. data/lib/haml/root.rb +7 -0
  29. data/lib/haml/shared.rb +78 -0
  30. data/lib/haml/template.rb +99 -0
  31. data/lib/haml/template/options.rb +16 -0
  32. data/lib/haml/template/patch.rb +58 -0
  33. data/lib/haml/template/plugin.rb +123 -0
  34. data/lib/haml/util.rb +842 -0
  35. data/lib/haml/version.rb +109 -0
  36. data/lib/sass.rb +8 -0
  37. data/lib/sass/plugin.rb +10 -0
  38. data/lib/sass/rails2_shim.rb +9 -0
  39. data/lib/sass/rails3_shim.rb +16 -0
  40. data/rails/init.rb +1 -0
  41. data/test/benchmark.rb +91 -0
  42. data/test/gemfiles/Gemfile.rails-2.0.x +8 -0
  43. data/test/gemfiles/Gemfile.rails-2.0.x.lock +38 -0
  44. data/test/gemfiles/Gemfile.rails-2.1.x +8 -0
  45. data/test/gemfiles/Gemfile.rails-2.1.x.lock +38 -0
  46. data/test/gemfiles/Gemfile.rails-2.2.x +8 -0
  47. data/test/gemfiles/Gemfile.rails-2.2.x.lock +38 -0
  48. data/test/gemfiles/Gemfile.rails-2.3.x +8 -0
  49. data/test/gemfiles/Gemfile.rails-2.3.x.lock +40 -0
  50. data/test/gemfiles/Gemfile.rails-3.0.x +8 -0
  51. data/test/gemfiles/Gemfile.rails-3.0.x.lock +85 -0
  52. data/test/gemfiles/Gemfile.rails-3.1.x +8 -0
  53. data/test/gemfiles/Gemfile.rails-3.1.x.lock +98 -0
  54. data/test/gemfiles/Gemfile.rails-xss-2.3.x +9 -0
  55. data/test/gemfiles/Gemfile.rails-xss-2.3.x.lock +42 -0
  56. data/test/haml-ejs/haml-ejs_test.rb +22 -0
  57. data/test/haml-ejs/templates/conditional.input +3 -0
  58. data/test/haml-ejs/templates/conditional.output +3 -0
  59. data/test/haml-ejs/templates/conditional_and_interpolation.input +2 -0
  60. data/test/haml-ejs/templates/conditional_and_interpolation.output +3 -0
  61. data/test/haml-ejs/templates/conditional_else.input +5 -0
  62. data/test/haml-ejs/templates/conditional_else.output +5 -0
  63. data/test/haml-ejs/templates/conditional_else_elsif.input +7 -0
  64. data/test/haml-ejs/templates/conditional_else_elsif.output +7 -0
  65. data/test/haml-ejs/templates/conditional_elsif.input +5 -0
  66. data/test/haml-ejs/templates/conditional_elsif.output +5 -0
  67. data/test/haml-ejs/templates/conditional_unless.input +3 -0
  68. data/test/haml-ejs/templates/conditional_unless.output +3 -0
  69. data/test/haml-ejs/templates/conditional_unless_else.input +5 -0
  70. data/test/haml-ejs/templates/conditional_unless_else.output +5 -0
  71. data/test/haml-ejs/templates/conditional_unless_elsif_else.input +5 -0
  72. data/test/haml-ejs/templates/conditional_unless_elsif_else.output +5 -0
  73. data/test/haml-ejs/templates/interpolation.input +2 -0
  74. data/test/haml-ejs/templates/interpolation.output +1 -0
  75. data/test/haml-ejs/templates/iteration.input +2 -0
  76. data/test/haml-ejs/templates/iteration.output +3 -0
  77. data/test/haml-ejs/templates/suite.input +26 -0
  78. data/test/haml-ejs/templates/suite.output +27 -0
  79. data/test/haml/engine_test.rb +1925 -0
  80. data/test/haml/erb/_av_partial_1.erb +12 -0
  81. data/test/haml/erb/_av_partial_2.erb +8 -0
  82. data/test/haml/erb/action_view.erb +62 -0
  83. data/test/haml/erb/standard.erb +55 -0
  84. data/test/haml/helper_test.rb +454 -0
  85. data/test/haml/html2haml/erb_tests.rb +440 -0
  86. data/test/haml/html2haml_test.rb +336 -0
  87. data/test/haml/markaby/standard.mab +52 -0
  88. data/test/haml/mocks/article.rb +6 -0
  89. data/test/haml/results/content_for_layout.xhtml +12 -0
  90. data/test/haml/results/eval_suppressed.xhtml +9 -0
  91. data/test/haml/results/filters.xhtml +62 -0
  92. data/test/haml/results/helpers.xhtml +70 -0
  93. data/test/haml/results/helpful.xhtml +10 -0
  94. data/test/haml/results/just_stuff.xhtml +70 -0
  95. data/test/haml/results/list.xhtml +12 -0
  96. data/test/haml/results/nuke_inner_whitespace.xhtml +40 -0
  97. data/test/haml/results/nuke_outer_whitespace.xhtml +148 -0
  98. data/test/haml/results/original_engine.xhtml +20 -0
  99. data/test/haml/results/partial_layout.xhtml +5 -0
  100. data/test/haml/results/partials.xhtml +21 -0
  101. data/test/haml/results/render_layout.xhtml +3 -0
  102. data/test/haml/results/silent_script.xhtml +74 -0
  103. data/test/haml/results/standard.xhtml +162 -0
  104. data/test/haml/results/tag_parsing.xhtml +23 -0
  105. data/test/haml/results/very_basic.xhtml +5 -0
  106. data/test/haml/results/whitespace_handling.xhtml +89 -0
  107. data/test/haml/spec/README.md +97 -0
  108. data/test/haml/spec/lua_haml_spec.lua +30 -0
  109. data/test/haml/spec/ruby_haml_test.rb +19 -0
  110. data/test/haml/spec/tests.json +534 -0
  111. data/test/haml/spec_test.rb +44 -0
  112. data/test/haml/template_test.rb +419 -0
  113. data/test/haml/templates/_av_partial_1.haml +9 -0
  114. data/test/haml/templates/_av_partial_1_ugly.haml +9 -0
  115. data/test/haml/templates/_av_partial_2.haml +5 -0
  116. data/test/haml/templates/_av_partial_2_ugly.haml +5 -0
  117. data/test/haml/templates/_layout.erb +3 -0
  118. data/test/haml/templates/_layout_for_partial.haml +3 -0
  119. data/test/haml/templates/_partial.haml +8 -0
  120. data/test/haml/templates/_text_area.haml +3 -0
  121. data/test/haml/templates/action_view.haml +47 -0
  122. data/test/haml/templates/action_view_ugly.haml +47 -0
  123. data/test/haml/templates/breakage.haml +8 -0
  124. data/test/haml/templates/content_for_layout.haml +8 -0
  125. data/test/haml/templates/eval_suppressed.haml +11 -0
  126. data/test/haml/templates/filters.haml +66 -0
  127. data/test/haml/templates/helpers.haml +55 -0
  128. data/test/haml/templates/helpful.haml +11 -0
  129. data/test/haml/templates/just_stuff.haml +85 -0
  130. data/test/haml/templates/list.haml +12 -0
  131. data/test/haml/templates/nuke_inner_whitespace.haml +32 -0
  132. data/test/haml/templates/nuke_outer_whitespace.haml +144 -0
  133. data/test/haml/templates/original_engine.haml +17 -0
  134. data/test/haml/templates/partial_layout.haml +10 -0
  135. data/test/haml/templates/partialize.haml +1 -0
  136. data/test/haml/templates/partials.haml +12 -0
  137. data/test/haml/templates/render_layout.haml +2 -0
  138. data/test/haml/templates/silent_script.haml +40 -0
  139. data/test/haml/templates/standard.haml +43 -0
  140. data/test/haml/templates/standard_ugly.haml +43 -0
  141. data/test/haml/templates/tag_parsing.haml +21 -0
  142. data/test/haml/templates/very_basic.haml +4 -0
  143. data/test/haml/templates/whitespace_handling.haml +87 -0
  144. data/test/haml/util_test.rb +300 -0
  145. data/test/linked_rails.rb +42 -0
  146. data/test/test_helper.rb +75 -0
  147. data/vendor/sass/CONTRIBUTING +3 -0
  148. data/vendor/sass/MIT-LICENSE +20 -0
  149. data/vendor/sass/README.md +201 -0
  150. data/vendor/sass/Rakefile +339 -0
  151. data/vendor/sass/TODO +39 -0
  152. data/vendor/sass/VERSION +1 -0
  153. data/vendor/sass/VERSION_NAME +1 -0
  154. data/vendor/sass/bin/sass +8 -0
  155. data/vendor/sass/bin/sass-convert +7 -0
  156. data/vendor/sass/bin/scss +8 -0
  157. data/vendor/sass/doc-src/FAQ.md +35 -0
  158. data/vendor/sass/doc-src/INDENTED_SYNTAX.md +210 -0
  159. data/vendor/sass/doc-src/SASS_CHANGELOG.md +2214 -0
  160. data/vendor/sass/doc-src/SASS_REFERENCE.md +1957 -0
  161. data/vendor/sass/doc-src/SCSS_FOR_SASS_USERS.md +155 -0
  162. data/vendor/sass/ext/extconf.rb +10 -0
  163. data/vendor/sass/extra/update_watch.rb +13 -0
  164. data/vendor/sass/init.rb +18 -0
  165. data/vendor/sass/lib/sass.rb +72 -0
  166. data/vendor/sass/lib/sass/cache_stores.rb +15 -0
  167. data/vendor/sass/lib/sass/cache_stores/base.rb +84 -0
  168. data/vendor/sass/lib/sass/cache_stores/chain.rb +33 -0
  169. data/vendor/sass/lib/sass/cache_stores/filesystem.rb +58 -0
  170. data/vendor/sass/lib/sass/cache_stores/memory.rb +47 -0
  171. data/vendor/sass/lib/sass/cache_stores/null.rb +25 -0
  172. data/vendor/sass/lib/sass/callbacks.rb +66 -0
  173. data/vendor/sass/lib/sass/css.rb +294 -0
  174. data/vendor/sass/lib/sass/engine.rb +862 -0
  175. data/vendor/sass/lib/sass/environment.rb +155 -0
  176. data/vendor/sass/lib/sass/error.rb +201 -0
  177. data/vendor/sass/lib/sass/exec.rb +659 -0
  178. data/vendor/sass/lib/sass/importers.rb +22 -0
  179. data/vendor/sass/lib/sass/importers/base.rb +138 -0
  180. data/vendor/sass/lib/sass/importers/filesystem.rb +144 -0
  181. data/vendor/sass/lib/sass/less.rb +382 -0
  182. data/vendor/sass/lib/sass/plugin.rb +136 -0
  183. data/vendor/sass/lib/sass/plugin/compiler.rb +358 -0
  184. data/vendor/sass/lib/sass/plugin/configuration.rb +125 -0
  185. data/vendor/sass/lib/sass/plugin/generic.rb +15 -0
  186. data/vendor/sass/lib/sass/plugin/merb.rb +48 -0
  187. data/vendor/sass/lib/sass/plugin/rack.rb +60 -0
  188. data/vendor/sass/lib/sass/plugin/rails.rb +47 -0
  189. data/vendor/sass/lib/sass/plugin/staleness_checker.rb +173 -0
  190. data/vendor/sass/lib/sass/railtie.rb +9 -0
  191. data/vendor/sass/lib/sass/repl.rb +58 -0
  192. data/vendor/sass/lib/sass/root.rb +7 -0
  193. data/vendor/sass/lib/sass/script.rb +40 -0
  194. data/vendor/sass/lib/sass/script/bool.rb +18 -0
  195. data/vendor/sass/lib/sass/script/color.rb +480 -0
  196. data/vendor/sass/lib/sass/script/css_lexer.rb +29 -0
  197. data/vendor/sass/lib/sass/script/css_parser.rb +31 -0
  198. data/vendor/sass/lib/sass/script/funcall.rb +162 -0
  199. data/vendor/sass/lib/sass/script/functions.rb +1343 -0
  200. data/vendor/sass/lib/sass/script/interpolation.rb +70 -0
  201. data/vendor/sass/lib/sass/script/lexer.rb +334 -0
  202. data/vendor/sass/lib/sass/script/list.rb +76 -0
  203. data/vendor/sass/lib/sass/script/literal.rb +245 -0
  204. data/vendor/sass/lib/sass/script/node.rb +91 -0
  205. data/vendor/sass/lib/sass/script/number.rb +429 -0
  206. data/vendor/sass/lib/sass/script/operation.rb +91 -0
  207. data/vendor/sass/lib/sass/script/parser.rb +467 -0
  208. data/vendor/sass/lib/sass/script/string.rb +51 -0
  209. data/vendor/sass/lib/sass/script/string_interpolation.rb +94 -0
  210. data/vendor/sass/lib/sass/script/unary_operation.rb +57 -0
  211. data/vendor/sass/lib/sass/script/variable.rb +54 -0
  212. data/vendor/sass/lib/sass/scss.rb +17 -0
  213. data/vendor/sass/lib/sass/scss/css_parser.rb +46 -0
  214. data/vendor/sass/lib/sass/scss/parser.rb +920 -0
  215. data/vendor/sass/lib/sass/scss/rx.rb +127 -0
  216. data/vendor/sass/lib/sass/scss/sass_parser.rb +11 -0
  217. data/vendor/sass/lib/sass/scss/script_lexer.rb +15 -0
  218. data/vendor/sass/lib/sass/scss/script_parser.rb +25 -0
  219. data/vendor/sass/lib/sass/scss/static_parser.rb +40 -0
  220. data/vendor/sass/lib/sass/selector.rb +361 -0
  221. data/vendor/sass/lib/sass/selector/abstract_sequence.rb +62 -0
  222. data/vendor/sass/lib/sass/selector/comma_sequence.rb +81 -0
  223. data/vendor/sass/lib/sass/selector/sequence.rb +233 -0
  224. data/vendor/sass/lib/sass/selector/simple.rb +113 -0
  225. data/vendor/sass/lib/sass/selector/simple_sequence.rb +134 -0
  226. data/vendor/sass/lib/sass/shared.rb +78 -0
  227. data/vendor/sass/lib/sass/tree/charset_node.rb +22 -0
  228. data/vendor/sass/lib/sass/tree/comment_node.rb +77 -0
  229. data/vendor/sass/lib/sass/tree/debug_node.rb +18 -0
  230. data/vendor/sass/lib/sass/tree/directive_node.rb +23 -0
  231. data/vendor/sass/lib/sass/tree/each_node.rb +24 -0
  232. data/vendor/sass/lib/sass/tree/extend_node.rb +29 -0
  233. data/vendor/sass/lib/sass/tree/for_node.rb +36 -0
  234. data/vendor/sass/lib/sass/tree/function_node.rb +27 -0
  235. data/vendor/sass/lib/sass/tree/if_node.rb +65 -0
  236. data/vendor/sass/lib/sass/tree/import_node.rb +68 -0
  237. data/vendor/sass/lib/sass/tree/media_node.rb +32 -0
  238. data/vendor/sass/lib/sass/tree/mixin_def_node.rb +27 -0
  239. data/vendor/sass/lib/sass/tree/mixin_node.rb +32 -0
  240. data/vendor/sass/lib/sass/tree/node.rb +204 -0
  241. data/vendor/sass/lib/sass/tree/prop_node.rb +155 -0
  242. data/vendor/sass/lib/sass/tree/return_node.rb +18 -0
  243. data/vendor/sass/lib/sass/tree/root_node.rb +28 -0
  244. data/vendor/sass/lib/sass/tree/rule_node.rb +129 -0
  245. data/vendor/sass/lib/sass/tree/variable_node.rb +30 -0
  246. data/vendor/sass/lib/sass/tree/visitors/base.rb +75 -0
  247. data/vendor/sass/lib/sass/tree/visitors/check_nesting.rb +134 -0
  248. data/vendor/sass/lib/sass/tree/visitors/convert.rb +255 -0
  249. data/vendor/sass/lib/sass/tree/visitors/cssize.rb +175 -0
  250. data/vendor/sass/lib/sass/tree/visitors/perform.rb +301 -0
  251. data/vendor/sass/lib/sass/tree/visitors/to_css.rb +216 -0
  252. data/vendor/sass/lib/sass/tree/warn_node.rb +18 -0
  253. data/vendor/sass/lib/sass/tree/while_node.rb +18 -0
  254. data/vendor/sass/lib/sass/util.rb +669 -0
  255. data/vendor/sass/lib/sass/util/subset_map.rb +101 -0
  256. data/vendor/sass/lib/sass/version.rb +112 -0
  257. data/vendor/sass/rails/init.rb +1 -0
  258. data/vendor/sass/sass.gemspec +32 -0
  259. data/vendor/sass/test/sass/cache_test.rb +74 -0
  260. data/vendor/sass/test/sass/callbacks_test.rb +61 -0
  261. data/vendor/sass/test/sass/conversion_test.rb +1203 -0
  262. data/vendor/sass/test/sass/css2sass_test.rb +364 -0
  263. data/vendor/sass/test/sass/data/hsl-rgb.txt +319 -0
  264. data/vendor/sass/test/sass/engine_test.rb +2469 -0
  265. data/vendor/sass/test/sass/extend_test.rb +1348 -0
  266. data/vendor/sass/test/sass/functions_test.rb +1025 -0
  267. data/vendor/sass/test/sass/importer_test.rb +82 -0
  268. data/vendor/sass/test/sass/less_conversion_test.rb +653 -0
  269. data/vendor/sass/test/sass/mock_importer.rb +49 -0
  270. data/vendor/sass/test/sass/more_results/more1.css +9 -0
  271. data/vendor/sass/test/sass/more_results/more1_with_line_comments.css +26 -0
  272. data/vendor/sass/test/sass/more_results/more_import.css +29 -0
  273. data/vendor/sass/test/sass/more_templates/_more_partial.sass +2 -0
  274. data/vendor/sass/test/sass/more_templates/more1.sass +23 -0
  275. data/vendor/sass/test/sass/more_templates/more_import.sass +11 -0
  276. data/vendor/sass/test/sass/plugin_test.rb +469 -0
  277. data/vendor/sass/test/sass/results/alt.css +4 -0
  278. data/vendor/sass/test/sass/results/basic.css +9 -0
  279. data/vendor/sass/test/sass/results/compact.css +5 -0
  280. data/vendor/sass/test/sass/results/complex.css +86 -0
  281. data/vendor/sass/test/sass/results/compressed.css +1 -0
  282. data/vendor/sass/test/sass/results/expanded.css +19 -0
  283. data/vendor/sass/test/sass/results/if.css +3 -0
  284. data/vendor/sass/test/sass/results/import.css +31 -0
  285. data/vendor/sass/test/sass/results/import_charset.css +4 -0
  286. data/vendor/sass/test/sass/results/import_charset_1_8.css +4 -0
  287. data/vendor/sass/test/sass/results/import_charset_ibm866.css +4 -0
  288. data/vendor/sass/test/sass/results/line_numbers.css +49 -0
  289. data/vendor/sass/test/sass/results/mixins.css +95 -0
  290. data/vendor/sass/test/sass/results/multiline.css +24 -0
  291. data/vendor/sass/test/sass/results/nested.css +22 -0
  292. data/vendor/sass/test/sass/results/options.css +1 -0
  293. data/vendor/sass/test/sass/results/parent_ref.css +13 -0
  294. data/vendor/sass/test/sass/results/script.css +16 -0
  295. data/vendor/sass/test/sass/results/scss_import.css +31 -0
  296. data/vendor/sass/test/sass/results/scss_importee.css +2 -0
  297. data/vendor/sass/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  298. data/vendor/sass/test/sass/results/subdir/subdir.css +3 -0
  299. data/vendor/sass/test/sass/results/units.css +11 -0
  300. data/vendor/sass/test/sass/results/warn.css +0 -0
  301. data/vendor/sass/test/sass/results/warn_imported.css +0 -0
  302. data/vendor/sass/test/sass/script_conversion_test.rb +283 -0
  303. data/vendor/sass/test/sass/script_test.rb +496 -0
  304. data/vendor/sass/test/sass/scss/css_test.rb +916 -0
  305. data/vendor/sass/test/sass/scss/rx_test.rb +156 -0
  306. data/vendor/sass/test/sass/scss/scss_test.rb +1249 -0
  307. data/vendor/sass/test/sass/scss/test_helper.rb +37 -0
  308. data/vendor/sass/test/sass/templates/_imported_charset_ibm866.sass +4 -0
  309. data/vendor/sass/test/sass/templates/_imported_charset_utf8.sass +4 -0
  310. data/vendor/sass/test/sass/templates/_partial.sass +2 -0
  311. data/vendor/sass/test/sass/templates/alt.sass +16 -0
  312. data/vendor/sass/test/sass/templates/basic.sass +23 -0
  313. data/vendor/sass/test/sass/templates/bork1.sass +2 -0
  314. data/vendor/sass/test/sass/templates/bork2.sass +2 -0
  315. data/vendor/sass/test/sass/templates/bork3.sass +2 -0
  316. data/vendor/sass/test/sass/templates/bork4.sass +2 -0
  317. data/vendor/sass/test/sass/templates/compact.sass +17 -0
  318. data/vendor/sass/test/sass/templates/complex.sass +305 -0
  319. data/vendor/sass/test/sass/templates/compressed.sass +15 -0
  320. data/vendor/sass/test/sass/templates/expanded.sass +17 -0
  321. data/vendor/sass/test/sass/templates/if.sass +11 -0
  322. data/vendor/sass/test/sass/templates/import.sass +12 -0
  323. data/vendor/sass/test/sass/templates/import_charset.sass +7 -0
  324. data/vendor/sass/test/sass/templates/import_charset_1_8.sass +4 -0
  325. data/vendor/sass/test/sass/templates/import_charset_ibm866.sass +9 -0
  326. data/vendor/sass/test/sass/templates/importee.less +2 -0
  327. data/vendor/sass/test/sass/templates/importee.sass +19 -0
  328. data/vendor/sass/test/sass/templates/line_numbers.sass +13 -0
  329. data/vendor/sass/test/sass/templates/mixin_bork.sass +5 -0
  330. data/vendor/sass/test/sass/templates/mixins.sass +76 -0
  331. data/vendor/sass/test/sass/templates/multiline.sass +20 -0
  332. data/vendor/sass/test/sass/templates/nested.sass +25 -0
  333. data/vendor/sass/test/sass/templates/nested_bork1.sass +2 -0
  334. data/vendor/sass/test/sass/templates/nested_bork2.sass +2 -0
  335. data/vendor/sass/test/sass/templates/nested_bork3.sass +2 -0
  336. data/vendor/sass/test/sass/templates/nested_bork4.sass +2 -0
  337. data/vendor/sass/test/sass/templates/nested_import.sass +2 -0
  338. data/vendor/sass/test/sass/templates/nested_mixin_bork.sass +6 -0
  339. data/vendor/sass/test/sass/templates/options.sass +2 -0
  340. data/vendor/sass/test/sass/templates/parent_ref.sass +25 -0
  341. data/vendor/sass/test/sass/templates/script.sass +101 -0
  342. data/vendor/sass/test/sass/templates/scss_import.scss +11 -0
  343. data/vendor/sass/test/sass/templates/scss_importee.scss +1 -0
  344. data/vendor/sass/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  345. data/vendor/sass/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  346. data/vendor/sass/test/sass/templates/subdir/subdir.sass +6 -0
  347. data/vendor/sass/test/sass/templates/units.sass +11 -0
  348. data/vendor/sass/test/sass/templates/warn.sass +3 -0
  349. data/vendor/sass/test/sass/templates/warn_imported.sass +4 -0
  350. data/vendor/sass/test/sass/test_helper.rb +8 -0
  351. data/vendor/sass/test/sass/util/subset_map_test.rb +91 -0
  352. data/vendor/sass/test/sass/util_test.rb +254 -0
  353. data/vendor/sass/test/test_helper.rb +69 -0
  354. data/vendor/sass/yard/callbacks.rb +29 -0
  355. data/vendor/sass/yard/default/fulldoc/html/css/common.sass +26 -0
  356. data/vendor/sass/yard/default/layout/html/footer.erb +12 -0
  357. data/vendor/sass/yard/inherited_hash.rb +41 -0
  358. metadata +458 -0
@@ -0,0 +1,91 @@
1
+ require 'set'
2
+ require 'sass/script/string'
3
+ require 'sass/script/number'
4
+ require 'sass/script/color'
5
+ require 'sass/script/functions'
6
+ require 'sass/script/unary_operation'
7
+ require 'sass/script/interpolation'
8
+ require 'sass/script/string_interpolation'
9
+
10
+ module Sass::Script
11
+ # A SassScript parse node representing a binary operation,
12
+ # such as `$a + $b` or `"foo" + 1`.
13
+ class Operation < Node
14
+ attr_reader :operand1
15
+ attr_reader :operand2
16
+ attr_reader :operator
17
+
18
+ # @param operand1 [Script::Node] The parse-tree node
19
+ # for the right-hand side of the operator
20
+ # @param operand2 [Script::Node] The parse-tree node
21
+ # for the left-hand side of the operator
22
+ # @param operator [Symbol] The operator to perform.
23
+ # This should be one of the binary operator names in {Lexer::OPERATORS}
24
+ def initialize(operand1, operand2, operator)
25
+ @operand1 = operand1
26
+ @operand2 = operand2
27
+ @operator = operator
28
+ super()
29
+ end
30
+
31
+ # @return [String] A human-readable s-expression representation of the operation
32
+ def inspect
33
+ "(#{@operator.inspect} #{@operand1.inspect} #{@operand2.inspect})"
34
+ end
35
+
36
+ # @see Node#to_sass
37
+ def to_sass(opts = {})
38
+ pred = Sass::Script::Parser.precedence_of(@operator)
39
+ o1 = operand_to_sass @operand1, :left, opts
40
+ o2 = operand_to_sass @operand2, :right, opts
41
+ sep =
42
+ case @operator
43
+ when :comma; ", "
44
+ when :space; " "
45
+ else; " #{Lexer::OPERATORS_REVERSE[@operator]} "
46
+ end
47
+ "#{o1}#{sep}#{o2}"
48
+ end
49
+
50
+ # Returns the operands for this operation.
51
+ #
52
+ # @return [Array<Node>]
53
+ # @see Node#children
54
+ def children
55
+ [@operand1, @operand2]
56
+ end
57
+
58
+ protected
59
+
60
+ # Evaluates the operation.
61
+ #
62
+ # @param environment [Sass::Environment] The environment in which to evaluate the SassScript
63
+ # @return [Literal] The SassScript object that is the value of the operation
64
+ # @raise [Sass::SyntaxError] if the operation is undefined for the operands
65
+ def _perform(environment)
66
+ literal1 = @operand1.perform(environment)
67
+ literal2 = @operand2.perform(environment)
68
+
69
+ begin
70
+ opts(literal1.send(@operator, literal2))
71
+ rescue NoMethodError => e
72
+ raise e unless e.name.to_s == @operator.to_s
73
+ raise Sass::SyntaxError.new("Undefined operation: \"#{literal1} #{@operator} #{literal2}\".")
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def operand_to_sass(op, side, opts)
80
+ return "(#{op.to_sass(opts)})" if op.is_a?(List)
81
+ return op.to_sass(opts) unless op.is_a?(Operation)
82
+
83
+ pred = Sass::Script::Parser.precedence_of(@operator)
84
+ sub_pred = Sass::Script::Parser.precedence_of(op.operator)
85
+ assoc = Sass::Script::Parser.associative?(@operator)
86
+ return "(#{op.to_sass(opts)})" if sub_pred < pred ||
87
+ (side == :right && sub_pred == pred && !assoc)
88
+ op.to_sass(opts)
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,467 @@
1
+ require 'sass/script/lexer'
2
+
3
+ module Sass
4
+ module Script
5
+ # The parser for SassScript.
6
+ # It parses a string of code into a tree of {Script::Node}s.
7
+ class Parser
8
+ # The line number of the parser's current position.
9
+ #
10
+ # @return [Fixnum]
11
+ def line
12
+ @lexer.line
13
+ end
14
+
15
+ # @param str [String, StringScanner] The source text to parse
16
+ # @param line [Fixnum] The line on which the SassScript appears.
17
+ # Used for error reporting
18
+ # @param offset [Fixnum] The number of characters in on which the SassScript appears.
19
+ # Used for error reporting
20
+ # @param options [{Symbol => Object}] An options hash;
21
+ # see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
22
+ def initialize(str, line, offset, options = {})
23
+ @options = options
24
+ @lexer = lexer_class.new(str, line, offset, options)
25
+ end
26
+
27
+ # Parses a SassScript expression within an interpolated segment (`#{}`).
28
+ # This means that it stops when it comes across an unmatched `}`,
29
+ # which signals the end of an interpolated segment,
30
+ # it returns rather than throwing an error.
31
+ #
32
+ # @return [Script::Node] The root node of the parse tree
33
+ # @raise [Sass::SyntaxError] if the expression isn't valid SassScript
34
+ def parse_interpolated
35
+ expr = assert_expr :expr
36
+ assert_tok :end_interpolation
37
+ expr.options = @options
38
+ expr
39
+ rescue Sass::SyntaxError => e
40
+ e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
41
+ raise e
42
+ end
43
+
44
+ # Parses a SassScript expression.
45
+ #
46
+ # @return [Script::Node] The root node of the parse tree
47
+ # @raise [Sass::SyntaxError] if the expression isn't valid SassScript
48
+ def parse
49
+ expr = assert_expr :expr
50
+ assert_done
51
+ expr.options = @options
52
+ expr
53
+ rescue Sass::SyntaxError => e
54
+ e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
55
+ raise e
56
+ end
57
+
58
+ # Parses a SassScript expression,
59
+ # ending it when it encounters one of the given identifier tokens.
60
+ #
61
+ # @param [#include?(String)] A set of strings that delimit the expression.
62
+ # @return [Script::Node] The root node of the parse tree
63
+ # @raise [Sass::SyntaxError] if the expression isn't valid SassScript
64
+ def parse_until(tokens)
65
+ @stop_at = tokens
66
+ expr = assert_expr :expr
67
+ assert_done
68
+ expr.options = @options
69
+ expr
70
+ rescue Sass::SyntaxError => e
71
+ e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
72
+ raise e
73
+ end
74
+
75
+ # Parses the argument list for a mixin include.
76
+ #
77
+ # @return [(Array<Script::Node>, {String => Script::Note})]
78
+ # The root nodes of the arguments.
79
+ # Keyword arguments are in a hash from names to values.
80
+ # @raise [Sass::SyntaxError] if the argument list isn't valid SassScript
81
+ def parse_mixin_include_arglist
82
+ args, keywords = [], {}
83
+ if try_tok(:lparen)
84
+ args, keywords = mixin_arglist || [[], {}]
85
+ assert_tok(:rparen)
86
+ end
87
+ assert_done
88
+
89
+ args.each {|a| a.options = @options}
90
+ keywords.each {|k, v| v.options = @options}
91
+ return args, keywords
92
+ rescue Sass::SyntaxError => e
93
+ e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
94
+ raise e
95
+ end
96
+
97
+ # Parses the argument list for a mixin definition.
98
+ #
99
+ # @return [Array<Script::Node>] The root nodes of the arguments.
100
+ # @raise [Sass::SyntaxError] if the argument list isn't valid SassScript
101
+ def parse_mixin_definition_arglist
102
+ args = defn_arglist!(false)
103
+ assert_done
104
+
105
+ args.each do |k, v|
106
+ k.options = @options
107
+ v.options = @options if v
108
+ end
109
+ args
110
+ rescue Sass::SyntaxError => e
111
+ e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
112
+ raise e
113
+ end
114
+
115
+ # Parses the argument list for a function definition.
116
+ #
117
+ # @return [Array<Script::Node>] The root nodes of the arguments.
118
+ # @raise [Sass::SyntaxError] if the argument list isn't valid SassScript
119
+ def parse_function_definition_arglist
120
+ args = defn_arglist!(true)
121
+ assert_done
122
+
123
+ args.each do |k, v|
124
+ k.options = @options
125
+ v.options = @options if v
126
+ end
127
+ args
128
+ rescue Sass::SyntaxError => e
129
+ e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
130
+ raise e
131
+ end
132
+
133
+ # Parses a SassScript expression.
134
+ #
135
+ # @overload parse(str, line, offset, filename = nil)
136
+ # @return [Script::Node] The root node of the parse tree
137
+ # @see Parser#initialize
138
+ # @see Parser#parse
139
+ def self.parse(*args)
140
+ new(*args).parse
141
+ end
142
+
143
+ PRECEDENCE = [
144
+ :comma, :single_eq, :space, :or, :and,
145
+ [:eq, :neq],
146
+ [:gt, :gte, :lt, :lte],
147
+ [:plus, :minus],
148
+ [:times, :div, :mod],
149
+ ]
150
+
151
+ ASSOCIATIVE = [:plus, :times]
152
+
153
+ class << self
154
+ # Returns an integer representing the precedence
155
+ # of the given operator.
156
+ # A lower integer indicates a looser binding.
157
+ #
158
+ # @private
159
+ def precedence_of(op)
160
+ PRECEDENCE.each_with_index do |e, i|
161
+ return i if Array(e).include?(op)
162
+ end
163
+ raise "[BUG] Unknown operator #{op}"
164
+ end
165
+
166
+ # Returns whether or not the given operation is associative.
167
+ #
168
+ # @private
169
+ def associative?(op)
170
+ ASSOCIATIVE.include?(op)
171
+ end
172
+
173
+ private
174
+
175
+ # Defines a simple left-associative production.
176
+ # name is the name of the production,
177
+ # sub is the name of the production beneath it,
178
+ # and ops is a list of operators for this precedence level
179
+ def production(name, sub, *ops)
180
+ class_eval <<RUBY
181
+ def #{name}
182
+ interp = try_ops_after_interp(#{ops.inspect}, #{name.inspect}) and return interp
183
+ return unless e = #{sub}
184
+ while tok = try_tok(#{ops.map {|o| o.inspect}.join(', ')})
185
+ interp = try_op_before_interp(tok, e) and return interp
186
+ line = @lexer.line
187
+ e = Operation.new(e, assert_expr(#{sub.inspect}), tok.type)
188
+ e.line = line
189
+ end
190
+ e
191
+ end
192
+ RUBY
193
+ end
194
+
195
+ def unary(op, sub)
196
+ class_eval <<RUBY
197
+ def unary_#{op}
198
+ return #{sub} unless tok = try_tok(:#{op})
199
+ interp = try_op_before_interp(tok) and return interp
200
+ line = @lexer.line
201
+ op = UnaryOperation.new(assert_expr(:unary_#{op}), :#{op})
202
+ op.line = line
203
+ op
204
+ end
205
+ RUBY
206
+ end
207
+ end
208
+
209
+ private
210
+
211
+ # @private
212
+ def lexer_class; Lexer; end
213
+
214
+ def expr
215
+ interp = try_ops_after_interp([:comma], :expr) and return interp
216
+ line = @lexer.line
217
+ return unless e = interpolation
218
+ arr = [e]
219
+ while tok = try_tok(:comma)
220
+ interp = try_op_before_interp(tok, e) and return interp
221
+ arr << assert_expr(:interpolation)
222
+ end
223
+ arr.size == 1 ? arr.first : node(List.new(arr, :comma), line)
224
+ end
225
+
226
+ production :equals, :interpolation, :single_eq
227
+
228
+ def try_op_before_interp(op, prev = nil)
229
+ return unless @lexer.peek && @lexer.peek.type == :begin_interpolation
230
+ wb = @lexer.whitespace?(op)
231
+ str = Script::String.new(Lexer::OPERATORS_REVERSE[op.type])
232
+ str.line = @lexer.line
233
+ interp = Script::Interpolation.new(prev, str, nil, wb, !:wa, :originally_text)
234
+ interp.line = @lexer.line
235
+ interpolation(interp)
236
+ end
237
+
238
+ def try_ops_after_interp(ops, name)
239
+ return unless @lexer.after_interpolation?
240
+ return unless op = try_tok(*ops)
241
+ interp = try_op_before_interp(op) and return interp
242
+
243
+ wa = @lexer.whitespace?
244
+ str = Script::String.new(Lexer::OPERATORS_REVERSE[op.type])
245
+ str.line = @lexer.line
246
+ interp = Script::Interpolation.new(nil, str, assert_expr(name), !:wb, wa, :originally_text)
247
+ interp.line = @lexer.line
248
+ return interp
249
+ end
250
+
251
+ def interpolation(first = space)
252
+ e = first
253
+ while interp = try_tok(:begin_interpolation)
254
+ wb = @lexer.whitespace?(interp)
255
+ line = @lexer.line
256
+ mid = parse_interpolated
257
+ wa = @lexer.whitespace?
258
+ e = Script::Interpolation.new(e, mid, space, wb, wa)
259
+ e.line = line
260
+ end
261
+ e
262
+ end
263
+
264
+ def space
265
+ line = @lexer.line
266
+ return unless e = or_expr
267
+ arr = [e]
268
+ while e = or_expr
269
+ arr << e
270
+ end
271
+ arr.size == 1 ? arr.first : node(List.new(arr, :space), line)
272
+ end
273
+
274
+ production :or_expr, :and_expr, :or
275
+ production :and_expr, :eq_or_neq, :and
276
+ production :eq_or_neq, :relational, :eq, :neq
277
+ production :relational, :plus_or_minus, :gt, :gte, :lt, :lte
278
+ production :plus_or_minus, :times_div_or_mod, :plus, :minus
279
+ production :times_div_or_mod, :unary_plus, :times, :div, :mod
280
+
281
+ unary :plus, :unary_minus
282
+ unary :minus, :unary_div
283
+ unary :div, :unary_not # For strings, so /foo/bar works
284
+ unary :not, :ident
285
+
286
+ def ident
287
+ return funcall unless @lexer.peek && @lexer.peek.type == :ident
288
+ return if @stop_at && @stop_at.include?(@lexer.peek.value)
289
+
290
+ name = @lexer.next
291
+ if color = Color::HTML4_COLORS[name.value.downcase]
292
+ return node(Color.new(color))
293
+ end
294
+ node(Script::String.new(name.value, :identifier))
295
+ end
296
+
297
+ def funcall
298
+ return raw unless tok = try_tok(:funcall)
299
+ args, keywords = fn_arglist || [[], {}]
300
+ assert_tok(:rparen)
301
+ node(Script::Funcall.new(tok.value, args, keywords))
302
+ end
303
+
304
+ def defn_arglist!(must_have_parens)
305
+ if must_have_parens
306
+ assert_tok(:lparen)
307
+ else
308
+ return [] unless try_tok(:lparen)
309
+ end
310
+ return [] if try_tok(:rparen)
311
+
312
+ res = []
313
+ must_have_default = false
314
+ loop do
315
+ line = @lexer.line
316
+ offset = @lexer.offset + 1
317
+ c = assert_tok(:const)
318
+ var = Script::Variable.new(c.value)
319
+ if tok = try_tok(:colon)
320
+ val = assert_expr(:space)
321
+ must_have_default = true
322
+ elsif must_have_default
323
+ raise SyntaxError.new("Required argument #{var.inspect} must come before any optional arguments.")
324
+ end
325
+ res << [var, val]
326
+ break unless try_tok(:comma)
327
+ end
328
+ assert_tok(:rparen)
329
+ res
330
+ end
331
+
332
+ def fn_arglist
333
+ arglist(:fn_arglist, :equals)
334
+ end
335
+
336
+ def mixin_arglist
337
+ arglist(:mixin_arglist, :interpolation)
338
+ end
339
+
340
+ def arglist(type, subexpr)
341
+ return unless e = send(subexpr)
342
+ if @lexer.peek && @lexer.peek.type == :colon
343
+ name = e
344
+ @lexer.expected!("comma") unless name.is_a?(Variable)
345
+ assert_tok(:colon)
346
+ keywords = {name.underscored_name => assert_expr(subexpr, EXPR_NAMES[type])}
347
+ end
348
+
349
+ unless try_tok(:comma)
350
+ return [], keywords if keywords
351
+ return [e], {}
352
+ end
353
+
354
+ other_args, other_keywords = assert_expr(type)
355
+ if keywords
356
+ if other_keywords[name.underscored_name]
357
+ raise SyntaxError.new("Keyword argument \"#{name.to_sass}\" passed more than once")
358
+ end
359
+ return other_args, keywords.merge(other_keywords)
360
+ else
361
+ return [e, *other_args], other_keywords
362
+ end
363
+ end
364
+
365
+ def keyword_arglist
366
+ return unless var = try_tok(:const)
367
+ unless try_tok(:colon)
368
+ return_tok!
369
+ return
370
+ end
371
+ name = var[1]
372
+ value = interpolation
373
+ return {name => value} unless try_tok(:comma)
374
+ {name => value}.merge(assert_expr(:keyword_arglist))
375
+ end
376
+
377
+ def raw
378
+ return special_fun unless tok = try_tok(:raw)
379
+ node(Script::String.new(tok.value))
380
+ end
381
+
382
+ def special_fun
383
+ return paren unless tok = try_tok(:special_fun)
384
+ first = node(Script::String.new(tok.value.first))
385
+ Sass::Util.enum_slice(tok.value[1..-1], 2).inject(first) do |l, (i, r)|
386
+ Script::Interpolation.new(
387
+ l, i, r && node(Script::String.new(r)),
388
+ false, false)
389
+ end
390
+ end
391
+
392
+ def paren
393
+ return variable unless try_tok(:lparen)
394
+ was_in_parens = @in_parens
395
+ @in_parens = true
396
+ line = @lexer.line
397
+ e = expr
398
+ assert_tok(:rparen)
399
+ return e || node(List.new([], :space), line)
400
+ ensure
401
+ @in_parens = was_in_parens
402
+ end
403
+
404
+ def variable
405
+ return string unless c = try_tok(:const)
406
+ node(Variable.new(*c.value))
407
+ end
408
+
409
+ def string
410
+ return number unless first = try_tok(:string)
411
+ return first.value unless try_tok(:begin_interpolation)
412
+ line = @lexer.line
413
+ mid = parse_interpolated
414
+ last = assert_expr(:string)
415
+ interp = StringInterpolation.new(first.value, mid, last)
416
+ interp.line = line
417
+ interp
418
+ end
419
+
420
+ def number
421
+ return literal unless tok = try_tok(:number)
422
+ num = tok.value
423
+ num.original = num.to_s unless @in_parens
424
+ num
425
+ end
426
+
427
+ def literal
428
+ (t = try_tok(:color, :bool)) && (return t.value)
429
+ end
430
+
431
+ # It would be possible to have unified #assert and #try methods,
432
+ # but detecting the method/token difference turns out to be quite expensive.
433
+
434
+ EXPR_NAMES = {
435
+ :string => "string",
436
+ :default => "expression (e.g. 1px, bold)",
437
+ :mixin_arglist => "mixin argument",
438
+ :fn_arglist => "function argument",
439
+ }
440
+
441
+ def assert_expr(name, expected = nil)
442
+ (e = send(name)) && (return e)
443
+ @lexer.expected!(expected || EXPR_NAMES[name] || EXPR_NAMES[:default])
444
+ end
445
+
446
+ def assert_tok(*names)
447
+ (t = try_tok(*names)) && (return t)
448
+ @lexer.expected!(names.map {|tok| Lexer::TOKEN_NAMES[tok] || tok}.join(" or "))
449
+ end
450
+
451
+ def try_tok(*names)
452
+ peeked = @lexer.peek
453
+ peeked && names.include?(peeked.type) && @lexer.next
454
+ end
455
+
456
+ def assert_done
457
+ return if @lexer.done?
458
+ @lexer.expected!(EXPR_NAMES[:default])
459
+ end
460
+
461
+ def node(node, line = @lexer.line)
462
+ node.line = line
463
+ node
464
+ end
465
+ end
466
+ end
467
+ end