classiccms 0.3.0 → 0.3.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 (369) hide show
  1. data/lib/classiccms/application.rb +2 -3
  2. data/lib/classiccms/cli.rb +6 -0
  3. data/lib/classiccms/scaffold/Gemfile +4 -0
  4. data/lib/classiccms/{mongoid.yml → scaffold/config/mongoid.yml} +3 -4
  5. data/lib/classiccms/scaffold/spec/models/article_spec.rb +8 -0
  6. data/lib/classiccms/scaffold/spec/spec_helper.rb +24 -0
  7. data/lib/classiccms/version.rb +1 -1
  8. data/spec/cli_spec.rb +8 -0
  9. data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/build/v8/libv8.a +0 -0
  10. data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/build/v8/libv8preparser.a +0 -0
  11. data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/v8/include/v8-debug.h +395 -0
  12. data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/v8/include/v8-preparser.h +117 -0
  13. data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/v8/include/v8-profiler.h +505 -0
  14. data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/v8/include/v8-testing.h +104 -0
  15. data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/v8/include/v8.h +4124 -0
  16. data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/v8/include/v8stdint.h +53 -0
  17. data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/version.rb +6 -0
  18. data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8.rb +15 -0
  19. data/vendor/bundle/gems/sass-3.1.19/.yardopts +11 -0
  20. data/vendor/bundle/gems/sass-3.1.19/CONTRIBUTING +3 -0
  21. data/vendor/bundle/gems/sass-3.1.19/MIT-LICENSE +20 -0
  22. data/vendor/bundle/gems/sass-3.1.19/README.md +200 -0
  23. data/vendor/bundle/gems/sass-3.1.19/REVISION +1 -0
  24. data/vendor/bundle/gems/sass-3.1.19/Rakefile +339 -0
  25. data/vendor/bundle/gems/sass-3.1.19/VERSION +1 -0
  26. data/vendor/bundle/gems/sass-3.1.19/VERSION_NAME +1 -0
  27. data/vendor/bundle/gems/sass-3.1.19/bin/sass +8 -0
  28. data/vendor/bundle/gems/sass-3.1.19/bin/sass-convert +7 -0
  29. data/vendor/bundle/gems/sass-3.1.19/bin/scss +8 -0
  30. data/vendor/bundle/gems/sass-3.1.19/extra/update_watch.rb +13 -0
  31. data/vendor/bundle/gems/sass-3.1.19/init.rb +18 -0
  32. data/vendor/bundle/gems/sass-3.1.19/lib/sass/cache_stores/base.rb +86 -0
  33. data/vendor/bundle/gems/sass-3.1.19/lib/sass/cache_stores/chain.rb +33 -0
  34. data/vendor/bundle/gems/sass-3.1.19/lib/sass/cache_stores/filesystem.rb +61 -0
  35. data/vendor/bundle/gems/sass-3.1.19/lib/sass/cache_stores/memory.rb +47 -0
  36. data/vendor/bundle/gems/sass-3.1.19/lib/sass/cache_stores/null.rb +25 -0
  37. data/vendor/bundle/gems/sass-3.1.19/lib/sass/cache_stores.rb +15 -0
  38. data/vendor/bundle/gems/sass-3.1.19/lib/sass/callbacks.rb +66 -0
  39. data/vendor/bundle/gems/sass-3.1.19/lib/sass/css.rb +390 -0
  40. data/vendor/bundle/gems/sass-3.1.19/lib/sass/engine.rb +880 -0
  41. data/vendor/bundle/gems/sass-3.1.19/lib/sass/environment.rb +180 -0
  42. data/vendor/bundle/gems/sass-3.1.19/lib/sass/error.rb +201 -0
  43. data/vendor/bundle/gems/sass-3.1.19/lib/sass/exec.rb +682 -0
  44. data/vendor/bundle/gems/sass-3.1.19/lib/sass/importers/base.rb +139 -0
  45. data/vendor/bundle/gems/sass-3.1.19/lib/sass/importers/filesystem.rb +149 -0
  46. data/vendor/bundle/gems/sass-3.1.19/lib/sass/importers.rb +22 -0
  47. data/vendor/bundle/gems/sass-3.1.19/lib/sass/less.rb +382 -0
  48. data/vendor/bundle/gems/sass-3.1.19/lib/sass/logger/base.rb +32 -0
  49. data/vendor/bundle/gems/sass-3.1.19/lib/sass/logger/log_level.rb +49 -0
  50. data/vendor/bundle/gems/sass-3.1.19/lib/sass/logger.rb +15 -0
  51. data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin/compiler.rb +384 -0
  52. data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin/configuration.rb +123 -0
  53. data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin/generic.rb +15 -0
  54. data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin/merb.rb +48 -0
  55. data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin/rack.rb +60 -0
  56. data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin/rails.rb +47 -0
  57. data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin/staleness_checker.rb +183 -0
  58. data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin.rb +132 -0
  59. data/vendor/bundle/gems/sass-3.1.19/lib/sass/railtie.rb +9 -0
  60. data/vendor/bundle/gems/sass-3.1.19/lib/sass/repl.rb +57 -0
  61. data/vendor/bundle/gems/sass-3.1.19/lib/sass/root.rb +7 -0
  62. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/bool.rb +18 -0
  63. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/color.rb +475 -0
  64. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/css_lexer.rb +29 -0
  65. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/css_parser.rb +31 -0
  66. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/funcall.rb +175 -0
  67. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/functions.rb +1381 -0
  68. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/interpolation.rb +79 -0
  69. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/lexer.rb +337 -0
  70. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/list.rb +84 -0
  71. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/literal.rb +230 -0
  72. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/node.rb +99 -0
  73. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/number.rb +452 -0
  74. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/operation.rb +107 -0
  75. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/parser.rb +474 -0
  76. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/string.rb +51 -0
  77. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/string_interpolation.rb +103 -0
  78. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/unary_operation.rb +64 -0
  79. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/variable.rb +58 -0
  80. data/vendor/bundle/gems/sass-3.1.19/lib/sass/script.rb +39 -0
  81. data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss/css_parser.rb +46 -0
  82. data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss/parser.rb +1055 -0
  83. data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss/rx.rb +137 -0
  84. data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss/sass_parser.rb +11 -0
  85. data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss/script_lexer.rb +15 -0
  86. data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss/script_parser.rb +25 -0
  87. data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss/static_parser.rb +40 -0
  88. data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss.rb +17 -0
  89. data/vendor/bundle/gems/sass-3.1.19/lib/sass/selector/abstract_sequence.rb +71 -0
  90. data/vendor/bundle/gems/sass-3.1.19/lib/sass/selector/comma_sequence.rb +86 -0
  91. data/vendor/bundle/gems/sass-3.1.19/lib/sass/selector/sequence.rb +296 -0
  92. data/vendor/bundle/gems/sass-3.1.19/lib/sass/selector/simple.rb +119 -0
  93. data/vendor/bundle/gems/sass-3.1.19/lib/sass/selector/simple_sequence.rb +154 -0
  94. data/vendor/bundle/gems/sass-3.1.19/lib/sass/selector.rb +373 -0
  95. data/vendor/bundle/gems/sass-3.1.19/lib/sass/shared.rb +76 -0
  96. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/charset_node.rb +22 -0
  97. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/comment_node.rb +90 -0
  98. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/debug_node.rb +18 -0
  99. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/directive_node.rb +28 -0
  100. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/each_node.rb +24 -0
  101. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/extend_node.rb +29 -0
  102. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/for_node.rb +36 -0
  103. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/function_node.rb +27 -0
  104. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/if_node.rb +52 -0
  105. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/import_node.rb +68 -0
  106. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/media_node.rb +32 -0
  107. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/mixin_def_node.rb +27 -0
  108. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/mixin_node.rb +32 -0
  109. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/node.rb +188 -0
  110. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/prop_node.rb +148 -0
  111. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/return_node.rb +18 -0
  112. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/root_node.rb +28 -0
  113. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/rule_node.rb +127 -0
  114. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/variable_node.rb +30 -0
  115. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/base.rb +75 -0
  116. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/check_nesting.rb +127 -0
  117. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/convert.rb +262 -0
  118. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/cssize.rb +206 -0
  119. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/deep_copy.rb +87 -0
  120. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/extend.rb +42 -0
  121. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/perform.rb +357 -0
  122. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/set_options.rb +97 -0
  123. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/to_css.rb +219 -0
  124. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/warn_node.rb +18 -0
  125. data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/while_node.rb +18 -0
  126. data/vendor/bundle/gems/sass-3.1.19/lib/sass/util/multibyte_string_scanner.rb +134 -0
  127. data/vendor/bundle/gems/sass-3.1.19/lib/sass/util/subset_map.rb +101 -0
  128. data/vendor/bundle/gems/sass-3.1.19/lib/sass/util.rb +800 -0
  129. data/vendor/bundle/gems/sass-3.1.19/lib/sass/version.rb +112 -0
  130. data/vendor/bundle/gems/sass-3.1.19/lib/sass.rb +73 -0
  131. data/vendor/bundle/gems/sass-3.1.19/rails/init.rb +1 -0
  132. data/vendor/bundle/gems/sass-3.1.19/test/Gemfile +4 -0
  133. data/vendor/bundle/gems/sass-3.1.19/test/sass/cache_test.rb +89 -0
  134. data/vendor/bundle/gems/sass-3.1.19/test/sass/callbacks_test.rb +61 -0
  135. data/vendor/bundle/gems/sass-3.1.19/test/sass/conversion_test.rb +1245 -0
  136. data/vendor/bundle/gems/sass-3.1.19/test/sass/css2sass_test.rb +397 -0
  137. data/vendor/bundle/gems/sass-3.1.19/test/sass/data/hsl-rgb.txt +319 -0
  138. data/vendor/bundle/gems/sass-3.1.19/test/sass/engine_test.rb +2730 -0
  139. data/vendor/bundle/gems/sass-3.1.19/test/sass/extend_test.rb +1663 -0
  140. data/vendor/bundle/gems/sass-3.1.19/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
  141. data/vendor/bundle/gems/sass-3.1.19/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
  142. data/vendor/bundle/gems/sass-3.1.19/test/sass/functions_test.rb +1047 -0
  143. data/vendor/bundle/gems/sass-3.1.19/test/sass/importer_test.rb +192 -0
  144. data/vendor/bundle/gems/sass-3.1.19/test/sass/less_conversion_test.rb +653 -0
  145. data/vendor/bundle/gems/sass-3.1.19/test/sass/logger_test.rb +58 -0
  146. data/vendor/bundle/gems/sass-3.1.19/test/sass/mock_importer.rb +49 -0
  147. data/vendor/bundle/gems/sass-3.1.19/test/sass/more_results/more1.css +9 -0
  148. data/vendor/bundle/gems/sass-3.1.19/test/sass/more_results/more1_with_line_comments.css +26 -0
  149. data/vendor/bundle/gems/sass-3.1.19/test/sass/more_results/more_import.css +29 -0
  150. data/vendor/bundle/gems/sass-3.1.19/test/sass/more_templates/_more_partial.sass +2 -0
  151. data/vendor/bundle/gems/sass-3.1.19/test/sass/more_templates/more1.sass +23 -0
  152. data/vendor/bundle/gems/sass-3.1.19/test/sass/more_templates/more_import.sass +11 -0
  153. data/vendor/bundle/gems/sass-3.1.19/test/sass/plugin_test.rb +496 -0
  154. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/alt.css +4 -0
  155. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/basic.css +9 -0
  156. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/compact.css +5 -0
  157. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/complex.css +86 -0
  158. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/compressed.css +1 -0
  159. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/expanded.css +19 -0
  160. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/if.css +3 -0
  161. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/import.css +31 -0
  162. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/import_charset.css +5 -0
  163. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/import_charset_1_8.css +5 -0
  164. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/import_charset_ibm866.css +5 -0
  165. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/line_numbers.css +49 -0
  166. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/mixins.css +95 -0
  167. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/multiline.css +24 -0
  168. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/nested.css +22 -0
  169. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/options.css +1 -0
  170. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/parent_ref.css +13 -0
  171. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/script.css +16 -0
  172. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/scss_import.css +31 -0
  173. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/scss_importee.css +2 -0
  174. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  175. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/subdir/subdir.css +3 -0
  176. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/units.css +11 -0
  177. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/warn.css +0 -0
  178. data/vendor/bundle/gems/sass-3.1.19/test/sass/results/warn_imported.css +0 -0
  179. data/vendor/bundle/gems/sass-3.1.19/test/sass/script_conversion_test.rb +285 -0
  180. data/vendor/bundle/gems/sass-3.1.19/test/sass/script_test.rb +519 -0
  181. data/vendor/bundle/gems/sass-3.1.19/test/sass/scss/css_test.rb +975 -0
  182. data/vendor/bundle/gems/sass-3.1.19/test/sass/scss/rx_test.rb +156 -0
  183. data/vendor/bundle/gems/sass-3.1.19/test/sass/scss/scss_test.rb +1308 -0
  184. data/vendor/bundle/gems/sass-3.1.19/test/sass/scss/test_helper.rb +37 -0
  185. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/_double_import_loop2.sass +1 -0
  186. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/_imported_charset_ibm866.sass +4 -0
  187. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/_imported_charset_utf8.sass +4 -0
  188. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/_partial.sass +2 -0
  189. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/alt.sass +16 -0
  190. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/basic.sass +23 -0
  191. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/bork1.sass +2 -0
  192. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/bork2.sass +2 -0
  193. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/bork3.sass +2 -0
  194. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/bork4.sass +2 -0
  195. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/bork5.sass +3 -0
  196. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/compact.sass +17 -0
  197. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/complex.sass +305 -0
  198. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/compressed.sass +15 -0
  199. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/double_import_loop1.sass +1 -0
  200. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/expanded.sass +17 -0
  201. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/if.sass +11 -0
  202. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/import.sass +12 -0
  203. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/import_charset.sass +9 -0
  204. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/import_charset_1_8.sass +6 -0
  205. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/import_charset_ibm866.sass +11 -0
  206. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/importee.less +2 -0
  207. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/importee.sass +19 -0
  208. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/line_numbers.sass +13 -0
  209. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/mixin_bork.sass +5 -0
  210. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/mixins.sass +76 -0
  211. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/multiline.sass +20 -0
  212. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested.sass +25 -0
  213. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested_bork1.sass +2 -0
  214. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested_bork2.sass +2 -0
  215. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested_bork3.sass +2 -0
  216. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested_bork4.sass +2 -0
  217. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested_bork5.sass +2 -0
  218. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested_import.sass +2 -0
  219. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested_mixin_bork.sass +6 -0
  220. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/options.sass +2 -0
  221. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/parent_ref.sass +25 -0
  222. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/script.sass +101 -0
  223. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/scss_import.scss +11 -0
  224. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/scss_importee.scss +1 -0
  225. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/single_import_loop.sass +1 -0
  226. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  227. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  228. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/subdir/subdir.sass +6 -0
  229. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/units.sass +11 -0
  230. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/warn.sass +3 -0
  231. data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/warn_imported.sass +4 -0
  232. data/vendor/bundle/gems/sass-3.1.19/test/sass/test_helper.rb +8 -0
  233. data/vendor/bundle/gems/sass-3.1.19/test/sass/util/multibyte_string_scanner_test.rb +147 -0
  234. data/vendor/bundle/gems/sass-3.1.19/test/sass/util/subset_map_test.rb +91 -0
  235. data/vendor/bundle/gems/sass-3.1.19/test/sass/util_test.rb +282 -0
  236. data/vendor/bundle/gems/sass-3.1.19/test/test_helper.rb +70 -0
  237. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/CHANGELOG.md +90 -0
  238. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/Gemfile +35 -0
  239. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/Guardfile +8 -0
  240. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/LICENSE +20 -0
  241. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/README.md +312 -0
  242. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/Rakefile +47 -0
  243. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/Vagrantfile +96 -0
  244. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/adapter.rb +167 -0
  245. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/adapters/darwin.rb +84 -0
  246. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/adapters/linux.rb +110 -0
  247. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/adapters/polling.rb +66 -0
  248. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/adapters/windows.rb +81 -0
  249. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/directory_record.rb +317 -0
  250. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/listener.rb +203 -0
  251. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/multi_listener.rb +121 -0
  252. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/turnstile.rb +28 -0
  253. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/version.rb +3 -0
  254. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen.rb +38 -0
  255. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/listen.gemspec +26 -0
  256. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/adapter_spec.rb +142 -0
  257. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/adapters/darwin_spec.rb +31 -0
  258. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/adapters/linux_spec.rb +41 -0
  259. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
  260. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/adapters/windows_spec.rb +24 -0
  261. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/directory_record_spec.rb +1034 -0
  262. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/listener_spec.rb +155 -0
  263. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/multi_listener_spec.rb +156 -0
  264. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
  265. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen_spec.rb +73 -0
  266. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/spec_helper.rb +16 -0
  267. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/support/adapter_helper.rb +716 -0
  268. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/support/directory_record_helper.rb +55 -0
  269. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/support/fixtures_helper.rb +29 -0
  270. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/support/listeners_helper.rb +144 -0
  271. data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/support/platform_helper.rb +11 -0
  272. data/vendor/bundle/gems/therubyracer-0.10.1/.gitignore +13 -0
  273. data/vendor/bundle/gems/therubyracer-0.10.1/.gitmodules +3 -0
  274. data/vendor/bundle/gems/therubyracer-0.10.1/.travis.yml +9 -0
  275. data/vendor/bundle/gems/therubyracer-0.10.1/.yardopts +1 -0
  276. data/vendor/bundle/gems/therubyracer-0.10.1/Changelog.md +196 -0
  277. data/vendor/bundle/gems/therubyracer-0.10.1/Gemfile +1 -0
  278. data/vendor/bundle/gems/therubyracer-0.10.1/README.md +167 -0
  279. data/vendor/bundle/gems/therubyracer-0.10.1/Rakefile +23 -0
  280. data/vendor/bundle/gems/therubyracer-0.10.1/bin/therubyracer +11 -0
  281. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/Makefile +213 -0
  282. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/extconf.rb +26 -0
  283. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/gem_make.out +156 -0
  284. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/rr.cpp +189 -0
  285. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/rr.h +41 -0
  286. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8.cpp +48 -0
  287. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_array.cpp +48 -0
  288. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_array.h +8 -0
  289. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_callbacks.cpp +81 -0
  290. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_callbacks.h +8 -0
  291. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_context.cpp +92 -0
  292. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_context.h +6 -0
  293. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_date.cpp +34 -0
  294. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_date.h +6 -0
  295. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_debug.cpp +17 -0
  296. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_debug.h +6 -0
  297. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_exception.cpp +133 -0
  298. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_exception.h +11 -0
  299. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_external.cpp +70 -0
  300. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_external.h +8 -0
  301. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_function.cpp +69 -0
  302. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_function.h +11 -0
  303. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_handle.cpp +186 -0
  304. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_handle.h +48 -0
  305. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_locker.cpp +139 -0
  306. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_locker.h +6 -0
  307. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_message.cpp +67 -0
  308. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_message.h +10 -0
  309. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_object.cpp +122 -0
  310. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_object.h +10 -0
  311. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_script.cpp +36 -0
  312. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_script.h +8 -0
  313. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_string.cpp +52 -0
  314. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_string.h +9 -0
  315. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_template.cpp +344 -0
  316. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_template.h +8 -0
  317. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_try_catch.cpp +70 -0
  318. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_try_catch.h +5 -0
  319. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_v8.cpp +35 -0
  320. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_v8.h +6 -0
  321. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_value.cpp +175 -0
  322. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_value.h +10 -0
  323. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_weakref.cpp +61 -0
  324. data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_weakref.h +29 -0
  325. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/access.rb +87 -0
  326. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/array.rb +17 -0
  327. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/c/locker.rb +18 -0
  328. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/cli.rb +133 -0
  329. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/context.rb +111 -0
  330. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/error.rb +130 -0
  331. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/function.rb +44 -0
  332. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/object.rb +69 -0
  333. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/caller.rb +37 -0
  334. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/constructor.rb +98 -0
  335. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/function.rb +63 -0
  336. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/interceptors.rb +152 -0
  337. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/proxies.rb +151 -0
  338. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/templates.rb +73 -0
  339. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal.rb +86 -0
  340. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/stack.rb +66 -0
  341. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/tap.rb +9 -0
  342. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/version.rb +3 -0
  343. data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8.rb +23 -0
  344. data/vendor/bundle/gems/therubyracer-0.10.1/spec/ext/array_spec.rb +15 -0
  345. data/vendor/bundle/gems/therubyracer-0.10.1/spec/ext/cxt_spec.rb +57 -0
  346. data/vendor/bundle/gems/therubyracer-0.10.1/spec/ext/ext_spec_helper.rb +27 -0
  347. data/vendor/bundle/gems/therubyracer-0.10.1/spec/ext/func_spec.rb +64 -0
  348. data/vendor/bundle/gems/therubyracer-0.10.1/spec/ext/object_spec.rb +10 -0
  349. data/vendor/bundle/gems/therubyracer-0.10.1/spec/ext/string_spec.rb +11 -0
  350. data/vendor/bundle/gems/therubyracer-0.10.1/spec/ext/try_catch_spec.rb +60 -0
  351. data/vendor/bundle/gems/therubyracer-0.10.1/spec/redjs/.gitignore +1 -0
  352. data/vendor/bundle/gems/therubyracer-0.10.1/spec/redjs/README.txt +8 -0
  353. data/vendor/bundle/gems/therubyracer-0.10.1/spec/redjs/jsapi_spec.rb +922 -0
  354. data/vendor/bundle/gems/therubyracer-0.10.1/spec/redjs/loadme.js +1 -0
  355. data/vendor/bundle/gems/therubyracer-0.10.1/spec/redjs_helper.rb +3 -0
  356. data/vendor/bundle/gems/therubyracer-0.10.1/spec/spec_helper.rb +9 -0
  357. data/vendor/bundle/gems/therubyracer-0.10.1/spec/v8/error_spec.rb +131 -0
  358. data/vendor/bundle/gems/therubyracer-0.10.1/spec/v8/portal/proxies_spec.rb +106 -0
  359. data/vendor/bundle/gems/therubyracer-0.10.1/specmem/handle_memspec.rb +41 -0
  360. data/vendor/bundle/gems/therubyracer-0.10.1/specmem/object_memspec.rb +14 -0
  361. data/vendor/bundle/gems/therubyracer-0.10.1/specmem/proxies_memspec.rb +49 -0
  362. data/vendor/bundle/gems/therubyracer-0.10.1/specmem/spec_helper.rb +24 -0
  363. data/vendor/bundle/gems/therubyracer-0.10.1/specthread/spec_helper.rb +2 -0
  364. data/vendor/bundle/gems/therubyracer-0.10.1/specthread/threading_spec.rb +13 -0
  365. data/vendor/bundle/gems/therubyracer-0.10.1/thefrontside.png +0 -0
  366. data/vendor/bundle/gems/therubyracer-0.10.1/therubyracer.gemspec +29 -0
  367. data/vendor/bundle/specifications/libv8-3.3.10.4-x86_64-darwin-11.gemspec +33 -0
  368. data/vendor/bundle/specifications/sass-3.1.19.gemspec +35 -0
  369. metadata +365 -3
