forked from EFForg/https-everywhere
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmerge-rulesets.js
More file actions
99 lines (81 loc) · 3.12 KB
/
merge-rulesets.js
File metadata and controls
99 lines (81 loc) · 3.12 KB
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
// Merge all the .xml rulesets into a single "default.rulesets" file -- this
// prevents inodes from wasting disk space, but more importantly, works around
// the fact that zip does not perform well on a pile of small files.
// it is a translation of merge-rulesets.py (without linting, backups, git support, unicode normalisation and --fast option), but it doesn't require Python (only WSH)
var fs = new ActiveXObject("Scripting.FileSystemObject"),
shell = new ActiveXObject("WScript.Shell"),
args = WScript.Arguments,
scriptFullPath = WScript.ScriptFullName,
sourceDir = args[0],
targetFile = args[1];
var msg="";
//console or gui?
var enginefile=WScript.FullName;
var stdout=null;
if(enginefile.toLowerCase().indexOf("cscript.exe")>-1){
stdout=WScript.StdOut;
}
function getDir(a) {
return a.substring(0, a.lastIndexOf("\\") || a.lastIndexOf("/"))
}
//checking input
var scriptPath = getDir(WScript.ScriptFullName.toString());
if (!sourceDir) {
sourceDir = sourceDir || (getDir(scriptPath) + "\\src\\chrome\\content\\rules");
}
var defaultFileName="default.rulesets";
if (!targetFile) {
targetFile = sourceDir + "\\" + defaultFileName;
}
//shell.Popup(sourceDir, 0, "HTTPS Everywhere Rules Merger",64);
//shell.Popup(targetFile, 0, "HTTPS Everywhere Rules Merger",64);
if(stdout)
stdout.WriteLine("Merging rulesets... and removing whitespaces and comments...");
var infldr = fs.GetFolder(sourceDir);
var res,fileI;
targetFile=fs.CreateTextFile(targetFile);
function clean_up(rulefile){
//Remove extra whitespace and comments from a rulesets
rulefile = rulefile.replace(/<!--[.\n\r\u2028]*?-->/ig,'');
rulefile = rulefile.replace(/\s+/ig,' ');
//rulefile = rulefile.replace(/\s*(to=|from=)/ig," $1");
rulefile = rulefile.replace(/>\s*</, "><");
//rulefile = rulefile.replace(/<\/ruleset>\s*/ig, "</ruleset>\n");
rulefile = rulefile.replace(/\s*(\/>|<ruleset)/, "$1");
return rulefile;
}
var commitId=shell.Environment("Process")("GIT_COMMIT_ID");//lol, it won't work - there is no such variable
if(commitId)
targetFile.Write('<rulesetlibrary gitcommitid="'+commitId+'">');
else
targetFile.Write('<rulesetlibrary>');
var fileNameRx=/\.xml$/i;
for(fileI = new Enumerator(infldr.Files); !fileI.atEnd(); fileI.moveNext()){
if (file = fileI.item()) {
var name = file.Name;
if(!fileNameRx.test(name))continue;
if(stdout)stdout.WriteLine("Processing file "+name+"...");
var currentFileStream=file.OpenAsTextStream(1);
var ruleset = currentFileStream.ReadAll();
currentFileStream.Close();
delete currentFileStream;
ruleset = ruleset.replace("<ruleset", '<ruleset f="'+name+'"');
targetFile.Write(clean_up(ruleset));
}
}
targetFile.Write("</rulesetlibrary>\n");
targetFile.Close();
delete targetFile;
var currentStageMsg="Merging has been FINISHED!";
if(stdout){
stdout.WriteLine(currentStageMsg);
}else{
msg+="\n"+currentStageMsg;
shell.Popup(msg, 1, "HTTPS Everywhere Rules Merger", 64);
}
/*function normalize(f){
//OSX and Linux filesystems encode composite characters differently in filenames.
//We should normalize to NFC: http://unicode.org/reports/tr15/.
f = unicodedata.normalize('NFC', unicode(f, 'utf-8')).encode('utf-8')
return f
}*/