sprites 0.0.1.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/Gemfile +12 -0
- data/Rakefile +41 -0
- data/bin/sprites +18 -0
- data/features/cli.feature +11 -0
- data/features/step_definitions/common_steps.rb +36 -0
- data/features/support/env.rb +5 -0
- data/lib/sprites/application.rb +44 -0
- data/lib/sprites/cli/cli_application.rb +11 -0
- data/lib/sprites/cli/command_line_option_parser.rb +70 -0
- data/lib/sprites/cli.rb +4 -0
- data/lib/sprites/configuration.rb +59 -0
- data/lib/sprites/core_ext/pathname.rb +7 -0
- data/lib/sprites/notifier.rb +9 -0
- data/lib/sprites/sprite.rb +127 -0
- data/lib/sprites/sprite_generators/chunky_png_generator.rb +114 -0
- data/lib/sprites/sprite_piece.rb +36 -0
- data/lib/sprites/sprite_pieces.rb +47 -0
- data/lib/sprites/sprites.rb +61 -0
- data/lib/sprites/stylesheet.rb +22 -0
- data/lib/sprites/test/sprite_generator_tester.rb +78 -0
- data/lib/sprites/version.rb +3 -0
- data/lib/sprites.rb +24 -0
- data/spec/fixtures/known_good/sprite_images/buttons/.DS_Store +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-black-default-28.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-black-default-cap-28.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-black-default-cap-long.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-black-default.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-black-onclick-28.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-black-onclick-cap-28.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-black-onclick-cap-long.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-black-onclick.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-black-rollover-28.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-black-rollover-cap-28.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-black-rollover-cap-long.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-black-rollover.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blackarrow-default.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blackarrow-onclick.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blackarrow-rollover.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-default-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-default-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-default-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-default.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-onclick-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-onclick-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-onclick-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-onclick.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-rollover-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-rollover-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-rollover-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-rollover.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-green-default-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-green-default-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-green-default-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-green-default.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-green-onclick-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-green-onclick-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-green-onclick-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-green-onclick.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-green-rollover-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-green-rollover-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-green-rollover-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-green-rollover.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-red-default-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-red-default-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-red-default-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-red-default.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-red-onclick-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-red-onclick-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-red-onclick-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-red-onclick.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-red-rollover-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-red-rollover-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-red-rollover-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-red-rollover.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-default-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-default-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-default-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-default.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-onclick-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-onclick-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-onclick-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-onclick.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-rollover-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-rollover-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-rollover-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-rollover.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-white-default-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-white-default-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-white-default-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-white-default.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-white-onclick-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-white-onclick-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-white-onclick-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-white-onclick.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-white-rollover-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-white-rollover-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-white-rollover-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-white-rollover.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-default-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-default-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-default-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-default.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-onclick-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-onclick-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-onclick-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-onclick.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-rollover-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-rollover-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-rollover-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-rollover.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-black-default-28.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-black-default-cap-28.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-black-onclick-28.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-black-onclick-cap-28.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-black-rollover-28.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-black-rollover-cap-28.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-blue-default-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-blue-default.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-blue-onclick-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-blue-onclick.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-blue-rollover-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-blue-rollover.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-default-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-default-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-default-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-default.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-onclick-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-onclick-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-onclick-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-onclick.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-rollover-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-rollover-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-rollover-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-rollover.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-red-default-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-red-default.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-red-onclick-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-red-onclick.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-red-rollover-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-red-rollover.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-default-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-default-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-default-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-default.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-onclick-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-onclick-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-onclick-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-onclick.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-rollover-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-rollover-drop.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-rollover-edge.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-rollover.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-white-default-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-white-default.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-white-onclick-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-white-onclick.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-white-rollover-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-white-rollover.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-yellow-default-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-yellow-default.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-yellow-onclick-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-yellow-onclick.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-yellow-rollover-cap.png +0 -0
- data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-yellow-rollover.png +0 -0
- data/spec/fixtures/known_good/sprites/buttons.png +0 -0
- data/spec/fixtures/known_good/stylesheets/buttons.css +1127 -0
- data/spec/fixtures/project1/config/sprites.rb +145 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/.DS_Store +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-default-28.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-default-cap-28.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-default-cap-long.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-default.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-onclick-28.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-onclick-cap-28.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-onclick-cap-long.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-onclick.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-rollover-28.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-rollover-cap-28.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-rollover-cap-long.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-rollover.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blackarrow-default.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blackarrow-onclick.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blackarrow-rollover.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-default-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-default-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-default-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-default.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-onclick-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-onclick-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-onclick-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-onclick.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-rollover-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-rollover-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-rollover-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-rollover.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-default-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-default-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-default-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-default.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-onclick-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-onclick-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-onclick-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-onclick.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-rollover-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-rollover-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-rollover-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-rollover.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-default-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-default-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-default-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-default.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-onclick-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-onclick-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-onclick-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-onclick.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-rollover-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-rollover-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-rollover-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-rollover.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-default-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-default-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-default-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-default.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-onclick-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-onclick-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-onclick-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-onclick.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-rollover-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-rollover-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-rollover-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-rollover.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-default-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-default-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-default-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-default.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-onclick-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-onclick-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-onclick-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-onclick.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-rollover-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-rollover-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-rollover-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-rollover.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-default-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-default-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-default-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-default.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-onclick-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-onclick-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-onclick-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-onclick.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-rollover-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-rollover-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-rollover-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-rollover.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-black-default-28.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-black-default-cap-28.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-black-onclick-28.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-black-onclick-cap-28.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-black-rollover-28.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-black-rollover-cap-28.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-blue-default-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-blue-default.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-blue-onclick-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-blue-onclick.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-blue-rollover-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-blue-rollover.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-default-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-default-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-default-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-default.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-onclick-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-onclick-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-onclick-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-onclick.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-rollover-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-rollover-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-rollover-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-rollover.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-red-default-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-red-default.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-red-onclick-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-red-onclick.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-red-rollover-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-red-rollover.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-default-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-default-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-default-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-default.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-onclick-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-onclick-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-onclick-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-onclick.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-rollover-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-rollover-drop.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-rollover-edge.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-rollover.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-white-default-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-white-default.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-white-onclick-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-white-onclick.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-white-rollover-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-white-rollover.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-yellow-default-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-yellow-default.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-yellow-onclick-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-yellow-onclick.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-yellow-rollover-cap.png +0 -0
- data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-yellow-rollover.png +0 -0
- data/spec/fixtures/sprite_images/foo/foo.png +0 -0
- data/spec/lib/sprites/application_spec.rb +60 -0
- data/spec/lib/sprites/cli/command_line_option_parser_spec.rb +5 -0
- data/spec/lib/sprites/configuration_spec.rb +52 -0
- data/spec/lib/sprites/core_ext/pathname_spec.rb +4 -0
- data/spec/lib/sprites/notifier_spec.rb +5 -0
- data/spec/lib/sprites/sprite_generators/chunky_png_generator_spec.rb +19 -0
- data/spec/lib/sprites/sprite_piece_spec.rb +41 -0
- data/spec/lib/sprites/sprite_pieces_spec.rb +32 -0
- data/spec/lib/sprites/sprite_spec.rb +146 -0
- data/spec/lib/sprites/sprites_spec.rb +100 -0
- data/spec/lib/sprites/stylesheet_spec.rb +25 -0
- data/spec/lib/sprites/test/sprite_generator_tester_spec.rb +17 -0
- data/spec/lib/sprites_spec.rb +19 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/support/sprites_helper.rb +149 -0
- data/sprites.gemspec +29 -0
- metadata +802 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
|
4
|
+
|
5
|
+
desc "Run specs"
|
6
|
+
RSpec::Core::RakeTask.new do |t|
|
7
|
+
t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
|
8
|
+
# Put spec opts in a file named .rspec in root
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Generate code coverage"
|
12
|
+
RSpec::Core::RakeTask.new(:coverage) do |t|
|
13
|
+
t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
|
14
|
+
t.rcov = true
|
15
|
+
t.rcov_opts = ['--exclude', 'spec']
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'Default: run specs.'
|
19
|
+
task :default => :spec
|
20
|
+
|
21
|
+
namespace :spec do
|
22
|
+
desc 'Create spec'
|
23
|
+
task :create, :path do |t, args|
|
24
|
+
spec_path = File.join('spec', args[:path].gsub(%r{.rb$}, '_spec.rb'))
|
25
|
+
klass = File.basename(args[:path], File.extname(args[:path])).split('_').map {|s| "#{s[0,1].upcase}#{s[1..-1]}" }.join
|
26
|
+
mkdir_p File.dirname(spec_path)
|
27
|
+
|
28
|
+
spec_doc = <<-EOS
|
29
|
+
require 'spec_helper'
|
30
|
+
|
31
|
+
describe #{klass} do
|
32
|
+
end
|
33
|
+
EOS
|
34
|
+
|
35
|
+
File.open(spec_path, 'w+') do |f|
|
36
|
+
f.puts spec_doc
|
37
|
+
end
|
38
|
+
|
39
|
+
puts spec_doc
|
40
|
+
end
|
41
|
+
end
|
data/bin/sprites
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'sprites'
|
4
|
+
require 'sprites/cli'
|
5
|
+
|
6
|
+
include Sprites
|
7
|
+
|
8
|
+
begin
|
9
|
+
options = CommandLineOptionParser.new(ARGV)
|
10
|
+
options.parse
|
11
|
+
|
12
|
+
sprite_definition_file_path = options.definition_file_path
|
13
|
+
configuration = Configuration.new_for_command_line_options(options.options)
|
14
|
+
|
15
|
+
CliApplication.run(sprite_definition_file_path, configuration)
|
16
|
+
rescue CliApplication::DefinitionFileNotFound
|
17
|
+
abort 'No Sprite Definition File found. Please supply a path or place your definition file in `pwd` or `pwd/config`'
|
18
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Feature: Creating sprites and stylesheets
|
2
|
+
In order to avoid unnecessary image downloads
|
3
|
+
As a developer
|
4
|
+
I want to be able to generate image sprites
|
5
|
+
|
6
|
+
Scenario: Create some sprites
|
7
|
+
Given a project folder
|
8
|
+
And it contains a sprites dsl definition file
|
9
|
+
And it contains sprite images
|
10
|
+
When I run the executable "sprites"
|
11
|
+
Then I should get valid sprites
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'sprites/test/sprite_generator_tester'
|
2
|
+
require 'sprites/cli/command_line_option_parser'
|
3
|
+
|
4
|
+
Given(/^a project folder$/) do
|
5
|
+
Dir.chdir 'spec/fixtures/project1'
|
6
|
+
end
|
7
|
+
|
8
|
+
Given(/^it contains a sprites dsl definition file$/) do
|
9
|
+
has_def = File.exists?('config/sprites.rb') || File.exists?('sprites.rb')
|
10
|
+
has_def.should be_true
|
11
|
+
end
|
12
|
+
|
13
|
+
Given(/^it contains sprite images$/) do
|
14
|
+
Dir['public/images/sprite_images/**/*.png'].should_not be_empty
|
15
|
+
end
|
16
|
+
|
17
|
+
When(/^I run the executable "([^"]*)"$/) do |bin|
|
18
|
+
`#{Sprites.gem_root}/bin/#{bin}`
|
19
|
+
$?.to_i.should be(0)
|
20
|
+
end
|
21
|
+
|
22
|
+
Then(/^I should get valid sprites$/) do
|
23
|
+
options = CommandLineOptionParser.new($*)
|
24
|
+
options.parse
|
25
|
+
|
26
|
+
sprite_definition_file_path = options.definition_file_path
|
27
|
+
configuration = Configuration.new_for_command_line_options(options.options)
|
28
|
+
|
29
|
+
load sprite_definition_file_path
|
30
|
+
|
31
|
+
tester = SpriteGeneratorTester.new(Sprites.application.sprites[:buttons], configuration)
|
32
|
+
tester.should be_accurate
|
33
|
+
|
34
|
+
FileUtils.rm Sprite.sprite_full_path(configuration, Sprites.application.sprites[:buttons])
|
35
|
+
FileUtils.rm Stylesheet.stylesheet_full_path(configuration, Sprites.application.sprites[:buttons].stylesheet)
|
36
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'sprites/sprites'
|
2
|
+
|
3
|
+
module Sprites
|
4
|
+
|
5
|
+
# This class provides top level access to the Sprites application.
|
6
|
+
# So far, three methods are available:
|
7
|
+
# 1. define (_define_)
|
8
|
+
# 2. sprite (_sprite_)
|
9
|
+
#
|
10
|
+
# Author:: Sam Woodard
|
11
|
+
#
|
12
|
+
# :title:Application
|
13
|
+
|
14
|
+
class Application
|
15
|
+
attr_reader :sprites
|
16
|
+
|
17
|
+
# The +new+ class method initializes the class.
|
18
|
+
# === Example
|
19
|
+
# sprites = Sprites.new
|
20
|
+
def initialize(configuration = ::Sprites.configuration)
|
21
|
+
@configuration = configuration
|
22
|
+
@sprites = Sprites.new
|
23
|
+
end
|
24
|
+
|
25
|
+
# The +define+ method provides access to the dsl
|
26
|
+
# === Example
|
27
|
+
# Sprites.application.define do
|
28
|
+
# ...
|
29
|
+
# end
|
30
|
+
def define(&blk)
|
31
|
+
instance_eval(&blk)
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
# The +sprite+ method adds sprites to the application
|
36
|
+
# === Example
|
37
|
+
# Sprites.application.define do
|
38
|
+
# ...
|
39
|
+
# end
|
40
|
+
def sprite(*args, &blk)
|
41
|
+
sprites.add(*args, &blk)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Sprites
|
2
|
+
class CliApplication
|
3
|
+
class DefinitionFileNotFound < StandardError; end
|
4
|
+
|
5
|
+
def self.run(def_file, configuration)
|
6
|
+
load def_file
|
7
|
+
sprite_generator = ChunkyPngGenerator.new(configuration)
|
8
|
+
sprite_generator.generate(::Sprites.application.sprites)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
module Sprites
|
5
|
+
class CommandLineOptionParser < OptionParser
|
6
|
+
PRIMARY_DEF_FILE_LOCATION = 'config/sprites.rb'
|
7
|
+
SECONDARY_DEF_FILE_LOCATION = 'sprites.rb'
|
8
|
+
|
9
|
+
attr_reader :definition_file_path, :options
|
10
|
+
|
11
|
+
def initialize(arguments)
|
12
|
+
@definition_file_path, @arguments = extract_sprite_definition_file_path(arguments.clone)
|
13
|
+
@options = Hash.new
|
14
|
+
|
15
|
+
super do |opts|
|
16
|
+
setup_parser(opts)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse
|
21
|
+
super(@arguments)
|
22
|
+
end
|
23
|
+
|
24
|
+
def extract_sprite_definition_file_path(arguments)
|
25
|
+
sprite_def_file_pathname = if arguments[0] =~ %r{^.+\.rb}
|
26
|
+
Pathname.new(arguments.shift)
|
27
|
+
elsif file_exists?('config/sprites.rb')
|
28
|
+
Pathname.new('config/sprites.rb')
|
29
|
+
else
|
30
|
+
raise
|
31
|
+
end
|
32
|
+
|
33
|
+
[sprite_def_file_pathname.realpath.to_s, arguments]
|
34
|
+
rescue
|
35
|
+
raise CliApplication::DefinitionFileNotFound
|
36
|
+
end
|
37
|
+
|
38
|
+
def file_exists?(path)
|
39
|
+
Pathname.new(path).exist?
|
40
|
+
end
|
41
|
+
|
42
|
+
def setup_parser(opts)
|
43
|
+
opts.banner = "Usage: sprites [defintion_file] [options]"
|
44
|
+
|
45
|
+
opts.separator ""
|
46
|
+
opts.separator "Specific options:"
|
47
|
+
|
48
|
+
opts.on("-s", "--sprites_path", <<-EOS
|
49
|
+
Define the path to where the sprites should be placed. DEFAULT: 'public/images/sprites'
|
50
|
+
EOS
|
51
|
+
) do |path|
|
52
|
+
@options[:sprites_path] = path
|
53
|
+
end
|
54
|
+
|
55
|
+
opts.on("-c", "--sprite_stylesheets_path", <<-EOS
|
56
|
+
Define the path to where the sprites stylesheets should be placed. DEFAULT: 'public/stylesheets/sprites'
|
57
|
+
EOS
|
58
|
+
) do |path|
|
59
|
+
@options[:sprite_stylesheets_path] = path
|
60
|
+
end
|
61
|
+
|
62
|
+
opts.on("-p", "--sprite_pieces_path", <<-EOS
|
63
|
+
Define the path to where the images needed to build the sprites are stored. DEFAULT: 'public/images/sprite_pieces'
|
64
|
+
EOS
|
65
|
+
) do |path|
|
66
|
+
@options[:sprite_pieces_path] = path
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/sprites/cli.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
module Sprites
|
2
|
+
class Configuration
|
3
|
+
FIELDS = %w{backend sprites_path sprite_stylesheets_path sprite_pieces_path}
|
4
|
+
|
5
|
+
DEFAULT_CONFIGURATION = {
|
6
|
+
'backend' => :rmagick,
|
7
|
+
'sprites_path' => 'public/images/sprites',
|
8
|
+
'sprite_stylesheets_path' => 'public/stylesheets/sprites',
|
9
|
+
'sprite_pieces_path' => 'public/images/sprite_images'
|
10
|
+
}
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
DEFAULT_CONFIGURATION.each {|k,v| self.send(k, v)}
|
14
|
+
end
|
15
|
+
|
16
|
+
def configure(&blk)
|
17
|
+
instance_eval(&blk)
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
FIELDS.each do |meth|
|
22
|
+
eval <<-EVAL
|
23
|
+
def #{meth}(*args)
|
24
|
+
val, *_ = args
|
25
|
+
|
26
|
+
if val
|
27
|
+
@#{meth} = val
|
28
|
+
return self
|
29
|
+
end
|
30
|
+
|
31
|
+
@#{meth}
|
32
|
+
end
|
33
|
+
EVAL
|
34
|
+
end
|
35
|
+
|
36
|
+
alias_method :backend_without_override, :backend
|
37
|
+
def backend_with_override(*args)
|
38
|
+
val, *_ = args
|
39
|
+
|
40
|
+
if val
|
41
|
+
backend_without_override(val)
|
42
|
+
return self
|
43
|
+
end
|
44
|
+
|
45
|
+
backend_without_override && backend_without_override.to_sym
|
46
|
+
end
|
47
|
+
alias_method :backend, :backend_with_override
|
48
|
+
|
49
|
+
def self.new_for_command_line_options(options)
|
50
|
+
config = new
|
51
|
+
options.each do |k, v|
|
52
|
+
if FIELDS.include?(k.to_s)
|
53
|
+
config.send(k, v)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
config
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'pathname'
|
3
|
+
require 'sprites/core_ext/pathname'
|
4
|
+
require 'active_support/core_ext/array/extract_options'
|
5
|
+
require 'active_support/core_ext/object/try'
|
6
|
+
require 'sprites/sprite_pieces'
|
7
|
+
require 'sprites/sprite_piece'
|
8
|
+
require 'sprites/stylesheet'
|
9
|
+
|
10
|
+
module Sprites
|
11
|
+
class Sprite
|
12
|
+
class InvalidOrientation < StandardError; end
|
13
|
+
module Orientations
|
14
|
+
VERTICAL = 1
|
15
|
+
HORIZONTAL = 2
|
16
|
+
end
|
17
|
+
|
18
|
+
OPTIONS = [:orientation]
|
19
|
+
|
20
|
+
DEFAULT_OPTIONS = {
|
21
|
+
:orientation => Orientations::VERTICAL
|
22
|
+
}
|
23
|
+
|
24
|
+
attr_reader :name, :sprite_pieces, :stylesheet
|
25
|
+
|
26
|
+
def initialize(name)
|
27
|
+
@name = name
|
28
|
+
@sprite_pieces = SpritePieces.new
|
29
|
+
@options = DEFAULT_OPTIONS.dup
|
30
|
+
set_options
|
31
|
+
end
|
32
|
+
|
33
|
+
def define(*args, &blk)
|
34
|
+
@options = @options.merge args.extract_options!
|
35
|
+
@path ||= Pathname.wrap(path_for_arguments(@options, *args))
|
36
|
+
@stylesheet ||= Stylesheet.new(css_path, self)
|
37
|
+
@options.delete(@path.to_s)
|
38
|
+
set_options
|
39
|
+
|
40
|
+
instance_eval(&blk) if block_given?
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
def define!
|
45
|
+
define unless is_defined?
|
46
|
+
end
|
47
|
+
|
48
|
+
def is_defined?
|
49
|
+
!@stylesheet.nil?
|
50
|
+
end
|
51
|
+
|
52
|
+
def path
|
53
|
+
define!
|
54
|
+
@path
|
55
|
+
end
|
56
|
+
|
57
|
+
def stylesheet
|
58
|
+
define!
|
59
|
+
@stylesheet
|
60
|
+
end
|
61
|
+
|
62
|
+
def write_stylesheet(configuration, sprite_pieces = @sprite_pieces)
|
63
|
+
path = Stylesheet.stylesheet_full_path(configuration, stylesheet)
|
64
|
+
FileUtils.mkdir_p(File.dirname(path))
|
65
|
+
File.open path, 'w+' do |f|
|
66
|
+
f << stylesheet.css(configuration, self, sprite_pieces)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def stylesheet_path
|
71
|
+
define!
|
72
|
+
@stylesheet.path
|
73
|
+
end
|
74
|
+
|
75
|
+
def sprite_piece(options)
|
76
|
+
@sprite_pieces.add(options)
|
77
|
+
end
|
78
|
+
|
79
|
+
def orientation(*args)
|
80
|
+
val, *_ = args
|
81
|
+
if val
|
82
|
+
unless [Orientations::VERTICAL, Orientations::HORIZONTAL].include?(val)
|
83
|
+
raise InvalidOrientation
|
84
|
+
end
|
85
|
+
@orientation = val
|
86
|
+
return self
|
87
|
+
end
|
88
|
+
|
89
|
+
@orientation
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.sprite_full_path(configuration, sprite)
|
93
|
+
File.join(configuration.sprites_path, sprite.path)
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.sprite_css_path(configuration, sprite)
|
97
|
+
"/#{sprite_full_path(configuration, sprite)}"
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
def css_path
|
103
|
+
@paths && @paths.last || @path.to_s.gsub(/png$/, 'css')
|
104
|
+
end
|
105
|
+
|
106
|
+
def paths_for_options(options)
|
107
|
+
@paths ||= options.find {|k,v| k.is_a?(String) }
|
108
|
+
end
|
109
|
+
|
110
|
+
def path_for_arguments(options, *args)
|
111
|
+
if args.first.is_a?(Symbol) || (args.empty? && !paths_for_options(options).try(:first))
|
112
|
+
"#{args.first || @name}.png"
|
113
|
+
elsif args.first.is_a?(String)
|
114
|
+
args.first
|
115
|
+
else
|
116
|
+
path = paths_for_options(options).first
|
117
|
+
raise ArgumentError, "Path is not a string. See usage." unless path.is_a?(String)
|
118
|
+
path
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def set_options
|
123
|
+
return unless @options
|
124
|
+
@options.each {|k,v| send(k,v) if Sprite::OPTIONS.include?(k) }
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
begin
|
2
|
+
require 'oily_png'
|
3
|
+
rescue
|
4
|
+
require 'chunky_png'
|
5
|
+
end
|
6
|
+
|
7
|
+
module Sprites
|
8
|
+
class ChunkyPngGenerator
|
9
|
+
attr_reader :configuration
|
10
|
+
|
11
|
+
def initialize(configuration)
|
12
|
+
@configuration = configuration
|
13
|
+
end
|
14
|
+
|
15
|
+
def generate(sprites)
|
16
|
+
# verbose = ENV['VERBOSE'] == 'true' || ENV['DEBUG']
|
17
|
+
#
|
18
|
+
# if verbose
|
19
|
+
# t = Time.now
|
20
|
+
# $stdout << "#{t}: Active Sprites: \"I'm starting my run using #{runner_name}.\"\n"
|
21
|
+
# $stdout << "\nSprites to create:\n\"#{@sprites.map(&:path).join('", "')}\"\n"
|
22
|
+
# end
|
23
|
+
|
24
|
+
sprites.each do |sprite|
|
25
|
+
next if sprite.sprite_pieces.empty?
|
26
|
+
#
|
27
|
+
# if verbose
|
28
|
+
# t_sprite = Time.now
|
29
|
+
# $stdout << "\n=================================================\n"
|
30
|
+
# $stdout << "Starting Sprite, #{sprite.path}\n"
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
|
34
|
+
sprite_path = File.join(configuration.sprites_path, sprite.path)
|
35
|
+
sprite_stylesheet_path = File.join(configuration.sprite_stylesheets_path, sprite.stylesheet_path)
|
36
|
+
|
37
|
+
orientation = sprite.orientation
|
38
|
+
sprite_pieces = sprite.sprite_pieces
|
39
|
+
|
40
|
+
begin
|
41
|
+
# $stdout << "Gathering sprite details..." if verbose
|
42
|
+
image_list, width, height = create_image_list(sprite, sprite_path, sprite_pieces, orientation)
|
43
|
+
# $stdout << "done.\n" if verbose
|
44
|
+
#
|
45
|
+
# if ENV['DEBUG']
|
46
|
+
# $stdout << "|\tpath\t|\tselectors\t|\tx\t|\ty\t|\twidth\t|\theight\t|\n"
|
47
|
+
# $stdout << "#{sprite_pieces.map(&:to_s).join("\n")}\n"
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
sprite.write_stylesheet(configuration)
|
51
|
+
# stylesheet_file_path = File.join(@railtie.config.paths.public.to_a.first, sprite_stylesheet_path)
|
52
|
+
# $stdout << "Writing stylesheet to #{stylesheet_file_path} ... " if verbose
|
53
|
+
# stylesheet.write stylesheet_file_path
|
54
|
+
# $stdout << "done.\n" if verbose
|
55
|
+
#
|
56
|
+
# $stdout << "Beginning sprite generation using #{runner_name.humanize}.\n" if verbose
|
57
|
+
create_sprite(sprite, sprite_path, sprite_pieces, image_list, width, height, orientation, false)
|
58
|
+
# $stdout << "Success!\n" if verbose
|
59
|
+
#
|
60
|
+
# $stdout << "Writing sprite to #{sprite_file_path} ... " if verbose
|
61
|
+
write sprite_path
|
62
|
+
# $stdout << "done.\n" if verbose
|
63
|
+
#
|
64
|
+
# $stdout << "Finished #{sprite.path} in #{Time.now - t_sprite} seconds.\n" if verbose
|
65
|
+
# $stdout << "=================================================\n\n" if verbose
|
66
|
+
ensure
|
67
|
+
finish
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# $stdout << "#{Time.now}: ActiveSprites \"I finished my run in #{Time.now - t} seconds.\"\n" if verbose
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def create_image_list(sprite, sprite_path, sprite_pieces, orientation)
|
77
|
+
width, height = 0, 0
|
78
|
+
|
79
|
+
image_list = sprite_pieces.map do |sp|
|
80
|
+
sprite_piece_path = SpritePiece.sprite_piece_full_path(@configuration, sp)
|
81
|
+
sp_image = ChunkyPNG::Image.from_file(sprite_piece_path)
|
82
|
+
sp.x = orientation == Sprite::Orientations::VERTICAL ? 0 : width
|
83
|
+
sp.y = orientation == Sprite::Orientations::VERTICAL ? height : 0
|
84
|
+
sp.width = sp_image.width
|
85
|
+
sp.height = sp_image.height
|
86
|
+
|
87
|
+
width = orientation == Sprite::Orientations::HORIZONTAL ? width + sp_image.width : [width, sp_image.width].max
|
88
|
+
height = orientation == Sprite::Orientations::VERTICAL ? height + sp_image.height : [height, sp_image.height].max
|
89
|
+
|
90
|
+
sp_image
|
91
|
+
end
|
92
|
+
[image_list, width, height]
|
93
|
+
end
|
94
|
+
|
95
|
+
def create_sprite(sprite, sprite_path, sprite_pieces, image_list, width, height, orientation, verbose)
|
96
|
+
@sprite = ChunkyPNG::Image.new(width, height, ChunkyPNG::Color::TRANSPARENT)
|
97
|
+
|
98
|
+
image_list.each_with_index do |image, i|
|
99
|
+
@sprite.replace!(image, sprite_pieces.element_at(i).x, sprite_pieces.element_at(i).y)
|
100
|
+
# $stdout << '.' if verbose
|
101
|
+
end
|
102
|
+
# $stdout << "\n" if verbose
|
103
|
+
end
|
104
|
+
|
105
|
+
def write(path, quality = nil)
|
106
|
+
FileUtils.mkdir_p(File.dirname(path))
|
107
|
+
@sprite.save(path)
|
108
|
+
end
|
109
|
+
|
110
|
+
def finish
|
111
|
+
@sprite = nil
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Sprites
|
2
|
+
class SpritePiece
|
3
|
+
attr_reader :path
|
4
|
+
attr_accessor :sprite, :css_selector, :x, :y, :width, :height
|
5
|
+
alias_method :selector, :css_selector
|
6
|
+
|
7
|
+
def initialize(path)
|
8
|
+
@path = path
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.sprite_piece_full_path(configuration, sprite_piece)
|
12
|
+
File.join(configuration.sprite_pieces_path, sprite_piece.path)
|
13
|
+
end
|
14
|
+
|
15
|
+
def css(configuration = ::Sprites.configuration, sprite = @sprite, sprite_css_path = nil)
|
16
|
+
raise "Sprite needed." unless sprite
|
17
|
+
|
18
|
+
<<-CSS
|
19
|
+
#{selector}
|
20
|
+
{
|
21
|
+
display:block;
|
22
|
+
width:#{width}px;
|
23
|
+
height:#{height}px;
|
24
|
+
background:url('#{sprite_css_path || Sprite.sprite_css_path(configuration, sprite)}') no-repeat #{negative_pixelize(x)} #{negative_pixelize(y)};
|
25
|
+
}
|
26
|
+
CSS
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def negative_pixelize(val)
|
32
|
+
return "0" if val.to_i == 0
|
33
|
+
"-#{val}px"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'active_support/ordered_hash'
|
2
|
+
|
3
|
+
module Sprites
|
4
|
+
class SpritePieces
|
5
|
+
def initialize
|
6
|
+
@sprite_pieces = ActiveSupport::OrderedHash.new do |sprite_pieces, path|
|
7
|
+
sprite_pieces[path] = SpritePiece.new(path)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def add(options)
|
12
|
+
path, css_selector = options.find {|k,v| k.is_a?(String)}
|
13
|
+
@sprite_pieces[path].css_selector = css_selector
|
14
|
+
@sprite_pieces[path]
|
15
|
+
end
|
16
|
+
|
17
|
+
def count
|
18
|
+
@sprite_pieces.size
|
19
|
+
end
|
20
|
+
|
21
|
+
def empty?
|
22
|
+
@sprite_pieces.empty?
|
23
|
+
end
|
24
|
+
|
25
|
+
def [](val)
|
26
|
+
@sprite_pieces.has_key?(val) ?
|
27
|
+
@sprite_pieces[val] :
|
28
|
+
nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def element_at(index)
|
32
|
+
@sprite_pieces.values[index]
|
33
|
+
end
|
34
|
+
|
35
|
+
def map(*args, &blk)
|
36
|
+
@sprite_pieces.values.map(*args, &blk)
|
37
|
+
end
|
38
|
+
|
39
|
+
def find(*args, &blk)
|
40
|
+
@sprite_pieces.values.find(*args, &blk)
|
41
|
+
end
|
42
|
+
|
43
|
+
def css(configuration = ::Sprites.configuration, sprite = @sprite)
|
44
|
+
@sprite_pieces.values.map {|sp| sp.css(configuration, sprite)}.join("\n")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|