merge hyperjson changes from realtime xwiki

more resilient class serialization.
comments
pull/1/head
ansuz 9 years ago
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…
Cancel
Save