merge hyperjson changes from realtime xwiki
more resilient class serialization. comments
This commit is contained in:
parent
2691d85582
commit
b59a14c5ac
@ -1,5 +1,4 @@
|
|||||||
define([], function () {
|
define([], function () {
|
||||||
|
|
||||||
// this makes recursing a lot simpler
|
// this makes recursing a lot simpler
|
||||||
var isArray = function (A) {
|
var isArray = function (A) {
|
||||||
return Object.prototype.toString.call(A)==='[object Array]';
|
return Object.prototype.toString.call(A)==='[object Array]';
|
||||||
@ -39,8 +38,14 @@ define([], function () {
|
|||||||
return cb(hj[0], hj[1], children);
|
return cb(hj[0], hj[1], children);
|
||||||
};
|
};
|
||||||
|
|
||||||
var prependDot = function (token) {
|
var classify = function (token) {
|
||||||
return '.' + token;
|
return '.' + token.trim();
|
||||||
|
};
|
||||||
|
|
||||||
|
var isValidClass = function (x) {
|
||||||
|
if (x && /\S/.test(x)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var isTruthy = function (x) {
|
var isTruthy = function (x) {
|
||||||
@ -54,13 +59,13 @@ define([], function () {
|
|||||||
if(!el.attributes){
|
if(!el.attributes){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (predicate) {
|
if (predicate) {
|
||||||
if (!predicate(el)) {
|
if (!predicate(el)) {
|
||||||
// shortcircuit
|
// shortcircuit
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var attributes = {};
|
var attributes = {};
|
||||||
|
|
||||||
var i = 0;
|
var i = 0;
|
||||||
@ -84,19 +89,25 @@ define([], function () {
|
|||||||
var sel = el.tagName;
|
var sel = el.tagName;
|
||||||
|
|
||||||
if(attributes.id){
|
if(attributes.id){
|
||||||
|
// we don't have to do much to validate IDs because the browser
|
||||||
|
// will only permit one id to exist
|
||||||
|
// unless we come across a strange browser in the wild
|
||||||
sel = sel +'#'+ attributes.id;
|
sel = sel +'#'+ attributes.id;
|
||||||
delete attributes.id;
|
delete attributes.id;
|
||||||
}
|
}
|
||||||
if(attributes.class){
|
if(attributes.class){
|
||||||
|
// actually parse out classes so that we produce a valid selector
|
||||||
|
// string. leading or trailing spaces would have caused it to choke
|
||||||
|
// these are really common in generated html
|
||||||
/* TODO this can be done with RegExps alone, and it will be faster
|
/* TODO this can be done with RegExps alone, and it will be faster
|
||||||
but this works and is a little less error prone, albeit slower
|
but this works and is a little less error prone, albeit slower
|
||||||
come back and speed it up when it comes time to optimize */
|
come back and speed it up when it comes time to optimize */
|
||||||
|
|
||||||
sel = sel + attributes.class
|
sel = sel + attributes.class
|
||||||
.split(/\s+/)
|
.split(/\s+/g)
|
||||||
.filter(isTruthy)
|
.filter(isValidClass)
|
||||||
.map(prependDot)
|
.map(classify)
|
||||||
.join('');
|
.join('')
|
||||||
|
.replace(/\.\./g, '.');
|
||||||
delete attributes.class;
|
delete attributes.class;
|
||||||
}
|
}
|
||||||
result.push(sel);
|
result.push(sel);
|
||||||
@ -109,11 +120,9 @@ define([], function () {
|
|||||||
|
|
||||||
// js hint complains if we use 'var' here
|
// js hint complains if we use 'var' here
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
for(; i < el.childNodes.length; i++){
|
for(; i < el.childNodes.length; i++){
|
||||||
children.push(DOM2HyperJSON(el.childNodes[i], predicate, filter));
|
children.push(DOM2HyperJSON(el.childNodes[i], predicate, filter));
|
||||||
}
|
}
|
||||||
|
|
||||||
result.push(children.filter(isTruthy));
|
result.push(children.filter(isTruthy));
|
||||||
|
|
||||||
if (filter) {
|
if (filter) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user