sproutcore 1.6.0.1-java → 1.7.1.beta-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/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)
|