taobao-tmall-decoration
Version:
Node code for writing Taobao store or Tmall store frontend fitting prototype easily
123 lines (107 loc) • 3.12 kB
JavaScript
/*
* @Author: jachin
* @Date: 2016-08-16 16:38:04
* @Last Modified by: jypblue
* @Last Modified time: 2016-08-18 16:16:37
*/
;
let path = require('path');
let fs = require('fs');
let glob = require('glob');
let css = require('css');
let colors = require('colors');
let cheerio = require('cheerio');
function transformStyle(tmplDir, distDir) {
//如果没有dist目录,新建一个dist目录
if (!fs.existsSync(distDir)) {
fs.mkdirSync(distDir);
}
//读取tmpl下所有的html
let entryHtml = glob.sync(tmplDir + '/*.html');
//循环读取
entryHtml.forEach((filePath) => {
let fileType = filePath.slice(filePath.lastIndexOf('.') + 1);
if (['html', 'htm'].indexOf(fileType) == -1) {
// statement
return false;
}
fs.readFile(filePath, 'utf8', function(err, data) {
if (err) {
// statement
throw err;
console.log(fliePath + ' file read faild...'.red);
}
let $ = cheerio.load(data, {
decodeEntities: false
});
let stylesheets = [],
styleObj = {};
let links = $('link');
links.each(function(k, v) {
let href = $(v).attr("href");
href = path.resolve(filePath, "../../" + href);
let hrefType = href.slice(href.lastIndexOf('.') + 1);
if (['css'].indexOf(hrefType) == -1) {
// statement
return false;
}
stylesheets = stylesheets.concat(parseStyleSheet(href));
});
stylesheets.forEach(function(v, k) {
Object.keys(v).forEach(function(v1, k1) {
if (v1 in styleObj) {
// statement
styleObj[v1] += v[v1];
} else {
styleObj[v1] = v[v1];
}
});
});
for (let key in styleObj) {
$(key).each(function(k, v) {
let oldStyle = $(v).attr("style");
oldStyle = oldStyle == null ? "" : oldStyle;
$(v).attr("style", oldStyle + styleObj[key]);
});
}
let filename = filePath.slice(filePath.lastIndexOf('\/'));
fs.open(distDir + filename, "w+", function(err, fd) {
fs.writeFile(fd, $.html(), function(err) {
if (err) {
// statement
throw err;
console.log(filename + "write faild...".red);
}
fs.close(fd);
console.log(filePath + " done...".green);
});
});
});
});
}
function parseStyleSheet(path) {
let maps = [],
ast, rules;
let content = fs.readFileSync(path);
ast = css.parse("" + content);
rules = ast.stylesheet.rules;
for (let i = 0, len = rules.length; i < len; i++) {
let item = rules[i],
selector, decls;
if (item.type == 'rule') {
// statement
selector = item.selectors;
decls = item.declarations;
let styles = decls.map ? decls.map(function(v, k) {
return v.property + ":" + v.value + ";";
}) : '';
let tmp = {};
tmp[selector] = styles.join("");
maps.push(tmp);
}
}
return maps;
}
module.exports = {
transformStyle: transformStyle
}