sproutcore 0.9.4 → 0.9.5
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +70 -2
- data/Manifest.txt +3 -15
- data/config/hoe.rb +1 -1
- data/frameworks/sproutcore/animation/animation.js +411 -0
- data/frameworks/sproutcore/controllers/array.js +68 -21
- data/frameworks/sproutcore/controllers/object.js +21 -2
- data/frameworks/sproutcore/drag/drag.js +13 -4
- data/frameworks/sproutcore/drag/drop_target.js +26 -19
- data/frameworks/sproutcore/english.lproj/core.css +4 -0
- data/frameworks/sproutcore/english.lproj/strings.js +5 -0
- data/frameworks/sproutcore/english.lproj/theme.css +5 -0
- data/frameworks/sproutcore/foundation/application.js +1 -2
- data/frameworks/sproutcore/foundation/set.js +31 -12
- data/frameworks/sproutcore/foundation/sorted_set.js +590 -0
- data/frameworks/sproutcore/foundation/string.js +43 -9
- data/frameworks/sproutcore/globals/window.js +34 -9
- data/frameworks/sproutcore/lib/button_views.rb +1 -0
- data/frameworks/sproutcore/lib/collection_view.rb +1 -0
- data/frameworks/sproutcore/lib/core_views.rb +3 -0
- data/frameworks/sproutcore/lib/index.rhtml +1 -1
- data/frameworks/sproutcore/mixins/collection_view_delegate.js +201 -0
- data/frameworks/sproutcore/mixins/observable.js +2 -7
- data/frameworks/sproutcore/models/record.js +1 -1
- data/frameworks/sproutcore/models/store.js +81 -28
- data/frameworks/sproutcore/tests/views/view/clippingFrame.rhtml +9 -6
- data/frameworks/sproutcore/views/collection/collection.js +649 -211
- data/frameworks/sproutcore/views/collection/grid.js +62 -26
- data/frameworks/sproutcore/views/collection/list.js +57 -21
- data/frameworks/sproutcore/views/collection/source_list.js +61 -13
- data/frameworks/sproutcore/views/image.js +7 -0
- data/frameworks/sproutcore/views/inline_text_field.js +4 -5
- data/frameworks/sproutcore/views/slider.js +2 -0
- data/frameworks/sproutcore/views/view.js +2 -2
- data/lib/sproutcore/build_tools/html_builder.rb +4 -6
- data/lib/sproutcore/build_tools/resource_builder.rb +32 -20
- data/lib/sproutcore/bundle.rb +130 -32
- data/lib/sproutcore/bundle_manifest.rb +24 -21
- data/lib/sproutcore/helpers/static_helper.rb +22 -9
- data/lib/sproutcore/merb/bundle_controller.rb +4 -3
- data/lib/sproutcore/version.rb +1 -1
- metadata +14 -17
- data/clients/view_builder/builders/builder.js +0 -339
- data/clients/view_builder/builders/button.js +0 -81
- data/clients/view_builder/controllers/document.js +0 -21
- data/clients/view_builder/core.js +0 -19
- data/clients/view_builder/english.lproj/body.css +0 -77
- data/clients/view_builder/english.lproj/body.rhtml +0 -39
- data/clients/view_builder/english.lproj/controls.css +0 -0
- data/clients/view_builder/english.lproj/strings.js +0 -14
- data/clients/view_builder/main.js +0 -38
- data/clients/view_builder/mixins/design_mode.js +0 -92
- data/clients/view_builder/tests/controllers/document.rhtml +0 -20
- data/clients/view_builder/tests/views/builder.rhtml +0 -20
- data/clients/view_builder/tests/views/palette.rhtml +0 -21
- data/clients/view_builder/views/builder.js +0 -26
- data/clients/view_builder/views/palette.js +0 -30
@@ -7,12 +7,13 @@ module SproutCore
|
|
7
7
|
|
8
8
|
module StaticHelper
|
9
9
|
|
10
|
-
# This method will return the HTML to link to all the stylesheets
|
11
|
-
# by the named bundle. If you pass no options, the current
|
12
|
-
# used.
|
10
|
+
# This method will return the HTML to link to all the stylesheets
|
11
|
+
# required by the named bundle. If you pass no options, the current
|
12
|
+
# client will be used.
|
13
13
|
#
|
14
|
-
# bundle_name = the name of the bundle to render or nil to use the
|
15
|
-
# :language => the language to render. defaults to current
|
14
|
+
# bundle_name = the name of the bundle to render or nil to use the
|
15
|
+
# current :language => the language to render. defaults to current
|
16
|
+
# language
|
16
17
|
#
|
17
18
|
def stylesheets_for_client(bundle_name = nil, opts = {})
|
18
19
|
|
@@ -38,11 +39,12 @@ module SproutCore
|
|
38
39
|
urls.join("\n")
|
39
40
|
end
|
40
41
|
|
41
|
-
# This method will return the HTML to link to all the javascripts
|
42
|
-
# by the client. If you pass no options, the current client
|
42
|
+
# This method will return the HTML to link to all the javascripts
|
43
|
+
# required by the client. If you pass no options, the current client
|
44
|
+
# will be used.
|
43
45
|
#
|
44
|
-
# client_name = the name of the client to render or nil to use the
|
45
|
-
# :language => the language to render. defaults to @language.
|
46
|
+
# client_name = the name of the client to render or nil to use the
|
47
|
+
# current :language => the language to render. defaults to @language.
|
46
48
|
#
|
47
49
|
def javascripts_for_client(bundle_name = nil, opts = {})
|
48
50
|
|
@@ -65,6 +67,10 @@ module SproutCore
|
|
65
67
|
urls = urls.map do |url|
|
66
68
|
%( <script type="text/javascript" src="#{url}"></script>)
|
67
69
|
end
|
70
|
+
|
71
|
+
# Add preferred language definition...
|
72
|
+
urls << %(<script type="text/javascript">String.preferredLanguage = "#{language}";</script>)
|
73
|
+
|
68
74
|
urls.join("\n")
|
69
75
|
end
|
70
76
|
|
@@ -74,6 +80,13 @@ module SproutCore
|
|
74
80
|
entry = bundle.find_resource_entry(resource_name, opts)
|
75
81
|
entry.nil? ? '' : entry.url
|
76
82
|
end
|
83
|
+
|
84
|
+
# Localizes the passed string, using the optional passed options.
|
85
|
+
def loc(string, opts = {})
|
86
|
+
opts[:language] ||= language
|
87
|
+
bundle.strings_hash(opts)[string] || string
|
88
|
+
end
|
89
|
+
|
77
90
|
end
|
78
91
|
|
79
92
|
end
|
@@ -70,13 +70,14 @@ module SproutCore
|
|
70
70
|
|
71
71
|
# Get the entry for the resource.
|
72
72
|
entry = current_bundle.entry_for_url(url, :hidden => :include)
|
73
|
-
raise(NotFound, "No matching entry in #{current_bundle.bundle_name}") if entry.nil?
|
73
|
+
raise(NotFound, "No matching entry in #{current_bundle.bundle_name} for #{url}") if entry.nil?
|
74
74
|
|
75
75
|
|
76
76
|
build_path = entry.build_path
|
77
77
|
|
78
|
-
# Found an entry, build the resource. If the resource has already
|
79
|
-
# will not do much. If this the resource is an
|
78
|
+
# Found an entry, build the resource. If the resource has already
|
79
|
+
# been built, this will not do much. If this the resource is an
|
80
|
+
# index.html file, force the build.
|
80
81
|
is_index = /\/index\.html$/ =~ url
|
81
82
|
|
82
83
|
current_bundle.build_entry(entry, :force => is_index, :hidden => :include)
|
data/lib/sproutcore/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sproutcore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Charles Jolley
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-05-
|
12
|
+
date: 2008-05-09 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -48,6 +48,15 @@ dependencies:
|
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: "0"
|
50
50
|
version:
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: mongrel
|
53
|
+
version_requirement:
|
54
|
+
version_requirements: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: "0"
|
59
|
+
version:
|
51
60
|
description: SproutCore - JavaScript Application Framework + Build Tools
|
52
61
|
email:
|
53
62
|
- charles@sproutit.com
|
@@ -106,24 +115,10 @@ files:
|
|
106
115
|
- clients/sc_test_runner/models/test.js
|
107
116
|
- clients/sc_test_runner/views/runner_frame.js
|
108
117
|
- clients/sc_test_runner/views/test_label.js
|
109
|
-
- clients/view_builder/builders/builder.js
|
110
|
-
- clients/view_builder/builders/button.js
|
111
|
-
- clients/view_builder/controllers/document.js
|
112
|
-
- clients/view_builder/core.js
|
113
|
-
- clients/view_builder/english.lproj/body.css
|
114
|
-
- clients/view_builder/english.lproj/body.rhtml
|
115
|
-
- clients/view_builder/english.lproj/controls.css
|
116
|
-
- clients/view_builder/english.lproj/strings.js
|
117
|
-
- clients/view_builder/main.js
|
118
|
-
- clients/view_builder/mixins/design_mode.js
|
119
|
-
- clients/view_builder/tests/controllers/document.rhtml
|
120
|
-
- clients/view_builder/tests/views/builder.rhtml
|
121
|
-
- clients/view_builder/tests/views/palette.rhtml
|
122
|
-
- clients/view_builder/views/builder.js
|
123
|
-
- clients/view_builder/views/palette.js
|
124
118
|
- config/hoe.rb
|
125
119
|
- config/requirements.rb
|
126
120
|
- frameworks/prototype/prototype.js
|
121
|
+
- frameworks/sproutcore/animation/animation.js
|
127
122
|
- frameworks/sproutcore/controllers/array.js
|
128
123
|
- frameworks/sproutcore/controllers/collection.js
|
129
124
|
- frameworks/sproutcore/controllers/controller.js
|
@@ -179,6 +174,7 @@ files:
|
|
179
174
|
- frameworks/sproutcore/foundation/run_loop.js
|
180
175
|
- frameworks/sproutcore/foundation/server.js
|
181
176
|
- frameworks/sproutcore/foundation/set.js
|
177
|
+
- frameworks/sproutcore/foundation/sorted_set.js
|
182
178
|
- frameworks/sproutcore/foundation/string.js
|
183
179
|
- frameworks/sproutcore/foundation/timer.js
|
184
180
|
- frameworks/sproutcore/foundation/undo_manager.js
|
@@ -194,6 +190,7 @@ files:
|
|
194
190
|
- frameworks/sproutcore/lib/index.rhtml
|
195
191
|
- frameworks/sproutcore/lib/menu_views.rb
|
196
192
|
- frameworks/sproutcore/mixins/array.js
|
193
|
+
- frameworks/sproutcore/mixins/collection_view_delegate.js
|
197
194
|
- frameworks/sproutcore/mixins/control.js
|
198
195
|
- frameworks/sproutcore/mixins/delegate_support.js
|
199
196
|
- frameworks/sproutcore/mixins/editable.js
|
@@ -1,339 +0,0 @@
|
|
1
|
-
// ==========================================================================
|
2
|
-
// Basic View Builder
|
3
|
-
// ==========================================================================
|
4
|
-
|
5
|
-
/**
|
6
|
-
A Builder can generate HTML, JavaScript and CSS based on a set of input
|
7
|
-
attributes. It expects to have the following attributes defined:
|
8
|
-
|
9
|
-
- targetClass: The name of the output class for JavaScript purposes.
|
10
|
-
- name: the human readable name
|
11
|
-
- guid: an internally unique id used to identify the resource.
|
12
|
-
|
13
|
-
- htmlTemplate: the html template to render.
|
14
|
-
- tagName: the tag name
|
15
|
-
- htmlId: ID used for tag
|
16
|
-
- cssClassNames: class names to add to tag.
|
17
|
-
- attributes: { src: "item" } -- HTML attrs to include.
|
18
|
-
|
19
|
-
- targetClass: name of output class.
|
20
|
-
- key: name of object when added to parent.
|
21
|
-
- properties: properties to place on JS object.
|
22
|
-
- bind: named bindings. each binding is like:
|
23
|
-
{ to: path, kind: 'SC.Binding.Kind', isEnabled: YES }
|
24
|
-
|
25
|
-
- children: Array of child view builder records, in order. If any.
|
26
|
-
- parent: parent builder or null if top level.
|
27
|
-
- inPage: YES if should be added to SC.page.
|
28
|
-
|
29
|
-
You can add any other properties as well. Use them when your callbacks are
|
30
|
-
invoked to enhance these properties before they are generated.
|
31
|
-
*/
|
32
|
-
SC.Builder = SC.Record.extend({
|
33
|
-
|
34
|
-
_targetClass: 'SC.Object',
|
35
|
-
|
36
|
-
/**
|
37
|
-
Defined by subclasses. If this is true, then the content of the view
|
38
|
-
is the HTML generated by children.
|
39
|
-
*/
|
40
|
-
isContainer: NO,
|
41
|
-
|
42
|
-
/**
|
43
|
-
Defined by subclasses. If true, then views will be generated with an
|
44
|
-
outletFor() attached to them.
|
45
|
-
*/
|
46
|
-
isOutletView: YES,
|
47
|
-
|
48
|
-
childrenType: 'SC.Builder',
|
49
|
-
|
50
|
-
parentType: 'SC.Builder',
|
51
|
-
|
52
|
-
/**
|
53
|
-
The default profile. New records will inherit a cloned set of these
|
54
|
-
attributes.
|
55
|
-
*/
|
56
|
-
defaultAttributes: {
|
57
|
-
propertySettings: {},
|
58
|
-
bindSettings: {},
|
59
|
-
attributeSettings: {},
|
60
|
-
htmlTemplate: '<{%TagName%}{%Attributes%}>{%Content%}</{%TagName%}>',
|
61
|
-
cssClassNames: [],
|
62
|
-
innerHtml: '',
|
63
|
-
lazyOutlet: NO
|
64
|
-
},
|
65
|
-
|
66
|
-
init: function() {
|
67
|
-
arguments.callee.base.apply(this) ;
|
68
|
-
if (this.get('newRecord')) {
|
69
|
-
var attrs = this._deepClone(this.get('defaultAttributes'));
|
70
|
-
attrs.name = attrs.targetClass = this._targetClass ;
|
71
|
-
attrs.guid = attrs.htmlId = 'id%@'.fmt(Date.now().toString());
|
72
|
-
this.updateAttributes(attrs, YES, YES);
|
73
|
-
}
|
74
|
-
},
|
75
|
-
|
76
|
-
/**
|
77
|
-
Invoked just before the attributes are written out. You can add anything
|
78
|
-
you want here.
|
79
|
-
*/
|
80
|
-
prepareAttributes: function(attrs) {
|
81
|
-
return attrs ;
|
82
|
-
},
|
83
|
-
|
84
|
-
/**
|
85
|
-
Invoked just before the class name is set. Add anything you want here.
|
86
|
-
*/
|
87
|
-
prepareClassNames: function(classNames) {
|
88
|
-
return classNames ;
|
89
|
-
},
|
90
|
-
|
91
|
-
/**
|
92
|
-
Invoked just before outlets are added and the final JS is generated. Add
|
93
|
-
anything here you might pull from specialized preferences.
|
94
|
-
*/
|
95
|
-
prepareProperties: function(props) { return props; },
|
96
|
-
|
97
|
-
/**
|
98
|
-
Invoked just before bindings are blended into properties. Add your own.
|
99
|
-
*/
|
100
|
-
prepareBindings: function(binds) { return binds; },
|
101
|
-
|
102
|
-
// ..........................................
|
103
|
-
// HTML RENDERING
|
104
|
-
//
|
105
|
-
|
106
|
-
/**
|
107
|
-
Computes the HTML for this builder. HTML is built by interpolating the
|
108
|
-
htmlTemplate. Any variables must match a corresponding property on the
|
109
|
-
record with 'html' added to the beginning.
|
110
|
-
*/
|
111
|
-
htmlPart: function() {
|
112
|
-
var template = this.get('htmlTemplate') ;
|
113
|
-
if (!template) return null ;
|
114
|
-
|
115
|
-
var that = this;
|
116
|
-
return template.replace(/{%(.+?)%}/g,function(m,p) {
|
117
|
-
return (p[0] == '%') ? p.slice(1,p.length) : that.get('html' + p) ;
|
118
|
-
}) ;
|
119
|
-
}.property('htmlTemplate', 'htmlContent', 'htmlTagName', 'htmlAttributes'),
|
120
|
-
|
121
|
-
/**
|
122
|
-
The tag name for the HTML. Usually specified by tagName in the
|
123
|
-
attributes.
|
124
|
-
*/
|
125
|
-
htmlTagName: function() {
|
126
|
-
return this.get('tagName') || 'div';
|
127
|
-
}.property('tagName'),
|
128
|
-
|
129
|
-
/**
|
130
|
-
The attributes for the HTML. Combines attributes hash, css classes,
|
131
|
-
and id. It then calls prepareAttributes() so you can do any extra
|
132
|
-
processing you need.
|
133
|
-
*/
|
134
|
-
htmlAttributes: function() {
|
135
|
-
// start with attributeSettings.
|
136
|
-
var attrs = this._deepClone(this.get('attributeSettings')) || {} ;
|
137
|
-
|
138
|
-
// add id
|
139
|
-
attrs.id = this.get('htmlId') ;
|
140
|
-
|
141
|
-
// merge in CSS class names
|
142
|
-
var cssClassNames = this.get('cssClassNames') || [] ;
|
143
|
-
if ($type(cssClassNames) === T_STRING) {
|
144
|
-
cssClassNames = cssClassNames.split(' ') ;
|
145
|
-
}
|
146
|
-
|
147
|
-
var cur = attrs['class'] || [] ;
|
148
|
-
if ($type(cur) === T_STRING) {
|
149
|
-
cur = cur.split(' ') ;
|
150
|
-
}
|
151
|
-
|
152
|
-
cur = cur.concat(cssClassNames).uniq().compact().sort() ;
|
153
|
-
cur.push(attrs.id) ;
|
154
|
-
cur = this.prepareClassNames(cur) || cur;
|
155
|
-
if (cur.length > 0) {
|
156
|
-
attrs['class'] = cur.join(' ') ;
|
157
|
-
} else delete attrs['class'] ;
|
158
|
-
|
159
|
-
attrs = this.prepareAttributes(attrs) || attrs ;
|
160
|
-
|
161
|
-
// now convert to a string.
|
162
|
-
var ret = [''];
|
163
|
-
for(var key in attrs) {
|
164
|
-
if (!attrs.hasOwnProperty(key)) continue ;
|
165
|
-
ret.push('%@="%@"'.fmt(key, attrs[key])) ;
|
166
|
-
}
|
167
|
-
|
168
|
-
return (ret.length > 1) ? ret.join(' ') : '';
|
169
|
-
}.property('cssClassNames', 'attributeSettings', 'htmlId'),
|
170
|
-
|
171
|
-
/**
|
172
|
-
The inner content for the HTML. If isContainer is true, then we get
|
173
|
-
the children for this view and use their HTML, otherwise get the
|
174
|
-
innerHtml property.
|
175
|
-
*/
|
176
|
-
htmlContent: function() {
|
177
|
-
if (this.get('isContainer')) {
|
178
|
-
var children = this.get('children') || [] ;
|
179
|
-
var ret = [];
|
180
|
-
for(var idx=0;idx<children.length;idx++) {
|
181
|
-
var child = children.objectAt(idx) ;
|
182
|
-
ret.push(child.get('htmlPart')) ;
|
183
|
-
}
|
184
|
-
|
185
|
-
return ret.join('') ;
|
186
|
-
} else return this.get('innerHtml') ;
|
187
|
-
}.property('innerHtml', 'isContainer', 'children'),
|
188
|
-
|
189
|
-
// ..........................................
|
190
|
-
// JAVASCRIPT RENDERING
|
191
|
-
//
|
192
|
-
|
193
|
-
/**
|
194
|
-
Generates the JavaScript for this part.
|
195
|
-
|
196
|
-
This works by merging the propertySettings and bindSettings. Then it
|
197
|
-
calls your prepareProperties and finally merges in any outlets. With the
|
198
|
-
properties combined, it then generates the code to build a view.
|
199
|
-
*/
|
200
|
-
javascriptPart: function() {
|
201
|
-
var props = this.get('javascriptProperties') ;
|
202
|
-
|
203
|
-
var outlets = this.get('javascriptOutlets') ;
|
204
|
-
for(var key in outlets) {
|
205
|
-
if (!outlets.hasOwnProperty(key)) continue ;
|
206
|
-
props[key] = outlets[key] ;
|
207
|
-
}
|
208
|
-
|
209
|
-
var outletDeclaration = '' ;
|
210
|
-
var verb = 'create' ;
|
211
|
-
if (this.get('isOutletView')) {
|
212
|
-
verb = 'extend' ;
|
213
|
-
outletDeclaration = '.outletFor(".%@?")'.fmt(this.get('htmlId'));
|
214
|
-
}
|
215
|
-
|
216
|
-
return '%@.%@(%@)%@'.fmt(this.get('targetClass'), verb, this._stringify(props), outletDeclaration) ;
|
217
|
-
}.property(),
|
218
|
-
|
219
|
-
/**
|
220
|
-
Generates the properties for the JavaScript sans any outlets.
|
221
|
-
*/
|
222
|
-
javascriptProperties: function() {
|
223
|
-
var props = this._deepClone(this.get('propertySettings')) ;
|
224
|
-
props = this.prepareProperties(props) || props ;
|
225
|
-
|
226
|
-
var binds = this._deepClone(this.get('bindSettings')) ;
|
227
|
-
binds = this.prepareBindings(binds) || binds ;
|
228
|
-
for(var key in binds) {
|
229
|
-
if (!binds.hasOwnProperty(key)) continue ;
|
230
|
-
|
231
|
-
var bind = binds[key] ;
|
232
|
-
if (!bind.isEnabled) continue ;
|
233
|
-
bind = (bind.kind) ? "%@('%@')".fmt(bind.kind, bind.to) : "'%@'".fmt(bind.to) ;
|
234
|
-
props[key + 'Binding'] = bind ;
|
235
|
-
}
|
236
|
-
|
237
|
-
return props ;
|
238
|
-
}.property(),
|
239
|
-
|
240
|
-
/**
|
241
|
-
Generates the outlet properties for the JavaScript.
|
242
|
-
*/
|
243
|
-
javascriptOutlets: function() {
|
244
|
-
var ret = {} ;
|
245
|
-
var outlets = [] ;
|
246
|
-
|
247
|
-
// loop through children.
|
248
|
-
var children = this.get('children') || [];
|
249
|
-
var idx = children.length ;
|
250
|
-
if (idx <= 0) return {} ;
|
251
|
-
while(--idx >= 0) {
|
252
|
-
var child = children.objectAt(idx) ;
|
253
|
-
var outletName = child.get('outletName') ;
|
254
|
-
var js = child.get('javascriptPart') ;
|
255
|
-
ret[outletName] = js ;
|
256
|
-
if (!child.get('lazyOutlet')) outlets.push(outletName) ;
|
257
|
-
}
|
258
|
-
|
259
|
-
ret.outlets = outletName ;
|
260
|
-
return ret ;
|
261
|
-
}.property(),
|
262
|
-
|
263
|
-
outletName: function(key, value) {
|
264
|
-
if (value !== undefined) this.writeAttribute('outletName', value) ;
|
265
|
-
return this.readAttribute('outletName') || this.get('htmlId') ;
|
266
|
-
}.property(),
|
267
|
-
|
268
|
-
// ..........................................
|
269
|
-
// INTERNAL METHODS
|
270
|
-
//
|
271
|
-
|
272
|
-
// deep clones a hash of properties. expects only Hash, Array or
|
273
|
-
// primitives.
|
274
|
-
_deepClone: function(obj) {
|
275
|
-
var ret = obj ;
|
276
|
-
|
277
|
-
switch($type(obj)) {
|
278
|
-
case T_HASH:
|
279
|
-
ret = {} ;
|
280
|
-
for(var key in obj) {
|
281
|
-
if (!obj.hasOwnProperty(key)) continue ;
|
282
|
-
ret[key] = this._deepClone(obj[key]) ;
|
283
|
-
}
|
284
|
-
break ;
|
285
|
-
case T_ARRAY:
|
286
|
-
ret = [] ;
|
287
|
-
for(var idx=0;idx < obj.length; idx++) {
|
288
|
-
ret.push(this._deepClone(obj[idx])) ;
|
289
|
-
}
|
290
|
-
break ;
|
291
|
-
}
|
292
|
-
return ret ;
|
293
|
-
},
|
294
|
-
|
295
|
-
// converts the input object into a eval-able string
|
296
|
-
_stringify: function(obj) {
|
297
|
-
var ret = obj ;
|
298
|
-
switch($type(obj)) {
|
299
|
-
case T_HASH:
|
300
|
-
ret = [] ;
|
301
|
-
for(var key in obj) {
|
302
|
-
if (!obj.hasOwnProperty(key)) continue ;
|
303
|
-
ret.push([key, this._stringify(obj[key])].join(': ')) ;
|
304
|
-
}
|
305
|
-
ret = "{ %@ }".fmt(ret.join(",\n ")) ;
|
306
|
-
break ;
|
307
|
-
|
308
|
-
case T_ARRAY:
|
309
|
-
ret = [] ;
|
310
|
-
for(var idx=0; idx < obj.length; idx++) {
|
311
|
-
ret.push(this._stringify(obj[idx])) ;
|
312
|
-
}
|
313
|
-
ret = '[%@]'.fmt(ret.join(', ')) ;
|
314
|
-
break ;
|
315
|
-
|
316
|
-
case T_NULL:
|
317
|
-
ret = 'null' ;
|
318
|
-
break ;
|
319
|
-
|
320
|
-
// Strings can be either property paths or quoted strings. They are
|
321
|
-
// quoted strings if they are in "quotes". If they are strings they
|
322
|
-
// should be already quoted, etc.
|
323
|
-
case T_STRING:
|
324
|
-
ret = obj ;
|
325
|
-
break ;
|
326
|
-
|
327
|
-
default:
|
328
|
-
ret = (obj.toString) ? obj.toString() : obj ;
|
329
|
-
}
|
330
|
-
return ret ;
|
331
|
-
}
|
332
|
-
|
333
|
-
}) ;
|
334
|
-
|
335
|
-
SC.Builder.newBuilder = function(attrs) {
|
336
|
-
if (!attrs) attrs = {} ;
|
337
|
-
attrs.newRecord = YES ;
|
338
|
-
return this.create(attrs) ;
|
339
|
-
} ;
|