sproutcore 1.6.0.1-java → 1.7.1.beta-java
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +21 -0
- data/Gemfile +5 -0
- data/Rakefile +26 -13
- data/VERSION.yml +2 -2
- data/lib/Buildfile +43 -4
- data/lib/buildtasks/build.rake +10 -0
- data/lib/buildtasks/helpers/file_rule.rb +22 -0
- data/lib/buildtasks/helpers/file_rule_list.rb +137 -0
- data/lib/buildtasks/manifest.rake +133 -122
- data/lib/frameworks/sproutcore/CHANGELOG.md +69 -2
- data/lib/frameworks/sproutcore/apps/tests/english.lproj/strings.js +1 -0
- data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +28 -22
- data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +9 -5
- data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/controller.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/controls/button.js +18 -13
- data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/handlebars/bind.js +5 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/handlebars/collection.js +2 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/action_support.js +80 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/template_helpers/text_field_support.js +84 -116
- data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +8 -5
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +157 -157
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +5 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +6 -6
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/sparse_array.js +10 -7
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/action_support.js +106 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/collection.js +18 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/handlebars.js +71 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/attribute_bindings_test.js +38 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/class_name_bindings_test.js +47 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutChildViews.js +18 -18
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutStyle.js +42 -10
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +158 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +26 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +14 -8
- data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +15 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +108 -108
- data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +2 -4
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/error_methods.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/single_attribute.js +26 -0
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/builders.js +7 -0
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/error_methods.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +4 -1
- data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/tests/system/datetime.js +6 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +26 -5
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +97 -96
- data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +4 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +17 -4
- data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +7 -7
- data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +7 -5
- data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +12 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +23 -14
- data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +5 -1
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/render_delegates/menu_scroller.js +28 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/tests/menu/scroll.js +235 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroll.js +363 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroller.js +250 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/desktop_scroller.js +92 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/native_scroll.js +25 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/scroll.js +33 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/touch_scroller.js +76 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/integration.js +50 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/methods.js +143 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/ui.js +258 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroll.js +1164 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroller.js +332 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroll.js +236 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroller.js +347 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroll.js +15 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroller.js +10 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroll.js +804 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroller.js +133 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +3 -3
- data/lib/frameworks/sproutcore/frameworks/foundation/validators/number.js +3 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +3 -3
- data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +2 -1
- data/lib/frameworks/sproutcore/frameworks/media/views/controls.js +2 -1
- data/lib/frameworks/sproutcore/frameworks/media/views/media_slider.js +2 -4
- data/lib/frameworks/sproutcore/frameworks/media/views/mini_controls.js +2 -4
- data/lib/frameworks/sproutcore/frameworks/media/views/simple_controls.js +2 -4
- data/lib/frameworks/sproutcore/frameworks/media/views/video.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +29 -3
- data/lib/frameworks/sproutcore/frameworks/runtime/core.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/private/property_chain.js +2 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +3 -3
- data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +1 -1
- data/lib/frameworks/sproutcore/themes/ace/resources/collection/normal/list_item.css +2 -2
- data/lib/frameworks/sproutcore/themes/legacy_theme/english.lproj/segmented.css +1 -1
- data/lib/gen/app/templates/apps/@target_name@/Buildfile +3 -5
- data/lib/gen/app/templates/apps/@target_name@/resources/_theme.css +18 -0
- data/lib/gen/project/templates/@filename@/Buildfile +2 -2
- data/lib/sproutcore.rb +30 -5
- data/lib/sproutcore/builders.rb +1 -0
- data/lib/sproutcore/builders/chance_file.rb +9 -16
- data/lib/sproutcore/builders/html.rb +2 -1
- data/lib/sproutcore/builders/minify.rb +4 -35
- data/lib/sproutcore/builders/module.rb +38 -1
- data/lib/sproutcore/builders/split.rb +63 -0
- data/lib/sproutcore/builders/strings.rb +7 -1
- data/lib/sproutcore/helpers.rb +1 -1
- data/lib/sproutcore/helpers/css_split.rb +190 -0
- data/lib/sproutcore/helpers/entry_sorter.rb +2 -0
- data/lib/sproutcore/helpers/minifier.rb +40 -16
- data/lib/sproutcore/helpers/static_helper.rb +35 -17
- data/lib/sproutcore/models/manifest.rb +26 -0
- data/lib/sproutcore/models/target.rb +12 -1
- data/lib/sproutcore/rack.rb +1 -0
- data/lib/sproutcore/rack/proxy.rb +244 -225
- data/lib/sproutcore/rack/restrict_ip.rb +67 -0
- data/lib/sproutcore/rack/service.rb +8 -2
- data/lib/sproutcore/tools.rb +102 -46
- data/lib/sproutcore/tools/build.rb +91 -43
- data/lib/sproutcore/tools/gen.rb +2 -3
- data/lib/sproutcore/tools/manifest.rb +22 -16
- data/lib/sproutcore/tools/server.rb +21 -0
- data/spec/buildtasks/helpers/accept_list +22 -0
- data/spec/buildtasks/helpers/accept_list.rb +128 -0
- data/spec/buildtasks/helpers/list.json +11 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/chance_2x_spec.rb +1 -39
- data/spec/buildtasks/manifest/prepare_build_tasks/chance_spec.rb +0 -38
- data/spec/buildtasks/manifest/prepare_build_tasks/combine_spec.rb +4 -4
- data/spec/buildtasks/manifest/prepare_build_tasks/module_spec.rb +2 -2
- data/spec/buildtasks/manifest/prepare_build_tasks/packed_2x_indirect_spec.rb +7 -16
- data/spec/buildtasks/manifest/prepare_build_tasks/packed_2x_spec.rb +7 -17
- data/spec/buildtasks/manifest/prepare_build_tasks/packed_spec.rb +11 -6
- data/spec/fixtures/builder_tests/Buildfile +2 -1
- data/spec/fixtures/builder_tests/apps/module_test/modules/required_module/core.js +0 -0
- data/spec/lib/builders/module_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/sproutcore.gemspec +4 -9
- data/vendor/chance/lib/chance.rb +25 -6
- data/vendor/chance/lib/chance/factory.rb +45 -0
- data/vendor/chance/lib/chance/instance.rb +173 -28
- data/vendor/chance/lib/chance/instance/data_url.rb +0 -29
- data/vendor/chance/lib/chance/instance/slicing.rb +57 -4
- data/vendor/chance/lib/chance/instance/spriting.rb +112 -21
- data/vendor/chance/lib/chance/parser.rb +80 -52
- data/vendor/sproutcore/SCCompiler.jar +0 -0
- data/vendor/sproutcore/lib/args4j-2.0.12.jar +0 -0
- data/vendor/sproutcore/lib/yuicompressor-2.4.2.jar +0 -0
- metadata +84 -25
@@ -23,11 +23,6 @@ module Chance
|
|
23
23
|
output += "\n-webkit-background-size: #{width}px #{height}px;"
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
# FOR IE < 8:
|
28
|
-
output += '*background-image: url("mhtml:chance-mhtml.txt!' + slice[:css_name] + '")'
|
29
|
-
output += "\n"
|
30
|
-
|
31
26
|
output
|
32
27
|
}
|
33
28
|
|
@@ -57,29 +52,5 @@ module Chance
|
|
57
52
|
end
|
58
53
|
end
|
59
54
|
|
60
|
-
def mhtml(opts)
|
61
|
-
# If there are no slices, ensure that we return an empty file.
|
62
|
-
return "" if @slices.length == 0
|
63
|
-
|
64
|
-
output = "Content-Type: multipart/related; boundary=\"CHANCE__\"\r\n"
|
65
|
-
|
66
|
-
@slices.each {|name, slice|
|
67
|
-
output += "\r\n--CHANCE__\r\n"
|
68
|
-
output += "Content-Location:" + slice[:css_name] + "\r\n"
|
69
|
-
output += "Content-Type:image/png\r\n"
|
70
|
-
output += "Content-Transfer-Encoding:base64\r\n\r\n"
|
71
|
-
|
72
|
-
base64Image = base64_for(slice)
|
73
|
-
output += base64Image.gsub("[^\r]\n", "\r\n")
|
74
|
-
|
75
|
-
output
|
76
|
-
}
|
77
|
-
|
78
|
-
output += "\r\n--CHANCE__--"
|
79
|
-
|
80
|
-
output
|
81
|
-
end
|
82
|
-
|
83
|
-
|
84
55
|
end
|
85
56
|
end
|
@@ -2,17 +2,57 @@ require "chance/perf"
|
|
2
2
|
|
3
3
|
module Chance
|
4
4
|
class Instance
|
5
|
-
|
6
5
|
# The Slicing module handles taking a collection of slice definitions to
|
7
6
|
# produce sliced images. It uses ChunkyPNG to perform the slicing, and
|
8
7
|
# stores the sliced image in the slice definition.
|
9
8
|
module Slicing
|
9
|
+
class << self
|
10
|
+
def add_canvas_to_cache(canvas, file, rect)
|
11
|
+
if @canvas_cache.nil?
|
12
|
+
@canvas_cache = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
left = rect[:left]
|
16
|
+
top = rect[:top]
|
17
|
+
width = rect[:width]
|
18
|
+
height = rect[:height]
|
19
|
+
|
20
|
+
key = "#{file[:path]}:#{left},#{top},#{width},#{height}"
|
21
|
+
@canvas_cache[key] = {
|
22
|
+
mtime: file[:mtime],
|
23
|
+
canvas: canvas
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_canvas_from_cache(file, rect)
|
28
|
+
if @canvas_cache.nil?
|
29
|
+
@canvas_cache = {}
|
30
|
+
end
|
31
|
+
|
32
|
+
left = rect[:left]
|
33
|
+
top = rect[:top]
|
34
|
+
width = rect[:width]
|
35
|
+
height = rect[:height]
|
36
|
+
|
37
|
+
key = "#{file[:path]}:#{left},#{top},#{width},#{height}"
|
38
|
+
hash = @canvas_cache[key]
|
39
|
+
|
40
|
+
# Check to see if it is new enough
|
41
|
+
if not hash.nil? and hash[:mtime] == file[:mtime]
|
42
|
+
return hash[:canvas]
|
43
|
+
end
|
44
|
+
|
45
|
+
@canvas_cache[key] = nil
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
10
50
|
# performs the slicing indicated by each slice definition, and puts the resulting
|
11
51
|
# image in the slice definition's :image property.
|
12
52
|
#
|
13
53
|
# if x2 is supplied, this will assume it is a second pass to locate any @2x images
|
14
54
|
# and use them to replace the originals.
|
15
|
-
def slice_images(opts)
|
55
|
+
def slice_images(opts)
|
16
56
|
slices = @slices
|
17
57
|
output = ""
|
18
58
|
|
@@ -21,7 +61,7 @@ module Chance
|
|
21
61
|
# Otherwise, consumers will use slice[:file] [:canvas] or [:contents]
|
22
62
|
# to get the original data as needed.
|
23
63
|
slice[:canvas] = nil
|
24
|
-
|
64
|
+
|
25
65
|
# In any case, if there is one, we need to get the original file and canvas;
|
26
66
|
# this process also tells us if the slice is 2x, etc.
|
27
67
|
canvas = canvas_for slice, opts
|
@@ -53,7 +93,17 @@ module Chance
|
|
53
93
|
rect = slice_rect(slice, canvas_width / f, canvas_height / f)
|
54
94
|
|
55
95
|
if not rect.nil?
|
56
|
-
|
96
|
+
|
97
|
+
## CHECK CACHE ##
|
98
|
+
file = file_for(slice, opts)
|
99
|
+
cached_canvas = Chance::Instance::Slicing.get_canvas_from_cache(file, rect)
|
100
|
+
if cached_canvas
|
101
|
+
slice[:canvas] = cached_canvas
|
102
|
+
else
|
103
|
+
slice[:canvas] = canvas.crop(rect[:left] * f, rect[:top] * f, rect[:width] * f, rect[:height] * f)
|
104
|
+
Chance::Instance::Slicing.add_canvas_to_cache(slice[:canvas], file, rect)
|
105
|
+
end
|
106
|
+
|
57
107
|
canvas_width = rect[:height] * f
|
58
108
|
canvas_height = rect[:width] * f
|
59
109
|
end
|
@@ -62,8 +112,11 @@ module Chance
|
|
62
112
|
slice[:target_width] = canvas_width / f
|
63
113
|
slice[:target_height] = canvas_height / f
|
64
114
|
end
|
115
|
+
|
116
|
+
|
65
117
|
|
66
118
|
end
|
119
|
+
|
67
120
|
end
|
68
121
|
|
69
122
|
# Returns either a RMagick image or a ChunkyPNG canvas for a slice, as applicable.
|
@@ -18,12 +18,12 @@ module Chance
|
|
18
18
|
# images in the class's @sprites property and updating the individual slices
|
19
19
|
# with a :sprite property containing the identifier of the sprite, and offset
|
20
20
|
# properties for the offsets within the image.
|
21
|
-
def generate_sprite_definitions(opts)
|
21
|
+
def generate_sprite_definitions(opts)
|
22
22
|
@sprites = {}
|
23
23
|
|
24
24
|
group_slices_into_sprites(opts)
|
25
25
|
@sprites.each do |key, sprite|
|
26
|
-
layout_slices_in_sprite sprite
|
26
|
+
layout_slices_in_sprite sprite, opts
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -70,7 +70,7 @@ module Chance
|
|
70
70
|
# Determines the name of the sprite for the given slice. The sprite
|
71
71
|
# by this name may not exist yet.
|
72
72
|
def sprite_name_for_slice(slice, opts)
|
73
|
-
if slice[:repeat] == "repeat
|
73
|
+
if slice[:repeat] == "repeat"
|
74
74
|
return slice[:path] + (opts[:x2] ? "@2x" : "")
|
75
75
|
end
|
76
76
|
|
@@ -79,10 +79,23 @@ module Chance
|
|
79
79
|
|
80
80
|
# Performs the layout operation, laying either up-to-down, or "
|
81
81
|
# (for repeat-y slices) left-to-right.
|
82
|
-
def layout_slices_in_sprite(sprite)
|
82
|
+
def layout_slices_in_sprite(sprite, opts)
|
83
83
|
# The position is the position in the layout direction. In vertical mode
|
84
84
|
# (the usual) it is the Y position.
|
85
85
|
pos = 0
|
86
|
+
|
87
|
+
# Adds some padding that will be painted with a pattern so that it is apparent that
|
88
|
+
# CSS is wrong.
|
89
|
+
# NOTE: though this is only in debug mode, we DO need to make sure it is on a 2px boundary.
|
90
|
+
# This makes sure 2x works properly.
|
91
|
+
padding = @options[:pad_sprites_for_debugging] ? 2 : 0
|
92
|
+
|
93
|
+
# The position within a row. It starts at 0 even if we have padding,
|
94
|
+
# because we always just add padding when we set the individual x/y pos.
|
95
|
+
inset = 0
|
96
|
+
|
97
|
+
# The length of the row. Length, when layout out vertically (the usual), is the height
|
98
|
+
row_length = 0
|
86
99
|
|
87
100
|
# The size is the current size of the sprite in the non-layout direction;
|
88
101
|
# for example, in the usual, vertical mode, the size is the width.
|
@@ -94,17 +107,19 @@ module Chance
|
|
94
107
|
smallest_size = nil
|
95
108
|
|
96
109
|
is_horizontal = sprite[:use_horizontal_layout]
|
97
|
-
|
98
|
-
|
110
|
+
|
111
|
+
# Figure out slice width/heights. We cannot rely on slicing to do this for us
|
112
|
+
# because some images may be being passed through as-is.
|
113
|
+
sprite[:slices].each {|slice|
|
99
114
|
# We must find a canvas either on the slice (if it was actually sliced),
|
100
115
|
# or on the slice's file. Otherwise, we're in big shit.
|
101
116
|
canvas = slice[:canvas] || slice[:file][:canvas]
|
102
|
-
|
117
|
+
|
103
118
|
# TODO: MAKE A BETTER ERROR.
|
104
119
|
unless canvas
|
105
|
-
throw "Could not sprite image " + slice[:path] + "; if it is not a PNG"
|
120
|
+
throw "Could not sprite image " + slice[:path] + "; if it is not a PNG, make sure you have rmagick installed"
|
106
121
|
end
|
107
|
-
|
122
|
+
|
108
123
|
# RMagick has a different API than ChunkyPNG; we have to detect
|
109
124
|
# which one we are using, and use the correct API accordingly.
|
110
125
|
if canvas.respond_to?('columns')
|
@@ -114,10 +129,10 @@ module Chance
|
|
114
129
|
slice_width = canvas.width
|
115
130
|
slice_height = canvas.height
|
116
131
|
end
|
117
|
-
|
132
|
+
|
118
133
|
slice_length = is_horizontal ? slice_width : slice_height
|
119
134
|
slice_size = is_horizontal ? slice_height : slice_width
|
120
|
-
|
135
|
+
|
121
136
|
# When repeating, we must use the least common multiple so that
|
122
137
|
# we can ensure the repeat pattern works even with multiple repeat
|
123
138
|
# sizes. However, we should take into account how much extra we are
|
@@ -128,8 +143,41 @@ module Chance
|
|
128
143
|
|
129
144
|
size = size.lcm slice_size
|
130
145
|
else
|
131
|
-
size = [size, slice_size].max
|
146
|
+
size = [size, slice_size + padding * 2].max
|
147
|
+
end
|
148
|
+
|
149
|
+
slice[:slice_width] = slice_width.to_i
|
150
|
+
slice[:slice_height] = slice_height.to_i
|
151
|
+
}
|
152
|
+
|
153
|
+
# Sort slices from widest/tallest (dependent on is_horizontal) or is_vertical
|
154
|
+
# NOTE: This means we are technically sorting reversed
|
155
|
+
sprite[:slices].sort! {|a, b|
|
156
|
+
# WHY <=> NO WORK?
|
157
|
+
if is_horizontal
|
158
|
+
b[:slice_height] <=> a[:slice_height]
|
159
|
+
else
|
160
|
+
b[:slice_width] <=> a[:slice_width]
|
161
|
+
end
|
162
|
+
}
|
163
|
+
|
164
|
+
sprite[:slices].each do |slice|
|
165
|
+
# We must find a canvas either on the slice (if it was actually sliced),
|
166
|
+
# or on the slice's file. Otherwise, we're in big shit.
|
167
|
+
canvas = slice[:canvas] || slice[:file][:canvas]
|
168
|
+
|
169
|
+
slice_width = slice[:slice_width]
|
170
|
+
slice_height = slice[:slice_height]
|
171
|
+
|
172
|
+
slice_length = is_horizontal ? slice_width : slice_height
|
173
|
+
slice_size = is_horizontal ? slice_height : slice_width
|
174
|
+
|
175
|
+
if slice[:repeat] != "no-repeat" or inset + slice_size + padding * 2 > size or not @options[:optimize_sprites]
|
176
|
+
pos += row_length
|
177
|
+
inset = 0
|
178
|
+
row_length = 0
|
132
179
|
end
|
180
|
+
|
133
181
|
|
134
182
|
# We have extras for manual tweaking of offsetx/y. We have to make sure there
|
135
183
|
# is padding for this (on either side)
|
@@ -149,20 +197,44 @@ module Chance
|
|
149
197
|
elsif slice[:max_offset_y] > 0 and not is_horizontal
|
150
198
|
pos += slice[:max_offset_y]
|
151
199
|
end
|
152
|
-
|
153
|
-
|
154
|
-
slice[:
|
155
|
-
|
200
|
+
|
201
|
+
slice[:sprite_slice_x] = (is_horizontal ? pos : inset)
|
202
|
+
slice[:sprite_slice_y] = (is_horizontal ? inset : pos)
|
203
|
+
|
204
|
+
# add padding for x, only if it a) doesn't repeat or b) repeats vertically because it has horizontal layout
|
205
|
+
if slice[:repeat] == "no-repeat" or slice[:repeat] == "repeat-y"
|
206
|
+
slice[:sprite_slice_x] += padding
|
207
|
+
end
|
208
|
+
|
209
|
+
if slice[:repeat] == "no-repeat" or slice[:repeat] == "repeat-x"
|
210
|
+
slice[:sprite_slice_y] += padding
|
211
|
+
end
|
212
|
+
|
156
213
|
slice[:sprite_slice_width] = slice_width
|
157
214
|
slice[:sprite_slice_height] = slice_height
|
158
215
|
|
159
|
-
|
216
|
+
inset += slice_size + padding * 2
|
217
|
+
|
218
|
+
# We pad the row length ONLY if it is a repeat-x, repeat-y, or no-repeat image.
|
219
|
+
# If it is 'repeat', we do not pad it, because it should be processed raw.
|
220
|
+
row_length = [slice_length + (slice[:repeat] != "repeat" ? padding * 2 : 0), row_length].max
|
221
|
+
|
222
|
+
# In 2X, make sure we are aligned on a 2px grid.
|
223
|
+
# We correct this AFTER positioning because we always position on an even grid anyway;
|
224
|
+
# we just may leave that even grid if we have an odd-sized image. We do this after positioning
|
225
|
+
# so that the next loop knows if there is space.
|
226
|
+
if opts[:x2]
|
227
|
+
row_length = (row_length.to_f / 2).ceil * 2
|
228
|
+
inset = (inset.to_f / 2).ceil * 2
|
229
|
+
end
|
230
|
+
|
160
231
|
end
|
232
|
+
pos += row_length
|
161
233
|
|
162
234
|
# TODO: USE A CONSTANT FOR THIS WARNING
|
163
235
|
smallest_size = size if smallest_size == nil
|
164
236
|
if size - smallest_size > 10
|
165
|
-
puts "WARNING: Used more than 10 extra rows or columns to
|
237
|
+
puts "WARNING: Used more than 10 extra rows or columns to accommodate repeating slices."
|
166
238
|
puts "Wasted up to " + (pos * size-smallest_size).to_s + " pixels"
|
167
239
|
end
|
168
240
|
|
@@ -177,6 +249,14 @@ module Chance
|
|
177
249
|
def generate_sprite(sprite)
|
178
250
|
canvas = canvas_for_sprite(sprite)
|
179
251
|
sprite[:canvas] = canvas
|
252
|
+
|
253
|
+
# If we are padding sprites, we should paint the background something really
|
254
|
+
# obvious & obnoxious. Say, magenta. That's obnoxious. A nice light purple wouldn't
|
255
|
+
# be bad, but magenta... that will stick out like a sore thumb (I hope)
|
256
|
+
if @options[:pad_sprites_for_debugging]
|
257
|
+
magenta = ChunkyPNG::Color.rgb(255, 0, 255)
|
258
|
+
canvas.rect(0, 0, sprite[:width], sprite[:height], magenta, magenta)
|
259
|
+
end
|
180
260
|
|
181
261
|
sprite[:slices].each do |slice|
|
182
262
|
x = slice[:sprite_slice_x]
|
@@ -221,14 +301,18 @@ module Chance
|
|
221
301
|
|
222
302
|
# Repeat the pattern to fill the width/height.
|
223
303
|
while top < height do
|
304
|
+
left = 0
|
305
|
+
|
224
306
|
while left < width do
|
225
|
-
if target.respond_to?(:
|
226
|
-
target.
|
307
|
+
if target.respond_to?(:replace!)
|
308
|
+
target.replace!(source_canvas, left + x, top + y)
|
227
309
|
else
|
228
310
|
target.composite!(source_canvas, left + x, top + y)
|
229
311
|
end
|
312
|
+
|
230
313
|
left += source_width
|
231
314
|
end
|
315
|
+
|
232
316
|
top += source_height
|
233
317
|
end
|
234
318
|
|
@@ -295,7 +379,14 @@ module Chance
|
|
295
379
|
|
296
380
|
generate_sprite(sprite) if not sprite[:has_generated]
|
297
381
|
|
298
|
-
sprite[:canvas].to_blob
|
382
|
+
ret = sprite[:canvas].to_blob
|
383
|
+
|
384
|
+
if Chance.clear_files_immediately
|
385
|
+
sprite[:canvas] = nil
|
386
|
+
sprite[:has_generated] = false
|
387
|
+
end
|
388
|
+
|
389
|
+
ret
|
299
390
|
end
|
300
391
|
|
301
392
|
def sprite_names(opts={})
|
@@ -23,15 +23,6 @@
|
|
23
23
|
# - :theme: a selector that will make up the initial value of the $theme
|
24
24
|
# variable. For example: :theme => "ace.test-controls"
|
25
25
|
#
|
26
|
-
# - :compress: if true, the slice names in the CSS will be shortened.
|
27
|
-
# This has two drawbacks: 1) the slice names will not be helpful for
|
28
|
-
# debugging, and 2) if using Chance in a standalone way and committing
|
29
|
-
# the output to a source control system, the output can change dramatically
|
30
|
-
# between runs, even if the input CSS is unchanged.
|
31
|
-
#
|
32
|
-
# As the most common use of Chance is as part of the SC build tools,
|
33
|
-
# and this debugging support is usually only required to debug Chance
|
34
|
-
# itself, :compress defaults to true
|
35
26
|
#
|
36
27
|
# How Slice & Slices work
|
37
28
|
# -------------------------------
|
@@ -56,16 +47,15 @@ module Chance
|
|
56
47
|
BEGIN_SCOPE = /\{/
|
57
48
|
END_SCOPE = /\}/
|
58
49
|
THEME_DIRECTIVE = /@theme\s*/
|
59
|
-
SELECTOR_THEME_VARIABLE = /\$theme
|
50
|
+
SELECTOR_THEME_VARIABLE = /\$theme(?=[^\w:-])/
|
60
51
|
INCLUDE_SLICES_DIRECTIVE = /@include\s+slices\s*/
|
61
52
|
INCLUDE_SLICE_DIRECTIVE = /@include\s+slice\s*/
|
62
53
|
CHANCE_FILE_DIRECTIVE = /@_chance_file /
|
63
54
|
NORMAL_SCAN_UNTIL = /[^{}@$]+/
|
64
55
|
|
65
|
-
@@uid = 0
|
66
56
|
|
67
57
|
def initialize(string, opts = {})
|
68
|
-
@opts = { :theme => ""
|
58
|
+
@opts = { :theme => "" }
|
69
59
|
@opts.merge!(opts)
|
70
60
|
@path = ""
|
71
61
|
|
@@ -77,9 +67,6 @@ module Chance
|
|
77
67
|
|
78
68
|
@theme = @opts[:theme]
|
79
69
|
|
80
|
-
@@uid += 1
|
81
|
-
@uid = @@uid
|
82
|
-
|
83
70
|
end
|
84
71
|
|
85
72
|
# SLICE MANAGEMENT
|
@@ -135,12 +122,8 @@ module Chance
|
|
135
122
|
slice[:max_offset_x] = [slice[:max_offset_x], opts[:offset_x]].max
|
136
123
|
slice[:max_offset_y] = [slice[:max_offset_y], opts[:offset_y]].max
|
137
124
|
else
|
138
|
-
|
139
|
-
css_name = "
|
140
|
-
|
141
|
-
if @opts[:compress]
|
142
|
-
css_name = "__s" + @uid.to_s + "_" + @slices.length.to_s
|
143
|
-
end
|
125
|
+
modified_path = @opts[:instance_id].to_s.gsub(/[^a-zA-Z0-9]/, '_') + "_" + slice_path.gsub(/[^a-zA-Z0-9]/, '_')
|
126
|
+
css_name = "__chance_slice_#{modified_path}"
|
144
127
|
|
145
128
|
slice = opts.merge({
|
146
129
|
:name => slice_path,
|
@@ -151,12 +134,16 @@ module Chance
|
|
151
134
|
:max_offset_x => opts[:offset_x],
|
152
135
|
:max_offset_y => opts[:offset_y],
|
153
136
|
:imaged_offset_x => 0, # the imaging process will re-define these.
|
154
|
-
:imaged_offset_y => 0
|
137
|
+
:imaged_offset_y => 0,
|
138
|
+
|
139
|
+
:used_by => []
|
155
140
|
})
|
156
141
|
|
157
142
|
@slices[slice_path] = slice
|
158
143
|
end
|
159
144
|
|
145
|
+
slice[:used_by] << { :path => @path }
|
146
|
+
|
160
147
|
return slice
|
161
148
|
end
|
162
149
|
|
@@ -358,7 +345,7 @@ module Chance
|
|
358
345
|
scanner = @scanner
|
359
346
|
scanner.scan SELECTOR_THEME_VARIABLE
|
360
347
|
|
361
|
-
output = "\#{$theme}
|
348
|
+
output = "\#{$theme}"
|
362
349
|
|
363
350
|
return output
|
364
351
|
end
|
@@ -486,7 +473,7 @@ module Chance
|
|
486
473
|
|
487
474
|
# We prefix with -chance; this should let everything be passed through more
|
488
475
|
# or less as-is. Postprocessing will turn it into -background-position.
|
489
|
-
output += "-chance-offset: \"#{slice[:name]}\" #{
|
476
|
+
output += "-chance-offset: \"#{slice[:name]}\" #{offset[0]} #{offset[1]};"
|
490
477
|
output += "background-repeat: " + slice[:repeat]
|
491
478
|
return output
|
492
479
|
end
|
@@ -564,17 +551,25 @@ module Chance
|
|
564
551
|
fill_width = Integer(fill[0])
|
565
552
|
fill_height = Integer(fill[1])
|
566
553
|
|
567
|
-
|
568
|
-
|
569
|
-
|
554
|
+
# skip control
|
555
|
+
skip = arguments[:skip]
|
556
|
+
if skip.nil?
|
557
|
+
skip = []
|
558
|
+
else
|
559
|
+
skip = skip.split /\s+/
|
560
|
+
end
|
561
|
+
|
562
|
+
skip_top_left = skip.include? 'top-left'
|
563
|
+
skip_top = skip.include? 'top'
|
564
|
+
skip_top_right = skip.include? 'skip-top-right'
|
570
565
|
|
571
|
-
skip_left =
|
572
|
-
skip_middle =
|
573
|
-
skip_right =
|
566
|
+
skip_left = skip.include? 'left'
|
567
|
+
skip_middle = skip.include? 'middle'
|
568
|
+
skip_right = skip.include? 'right'
|
574
569
|
|
575
|
-
skip_bottom_left =
|
576
|
-
skip_bottom =
|
577
|
-
skip_bottom_right =
|
570
|
+
skip_bottom_left = skip.include? 'bottom-left'
|
571
|
+
skip_bottom = skip.include? 'bottom'
|
572
|
+
skip_bottom_right = skip.include? 'bottom-right'
|
578
573
|
|
579
574
|
filename = parse_string(arguments[0])
|
580
575
|
|
@@ -645,7 +640,7 @@ module Chance
|
|
645
640
|
:sprite_padding => arguments[:"middle-padding"],
|
646
641
|
:offset => arguments[:"middle-offset"],
|
647
642
|
:filename => filename,
|
648
|
-
:repeat => fill_height != 0 ? (fill_width != 0 ? "repeat
|
643
|
+
:repeat => fill_height != 0 ? (fill_width != 0 ? "repeat" : "repeat-y") : (fill_width != 0 ? "repeat-x" : nil)
|
649
644
|
|
650
645
|
|
651
646
|
# fill in width, height or right, bottom depending on fill settings
|
@@ -734,9 +729,18 @@ module Chance
|
|
734
729
|
output = ""
|
735
730
|
|
736
731
|
# LEFT
|
737
|
-
if
|
732
|
+
# NOTE: we write it even if we are supposed to skip; we only wrap the slice include portion in
|
733
|
+
if should_include_slice?(top_left_slice)
|
738
734
|
output += "& > .top-left {\n"
|
739
|
-
|
735
|
+
|
736
|
+
# IF we are skipping the top left slice, we don't want the actual slice include-- but the layout
|
737
|
+
# information we still want. So, only bracket the generate_slice_include.
|
738
|
+
#
|
739
|
+
# Potential issue: slice_layout doesn't handle repeat settings. In theory, this should rarely be
|
740
|
+
# an issue (because you aren't setting a background for the skipped slice.
|
741
|
+
if not skip_top_left
|
742
|
+
output += generate_slice_include(top_left_slice) + ";"
|
743
|
+
end
|
740
744
|
|
741
745
|
output += "\nposition: absolute;\n"
|
742
746
|
output += slice_layout(top_left_slice)
|
@@ -744,9 +748,12 @@ module Chance
|
|
744
748
|
output += "}\n"
|
745
749
|
end
|
746
750
|
|
747
|
-
if should_include_slice?(left_slice)
|
751
|
+
if should_include_slice?(left_slice)
|
748
752
|
output += "& > .left {\n"
|
749
|
-
|
753
|
+
|
754
|
+
if not skip_left
|
755
|
+
output += generate_slice_include(left_slice) + ";"
|
756
|
+
end
|
750
757
|
|
751
758
|
output += "\nposition: absolute;\n"
|
752
759
|
output += slice_layout(left_slice.merge({ :bottom => bottom }))
|
@@ -754,9 +761,12 @@ module Chance
|
|
754
761
|
output += "}\n"
|
755
762
|
end
|
756
763
|
|
757
|
-
if should_include_slice?(bottom_left_slice)
|
764
|
+
if should_include_slice?(bottom_left_slice)
|
758
765
|
output += "& > .bottom-left {\n"
|
759
|
-
|
766
|
+
|
767
|
+
if not skip_bottom_left
|
768
|
+
output += generate_slice_include(bottom_left_slice) + ";"
|
769
|
+
end
|
760
770
|
|
761
771
|
output += "\nposition: absolute;\n"
|
762
772
|
output += slice_layout(bottom_left_slice)
|
@@ -765,9 +775,12 @@ module Chance
|
|
765
775
|
end
|
766
776
|
|
767
777
|
# MIDDLE
|
768
|
-
if should_include_slice?(top_slice)
|
778
|
+
if should_include_slice?(top_slice)
|
769
779
|
output += "& > .top {\n"
|
770
|
-
|
780
|
+
|
781
|
+
if not skip_top
|
782
|
+
output += generate_slice_include(top_slice) + ";"
|
783
|
+
end
|
771
784
|
|
772
785
|
output += "\nposition: absolute;\n"
|
773
786
|
output += slice_layout(top_slice.merge({ :right => right }))
|
@@ -775,9 +788,12 @@ module Chance
|
|
775
788
|
output += "}\n"
|
776
789
|
end
|
777
790
|
|
778
|
-
if should_include_slice?(middle_slice)
|
791
|
+
if should_include_slice?(middle_slice)
|
779
792
|
output += "& > .middle {\n"
|
780
|
-
|
793
|
+
|
794
|
+
if not skip_middle
|
795
|
+
output += generate_slice_include(middle_slice) + ";"
|
796
|
+
end
|
781
797
|
|
782
798
|
output += "\nposition: absolute;\n"
|
783
799
|
output += slice_layout(middle_slice.merge({ :bottom => bottom, :right => right }))
|
@@ -786,9 +802,12 @@ module Chance
|
|
786
802
|
output += "}\n"
|
787
803
|
end
|
788
804
|
|
789
|
-
if should_include_slice?(bottom_slice)
|
805
|
+
if should_include_slice?(bottom_slice)
|
790
806
|
output += "& > .bottom {\n"
|
791
|
-
|
807
|
+
|
808
|
+
if not skip_bottom
|
809
|
+
output += generate_slice_include(bottom_slice) + ";"
|
810
|
+
end
|
792
811
|
|
793
812
|
output += "\nposition: absolute;\n"
|
794
813
|
output += slice_layout(bottom_slice.merge({ :right => right }))
|
@@ -798,9 +817,12 @@ module Chance
|
|
798
817
|
end
|
799
818
|
|
800
819
|
# RIGHT
|
801
|
-
if should_include_slice?(top_right_slice)
|
820
|
+
if should_include_slice?(top_right_slice)
|
802
821
|
output += "& > .top-right {\n"
|
803
|
-
|
822
|
+
|
823
|
+
if not skip_top_right
|
824
|
+
output += generate_slice_include(top_right_slice) + ";"
|
825
|
+
end
|
804
826
|
|
805
827
|
output += "\nposition: absolute;\n"
|
806
828
|
output += slice_layout(top_right_slice)
|
@@ -808,9 +830,12 @@ module Chance
|
|
808
830
|
output += "}\n"
|
809
831
|
end
|
810
832
|
|
811
|
-
if should_include_slice?(right_slice)
|
833
|
+
if should_include_slice?(right_slice)
|
812
834
|
output += "& > .right {\n"
|
813
|
-
|
835
|
+
|
836
|
+
if not skip_right
|
837
|
+
output += generate_slice_include(right_slice) + ";"
|
838
|
+
end
|
814
839
|
|
815
840
|
output += "\nposition: absolute;\n"
|
816
841
|
output += slice_layout(right_slice.merge({ :bottom => bottom }))
|
@@ -818,9 +843,12 @@ module Chance
|
|
818
843
|
output += "}\n"
|
819
844
|
end
|
820
845
|
|
821
|
-
if should_include_slice?(bottom_right_slice)
|
846
|
+
if should_include_slice?(bottom_right_slice)
|
822
847
|
output += "& > .bottom-right {\n"
|
823
|
-
|
848
|
+
|
849
|
+
if not skip_bottom_right
|
850
|
+
output += generate_slice_include(bottom_right_slice) + ";"
|
851
|
+
end
|
824
852
|
|
825
853
|
output += "\nposition: absolute;\n"
|
826
854
|
output += slice_layout(bottom_right_slice)
|