2020-06-28 14:22:57 +00:00
|
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// std.js
|
|
|
|
//
|
|
|
|
// Common routines. Defines LIB object which contains the API, as well as
|
|
|
|
// a global DBG function.
|
|
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
2020-07-19 21:19:33 +00:00
|
|
|
// Polyfills
|
2020-06-28 14:22:57 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
2022-02-10 06:25:19 +00:00
|
|
|
|
2020-07-19 21:19:33 +00:00
|
|
|
if (!Function.prototype.GetResource) {
|
2020-06-28 16:37:15 +00:00
|
|
|
Function.prototype.GetResource = function(ResourceName) {
|
2020-07-03 09:15:23 +00:00
|
|
|
if (!this.Resources) {
|
|
|
|
var UnNamedResourceIndex = 0,
|
|
|
|
_this = this;
|
2020-06-28 16:37:15 +00:00
|
|
|
this.Resources = {};
|
2020-07-03 09:15:23 +00:00
|
|
|
|
|
|
|
function f(match, resType, Content) {
|
|
|
|
_this.Resources[(resType == "[[") ? UnNamedResourceIndex++ : resType.slice(1, -1)] = Content;
|
2020-06-28 16:37:15 +00:00
|
|
|
}
|
|
|
|
this.toString().replace(/\/\*(\[(?:[^\[]+)?\[)((?:[\r\n]|.)*?)\]\]\*\//gi, f);
|
2020-06-28 14:22:57 +00:00
|
|
|
}
|
2020-07-03 09:15:23 +00:00
|
|
|
|
2020-06-28 16:37:15 +00:00
|
|
|
return this.Resources[ResourceName];
|
2020-06-28 14:22:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-13 08:44:58 +00:00
|
|
|
if (!Enumerator.prototype.toArray) {
|
|
|
|
Enumerator.prototype.toArray = function() {
|
2022-04-11 02:08:40 +00:00
|
|
|
var items = [];
|
|
|
|
for (; !this.atEnd(); this.moveNext()) {
|
|
|
|
var item = this.item();
|
|
|
|
try {
|
|
|
|
items.push(item);
|
|
|
|
} catch (e) {}
|
|
|
|
}
|
|
|
|
return items;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Enumerator.prototype.toArray2) {
|
|
|
|
Enumerator.prototype.toArray2 = function() {
|
2022-02-10 06:25:19 +00:00
|
|
|
var a = [];
|
2020-11-13 08:44:58 +00:00
|
|
|
for (; !this.atEnd(); this.moveNext()) {
|
2022-02-10 06:25:19 +00:00
|
|
|
var x = {};
|
|
|
|
var b = new Enumerator(this.item().Properties_);
|
|
|
|
for (; !b.atEnd(); b.moveNext()) {
|
|
|
|
var c = b.item();
|
|
|
|
if (typeof c.value !== "unknown") {
|
|
|
|
try {
|
|
|
|
x[c.name] = c.value.toString();
|
|
|
|
} catch (e) {
|
|
|
|
x[c.name] = c.value;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
var i = 0, d = [];
|
|
|
|
while (true) {
|
|
|
|
try {
|
|
|
|
d.push(c.value(i));
|
|
|
|
i++;
|
|
|
|
} catch (e) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
x[c.name] = d;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
a.push(x);
|
2020-11-13 08:44:58 +00:00
|
|
|
}
|
2022-02-10 06:25:19 +00:00
|
|
|
return a;
|
2020-11-13 08:44:58 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2020-07-19 21:19:33 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Global APIs
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2022-02-10 06:25:19 +00:00
|
|
|
function GetResource(ResourceName) {
|
2020-06-28 14:22:57 +00:00
|
|
|
return arguments.callee.caller.GetResource(ResourceName);
|
|
|
|
}
|
|
|
|
|
2022-02-10 06:25:19 +00:00
|
|
|
// [lib/std] the time of `sleep()' function is not accuracy #34
|
|
|
|
function sleep(ms, callback) {
|
|
|
|
var handler = null;
|
|
|
|
|
|
|
|
var cur = Date.now();
|
|
|
|
var end = cur + ms;
|
|
|
|
|
|
|
|
if (typeof WScript !== "undefined") {
|
|
|
|
/*
|
|
|
|
while (cur < end) {
|
|
|
|
//WScript.Sleep(1);
|
|
|
|
cur = Date.now();
|
2022-02-10 03:09:52 +00:00
|
|
|
}
|
2022-02-10 06:25:19 +00:00
|
|
|
end = Date.now();
|
|
|
|
*/
|
|
|
|
|
|
|
|
WScript.Sleep(ms);
|
|
|
|
if (typeof callback === "function")
|
|
|
|
callback()
|
|
|
|
;
|
|
|
|
} else if (typeof window !== "undefined") {
|
|
|
|
if (typeof callback === "function")
|
|
|
|
handler = setTimeout(callback, ms);
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
|
|
|
return { 'ms': end, 'handler': handler };
|
|
|
|
};
|
|
|
|
|
|
|
|
function repeat(target, callback, onError) {
|
|
|
|
switch (typeof target) {
|
|
|
|
case "number":
|
|
|
|
case "boolean":
|
|
|
|
var ms = target;
|
|
|
|
|
|
|
|
var i = 0;
|
|
|
|
var result = null;
|
|
|
|
var handler = null;
|
|
|
|
var cur = Date.now();
|
|
|
|
var end = cur + ms;
|
|
|
|
|
|
|
|
if (typeof WScript !== "undefined") {
|
|
|
|
while (ms === true ? true : (cur < end)) {
|
|
|
|
try {
|
2022-02-20 22:17:48 +00:00
|
|
|
if (typeof callback === "function") {
|
2022-02-10 06:25:19 +00:00
|
|
|
var result = callback(i);
|
|
|
|
if (typeof result === "number") {
|
|
|
|
i += result;
|
|
|
|
} else if (result === false) {
|
|
|
|
break;
|
2022-02-20 22:17:48 +00:00
|
|
|
} else if (result === true) {
|
|
|
|
i += 1;
|
2022-02-10 06:25:19 +00:00
|
|
|
}
|
2022-02-20 22:17:48 +00:00
|
|
|
}
|
2022-02-10 06:25:19 +00:00
|
|
|
} catch (e) {
|
2022-02-20 22:17:48 +00:00
|
|
|
if (typeof onError === "function") {
|
2022-03-03 05:41:20 +00:00
|
|
|
if (onError(e, i) === false) {
|
2022-02-20 22:17:48 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2022-02-10 06:25:19 +00:00
|
|
|
}
|
|
|
|
cur = Date.now();
|
|
|
|
}
|
|
|
|
end = Date.now();
|
|
|
|
} else if (typeof window !== "undefined") {
|
2022-02-20 22:18:28 +00:00
|
|
|
if (typeof callback === "function") {
|
2022-02-10 06:25:19 +00:00
|
|
|
handler = setInterval(callback, ms);
|
2022-02-20 22:18:28 +00:00
|
|
|
}
|
2022-02-10 06:25:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return { 'ms': end, 'handler': handler };
|
|
|
|
|
|
|
|
case "object":
|
|
|
|
var arr = target;
|
2022-02-10 08:16:59 +00:00
|
|
|
if (arr.length > 0) {
|
|
|
|
for (var i = 0; i < arr.length; i++) {
|
|
|
|
try {
|
|
|
|
if (typeof callback === "function")
|
|
|
|
if (callback(i, arr[i]) === false)
|
|
|
|
break
|
|
|
|
;
|
2022-02-10 06:25:19 +00:00
|
|
|
;
|
2022-02-10 08:16:59 +00:00
|
|
|
} catch (e) {
|
|
|
|
if (typeof onError === "function")
|
2022-03-03 05:41:20 +00:00
|
|
|
if (onError(e, i, arr[i]) === false)
|
2022-02-10 08:16:59 +00:00
|
|
|
break
|
|
|
|
;
|
2022-02-10 06:25:19 +00:00
|
|
|
;
|
2022-02-10 08:16:59 +00:00
|
|
|
}
|
2022-02-10 06:25:19 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
function rotate(target, callback, onError) {
|
|
|
|
var arr = target;
|
|
|
|
var i = 0;
|
|
|
|
var stop = false;
|
|
|
|
|
|
|
|
while (!stop) {
|
|
|
|
try {
|
|
|
|
if (typeof callback === "function") {
|
|
|
|
stop = callback(i, arr[i]);
|
|
|
|
} else {
|
|
|
|
stop = true;
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
if (typeof onError === "function")
|
2022-03-03 05:41:20 +00:00
|
|
|
stop = onError(e, i, arr[i]);
|
2022-02-10 06:25:19 +00:00
|
|
|
;
|
2022-02-08 09:10:10 +00:00
|
|
|
}
|
2022-02-10 06:25:19 +00:00
|
|
|
|
|
|
|
i++;
|
2022-02-14 06:09:01 +00:00
|
|
|
i = i % target.length;
|
2022-02-10 06:25:19 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
function range() {
|
|
|
|
var args = arguments;
|
|
|
|
var N = [], start, end, step;
|
|
|
|
|
|
|
|
switch(args.length) {
|
|
|
|
case 3:
|
|
|
|
start = args[0];
|
|
|
|
end = args[1];
|
|
|
|
step = args[2];
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 2:
|
|
|
|
start = args[0];
|
|
|
|
end = args[1];
|
|
|
|
step = 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 1:
|
|
|
|
start = 0;
|
|
|
|
end = args[0];
|
|
|
|
step = 1;
|
|
|
|
break;
|
2022-02-08 09:55:29 +00:00
|
|
|
}
|
2022-02-10 06:25:19 +00:00
|
|
|
|
|
|
|
for (var i = start; i < end; i = i + step)
|
|
|
|
N.push(i)
|
|
|
|
;
|
|
|
|
|
|
|
|
return N;
|
2022-02-08 09:55:29 +00:00
|
|
|
};
|
|
|
|
|
2022-02-10 06:25:19 +00:00
|
|
|
function CHR(ord) {
|
2020-11-04 07:30:52 +00:00
|
|
|
return String.fromCharCode(ord);
|
2022-01-08 14:12:59 +00:00
|
|
|
};
|
2020-10-26 12:01:05 +00:00
|
|
|
|
2022-02-10 06:25:19 +00:00
|
|
|
function splitLn(s) {
|
|
|
|
return s.split(/\r?\n/);
|
|
|
|
};
|
|
|
|
|
|
|
|
function addslashes(s) {
|
|
|
|
return s.toString().replace(/\\/g, '\\\\').
|
|
|
|
replace(/\u0008/g, '\\b').
|
|
|
|
replace(/\t/g, '\\t').
|
|
|
|
replace(/\n/g, '\\n').
|
|
|
|
replace(/\f/g, '\\f').
|
|
|
|
replace(/\r/g, '\\r').
|
|
|
|
replace(/'/g, '\\\'').
|
|
|
|
replace(/"/g, '\\"')
|
|
|
|
;
|
|
|
|
};
|
|
|
|
|
2022-04-29 07:11:49 +00:00
|
|
|
function cartesian(arr) {
|
|
|
|
return arr.reduce(function(a, b) {
|
|
|
|
return a.map(function(x) {
|
|
|
|
return b.map(function(y) {
|
|
|
|
return x.concat([y]);
|
|
|
|
})
|
|
|
|
}).reduce(function(a, b) {
|
|
|
|
return a.concat(b);
|
|
|
|
}, []);
|
|
|
|
}, [
|
|
|
|
[]
|
|
|
|
]);
|
|
|
|
};
|
|
|
|
|
2020-06-28 14:22:57 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Private APIs / Utility functions
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Emulate Server.CreateObject
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2022-02-10 06:25:19 +00:00
|
|
|
function CreateObject(progId, serverName, callback) {
|
2020-10-20 05:18:00 +00:00
|
|
|
var progIds = [];
|
|
|
|
var _CreateObject = function(p, s) {
|
|
|
|
if (typeof(WScript) !== "undefined") {
|
|
|
|
return WScript.CreateObject(p, s);
|
|
|
|
} else {
|
2020-11-10 09:13:41 +00:00
|
|
|
return new ActiveXObject(p);
|
2020-10-20 05:18:00 +00:00
|
|
|
}
|
|
|
|
};
|
2020-10-20 02:41:26 +00:00
|
|
|
|
2020-10-20 05:18:00 +00:00
|
|
|
if (typeof(progId) == "object") {
|
|
|
|
progIds = progId;
|
2020-10-20 02:41:26 +00:00
|
|
|
} else {
|
2020-10-20 05:18:00 +00:00
|
|
|
progIds.push(progId);
|
2020-10-20 02:41:26 +00:00
|
|
|
}
|
|
|
|
|
2020-10-20 05:18:00 +00:00
|
|
|
for (var i = 0; i < progIds.length; i++) {
|
|
|
|
try {
|
2020-11-10 09:13:41 +00:00
|
|
|
var obj = _CreateObject(progIds[i], serverName);
|
|
|
|
if (typeof(callback) === "function") {
|
|
|
|
callback(obj, progIds[i]);
|
|
|
|
}
|
|
|
|
return obj;
|
2020-11-04 07:30:52 +00:00
|
|
|
} catch (e) {
|
|
|
|
console.error(e.message);
|
|
|
|
};
|
2020-10-20 02:41:26 +00:00
|
|
|
}
|
2020-07-03 09:15:23 +00:00
|
|
|
};
|
2020-06-28 14:22:57 +00:00
|
|
|
|
2022-04-28 04:11:26 +00:00
|
|
|
function alert(msg) {
|
|
|
|
CreateObject("WScript.Shell").Popup(msg);
|
|
|
|
}
|
|
|
|
|
2022-02-10 06:25:19 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Standard Event Object
|
2020-06-28 14:22:57 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
2020-11-14 13:16:47 +00:00
|
|
|
|
2022-05-10 02:45:02 +00:00
|
|
|
// https://developer.mozilla.org/ko/docs/Web/API/Event
|
|
|
|
|
|
|
|
function StdEvent(type) {
|
2022-01-08 14:12:59 +00:00
|
|
|
this.defaultPrevented = false;
|
|
|
|
this.timeStamp = new Date();
|
2022-05-10 02:45:02 +00:00
|
|
|
this.type = type;
|
2022-05-10 02:46:12 +00:00
|
|
|
this.isTrusted = true;
|
|
|
|
this.cancelable = true;
|
2022-01-08 14:12:59 +00:00
|
|
|
this.target = null;
|
2022-05-10 02:46:12 +00:00
|
|
|
this.currentTarget = null;
|
|
|
|
this.eventPhase = StdEvent.NONE;
|
|
|
|
this.bubbles = false; // Not used but to be compatible
|
|
|
|
this.composed = false; // Not used but to be compatible
|
2022-01-08 14:12:59 +00:00
|
|
|
|
|
|
|
this.preventDefault = function() {
|
|
|
|
this.defaultPrevented = true;
|
|
|
|
};
|
2022-05-10 02:45:02 +00:00
|
|
|
|
|
|
|
// Not used but to be compatible
|
|
|
|
this.initEvent(type, bubbles, cancelable) {
|
|
|
|
this.type = type;
|
|
|
|
this.bubbles = bubbles;
|
|
|
|
this.cancelable = cancelable;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Not used but to be compatible
|
|
|
|
this.stopImmediatePropagation = function() {};
|
|
|
|
|
|
|
|
// Not used but to be compatible
|
|
|
|
this.stopPropagation = function() {};
|
2022-01-08 14:12:59 +00:00
|
|
|
};
|
2022-05-10 02:45:02 +00:00
|
|
|
StdEvent.NONE = 0;
|
|
|
|
StdEvent.CAPTURING_PHASE = 1; // Not used but to be compatible
|
|
|
|
StdEvent.AT_TARGET = 2;
|
|
|
|
StdEvent.BUBBLING_PHASE = 3; // Not used but to be compatible
|
2022-01-08 14:12:59 +00:00
|
|
|
|
2022-02-10 06:25:19 +00:00
|
|
|
function StdEventableObject() {
|
2022-01-08 14:12:59 +00:00
|
|
|
this.dispatchEvent = function(event) {
|
|
|
|
event.target = this;
|
2022-05-10 02:45:02 +00:00
|
|
|
event.isTrusted = false;
|
|
|
|
event.eventPhase = StdEvent.AT_TARGET;
|
|
|
|
event.currentTarget = event.target;
|
|
|
|
if(('on' + event.type) in this) this['on' + event.type](event);
|
2022-01-08 14:12:59 +00:00
|
|
|
};
|
|
|
|
|
2022-05-10 02:45:02 +00:00
|
|
|
this.addEventListener = function(type, f) {
|
|
|
|
if (typeof f === "function") {
|
|
|
|
this['on' + type] = f;
|
2022-01-08 14:12:59 +00:00
|
|
|
} else {
|
|
|
|
throw new TypeError("EventListener must be a function");
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2022-02-24 08:13:31 +00:00
|
|
|
function AsyncFunction(f) {
|
2022-02-25 05:42:17 +00:00
|
|
|
this.htmlfile = null;
|
|
|
|
this.proxyWindow = null;
|
2022-02-24 08:13:31 +00:00
|
|
|
this.f = f;
|
2022-02-25 05:42:17 +00:00
|
|
|
|
2022-02-24 08:13:31 +00:00
|
|
|
this.run = function() {
|
2022-05-09 08:56:21 +00:00
|
|
|
AsyncFunction.counter++; // increase number of async functions
|
2022-05-09 08:55:47 +00:00
|
|
|
|
|
|
|
var _this = this;
|
|
|
|
var f = function() {
|
|
|
|
_this.f();
|
|
|
|
AsyncFunction.counter--; // decrease number of async functions
|
|
|
|
};
|
|
|
|
|
2022-02-25 05:42:17 +00:00
|
|
|
if (this.proxyWindow != null) {
|
2022-02-25 05:55:06 +00:00
|
|
|
try {
|
2022-05-09 08:55:47 +00:00
|
|
|
this.proxyWindow.setTimeout(1, f);
|
2022-02-25 05:55:06 +00:00
|
|
|
} catch (e) {
|
|
|
|
console.warn("AsyncFunction proxyWindow.setTimeout failed:", e.message);
|
2022-05-09 08:55:47 +00:00
|
|
|
sleep(1, f);
|
2022-02-25 05:55:06 +00:00
|
|
|
}
|
2022-02-25 05:42:17 +00:00
|
|
|
} else {
|
2022-05-09 08:55:47 +00:00
|
|
|
sleep(1, f);
|
2022-02-25 05:42:17 +00:00
|
|
|
}
|
2022-02-24 08:13:31 +00:00
|
|
|
};
|
2022-04-11 06:35:53 +00:00
|
|
|
|
2022-02-24 08:13:31 +00:00
|
|
|
this.runSynchronously = function() {
|
2022-02-25 05:42:17 +00:00
|
|
|
return this.f.apply(null, arguments);
|
2022-02-24 08:13:31 +00:00
|
|
|
};
|
2022-02-25 05:42:17 +00:00
|
|
|
|
|
|
|
// https://qiita.com/abcang/items/80b5733b5a96eeff9945
|
|
|
|
if (typeof WScript !== "undefined") {
|
|
|
|
try {
|
|
|
|
this.htmlfile = CreateObject("htmlfile");
|
|
|
|
this.proxyWindow = this.htmlfile.parentWindow;
|
|
|
|
} catch (e) {
|
|
|
|
console.warn("AsyncFunction require HTMLFILE object in WScript");
|
|
|
|
}
|
|
|
|
}
|
2022-02-24 08:13:31 +00:00
|
|
|
};
|
2022-05-09 08:55:47 +00:00
|
|
|
AsyncFunction.counter = 0; // static variable
|
2022-02-24 08:13:31 +00:00
|
|
|
|
2022-02-10 06:25:19 +00:00
|
|
|
global.GetResource = GetResource;
|
|
|
|
global.sleep = sleep;
|
|
|
|
global.repeat = repeat;
|
|
|
|
global.rotate = rotate;
|
|
|
|
global.range = range;
|
|
|
|
global.CHR = CHR;
|
|
|
|
global.splitLn = splitLn;
|
|
|
|
global.addslashes = addslashes;
|
2022-02-24 08:13:31 +00:00
|
|
|
global.AsyncFunction = AsyncFunction;
|
2022-02-10 06:25:19 +00:00
|
|
|
|
2022-05-09 08:58:31 +00:00
|
|
|
exports.VERSIONINFO = "Standard Library (std.js) version 0.7";
|
2020-11-14 13:16:47 +00:00
|
|
|
exports.global = global;
|
|
|
|
exports.require = global.require;
|
2022-01-08 14:12:59 +00:00
|
|
|
|
2022-01-08 14:35:07 +00:00
|
|
|
exports.Event = StdEvent;
|
2022-02-25 05:42:17 +00:00
|
|
|
exports.EventableObject = StdEventableObject;
|
2022-04-29 07:11:49 +00:00
|
|
|
|
2022-04-28 04:11:26 +00:00
|
|
|
exports.alert = alert;
|
2022-04-29 07:11:49 +00:00
|
|
|
exports.cartesian = cartesian;
|