Skip to content

Commit 87c68c5

Browse files
authored
Add assetStringify for asset based properties (#5544)
1 parent e25a042 commit 87c68c5

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

‎src/core/propertyTypes.js‎

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@ var nonCharRegex = /[,> .[\]:]/;
88
var urlRegex = /url\((.+)\)/;
99

1010
// Built-in property types.
11-
registerPropertyType('audio', '', assetParse);
11+
registerPropertyType('audio', '', assetParse, assetStringify);
1212
registerPropertyType('array', [], arrayParse, arrayStringify, arrayEquals);
13-
registerPropertyType('asset', '', assetParse);
13+
registerPropertyType('asset', '', assetParse, assetStringify);
1414
registerPropertyType('boolean', false, boolParse);
1515
registerPropertyType('color', '#FFF');
1616
registerPropertyType('int', 0, intParse);
1717
registerPropertyType('number', 0, numberParse);
18-
registerPropertyType('map', '', assetParse);
19-
registerPropertyType('model', '', assetParse);
18+
registerPropertyType('map', '', assetParse, assetStringify);
19+
registerPropertyType('model', '', assetParse, assetStringify);
2020
registerPropertyType('selector', null, selectorParse, selectorStringify, defaultEquals, false);
2121
registerPropertyType('selectorAll', null, selectorAllParse, selectorAllStringify, arrayEquals, false);
22-
registerPropertyType('src', '', srcParse);
22+
registerPropertyType('src', '', srcParse, assetStringify);
2323
registerPropertyType('string', '');
2424
registerPropertyType('time', 0, intParse);
2525
registerPropertyType('vec2', {x: 0, y: 0}, vecParse, coordinates.stringify, coordinates.equals);
@@ -121,6 +121,19 @@ function assetParse (value) {
121121
return value;
122122
}
123123

124+
function assetStringify (value) {
125+
if (value.getAttribute) {
126+
var id = value.getAttribute('id');
127+
if (id) {
128+
return '#' + value.getAttribute('id');
129+
}
130+
// HTMLElement without id can not be stringified, as there is no string assetParse
131+
// could convert back to this exact element, using the src attribute instead.
132+
return value.getAttribute('src');
133+
}
134+
return defaultStringify(value);
135+
}
136+
124137
function defaultParse (value) {
125138
return value;
126139
}

‎tests/core/propertyTypes.test.js‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ var register = PropertyTypes.registerPropertyType;
99
suite('propertyTypes', function () {
1010
suite('asset', function () {
1111
var parse = propertyTypes.asset.parse;
12+
var stringify = propertyTypes.asset.stringify;
1213

1314
setup(function () {
1415
var el = this.el = document.createElement('div');
@@ -52,6 +53,18 @@ suite('propertyTypes', function () {
5253
this.el.appendChild(video);
5354
assert.equal(parse('#foo'), video);
5455
});
56+
57+
test('stringifies to id', function () {
58+
var video = document.createElement('video');
59+
video.setAttribute('id', 'foo');
60+
assert.equal(stringify(video), '#foo');
61+
});
62+
63+
test('stringifies to src if no id available', function () {
64+
var video = document.createElement('video');
65+
video.setAttribute('src', '/some-url');
66+
assert.equal(stringify(video), '/some-url');
67+
});
5568
});
5669

5770
suite('boolean', function () {

0 commit comments

Comments
 (0)