okam-build
Version:
The build tool for Okam develop framework
49 lines (40 loc) • 1.37 kB
JavaScript
/**
* @file Postcss dependence resource process plugin
* @author sparklewhy@gmail.com
*/
;
const postcss = require('postcss');
const {resolveUrlPath} = require('../../helper/url');
const URL_REGEXP = /(url\s*\(\s*['"]?\s*)([^'"\)]+)(\s*['"]?\s*\))/g;
function processStyleDeclaration(decl, opts) {
let {value} = decl;
if (!URL_REGEXP.test(value)) {
return;
}
let {file, resolve, logger} = opts;
decl.value = value.replace(URL_REGEXP, (match, prefix, url, suffix) => {
let relPath = resolveUrlPath(url, file, resolve, logger);
if (!relPath) {
return match;
}
return prefix + relPath + suffix;
});
}
module.exports = postcss.plugin('postcss-plugin-resource', function (opts = {}) {
let {styleExtname: extname, file, resolve} = opts;
return function (css) {
if (file.analysedDeps) {
return;
}
file.analysedDeps = true;
css.walkDecls(decl => processStyleDeclaration(decl, opts));
css.walkAtRules(rule => {
if (rule.name === 'import') {
let relPath = rule.params.slice(1, -1);
relPath = resolve(file, relPath);
extname && (relPath = relPath.replace(/\.css$/, '.' + extname));
rule.params = `'${relPath}'`;
}
});
};
});