nnnjjj123
2020-11-17 1b2c1edb61190eeb19f465ff031eaa3b2a1b8dbc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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};
}