compass-sourcemaps 0.12.3.sourcemaps.a4836f1 → 0.12.4.sourcemaps.a4836f1
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.
- checksums.yaml +4 -4
- data/LICENSE.markdown +29 -29
- data/README.markdown +39 -39
- data/Rakefile +157 -157
- data/VERSION.yml +5 -5
- data/bin/compass +45 -45
- data/examples/README.markdown +3 -3
- data/examples/blueprint_default/config.rb +7 -7
- data/examples/blueprint_default/index.html.haml +85 -85
- data/examples/blueprint_default/parts/elements.html.haml +282 -282
- data/examples/blueprint_default/parts/forms.html.haml +200 -200
- data/examples/blueprint_default/parts/grid.html.haml +274 -274
- data/examples/blueprint_default/src/ie.scss +3 -3
- data/examples/blueprint_default/src/print.scss +3 -3
- data/examples/blueprint_default/src/screen.scss +9 -9
- data/examples/blueprint_plugins/config.rb +8 -8
- data/examples/blueprint_plugins/index.html.haml +96 -96
- data/examples/blueprint_plugins/plugins/buttons.html.haml +67 -67
- data/examples/blueprint_plugins/plugins/fancy_type.html.haml +100 -100
- data/examples/blueprint_plugins/plugins/link_icons.html.haml +61 -61
- data/examples/blueprint_plugins/plugins/rtl.html.haml +100 -100
- data/examples/blueprint_plugins/src/buttons.scss +47 -47
- data/examples/blueprint_plugins/src/ie.scss +3 -3
- data/examples/blueprint_plugins/src/link_icons.scss +13 -13
- data/examples/blueprint_plugins/src/print.scss +3 -3
- data/examples/blueprint_plugins/src/rtl_screen.scss +15 -15
- data/examples/blueprint_plugins/src/screen.scss +12 -12
- data/examples/blueprint_scoped/src/ie.scss +4 -4
- data/examples/blueprint_scoped/src/print.scss +4 -4
- data/examples/blueprint_scoped/src/screen.scss +5 -5
- data/examples/blueprint_scoped_form/src/ie.scss +3 -3
- data/examples/blueprint_scoped_form/src/print.scss +3 -3
- data/examples/blueprint_scoped_form/src/screen.scss +15 -15
- data/examples/blueprint_semantic/config.rb +7 -7
- data/examples/blueprint_semantic/index.html.haml +86 -86
- data/examples/blueprint_semantic/parts/fancy_type.html.haml +100 -100
- data/examples/blueprint_semantic/parts/liquid.html.haml +100 -100
- data/examples/blueprint_semantic/src/ie.scss +3 -3
- data/examples/blueprint_semantic/src/liquid.scss +69 -69
- data/examples/blueprint_semantic/src/print.scss +3 -3
- data/examples/blueprint_semantic/src/screen.scss +69 -69
- data/examples/compass/bootstrap.rb +3 -3
- data/examples/compass/clean.rb +1 -1
- data/examples/compass/compass.html.haml +39 -39
- data/examples/compass/config.rb +8 -8
- data/examples/compass/pie.html.haml +73 -73
- data/examples/compass/sprites.html.haml +37 -37
- data/examples/compass/src/bp_layout.scss +18 -18
- data/examples/compass/src/compass.scss +46 -46
- data/examples/compass/src/pie.scss +110 -110
- data/examples/compass/src/sprites.scss +24 -24
- data/examples/compass/src/sticky_footer.scss +11 -11
- data/examples/compass/src/utilities.scss +108 -108
- data/examples/compass/sticky_footer.html.haml +13 -13
- data/examples/compass/utilities.html.haml +189 -189
- data/examples/css3/bootstrap.rb +3 -3
- data/examples/css3/clean.rb +2 -2
- data/examples/css3/config.rb +6 -6
- data/examples/css3/extensions/fancy-fonts/templates/project/fancy-fonts.sass +10 -10
- data/examples/css3/extensions/fancy-fonts/templates/project/manifest.rb +6 -6
- data/examples/css3/gradients.html.haml +68 -68
- data/examples/css3/index.html.haml +57 -57
- data/examples/css3/src/_base.scss +13 -13
- data/examples/css3/src/fancy-fonts.scss +13 -13
- data/examples/css3/src/gradients.scss +85 -85
- data/examples/css3/src/main.scss +108 -108
- data/examples/downloader.rb +58 -58
- data/examples/ninesixty/bootstrap.rb +4 -4
- data/examples/ninesixty/clean.rb +1 -1
- data/examples/ninesixty/config.rb +9 -9
- data/examples/ninesixty/src/grid.scss +15 -15
- data/examples/ninesixty/src/text.scss +8 -8
- data/examples/susy/bootstrap.rb +3 -3
- data/examples/susy/clean.rb +1 -1
- data/examples/susy/config.rb +9 -9
- data/examples/susy/src/_base.scss +61 -61
- data/examples/susy/src/_defaults.scss +140 -140
- data/examples/susy/src/screen.scss +100 -100
- data/examples/yui/bootstrap.rb +2 -2
- data/examples/yui/clean.rb +1 -1
- data/examples/yui/divisions.html.haml +179 -179
- data/examples/yui/index.html.haml +19 -19
- data/examples/yui/src/screen.scss +13 -13
- data/examples/yui/sub_divisions.html.haml +169 -169
- data/examples/yui/templates.html.haml +54 -54
- data/examples/yui/typography.html.haml +132 -132
- data/features/command_line.feature +292 -292
- data/features/extensions.feature +27 -27
- data/features/step_definitions/command_line_steps.rb +268 -268
- data/features/step_definitions/extension_steps.rb +24 -24
- data/frameworks/blueprint/stylesheets/_blueprint.scss +37 -37
- data/frameworks/blueprint/stylesheets/blueprint/_buttons.scss +100 -100
- data/frameworks/blueprint/stylesheets/blueprint/_colors.scss +36 -36
- data/frameworks/blueprint/stylesheets/blueprint/_debug.scss +28 -28
- data/frameworks/blueprint/stylesheets/blueprint/_fancy-type.scss +88 -88
- data/frameworks/blueprint/stylesheets/blueprint/_form.scss +66 -66
- data/frameworks/blueprint/stylesheets/blueprint/_grid.scss +258 -258
- data/frameworks/blueprint/stylesheets/blueprint/_ie.scss +111 -111
- data/frameworks/blueprint/stylesheets/blueprint/_interaction.scss +66 -66
- data/frameworks/blueprint/stylesheets/blueprint/_link-icons.scss +37 -37
- data/frameworks/blueprint/stylesheets/blueprint/_liquid.scss +152 -152
- data/frameworks/blueprint/stylesheets/blueprint/_print.scss +86 -86
- data/frameworks/blueprint/stylesheets/blueprint/_reset.scss +2 -2
- data/frameworks/blueprint/stylesheets/blueprint/_rtl.scss +121 -121
- data/frameworks/blueprint/stylesheets/blueprint/_scaffolding.scss +52 -52
- data/frameworks/blueprint/stylesheets/blueprint/_typography.scss +90 -90
- data/frameworks/blueprint/stylesheets/blueprint/_utilities.scss +37 -37
- data/frameworks/blueprint/stylesheets/blueprint/reset/_utilities.scss +83 -83
- data/frameworks/blueprint/templates/basic/ie.sass +4 -4
- data/frameworks/blueprint/templates/basic/manifest.rb +30 -30
- data/frameworks/blueprint/templates/basic/partials/_base.sass +10 -10
- data/frameworks/blueprint/templates/basic/print.sass +4 -4
- data/frameworks/blueprint/templates/basic/screen.sass +12 -12
- data/frameworks/blueprint/templates/buttons/buttons.sass +49 -49
- data/frameworks/blueprint/templates/buttons/buttons/cross.png +0 -0
- data/frameworks/blueprint/templates/buttons/buttons/key.png +0 -0
- data/frameworks/blueprint/templates/buttons/buttons/tick.png +0 -0
- data/frameworks/blueprint/templates/buttons/manifest.rb +17 -17
- data/frameworks/blueprint/templates/link_icons/link_icons.sass +13 -13
- data/frameworks/blueprint/templates/link_icons/manifest.rb +23 -23
- data/frameworks/blueprint/templates/project/ie.sass +16 -16
- data/frameworks/blueprint/templates/project/manifest.rb +30 -30
- data/frameworks/blueprint/templates/project/partials/_base.sass +11 -11
- data/frameworks/blueprint/templates/project/print.sass +7 -7
- data/frameworks/blueprint/templates/project/screen.sass +46 -46
- data/frameworks/blueprint/templates/semantic/ie.sass +16 -16
- data/frameworks/blueprint/templates/semantic/manifest.rb +33 -33
- data/frameworks/blueprint/templates/semantic/partials/_base.sass +10 -10
- data/frameworks/blueprint/templates/semantic/partials/_form.sass +5 -5
- data/frameworks/blueprint/templates/semantic/partials/_page.sass +17 -17
- data/frameworks/blueprint/templates/semantic/partials/_two_col.sass +38 -38
- data/frameworks/blueprint/templates/semantic/print.sass +4 -4
- data/frameworks/blueprint/templates/semantic/screen.sass +14 -14
- data/frameworks/compass/stylesheets/_compass.scss +3 -3
- data/frameworks/compass/stylesheets/_lemonade.scss +37 -37
- data/frameworks/compass/stylesheets/compass/_css3.scss +20 -20
- data/frameworks/compass/stylesheets/compass/_layout.scss +3 -3
- data/frameworks/compass/stylesheets/compass/_reset-legacy.scss +3 -3
- data/frameworks/compass/stylesheets/compass/_reset.scss +3 -3
- data/frameworks/compass/stylesheets/compass/_support.scss +40 -40
- data/frameworks/compass/stylesheets/compass/_typography.scss +4 -4
- data/frameworks/compass/stylesheets/compass/_utilities.scss +9 -9
- data/frameworks/compass/stylesheets/compass/css3/_appearance.scss +17 -17
- data/frameworks/compass/stylesheets/compass/css3/_background-clip.scss +43 -43
- data/frameworks/compass/stylesheets/compass/css3/_background-origin.scss +42 -42
- data/frameworks/compass/stylesheets/compass/css3/_background-size.scss +26 -26
- data/frameworks/compass/stylesheets/compass/css3/_border-radius.scss +130 -130
- data/frameworks/compass/stylesheets/compass/css3/_box-shadow.scss +76 -76
- data/frameworks/compass/stylesheets/compass/css3/_box-sizing.scss +13 -13
- data/frameworks/compass/stylesheets/compass/css3/_box.scss +111 -111
- data/frameworks/compass/stylesheets/compass/css3/_columns.scss +156 -156
- data/frameworks/compass/stylesheets/compass/css3/_filter.scss +23 -23
- data/frameworks/compass/stylesheets/compass/css3/_font-face.scss +48 -48
- data/frameworks/compass/stylesheets/compass/css3/_hyphenation.scss +77 -77
- data/frameworks/compass/stylesheets/compass/css3/_images.scss +132 -132
- data/frameworks/compass/stylesheets/compass/css3/_inline-block.scss +22 -22
- data/frameworks/compass/stylesheets/compass/css3/_opacity.scss +19 -19
- data/frameworks/compass/stylesheets/compass/css3/_pie.scss +72 -72
- data/frameworks/compass/stylesheets/compass/css3/_regions.scss +21 -21
- data/frameworks/compass/stylesheets/compass/css3/_shared.scss +38 -38
- data/frameworks/compass/stylesheets/compass/css3/_text-shadow.scss +87 -87
- data/frameworks/compass/stylesheets/compass/css3/_transform-legacy.scss +87 -87
- data/frameworks/compass/stylesheets/compass/css3/_transform.scss +598 -598
- data/frameworks/compass/stylesheets/compass/css3/_transition.scss +221 -221
- data/frameworks/compass/stylesheets/compass/css3/_user-interface.scss +17 -17
- data/frameworks/compass/stylesheets/compass/layout/_grid-background.scss +178 -178
- data/frameworks/compass/stylesheets/compass/layout/_sticky-footer.scss +23 -23
- data/frameworks/compass/stylesheets/compass/layout/_stretching.scss +23 -23
- data/frameworks/compass/stylesheets/compass/reset/_utilities-legacy.scss +135 -135
- data/frameworks/compass/stylesheets/compass/reset/_utilities.scss +142 -142
- data/frameworks/compass/stylesheets/compass/typography/_links.scss +3 -3
- data/frameworks/compass/stylesheets/compass/typography/_lists.scss +4 -4
- data/frameworks/compass/stylesheets/compass/typography/_text.scss +4 -4
- data/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss +221 -221
- data/frameworks/compass/stylesheets/compass/typography/links/_hover-link.scss +5 -5
- data/frameworks/compass/stylesheets/compass/typography/links/_link-colors.scss +28 -28
- data/frameworks/compass/stylesheets/compass/typography/links/_unstyled-link.scss +7 -7
- data/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss +34 -34
- data/frameworks/compass/stylesheets/compass/typography/lists/_horizontal-list.scss +61 -61
- data/frameworks/compass/stylesheets/compass/typography/lists/_inline-block-list.scss +50 -50
- data/frameworks/compass/stylesheets/compass/typography/lists/_inline-list.scss +44 -44
- data/frameworks/compass/stylesheets/compass/typography/text/_ellipsis.scss +25 -25
- data/frameworks/compass/stylesheets/compass/typography/text/_force-wrap.scss +12 -12
- data/frameworks/compass/stylesheets/compass/typography/text/_nowrap.scss +2 -2
- data/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss +68 -68
- data/frameworks/compass/stylesheets/compass/utilities/_general.scss +6 -6
- data/frameworks/compass/stylesheets/compass/utilities/_links.scss +5 -5
- data/frameworks/compass/stylesheets/compass/utilities/_lists.scss +6 -6
- data/frameworks/compass/stylesheets/compass/utilities/_print.scss +17 -17
- data/frameworks/compass/stylesheets/compass/utilities/_sprites.scss +2 -2
- data/frameworks/compass/stylesheets/compass/utilities/_tables.scss +3 -3
- data/frameworks/compass/stylesheets/compass/utilities/_text.scss +5 -5
- data/frameworks/compass/stylesheets/compass/utilities/color/_contrast.scss +27 -27
- data/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss +44 -44
- data/frameworks/compass/stylesheets/compass/utilities/general/_float.scss +29 -29
- data/frameworks/compass/stylesheets/compass/utilities/general/_hacks.scss +46 -46
- data/frameworks/compass/stylesheets/compass/utilities/general/_min.scss +16 -16
- data/frameworks/compass/stylesheets/compass/utilities/general/_reset.scss +1 -1
- data/frameworks/compass/stylesheets/compass/utilities/general/_tabs.scss +1 -1
- data/frameworks/compass/stylesheets/compass/utilities/general/_tag-cloud.scss +18 -18
- data/frameworks/compass/stylesheets/compass/utilities/links/_hover-link.scss +3 -3
- data/frameworks/compass/stylesheets/compass/utilities/links/_link-colors.scss +3 -3
- data/frameworks/compass/stylesheets/compass/utilities/links/_unstyled-link.scss +3 -3
- data/frameworks/compass/stylesheets/compass/utilities/lists/_bullets.scss +3 -3
- data/frameworks/compass/stylesheets/compass/utilities/lists/_horizontal-list.scss +3 -3
- data/frameworks/compass/stylesheets/compass/utilities/lists/_inline-block-list.scss +3 -3
- data/frameworks/compass/stylesheets/compass/utilities/lists/_inline-list.scss +3 -3
- data/frameworks/compass/stylesheets/compass/utilities/sprites/_base.scss +65 -65
- data/frameworks/compass/stylesheets/compass/utilities/sprites/_sprite-img.scss +78 -78
- data/frameworks/compass/stylesheets/compass/utilities/tables/_alternating-rows-and-columns.scss +22 -22
- data/frameworks/compass/stylesheets/compass/utilities/tables/_borders.scss +33 -33
- data/frameworks/compass/stylesheets/compass/utilities/tables/_scaffolding.scss +9 -9
- data/frameworks/compass/stylesheets/compass/utilities/text/_ellipsis.scss +3 -3
- data/frameworks/compass/stylesheets/compass/utilities/text/_nowrap.scss +3 -3
- data/frameworks/compass/stylesheets/compass/utilities/text/_replacement.scss +3 -3
- data/frameworks/compass/templates/ellipsis/ellipsis.sass +8 -8
- data/frameworks/compass/templates/ellipsis/manifest.rb +26 -26
- data/frameworks/compass/templates/ellipsis/xml/ellipsis.xml +13 -13
- data/frameworks/compass/templates/extension/manifest.rb +26 -26
- data/frameworks/compass/templates/extension/stylesheets/main.sass +1 -1
- data/frameworks/compass/templates/extension/templates/project/manifest.rb +2 -2
- data/frameworks/compass/templates/extension/templates/project/screen.sass +1 -1
- data/frameworks/compass/templates/pie/LICENSE +12 -12
- data/frameworks/compass/templates/pie/LICENSE-APACHE2.txt +13 -13
- data/frameworks/compass/templates/pie/LICENSE-GPL2.txt +277 -277
- data/frameworks/compass/templates/pie/PIE.htc +96 -96
- data/frameworks/compass/templates/pie/manifest.rb +39 -39
- data/frameworks/compass/templates/pie/pie.scss +73 -73
- data/frameworks/compass/templates/project/USAGE.markdown +32 -32
- data/frameworks/compass/templates/project/ie.sass +6 -6
- data/frameworks/compass/templates/project/manifest.rb +3 -3
- data/frameworks/compass/templates/project/print.sass +6 -6
- data/frameworks/compass/templates/project/screen.sass +7 -7
- data/lib/compass.rb +37 -37
- data/lib/compass/actions.rb +115 -115
- data/lib/compass/app_integration.rb +39 -39
- data/lib/compass/app_integration/rails.rb +18 -18
- data/lib/compass/app_integration/stand_alone.rb +22 -22
- data/lib/compass/app_integration/stand_alone/configuration_defaults.rb +32 -32
- data/lib/compass/app_integration/stand_alone/installer.rb +83 -83
- data/lib/compass/browser_support.rb +62 -62
- data/lib/compass/commands.rb +12 -12
- data/lib/compass/commands/base.rb +44 -44
- data/lib/compass/commands/clean_project.rb +79 -79
- data/lib/compass/commands/create_project.rb +131 -131
- data/lib/compass/commands/default.rb +50 -50
- data/lib/compass/commands/extension_command.rb +60 -60
- data/lib/compass/commands/generate_grid_background.rb +96 -96
- data/lib/compass/commands/help.rb +85 -85
- data/lib/compass/commands/imports.rb +35 -35
- data/lib/compass/commands/installer_command.rb +32 -32
- data/lib/compass/commands/interactive.rb +61 -61
- data/lib/compass/commands/list_frameworks.rb +38 -38
- data/lib/compass/commands/print_version.rb +99 -99
- data/lib/compass/commands/project_base.rb +103 -103
- data/lib/compass/commands/project_stats.rb +178 -178
- data/lib/compass/commands/project_structure.rb +93 -93
- data/lib/compass/commands/registry.rb +40 -40
- data/lib/compass/commands/sprite.rb +89 -89
- data/lib/compass/commands/stamp_pattern.rb +90 -90
- data/lib/compass/commands/unpack_extension.rb +120 -120
- data/lib/compass/commands/update_project.rb +139 -139
- data/lib/compass/commands/validate_project.rb +77 -77
- data/lib/compass/commands/watch_project.rb +170 -170
- data/lib/compass/commands/write_configuration.rb +125 -125
- data/lib/compass/compiler.rb +200 -200
- data/lib/compass/configuration.rb +91 -91
- data/lib/compass/configuration/adapters.rb +77 -77
- data/lib/compass/configuration/comments.rb +59 -59
- data/lib/compass/configuration/data.rb +193 -193
- data/lib/compass/configuration/defaults.rb +187 -187
- data/lib/compass/configuration/file_data.rb +21 -21
- data/lib/compass/configuration/helpers.rb +160 -160
- data/lib/compass/configuration/inheritance.rb +304 -304
- data/lib/compass/configuration/paths.rb +19 -19
- data/lib/compass/configuration/serialization.rb +88 -88
- data/lib/compass/dependencies.rb +12 -12
- data/lib/compass/errors.rb +11 -11
- data/lib/compass/exec.rb +23 -23
- data/lib/compass/exec/command_option_parser.rb +23 -23
- data/lib/compass/exec/global_options_parser.rb +63 -63
- data/lib/compass/exec/helpers.rb +21 -21
- data/lib/compass/exec/project_options_parser.rb +66 -66
- data/lib/compass/exec/sub_command_ui.rb +51 -51
- data/lib/compass/exec/switch_ui.rb +179 -179
- data/lib/compass/frameworks.rb +133 -133
- data/lib/compass/grid_builder.rb +102 -102
- data/lib/compass/installers.rb +3 -3
- data/lib/compass/installers/bare_installer.rb +58 -58
- data/lib/compass/installers/base.rb +187 -187
- data/lib/compass/installers/manifest.rb +161 -161
- data/lib/compass/installers/manifest_installer.rb +61 -61
- data/lib/compass/installers/template_context.rb +43 -43
- data/lib/compass/logger.rb +103 -103
- data/lib/compass/quick_cache.rb +15 -15
- data/lib/compass/rails.rb +2 -2
- data/lib/compass/sass_extensions.rb +10 -10
- data/lib/compass/sass_extensions/functions.rb +34 -34
- data/lib/compass/sass_extensions/functions/colors.rb +67 -67
- data/lib/compass/sass_extensions/functions/constants.rb +74 -74
- data/lib/compass/sass_extensions/functions/cross_browser_support.rb +70 -70
- data/lib/compass/sass_extensions/functions/display.rb +27 -27
- data/lib/compass/sass_extensions/functions/enumerate.rb +6 -6
- data/lib/compass/sass_extensions/functions/env.rb +5 -5
- data/lib/compass/sass_extensions/functions/font_files.rb +41 -41
- data/lib/compass/sass_extensions/functions/gradient_support.rb +540 -540
- data/lib/compass/sass_extensions/functions/image_size.rb +113 -113
- data/lib/compass/sass_extensions/functions/inline_image.rb +64 -64
- data/lib/compass/sass_extensions/functions/lists.rb +101 -101
- data/lib/compass/sass_extensions/functions/math.rb +63 -63
- data/lib/compass/sass_extensions/functions/selectors.rb +63 -63
- data/lib/compass/sass_extensions/functions/sprites.rb +218 -218
- data/lib/compass/sass_extensions/functions/urls.rb +266 -266
- data/lib/compass/sass_extensions/monkey_patches.rb +3 -3
- data/lib/compass/sass_extensions/monkey_patches/browser_support.rb +95 -95
- data/lib/compass/sass_extensions/monkey_patches/traversal.rb +23 -23
- data/lib/compass/sass_extensions/sprites.rb +19 -19
- data/lib/compass/sass_extensions/sprites/engines.rb +25 -25
- data/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb +30 -30
- data/lib/compass/sass_extensions/sprites/image.rb +151 -151
- data/lib/compass/sass_extensions/sprites/image_methods.rb +31 -31
- data/lib/compass/sass_extensions/sprites/image_row.rb +46 -46
- data/lib/compass/sass_extensions/sprites/layout_methods.rb +158 -158
- data/lib/compass/sass_extensions/sprites/row_fitter.rb +91 -91
- data/lib/compass/sass_extensions/sprites/sprite_map.rb +86 -86
- data/lib/compass/sass_extensions/sprites/sprite_methods.rb +141 -141
- data/lib/compass/sprite_importer.rb +116 -116
- data/lib/compass/sprite_importer/binding.rb +10 -10
- data/lib/compass/sprite_importer/content.erb +80 -80
- data/lib/compass/stats.rb +99 -99
- data/lib/compass/test_case.rb +38 -38
- data/lib/compass/util.rb +29 -29
- data/lib/compass/validator.rb +16 -16
- data/lib/compass/version.rb +60 -60
- data/test/fixtures/extensions/only_stylesheets/compass_init.rb +1 -1
- data/test/fixtures/extensions/only_stylesheets/scss/only_stylesheets/foo.scss +3 -3
- data/test/fixtures/fonts/bgrove.base64.txt +1 -1
- data/test/fixtures/fonts/bgrove.ttf +0 -0
- data/test/fixtures/sprites/public/images/ko/starbg26x27.png +0 -0
- data/test/fixtures/stylesheets/blueprint/config.rb +14 -14
- data/test/fixtures/stylesheets/blueprint/css/ie.css +76 -76
- data/test/fixtures/stylesheets/blueprint/css/print.css +56 -56
- data/test/fixtures/stylesheets/blueprint/css/screen.css +815 -815
- data/test/fixtures/stylesheets/blueprint/css/single-imports/buttons.css +56 -56
- data/test/fixtures/stylesheets/blueprint/css/single-imports/colors.css +80 -80
- data/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css +11 -11
- data/test/fixtures/stylesheets/blueprint/css/single-imports/fancy-type.css +30 -30
- data/test/fixtures/stylesheets/blueprint/css/single-imports/form.css +42 -42
- data/test/fixtures/stylesheets/blueprint/css/single-imports/grid.css +435 -435
- data/test/fixtures/stylesheets/blueprint/css/single-imports/ie.css +76 -76
- data/test/fixtures/stylesheets/blueprint/css/single-imports/interaction.css +46 -46
- data/test/fixtures/stylesheets/blueprint/css/single-imports/link-icons.css +40 -40
- data/test/fixtures/stylesheets/blueprint/css/single-imports/liquid.css +651 -651
- data/test/fixtures/stylesheets/blueprint/css/single-imports/print.css +60 -60
- data/test/fixtures/stylesheets/blueprint/css/single-imports/reset-utilities.css +75 -75
- data/test/fixtures/stylesheets/blueprint/css/single-imports/reset.css +42 -42
- data/test/fixtures/stylesheets/blueprint/css/single-imports/rtl.css +437 -437
- data/test/fixtures/stylesheets/blueprint/css/single-imports/scaffolding.css +45 -45
- data/test/fixtures/stylesheets/blueprint/css/single-imports/typography.css +146 -146
- data/test/fixtures/stylesheets/blueprint/css/single-imports/utilities.css +35 -35
- data/test/fixtures/stylesheets/blueprint/sass/ie.sass +3 -3
- data/test/fixtures/stylesheets/blueprint/sass/print.sass +3 -3
- data/test/fixtures/stylesheets/blueprint/sass/screen.sass +18 -18
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/buttons.scss +3 -3
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/colors.scss +34 -34
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/debug.scss +3 -3
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/fancy-type.scss +3 -3
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/form.scss +4 -4
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/grid.scss +2 -2
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/ie.scss +2 -2
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/interaction.scss +3 -3
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/link-icons.scss +12 -12
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/liquid.scss +2 -2
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/print.scss +4 -4
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/reset-utilities.scss +4 -4
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/reset.scss +1 -1
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/rtl.scss +2 -2
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/scaffolding.scss +5 -5
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/typography.scss +3 -3
- data/test/fixtures/stylesheets/blueprint/sass/single-imports/utilities.scss +3 -3
- data/test/fixtures/stylesheets/busted_image_urls/config.rb +29 -29
- data/test/fixtures/stylesheets/busted_image_urls/css/screen.css +9 -9
- data/test/fixtures/stylesheets/busted_image_urls/sass/screen.sass +13 -13
- data/test/fixtures/stylesheets/compass/config.rb +16 -16
- data/test/fixtures/stylesheets/compass/css/background-clip.css +10 -10
- data/test/fixtures/stylesheets/compass/css/border_radius.css +14 -14
- data/test/fixtures/stylesheets/compass/css/box-sizeing.css +9 -9
- data/test/fixtures/stylesheets/compass/css/box.css +103 -103
- data/test/fixtures/stylesheets/compass/css/box_shadow.css +14 -14
- data/test/fixtures/stylesheets/compass/css/columns.css +161 -161
- data/test/fixtures/stylesheets/compass/css/filters.css +29 -29
- data/test/fixtures/stylesheets/compass/css/fonts.css +4 -4
- data/test/fixtures/stylesheets/compass/css/force-wrap.css +9 -9
- data/test/fixtures/stylesheets/compass/css/gradients.css +202 -202
- data/test/fixtures/stylesheets/compass/css/grid_background.css +71 -71
- data/test/fixtures/stylesheets/compass/css/hyphenation.css +16 -16
- data/test/fixtures/stylesheets/compass/css/image_size.css +15 -15
- data/test/fixtures/stylesheets/compass/css/images.css +8 -8
- data/test/fixtures/stylesheets/compass/css/layout.css +16 -16
- data/test/fixtures/stylesheets/compass/css/legacy_clearfix.css +26 -26
- data/test/fixtures/stylesheets/compass/css/lists.css +151 -151
- data/test/fixtures/stylesheets/compass/css/opacity.css +3 -3
- data/test/fixtures/stylesheets/compass/css/pie.css +26 -26
- data/test/fixtures/stylesheets/compass/css/print.css +11 -11
- data/test/fixtures/stylesheets/compass/css/regions.css +7 -7
- data/test/fixtures/stylesheets/compass/css/replacement.css +59 -59
- data/test/fixtures/stylesheets/compass/css/reset.css +59 -59
- data/test/fixtures/stylesheets/compass/css/sprites.css +1262 -1262
- data/test/fixtures/stylesheets/compass/css/stretching.css +66 -66
- data/test/fixtures/stylesheets/compass/css/text_shadow.css +29 -29
- data/test/fixtures/stylesheets/compass/css/transform.css +441 -441
- data/test/fixtures/stylesheets/compass/css/transition.css +128 -128
- data/test/fixtures/stylesheets/compass/css/user-interface.css +4 -4
- data/test/fixtures/stylesheets/compass/css/utilities.css +56 -56
- data/test/fixtures/stylesheets/compass/css/vertical_rhythm.css +45 -45
- data/test/fixtures/stylesheets/compass/sass/background-clip.scss +7 -7
- data/test/fixtures/stylesheets/compass/sass/border_radius.scss +5 -5
- data/test/fixtures/stylesheets/compass/sass/box-sizeing.scss +7 -7
- data/test/fixtures/stylesheets/compass/sass/box.sass +49 -49
- data/test/fixtures/stylesheets/compass/sass/box_shadow.scss +5 -5
- data/test/fixtures/stylesheets/compass/sass/columns.scss +28 -28
- data/test/fixtures/stylesheets/compass/sass/filters.scss +24 -24
- data/test/fixtures/stylesheets/compass/sass/fonts.sass +2 -2
- data/test/fixtures/stylesheets/compass/sass/force-wrap.scss +3 -3
- data/test/fixtures/stylesheets/compass/sass/gradients.sass +96 -96
- data/test/fixtures/stylesheets/compass/sass/grid_background.scss +33 -33
- data/test/fixtures/stylesheets/compass/sass/hyphenation.scss +10 -10
- data/test/fixtures/stylesheets/compass/sass/image_size.sass +15 -15
- data/test/fixtures/stylesheets/compass/sass/images.scss +8 -8
- data/test/fixtures/stylesheets/compass/sass/layout.sass +3 -3
- data/test/fixtures/stylesheets/compass/sass/legacy_clearfix.scss +14 -14
- data/test/fixtures/stylesheets/compass/sass/lists.scss +11 -11
- data/test/fixtures/stylesheets/compass/sass/opacity.scss +5 -5
- data/test/fixtures/stylesheets/compass/sass/pie.scss +47 -47
- data/test/fixtures/stylesheets/compass/sass/print.sass +5 -5
- data/test/fixtures/stylesheets/compass/sass/regions.scss +3 -3
- data/test/fixtures/stylesheets/compass/sass/replacement.scss +22 -22
- data/test/fixtures/stylesheets/compass/sass/reset.sass +12 -12
- data/test/fixtures/stylesheets/compass/sass/sprites.scss +13 -13
- data/test/fixtures/stylesheets/compass/sass/stretching.sass +33 -33
- data/test/fixtures/stylesheets/compass/sass/text_shadow.scss +11 -11
- data/test/fixtures/stylesheets/compass/sass/transform.scss +87 -87
- data/test/fixtures/stylesheets/compass/sass/transition.scss +24 -24
- data/test/fixtures/stylesheets/compass/sass/user-interface.scss +4 -4
- data/test/fixtures/stylesheets/compass/sass/utilities.scss +20 -20
- data/test/fixtures/stylesheets/compass/sass/vertical_rhythm.scss +15 -15
- data/test/fixtures/stylesheets/envtest/config.rb +9 -9
- data/test/fixtures/stylesheets/envtest/css/env.css +2 -2
- data/test/fixtures/stylesheets/envtest/sass/env.scss +3 -3
- data/test/fixtures/stylesheets/error/config.rb +10 -10
- data/test/fixtures/stylesheets/error/sass/screen.sass +2 -2
- data/test/fixtures/stylesheets/image_urls/config.rb +19 -19
- data/test/fixtures/stylesheets/image_urls/css/screen.css +5 -5
- data/test/fixtures/stylesheets/image_urls/sass/screen.sass +8 -8
- data/test/fixtures/stylesheets/relative/config.rb +10 -10
- data/test/fixtures/stylesheets/relative/css/ie.css +1 -1
- data/test/fixtures/stylesheets/relative/css/print.css +1 -1
- data/test/fixtures/stylesheets/relative/css/screen.css +1 -1
- data/test/fixtures/stylesheets/relative/sass/ie.sass +5 -5
- data/test/fixtures/stylesheets/relative/sass/print.sass +3 -3
- data/test/fixtures/stylesheets/relative/sass/screen.sass +2 -2
- data/test/fixtures/stylesheets/uses_only_stylesheets_ext/config.rb +25 -25
- data/test/fixtures/stylesheets/uses_only_stylesheets_ext/sass/ie.scss +5 -5
- data/test/fixtures/stylesheets/uses_only_stylesheets_ext/sass/print.scss +3 -3
- data/test/fixtures/stylesheets/uses_only_stylesheets_ext/sass/screen.scss +6 -6
- data/test/fixtures/stylesheets/uses_only_stylesheets_ext/stylesheets/ie.css +5 -5
- data/test/fixtures/stylesheets/uses_only_stylesheets_ext/stylesheets/print.css +3 -3
- data/test/fixtures/stylesheets/uses_only_stylesheets_ext/stylesheets/screen.css +68 -68
- data/test/fixtures/stylesheets/valid/config.rb +9 -9
- data/test/fixtures/stylesheets/valid/sass/simple.sass +1 -1
- data/test/helpers/command_line.rb +114 -114
- data/test/helpers/diff.rb +48 -48
- data/test/helpers/io.rb +36 -36
- data/test/helpers/rails.rb +55 -55
- data/test/helpers/test_case.rb +62 -62
- data/test/integrations/compass_test.rb +224 -224
- data/test/integrations/sprites_test.rb +843 -843
- data/test/test_helper.rb +73 -73
- data/test/units/actions_test.rb +23 -23
- data/test/units/command_line_test.rb +60 -60
- data/test/units/compass_module_test.rb +36 -36
- data/test/units/compass_png_test.rb +45 -45
- data/test/units/compiler_test.rb +10 -10
- data/test/units/configuration_test.rb +440 -440
- data/test/units/regressions_test.rb +35 -35
- data/test/units/sass_extensions_test.rb +198 -198
- data/test/units/sprites/engine_test.rb +47 -47
- data/test/units/sprites/image_row_test.rb +57 -57
- data/test/units/sprites/image_test.rb +99 -99
- data/test/units/sprites/importer_test.rb +90 -90
- data/test/units/sprites/layout_test.rb +154 -154
- data/test/units/sprites/row_fitter_test.rb +65 -65
- data/test/units/sprites/sprite_command_test.rb +54 -54
- data/test/units/sprites/sprite_map_test.rb +130 -130
- metadata +1304 -1310
@@ -1,540 +1,540 @@
|
|
1
|
-
module Compass::SassExtensions::Functions::GradientSupport
|
2
|
-
|
3
|
-
GRADIENT_ASPECTS = %w(webkit moz svg pie css2 o owg).freeze
|
4
|
-
|
5
|
-
class ColorStop < Sass::Script::Literal
|
6
|
-
attr_accessor :color, :stop
|
7
|
-
def children
|
8
|
-
[color, stop].compact
|
9
|
-
end
|
10
|
-
def initialize(color, stop = nil)
|
11
|
-
unless Sass::Script::Color === color ||
|
12
|
-
Sass::Script::Funcall === color ||
|
13
|
-
(Sass::Script::String === color && color.value == "transparent")
|
14
|
-
raise Sass::SyntaxError, "Expected a color. Got: #{color}"
|
15
|
-
end
|
16
|
-
if stop && !stop.is_a?(Sass::Script::Number)
|
17
|
-
raise Sass::SyntaxError, "Expected a number. Got: #{stop}"
|
18
|
-
end
|
19
|
-
self.color, self.stop = color, stop
|
20
|
-
end
|
21
|
-
def inspect
|
22
|
-
to_s
|
23
|
-
end
|
24
|
-
def self.color_to_s(c)
|
25
|
-
if c.is_a?(Sass::Script::String)
|
26
|
-
c.value.dup
|
27
|
-
else
|
28
|
-
c.inspect.dup
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def to_s(options = self.options)
|
33
|
-
s = self.class.color_to_s(color)
|
34
|
-
if stop
|
35
|
-
s << " "
|
36
|
-
if stop.unitless?
|
37
|
-
s << stop.times(Sass::Script::Number.new(100, ["%"])).inspect
|
38
|
-
else
|
39
|
-
s << stop.inspect
|
40
|
-
end
|
41
|
-
end
|
42
|
-
s
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
module Gradient
|
47
|
-
|
48
|
-
def self.included(base)
|
49
|
-
base.extend ClassMethods
|
50
|
-
end
|
51
|
-
|
52
|
-
module ClassMethods
|
53
|
-
def standardized_prefix(prefix)
|
54
|
-
class_eval %Q{
|
55
|
-
def to_#{prefix}(options = self.options)
|
56
|
-
Sass::Script::String.new("-#{prefix}-\#{to_s(options)}")
|
57
|
-
end
|
58
|
-
}
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def inspect
|
63
|
-
to_s
|
64
|
-
end
|
65
|
-
|
66
|
-
def supports?(aspect)
|
67
|
-
GRADIENT_ASPECTS.include?(aspect)
|
68
|
-
end
|
69
|
-
|
70
|
-
def has_aspect?
|
71
|
-
true
|
72
|
-
end
|
73
|
-
|
74
|
-
def angle?(value)
|
75
|
-
value.is_a?(Sass::Script::Number) &&
|
76
|
-
value.numerator_units.size == 1 &&
|
77
|
-
value.numerator_units.first == "deg" &&
|
78
|
-
value.denominator_units.empty?
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
class RadialGradient < Sass::Script::Literal
|
84
|
-
include Gradient
|
85
|
-
|
86
|
-
attr_accessor :position, :shape_and_size, :color_stops
|
87
|
-
|
88
|
-
def children
|
89
|
-
[color_stops, position, shape_and_size].compact
|
90
|
-
end
|
91
|
-
|
92
|
-
def initialize(position, shape_and_size, color_stops)
|
93
|
-
unless color_stops.value.size >= 2
|
94
|
-
raise Sass::SyntaxError, "At least two color stops are required for a radial-gradient"
|
95
|
-
end
|
96
|
-
if angle?(position)
|
97
|
-
raise Sass::SyntaxError, "CSS no longer allows angles in radial-gradients."
|
98
|
-
end
|
99
|
-
self.position = position
|
100
|
-
self.shape_and_size = shape_and_size
|
101
|
-
self.color_stops = color_stops
|
102
|
-
end
|
103
|
-
|
104
|
-
def to_s(options = self.options)
|
105
|
-
s = "radial-gradient("
|
106
|
-
s << position.to_s(options) << ", " if position
|
107
|
-
s << shape_and_size.to_s(options) << ", " if shape_and_size
|
108
|
-
s << color_stops.to_s(options)
|
109
|
-
s << ")"
|
110
|
-
end
|
111
|
-
|
112
|
-
standardized_prefix :webkit
|
113
|
-
standardized_prefix :moz
|
114
|
-
standardized_prefix :o
|
115
|
-
|
116
|
-
def to_owg(options = self.options)
|
117
|
-
args = [
|
118
|
-
grad_point(position || _center_position),
|
119
|
-
Sass::Script::String.new("0"),
|
120
|
-
grad_point(position || _center_position),
|
121
|
-
grad_end_position(color_stops, Sass::Script::Bool.new(true)),
|
122
|
-
grad_color_stops(color_stops)
|
123
|
-
]
|
124
|
-
args.each {|a| a.options = options}
|
125
|
-
Sass::Script::String.new("-webkit-gradient(radial, #{args.join(', ')})")
|
126
|
-
end
|
127
|
-
|
128
|
-
def to_svg(options = self.options)
|
129
|
-
# XXX Add shape support if possible
|
130
|
-
radial_svg_gradient(color_stops, position || _center_position)
|
131
|
-
end
|
132
|
-
|
133
|
-
def to_pie(options = self.options)
|
134
|
-
Compass::Logger.new.record(:warning, "PIE does not support radial-gradient.")
|
135
|
-
Sass::Script::String.new("-pie-radial-gradient(unsupported)")
|
136
|
-
end
|
137
|
-
|
138
|
-
def to_css2(options = self.options)
|
139
|
-
Sass::Script::String.new("")
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
class LinearGradient < Sass::Script::Literal
|
144
|
-
include Gradient
|
145
|
-
|
146
|
-
attr_accessor :color_stops, :position_or_angle
|
147
|
-
|
148
|
-
def children
|
149
|
-
[color_stops, position_or_angle].compact
|
150
|
-
end
|
151
|
-
|
152
|
-
def initialize(position_or_angle, color_stops)
|
153
|
-
unless color_stops.value.size >= 2
|
154
|
-
raise Sass::SyntaxError, "At least two color stops are required for a linear-gradient"
|
155
|
-
end
|
156
|
-
self.position_or_angle = position_or_angle
|
157
|
-
self.color_stops = color_stops
|
158
|
-
end
|
159
|
-
|
160
|
-
def to_s(options = self.options)
|
161
|
-
s = "linear-gradient("
|
162
|
-
s << position_or_angle.to_s(options) << ", " if position_or_angle
|
163
|
-
s << color_stops.to_s(options)
|
164
|
-
s << ")"
|
165
|
-
end
|
166
|
-
|
167
|
-
standardized_prefix :webkit
|
168
|
-
standardized_prefix :moz
|
169
|
-
standardized_prefix :o
|
170
|
-
|
171
|
-
def supports?(aspect)
|
172
|
-
# I don't know how to support degree-based gradients in old webkit gradients (owg) or svg so we just disable them.
|
173
|
-
if %w(owg svg).include?(aspect) && position_or_angle.is_a?(Sass::Script::Number) && position_or_angle.numerator_units.include?("deg")
|
174
|
-
false
|
175
|
-
else
|
176
|
-
super
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
# Output the original webkit gradient syntax
|
181
|
-
def to_owg(options = self.options)
|
182
|
-
args = []
|
183
|
-
args << grad_point(position_or_angle || Sass::Script::String.new("top"))
|
184
|
-
args << linear_end_position(position_or_angle, color_stops)
|
185
|
-
args << grad_color_stops(color_stops)
|
186
|
-
args.each{|a| a.options = options}
|
187
|
-
Sass::Script::String.new("-webkit-gradient(linear, #{args.join(', ')})")
|
188
|
-
end
|
189
|
-
|
190
|
-
def to_svg(options = self.options)
|
191
|
-
linear_svg_gradient(color_stops, position_or_angle || Sass::Script::String.new("top"))
|
192
|
-
end
|
193
|
-
|
194
|
-
def to_pie(options = self.options)
|
195
|
-
# PIE just uses the standard rep, but the property is prefixed so
|
196
|
-
# the presence of this attribute helps flag when to render a special rule.
|
197
|
-
Sass::Script::String.new to_s(options)
|
198
|
-
end
|
199
|
-
|
200
|
-
def to_css2(options = self.options)
|
201
|
-
Sass::Script::String.new("")
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
module Functions
|
206
|
-
# given a position list, return a corresponding position in percents
|
207
|
-
# otherwise, returns the original argument
|
208
|
-
def grad_point(position)
|
209
|
-
original_value = position
|
210
|
-
position = unless position.is_a?(Sass::Script::List)
|
211
|
-
Sass::Script::List.new([position], :space)
|
212
|
-
else
|
213
|
-
Sass::Script::List.new(position.value.dup, position.separator)
|
214
|
-
end
|
215
|
-
# Handle unknown arguments by passing them along untouched.
|
216
|
-
unless position.value.all?{|p| is_position(p).to_bool }
|
217
|
-
return original_value
|
218
|
-
end
|
219
|
-
if (position.value.first.value =~ /top|bottom/) or (position.value.last.value =~ /left|right/)
|
220
|
-
# browsers are pretty forgiving of reversed positions so we are too.
|
221
|
-
position.value.reverse!
|
222
|
-
end
|
223
|
-
if position.value.size == 1
|
224
|
-
if position.value.first.value =~ /top|bottom/
|
225
|
-
position.value.unshift Sass::Script::String.new("center")
|
226
|
-
elsif position.value.first.value =~ /left|right/
|
227
|
-
position.value.push Sass::Script::String.new("center")
|
228
|
-
end
|
229
|
-
end
|
230
|
-
position.value.map! do |p|
|
231
|
-
case p.value
|
232
|
-
when /top|left/
|
233
|
-
Sass::Script::Number.new(0, ["%"])
|
234
|
-
when /bottom|right/
|
235
|
-
Sass::Script::Number.new(100, ["%"])
|
236
|
-
when /center/
|
237
|
-
Sass::Script::Number.new(50, ["%"])
|
238
|
-
else
|
239
|
-
p
|
240
|
-
end
|
241
|
-
end
|
242
|
-
position
|
243
|
-
end
|
244
|
-
|
245
|
-
def color_stops(*args)
|
246
|
-
Sass::Script::List.new(args.map do |arg|
|
247
|
-
if ColorStop === arg
|
248
|
-
arg
|
249
|
-
elsif Sass::Script::Color === arg
|
250
|
-
ColorStop.new(arg)
|
251
|
-
elsif Sass::Script::List === arg
|
252
|
-
ColorStop.new(*arg.value)
|
253
|
-
elsif Sass::Script::String === arg && arg.value == "transparent"
|
254
|
-
ColorStop.new(arg)
|
255
|
-
else
|
256
|
-
raise Sass::SyntaxError, "Not a valid color stop: #{arg.class.name}: #{arg}"
|
257
|
-
end
|
258
|
-
end, :comma)
|
259
|
-
end
|
260
|
-
|
261
|
-
def radial_gradient(position_or_angle, shape_and_size, *color_stops)
|
262
|
-
# Have to deal with variable length/meaning arguments.
|
263
|
-
if color_stop?(shape_and_size)
|
264
|
-
color_stops.unshift(shape_and_size)
|
265
|
-
shape_and_size = nil
|
266
|
-
elsif list_of_color_stops?(shape_and_size)
|
267
|
-
# Support legacy use of the color-stops() function
|
268
|
-
color_stops = shape_and_size.value + color_stops
|
269
|
-
shape_and_size = nil
|
270
|
-
end
|
271
|
-
shape_and_size = nil if shape_and_size && !shape_and_size.to_bool # nil out explictly passed falses
|
272
|
-
# ditto for position_or_angle
|
273
|
-
if color_stop?(position_or_angle)
|
274
|
-
color_stops.unshift(position_or_angle)
|
275
|
-
position_or_angle = nil
|
276
|
-
elsif list_of_color_stops?(position_or_angle)
|
277
|
-
color_stops = position_or_angle.value + color_stops
|
278
|
-
position_or_angle = nil
|
279
|
-
end
|
280
|
-
position_or_angle = nil if position_or_angle && !position_or_angle.to_bool
|
281
|
-
|
282
|
-
# Support legacy use of the color-stops() function
|
283
|
-
if color_stops.size == 1 && list_of_color_stops?(color_stops.first)
|
284
|
-
color_stops = color_stops.first.value
|
285
|
-
end
|
286
|
-
RadialGradient.new(position_or_angle, shape_and_size, send(:color_stops, *color_stops))
|
287
|
-
end
|
288
|
-
|
289
|
-
def linear_gradient(position_or_angle, *color_stops)
|
290
|
-
if color_stop?(position_or_angle)
|
291
|
-
color_stops.unshift(position_or_angle)
|
292
|
-
position_or_angle = nil
|
293
|
-
elsif list_of_color_stops?(position_or_angle)
|
294
|
-
color_stops = position_or_angle.value + color_stops
|
295
|
-
position_or_angle = nil
|
296
|
-
end
|
297
|
-
position_or_angle = nil if position_or_angle && !position_or_angle.to_bool
|
298
|
-
|
299
|
-
# Support legacy use of the color-stops() function
|
300
|
-
if color_stops.size == 1 && (stops = list_of_color_stops?(color_stops.first))
|
301
|
-
color_stops = stops
|
302
|
-
end
|
303
|
-
LinearGradient.new(position_or_angle, send(:color_stops, *color_stops))
|
304
|
-
end
|
305
|
-
|
306
|
-
# returns color-stop() calls for use in webkit.
|
307
|
-
def grad_color_stops(color_list)
|
308
|
-
stops = color_stops_in_percentages(color_list).map do |stop, color|
|
309
|
-
"color-stop(#{stop.inspect}, #{ColorStop.color_to_s(color)})"
|
310
|
-
end
|
311
|
-
Sass::Script::String.new(stops.join(", "))
|
312
|
-
end
|
313
|
-
|
314
|
-
def color_stops_in_percentages(color_list)
|
315
|
-
assert_type color_list, :List
|
316
|
-
color_list = normalize_stops(color_list)
|
317
|
-
max = color_list.value.last.stop
|
318
|
-
last_value = nil
|
319
|
-
color_stops = color_list.value.map do |pos|
|
320
|
-
# have to convert absolute units to percentages for use in color stop functions.
|
321
|
-
stop = pos.stop
|
322
|
-
stop = stop.div(max).times(Sass::Script::Number.new(100,["%"])) if stop.numerator_units == max.numerator_units && max.numerator_units != ["%"]
|
323
|
-
# Make sure the color stops are specified in the right order.
|
324
|
-
if last_value && stop.numerator_units == last_value.numerator_units && stop.denominator_units == last_value.denominator_units && (stop.value * 1000).round < (last_value.value * 1000).round
|
325
|
-
raise Sass::SyntaxError.new("Color stops must be specified in increasing order. #{stop.value} came after #{last_value.value}.")
|
326
|
-
end
|
327
|
-
last_value = stop
|
328
|
-
[stop, pos.color]
|
329
|
-
end
|
330
|
-
end
|
331
|
-
|
332
|
-
# only used for webkit
|
333
|
-
def linear_end_position(position_or_angle, color_list)
|
334
|
-
start_point = grad_point(position_or_angle || Sass::Script::String.new("top"))
|
335
|
-
end_point = grad_point(opposite_position(position_or_angle || Sass::Script::String.new("top")))
|
336
|
-
end_target = color_list.value.last.stop
|
337
|
-
|
338
|
-
if color_list.value.last.stop && color_list.value.last.stop.numerator_units == ["px"]
|
339
|
-
new_end = color_list.value.last.stop.value
|
340
|
-
if start_point.value.first == end_point.value.first && start_point.value.last.value == 0
|
341
|
-
# this means top-to-bottom
|
342
|
-
end_point.value[1] = Sass::Script::Number.new(end_target.value)
|
343
|
-
elsif start_point.value.last == end_point.value.last && start_point.value.first.value == 0
|
344
|
-
# this implies left-to-right
|
345
|
-
end_point.value[0] = Sass::Script::Number.new(end_target.value)
|
346
|
-
end
|
347
|
-
end
|
348
|
-
end_point
|
349
|
-
end
|
350
|
-
|
351
|
-
# returns the end position of the gradient from the color stop
|
352
|
-
def grad_end_position(color_list, radial = Sass::Script::Bool.new(false))
|
353
|
-
assert_type color_list, :List
|
354
|
-
default = Sass::Script::Number.new(100)
|
355
|
-
grad_position(color_list, Sass::Script::Number.new(color_list.value.size), default, radial)
|
356
|
-
end
|
357
|
-
|
358
|
-
def grad_position(color_list, index, default, radial = Sass::Script::Bool.new(false))
|
359
|
-
assert_type color_list, :List
|
360
|
-
stop = color_list.value[index.value - 1].stop
|
361
|
-
if stop && radial.to_bool
|
362
|
-
orig_stop = stop
|
363
|
-
if stop.unitless?
|
364
|
-
if stop.value <= 1
|
365
|
-
# A unitless number is assumed to be a percentage when it's between 0 and 1
|
366
|
-
stop = stop.times(Sass::Script::Number.new(100, ["%"]))
|
367
|
-
else
|
368
|
-
# Otherwise, a unitless number is assumed to be in pixels
|
369
|
-
stop = stop.times(Sass::Script::Number.new(1, ["px"]))
|
370
|
-
end
|
371
|
-
end
|
372
|
-
if stop.numerator_units == ["%"] && color_list.value.last.stop && color_list.value.last.stop.numerator_units == ["px"]
|
373
|
-
stop = stop.times(color_list.value.last.stop).div(Sass::Script::Number.new(100, ["%"]))
|
374
|
-
end
|
375
|
-
Compass::Logger.new.record(:warning, "Webkit only supports pixels for the start and end stops for radial gradients. Got: #{orig_stop}") if stop.numerator_units != ["px"]
|
376
|
-
stop.div(Sass::Script::Number.new(1, stop.numerator_units, stop.denominator_units))
|
377
|
-
elsif stop
|
378
|
-
stop
|
379
|
-
else
|
380
|
-
default
|
381
|
-
end
|
382
|
-
end
|
383
|
-
|
384
|
-
def linear_svg_gradient(color_stops, start)
|
385
|
-
x1, y1 = *grad_point(start).value
|
386
|
-
x2, y2 = *grad_point(opposite_position(start)).value
|
387
|
-
stops = color_stops_in_percentages(color_stops)
|
388
|
-
|
389
|
-
svg = linear_svg(stops, x1, y1, x2, y2)
|
390
|
-
inline_image_string(svg.gsub(/\s+/, ' '), 'image/svg+xml')
|
391
|
-
end
|
392
|
-
|
393
|
-
def radial_svg_gradient(color_stops, center)
|
394
|
-
cx, cy = *grad_point(center).value
|
395
|
-
r = grad_end_position(color_stops, Sass::Script::Bool.new(true))
|
396
|
-
stops = color_stops_in_percentages(color_stops)
|
397
|
-
|
398
|
-
svg = radial_svg(stops, cx, cy, r)
|
399
|
-
inline_image_string(svg.gsub(/\s+/, ' '), 'image/svg+xml')
|
400
|
-
end
|
401
|
-
|
402
|
-
private
|
403
|
-
|
404
|
-
def color_stop?(arg)
|
405
|
-
arg.is_a?(ColorStop) ||
|
406
|
-
(arg.is_a?(Sass::Script::List) && ColorStop.new(*arg.value)) ||
|
407
|
-
ColorStop.new(arg)
|
408
|
-
rescue
|
409
|
-
nil
|
410
|
-
end
|
411
|
-
|
412
|
-
def normalize_stops(color_list)
|
413
|
-
positions = color_list.value.map{|obj| obj.dup}
|
414
|
-
# fill in the start and end positions, if unspecified
|
415
|
-
positions.first.stop = Sass::Script::Number.new(0) unless positions.first.stop
|
416
|
-
positions.last.stop = Sass::Script::Number.new(100, ["%"]) unless positions.last.stop
|
417
|
-
# fill in empty values
|
418
|
-
for i in 0...positions.size
|
419
|
-
if positions[i].stop.nil?
|
420
|
-
num = 2.0
|
421
|
-
for j in (i+1)...positions.size
|
422
|
-
if positions[j].stop
|
423
|
-
positions[i].stop = positions[i-1].stop.plus((positions[j].stop.minus(positions[i-1].stop)).div(Sass::Script::Number.new(num)))
|
424
|
-
break
|
425
|
-
else
|
426
|
-
num += 1
|
427
|
-
end
|
428
|
-
end
|
429
|
-
end
|
430
|
-
end
|
431
|
-
# normalize unitless numbers
|
432
|
-
positions.each do |pos|
|
433
|
-
if pos.stop.unitless? && pos.stop.value <= 1
|
434
|
-
pos.stop = pos.stop.times(Sass::Script::Number.new(100, ["%"]))
|
435
|
-
elsif pos.stop.unitless?
|
436
|
-
pos.stop = pos.stop.times(Sass::Script::Number.new(1, ["px"]))
|
437
|
-
end
|
438
|
-
end
|
439
|
-
if (positions.last.stop.eq(Sass::Script::Number.new(0, ["px"])).to_bool ||
|
440
|
-
positions.last.stop.eq(Sass::Script::Number.new(0, ["%"])).to_bool)
|
441
|
-
raise Sass::SyntaxError.new("Color stops must be specified in increasing order")
|
442
|
-
end
|
443
|
-
if defined?(Sass::Script::List)
|
444
|
-
Sass::Script::List.new(positions, color_list.separator)
|
445
|
-
else
|
446
|
-
color_list.class.new(*positions)
|
447
|
-
end
|
448
|
-
end
|
449
|
-
|
450
|
-
def parse_color_stop(arg)
|
451
|
-
return ColorStop.new(arg) if arg.is_a?(Sass::Script::Color)
|
452
|
-
return nil unless arg.is_a?(Sass::Script::String)
|
453
|
-
color = stop = nil
|
454
|
-
expr = Sass::Script::Parser.parse(arg.value, 0, 0)
|
455
|
-
case expr
|
456
|
-
when Sass::Script::Color
|
457
|
-
color = expr
|
458
|
-
when Sass::Script::Funcall
|
459
|
-
color = expr
|
460
|
-
when Sass::Script::Operation
|
461
|
-
unless [:concat, :space].include?(expr.instance_variable_get("@operator"))
|
462
|
-
# This should never happen.
|
463
|
-
raise Sass::SyntaxError, "Couldn't parse a color stop from: #{arg.value}"
|
464
|
-
end
|
465
|
-
color = expr.instance_variable_get("@operand1")
|
466
|
-
stop = expr.instance_variable_get("@operand2")
|
467
|
-
else
|
468
|
-
raise Sass::SyntaxError, "Couldn't parse a color stop from: #{arg.value}"
|
469
|
-
end
|
470
|
-
ColorStop.new(color, stop)
|
471
|
-
end
|
472
|
-
|
473
|
-
def list_of_color_stops?(arg)
|
474
|
-
if arg.respond_to?(:value)
|
475
|
-
arg.value.is_a?(Array) && arg.value.all?{|a| color_stop?(a)} ? arg.value : nil
|
476
|
-
elsif arg.is_a?(Array)
|
477
|
-
arg.all?{|a| color_stop?(a)} ? arg : nil
|
478
|
-
end
|
479
|
-
end
|
480
|
-
|
481
|
-
def linear_svg(color_stops, x1, y1, x2, y2)
|
482
|
-
transform = ''
|
483
|
-
if angle?(position_or_angle)
|
484
|
-
transform = %Q{ gradientTransform = "rotate(#{position_or_angle.value})"}
|
485
|
-
end
|
486
|
-
gradient = %Q{<linearGradient id="grad" gradientUnits="userSpaceOnUse" x1="#{x1}" y1="#{y1}" x2="#{x2}" y2="#{y2}"#{transform}>#{color_stops_svg(color_stops)}</linearGradient>}
|
487
|
-
svg(gradient)
|
488
|
-
end
|
489
|
-
|
490
|
-
def radial_svg(color_stops, cx, cy, r)
|
491
|
-
gradient = %Q{<radialGradient id="grad" gradientUnits="userSpaceOnUse" cx="#{cx}" cy="#{cy}" r="#{r}">#{color_stops_svg(color_stops)}</radialGradient>}
|
492
|
-
svg(gradient)
|
493
|
-
end
|
494
|
-
|
495
|
-
# color_stops = array of: [stop, color]
|
496
|
-
def color_stops_svg(color_stops)
|
497
|
-
color_stops.each.map{ |stop, color|
|
498
|
-
%{<stop offset="#{stop.to_s}" stop-color="#{color.inspect}"/>}
|
499
|
-
}.join
|
500
|
-
end
|
501
|
-
|
502
|
-
def svg(gradient)
|
503
|
-
svg = <<-EOS
|
504
|
-
<?xml version="1.0" encoding="utf-8"?>
|
505
|
-
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"><defs>#{gradient}</defs><rect x="0" y="0" width="100%" height="100%" fill="url(#grad)" /></svg>
|
506
|
-
EOS
|
507
|
-
end
|
508
|
-
|
509
|
-
def _center_position
|
510
|
-
Sass::Script::List.new([
|
511
|
-
Sass::Script::String.new("center"),
|
512
|
-
Sass::Script::String.new("center")
|
513
|
-
],:space)
|
514
|
-
end
|
515
|
-
|
516
|
-
end
|
517
|
-
|
518
|
-
module Assertions
|
519
|
-
def assert_type(value, type, name = nil)
|
520
|
-
return if value.is_a?(Sass::Script.const_get(type))
|
521
|
-
err = "#{value.inspect} is not a #{type.to_s.downcase}"
|
522
|
-
err = "$#{name}: " + err if name
|
523
|
-
raise ArgumentError.new(err)
|
524
|
-
end
|
525
|
-
end
|
526
|
-
|
527
|
-
class LinearGradient < Sass::Script::Literal
|
528
|
-
include Assertions
|
529
|
-
include Functions
|
530
|
-
include Compass::SassExtensions::Functions::Constants
|
531
|
-
include Compass::SassExtensions::Functions::InlineImage
|
532
|
-
end
|
533
|
-
|
534
|
-
class RadialGradient < Sass::Script::Literal
|
535
|
-
include Assertions
|
536
|
-
include Functions
|
537
|
-
include Compass::SassExtensions::Functions::Constants
|
538
|
-
include Compass::SassExtensions::Functions::InlineImage
|
539
|
-
end
|
540
|
-
end
|
1
|
+
module Compass::SassExtensions::Functions::GradientSupport
|
2
|
+
|
3
|
+
GRADIENT_ASPECTS = %w(webkit moz svg pie css2 o owg).freeze
|
4
|
+
|
5
|
+
class ColorStop < Sass::Script::Literal
|
6
|
+
attr_accessor :color, :stop
|
7
|
+
def children
|
8
|
+
[color, stop].compact
|
9
|
+
end
|
10
|
+
def initialize(color, stop = nil)
|
11
|
+
unless Sass::Script::Color === color ||
|
12
|
+
Sass::Script::Funcall === color ||
|
13
|
+
(Sass::Script::String === color && color.value == "transparent")
|
14
|
+
raise Sass::SyntaxError, "Expected a color. Got: #{color}"
|
15
|
+
end
|
16
|
+
if stop && !stop.is_a?(Sass::Script::Number)
|
17
|
+
raise Sass::SyntaxError, "Expected a number. Got: #{stop}"
|
18
|
+
end
|
19
|
+
self.color, self.stop = color, stop
|
20
|
+
end
|
21
|
+
def inspect
|
22
|
+
to_s
|
23
|
+
end
|
24
|
+
def self.color_to_s(c)
|
25
|
+
if c.is_a?(Sass::Script::String)
|
26
|
+
c.value.dup
|
27
|
+
else
|
28
|
+
c.inspect.dup
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_s(options = self.options)
|
33
|
+
s = self.class.color_to_s(color)
|
34
|
+
if stop
|
35
|
+
s << " "
|
36
|
+
if stop.unitless?
|
37
|
+
s << stop.times(Sass::Script::Number.new(100, ["%"])).inspect
|
38
|
+
else
|
39
|
+
s << stop.inspect
|
40
|
+
end
|
41
|
+
end
|
42
|
+
s
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
module Gradient
|
47
|
+
|
48
|
+
def self.included(base)
|
49
|
+
base.extend ClassMethods
|
50
|
+
end
|
51
|
+
|
52
|
+
module ClassMethods
|
53
|
+
def standardized_prefix(prefix)
|
54
|
+
class_eval %Q{
|
55
|
+
def to_#{prefix}(options = self.options)
|
56
|
+
Sass::Script::String.new("-#{prefix}-\#{to_s(options)}")
|
57
|
+
end
|
58
|
+
}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def inspect
|
63
|
+
to_s
|
64
|
+
end
|
65
|
+
|
66
|
+
def supports?(aspect)
|
67
|
+
GRADIENT_ASPECTS.include?(aspect)
|
68
|
+
end
|
69
|
+
|
70
|
+
def has_aspect?
|
71
|
+
true
|
72
|
+
end
|
73
|
+
|
74
|
+
def angle?(value)
|
75
|
+
value.is_a?(Sass::Script::Number) &&
|
76
|
+
value.numerator_units.size == 1 &&
|
77
|
+
value.numerator_units.first == "deg" &&
|
78
|
+
value.denominator_units.empty?
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
class RadialGradient < Sass::Script::Literal
|
84
|
+
include Gradient
|
85
|
+
|
86
|
+
attr_accessor :position, :shape_and_size, :color_stops
|
87
|
+
|
88
|
+
def children
|
89
|
+
[color_stops, position, shape_and_size].compact
|
90
|
+
end
|
91
|
+
|
92
|
+
def initialize(position, shape_and_size, color_stops)
|
93
|
+
unless color_stops.value.size >= 2
|
94
|
+
raise Sass::SyntaxError, "At least two color stops are required for a radial-gradient"
|
95
|
+
end
|
96
|
+
if angle?(position)
|
97
|
+
raise Sass::SyntaxError, "CSS no longer allows angles in radial-gradients."
|
98
|
+
end
|
99
|
+
self.position = position
|
100
|
+
self.shape_and_size = shape_and_size
|
101
|
+
self.color_stops = color_stops
|
102
|
+
end
|
103
|
+
|
104
|
+
def to_s(options = self.options)
|
105
|
+
s = "radial-gradient("
|
106
|
+
s << position.to_s(options) << ", " if position
|
107
|
+
s << shape_and_size.to_s(options) << ", " if shape_and_size
|
108
|
+
s << color_stops.to_s(options)
|
109
|
+
s << ")"
|
110
|
+
end
|
111
|
+
|
112
|
+
standardized_prefix :webkit
|
113
|
+
standardized_prefix :moz
|
114
|
+
standardized_prefix :o
|
115
|
+
|
116
|
+
def to_owg(options = self.options)
|
117
|
+
args = [
|
118
|
+
grad_point(position || _center_position),
|
119
|
+
Sass::Script::String.new("0"),
|
120
|
+
grad_point(position || _center_position),
|
121
|
+
grad_end_position(color_stops, Sass::Script::Bool.new(true)),
|
122
|
+
grad_color_stops(color_stops)
|
123
|
+
]
|
124
|
+
args.each {|a| a.options = options}
|
125
|
+
Sass::Script::String.new("-webkit-gradient(radial, #{args.join(', ')})")
|
126
|
+
end
|
127
|
+
|
128
|
+
def to_svg(options = self.options)
|
129
|
+
# XXX Add shape support if possible
|
130
|
+
radial_svg_gradient(color_stops, position || _center_position)
|
131
|
+
end
|
132
|
+
|
133
|
+
def to_pie(options = self.options)
|
134
|
+
Compass::Logger.new.record(:warning, "PIE does not support radial-gradient.")
|
135
|
+
Sass::Script::String.new("-pie-radial-gradient(unsupported)")
|
136
|
+
end
|
137
|
+
|
138
|
+
def to_css2(options = self.options)
|
139
|
+
Sass::Script::String.new("")
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
class LinearGradient < Sass::Script::Literal
|
144
|
+
include Gradient
|
145
|
+
|
146
|
+
attr_accessor :color_stops, :position_or_angle
|
147
|
+
|
148
|
+
def children
|
149
|
+
[color_stops, position_or_angle].compact
|
150
|
+
end
|
151
|
+
|
152
|
+
def initialize(position_or_angle, color_stops)
|
153
|
+
unless color_stops.value.size >= 2
|
154
|
+
raise Sass::SyntaxError, "At least two color stops are required for a linear-gradient"
|
155
|
+
end
|
156
|
+
self.position_or_angle = position_or_angle
|
157
|
+
self.color_stops = color_stops
|
158
|
+
end
|
159
|
+
|
160
|
+
def to_s(options = self.options)
|
161
|
+
s = "linear-gradient("
|
162
|
+
s << position_or_angle.to_s(options) << ", " if position_or_angle
|
163
|
+
s << color_stops.to_s(options)
|
164
|
+
s << ")"
|
165
|
+
end
|
166
|
+
|
167
|
+
standardized_prefix :webkit
|
168
|
+
standardized_prefix :moz
|
169
|
+
standardized_prefix :o
|
170
|
+
|
171
|
+
def supports?(aspect)
|
172
|
+
# I don't know how to support degree-based gradients in old webkit gradients (owg) or svg so we just disable them.
|
173
|
+
if %w(owg svg).include?(aspect) && position_or_angle.is_a?(Sass::Script::Number) && position_or_angle.numerator_units.include?("deg")
|
174
|
+
false
|
175
|
+
else
|
176
|
+
super
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# Output the original webkit gradient syntax
|
181
|
+
def to_owg(options = self.options)
|
182
|
+
args = []
|
183
|
+
args << grad_point(position_or_angle || Sass::Script::String.new("top"))
|
184
|
+
args << linear_end_position(position_or_angle, color_stops)
|
185
|
+
args << grad_color_stops(color_stops)
|
186
|
+
args.each{|a| a.options = options}
|
187
|
+
Sass::Script::String.new("-webkit-gradient(linear, #{args.join(', ')})")
|
188
|
+
end
|
189
|
+
|
190
|
+
def to_svg(options = self.options)
|
191
|
+
linear_svg_gradient(color_stops, position_or_angle || Sass::Script::String.new("top"))
|
192
|
+
end
|
193
|
+
|
194
|
+
def to_pie(options = self.options)
|
195
|
+
# PIE just uses the standard rep, but the property is prefixed so
|
196
|
+
# the presence of this attribute helps flag when to render a special rule.
|
197
|
+
Sass::Script::String.new to_s(options)
|
198
|
+
end
|
199
|
+
|
200
|
+
def to_css2(options = self.options)
|
201
|
+
Sass::Script::String.new("")
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
module Functions
|
206
|
+
# given a position list, return a corresponding position in percents
|
207
|
+
# otherwise, returns the original argument
|
208
|
+
def grad_point(position)
|
209
|
+
original_value = position
|
210
|
+
position = unless position.is_a?(Sass::Script::List)
|
211
|
+
Sass::Script::List.new([position], :space)
|
212
|
+
else
|
213
|
+
Sass::Script::List.new(position.value.dup, position.separator)
|
214
|
+
end
|
215
|
+
# Handle unknown arguments by passing them along untouched.
|
216
|
+
unless position.value.all?{|p| is_position(p).to_bool }
|
217
|
+
return original_value
|
218
|
+
end
|
219
|
+
if (position.value.first.value =~ /top|bottom/) or (position.value.last.value =~ /left|right/)
|
220
|
+
# browsers are pretty forgiving of reversed positions so we are too.
|
221
|
+
position.value.reverse!
|
222
|
+
end
|
223
|
+
if position.value.size == 1
|
224
|
+
if position.value.first.value =~ /top|bottom/
|
225
|
+
position.value.unshift Sass::Script::String.new("center")
|
226
|
+
elsif position.value.first.value =~ /left|right/
|
227
|
+
position.value.push Sass::Script::String.new("center")
|
228
|
+
end
|
229
|
+
end
|
230
|
+
position.value.map! do |p|
|
231
|
+
case p.value
|
232
|
+
when /top|left/
|
233
|
+
Sass::Script::Number.new(0, ["%"])
|
234
|
+
when /bottom|right/
|
235
|
+
Sass::Script::Number.new(100, ["%"])
|
236
|
+
when /center/
|
237
|
+
Sass::Script::Number.new(50, ["%"])
|
238
|
+
else
|
239
|
+
p
|
240
|
+
end
|
241
|
+
end
|
242
|
+
position
|
243
|
+
end
|
244
|
+
|
245
|
+
def color_stops(*args)
|
246
|
+
Sass::Script::List.new(args.map do |arg|
|
247
|
+
if ColorStop === arg
|
248
|
+
arg
|
249
|
+
elsif Sass::Script::Color === arg
|
250
|
+
ColorStop.new(arg)
|
251
|
+
elsif Sass::Script::List === arg
|
252
|
+
ColorStop.new(*arg.value)
|
253
|
+
elsif Sass::Script::String === arg && arg.value == "transparent"
|
254
|
+
ColorStop.new(arg)
|
255
|
+
else
|
256
|
+
raise Sass::SyntaxError, "Not a valid color stop: #{arg.class.name}: #{arg}"
|
257
|
+
end
|
258
|
+
end, :comma)
|
259
|
+
end
|
260
|
+
|
261
|
+
def radial_gradient(position_or_angle, shape_and_size, *color_stops)
|
262
|
+
# Have to deal with variable length/meaning arguments.
|
263
|
+
if color_stop?(shape_and_size)
|
264
|
+
color_stops.unshift(shape_and_size)
|
265
|
+
shape_and_size = nil
|
266
|
+
elsif list_of_color_stops?(shape_and_size)
|
267
|
+
# Support legacy use of the color-stops() function
|
268
|
+
color_stops = shape_and_size.value + color_stops
|
269
|
+
shape_and_size = nil
|
270
|
+
end
|
271
|
+
shape_and_size = nil if shape_and_size && !shape_and_size.to_bool # nil out explictly passed falses
|
272
|
+
# ditto for position_or_angle
|
273
|
+
if color_stop?(position_or_angle)
|
274
|
+
color_stops.unshift(position_or_angle)
|
275
|
+
position_or_angle = nil
|
276
|
+
elsif list_of_color_stops?(position_or_angle)
|
277
|
+
color_stops = position_or_angle.value + color_stops
|
278
|
+
position_or_angle = nil
|
279
|
+
end
|
280
|
+
position_or_angle = nil if position_or_angle && !position_or_angle.to_bool
|
281
|
+
|
282
|
+
# Support legacy use of the color-stops() function
|
283
|
+
if color_stops.size == 1 && list_of_color_stops?(color_stops.first)
|
284
|
+
color_stops = color_stops.first.value
|
285
|
+
end
|
286
|
+
RadialGradient.new(position_or_angle, shape_and_size, send(:color_stops, *color_stops))
|
287
|
+
end
|
288
|
+
|
289
|
+
def linear_gradient(position_or_angle, *color_stops)
|
290
|
+
if color_stop?(position_or_angle)
|
291
|
+
color_stops.unshift(position_or_angle)
|
292
|
+
position_or_angle = nil
|
293
|
+
elsif list_of_color_stops?(position_or_angle)
|
294
|
+
color_stops = position_or_angle.value + color_stops
|
295
|
+
position_or_angle = nil
|
296
|
+
end
|
297
|
+
position_or_angle = nil if position_or_angle && !position_or_angle.to_bool
|
298
|
+
|
299
|
+
# Support legacy use of the color-stops() function
|
300
|
+
if color_stops.size == 1 && (stops = list_of_color_stops?(color_stops.first))
|
301
|
+
color_stops = stops
|
302
|
+
end
|
303
|
+
LinearGradient.new(position_or_angle, send(:color_stops, *color_stops))
|
304
|
+
end
|
305
|
+
|
306
|
+
# returns color-stop() calls for use in webkit.
|
307
|
+
def grad_color_stops(color_list)
|
308
|
+
stops = color_stops_in_percentages(color_list).map do |stop, color|
|
309
|
+
"color-stop(#{stop.inspect}, #{ColorStop.color_to_s(color)})"
|
310
|
+
end
|
311
|
+
Sass::Script::String.new(stops.join(", "))
|
312
|
+
end
|
313
|
+
|
314
|
+
def color_stops_in_percentages(color_list)
|
315
|
+
assert_type color_list, :List
|
316
|
+
color_list = normalize_stops(color_list)
|
317
|
+
max = color_list.value.last.stop
|
318
|
+
last_value = nil
|
319
|
+
color_stops = color_list.value.map do |pos|
|
320
|
+
# have to convert absolute units to percentages for use in color stop functions.
|
321
|
+
stop = pos.stop
|
322
|
+
stop = stop.div(max).times(Sass::Script::Number.new(100,["%"])) if stop.numerator_units == max.numerator_units && max.numerator_units != ["%"]
|
323
|
+
# Make sure the color stops are specified in the right order.
|
324
|
+
if last_value && stop.numerator_units == last_value.numerator_units && stop.denominator_units == last_value.denominator_units && (stop.value * 1000).round < (last_value.value * 1000).round
|
325
|
+
raise Sass::SyntaxError.new("Color stops must be specified in increasing order. #{stop.value} came after #{last_value.value}.")
|
326
|
+
end
|
327
|
+
last_value = stop
|
328
|
+
[stop, pos.color]
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
# only used for webkit
|
333
|
+
def linear_end_position(position_or_angle, color_list)
|
334
|
+
start_point = grad_point(position_or_angle || Sass::Script::String.new("top"))
|
335
|
+
end_point = grad_point(opposite_position(position_or_angle || Sass::Script::String.new("top")))
|
336
|
+
end_target = color_list.value.last.stop
|
337
|
+
|
338
|
+
if color_list.value.last.stop && color_list.value.last.stop.numerator_units == ["px"]
|
339
|
+
new_end = color_list.value.last.stop.value
|
340
|
+
if start_point.value.first == end_point.value.first && start_point.value.last.value == 0
|
341
|
+
# this means top-to-bottom
|
342
|
+
end_point.value[1] = Sass::Script::Number.new(end_target.value)
|
343
|
+
elsif start_point.value.last == end_point.value.last && start_point.value.first.value == 0
|
344
|
+
# this implies left-to-right
|
345
|
+
end_point.value[0] = Sass::Script::Number.new(end_target.value)
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end_point
|
349
|
+
end
|
350
|
+
|
351
|
+
# returns the end position of the gradient from the color stop
|
352
|
+
def grad_end_position(color_list, radial = Sass::Script::Bool.new(false))
|
353
|
+
assert_type color_list, :List
|
354
|
+
default = Sass::Script::Number.new(100)
|
355
|
+
grad_position(color_list, Sass::Script::Number.new(color_list.value.size), default, radial)
|
356
|
+
end
|
357
|
+
|
358
|
+
def grad_position(color_list, index, default, radial = Sass::Script::Bool.new(false))
|
359
|
+
assert_type color_list, :List
|
360
|
+
stop = color_list.value[index.value - 1].stop
|
361
|
+
if stop && radial.to_bool
|
362
|
+
orig_stop = stop
|
363
|
+
if stop.unitless?
|
364
|
+
if stop.value <= 1
|
365
|
+
# A unitless number is assumed to be a percentage when it's between 0 and 1
|
366
|
+
stop = stop.times(Sass::Script::Number.new(100, ["%"]))
|
367
|
+
else
|
368
|
+
# Otherwise, a unitless number is assumed to be in pixels
|
369
|
+
stop = stop.times(Sass::Script::Number.new(1, ["px"]))
|
370
|
+
end
|
371
|
+
end
|
372
|
+
if stop.numerator_units == ["%"] && color_list.value.last.stop && color_list.value.last.stop.numerator_units == ["px"]
|
373
|
+
stop = stop.times(color_list.value.last.stop).div(Sass::Script::Number.new(100, ["%"]))
|
374
|
+
end
|
375
|
+
Compass::Logger.new.record(:warning, "Webkit only supports pixels for the start and end stops for radial gradients. Got: #{orig_stop}") if stop.numerator_units != ["px"]
|
376
|
+
stop.div(Sass::Script::Number.new(1, stop.numerator_units, stop.denominator_units))
|
377
|
+
elsif stop
|
378
|
+
stop
|
379
|
+
else
|
380
|
+
default
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
def linear_svg_gradient(color_stops, start)
|
385
|
+
x1, y1 = *grad_point(start).value
|
386
|
+
x2, y2 = *grad_point(opposite_position(start)).value
|
387
|
+
stops = color_stops_in_percentages(color_stops)
|
388
|
+
|
389
|
+
svg = linear_svg(stops, x1, y1, x2, y2)
|
390
|
+
inline_image_string(svg.gsub(/\s+/, ' '), 'image/svg+xml')
|
391
|
+
end
|
392
|
+
|
393
|
+
def radial_svg_gradient(color_stops, center)
|
394
|
+
cx, cy = *grad_point(center).value
|
395
|
+
r = grad_end_position(color_stops, Sass::Script::Bool.new(true))
|
396
|
+
stops = color_stops_in_percentages(color_stops)
|
397
|
+
|
398
|
+
svg = radial_svg(stops, cx, cy, r)
|
399
|
+
inline_image_string(svg.gsub(/\s+/, ' '), 'image/svg+xml')
|
400
|
+
end
|
401
|
+
|
402
|
+
private
|
403
|
+
|
404
|
+
def color_stop?(arg)
|
405
|
+
arg.is_a?(ColorStop) ||
|
406
|
+
(arg.is_a?(Sass::Script::List) && ColorStop.new(*arg.value)) ||
|
407
|
+
ColorStop.new(arg)
|
408
|
+
rescue
|
409
|
+
nil
|
410
|
+
end
|
411
|
+
|
412
|
+
def normalize_stops(color_list)
|
413
|
+
positions = color_list.value.map{|obj| obj.dup}
|
414
|
+
# fill in the start and end positions, if unspecified
|
415
|
+
positions.first.stop = Sass::Script::Number.new(0) unless positions.first.stop
|
416
|
+
positions.last.stop = Sass::Script::Number.new(100, ["%"]) unless positions.last.stop
|
417
|
+
# fill in empty values
|
418
|
+
for i in 0...positions.size
|
419
|
+
if positions[i].stop.nil?
|
420
|
+
num = 2.0
|
421
|
+
for j in (i+1)...positions.size
|
422
|
+
if positions[j].stop
|
423
|
+
positions[i].stop = positions[i-1].stop.plus((positions[j].stop.minus(positions[i-1].stop)).div(Sass::Script::Number.new(num)))
|
424
|
+
break
|
425
|
+
else
|
426
|
+
num += 1
|
427
|
+
end
|
428
|
+
end
|
429
|
+
end
|
430
|
+
end
|
431
|
+
# normalize unitless numbers
|
432
|
+
positions.each do |pos|
|
433
|
+
if pos.stop.unitless? && pos.stop.value <= 1
|
434
|
+
pos.stop = pos.stop.times(Sass::Script::Number.new(100, ["%"]))
|
435
|
+
elsif pos.stop.unitless?
|
436
|
+
pos.stop = pos.stop.times(Sass::Script::Number.new(1, ["px"]))
|
437
|
+
end
|
438
|
+
end
|
439
|
+
if (positions.last.stop.eq(Sass::Script::Number.new(0, ["px"])).to_bool ||
|
440
|
+
positions.last.stop.eq(Sass::Script::Number.new(0, ["%"])).to_bool)
|
441
|
+
raise Sass::SyntaxError.new("Color stops must be specified in increasing order")
|
442
|
+
end
|
443
|
+
if defined?(Sass::Script::List)
|
444
|
+
Sass::Script::List.new(positions, color_list.separator)
|
445
|
+
else
|
446
|
+
color_list.class.new(*positions)
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
450
|
+
def parse_color_stop(arg)
|
451
|
+
return ColorStop.new(arg) if arg.is_a?(Sass::Script::Color)
|
452
|
+
return nil unless arg.is_a?(Sass::Script::String)
|
453
|
+
color = stop = nil
|
454
|
+
expr = Sass::Script::Parser.parse(arg.value, 0, 0)
|
455
|
+
case expr
|
456
|
+
when Sass::Script::Color
|
457
|
+
color = expr
|
458
|
+
when Sass::Script::Funcall
|
459
|
+
color = expr
|
460
|
+
when Sass::Script::Operation
|
461
|
+
unless [:concat, :space].include?(expr.instance_variable_get("@operator"))
|
462
|
+
# This should never happen.
|
463
|
+
raise Sass::SyntaxError, "Couldn't parse a color stop from: #{arg.value}"
|
464
|
+
end
|
465
|
+
color = expr.instance_variable_get("@operand1")
|
466
|
+
stop = expr.instance_variable_get("@operand2")
|
467
|
+
else
|
468
|
+
raise Sass::SyntaxError, "Couldn't parse a color stop from: #{arg.value}"
|
469
|
+
end
|
470
|
+
ColorStop.new(color, stop)
|
471
|
+
end
|
472
|
+
|
473
|
+
def list_of_color_stops?(arg)
|
474
|
+
if arg.respond_to?(:value)
|
475
|
+
arg.value.is_a?(Array) && arg.value.all?{|a| color_stop?(a)} ? arg.value : nil
|
476
|
+
elsif arg.is_a?(Array)
|
477
|
+
arg.all?{|a| color_stop?(a)} ? arg : nil
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
481
|
+
def linear_svg(color_stops, x1, y1, x2, y2)
|
482
|
+
transform = ''
|
483
|
+
if angle?(position_or_angle)
|
484
|
+
transform = %Q{ gradientTransform = "rotate(#{position_or_angle.value})"}
|
485
|
+
end
|
486
|
+
gradient = %Q{<linearGradient id="grad" gradientUnits="userSpaceOnUse" x1="#{x1}" y1="#{y1}" x2="#{x2}" y2="#{y2}"#{transform}>#{color_stops_svg(color_stops)}</linearGradient>}
|
487
|
+
svg(gradient)
|
488
|
+
end
|
489
|
+
|
490
|
+
def radial_svg(color_stops, cx, cy, r)
|
491
|
+
gradient = %Q{<radialGradient id="grad" gradientUnits="userSpaceOnUse" cx="#{cx}" cy="#{cy}" r="#{r}">#{color_stops_svg(color_stops)}</radialGradient>}
|
492
|
+
svg(gradient)
|
493
|
+
end
|
494
|
+
|
495
|
+
# color_stops = array of: [stop, color]
|
496
|
+
def color_stops_svg(color_stops)
|
497
|
+
color_stops.each.map{ |stop, color|
|
498
|
+
%{<stop offset="#{stop.to_s}" stop-color="#{color.inspect}"/>}
|
499
|
+
}.join
|
500
|
+
end
|
501
|
+
|
502
|
+
def svg(gradient)
|
503
|
+
svg = <<-EOS
|
504
|
+
<?xml version="1.0" encoding="utf-8"?>
|
505
|
+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"><defs>#{gradient}</defs><rect x="0" y="0" width="100%" height="100%" fill="url(#grad)" /></svg>
|
506
|
+
EOS
|
507
|
+
end
|
508
|
+
|
509
|
+
def _center_position
|
510
|
+
Sass::Script::List.new([
|
511
|
+
Sass::Script::String.new("center"),
|
512
|
+
Sass::Script::String.new("center")
|
513
|
+
],:space)
|
514
|
+
end
|
515
|
+
|
516
|
+
end
|
517
|
+
|
518
|
+
module Assertions
|
519
|
+
def assert_type(value, type, name = nil)
|
520
|
+
return if value.is_a?(Sass::Script.const_get(type))
|
521
|
+
err = "#{value.inspect} is not a #{type.to_s.downcase}"
|
522
|
+
err = "$#{name}: " + err if name
|
523
|
+
raise ArgumentError.new(err)
|
524
|
+
end
|
525
|
+
end
|
526
|
+
|
527
|
+
class LinearGradient < Sass::Script::Literal
|
528
|
+
include Assertions
|
529
|
+
include Functions
|
530
|
+
include Compass::SassExtensions::Functions::Constants
|
531
|
+
include Compass::SassExtensions::Functions::InlineImage
|
532
|
+
end
|
533
|
+
|
534
|
+
class RadialGradient < Sass::Script::Literal
|
535
|
+
include Assertions
|
536
|
+
include Functions
|
537
|
+
include Compass::SassExtensions::Functions::Constants
|
538
|
+
include Compass::SassExtensions::Functions::InlineImage
|
539
|
+
end
|
540
|
+
end
|