@extjs/sencha-cmd-linux-32
Version:
Productivity and performance optimization tool for building applications with Sencha Ext JS and Sencha Touch.
142 lines (117 loc) • 4.78 kB
JavaScript
;
var SelectorList = require('../type/selectors/SelectorList.js');
module.exports = {
init (runtime) {
var selectorHooks = {},
styleHooks = {},
atRuleHooks = {},
functionCallHooks = {},
toPrune = [],
registered = false;
function register() {
if (registered) {
return;
}
registered = true;
runtime.registerProcessor({
runHooks (obj, hooks) {
if (hooks) {
for (var h = 0; h < hooks.length; h++) {
hooks[h].call(this, obj, this.context);
}
}
},
functioncall (obj) {
this.runHooks(obj, functionCallHooks[obj.name]);
},
declaration (obj) {
this.runHooks(obj, styleHooks[obj.property]);
obj.descend(this);
},
// process selectors for registered name watches
ruleset (obj) {
let me = this;
me.currRuleset = obj;
let selectors = obj.selectors,
selectorsStr = selectors.toString(),
len = toPrune.length,
filter;
for (let i = 0; i < len; i++) {
filter = toPrune[i];
if (filter.test(selectorsStr)) {
if (selectors.$isFashionSelectorPart ||
selectors.$isFashionMultiPartSelector ||
selectors.$isFashionCompoundSelector) {
obj.selectors = null;
} else if (selectors.$isFashionSelectorList) {
selectors = selectors.items;
for (let j = selectors.length - 1; j >= 0; j--) {
if (filter.test(selectors[j].toString())) {
selectors.splice(j--,1);
}
}
if (selectors.length == 0) {
obj.selectors = null;
} else if (selectors.length == 1) {
selectors = obj.selectors = selectors[0];
selectorsStr = selectors.toString();
continue;
} else {
obj.selectors = new SelectorList(selectors);
}
}
break;
}
}
if (obj.selectors != null) {
me.visit(obj.selectors);
if (obj.isAtRule()) {
me.runHooks(obj, atRuleHooks[obj.getFirstSelectorStr()]);
}
me.visit(obj.declarations);
me.visit(obj.children);
}
me.currRuleset = null;
},
selector (obj) {
this.runHooks(this.currRuleset, selectorHooks[obj.toString()]);
},
execute (obj, ctx) {
this.context = ctx;
this.visit(obj);
this.context = null;
}
});
}
function registerHooks(map, obj) {
register();
var hooks;
for (var key in obj) {
hooks = map[key];
if (!hooks) {
hooks = map[key] = [];
}
hooks.push(obj[key]);
}
}
runtime.registerSelectorHooks = function (obj) {
registerHooks(selectorHooks, obj);
};
runtime.registerAtRuleHook = function (obj) {
registerHooks(atRuleHooks, obj);
};
runtime.registerStyleHooks = function (obj) {
registerHooks(styleHooks, obj);
};
runtime.registerFunctionCallHooks = function (obj) {
registerHooks(functionCallHooks, obj);
};
if (runtime.context.getConfig('prune') != null) {
toPrune = runtime.context.getConfig('prune').map((s) => {
s = s.replace(/[\-\[\]/{}()*+?.\\\^$|]/g, "\\$&");
return new RegExp(`^${s}$|${s}\\b`);
});
register();
}
}
};