clearwater 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/clearwater/version.rb +1 -1
- data/opal/clearwater/application.rb +8 -15
- data/opal/clearwater/cached_render.rb +5 -5
- data/opal/clearwater/component.rb +4 -7
- data/opal/clearwater/link.rb +1 -0
- data/opal/clearwater/router.rb +6 -6
- data/opal/clearwater/svg_component.rb +111 -0
- data/opal/clearwater/virtual_dom/js/virtual_dom.js +568 -35
- data/opal/clearwater/virtual_dom.rb +10 -0
- data/opal/clearwater.rb +2 -0
- data/spec/clearwater/application_spec.rb +18 -2
- data/spec/component_spec.rb +3 -3
- metadata +3 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de7a25a8617f75d57327653aa98374069ea6d115
|
4
|
+
data.tar.gz: a385d64e3b234b18d281addcec1618d415e7a19f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db776bfa51cc49a40ab37dc55f30684af26cefd100c93fa0c603c7fceb323bf17b8b71cceea5e434cfea01193c8b633f1355635c777efbba3189173248d53bf5
|
7
|
+
data.tar.gz: b6098e4a9f2497cdf17f8533d8ef085a1c1e4bd7f92751571667ff97ff4b0e9902de0ae476d6783e13d1959d071de36842ea47f266ed8c53daf6ff02d89111ab
|
data/lib/clearwater/version.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
require 'clearwater/router'
|
2
|
-
require 'clearwater/application_registry'
|
3
1
|
require 'browser'
|
4
2
|
require 'browser/delay'
|
5
|
-
require 'native'
|
6
3
|
require 'browser/event'
|
7
4
|
require 'browser/animation_frame'
|
5
|
+
require 'clearwater/router'
|
6
|
+
require 'clearwater/application_registry'
|
7
|
+
require 'native'
|
8
8
|
|
9
9
|
module Clearwater
|
10
10
|
class Application
|
11
11
|
AppRegistry = ApplicationRegistry.new
|
12
12
|
|
13
|
-
attr_reader :
|
13
|
+
attr_reader :router, :component, :api_client, :on_render
|
14
14
|
|
15
15
|
def self.render
|
16
16
|
AppRegistry.render_all
|
@@ -43,8 +43,8 @@ module Clearwater
|
|
43
43
|
|
44
44
|
def watch_url
|
45
45
|
unless @watching_url
|
46
|
-
@watching_url = true
|
47
46
|
@window.on('popstate') { render_current_url }
|
47
|
+
@watching_url = true
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -59,7 +59,7 @@ module Clearwater
|
|
59
59
|
@will_render = true
|
60
60
|
|
61
61
|
# If the app isn't being shown, wait to render until it is.
|
62
|
-
if
|
62
|
+
if `!!#@document.hidden`
|
63
63
|
@render_on_visibility_change = true
|
64
64
|
return
|
65
65
|
end
|
@@ -70,13 +70,7 @@ module Clearwater
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def element
|
73
|
-
@element ||=
|
74
|
-
if @document.body
|
75
|
-
@document.body
|
76
|
-
else
|
77
|
-
nil
|
78
|
-
end
|
79
|
-
end
|
73
|
+
@element ||= @document.body ? @document.body : nil
|
80
74
|
end
|
81
75
|
|
82
76
|
def benchmark message
|
@@ -104,9 +98,8 @@ module Clearwater
|
|
104
98
|
raise TypeError, "Cannot render to a non-existent element. Make sure the document ready event has been triggered before invoking the application."
|
105
99
|
end
|
106
100
|
|
107
|
-
rendered = benchmark('Generated virtual DOM') { component.render }
|
101
|
+
rendered = benchmark('Generated virtual DOM') { Component.sanitize_content(component.render) }
|
108
102
|
benchmark('Rendered to actual DOM') { virtual_dom.render rendered }
|
109
|
-
@last_render = Time.now
|
110
103
|
@will_render = false
|
111
104
|
run_callbacks
|
112
105
|
nil
|
@@ -1,17 +1,17 @@
|
|
1
|
+
require 'clearwater/component'
|
2
|
+
|
1
3
|
module Clearwater
|
2
4
|
module CachedRender
|
3
|
-
|
4
5
|
def self.included base
|
5
6
|
%x{
|
6
|
-
Opal.defn(
|
7
|
-
Opal.defn(
|
7
|
+
Opal.defn(self, 'type', 'Thunk');
|
8
|
+
Opal.defn(self, 'render', function(prev) {
|
8
9
|
var self = this;
|
9
|
-
var should_render;
|
10
10
|
|
11
11
|
if(prev && prev.vnode && #{!should_render?(`prev`)}) {
|
12
12
|
return prev.vnode;
|
13
13
|
} else {
|
14
|
-
return #{sanitize_content(render)};
|
14
|
+
return #{Component.sanitize_content(render)};
|
15
15
|
}
|
16
16
|
});
|
17
17
|
}
|
@@ -136,8 +136,8 @@ module Clearwater
|
|
136
136
|
|
137
137
|
VirtualDOM.node(
|
138
138
|
tag_name,
|
139
|
-
sanitize_attributes(attributes),
|
140
|
-
sanitize_content(content)
|
139
|
+
Component.sanitize_attributes(attributes),
|
140
|
+
Component.sanitize_content(content)
|
141
141
|
)
|
142
142
|
end
|
143
143
|
|
@@ -145,7 +145,7 @@ module Clearwater
|
|
145
145
|
router.params_for_path(router.current_path)
|
146
146
|
end
|
147
147
|
|
148
|
-
def sanitize_attributes attributes
|
148
|
+
def self.sanitize_attributes attributes
|
149
149
|
return attributes unless attributes.is_a? Hash
|
150
150
|
|
151
151
|
# Allow specifying `class` instead of `class_name`.
|
@@ -170,15 +170,12 @@ module Clearwater
|
|
170
170
|
attributes
|
171
171
|
end
|
172
172
|
|
173
|
-
def sanitize_content content
|
173
|
+
def self.sanitize_content content
|
174
174
|
%x{
|
175
175
|
if(content && content.$$class) {
|
176
176
|
if(content.$$class === Opal.Array) {
|
177
177
|
return #{content.map { |c| `self.$sanitize_content(c)` }};
|
178
|
-
} else if(content === Opal.nil) {
|
179
|
-
return '';
|
180
178
|
} else {
|
181
|
-
var cached_render = content.$cached_render;
|
182
179
|
var render = content.$render;
|
183
180
|
|
184
181
|
if(content.type === 'Thunk' && typeof(content.render) === 'function') {
|
data/opal/clearwater/link.rb
CHANGED
data/opal/clearwater/router.rb
CHANGED
@@ -35,15 +35,15 @@ module Clearwater
|
|
35
35
|
def params_for_path path
|
36
36
|
path_parts = path.split("/").reject(&:empty?)
|
37
37
|
canonical_parts = canonical_path_for_path(path).split("/").reject(&:empty?)
|
38
|
-
|
39
|
-
canonical_parts.
|
40
|
-
.each_with_index { |(part, params), index|
|
38
|
+
|
39
|
+
canonical_parts.each_with_index.reduce({}) { |params, (part, index)|
|
41
40
|
if part.start_with? ":"
|
42
|
-
param = part[1..-1]
|
43
|
-
params
|
41
|
+
param = part[1..-1]
|
42
|
+
params.merge! param => path_parts[index]
|
43
|
+
else
|
44
|
+
params
|
44
45
|
end
|
45
46
|
}
|
46
|
-
params
|
47
47
|
end
|
48
48
|
|
49
49
|
def canonical_path
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'clearwater/component'
|
2
|
+
require 'clearwater/virtual_dom'
|
3
|
+
|
4
|
+
module Clearwater
|
5
|
+
module SVGComponent
|
6
|
+
def render
|
7
|
+
end
|
8
|
+
|
9
|
+
SVG_TAGS = {
|
10
|
+
a: 'a',
|
11
|
+
alt_glyph: 'altGlyph',
|
12
|
+
alt_glyph_def: 'altGlyphDef',
|
13
|
+
alt_glyph_item: 'altGlyphItem',
|
14
|
+
animate: 'animate',
|
15
|
+
animate_color: 'animateColor',
|
16
|
+
animate_motion: 'animateMotion',
|
17
|
+
animate_transform: 'animateTransform',
|
18
|
+
circle: 'circle',
|
19
|
+
clip_path: 'clipPath',
|
20
|
+
color_profile: 'color-profile',
|
21
|
+
cursor: 'cursor',
|
22
|
+
defs: 'defs',
|
23
|
+
desc: 'desc',
|
24
|
+
ellipse: 'ellipse',
|
25
|
+
fe_blend: 'feBlend',
|
26
|
+
fe_color_matrix: 'feColorMatrix',
|
27
|
+
fe_component_transfer: 'feComponentTransfer',
|
28
|
+
fe_composite: 'feComposite',
|
29
|
+
fe_convolve_matrix: 'feConvolveMatrix',
|
30
|
+
fe_diffuse_lighting: 'feDiffuseLighting',
|
31
|
+
fe_displacement_map: 'feDisplacementMap',
|
32
|
+
fe_distant_light: 'feDistantLight',
|
33
|
+
fe_flood: 'feFlood',
|
34
|
+
fe_func_a: 'feFuncA',
|
35
|
+
fe_func_b: 'feFuncB',
|
36
|
+
fe_func_g: 'feFuncG',
|
37
|
+
fe_func_r: 'feFuncR',
|
38
|
+
fe_gaussian_blur: 'feGaussianBlur',
|
39
|
+
fe_image: 'feImage',
|
40
|
+
fe_merge: 'feMerge',
|
41
|
+
fe_merge_node: 'feMergeNode',
|
42
|
+
fe_morphology: 'feMorphology',
|
43
|
+
fe_offset: 'feOffset',
|
44
|
+
fe_point_light: 'fePointLight',
|
45
|
+
fe_specular_lighting: 'feSpecularLighting',
|
46
|
+
fe_spot_light: 'feSpotLight',
|
47
|
+
fe_tile: 'feTile',
|
48
|
+
fe_turbulence: 'feTurbulence',
|
49
|
+
filter: 'filter',
|
50
|
+
font: 'font',
|
51
|
+
font_face: 'font-face',
|
52
|
+
font_face_format: 'font-face-format',
|
53
|
+
font_face_name: 'font-face-name',
|
54
|
+
font_face_src: 'font-face-src',
|
55
|
+
font_face_uri: 'font-face-uri',
|
56
|
+
foreign_object: 'foreignObject',
|
57
|
+
g: 'g',
|
58
|
+
glyph: 'glyph',
|
59
|
+
glyph_ref: 'glyphRef',
|
60
|
+
hkern: 'hkern',
|
61
|
+
image: 'image',
|
62
|
+
line: 'line',
|
63
|
+
linear_gradient: 'linearGradient',
|
64
|
+
marker: 'marker',
|
65
|
+
mask: 'mask',
|
66
|
+
metadata: 'metadata',
|
67
|
+
missing_glyph: 'missing-glyph',
|
68
|
+
mpath: 'mpath',
|
69
|
+
path: 'path',
|
70
|
+
pattern: 'pattern',
|
71
|
+
polygon: 'polygon',
|
72
|
+
polyline: 'polyline',
|
73
|
+
radial_gradient: 'radialGradient',
|
74
|
+
rect: 'rect',
|
75
|
+
script: 'script',
|
76
|
+
set: 'set',
|
77
|
+
stop: 'stop',
|
78
|
+
style: 'style',
|
79
|
+
svg: 'svg',
|
80
|
+
switch: 'switch',
|
81
|
+
symbol: 'symbol',
|
82
|
+
text: 'text',
|
83
|
+
text_path: 'textPath',
|
84
|
+
title: 'title',
|
85
|
+
tref: 'tref',
|
86
|
+
tspan: 'tspan',
|
87
|
+
use: 'use',
|
88
|
+
view: 'view',
|
89
|
+
vkern: 'vkern',
|
90
|
+
}
|
91
|
+
|
92
|
+
SVG_TAGS.each do |method_name, tag_name|
|
93
|
+
define_method(method_name) do |attributes, content|
|
94
|
+
tag(tag_name, attributes, content)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def tag tag_name, attributes=nil, content=nil
|
99
|
+
if !(`attributes.$$is_hash || attributes === #{nil}`)
|
100
|
+
content = attributes
|
101
|
+
attributes = nil
|
102
|
+
end
|
103
|
+
|
104
|
+
VirtualDOM.svg(
|
105
|
+
tag_name,
|
106
|
+
Component.sanitize_attributes(attributes),
|
107
|
+
Component.sanitize_content(content),
|
108
|
+
)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -3,23 +3,24 @@ var createElement = require("./vdom/create-element.js")
|
|
3
3
|
|
4
4
|
module.exports = createElement
|
5
5
|
|
6
|
-
},{"./vdom/create-element.js":
|
6
|
+
},{"./vdom/create-element.js":14}],2:[function(require,module,exports){
|
7
7
|
var diff = require("./vtree/diff.js")
|
8
8
|
|
9
9
|
module.exports = diff
|
10
10
|
|
11
|
-
},{"./vtree/diff.js":
|
11
|
+
},{"./vtree/diff.js":37}],3:[function(require,module,exports){
|
12
12
|
var h = require("./virtual-hyperscript/index.js")
|
13
13
|
|
14
14
|
module.exports = h
|
15
15
|
|
16
|
-
},{"./virtual-hyperscript/index.js":
|
16
|
+
},{"./virtual-hyperscript/index.js":22}],4:[function(require,module,exports){
|
17
17
|
var diff = require("./diff.js")
|
18
18
|
var patch = require("./patch.js")
|
19
19
|
var h = require("./h.js")
|
20
20
|
var create = require("./create-element.js")
|
21
21
|
var VNode = require('./vnode/vnode.js')
|
22
22
|
var VText = require('./vnode/vtext.js')
|
23
|
+
var svg = require("./virtual-hyperscript/svg.js")
|
23
24
|
|
24
25
|
module.exports = {
|
25
26
|
diff: diff,
|
@@ -27,10 +28,119 @@ module.exports = {
|
|
27
28
|
h: h,
|
28
29
|
create: create,
|
29
30
|
VNode: VNode,
|
30
|
-
VText: VText
|
31
|
+
VText: VText,
|
32
|
+
svg: svg,
|
31
33
|
}
|
32
34
|
|
33
|
-
},{"./create-element.js":1,"./diff.js":2,"./h.js":3,"./patch.js":
|
35
|
+
},{"./create-element.js":1,"./diff.js":2,"./h.js":3,"./patch.js":12,"./virtual-hyperscript/svg.js":25,"./vnode/vnode.js":33,"./vnode/vtext.js":35}],5:[function(require,module,exports){
|
36
|
+
/*!
|
37
|
+
* Cross-Browser Split 1.1.1
|
38
|
+
* Copyright 2007-2012 Steven Levithan <stevenlevithan.com>
|
39
|
+
* Available under the MIT License
|
40
|
+
* ECMAScript compliant, uniform cross-browser split method
|
41
|
+
*/
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Splits a string into an array of strings using a regex or string separator. Matches of the
|
45
|
+
* separator are not included in the result array. However, if `separator` is a regex that contains
|
46
|
+
* capturing groups, backreferences are spliced into the result each time `separator` is matched.
|
47
|
+
* Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably
|
48
|
+
* cross-browser.
|
49
|
+
* @param {String} str String to split.
|
50
|
+
* @param {RegExp|String} separator Regex or string to use for separating the string.
|
51
|
+
* @param {Number} [limit] Maximum number of items to include in the result array.
|
52
|
+
* @returns {Array} Array of substrings.
|
53
|
+
* @example
|
54
|
+
*
|
55
|
+
* // Basic use
|
56
|
+
* split('a b c d', ' ');
|
57
|
+
* // -> ['a', 'b', 'c', 'd']
|
58
|
+
*
|
59
|
+
* // With limit
|
60
|
+
* split('a b c d', ' ', 2);
|
61
|
+
* // -> ['a', 'b']
|
62
|
+
*
|
63
|
+
* // Backreferences in result array
|
64
|
+
* split('..word1 word2..', /([a-z]+)(\d+)/i);
|
65
|
+
* // -> ['..', 'word', '1', ' ', 'word', '2', '..']
|
66
|
+
*/
|
67
|
+
module.exports = (function split(undef) {
|
68
|
+
|
69
|
+
var nativeSplit = String.prototype.split,
|
70
|
+
compliantExecNpcg = /()??/.exec("")[1] === undef,
|
71
|
+
// NPCG: nonparticipating capturing group
|
72
|
+
self;
|
73
|
+
|
74
|
+
self = function(str, separator, limit) {
|
75
|
+
// If `separator` is not a regex, use `nativeSplit`
|
76
|
+
if (Object.prototype.toString.call(separator) !== "[object RegExp]") {
|
77
|
+
return nativeSplit.call(str, separator, limit);
|
78
|
+
}
|
79
|
+
var output = [],
|
80
|
+
flags = (separator.ignoreCase ? "i" : "") + (separator.multiline ? "m" : "") + (separator.extended ? "x" : "") + // Proposed for ES6
|
81
|
+
(separator.sticky ? "y" : ""),
|
82
|
+
// Firefox 3+
|
83
|
+
lastLastIndex = 0,
|
84
|
+
// Make `global` and avoid `lastIndex` issues by working with a copy
|
85
|
+
separator = new RegExp(separator.source, flags + "g"),
|
86
|
+
separator2, match, lastIndex, lastLength;
|
87
|
+
str += ""; // Type-convert
|
88
|
+
if (!compliantExecNpcg) {
|
89
|
+
// Doesn't need flags gy, but they don't hurt
|
90
|
+
separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags);
|
91
|
+
}
|
92
|
+
/* Values for `limit`, per the spec:
|
93
|
+
* If undefined: 4294967295 // Math.pow(2, 32) - 1
|
94
|
+
* If 0, Infinity, or NaN: 0
|
95
|
+
* If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;
|
96
|
+
* If negative number: 4294967296 - Math.floor(Math.abs(limit))
|
97
|
+
* If other: Type-convert, then use the above rules
|
98
|
+
*/
|
99
|
+
limit = limit === undef ? -1 >>> 0 : // Math.pow(2, 32) - 1
|
100
|
+
limit >>> 0; // ToUint32(limit)
|
101
|
+
while (match = separator.exec(str)) {
|
102
|
+
// `separator.lastIndex` is not reliable cross-browser
|
103
|
+
lastIndex = match.index + match[0].length;
|
104
|
+
if (lastIndex > lastLastIndex) {
|
105
|
+
output.push(str.slice(lastLastIndex, match.index));
|
106
|
+
// Fix browsers whose `exec` methods don't consistently return `undefined` for
|
107
|
+
// nonparticipating capturing groups
|
108
|
+
if (!compliantExecNpcg && match.length > 1) {
|
109
|
+
match[0].replace(separator2, function() {
|
110
|
+
for (var i = 1; i < arguments.length - 2; i++) {
|
111
|
+
if (arguments[i] === undef) {
|
112
|
+
match[i] = undef;
|
113
|
+
}
|
114
|
+
}
|
115
|
+
});
|
116
|
+
}
|
117
|
+
if (match.length > 1 && match.index < str.length) {
|
118
|
+
Array.prototype.push.apply(output, match.slice(1));
|
119
|
+
}
|
120
|
+
lastLength = match[0].length;
|
121
|
+
lastLastIndex = lastIndex;
|
122
|
+
if (output.length >= limit) {
|
123
|
+
break;
|
124
|
+
}
|
125
|
+
}
|
126
|
+
if (separator.lastIndex === match.index) {
|
127
|
+
separator.lastIndex++; // Avoid an infinite loop
|
128
|
+
}
|
129
|
+
}
|
130
|
+
if (lastLastIndex === str.length) {
|
131
|
+
if (lastLength || !separator.test("")) {
|
132
|
+
output.push("");
|
133
|
+
}
|
134
|
+
} else {
|
135
|
+
output.push(str.slice(lastLastIndex));
|
136
|
+
}
|
137
|
+
return output.length > limit ? output.slice(0, limit) : output;
|
138
|
+
};
|
139
|
+
|
140
|
+
return self;
|
141
|
+
})();
|
142
|
+
|
143
|
+
},{}],6:[function(require,module,exports){
|
34
144
|
'use strict';
|
35
145
|
|
36
146
|
var OneVersionConstraint = require('individual/one-version');
|
@@ -52,7 +162,7 @@ function EvStore(elem) {
|
|
52
162
|
return hash;
|
53
163
|
}
|
54
164
|
|
55
|
-
},{"individual/one-version":
|
165
|
+
},{"individual/one-version":8}],7:[function(require,module,exports){
|
56
166
|
(function (global){
|
57
167
|
'use strict';
|
58
168
|
|
@@ -75,7 +185,7 @@ function Individual(key, value) {
|
|
75
185
|
}
|
76
186
|
|
77
187
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
78
|
-
},{}],
|
188
|
+
},{}],8:[function(require,module,exports){
|
79
189
|
'use strict';
|
80
190
|
|
81
191
|
var Individual = require('./index.js');
|
@@ -99,7 +209,7 @@ function OneVersion(moduleName, version, defaultValue) {
|
|
99
209
|
return Individual(key, defaultValue);
|
100
210
|
}
|
101
211
|
|
102
|
-
},{"./index.js":
|
212
|
+
},{"./index.js":7}],9:[function(require,module,exports){
|
103
213
|
(function (global){
|
104
214
|
var topLevel = typeof global !== 'undefined' ? global :
|
105
215
|
typeof window !== 'undefined' ? window : {}
|
@@ -118,14 +228,14 @@ if (typeof document !== 'undefined') {
|
|
118
228
|
}
|
119
229
|
|
120
230
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
121
|
-
},{"min-document":
|
231
|
+
},{"min-document":38}],10:[function(require,module,exports){
|
122
232
|
"use strict";
|
123
233
|
|
124
234
|
module.exports = function isObject(x) {
|
125
235
|
return typeof x === "object" && x !== null;
|
126
236
|
};
|
127
237
|
|
128
|
-
},{}],
|
238
|
+
},{}],11:[function(require,module,exports){
|
129
239
|
var nativeIsArray = Array.isArray
|
130
240
|
var toString = Object.prototype.toString
|
131
241
|
|
@@ -135,12 +245,12 @@ function isArray(obj) {
|
|
135
245
|
return toString.call(obj) === "[object Array]"
|
136
246
|
}
|
137
247
|
|
138
|
-
},{}],
|
248
|
+
},{}],12:[function(require,module,exports){
|
139
249
|
var patch = require("./vdom/patch.js")
|
140
250
|
|
141
251
|
module.exports = patch
|
142
252
|
|
143
|
-
},{"./vdom/patch.js":
|
253
|
+
},{"./vdom/patch.js":17}],13:[function(require,module,exports){
|
144
254
|
var isObject = require("is-object")
|
145
255
|
var isHook = require("../vnode/is-vhook.js")
|
146
256
|
|
@@ -239,7 +349,7 @@ function getPrototype(value) {
|
|
239
349
|
}
|
240
350
|
}
|
241
351
|
|
242
|
-
},{"../vnode/is-vhook.js":
|
352
|
+
},{"../vnode/is-vhook.js":28,"is-object":10}],14:[function(require,module,exports){
|
243
353
|
var document = require("global/document")
|
244
354
|
|
245
355
|
var applyProperties = require("./apply-properties")
|
@@ -287,7 +397,7 @@ function createElement(vnode, opts) {
|
|
287
397
|
return node
|
288
398
|
}
|
289
399
|
|
290
|
-
},{"../vnode/handle-thunk.js":
|
400
|
+
},{"../vnode/handle-thunk.js":26,"../vnode/is-vnode.js":29,"../vnode/is-vtext.js":30,"../vnode/is-widget.js":31,"./apply-properties":13,"global/document":9}],15:[function(require,module,exports){
|
291
401
|
// Maps a virtual DOM tree onto a real DOM tree in an efficient manner.
|
292
402
|
// We don't want to read all of the DOM nodes in the tree so we use
|
293
403
|
// the in-order tree indexing to eliminate recursion down certain branches.
|
@@ -374,7 +484,7 @@ function ascending(a, b) {
|
|
374
484
|
return a > b ? 1 : -1
|
375
485
|
}
|
376
486
|
|
377
|
-
},{}],
|
487
|
+
},{}],16:[function(require,module,exports){
|
378
488
|
var applyProperties = require("./apply-properties")
|
379
489
|
|
380
490
|
var isWidget = require("../vnode/is-widget.js")
|
@@ -527,7 +637,7 @@ function replaceRoot(oldRoot, newRoot) {
|
|
527
637
|
return newRoot;
|
528
638
|
}
|
529
639
|
|
530
|
-
},{"../vnode/is-widget.js":
|
640
|
+
},{"../vnode/is-widget.js":31,"../vnode/vpatch.js":34,"./apply-properties":13,"./update-widget":18}],17:[function(require,module,exports){
|
531
641
|
var document = require("global/document")
|
532
642
|
var isArray = require("x-is-array")
|
533
643
|
|
@@ -538,7 +648,9 @@ module.exports = patch
|
|
538
648
|
|
539
649
|
function patch(rootNode, patches, renderOptions) {
|
540
650
|
renderOptions = renderOptions || {}
|
541
|
-
renderOptions.patch = renderOptions.patch
|
651
|
+
renderOptions.patch = renderOptions.patch && renderOptions.patch !== patch
|
652
|
+
? renderOptions.patch
|
653
|
+
: patchRecursive
|
542
654
|
renderOptions.render = renderOptions.render || render
|
543
655
|
|
544
656
|
return renderOptions.patch(rootNode, patches, renderOptions)
|
@@ -607,7 +719,7 @@ function patchIndices(patches) {
|
|
607
719
|
return indices
|
608
720
|
}
|
609
721
|
|
610
|
-
},{"./create-element":
|
722
|
+
},{"./create-element":14,"./dom-index":15,"./patch-op":16,"global/document":9,"x-is-array":11}],18:[function(require,module,exports){
|
611
723
|
var isWidget = require("../vnode/is-widget.js")
|
612
724
|
|
613
725
|
module.exports = updateWidget
|
@@ -624,7 +736,44 @@ function updateWidget(a, b) {
|
|
624
736
|
return false
|
625
737
|
}
|
626
738
|
|
627
|
-
},{"../vnode/is-widget.js":
|
739
|
+
},{"../vnode/is-widget.js":31}],19:[function(require,module,exports){
|
740
|
+
'use strict';
|
741
|
+
|
742
|
+
module.exports = AttributeHook;
|
743
|
+
|
744
|
+
function AttributeHook(namespace, value) {
|
745
|
+
if (!(this instanceof AttributeHook)) {
|
746
|
+
return new AttributeHook(namespace, value);
|
747
|
+
}
|
748
|
+
|
749
|
+
this.namespace = namespace;
|
750
|
+
this.value = value;
|
751
|
+
}
|
752
|
+
|
753
|
+
AttributeHook.prototype.hook = function (node, prop, prev) {
|
754
|
+
if (prev && prev.type === 'AttributeHook' &&
|
755
|
+
prev.value === this.value &&
|
756
|
+
prev.namespace === this.namespace) {
|
757
|
+
return;
|
758
|
+
}
|
759
|
+
|
760
|
+
node.setAttributeNS(this.namespace, prop, this.value);
|
761
|
+
};
|
762
|
+
|
763
|
+
AttributeHook.prototype.unhook = function (node, prop, next) {
|
764
|
+
if (next && next.type === 'AttributeHook' &&
|
765
|
+
next.namespace === this.namespace) {
|
766
|
+
return;
|
767
|
+
}
|
768
|
+
|
769
|
+
var colonPosition = prop.indexOf(':');
|
770
|
+
var localName = colonPosition > -1 ? prop.substr(colonPosition + 1) : prop;
|
771
|
+
node.removeAttributeNS(this.namespace, localName);
|
772
|
+
};
|
773
|
+
|
774
|
+
AttributeHook.prototype.type = 'AttributeHook';
|
775
|
+
|
776
|
+
},{}],20:[function(require,module,exports){
|
628
777
|
'use strict';
|
629
778
|
|
630
779
|
var EvStore = require('ev-store');
|
@@ -653,7 +802,7 @@ EvHook.prototype.unhook = function(node, propertyName) {
|
|
653
802
|
es[propName] = undefined;
|
654
803
|
};
|
655
804
|
|
656
|
-
},{"ev-store":
|
805
|
+
},{"ev-store":6}],21:[function(require,module,exports){
|
657
806
|
'use strict';
|
658
807
|
|
659
808
|
module.exports = SoftSetHook;
|
@@ -672,7 +821,7 @@ SoftSetHook.prototype.hook = function (node, propertyName) {
|
|
672
821
|
}
|
673
822
|
};
|
674
823
|
|
675
|
-
},{}],
|
824
|
+
},{}],22:[function(require,module,exports){
|
676
825
|
'use strict';
|
677
826
|
|
678
827
|
var isArray = require('x-is-array');
|
@@ -811,9 +960,14 @@ function errorString(obj) {
|
|
811
960
|
}
|
812
961
|
}
|
813
962
|
|
814
|
-
},{"../vnode/is-thunk":
|
963
|
+
},{"../vnode/is-thunk":27,"../vnode/is-vhook":28,"../vnode/is-vnode":29,"../vnode/is-vtext":30,"../vnode/is-widget":31,"../vnode/vnode.js":33,"../vnode/vtext.js":35,"./hooks/ev-hook.js":20,"./hooks/soft-set-hook.js":21,"./parse-tag.js":23,"x-is-array":11}],23:[function(require,module,exports){
|
815
964
|
'use strict';
|
816
965
|
|
966
|
+
var split = require('browser-split');
|
967
|
+
|
968
|
+
var classIdSplit = /([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/;
|
969
|
+
var notClassId = /^\.|#/;
|
970
|
+
|
817
971
|
module.exports = parseTag;
|
818
972
|
|
819
973
|
function parseTag(tag, props) {
|
@@ -885,7 +1039,386 @@ function splitTag(tag) {
|
|
885
1039
|
return parts;
|
886
1040
|
}
|
887
1041
|
|
888
|
-
},{}],
|
1042
|
+
},{"browser-split":5}],24:[function(require,module,exports){
|
1043
|
+
'use strict';
|
1044
|
+
|
1045
|
+
var DEFAULT_NAMESPACE = null;
|
1046
|
+
var EV_NAMESPACE = 'http://www.w3.org/2001/xml-events';
|
1047
|
+
var XLINK_NAMESPACE = 'http://www.w3.org/1999/xlink';
|
1048
|
+
var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace';
|
1049
|
+
|
1050
|
+
// http://www.w3.org/TR/SVGTiny12/attributeTable.html
|
1051
|
+
// http://www.w3.org/TR/SVG/attindex.html
|
1052
|
+
var SVG_PROPERTIES = {
|
1053
|
+
'about': DEFAULT_NAMESPACE,
|
1054
|
+
'accent-height': DEFAULT_NAMESPACE,
|
1055
|
+
'accumulate': DEFAULT_NAMESPACE,
|
1056
|
+
'additive': DEFAULT_NAMESPACE,
|
1057
|
+
'alignment-baseline': DEFAULT_NAMESPACE,
|
1058
|
+
'alphabetic': DEFAULT_NAMESPACE,
|
1059
|
+
'amplitude': DEFAULT_NAMESPACE,
|
1060
|
+
'arabic-form': DEFAULT_NAMESPACE,
|
1061
|
+
'ascent': DEFAULT_NAMESPACE,
|
1062
|
+
'attributeName': DEFAULT_NAMESPACE,
|
1063
|
+
'attributeType': DEFAULT_NAMESPACE,
|
1064
|
+
'azimuth': DEFAULT_NAMESPACE,
|
1065
|
+
'bandwidth': DEFAULT_NAMESPACE,
|
1066
|
+
'baseFrequency': DEFAULT_NAMESPACE,
|
1067
|
+
'baseProfile': DEFAULT_NAMESPACE,
|
1068
|
+
'baseline-shift': DEFAULT_NAMESPACE,
|
1069
|
+
'bbox': DEFAULT_NAMESPACE,
|
1070
|
+
'begin': DEFAULT_NAMESPACE,
|
1071
|
+
'bias': DEFAULT_NAMESPACE,
|
1072
|
+
'by': DEFAULT_NAMESPACE,
|
1073
|
+
'calcMode': DEFAULT_NAMESPACE,
|
1074
|
+
'cap-height': DEFAULT_NAMESPACE,
|
1075
|
+
'class': DEFAULT_NAMESPACE,
|
1076
|
+
'clip': DEFAULT_NAMESPACE,
|
1077
|
+
'clip-path': DEFAULT_NAMESPACE,
|
1078
|
+
'clip-rule': DEFAULT_NAMESPACE,
|
1079
|
+
'clipPathUnits': DEFAULT_NAMESPACE,
|
1080
|
+
'color': DEFAULT_NAMESPACE,
|
1081
|
+
'color-interpolation': DEFAULT_NAMESPACE,
|
1082
|
+
'color-interpolation-filters': DEFAULT_NAMESPACE,
|
1083
|
+
'color-profile': DEFAULT_NAMESPACE,
|
1084
|
+
'color-rendering': DEFAULT_NAMESPACE,
|
1085
|
+
'content': DEFAULT_NAMESPACE,
|
1086
|
+
'contentScriptType': DEFAULT_NAMESPACE,
|
1087
|
+
'contentStyleType': DEFAULT_NAMESPACE,
|
1088
|
+
'cursor': DEFAULT_NAMESPACE,
|
1089
|
+
'cx': DEFAULT_NAMESPACE,
|
1090
|
+
'cy': DEFAULT_NAMESPACE,
|
1091
|
+
'd': DEFAULT_NAMESPACE,
|
1092
|
+
'datatype': DEFAULT_NAMESPACE,
|
1093
|
+
'defaultAction': DEFAULT_NAMESPACE,
|
1094
|
+
'descent': DEFAULT_NAMESPACE,
|
1095
|
+
'diffuseConstant': DEFAULT_NAMESPACE,
|
1096
|
+
'direction': DEFAULT_NAMESPACE,
|
1097
|
+
'display': DEFAULT_NAMESPACE,
|
1098
|
+
'divisor': DEFAULT_NAMESPACE,
|
1099
|
+
'dominant-baseline': DEFAULT_NAMESPACE,
|
1100
|
+
'dur': DEFAULT_NAMESPACE,
|
1101
|
+
'dx': DEFAULT_NAMESPACE,
|
1102
|
+
'dy': DEFAULT_NAMESPACE,
|
1103
|
+
'edgeMode': DEFAULT_NAMESPACE,
|
1104
|
+
'editable': DEFAULT_NAMESPACE,
|
1105
|
+
'elevation': DEFAULT_NAMESPACE,
|
1106
|
+
'enable-background': DEFAULT_NAMESPACE,
|
1107
|
+
'end': DEFAULT_NAMESPACE,
|
1108
|
+
'ev:event': EV_NAMESPACE,
|
1109
|
+
'event': DEFAULT_NAMESPACE,
|
1110
|
+
'exponent': DEFAULT_NAMESPACE,
|
1111
|
+
'externalResourcesRequired': DEFAULT_NAMESPACE,
|
1112
|
+
'fill': DEFAULT_NAMESPACE,
|
1113
|
+
'fill-opacity': DEFAULT_NAMESPACE,
|
1114
|
+
'fill-rule': DEFAULT_NAMESPACE,
|
1115
|
+
'filter': DEFAULT_NAMESPACE,
|
1116
|
+
'filterRes': DEFAULT_NAMESPACE,
|
1117
|
+
'filterUnits': DEFAULT_NAMESPACE,
|
1118
|
+
'flood-color': DEFAULT_NAMESPACE,
|
1119
|
+
'flood-opacity': DEFAULT_NAMESPACE,
|
1120
|
+
'focusHighlight': DEFAULT_NAMESPACE,
|
1121
|
+
'focusable': DEFAULT_NAMESPACE,
|
1122
|
+
'font-family': DEFAULT_NAMESPACE,
|
1123
|
+
'font-size': DEFAULT_NAMESPACE,
|
1124
|
+
'font-size-adjust': DEFAULT_NAMESPACE,
|
1125
|
+
'font-stretch': DEFAULT_NAMESPACE,
|
1126
|
+
'font-style': DEFAULT_NAMESPACE,
|
1127
|
+
'font-variant': DEFAULT_NAMESPACE,
|
1128
|
+
'font-weight': DEFAULT_NAMESPACE,
|
1129
|
+
'format': DEFAULT_NAMESPACE,
|
1130
|
+
'from': DEFAULT_NAMESPACE,
|
1131
|
+
'fx': DEFAULT_NAMESPACE,
|
1132
|
+
'fy': DEFAULT_NAMESPACE,
|
1133
|
+
'g1': DEFAULT_NAMESPACE,
|
1134
|
+
'g2': DEFAULT_NAMESPACE,
|
1135
|
+
'glyph-name': DEFAULT_NAMESPACE,
|
1136
|
+
'glyph-orientation-horizontal': DEFAULT_NAMESPACE,
|
1137
|
+
'glyph-orientation-vertical': DEFAULT_NAMESPACE,
|
1138
|
+
'glyphRef': DEFAULT_NAMESPACE,
|
1139
|
+
'gradientTransform': DEFAULT_NAMESPACE,
|
1140
|
+
'gradientUnits': DEFAULT_NAMESPACE,
|
1141
|
+
'handler': DEFAULT_NAMESPACE,
|
1142
|
+
'hanging': DEFAULT_NAMESPACE,
|
1143
|
+
'height': DEFAULT_NAMESPACE,
|
1144
|
+
'horiz-adv-x': DEFAULT_NAMESPACE,
|
1145
|
+
'horiz-origin-x': DEFAULT_NAMESPACE,
|
1146
|
+
'horiz-origin-y': DEFAULT_NAMESPACE,
|
1147
|
+
'id': DEFAULT_NAMESPACE,
|
1148
|
+
'ideographic': DEFAULT_NAMESPACE,
|
1149
|
+
'image-rendering': DEFAULT_NAMESPACE,
|
1150
|
+
'in': DEFAULT_NAMESPACE,
|
1151
|
+
'in2': DEFAULT_NAMESPACE,
|
1152
|
+
'initialVisibility': DEFAULT_NAMESPACE,
|
1153
|
+
'intercept': DEFAULT_NAMESPACE,
|
1154
|
+
'k': DEFAULT_NAMESPACE,
|
1155
|
+
'k1': DEFAULT_NAMESPACE,
|
1156
|
+
'k2': DEFAULT_NAMESPACE,
|
1157
|
+
'k3': DEFAULT_NAMESPACE,
|
1158
|
+
'k4': DEFAULT_NAMESPACE,
|
1159
|
+
'kernelMatrix': DEFAULT_NAMESPACE,
|
1160
|
+
'kernelUnitLength': DEFAULT_NAMESPACE,
|
1161
|
+
'kerning': DEFAULT_NAMESPACE,
|
1162
|
+
'keyPoints': DEFAULT_NAMESPACE,
|
1163
|
+
'keySplines': DEFAULT_NAMESPACE,
|
1164
|
+
'keyTimes': DEFAULT_NAMESPACE,
|
1165
|
+
'lang': DEFAULT_NAMESPACE,
|
1166
|
+
'lengthAdjust': DEFAULT_NAMESPACE,
|
1167
|
+
'letter-spacing': DEFAULT_NAMESPACE,
|
1168
|
+
'lighting-color': DEFAULT_NAMESPACE,
|
1169
|
+
'limitingConeAngle': DEFAULT_NAMESPACE,
|
1170
|
+
'local': DEFAULT_NAMESPACE,
|
1171
|
+
'marker-end': DEFAULT_NAMESPACE,
|
1172
|
+
'marker-mid': DEFAULT_NAMESPACE,
|
1173
|
+
'marker-start': DEFAULT_NAMESPACE,
|
1174
|
+
'markerHeight': DEFAULT_NAMESPACE,
|
1175
|
+
'markerUnits': DEFAULT_NAMESPACE,
|
1176
|
+
'markerWidth': DEFAULT_NAMESPACE,
|
1177
|
+
'mask': DEFAULT_NAMESPACE,
|
1178
|
+
'maskContentUnits': DEFAULT_NAMESPACE,
|
1179
|
+
'maskUnits': DEFAULT_NAMESPACE,
|
1180
|
+
'mathematical': DEFAULT_NAMESPACE,
|
1181
|
+
'max': DEFAULT_NAMESPACE,
|
1182
|
+
'media': DEFAULT_NAMESPACE,
|
1183
|
+
'mediaCharacterEncoding': DEFAULT_NAMESPACE,
|
1184
|
+
'mediaContentEncodings': DEFAULT_NAMESPACE,
|
1185
|
+
'mediaSize': DEFAULT_NAMESPACE,
|
1186
|
+
'mediaTime': DEFAULT_NAMESPACE,
|
1187
|
+
'method': DEFAULT_NAMESPACE,
|
1188
|
+
'min': DEFAULT_NAMESPACE,
|
1189
|
+
'mode': DEFAULT_NAMESPACE,
|
1190
|
+
'name': DEFAULT_NAMESPACE,
|
1191
|
+
'nav-down': DEFAULT_NAMESPACE,
|
1192
|
+
'nav-down-left': DEFAULT_NAMESPACE,
|
1193
|
+
'nav-down-right': DEFAULT_NAMESPACE,
|
1194
|
+
'nav-left': DEFAULT_NAMESPACE,
|
1195
|
+
'nav-next': DEFAULT_NAMESPACE,
|
1196
|
+
'nav-prev': DEFAULT_NAMESPACE,
|
1197
|
+
'nav-right': DEFAULT_NAMESPACE,
|
1198
|
+
'nav-up': DEFAULT_NAMESPACE,
|
1199
|
+
'nav-up-left': DEFAULT_NAMESPACE,
|
1200
|
+
'nav-up-right': DEFAULT_NAMESPACE,
|
1201
|
+
'numOctaves': DEFAULT_NAMESPACE,
|
1202
|
+
'observer': DEFAULT_NAMESPACE,
|
1203
|
+
'offset': DEFAULT_NAMESPACE,
|
1204
|
+
'opacity': DEFAULT_NAMESPACE,
|
1205
|
+
'operator': DEFAULT_NAMESPACE,
|
1206
|
+
'order': DEFAULT_NAMESPACE,
|
1207
|
+
'orient': DEFAULT_NAMESPACE,
|
1208
|
+
'orientation': DEFAULT_NAMESPACE,
|
1209
|
+
'origin': DEFAULT_NAMESPACE,
|
1210
|
+
'overflow': DEFAULT_NAMESPACE,
|
1211
|
+
'overlay': DEFAULT_NAMESPACE,
|
1212
|
+
'overline-position': DEFAULT_NAMESPACE,
|
1213
|
+
'overline-thickness': DEFAULT_NAMESPACE,
|
1214
|
+
'panose-1': DEFAULT_NAMESPACE,
|
1215
|
+
'path': DEFAULT_NAMESPACE,
|
1216
|
+
'pathLength': DEFAULT_NAMESPACE,
|
1217
|
+
'patternContentUnits': DEFAULT_NAMESPACE,
|
1218
|
+
'patternTransform': DEFAULT_NAMESPACE,
|
1219
|
+
'patternUnits': DEFAULT_NAMESPACE,
|
1220
|
+
'phase': DEFAULT_NAMESPACE,
|
1221
|
+
'playbackOrder': DEFAULT_NAMESPACE,
|
1222
|
+
'pointer-events': DEFAULT_NAMESPACE,
|
1223
|
+
'points': DEFAULT_NAMESPACE,
|
1224
|
+
'pointsAtX': DEFAULT_NAMESPACE,
|
1225
|
+
'pointsAtY': DEFAULT_NAMESPACE,
|
1226
|
+
'pointsAtZ': DEFAULT_NAMESPACE,
|
1227
|
+
'preserveAlpha': DEFAULT_NAMESPACE,
|
1228
|
+
'preserveAspectRatio': DEFAULT_NAMESPACE,
|
1229
|
+
'primitiveUnits': DEFAULT_NAMESPACE,
|
1230
|
+
'propagate': DEFAULT_NAMESPACE,
|
1231
|
+
'property': DEFAULT_NAMESPACE,
|
1232
|
+
'r': DEFAULT_NAMESPACE,
|
1233
|
+
'radius': DEFAULT_NAMESPACE,
|
1234
|
+
'refX': DEFAULT_NAMESPACE,
|
1235
|
+
'refY': DEFAULT_NAMESPACE,
|
1236
|
+
'rel': DEFAULT_NAMESPACE,
|
1237
|
+
'rendering-intent': DEFAULT_NAMESPACE,
|
1238
|
+
'repeatCount': DEFAULT_NAMESPACE,
|
1239
|
+
'repeatDur': DEFAULT_NAMESPACE,
|
1240
|
+
'requiredExtensions': DEFAULT_NAMESPACE,
|
1241
|
+
'requiredFeatures': DEFAULT_NAMESPACE,
|
1242
|
+
'requiredFonts': DEFAULT_NAMESPACE,
|
1243
|
+
'requiredFormats': DEFAULT_NAMESPACE,
|
1244
|
+
'resource': DEFAULT_NAMESPACE,
|
1245
|
+
'restart': DEFAULT_NAMESPACE,
|
1246
|
+
'result': DEFAULT_NAMESPACE,
|
1247
|
+
'rev': DEFAULT_NAMESPACE,
|
1248
|
+
'role': DEFAULT_NAMESPACE,
|
1249
|
+
'rotate': DEFAULT_NAMESPACE,
|
1250
|
+
'rx': DEFAULT_NAMESPACE,
|
1251
|
+
'ry': DEFAULT_NAMESPACE,
|
1252
|
+
'scale': DEFAULT_NAMESPACE,
|
1253
|
+
'seed': DEFAULT_NAMESPACE,
|
1254
|
+
'shape-rendering': DEFAULT_NAMESPACE,
|
1255
|
+
'slope': DEFAULT_NAMESPACE,
|
1256
|
+
'snapshotTime': DEFAULT_NAMESPACE,
|
1257
|
+
'spacing': DEFAULT_NAMESPACE,
|
1258
|
+
'specularConstant': DEFAULT_NAMESPACE,
|
1259
|
+
'specularExponent': DEFAULT_NAMESPACE,
|
1260
|
+
'spreadMethod': DEFAULT_NAMESPACE,
|
1261
|
+
'startOffset': DEFAULT_NAMESPACE,
|
1262
|
+
'stdDeviation': DEFAULT_NAMESPACE,
|
1263
|
+
'stemh': DEFAULT_NAMESPACE,
|
1264
|
+
'stemv': DEFAULT_NAMESPACE,
|
1265
|
+
'stitchTiles': DEFAULT_NAMESPACE,
|
1266
|
+
'stop-color': DEFAULT_NAMESPACE,
|
1267
|
+
'stop-opacity': DEFAULT_NAMESPACE,
|
1268
|
+
'strikethrough-position': DEFAULT_NAMESPACE,
|
1269
|
+
'strikethrough-thickness': DEFAULT_NAMESPACE,
|
1270
|
+
'string': DEFAULT_NAMESPACE,
|
1271
|
+
'stroke': DEFAULT_NAMESPACE,
|
1272
|
+
'stroke-dasharray': DEFAULT_NAMESPACE,
|
1273
|
+
'stroke-dashoffset': DEFAULT_NAMESPACE,
|
1274
|
+
'stroke-linecap': DEFAULT_NAMESPACE,
|
1275
|
+
'stroke-linejoin': DEFAULT_NAMESPACE,
|
1276
|
+
'stroke-miterlimit': DEFAULT_NAMESPACE,
|
1277
|
+
'stroke-opacity': DEFAULT_NAMESPACE,
|
1278
|
+
'stroke-width': DEFAULT_NAMESPACE,
|
1279
|
+
'surfaceScale': DEFAULT_NAMESPACE,
|
1280
|
+
'syncBehavior': DEFAULT_NAMESPACE,
|
1281
|
+
'syncBehaviorDefault': DEFAULT_NAMESPACE,
|
1282
|
+
'syncMaster': DEFAULT_NAMESPACE,
|
1283
|
+
'syncTolerance': DEFAULT_NAMESPACE,
|
1284
|
+
'syncToleranceDefault': DEFAULT_NAMESPACE,
|
1285
|
+
'systemLanguage': DEFAULT_NAMESPACE,
|
1286
|
+
'tableValues': DEFAULT_NAMESPACE,
|
1287
|
+
'target': DEFAULT_NAMESPACE,
|
1288
|
+
'targetX': DEFAULT_NAMESPACE,
|
1289
|
+
'targetY': DEFAULT_NAMESPACE,
|
1290
|
+
'text-anchor': DEFAULT_NAMESPACE,
|
1291
|
+
'text-decoration': DEFAULT_NAMESPACE,
|
1292
|
+
'text-rendering': DEFAULT_NAMESPACE,
|
1293
|
+
'textLength': DEFAULT_NAMESPACE,
|
1294
|
+
'timelineBegin': DEFAULT_NAMESPACE,
|
1295
|
+
'title': DEFAULT_NAMESPACE,
|
1296
|
+
'to': DEFAULT_NAMESPACE,
|
1297
|
+
'transform': DEFAULT_NAMESPACE,
|
1298
|
+
'transformBehavior': DEFAULT_NAMESPACE,
|
1299
|
+
'type': DEFAULT_NAMESPACE,
|
1300
|
+
'typeof': DEFAULT_NAMESPACE,
|
1301
|
+
'u1': DEFAULT_NAMESPACE,
|
1302
|
+
'u2': DEFAULT_NAMESPACE,
|
1303
|
+
'underline-position': DEFAULT_NAMESPACE,
|
1304
|
+
'underline-thickness': DEFAULT_NAMESPACE,
|
1305
|
+
'unicode': DEFAULT_NAMESPACE,
|
1306
|
+
'unicode-bidi': DEFAULT_NAMESPACE,
|
1307
|
+
'unicode-range': DEFAULT_NAMESPACE,
|
1308
|
+
'units-per-em': DEFAULT_NAMESPACE,
|
1309
|
+
'v-alphabetic': DEFAULT_NAMESPACE,
|
1310
|
+
'v-hanging': DEFAULT_NAMESPACE,
|
1311
|
+
'v-ideographic': DEFAULT_NAMESPACE,
|
1312
|
+
'v-mathematical': DEFAULT_NAMESPACE,
|
1313
|
+
'values': DEFAULT_NAMESPACE,
|
1314
|
+
'version': DEFAULT_NAMESPACE,
|
1315
|
+
'vert-adv-y': DEFAULT_NAMESPACE,
|
1316
|
+
'vert-origin-x': DEFAULT_NAMESPACE,
|
1317
|
+
'vert-origin-y': DEFAULT_NAMESPACE,
|
1318
|
+
'viewBox': DEFAULT_NAMESPACE,
|
1319
|
+
'viewTarget': DEFAULT_NAMESPACE,
|
1320
|
+
'visibility': DEFAULT_NAMESPACE,
|
1321
|
+
'width': DEFAULT_NAMESPACE,
|
1322
|
+
'widths': DEFAULT_NAMESPACE,
|
1323
|
+
'word-spacing': DEFAULT_NAMESPACE,
|
1324
|
+
'writing-mode': DEFAULT_NAMESPACE,
|
1325
|
+
'x': DEFAULT_NAMESPACE,
|
1326
|
+
'x-height': DEFAULT_NAMESPACE,
|
1327
|
+
'x1': DEFAULT_NAMESPACE,
|
1328
|
+
'x2': DEFAULT_NAMESPACE,
|
1329
|
+
'xChannelSelector': DEFAULT_NAMESPACE,
|
1330
|
+
'xlink:actuate': XLINK_NAMESPACE,
|
1331
|
+
'xlink:arcrole': XLINK_NAMESPACE,
|
1332
|
+
'xlink:href': XLINK_NAMESPACE,
|
1333
|
+
'xlink:role': XLINK_NAMESPACE,
|
1334
|
+
'xlink:show': XLINK_NAMESPACE,
|
1335
|
+
'xlink:title': XLINK_NAMESPACE,
|
1336
|
+
'xlink:type': XLINK_NAMESPACE,
|
1337
|
+
'xml:base': XML_NAMESPACE,
|
1338
|
+
'xml:id': XML_NAMESPACE,
|
1339
|
+
'xml:lang': XML_NAMESPACE,
|
1340
|
+
'xml:space': XML_NAMESPACE,
|
1341
|
+
'y': DEFAULT_NAMESPACE,
|
1342
|
+
'y1': DEFAULT_NAMESPACE,
|
1343
|
+
'y2': DEFAULT_NAMESPACE,
|
1344
|
+
'yChannelSelector': DEFAULT_NAMESPACE,
|
1345
|
+
'z': DEFAULT_NAMESPACE,
|
1346
|
+
'zoomAndPan': DEFAULT_NAMESPACE
|
1347
|
+
};
|
1348
|
+
|
1349
|
+
module.exports = SVGAttributeNamespace;
|
1350
|
+
|
1351
|
+
function SVGAttributeNamespace(value) {
|
1352
|
+
if (SVG_PROPERTIES.hasOwnProperty(value)) {
|
1353
|
+
return SVG_PROPERTIES[value];
|
1354
|
+
}
|
1355
|
+
}
|
1356
|
+
|
1357
|
+
},{}],25:[function(require,module,exports){
|
1358
|
+
'use strict';
|
1359
|
+
|
1360
|
+
var isArray = require('x-is-array');
|
1361
|
+
|
1362
|
+
var h = require('./index.js');
|
1363
|
+
|
1364
|
+
|
1365
|
+
var SVGAttributeNamespace = require('./svg-attribute-namespace');
|
1366
|
+
var attributeHook = require('./hooks/attribute-hook');
|
1367
|
+
|
1368
|
+
var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
|
1369
|
+
|
1370
|
+
module.exports = svg;
|
1371
|
+
|
1372
|
+
function svg(tagName, properties, children) {
|
1373
|
+
if (!children && isChildren(properties)) {
|
1374
|
+
children = properties;
|
1375
|
+
properties = {};
|
1376
|
+
}
|
1377
|
+
|
1378
|
+
properties = properties || {};
|
1379
|
+
|
1380
|
+
// set namespace for svg
|
1381
|
+
properties.namespace = SVG_NAMESPACE;
|
1382
|
+
|
1383
|
+
var attributes = properties.attributes || (properties.attributes = {});
|
1384
|
+
|
1385
|
+
for (var key in properties) {
|
1386
|
+
if (!properties.hasOwnProperty(key)) {
|
1387
|
+
continue;
|
1388
|
+
}
|
1389
|
+
|
1390
|
+
var namespace = SVGAttributeNamespace(key);
|
1391
|
+
|
1392
|
+
if (namespace === undefined) { // not a svg attribute
|
1393
|
+
continue;
|
1394
|
+
}
|
1395
|
+
|
1396
|
+
var value = properties[key];
|
1397
|
+
|
1398
|
+
if (typeof value !== 'string' &&
|
1399
|
+
typeof value !== 'number' &&
|
1400
|
+
typeof value !== 'boolean'
|
1401
|
+
) {
|
1402
|
+
continue;
|
1403
|
+
}
|
1404
|
+
|
1405
|
+
if (namespace !== null) { // namespaced attribute
|
1406
|
+
properties[key] = attributeHook(namespace, value);
|
1407
|
+
continue;
|
1408
|
+
}
|
1409
|
+
|
1410
|
+
attributes[key] = value
|
1411
|
+
properties[key] = undefined
|
1412
|
+
}
|
1413
|
+
|
1414
|
+
return h(tagName, properties, children);
|
1415
|
+
}
|
1416
|
+
|
1417
|
+
function isChildren(x) {
|
1418
|
+
return typeof x === 'string' || isArray(x);
|
1419
|
+
}
|
1420
|
+
|
1421
|
+
},{"./hooks/attribute-hook":19,"./index.js":22,"./svg-attribute-namespace":24,"x-is-array":11}],26:[function(require,module,exports){
|
889
1422
|
var isVNode = require("./is-vnode")
|
890
1423
|
var isVText = require("./is-vtext")
|
891
1424
|
var isWidget = require("./is-widget")
|
@@ -927,14 +1460,14 @@ function renderThunk(thunk, previous) {
|
|
927
1460
|
return renderedThunk
|
928
1461
|
}
|
929
1462
|
|
930
|
-
},{"./is-thunk":
|
1463
|
+
},{"./is-thunk":27,"./is-vnode":29,"./is-vtext":30,"./is-widget":31}],27:[function(require,module,exports){
|
931
1464
|
module.exports = isThunk
|
932
1465
|
|
933
1466
|
function isThunk(t) {
|
934
1467
|
return t && t.type === "Thunk"
|
935
1468
|
}
|
936
1469
|
|
937
|
-
},{}],
|
1470
|
+
},{}],28:[function(require,module,exports){
|
938
1471
|
module.exports = isHook
|
939
1472
|
|
940
1473
|
function isHook(hook) {
|
@@ -943,7 +1476,7 @@ function isHook(hook) {
|
|
943
1476
|
typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook"))
|
944
1477
|
}
|
945
1478
|
|
946
|
-
},{}],
|
1479
|
+
},{}],29:[function(require,module,exports){
|
947
1480
|
var version = require("./version")
|
948
1481
|
|
949
1482
|
module.exports = isVirtualNode
|
@@ -952,7 +1485,7 @@ function isVirtualNode(x) {
|
|
952
1485
|
return x && x.type === "VirtualNode" && x.version === version
|
953
1486
|
}
|
954
1487
|
|
955
|
-
},{"./version":
|
1488
|
+
},{"./version":32}],30:[function(require,module,exports){
|
956
1489
|
var version = require("./version")
|
957
1490
|
|
958
1491
|
module.exports = isVirtualText
|
@@ -961,17 +1494,17 @@ function isVirtualText(x) {
|
|
961
1494
|
return x && x.type === "VirtualText" && x.version === version
|
962
1495
|
}
|
963
1496
|
|
964
|
-
},{"./version":
|
1497
|
+
},{"./version":32}],31:[function(require,module,exports){
|
965
1498
|
module.exports = isWidget
|
966
1499
|
|
967
1500
|
function isWidget(w) {
|
968
1501
|
return w && w.type === "Widget"
|
969
1502
|
}
|
970
1503
|
|
971
|
-
},{}],
|
1504
|
+
},{}],32:[function(require,module,exports){
|
972
1505
|
module.exports = "2"
|
973
1506
|
|
974
|
-
},{}],
|
1507
|
+
},{}],33:[function(require,module,exports){
|
975
1508
|
var version = require("./version")
|
976
1509
|
var isVNode = require("./is-vnode")
|
977
1510
|
var isWidget = require("./is-widget")
|
@@ -1045,7 +1578,7 @@ function VirtualNode(tagName, properties, children, key, namespace) {
|
|
1045
1578
|
VirtualNode.prototype.version = version
|
1046
1579
|
VirtualNode.prototype.type = "VirtualNode"
|
1047
1580
|
|
1048
|
-
},{"./is-thunk":
|
1581
|
+
},{"./is-thunk":27,"./is-vhook":28,"./is-vnode":29,"./is-widget":31,"./version":32}],34:[function(require,module,exports){
|
1049
1582
|
var version = require("./version")
|
1050
1583
|
|
1051
1584
|
VirtualPatch.NONE = 0
|
@@ -1069,7 +1602,7 @@ function VirtualPatch(type, vNode, patch) {
|
|
1069
1602
|
VirtualPatch.prototype.version = version
|
1070
1603
|
VirtualPatch.prototype.type = "VirtualPatch"
|
1071
1604
|
|
1072
|
-
},{"./version":
|
1605
|
+
},{"./version":32}],35:[function(require,module,exports){
|
1073
1606
|
var version = require("./version")
|
1074
1607
|
|
1075
1608
|
module.exports = VirtualText
|
@@ -1081,7 +1614,7 @@ function VirtualText(text) {
|
|
1081
1614
|
VirtualText.prototype.version = version
|
1082
1615
|
VirtualText.prototype.type = "VirtualText"
|
1083
1616
|
|
1084
|
-
},{"./version":
|
1617
|
+
},{"./version":32}],36:[function(require,module,exports){
|
1085
1618
|
var isObject = require("is-object")
|
1086
1619
|
var isHook = require("../vnode/is-vhook")
|
1087
1620
|
|
@@ -1141,7 +1674,7 @@ function getPrototype(value) {
|
|
1141
1674
|
}
|
1142
1675
|
}
|
1143
1676
|
|
1144
|
-
},{"../vnode/is-vhook":
|
1677
|
+
},{"../vnode/is-vhook":28,"is-object":10}],37:[function(require,module,exports){
|
1145
1678
|
var isArray = require("x-is-array")
|
1146
1679
|
|
1147
1680
|
var VPatch = require("../vnode/vpatch")
|
@@ -1570,7 +2103,7 @@ function appendPatch(apply, patch) {
|
|
1570
2103
|
}
|
1571
2104
|
}
|
1572
2105
|
|
1573
|
-
},{"../vnode/handle-thunk":
|
2106
|
+
},{"../vnode/handle-thunk":26,"../vnode/is-thunk":27,"../vnode/is-vnode":29,"../vnode/is-vtext":30,"../vnode/is-widget":31,"../vnode/vpatch":34,"./diff-props":36,"x-is-array":11}],38:[function(require,module,exports){
|
1574
2107
|
|
1575
2108
|
},{}]},{},[4])(4)
|
1576
2109
|
});
|
@@ -8,6 +8,16 @@ module VirtualDOM
|
|
8
8
|
`virtualDom.h(tag_name, attributes, content)`
|
9
9
|
end
|
10
10
|
|
11
|
+
def self.svg(tag_name, attributes=nil, content=nil)
|
12
|
+
%x{
|
13
|
+
return virtualDom.svg(
|
14
|
+
tag_name,
|
15
|
+
#{HashUtils.camelize_keys(attributes).to_n},
|
16
|
+
#{sanitize_content(content)}
|
17
|
+
);
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
11
21
|
def self.create_element(node)
|
12
22
|
`virtualDom.create(node)`
|
13
23
|
end
|
data/opal/clearwater.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'clearwater'
|
2
|
+
require 'clearwater/svg_component'
|
2
3
|
|
3
4
|
module Clearwater
|
4
5
|
RSpec.describe Application do
|
@@ -9,11 +10,26 @@ module Clearwater
|
|
9
10
|
)
|
10
11
|
}
|
11
12
|
let(:component) {
|
13
|
+
$svg_component = self.svg_component
|
12
14
|
Class.new do
|
13
15
|
include Clearwater::Component
|
14
16
|
|
15
17
|
def render
|
16
|
-
|
18
|
+
div([
|
19
|
+
p({ class_name: 'foo' }, 'Hello world'),
|
20
|
+
$svg_component,
|
21
|
+
])
|
22
|
+
end
|
23
|
+
end.new
|
24
|
+
}
|
25
|
+
let(:svg_component) {
|
26
|
+
Class.new do
|
27
|
+
include Clearwater::SVGComponent
|
28
|
+
|
29
|
+
def render
|
30
|
+
svg({ view_box: '0 0 120 120' }, [
|
31
|
+
circle(cx: 50, cy: 50, r: 30),
|
32
|
+
])
|
17
33
|
end
|
18
34
|
end.new
|
19
35
|
}
|
@@ -22,7 +38,7 @@ module Clearwater
|
|
22
38
|
it 'renders to the specified element' do
|
23
39
|
app.perform_render
|
24
40
|
|
25
|
-
expect(element.inner_html).to eq '<
|
41
|
+
expect(element.inner_html).to eq '<div><p class="foo">Hello world</p><svg viewBox="0 0 120 120"><circle cx="50" cy="50" r="30"></circle></svg></div>'
|
26
42
|
end
|
27
43
|
|
28
44
|
it 'calls queued blocks after rendering' do
|
data/spec/component_spec.rb
CHANGED
@@ -30,7 +30,7 @@ module Clearwater
|
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'sanitizes element attributes' do
|
33
|
-
attributes =
|
33
|
+
attributes = Component.sanitize_attributes({
|
34
34
|
class: 'foo',
|
35
35
|
onclick: proc { |event| expect(event).to be_a Browser::Event },
|
36
36
|
})
|
@@ -45,12 +45,12 @@ module Clearwater
|
|
45
45
|
describe 'sanitizing content' do
|
46
46
|
it 'sanitizes components by calling `render`' do
|
47
47
|
allow(component).to receive(:render) { 'foo' }
|
48
|
-
expect(
|
48
|
+
expect(Component.sanitize_content(component)).to eq 'foo'
|
49
49
|
end
|
50
50
|
|
51
51
|
it 'sanitizes arrays by sanitizing each element' do
|
52
52
|
allow(component).to receive(:render) { 'foo' }
|
53
|
-
expect(
|
53
|
+
expect(Component.sanitize_content([component, nil, 1])).to eq ['foo', nil, 1]
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clearwater
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamie Gaskins
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opal
|
@@ -94,34 +94,6 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0.9'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: pry-doc
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0.6'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0.6'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: codeclimate-test-reporter
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0.4'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - "~>"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0.4'
|
125
97
|
description: Front-end web framework built on Opal
|
126
98
|
email:
|
127
99
|
- jgaskins@gmail.com
|
@@ -140,6 +112,7 @@ files:
|
|
140
112
|
- opal/clearwater/router.rb
|
141
113
|
- opal/clearwater/router/route.rb
|
142
114
|
- opal/clearwater/router/route_collection.rb
|
115
|
+
- opal/clearwater/svg_component.rb
|
143
116
|
- opal/clearwater/virtual_dom.rb
|
144
117
|
- opal/clearwater/virtual_dom/js/virtual_dom.js
|
145
118
|
- spec/clearwater/application_spec.rb
|
@@ -175,4 +148,3 @@ test_files:
|
|
175
148
|
- spec/clearwater/cached_render_spec.rb
|
176
149
|
- spec/clearwater/router_spec.rb
|
177
150
|
- spec/component_spec.rb
|
178
|
-
has_rdoc:
|