dojox
Version:
Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.
118 lines (100 loc) • 3.19 kB
JavaScript
var fs = require("fs");
var path = require("path");
var less = require("less");
var themeFolders = ["../android", "../iphone", "../blackberry", "../holodark", "../windows", "../custom", "../ios7"];
var commonFolders = ["../common/domButtons", "../common/transitions"];
var batchQueue = [];
var batchIndex = 0;
var processProgress = 0;
themeFolders.forEach(function(folder){
batchQueue.push(function(){
processFolder(folder, true);
processFolder(folder + "/dijit", false);
});
});
commonFolders.forEach(function(folder){
batchQueue.push(function(){
processFolder(folder, false);
});
});
batch();
///////////////////////////////////////////////////////////////////////////////////////////////////
function batch(){
if(batchIndex < batchQueue.length){
batchQueue[batchIndex]();
batchIndex++;
}
}
function beginProcess(){
processProgress++;
}
function endProcess(){
processProgress--;
if (processProgress == 0){
batch();
}
}
function processFolder(folder, usingCommonSubstitution){
var folderFiles = getLessFiles(folder);
if(usingCommonSubstitution){
var commonFiles = getLessFiles("../common");
var outputFile;
commonFiles.array.forEach(function(commonFile){
var themeFile = folderFiles.dic[commonFiles.dic[commonFile]];
if(themeFile){
// If there is a .less file in the theme folder, use it.
outputFile = themeFile.replace(".less", ".css");
applyLess(themeFile, null, outputFile);
}else{
// Otherwise, fall back to the .less file which is in 'common'.
var fileName = commonFiles.dic[commonFile];
outputFile = folder + "/" + fileName.replace(".less", ".css");
// dojox.mobile mirroring support
if(fileName.indexOf("_rtl") == -1){
applyLess(commonFile, '@import "' + folder + '/variables.less";', outputFile);
}else{
applyLess(commonFile, '@import "' + folder + '/variables_rtl.less";', outputFile);
}
}
});
}else{
folderFiles.array.forEach(function(file){
applyLess(file, null, file.replace(".less", ".css"));
});
}
}
function applyLess(file, prependText, outputFile){
beginProcess();
console.log("compiling:", file);
var parser = new(less.Parser)({paths: [path.dirname(file)], filename: file, optimization: 1});
var lessContent = fs.readFileSync(file, "utf-8");
if(prependText){
lessContent = prependText + lessContent;
}
parser.parse(lessContent, function(error, tree){
if(error){
less.writeError(error);
process.exit(1);
}
var fd = fs.openSync(outputFile, "w");
fs.write(fd, tree.toCSS({compress: false}).replace(/\n/g, "\r\n"), 0, "utf-8", function(f){
fs.close(fd);
console.log("writing:", outputFile);
endProcess();
});
});
}
function getLessFiles(folder){
var filesMap = {};
var filesArray = fs.readdirSync(folder);
filesArray = filesArray.filter(function(file){
return file && /\.less$/.test(file) && !/variables\.less$/.test(file) && !/css3\.less$/.test(file)
&& !/variables_rtl\.less$/.test(file);
});
filesArray = filesArray.map(function(file){
filesMap[file] = folder + "/" + file;
filesMap[folder + "/" + file] = file;
return filesMap[file];
});
return {array: filesArray, dic: filesMap};
}