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.
- data/lib/classiccms/application.rb +2 -3
- data/lib/classiccms/cli.rb +6 -0
- data/lib/classiccms/scaffold/Gemfile +4 -0
- data/lib/classiccms/{mongoid.yml → scaffold/config/mongoid.yml} +3 -4
- data/lib/classiccms/scaffold/spec/models/article_spec.rb +8 -0
- data/lib/classiccms/scaffold/spec/spec_helper.rb +24 -0
- data/lib/classiccms/version.rb +1 -1
- data/spec/cli_spec.rb +8 -0
- data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/build/v8/libv8.a +0 -0
- data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/build/v8/libv8preparser.a +0 -0
- data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/v8/include/v8-debug.h +395 -0
- data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/v8/include/v8-preparser.h +117 -0
- data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/v8/include/v8-profiler.h +505 -0
- data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/v8/include/v8-testing.h +104 -0
- data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/v8/include/v8.h +4124 -0
- data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/v8/include/v8stdint.h +53 -0
- data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8/version.rb +6 -0
- data/vendor/bundle/gems/libv8-3.3.10.4-x86_64-darwin-11/lib/libv8.rb +15 -0
- data/vendor/bundle/gems/sass-3.1.19/.yardopts +11 -0
- data/vendor/bundle/gems/sass-3.1.19/CONTRIBUTING +3 -0
- data/vendor/bundle/gems/sass-3.1.19/MIT-LICENSE +20 -0
- data/vendor/bundle/gems/sass-3.1.19/README.md +200 -0
- data/vendor/bundle/gems/sass-3.1.19/REVISION +1 -0
- data/vendor/bundle/gems/sass-3.1.19/Rakefile +339 -0
- data/vendor/bundle/gems/sass-3.1.19/VERSION +1 -0
- data/vendor/bundle/gems/sass-3.1.19/VERSION_NAME +1 -0
- data/vendor/bundle/gems/sass-3.1.19/bin/sass +8 -0
- data/vendor/bundle/gems/sass-3.1.19/bin/sass-convert +7 -0
- data/vendor/bundle/gems/sass-3.1.19/bin/scss +8 -0
- data/vendor/bundle/gems/sass-3.1.19/extra/update_watch.rb +13 -0
- data/vendor/bundle/gems/sass-3.1.19/init.rb +18 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/cache_stores/base.rb +86 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/cache_stores/chain.rb +33 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/cache_stores/filesystem.rb +61 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/cache_stores/memory.rb +47 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/cache_stores/null.rb +25 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/cache_stores.rb +15 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/callbacks.rb +66 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/css.rb +390 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/engine.rb +880 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/environment.rb +180 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/error.rb +201 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/exec.rb +682 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/importers/base.rb +139 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/importers/filesystem.rb +149 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/importers.rb +22 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/less.rb +382 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/logger/base.rb +32 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/logger/log_level.rb +49 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/logger.rb +15 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin/compiler.rb +384 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin/configuration.rb +123 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin/generic.rb +15 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin/merb.rb +48 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin/rack.rb +60 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin/rails.rb +47 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin/staleness_checker.rb +183 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/plugin.rb +132 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/railtie.rb +9 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/repl.rb +57 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/root.rb +7 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/bool.rb +18 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/color.rb +475 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/css_lexer.rb +29 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/css_parser.rb +31 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/funcall.rb +175 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/functions.rb +1381 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/interpolation.rb +79 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/lexer.rb +337 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/list.rb +84 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/literal.rb +230 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/node.rb +99 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/number.rb +452 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/operation.rb +107 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/parser.rb +474 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/string.rb +51 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/string_interpolation.rb +103 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/unary_operation.rb +64 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script/variable.rb +58 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/script.rb +39 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss/css_parser.rb +46 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss/parser.rb +1055 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss/rx.rb +137 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss/sass_parser.rb +11 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss/script_lexer.rb +15 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss/script_parser.rb +25 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss/static_parser.rb +40 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/scss.rb +17 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/selector/abstract_sequence.rb +71 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/selector/comma_sequence.rb +86 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/selector/sequence.rb +296 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/selector/simple.rb +119 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/selector/simple_sequence.rb +154 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/selector.rb +373 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/shared.rb +76 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/charset_node.rb +22 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/comment_node.rb +90 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/debug_node.rb +18 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/directive_node.rb +28 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/each_node.rb +24 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/extend_node.rb +29 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/for_node.rb +36 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/function_node.rb +27 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/if_node.rb +52 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/import_node.rb +68 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/media_node.rb +32 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/mixin_def_node.rb +27 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/mixin_node.rb +32 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/node.rb +188 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/prop_node.rb +148 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/return_node.rb +18 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/root_node.rb +28 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/rule_node.rb +127 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/variable_node.rb +30 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/base.rb +75 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/check_nesting.rb +127 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/convert.rb +262 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/cssize.rb +206 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/deep_copy.rb +87 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/extend.rb +42 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/perform.rb +357 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/set_options.rb +97 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/visitors/to_css.rb +219 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/warn_node.rb +18 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/tree/while_node.rb +18 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/util/multibyte_string_scanner.rb +134 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/util/subset_map.rb +101 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/util.rb +800 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass/version.rb +112 -0
- data/vendor/bundle/gems/sass-3.1.19/lib/sass.rb +73 -0
- data/vendor/bundle/gems/sass-3.1.19/rails/init.rb +1 -0
- data/vendor/bundle/gems/sass-3.1.19/test/Gemfile +4 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/cache_test.rb +89 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/callbacks_test.rb +61 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/conversion_test.rb +1245 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/css2sass_test.rb +397 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/data/hsl-rgb.txt +319 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/engine_test.rb +2730 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/extend_test.rb +1663 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/functions_test.rb +1047 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/importer_test.rb +192 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/less_conversion_test.rb +653 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/logger_test.rb +58 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/mock_importer.rb +49 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/more_results/more1.css +9 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/more_results/more1_with_line_comments.css +26 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/more_results/more_import.css +29 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/more_templates/_more_partial.sass +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/more_templates/more1.sass +23 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/more_templates/more_import.sass +11 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/plugin_test.rb +496 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/alt.css +4 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/basic.css +9 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/compact.css +5 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/complex.css +86 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/compressed.css +1 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/expanded.css +19 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/if.css +3 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/import.css +31 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/import_charset.css +5 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/import_charset_1_8.css +5 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/import_charset_ibm866.css +5 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/line_numbers.css +49 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/mixins.css +95 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/multiline.css +24 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/nested.css +22 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/options.css +1 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/parent_ref.css +13 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/script.css +16 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/scss_import.css +31 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/scss_importee.css +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/subdir/subdir.css +3 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/units.css +11 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/warn.css +0 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/results/warn_imported.css +0 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/script_conversion_test.rb +285 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/script_test.rb +519 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/scss/css_test.rb +975 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/scss/rx_test.rb +156 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/scss/scss_test.rb +1308 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/scss/test_helper.rb +37 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/_double_import_loop2.sass +1 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/_imported_charset_ibm866.sass +4 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/_imported_charset_utf8.sass +4 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/_partial.sass +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/alt.sass +16 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/basic.sass +23 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/bork1.sass +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/bork2.sass +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/bork3.sass +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/bork4.sass +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/bork5.sass +3 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/compact.sass +17 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/complex.sass +305 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/compressed.sass +15 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/double_import_loop1.sass +1 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/expanded.sass +17 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/if.sass +11 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/import.sass +12 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/import_charset.sass +9 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/import_charset_1_8.sass +6 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/import_charset_ibm866.sass +11 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/importee.less +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/importee.sass +19 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/line_numbers.sass +13 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/mixin_bork.sass +5 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/mixins.sass +76 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/multiline.sass +20 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested.sass +25 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested_bork1.sass +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested_bork2.sass +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested_bork3.sass +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested_bork4.sass +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested_bork5.sass +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested_import.sass +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/nested_mixin_bork.sass +6 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/options.sass +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/parent_ref.sass +25 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/script.sass +101 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/scss_import.scss +11 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/scss_importee.scss +1 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/single_import_loop.sass +1 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/subdir/subdir.sass +6 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/units.sass +11 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/warn.sass +3 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/templates/warn_imported.sass +4 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/test_helper.rb +8 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/util/multibyte_string_scanner_test.rb +147 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/util/subset_map_test.rb +91 -0
- data/vendor/bundle/gems/sass-3.1.19/test/sass/util_test.rb +282 -0
- data/vendor/bundle/gems/sass-3.1.19/test/test_helper.rb +70 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/CHANGELOG.md +90 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/Gemfile +35 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/Guardfile +8 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/LICENSE +20 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/README.md +312 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/Rakefile +47 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/Vagrantfile +96 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/adapter.rb +167 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/adapters/darwin.rb +84 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/adapters/linux.rb +110 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/adapters/polling.rb +66 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/adapters/windows.rb +81 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/directory_record.rb +317 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/listener.rb +203 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/multi_listener.rb +121 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/turnstile.rb +28 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen/version.rb +3 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/lib/listen.rb +38 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/listen.gemspec +26 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/adapter_spec.rb +142 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/adapters/darwin_spec.rb +31 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/adapters/linux_spec.rb +41 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/adapters/windows_spec.rb +24 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/directory_record_spec.rb +1034 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/listener_spec.rb +155 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/multi_listener_spec.rb +156 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/listen_spec.rb +73 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/spec_helper.rb +16 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/support/adapter_helper.rb +716 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/support/directory_record_helper.rb +55 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/support/fixtures_helper.rb +29 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/support/listeners_helper.rb +144 -0
- data/vendor/bundle/gems/sass-3.1.19/vendor/listen/spec/support/platform_helper.rb +11 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/.gitignore +13 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/.gitmodules +3 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/.travis.yml +9 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/.yardopts +1 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/Changelog.md +196 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/Gemfile +1 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/README.md +167 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/Rakefile +23 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/bin/therubyracer +11 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/Makefile +213 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/extconf.rb +26 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/gem_make.out +156 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/rr.cpp +189 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/rr.h +41 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8.cpp +48 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_array.cpp +48 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_array.h +8 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_callbacks.cpp +81 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_callbacks.h +8 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_context.cpp +92 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_context.h +6 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_date.cpp +34 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_date.h +6 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_debug.cpp +17 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_debug.h +6 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_exception.cpp +133 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_exception.h +11 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_external.cpp +70 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_external.h +8 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_function.cpp +69 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_function.h +11 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_handle.cpp +186 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_handle.h +48 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_locker.cpp +139 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_locker.h +6 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_message.cpp +67 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_message.h +10 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_object.cpp +122 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_object.h +10 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_script.cpp +36 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_script.h +8 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_string.cpp +52 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_string.h +9 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_template.cpp +344 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_template.h +8 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_try_catch.cpp +70 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_try_catch.h +5 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_v8.cpp +35 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_v8.h +6 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_value.cpp +175 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_value.h +10 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_weakref.cpp +61 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/ext/v8/v8_weakref.h +29 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/access.rb +87 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/array.rb +17 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/c/locker.rb +18 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/cli.rb +133 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/context.rb +111 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/error.rb +130 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/function.rb +44 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/object.rb +69 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/caller.rb +37 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/constructor.rb +98 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/function.rb +63 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/interceptors.rb +152 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/proxies.rb +151 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/templates.rb +73 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal.rb +86 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/stack.rb +66 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/tap.rb +9 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8/version.rb +3 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/lib/v8.rb +23 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/ext/array_spec.rb +15 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/ext/cxt_spec.rb +57 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/ext/ext_spec_helper.rb +27 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/ext/func_spec.rb +64 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/ext/object_spec.rb +10 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/ext/string_spec.rb +11 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/ext/try_catch_spec.rb +60 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/redjs/.gitignore +1 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/redjs/README.txt +8 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/redjs/jsapi_spec.rb +922 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/redjs/loadme.js +1 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/redjs_helper.rb +3 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/spec_helper.rb +9 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/v8/error_spec.rb +131 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/spec/v8/portal/proxies_spec.rb +106 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/specmem/handle_memspec.rb +41 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/specmem/object_memspec.rb +14 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/specmem/proxies_memspec.rb +49 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/specmem/spec_helper.rb +24 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/specthread/spec_helper.rb +2 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/specthread/threading_spec.rb +13 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/thefrontside.png +0 -0
- data/vendor/bundle/gems/therubyracer-0.10.1/therubyracer.gemspec +29 -0
- data/vendor/bundle/specifications/libv8-3.3.10.4-x86_64-darwin-11.gemspec +33 -0
- data/vendor/bundle/specifications/sass-3.1.19.gemspec +35 -0
- metadata +365 -3
|
@@ -0,0 +1,474 @@
|
|
|
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
|
+
if interp = try_op_before_interp(tok, e)
|
|
186
|
+
return interp unless other_interp = try_ops_after_interp(#{ops.inspect}, #{name.inspect}, interp)
|
|
187
|
+
return other_interp
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
line = @lexer.line
|
|
191
|
+
e = Operation.new(e, assert_expr(#{sub.inspect}), tok.type)
|
|
192
|
+
e.line = line
|
|
193
|
+
end
|
|
194
|
+
e
|
|
195
|
+
end
|
|
196
|
+
RUBY
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def unary(op, sub)
|
|
200
|
+
class_eval <<RUBY
|
|
201
|
+
def unary_#{op}
|
|
202
|
+
return #{sub} unless tok = try_tok(:#{op})
|
|
203
|
+
interp = try_op_before_interp(tok) and return interp
|
|
204
|
+
line = @lexer.line
|
|
205
|
+
op = UnaryOperation.new(assert_expr(:unary_#{op}), :#{op})
|
|
206
|
+
op.line = line
|
|
207
|
+
op
|
|
208
|
+
end
|
|
209
|
+
RUBY
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
private
|
|
214
|
+
|
|
215
|
+
# @private
|
|
216
|
+
def lexer_class; Lexer; end
|
|
217
|
+
|
|
218
|
+
def expr
|
|
219
|
+
interp = try_ops_after_interp([:comma], :expr) and return interp
|
|
220
|
+
line = @lexer.line
|
|
221
|
+
return unless e = interpolation
|
|
222
|
+
arr = [e]
|
|
223
|
+
while tok = try_tok(:comma)
|
|
224
|
+
if interp = try_op_before_interp(tok, e)
|
|
225
|
+
return interp unless other_interp = try_ops_after_interp([:comma], :expr, interp)
|
|
226
|
+
return other_interp
|
|
227
|
+
end
|
|
228
|
+
arr << assert_expr(:interpolation)
|
|
229
|
+
end
|
|
230
|
+
arr.size == 1 ? arr.first : node(List.new(arr, :comma), line)
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
production :equals, :interpolation, :single_eq
|
|
234
|
+
|
|
235
|
+
def try_op_before_interp(op, prev = nil)
|
|
236
|
+
return unless @lexer.peek && @lexer.peek.type == :begin_interpolation
|
|
237
|
+
wb = @lexer.whitespace?(op)
|
|
238
|
+
str = Script::String.new(Lexer::OPERATORS_REVERSE[op.type])
|
|
239
|
+
str.line = @lexer.line
|
|
240
|
+
interp = Script::Interpolation.new(prev, str, nil, wb, !:wa, :originally_text)
|
|
241
|
+
interp.line = @lexer.line
|
|
242
|
+
interpolation(interp)
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def try_ops_after_interp(ops, name, prev = nil)
|
|
246
|
+
return unless @lexer.after_interpolation?
|
|
247
|
+
return unless op = try_tok(*ops)
|
|
248
|
+
interp = try_op_before_interp(op, prev) and return interp
|
|
249
|
+
|
|
250
|
+
wa = @lexer.whitespace?
|
|
251
|
+
str = Script::String.new(Lexer::OPERATORS_REVERSE[op.type])
|
|
252
|
+
str.line = @lexer.line
|
|
253
|
+
interp = Script::Interpolation.new(prev, str, assert_expr(name), !:wb, wa, :originally_text)
|
|
254
|
+
interp.line = @lexer.line
|
|
255
|
+
return interp
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def interpolation(first = space)
|
|
259
|
+
e = first
|
|
260
|
+
while interp = try_tok(:begin_interpolation)
|
|
261
|
+
wb = @lexer.whitespace?(interp)
|
|
262
|
+
line = @lexer.line
|
|
263
|
+
mid = parse_interpolated
|
|
264
|
+
wa = @lexer.whitespace?
|
|
265
|
+
e = Script::Interpolation.new(e, mid, space, wb, wa)
|
|
266
|
+
e.line = line
|
|
267
|
+
end
|
|
268
|
+
e
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def space
|
|
272
|
+
line = @lexer.line
|
|
273
|
+
return unless e = or_expr
|
|
274
|
+
arr = [e]
|
|
275
|
+
while e = or_expr
|
|
276
|
+
arr << e
|
|
277
|
+
end
|
|
278
|
+
arr.size == 1 ? arr.first : node(List.new(arr, :space), line)
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
production :or_expr, :and_expr, :or
|
|
282
|
+
production :and_expr, :eq_or_neq, :and
|
|
283
|
+
production :eq_or_neq, :relational, :eq, :neq
|
|
284
|
+
production :relational, :plus_or_minus, :gt, :gte, :lt, :lte
|
|
285
|
+
production :plus_or_minus, :times_div_or_mod, :plus, :minus
|
|
286
|
+
production :times_div_or_mod, :unary_plus, :times, :div, :mod
|
|
287
|
+
|
|
288
|
+
unary :plus, :unary_minus
|
|
289
|
+
unary :minus, :unary_div
|
|
290
|
+
unary :div, :unary_not # For strings, so /foo/bar works
|
|
291
|
+
unary :not, :ident
|
|
292
|
+
|
|
293
|
+
def ident
|
|
294
|
+
return funcall unless @lexer.peek && @lexer.peek.type == :ident
|
|
295
|
+
return if @stop_at && @stop_at.include?(@lexer.peek.value)
|
|
296
|
+
|
|
297
|
+
name = @lexer.next
|
|
298
|
+
if color = Color::HTML4_COLORS[name.value.downcase]
|
|
299
|
+
return node(Color.new(color))
|
|
300
|
+
end
|
|
301
|
+
node(Script::String.new(name.value, :identifier))
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def funcall
|
|
305
|
+
return raw unless tok = try_tok(:funcall)
|
|
306
|
+
args, keywords = fn_arglist || [[], {}]
|
|
307
|
+
assert_tok(:rparen)
|
|
308
|
+
node(Script::Funcall.new(tok.value, args, keywords))
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def defn_arglist!(must_have_parens)
|
|
312
|
+
if must_have_parens
|
|
313
|
+
assert_tok(:lparen)
|
|
314
|
+
else
|
|
315
|
+
return [] unless try_tok(:lparen)
|
|
316
|
+
end
|
|
317
|
+
return [] if try_tok(:rparen)
|
|
318
|
+
|
|
319
|
+
res = []
|
|
320
|
+
must_have_default = false
|
|
321
|
+
loop do
|
|
322
|
+
line = @lexer.line
|
|
323
|
+
offset = @lexer.offset + 1
|
|
324
|
+
c = assert_tok(:const)
|
|
325
|
+
var = Script::Variable.new(c.value)
|
|
326
|
+
if tok = try_tok(:colon)
|
|
327
|
+
val = assert_expr(:space)
|
|
328
|
+
must_have_default = true
|
|
329
|
+
elsif must_have_default
|
|
330
|
+
raise SyntaxError.new("Required argument #{var.inspect} must come before any optional arguments.")
|
|
331
|
+
end
|
|
332
|
+
res << [var, val]
|
|
333
|
+
break unless try_tok(:comma)
|
|
334
|
+
end
|
|
335
|
+
assert_tok(:rparen)
|
|
336
|
+
res
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def fn_arglist
|
|
340
|
+
arglist(:fn_arglist, :equals)
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
def mixin_arglist
|
|
344
|
+
arglist(:mixin_arglist, :interpolation)
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
def arglist(type, subexpr)
|
|
348
|
+
return unless e = send(subexpr)
|
|
349
|
+
if @lexer.peek && @lexer.peek.type == :colon
|
|
350
|
+
name = e
|
|
351
|
+
@lexer.expected!("comma") unless name.is_a?(Variable)
|
|
352
|
+
assert_tok(:colon)
|
|
353
|
+
keywords = {name.underscored_name => assert_expr(subexpr, EXPR_NAMES[type])}
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
unless try_tok(:comma)
|
|
357
|
+
return [], keywords if keywords
|
|
358
|
+
return [e], {}
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
other_args, other_keywords = assert_expr(type)
|
|
362
|
+
if keywords
|
|
363
|
+
if other_keywords[name.underscored_name]
|
|
364
|
+
raise SyntaxError.new("Keyword argument \"#{name.to_sass}\" passed more than once")
|
|
365
|
+
end
|
|
366
|
+
return other_args, keywords.merge(other_keywords)
|
|
367
|
+
else
|
|
368
|
+
return [e, *other_args], other_keywords
|
|
369
|
+
end
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
def keyword_arglist
|
|
373
|
+
return unless var = try_tok(:const)
|
|
374
|
+
unless try_tok(:colon)
|
|
375
|
+
return_tok!
|
|
376
|
+
return
|
|
377
|
+
end
|
|
378
|
+
name = var[1]
|
|
379
|
+
value = interpolation
|
|
380
|
+
return {name => value} unless try_tok(:comma)
|
|
381
|
+
{name => value}.merge(assert_expr(:keyword_arglist))
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
def raw
|
|
385
|
+
return special_fun unless tok = try_tok(:raw)
|
|
386
|
+
node(Script::String.new(tok.value))
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
def special_fun
|
|
390
|
+
return paren unless tok = try_tok(:special_fun)
|
|
391
|
+
first = node(Script::String.new(tok.value.first))
|
|
392
|
+
Sass::Util.enum_slice(tok.value[1..-1], 2).inject(first) do |l, (i, r)|
|
|
393
|
+
Script::Interpolation.new(
|
|
394
|
+
l, i, r && node(Script::String.new(r)),
|
|
395
|
+
false, false)
|
|
396
|
+
end
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
def paren
|
|
400
|
+
return variable unless try_tok(:lparen)
|
|
401
|
+
was_in_parens = @in_parens
|
|
402
|
+
@in_parens = true
|
|
403
|
+
line = @lexer.line
|
|
404
|
+
e = expr
|
|
405
|
+
assert_tok(:rparen)
|
|
406
|
+
return e || node(List.new([], :space), line)
|
|
407
|
+
ensure
|
|
408
|
+
@in_parens = was_in_parens
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
def variable
|
|
412
|
+
return string unless c = try_tok(:const)
|
|
413
|
+
node(Variable.new(*c.value))
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
def string
|
|
417
|
+
return number unless first = try_tok(:string)
|
|
418
|
+
return first.value unless try_tok(:begin_interpolation)
|
|
419
|
+
line = @lexer.line
|
|
420
|
+
mid = parse_interpolated
|
|
421
|
+
last = assert_expr(:string)
|
|
422
|
+
interp = StringInterpolation.new(first.value, mid, last)
|
|
423
|
+
interp.line = line
|
|
424
|
+
interp
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
def number
|
|
428
|
+
return literal unless tok = try_tok(:number)
|
|
429
|
+
num = tok.value
|
|
430
|
+
num.original = num.to_s unless @in_parens
|
|
431
|
+
num
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
def literal
|
|
435
|
+
(t = try_tok(:color, :bool)) && (return t.value)
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
# It would be possible to have unified #assert and #try methods,
|
|
439
|
+
# but detecting the method/token difference turns out to be quite expensive.
|
|
440
|
+
|
|
441
|
+
EXPR_NAMES = {
|
|
442
|
+
:string => "string",
|
|
443
|
+
:default => "expression (e.g. 1px, bold)",
|
|
444
|
+
:mixin_arglist => "mixin argument",
|
|
445
|
+
:fn_arglist => "function argument",
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
def assert_expr(name, expected = nil)
|
|
449
|
+
(e = send(name)) && (return e)
|
|
450
|
+
@lexer.expected!(expected || EXPR_NAMES[name] || EXPR_NAMES[:default])
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
def assert_tok(*names)
|
|
454
|
+
(t = try_tok(*names)) && (return t)
|
|
455
|
+
@lexer.expected!(names.map {|tok| Lexer::TOKEN_NAMES[tok] || tok}.join(" or "))
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
def try_tok(*names)
|
|
459
|
+
peeked = @lexer.peek
|
|
460
|
+
peeked && names.include?(peeked.type) && @lexer.next
|
|
461
|
+
end
|
|
462
|
+
|
|
463
|
+
def assert_done
|
|
464
|
+
return if @lexer.done?
|
|
465
|
+
@lexer.expected!(EXPR_NAMES[:default])
|
|
466
|
+
end
|
|
467
|
+
|
|
468
|
+
def node(node, line = @lexer.line)
|
|
469
|
+
node.line = line
|
|
470
|
+
node
|
|
471
|
+
end
|
|
472
|
+
end
|
|
473
|
+
end
|
|
474
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require 'sass/script/literal'
|
|
2
|
+
|
|
3
|
+
module Sass::Script
|
|
4
|
+
# A SassScript object representing a CSS string *or* a CSS identifier.
|
|
5
|
+
class String < Literal
|
|
6
|
+
# The Ruby value of the string.
|
|
7
|
+
#
|
|
8
|
+
# @return [String]
|
|
9
|
+
attr_reader :value
|
|
10
|
+
|
|
11
|
+
# Whether this is a CSS string or a CSS identifier.
|
|
12
|
+
# The difference is that strings are written with double-quotes,
|
|
13
|
+
# while identifiers aren't.
|
|
14
|
+
#
|
|
15
|
+
# @return [Symbol] `:string` or `:identifier`
|
|
16
|
+
attr_reader :type
|
|
17
|
+
|
|
18
|
+
# Creates a new string.
|
|
19
|
+
#
|
|
20
|
+
# @param value [String] See \{#value}
|
|
21
|
+
# @param type [Symbol] See \{#type}
|
|
22
|
+
def initialize(value, type = :identifier)
|
|
23
|
+
super(value)
|
|
24
|
+
@type = type
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @see Literal#plus
|
|
28
|
+
def plus(other)
|
|
29
|
+
other_str = other.is_a?(Sass::Script::String) ? other.value : other.to_s
|
|
30
|
+
Sass::Script::String.new(self.value + other_str, self.type)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @see Node#to_s
|
|
34
|
+
def to_s(opts = {})
|
|
35
|
+
if @type == :identifier
|
|
36
|
+
return @value.tr("\n", " ")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
return "\"#{value.gsub('"', "\\\"")}\"" if opts[:quote] == %q{"}
|
|
40
|
+
return "'#{value.gsub("'", "\\'")}'" if opts[:quote] == %q{'}
|
|
41
|
+
return "\"#{value}\"" unless value.include?('"')
|
|
42
|
+
return "'#{value}'" unless value.include?("'")
|
|
43
|
+
"\"#{value.gsub('"', "\\\"")}\"" #'
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @see Node#to_sass
|
|
47
|
+
def to_sass(opts = {})
|
|
48
|
+
to_s
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
module Sass::Script
|
|
2
|
+
# A SassScript object representing `#{}` interpolation within a string.
|
|
3
|
+
#
|
|
4
|
+
# @see Interpolation
|
|
5
|
+
class StringInterpolation < Node
|
|
6
|
+
# Interpolation in a string is of the form `"before #{mid} after"`,
|
|
7
|
+
# where `before` and `after` may include more interpolation.
|
|
8
|
+
#
|
|
9
|
+
# @param before [Node] The string before the interpolation
|
|
10
|
+
# @param mid [Node] The SassScript within the interpolation
|
|
11
|
+
# @param after [Node] The string after the interpolation
|
|
12
|
+
def initialize(before, mid, after)
|
|
13
|
+
@before = before
|
|
14
|
+
@mid = mid
|
|
15
|
+
@after = after
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# @return [String] A human-readable s-expression representation of the interpolation
|
|
19
|
+
def inspect
|
|
20
|
+
"(string_interpolation #{@before.inspect} #{@mid.inspect} #{@after.inspect})"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @see Node#to_sass
|
|
24
|
+
def to_sass(opts = {})
|
|
25
|
+
# We can get rid of all of this when we remove the deprecated :equals context
|
|
26
|
+
# XXX CE: It's gone now but I'm not sure what can be removed now.
|
|
27
|
+
before_unquote, before_quote_char, before_str = parse_str(@before.to_sass(opts))
|
|
28
|
+
after_unquote, after_quote_char, after_str = parse_str(@after.to_sass(opts))
|
|
29
|
+
unquote = before_unquote || after_unquote ||
|
|
30
|
+
(before_quote_char && !after_quote_char && !after_str.empty?) ||
|
|
31
|
+
(!before_quote_char && after_quote_char && !before_str.empty?)
|
|
32
|
+
quote_char =
|
|
33
|
+
if before_quote_char && after_quote_char && before_quote_char != after_quote_char
|
|
34
|
+
before_str.gsub!("\\'", "'")
|
|
35
|
+
before_str.gsub!('"', "\\\"")
|
|
36
|
+
after_str.gsub!("\\'", "'")
|
|
37
|
+
after_str.gsub!('"', "\\\"")
|
|
38
|
+
'"'
|
|
39
|
+
else
|
|
40
|
+
before_quote_char || after_quote_char
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
res = ""
|
|
44
|
+
res << 'unquote(' if unquote
|
|
45
|
+
res << quote_char if quote_char
|
|
46
|
+
res << before_str
|
|
47
|
+
res << '#{' << @mid.to_sass(opts) << '}'
|
|
48
|
+
res << after_str
|
|
49
|
+
res << quote_char if quote_char
|
|
50
|
+
res << ')' if unquote
|
|
51
|
+
res
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Returns the three components of the interpolation, `before`, `mid`, and `after`.
|
|
55
|
+
#
|
|
56
|
+
# @return [Array<Node>]
|
|
57
|
+
# @see #initialize
|
|
58
|
+
# @see Node#children
|
|
59
|
+
def children
|
|
60
|
+
[@before, @mid, @after].compact
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# @see Node#deep_copy
|
|
64
|
+
def deep_copy
|
|
65
|
+
node = dup
|
|
66
|
+
node.instance_variable_set('@before', @before.deep_copy) if @before
|
|
67
|
+
node.instance_variable_set('@mid', @mid.deep_copy)
|
|
68
|
+
node.instance_variable_set('@after', @after.deep_copy) if @after
|
|
69
|
+
node
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
protected
|
|
73
|
+
|
|
74
|
+
# Evaluates the interpolation.
|
|
75
|
+
#
|
|
76
|
+
# @param environment [Sass::Environment] The environment in which to evaluate the SassScript
|
|
77
|
+
# @return [Sass::Script::String] The SassScript string that is the value of the interpolation
|
|
78
|
+
def _perform(environment)
|
|
79
|
+
res = ""
|
|
80
|
+
before = @before.perform(environment)
|
|
81
|
+
res << before.value
|
|
82
|
+
mid = @mid.perform(environment)
|
|
83
|
+
res << (mid.is_a?(Sass::Script::String) ? mid.value : mid.to_s)
|
|
84
|
+
res << @after.perform(environment).value
|
|
85
|
+
opts(Sass::Script::String.new(res, before.type))
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
private
|
|
89
|
+
|
|
90
|
+
def parse_str(str)
|
|
91
|
+
case str
|
|
92
|
+
when /^unquote\((["'])(.*)\1\)$/
|
|
93
|
+
return true, $1, $2
|
|
94
|
+
when '""'
|
|
95
|
+
return false, nil, ""
|
|
96
|
+
when /^(["'])(.*)\1$/
|
|
97
|
+
return false, $1, $2
|
|
98
|
+
else
|
|
99
|
+
return false, nil, str
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
module Sass::Script
|
|
2
|
+
# A SassScript parse node representing a unary operation,
|
|
3
|
+
# such as `-$b` or `not true`.
|
|
4
|
+
#
|
|
5
|
+
# Currently only `-`, `/`, and `not` are unary operators.
|
|
6
|
+
class UnaryOperation < Node
|
|
7
|
+
# @param operand [Script::Node] The parse-tree node
|
|
8
|
+
# for the object of the operator
|
|
9
|
+
# @param operator [Symbol] The operator to perform
|
|
10
|
+
def initialize(operand, operator)
|
|
11
|
+
@operand = operand
|
|
12
|
+
@operator = operator
|
|
13
|
+
super()
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @return [String] A human-readable s-expression representation of the operation
|
|
17
|
+
def inspect
|
|
18
|
+
"(#{@operator.inspect} #{@operand.inspect})"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @see Node#to_sass
|
|
22
|
+
def to_sass(opts = {})
|
|
23
|
+
operand = @operand.to_sass(opts)
|
|
24
|
+
if @operand.is_a?(Operation) ||
|
|
25
|
+
(@operator == :minus &&
|
|
26
|
+
(operand =~ Sass::SCSS::RX::IDENT) == 0)
|
|
27
|
+
operand = "(#{@operand.to_sass(opts)})"
|
|
28
|
+
end
|
|
29
|
+
op = Lexer::OPERATORS_REVERSE[@operator]
|
|
30
|
+
op + (op =~ /[a-z]/ ? " " : "") + operand
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Returns the operand of the operation.
|
|
34
|
+
#
|
|
35
|
+
# @return [Array<Node>]
|
|
36
|
+
# @see Node#children
|
|
37
|
+
def children
|
|
38
|
+
[@operand]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @see Node#deep_copy
|
|
42
|
+
def deep_copy
|
|
43
|
+
node = dup
|
|
44
|
+
node.instance_variable_set('@operand', @operand.deep_copy)
|
|
45
|
+
node
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
protected
|
|
49
|
+
|
|
50
|
+
# Evaluates the operation.
|
|
51
|
+
#
|
|
52
|
+
# @param environment [Sass::Environment] The environment in which to evaluate the SassScript
|
|
53
|
+
# @return [Literal] The SassScript object that is the value of the operation
|
|
54
|
+
# @raise [Sass::SyntaxError] if the operation is undefined for the operand
|
|
55
|
+
def _perform(environment)
|
|
56
|
+
operator = "unary_#{@operator}"
|
|
57
|
+
literal = @operand.perform(environment)
|
|
58
|
+
literal.send(operator)
|
|
59
|
+
rescue NoMethodError => e
|
|
60
|
+
raise e unless e.name.to_s == operator.to_s
|
|
61
|
+
raise Sass::SyntaxError.new("Undefined unary operation: \"#{@operator} #{literal}\".")
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|