merge hyperjson changes from realtime xwiki

more resilient class serialization.
comments
This commit is contained in:
ansuz 2016-04-01 11:20:19 +02:00
parent 2691d85582
commit b59a14c5ac
1 changed files with 20 additions and 11 deletions

View File

@ -1,5 +1,4 @@
define([], function () {
// this makes recursing a lot simpler
var isArray = function (A) {
return Object.prototype.toString.call(A)==='[object Array]';
@ -39,8 +38,14 @@ define([], function () {
return cb(hj[0], hj[1], children);
};
var prependDot = function (token) {
return '.' + token;
var classify = function (token) {
return '.' + token.trim();
};
var isValidClass = function (x) {
if (x && /\S/.test(x)) {
return true;
}
};
var isTruthy = function (x) {
@ -54,13 +59,13 @@ define([], function () {
if(!el.attributes){
return;
}
if (predicate) {
if (!predicate(el)) {
// shortcircuit
return;
}
}
var attributes = {};
var i = 0;
@ -84,19 +89,25 @@ define([], function () {
var sel = el.tagName;
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;
delete attributes.id;
}
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
but this works and is a little less error prone, albeit slower
come back and speed it up when it comes time to optimize */
sel = sel + attributes.class
.split(/\s+/)
.filter(isTruthy)
.map(prependDot)
.join('');
.split(/\s+/g)
.filter(isValidClass)
.map(classify)
.join('')
.replace(/\.\./g, '.');
delete attributes.class;
}
result.push(sel);
@ -109,11 +120,9 @@ define([], function () {
// js hint complains if we use 'var' here
i = 0;
for(; i < el.childNodes.length; i++){
children.push(DOM2HyperJSON(el.childNodes[i], predicate, filter));
}
result.push(children.filter(isTruthy));
if (filter) {