From b59a14c5ac6e11de3b991f2c41585a112ca3246d Mon Sep 17 00:00:00 2001 From: ansuz Date: Fri, 1 Apr 2016 11:20:19 +0200 Subject: [PATCH] merge hyperjson changes from realtime xwiki more resilient class serialization. comments --- www/common/hyperjson.js | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/www/common/hyperjson.js b/www/common/hyperjson.js index 71ba71987..ff04a0da9 100644 --- a/www/common/hyperjson.js +++ b/www/common/hyperjson.js @@ -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) {