@@ -0,0 +1,880 @@
1
+ require 'set'
2
+ require 'digest/sha1'
3
+ require 'sass/cache_stores'
4
+ require 'sass/tree/node'
5
+ require 'sass/tree/root_node'
6
+ require 'sass/tree/rule_node'
7
+ require 'sass/tree/comment_node'
8
+ require 'sass/tree/prop_node'
9
+ require 'sass/tree/directive_node'
10
+ require 'sass/tree/media_node'
11
+ require 'sass/tree/variable_node'
12
+ require 'sass/tree/mixin_def_node'
13
+ require 'sass/tree/mixin_node'
14
+ require 'sass/tree/function_node'
15
+ require 'sass/tree/return_node'
16
+ require 'sass/tree/extend_node'
17
+ require 'sass/tree/if_node'
18
+ require 'sass/tree/while_node'
19
+ require 'sass/tree/for_node'
20
+ require 'sass/tree/each_node'
21
+ require 'sass/tree/debug_node'
22
+ require 'sass/tree/warn_node'
23
+ require 'sass/tree/import_node'
24
+ require 'sass/tree/charset_node'
25
+ require 'sass/tree/visitors/base'
26
+ require 'sass/tree/visitors/perform'
27
+ require 'sass/tree/visitors/cssize'
28
+ require 'sass/tree/visitors/extend'
29
+ require 'sass/tree/visitors/convert'
30
+ require 'sass/tree/visitors/to_css'
31
+ require 'sass/tree/visitors/deep_copy'
32
+ require 'sass/tree/visitors/set_options'
33
+ require 'sass/tree/visitors/check_nesting'
34
+ require 'sass/selector'
35
+ require 'sass/environment'
36
+ require 'sass/script'
37
+ require 'sass/scss'
38
+ require 'sass/error'
39
+ require 'sass/importers'
40
+ require 'sass/shared'
41
+
42
+ module Sass
43
+
44
+ # A Sass mixin or function.
45
+ #
46
+ # `name`: `String`
47
+ # : The name of the mixin/function.
48
+ #
49
+ # `args`: `Array<(String, Script::Node)>`
50
+ # : The arguments for the mixin/function.
51
+ # Each element is a tuple containing the name of the argument
52
+ # and the parse tree for the default value of the argument.
53
+ #
54
+ # `environment`: {Sass::Environment}
55
+ # : The environment in which the mixin/function was defined.
56
+ # This is captured so that the mixin/function can have access
57
+ # to local variables defined in its scope.
58
+ #
59
+ # `tree`: `Array<Tree::Node>`
60
+ # : The parse tree for the mixin/function.
61
+ Callable = Struct.new(:name, :args, :environment, :tree)
62
+
63
+ # This class handles the parsing and compilation of the Sass template.
64
+ # Example usage:
65
+ #
66
+ # template = File.load('stylesheets/sassy.sass')
67
+ # sass_engine = Sass::Engine.new(template)
68
+ # output = sass_engine.render
69
+ # puts output
70
+ class Engine
71
+ include Sass::Util
72
+
73
+ # A line of Sass code.
74
+ #
75
+ # `text`: `String`
76
+ # : The text in the line, without any whitespace at the beginning or end.
77
+ #
78
+ # `tabs`: `Fixnum`
79
+ # : The level of indentation of the line.
80
+ #
81
+ # `index`: `Fixnum`
82
+ # : The line number in the original document.
83
+ #
84
+ # `offset`: `Fixnum`
85
+ # : The number of bytes in on the line that the text begins.
86
+ # This ends up being the number of bytes of leading whitespace.
87
+ #
88
+ # `filename`: `String`
89
+ # : The name of the file in which this line appeared.
90
+ #
91
+ # `children`: `Array<Line>`
92
+ # : The lines nested below this one.
93
+ #
94
+ # `comment_tab_str`: `String?`
95
+ # : The prefix indentation for this comment, if it is a comment.
96
+ class Line < Struct.new(:text, :tabs, :index, :offset, :filename, :children, :comment_tab_str)
97
+ def comment?
98
+ text[0] == COMMENT_CHAR && (text[1] == SASS_COMMENT_CHAR || text[1] == CSS_COMMENT_CHAR)
99
+ end
100
+ end
101
+
102
+ # The character that begins a CSS property.
103
+ PROPERTY_CHAR = ?:
104
+
105
+ # The character that designates the beginning of a comment,
106
+ # either Sass or CSS.
107
+ COMMENT_CHAR = ?/
108
+
109
+ # The character that follows the general COMMENT_CHAR and designates a Sass comment,
110
+ # which is not output as a CSS comment.
111
+ SASS_COMMENT_CHAR = ?/
112
+
113
+ # The character that indicates that a comment allows interpolation
114
+ # and should be preserved even in `:compressed` mode.
115
+ SASS_LOUD_COMMENT_CHAR = ?!
116
+
117
+ # The character that follows the general COMMENT_CHAR and designates a CSS comment,
118
+ # which is embedded in the CSS document.
119
+ CSS_COMMENT_CHAR = ?*
120
+
121
+ # The character used to denote a compiler directive.
122
+ DIRECTIVE_CHAR = ?@
123
+
124
+ # Designates a non-parsed rule.
125
+ ESCAPE_CHAR = ?\\
126
+
127
+ # Designates block as mixin definition rather than CSS rules to output
128
+ MIXIN_DEFINITION_CHAR = ?=
129
+
130
+ # Includes named mixin declared using MIXIN_DEFINITION_CHAR
131
+ MIXIN_INCLUDE_CHAR = ?+
132
+
133
+ # The regex that matches and extracts data from
134
+ # properties of the form `:name prop`.
135
+ PROPERTY_OLD = /^:([^\s=:"]+)\s*(?:\s+|$)(.*)/
136
+
137
+ # The default options for Sass::Engine.
138
+ # @api public
139
+ DEFAULT_OPTIONS = {
140
+ :style => :nested,
141
+ :load_paths => ['.'],
142
+ :cache => true,
143
+ :cache_location => './.sass-cache',
144
+ :syntax => :sass,
145
+ :filesystem_importer => Sass::Importers::Filesystem
146
+ }.freeze
147
+
148
+ # Converts a Sass options hash into a standard form, filling in
149
+ # default values and resolving aliases.
150
+ #
151
+ # @param options [{Symbol => Object}] The options hash;
152
+ # see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
153
+ # @return [{Symbol => Object}] The normalized options hash.
154
+ # @private
155
+ def self.normalize_options(options)
156
+ options = DEFAULT_OPTIONS.merge(options.reject {|k, v| v.nil?})
157
+
158
+ # If the `:filename` option is passed in without an importer,
159
+ # assume it's using the default filesystem importer.
160
+ options[:importer] ||= options[:filesystem_importer].new(".") if options[:filename]
161
+
162
+ # Tracks the original filename of the top-level Sass file
163
+ options[:original_filename] ||= options[:filename]
164
+
165
+ options[:cache_store] ||= Sass::CacheStores::Chain.new(
166
+ Sass::CacheStores::Memory.new, Sass::CacheStores::Filesystem.new(options[:cache_location]))
167
+ # Support both, because the docs said one and the other actually worked
168
+ # for quite a long time.
169
+ options[:line_comments] ||= options[:line_numbers]
170
+
171
+ options[:load_paths] = options[:load_paths].map do |p|
172
+ next p unless p.is_a?(String) || (defined?(Pathname) && p.is_a?(Pathname))
173
+ options[:filesystem_importer].new(p.to_s)
174
+ end
175
+
176
+ # Backwards compatibility
177
+ options[:property_syntax] ||= options[:attribute_syntax]
178
+ case options[:property_syntax]
179
+ when :alternate; options[:property_syntax] = :new
180
+ when :normal; options[:property_syntax] = :old
181
+ end
182
+
183
+ options
184
+ end
185
+
186
+ # Returns the {Sass::Engine} for the given file.
187
+ # This is preferable to Sass::Engine.new when reading from a file
188
+ # because it properly sets up the Engine's metadata,
189
+ # enables parse-tree caching,
190
+ # and infers the syntax from the filename.
191
+ #
192
+ # @param filename [String] The path to the Sass or SCSS file
193
+ # @param options [{Symbol => Object}] The options hash;
194
+ # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
195
+ # @return [Sass::Engine] The Engine for the given Sass or SCSS file.
196
+ # @raise [Sass::SyntaxError] if there's an error in the document.
197
+ def self.for_file(filename, options)
198
+ had_syntax = options[:syntax]
199
+
200
+ if had_syntax
201
+ # Use what was explicitly specificed
202
+ elsif filename =~ /\.scss$/
203
+ options.merge!(:syntax => :scss)
204
+ elsif filename =~ /\.sass$/
205
+ options.merge!(:syntax => :sass)
206
+ end
207
+
208
+ Sass::Engine.new(File.read(filename), options.merge(:filename => filename))
209
+ end
210
+
211
+ # The options for the Sass engine.
212
+ # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
213
+ #
214
+ # @return [{Symbol => Object}]
215
+ attr_reader :options
216
+
217
+ # Creates a new Engine. Note that Engine should only be used directly
218
+ # when compiling in-memory Sass code.
219
+ # If you're compiling a single Sass file from the filesystem,
220
+ # use \{Sass::Engine.for\_file}.
221
+ # If you're compiling multiple files from the filesystem,
222
+ # use {Sass::Plugin}.
223
+ #
224
+ # @param template [String] The Sass template.
225
+ # This template can be encoded using any encoding
226
+ # that can be converted to Unicode.
227
+ # If the template contains an `@charset` declaration,
228
+ # that overrides the Ruby encoding
229
+ # (see {file:SASS_REFERENCE.md#encodings the encoding documentation})
230
+ # @param options [{Symbol => Object}] An options hash.
231
+ # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
232
+ # @see {Sass::Engine.for_file}
233
+ # @see {Sass::Plugin}
234
+ def initialize(template, options={})
235
+ @options = self.class.normalize_options(options)
236
+ @template = template
237
+ end
238
+
239
+ # Render the template to CSS.
240
+ #
241
+ # @return [String] The CSS
242
+ # @raise [Sass::SyntaxError] if there's an error in the document
243
+ # @raise [Encoding::UndefinedConversionError] if the source encoding
244
+ # cannot be converted to UTF-8
245
+ # @raise [ArgumentError] if the document uses an unknown encoding with `@charset`
246
+ def render
247
+ return _render unless @options[:quiet]
248
+ Sass::Util.silence_sass_warnings {_render}
249
+ end
250
+ alias_method :to_css, :render
251
+
252
+ # Parses the document into its parse tree. Memoized.
253
+ #
254
+ # @return [Sass::Tree::Node] The root of the parse tree.
255
+ # @raise [Sass::SyntaxError] if there's an error in the document
256
+ def to_tree
257
+ @tree ||= @options[:quiet] ?
258
+ Sass::Util.silence_sass_warnings {_to_tree} :
259
+ _to_tree
260
+ end
261
+
262
+ # Returns the original encoding of the document,
263
+ # or `nil` under Ruby 1.8.
264
+ #
265
+ # @return [Encoding, nil]
266
+ # @raise [Encoding::UndefinedConversionError] if the source encoding
267
+ # cannot be converted to UTF-8
268
+ # @raise [ArgumentError] if the document uses an unknown encoding with `@charset`
269
+ def source_encoding
270
+ check_encoding!
271
+ @original_encoding
272
+ end
273
+
274
+ # Gets a set of all the documents
275
+ # that are (transitive) dependencies of this document,
276
+ # not including the document itself.
277
+ #
278
+ # @return [[Sass::Engine]] The dependency documents.
279
+ def dependencies
280
+ _dependencies(Set.new, engines = Set.new)
281
+ engines - [self]
282
+ end
283
+
284
+ # Helper for \{#dependencies}.
285
+ #
286
+ # @private
287
+ def _dependencies(seen, engines)
288
+ return if seen.include?(key = [@options[:filename], @options[:importer]])
289
+ seen << key
290
+ engines << self
291
+ to_tree.grep(Tree::ImportNode) do |n|
292
+ next if n.css_import?
293
+ n.imported_file._dependencies(seen, engines)
294
+ end
295
+ end
296
+
297
+ private
298
+
299
+ def _render
300
+ rendered = _to_tree.render
301
+ return rendered if ruby1_8?
302
+ begin
303
+ # Try to convert the result to the original encoding,
304
+ # but if that doesn't work fall back on UTF-8
305
+ rendered = rendered.encode(source_encoding)
306
+ rescue EncodingError
307
+ end
308
+ rendered.gsub(Regexp.new('\A@charset "(.*?)"'.encode(source_encoding)),
309
+ "@charset \"#{source_encoding.name}\"".encode(source_encoding))
310
+ end
311
+
312
+ def _to_tree
313
+ if (@options[:cache] || @options[:read_cache]) &&
314
+ @options[:filename] && @options[:importer]
315
+ key = sassc_key
316
+ sha = Digest::SHA1.hexdigest(@template)
317
+
318
+ if root = @options[:cache_store].retrieve(key, sha)
319
+ root.options = @options
320
+ return root
321
+ end
322
+ end
323
+
324
+ check_encoding!
325
+
326
+ if @options[:syntax] == :scss
327
+ root = Sass::SCSS::Parser.new(@template, @options[:filename]).parse
328
+ else
329
+ root = Tree::RootNode.new(@template)
330
+ append_children(root, tree(tabulate(@template)).first, true)
331
+ end
332
+
333
+ root.options = @options
334
+ if @options[:cache] && key && sha
335
+ begin
336
+ old_options = root.options
337
+ root.options = {}
338
+ @options[:cache_store].store(key, sha, root)
339
+ ensure
340
+ root.options = old_options
341
+ end
342
+ end
343
+ root
344
+ rescue SyntaxError => e
345
+ e.modify_backtrace(:filename => @options[:filename], :line => @line)
346
+ e.sass_template = @template
347
+ raise e
348
+ end
349
+
350
+ def sassc_key
351
+ @options[:cache_store].key(*@options[:importer].key(@options[:filename], @options))
352
+ end
353
+
354
+ def check_encoding!
355
+ return if @checked_encoding
356
+ @checked_encoding = true
357
+ @template, @original_encoding = check_sass_encoding(@template) do |msg, line|
358
+ raise Sass::SyntaxError.new(msg, :line => line)
359
+ end
360
+ end
361
+
362
+ def tabulate(string)
363
+ tab_str = nil
364
+ comment_tab_str = nil
365
+ first = true
366
+ lines = []
367
+ string.gsub(/\r|\n|\r\n|\r\n/, "\n").scan(/^[^\n]*?$/).each_with_index do |line, index|
368
+ index += (@options[:line] || 1)
369
+ if line.strip.empty?
370
+ lines.last.text << "\n" if lines.last && lines.last.comment?
371
+ next
372
+ end
373
+
374
+ line_tab_str = line[/^\s*/]
375
+ unless line_tab_str.empty?
376
+ if tab_str.nil?
377
+ comment_tab_str ||= line_tab_str
378
+ next if try_comment(line, lines.last, "", comment_tab_str, index)
379
+ comment_tab_str = nil
380
+ end
381
+
382
+ tab_str ||= line_tab_str
383
+
384
+ raise SyntaxError.new("Indenting at the beginning of the document is illegal.",
385
+ :line => index) if first
386
+
387
+ raise SyntaxError.new("Indentation can't use both tabs and spaces.",
388
+ :line => index) if tab_str.include?(?\s) && tab_str.include?(?\t)
389
+ end
390
+ first &&= !tab_str.nil?
391
+ if tab_str.nil?
392
+ lines << Line.new(line.strip, 0, index, 0, @options[:filename], [])
393
+ next
394
+ end
395
+
396
+ comment_tab_str ||= line_tab_str
397
+ if try_comment(line, lines.last, tab_str * lines.last.tabs, comment_tab_str, index)
398
+ next
399
+ else
400
+ comment_tab_str = nil
401
+ end
402
+
403
+ line_tabs = line_tab_str.scan(tab_str).size
404
+ if tab_str * line_tabs != line_tab_str
405
+ message = <<END.strip.gsub("\n", ' ')
406
+ Inconsistent indentation: #{Sass::Shared.human_indentation line_tab_str, true} used for indentation,
407
+ but the rest of the document was indented using #{Sass::Shared.human_indentation tab_str}.
408
+ END
409
+ raise SyntaxError.new(message, :line => index)
410
+ end
411
+
412
+ lines << Line.new(line.strip, line_tabs, index, tab_str.size, @options[:filename], [])
413
+ end
414
+ lines
415
+ end
416
+
417
+ def try_comment(line, last, tab_str, comment_tab_str, index)
418
+ return unless last && last.comment?
419
+ # Nested comment stuff must be at least one whitespace char deeper
420
+ # than the normal indentation
421
+ return unless line =~ /^#{tab_str}\s/
422
+ unless line =~ /^(?:#{comment_tab_str})(.*)$/
423
+ raise SyntaxError.new(<<MSG.strip.gsub("\n", " "), :line => index)
424
+ Inconsistent indentation:
425
+ previous line was indented by #{Sass::Shared.human_indentation comment_tab_str},
426
+ but this line was indented by #{Sass::Shared.human_indentation line[/^\s*/]}.
427
+ MSG
428
+ end
429
+
430
+ last.comment_tab_str ||= comment_tab_str
431
+ last.text << "\n" << line
432
+ true
433
+ end
434
+
435
+ def tree(arr, i = 0)
436
+ return [], i if arr[i].nil?
437
+
438
+ base = arr[i].tabs
439
+ nodes = []
440
+ while (line = arr[i]) && line.tabs >= base
441
+ if line.tabs > base
442
+ raise SyntaxError.new("The line was indented #{line.tabs - base} levels deeper than the previous line.",
443
+ :line => line.index) if line.tabs > base + 1
444
+
445
+ nodes.last.children, i = tree(arr, i)
446
+ else
447
+ nodes << line
448
+ i += 1
449
+ end
450
+ end
451
+ return nodes, i
452
+ end
453
+
454
+ def build_tree(parent, line, root = false)
455
+ @line = line.index
456
+ node_or_nodes = parse_line(parent, line, root)
457
+
458
+ Array(node_or_nodes).each do |node|
459
+ # Node is a symbol if it's non-outputting, like a variable assignment
460
+ next unless node.is_a? Tree::Node
461
+
462
+ node.line = line.index
463
+ node.filename = line.filename
464
+
465
+ append_children(node, line.children, false)
466
+ end
467
+
468
+ node_or_nodes
469
+ end
470
+
471
+ def append_children(parent, children, root)
472
+ continued_rule = nil
473
+ continued_comment = nil
474
+ children.each do |line|
475
+ child = build_tree(parent, line, root)
476
+
477
+ if child.is_a?(Tree::RuleNode)
478
+ if child.continued? && child.children.empty?
479
+ if continued_rule
480
+ continued_rule.add_rules child
481
+ else
482
+ continued_rule = child
483
+ end
484
+ next
485
+ elsif continued_rule
486
+ continued_rule.add_rules child
487
+ continued_rule.children = child.children
488
+ continued_rule, child = nil, continued_rule
489
+ end
490
+ elsif continued_rule
491
+ continued_rule = nil
492
+ end
493
+
494
+ if child.is_a?(Tree::CommentNode) && child.silent
495
+ if continued_comment &&
496
+ child.line == continued_comment.line +
497
+ continued_comment.lines + 1
498
+ continued_comment.value += ["\n"] + child.value
499
+ next
500
+ end
501
+
502
+ continued_comment = child
503
+ end
504
+
505
+ check_for_no_children(child)
506
+ validate_and_append_child(parent, child, line, root)
507
+ end
508
+
509
+ parent
510
+ end
511
+
512
+ def validate_and_append_child(parent, child, line, root)
513
+ case child
514
+ when Array
515
+ child.each {|c| validate_and_append_child(parent, c, line, root)}
516
+ when Tree::Node
517
+ parent << child
518
+ end
519
+ end
520
+
521
+ def check_for_no_children(node)
522
+ return unless node.is_a?(Tree::RuleNode) && node.children.empty?
523
+ Sass::Util.sass_warn(<<WARNING.strip)
524
+ WARNING on line #{node.line}#{" of #{node.filename}" if node.filename}:
525
+ This selector doesn't have any properties and will not be rendered.
526
+ WARNING
527
+ end
528
+
529
+ def parse_line(parent, line, root)
530
+ case line.text[0]
531
+ when PROPERTY_CHAR
532
+ if line.text[1] == PROPERTY_CHAR ||
533
+ (@options[:property_syntax] == :new &&
534
+ line.text =~ PROPERTY_OLD && $2.empty?)
535
+ # Support CSS3-style pseudo-elements,
536
+ # which begin with ::,
537
+ # as well as pseudo-classes
538
+ # if we're using the new property syntax
539
+ Tree::RuleNode.new(parse_interp(line.text))
540
+ else
541
+ name, value = line.text.scan(PROPERTY_OLD)[0]
542
+ raise SyntaxError.new("Invalid property: \"#{line.text}\".",
543
+ :line => @line) if name.nil? || value.nil?
544
+ parse_property(name, parse_interp(name), value, :old, line)
545
+ end
546
+ when ?$
547
+ parse_variable(line)
548
+ when COMMENT_CHAR
549
+ parse_comment(line)
550
+ when DIRECTIVE_CHAR
551
+ parse_directive(parent, line, root)
552
+ when ESCAPE_CHAR
553
+ Tree::RuleNode.new(parse_interp(line.text[1..-1]))
554
+ when MIXIN_DEFINITION_CHAR
555
+ parse_mixin_definition(line)
556
+ when MIXIN_INCLUDE_CHAR
557
+ if line.text[1].nil? || line.text[1] == ?\s
558
+ Tree::RuleNode.new(parse_interp(line.text))
559
+ else
560
+ parse_mixin_include(line, root)
561
+ end
562
+ else
563
+ parse_property_or_rule(line)
564
+ end
565
+ end
566
+
567
+ def parse_property_or_rule(line)
568
+ scanner = Sass::Util::MultibyteStringScanner.new(line.text)
569
+ hack_char = scanner.scan(/[:\*\.]|\#(?!\{)/)
570
+ parser = Sass::SCSS::SassParser.new(scanner, @options[:filename], @line)
571
+
572
+ unless res = parser.parse_interp_ident
573
+ return Tree::RuleNode.new(parse_interp(line.text))
574
+ end
575
+ res.unshift(hack_char) if hack_char
576
+ if comment = scanner.scan(Sass::SCSS::RX::COMMENT)
577
+ res << comment
578
+ end
579
+
580
+ name = line.text[0...scanner.pos]
581
+ if scanner.scan(/\s*:(?:\s|$)/)
582
+ parse_property(name, res, scanner.rest, :new, line)
583
+ else
584
+ res.pop if comment
585
+ Tree::RuleNode.new(res + parse_interp(scanner.rest))
586
+ end
587
+ end
588
+
589
+ def parse_property(name, parsed_name, value, prop, line)
590
+ if value.strip.empty?
591
+ expr = Sass::Script::String.new("")
592
+ else
593
+ expr = parse_script(value, :offset => line.offset + line.text.index(value))
594
+ end
595
+ Tree::PropNode.new(parse_interp(name), expr, prop)
596
+ end
597
+
598
+ def parse_variable(line)
599
+ name, value, default = line.text.scan(Script::MATCH)[0]
600
+ raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath variable declarations.",
601
+ :line => @line + 1) unless line.children.empty?
602
+ raise SyntaxError.new("Invalid variable: \"#{line.text}\".",
603
+ :line => @line) unless name && value
604
+
605
+ expr = parse_script(value, :offset => line.offset + line.text.index(value))
606
+
607
+ Tree::VariableNode.new(name, expr, default)
608
+ end
609
+
610
+ def parse_comment(line)
611
+ if line.text[1] == CSS_COMMENT_CHAR || line.text[1] == SASS_COMMENT_CHAR
612
+ silent = line.text[1] == SASS_COMMENT_CHAR
613
+ if loud = line.text[2] == SASS_LOUD_COMMENT_CHAR
614
+ value = self.class.parse_interp(line.text, line.index, line.offset, :filename => @filename)
615
+ value[0].slice!(2) # get rid of the "!"
616
+ else
617
+ value = [line.text]
618
+ end
619
+ value = with_extracted_values(value) do |str|
620
+ str = str.gsub(/^#{line.comment_tab_str}/m, '')[2..-1] # get rid of // or /*
621
+ format_comment_text(str, silent)
622
+ end
623
+ Tree::CommentNode.new(value, silent, loud)
624
+ else
625
+ Tree::RuleNode.new(parse_interp(line.text))
626
+ end
627
+ end
628
+
629
+ def parse_directive(parent, line, root)
630
+ directive, whitespace, value = line.text[1..-1].split(/(\s+)/, 2)
631
+ offset = directive.size + whitespace.size + 1 if whitespace
632
+
633
+ # If value begins with url( or ",
634
+ # it's a CSS @import rule and we don't want to touch it.
635
+ if directive == "import"
636
+ parse_import(line, value)
637
+ elsif directive == "mixin"
638
+ parse_mixin_definition(line)
639
+ elsif directive == "include"
640
+ parse_mixin_include(line, root)
641
+ elsif directive == "function"
642
+ parse_function(line, root)
643
+ elsif directive == "for"
644
+ parse_for(line, root, value)
645
+ elsif directive == "each"
646
+ parse_each(line, root, value)
647
+ elsif directive == "else"
648
+ parse_else(parent, line, value)
649
+ elsif directive == "while"
650
+ raise SyntaxError.new("Invalid while directive '@while': expected expression.") unless value
651
+ Tree::WhileNode.new(parse_script(value, :offset => offset))
652
+ elsif directive == "if"
653
+ raise SyntaxError.new("Invalid if directive '@if': expected expression.") unless value
654
+ Tree::IfNode.new(parse_script(value, :offset => offset))
655
+ elsif directive == "debug"
656
+ raise SyntaxError.new("Invalid debug directive '@debug': expected expression.") unless value
657
+ raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath debug directives.",
658
+ :line => @line + 1) unless line.children.empty?
659
+ offset = line.offset + line.text.index(value).to_i
660
+ Tree::DebugNode.new(parse_script(value, :offset => offset))
661
+ elsif directive == "extend"
662
+ raise SyntaxError.new("Invalid extend directive '@extend': expected expression.") unless value
663
+ raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath extend directives.",
664
+ :line => @line + 1) unless line.children.empty?
665
+ offset = line.offset + line.text.index(value).to_i
666
+ Tree::ExtendNode.new(parse_interp(value, offset))
667
+ elsif directive == "warn"
668
+ raise SyntaxError.new("Invalid warn directive '@warn': expected expression.") unless value
669
+ raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath warn directives.",
670
+ :line => @line + 1) unless line.children.empty?
671
+ offset = line.offset + line.text.index(value).to_i
672
+ Tree::WarnNode.new(parse_script(value, :offset => offset))
673
+ elsif directive == "return"
674
+ raise SyntaxError.new("Invalid @return: expected expression.") unless value
675
+ raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath return directives.",
676
+ :line => @line + 1) unless line.children.empty?
677
+ offset = line.offset + line.text.index(value).to_i
678
+ Tree::ReturnNode.new(parse_script(value, :offset => offset))
679
+ elsif directive == "charset"
680
+ name = value && value[/\A(["'])(.*)\1\Z/, 2] #"
681
+ raise SyntaxError.new("Invalid charset directive '@charset': expected string.") unless name
682
+ raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath charset directives.",
683
+ :line => @line + 1) unless line.children.empty?
684
+ Tree::CharsetNode.new(name)
685
+ elsif directive == "media"
686
+ Tree::MediaNode.new(value.split(',').map {|s| s.strip})
687
+ else
688
+ Tree::DirectiveNode.new(line.text)
689
+ end
690
+ end
691
+
692
+ def parse_for(line, root, text)
693
+ var, from_expr, to_name, to_expr = text.scan(/^([^\s]+)\s+from\s+(.+)\s+(to|through)\s+(.+)$/).first
694
+
695
+ if var.nil? # scan failed, try to figure out why for error message
696
+ if text !~ /^[^\s]+/
697
+ expected = "variable name"
698
+ elsif text !~ /^[^\s]+\s+from\s+.+/
699
+ expected = "'from <expr>'"
700
+ else
701
+ expected = "'to <expr>' or 'through <expr>'"
702
+ end
703
+ raise SyntaxError.new("Invalid for directive '@for #{text}': expected #{expected}.")
704
+ end
705
+ raise SyntaxError.new("Invalid variable \"#{var}\".") unless var =~ Script::VALIDATE
706
+
707
+ var = var[1..-1]
708
+ parsed_from = parse_script(from_expr, :offset => line.offset + line.text.index(from_expr))
709
+ parsed_to = parse_script(to_expr, :offset => line.offset + line.text.index(to_expr))
710
+ Tree::ForNode.new(var, parsed_from, parsed_to, to_name == 'to')
711
+ end
712
+
713
+ def parse_each(line, root, text)
714
+ var, list_expr = text.scan(/^([^\s]+)\s+in\s+(.+)$/).first
715
+
716
+ if var.nil? # scan failed, try to figure out why for error message
717
+ if text !~ /^[^\s]+/
718
+ expected = "variable name"
719
+ elsif text !~ /^[^\s]+\s+from\s+.+/
720
+ expected = "'in <expr>'"
721
+ end
722
+ raise SyntaxError.new("Invalid for directive '@each #{text}': expected #{expected}.")
723
+ end
724
+ raise SyntaxError.new("Invalid variable \"#{var}\".") unless var =~ Script::VALIDATE
725
+
726
+ var = var[1..-1]
727
+ parsed_list = parse_script(list_expr, :offset => line.offset + line.text.index(list_expr))
728
+ Tree::EachNode.new(var, parsed_list)
729
+ end
730
+
731
+ def parse_else(parent, line, text)
732
+ previous = parent.children.last
733
+ raise SyntaxError.new("@else must come after @if.") unless previous.is_a?(Tree::IfNode)
734
+
735
+ if text
736
+ if text !~ /^if\s+(.+)/
737
+ raise SyntaxError.new("Invalid else directive '@else #{text}': expected 'if <expr>'.")
738
+ end
739
+ expr = parse_script($1, :offset => line.offset + line.text.index($1))
740
+ end
741
+
742
+ node = Tree::IfNode.new(expr)
743
+ append_children(node, line.children, false)
744
+ previous.add_else node
745
+ nil
746
+ end
747
+
748
+ def parse_import(line, value)
749
+ raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath import directives.",
750
+ :line => @line + 1) unless line.children.empty?
751
+
752
+ scanner = Sass::Util::MultibyteStringScanner.new(value)
753
+ values = []
754
+
755
+ loop do
756
+ unless node = parse_import_arg(scanner)
757
+ raise SyntaxError.new("Invalid @import: expected file to import, was #{scanner.rest.inspect}",
758
+ :line => @line)
759
+ end
760
+ values << node
761
+ break unless scanner.scan(/,\s*/)
762
+ end
763
+
764
+ if scanner.scan(/;/)
765
+ raise SyntaxError.new("Invalid @import: expected end of line, was \";\".",
766
+ :line => @line)
767
+ end
768
+
769
+ return values
770
+ end
771
+
772
+ def parse_import_arg(scanner)
773
+ return if scanner.eos?
774
+ unless (str = scanner.scan(Sass::SCSS::RX::STRING)) ||
775
+ (uri = scanner.scan(Sass::SCSS::RX::URI))
776
+ return Tree::ImportNode.new(scanner.scan(/[^,;]+/))
777
+ end
778
+
779
+ val = scanner[1] || scanner[2]
780
+ scanner.scan(/\s*/)
781
+ if media = scanner.scan(/[a-zA-Z].*/)
782
+ Tree::DirectiveNode.new("@import #{str || uri} #{media}")
783
+ elsif !scanner.match?(/[,;]|$/)
784
+ raise SyntaxError.new("Invalid @import: \"#{str || uri} #{scanner.rest}\"")
785
+ elsif uri
786
+ Tree::DirectiveNode.new("@import #{uri}")
787
+ elsif val =~ /^http:\/\//
788
+ Tree::DirectiveNode.new("@import #{str}")
789
+ else
790
+ Tree::ImportNode.new(val)
791
+ end
792
+ end
793
+
794
+ MIXIN_DEF_RE = /^(?:=|@mixin)\s*(#{Sass::SCSS::RX::IDENT})(.*)$/
795
+ def parse_mixin_definition(line)
796
+ name, arg_string = line.text.scan(MIXIN_DEF_RE).first
797
+ raise SyntaxError.new("Invalid mixin \"#{line.text[1..-1]}\".") if name.nil?
798
+
799
+ offset = line.offset + line.text.size - arg_string.size
800
+ args = Script::Parser.new(arg_string.strip, @line, offset, @options).
801
+ parse_mixin_definition_arglist
802
+ Tree::MixinDefNode.new(name, args)
803
+ end
804
+
805
+ MIXIN_INCLUDE_RE = /^(?:\+|@include)\s*(#{Sass::SCSS::RX::IDENT})(.*)$/
806
+ def parse_mixin_include(line, root)
807
+ name, arg_string = line.text.scan(MIXIN_INCLUDE_RE).first
808
+ raise SyntaxError.new("Invalid mixin include \"#{line.text}\".") if name.nil?
809
+
810
+ offset = line.offset + line.text.size - arg_string.size
811
+ args, keywords = Script::Parser.new(arg_string.strip, @line, offset, @options).
812
+ parse_mixin_include_arglist
813
+ raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath mixin directives.",
814
+ :line => @line + 1) unless line.children.empty?
815
+ Tree::MixinNode.new(name, args, keywords)
816
+ end
817
+
818
+ FUNCTION_RE = /^@function\s*(#{Sass::SCSS::RX::IDENT})(.*)$/
819
+ def parse_function(line, root)
820
+ name, arg_string = line.text.scan(FUNCTION_RE).first
821
+ raise SyntaxError.new("Invalid function definition \"#{line.text}\".") if name.nil?
822
+
823
+ offset = line.offset + line.text.size - arg_string.size
824
+ args = Script::Parser.new(arg_string.strip, @line, offset, @options).
825
+ parse_function_definition_arglist
826
+ Tree::FunctionNode.new(name, args)
827
+ end
828
+
829
+ def parse_script(script, options = {})
830
+ line = options[:line] || @line
831
+ offset = options[:offset] || 0
832
+ Script.parse(script, line, offset, @options)
833
+ end
834
+
835
+ def format_comment_text(text, silent)
836
+ content = text.split("\n")
837
+
838
+ if content.first && content.first.strip.empty?
839
+ removed_first = true
840
+ content.shift
841
+ end
842
+
843
+ return silent ? "//" : "/* */" if content.empty?
844
+ content.last.gsub!(%r{ ?\*/ *$}, '')
845
+ content.map! {|l| l.gsub!(/^\*( ?)/, '\1') || (l.empty? ? "" : " ") + l}
846
+ content.first.gsub!(/^ /, '') unless removed_first
847
+ if silent
848
+ "//" + content.join("\n//")
849
+ else
850
+ # The #gsub fixes the case of a trailing */
851
+ "/*" + content.join("\n *").gsub(/ \*\Z/, '') + " */"
852
+ end
853
+ end
854
+
855
+ def parse_interp(text, offset = 0)
856
+ self.class.parse_interp(text, @line, offset, :filename => @filename)
857
+ end
858
+
859
+ # It's important that this have strings (at least)
860
+ # at the beginning, the end, and between each Script::Node.
861
+ #
862
+ # @private
863
+ def self.parse_interp(text, line, offset, options)
864
+ res = []
865
+ rest = Sass::Shared.handle_interpolation text do |scan|
866
+ escapes = scan[2].size
867
+ res << scan.matched[0...-2 - escapes]
868
+ if escapes % 2 == 1
869
+ res << "\\" * (escapes - 1) << '#{'
870
+ else
871
+ res << "\\" * [0, escapes - 1].max
872
+ res << Script::Parser.new(
873
+ scan, line, offset + scan.pos - scan.matched_size, options).
874
+ parse_interpolated
875
+ end
876
+ end
877
+ res << rest
878
+ end
879
+ end
880
+ end