wecui
Version:
一款基于Vue2.x版本的移动端web组件
85 lines (73 loc) • 2.46 kB
JavaScript
'use strict';
import postcss from 'postcss';
import resetCore from './resetCore';
const atRules = {
'reset-global' (platefprm) {
return resetCore.resetGlobal(platefprm);
},
'reset-nested' (...tags) {
return resetCore.resetNested(tags);
}
};
// const unwrapAmp = (nodeSelector, node) => {
// if (nodeSelector.indexOf('&:') >= 0 && node.name !== 'media') {
// return node.selectors.map((selector) => {
// return nodeSelector.replace(/&/g, selector);
// }).join(',');
// }
// return nodeSelector;
// };
// const getGlobalSelector = (node) => {
// if (node.parent && node.parent.type === 'atrule') {
// return `${node.parent.name} ${node.parent.params} ${node.selector}`;
// } else if (node.name === 'media') {
// return getGlobalSelector(node.parent);
// }
// return node.selector;
// };
const applyRuleSetToNode = (ruleSet, node, currentAtRule) => {
Object.keys(ruleSet).forEach((prop) => {
let rule = ruleSet[prop];
if (typeof rule === 'object') {
if (node.name !== 'media') {
let extRule = postcss.rule({ selector: unwrapAmp(prop, node) });
applyRuleSetToNode(rule, extRule);
let globalSelector = getGlobalSelector(node);
node.parent.insertAfter(ampInsertedNodes[globalSelector] || node, extRule);
ampInsertedNodes[globalSelector] = extRule;
} else {
let mediaNestedRule = postcss.parse(`${prop} ${JSON.stringify(rule).replace(/"/g, '')}`);
node.append(mediaNestedRule);
}
} else {
if (currentAtRule) {
node.insertBefore(currentAtRule, { prop: prop, value: rule });
} else {
node.append({ prop, value: rule });
}
}
});
};
module.exports = postcss.plugin('postcss-reset', (opts) => {
let options = Object.assign({}, opts);
return (root) => {
let promises = [];
root.walkAtRules(/^reset-/i, (rule) => {
var parser = atRules[rule.name];
if (parser) {
let params = rule.params.trim() ? rule.params.trim().split(' ') : [];
let promise = parser(...params);
promises.push(promise);
promise.then((resetRules) => {
if (typeof resetRules === 'object') {
applyRuleSetToNode(resetRules, rule.parent, rule);
} else {
root.prepend(resetRules);
}
rule.remove();
}).catch(console.error);
}
});
return Promise.all(promises);
};
});