stubbornella/csslint — Issue #198: Support Windows Script Host CLI
Author: DinoChiesa
Created: 2011-10-20 02:32:33+00:00
State: open

Support a WSH CLI. It's very similar to the Rhino CLI. I had to add array prototype methods for indexOf, forEach and filter. Here's the code I used:

```javascript
var wshapi = (function(){
var fso = new ActiveXObject("Scripting.FileSystemObject");
var shell = WScript.CreateObject("WScript.Shell");
var arguments = [], i, args = WScript.Arguments;

if (typeof Array.prototype.forEach !== "function") {
Array.prototype.forEach = function(f,m) {
for (var i=0, L=this.length; i>> 0;
if (len === 0) {
return -1;
}
var n = 0;
if (arguments.length > 0) {
n = Number(arguments[1]);
if (n !== n) { // shortcut for verifying if it's NaN
n = 0;
} else if (n !== 0 && n !== Infinity && n !== -Infinity) {
n = (n > 0 || -1) * Math.floor(Math.abs(n));
}
}
if (n >= len) {
return -1;
}
var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
for (; k < len; k++) {
if (k in t && t[k] === searchElement) {
return k;
}
}
return -1;
}
}

function traverseDir(files, path) {
var filename, folder = fso.GetFolder(path),
subFlds, fc = new Enumerator(folder.files);

for (; !fc.atEnd(); fc.moveNext()) {
filename = fc.item()
if (/\.css$/.test(filename)) {
files.push(filename);
}
}

subFlds = new Enumerator(folder.SubFolders);
for (; !subFlds.atEnd(); subFlds.moveNext()) {
traverseDir(files, subFlds.item());
}
}

// turn the WScript.Arguments thing into a regular array
if (args.Length > 0) {
for (i = 0; i < args.Length; i++) {
arguments.push(args(i))
}
}

return {
args: arguments,
print: function(s) { WScript.Echo(s);},
quit: function (v) { WScript.Quit(v);},

isDirectory: function(name){
return fso.FolderExists(name);
},

getFiles: function(dir){
var files = [];
traverseDir(files, dir);
return files;
},

fixFilenames: function(files){
return files;
},

getWorkingDirectory: function() {
return shell.CurrentDirectory;
},

getFullPath: function(filename){
return fso.GetAbsolutePathName(filename);
},

readFile: function(path){
var forReading = 1;
var tf = fso.OpenTextFile(path, forReading);
var allText = tf.ReadAll();
tf.Close();
return allText;
}
};

}());

cli(wshapi);
```

Also, I needed to change the fire function to use typeof and not just a negation:

```javascript
fire: function(event){
if (typeof event == "string"){
event = { type: event };
}
if (typeof event.target == "undefined"){ // compat with wsh
event.target = this;
}

if (typeof event.type == "undefined"){ // for wsh
throw new Error("Event object missing 'type' property.");
}

if (this._listeners[event.type]){

//create a copy of the array and use that so listeners can't chane
var listeners = this._listeners[event.type].concat();
for (var i=0, len=listeners.length; i < len; i++){
listeners[i].call(this, event);
}
}
},

```