146 lines
6.2 KiB
JavaScript
146 lines
6.2 KiB
JavaScript
// noinspection JSUnusedLocalSymbols,UnnecessaryLocalVariableJS
|
|
|
|
/* Overwritten protection. */
|
|
|
|
let { images } = global;
|
|
|
|
/**
|
|
* @param {ScriptRuntime} scriptRuntime
|
|
* @param {org.mozilla.javascript.Scriptable | global} scope
|
|
* @return {Internal.Barcode}
|
|
*/
|
|
module.exports = function (scriptRuntime, scope) {
|
|
|
|
let _ = {
|
|
BarcodeCtor: (/* @IIFE */ () => {
|
|
const instanceFunc = function __(img, options) {
|
|
if (typeof arguments[0] === 'string') {
|
|
let image = images.read(/* path = */ arguments[0]);
|
|
if (image === null) {
|
|
throw TypeError(`Invalid image of path "${arguments[0]}" for barcode(img, options?)`);
|
|
}
|
|
let args = [ image.oneShot() ].concat(Array.from(arguments).slice(1));
|
|
return BarcodeCtor.prototype.recognizeText.apply(BarcodeCtor.prototype, args);
|
|
}
|
|
return BarcodeCtor.prototype.recognizeText.apply(BarcodeCtor.prototype, arguments);
|
|
};
|
|
|
|
/**
|
|
* @implements Internal.Barcode
|
|
*/
|
|
const BarcodeCtor = function () {
|
|
let o = Object.assign(instanceFunc, BarcodeCtor.prototype);
|
|
Object.defineProperties(instanceFunc, Object.getOwnPropertyDescriptors(BarcodeCtor.prototype));
|
|
return o;
|
|
};
|
|
|
|
BarcodeCtor.prototype = {
|
|
constructor: BarcodeCtor,
|
|
recognizeTexts() {
|
|
let results = this.detectAll.apply(this, arguments);
|
|
return results.map(result => result.getRawValue()).filter(o => o !== null);
|
|
},
|
|
recognizeText() {
|
|
let results = this.recognizeTexts.apply(this, arguments);
|
|
if (_.shouldTakenAsAll(arguments)) {
|
|
return results;
|
|
}
|
|
return results.length > 0 ? results[0] : null;
|
|
},
|
|
/**
|
|
* @returns {Internal.Barcode.Result[]}
|
|
*/
|
|
detectAll() {
|
|
if (typeof arguments[0] === 'string') {
|
|
|
|
// @Signature
|
|
// detectAll(imgPath: string): Barcode.Result[];
|
|
// detectAll(imgPath: string, options: DetectOptionsWithoutIsAll): Barcode.Result[];
|
|
|
|
let img = images.read(/* path = */ arguments[0]);
|
|
if (img === null) {
|
|
throw TypeError(`Invalid image of path "${arguments[0]}" for barcode.detectAll(img, options?)`);
|
|
}
|
|
// @Overload
|
|
// detectAll(img: ImageWrapper): Barcode.Result[];
|
|
// detectAll(img: ImageWrapper, options: DetectOptionsWithoutIsAll): Barcode.Result[];
|
|
return this.detectAll(img.oneShot(), arguments[1]);
|
|
}
|
|
|
|
if (!(arguments[0] instanceof ImageWrapper)) {
|
|
|
|
// @Signature detectAll(options?: DetectOptionsWithoutIsAll): Barcode.Result[];
|
|
|
|
// @Overload detectAll(img: ImageWrapper, options?: DetectOptionsWithoutIsAll): Barcode.Result[];
|
|
return this.detectAll.apply(this, [ images.captureScreen() ].concat(Array.from(arguments)));
|
|
}
|
|
|
|
// @Signature detectAll(img: ImageWrapper, options?: DetectOptionsWithoutIsAll): Barcode.Result[];
|
|
|
|
let img = arguments[0];
|
|
/** @type {Internal.Barcode.DetectOptionsWithoutIsAll} */
|
|
let opt = /* options */ arguments[1] || {};
|
|
let formats = (() => {
|
|
if (isNullish(opt.format)) {
|
|
return [];
|
|
}
|
|
let results = Array.isArray(opt.format) ? opt.format : [ opt.format ];
|
|
let transformer = {
|
|
FORMAT_QRCODE: 'FORMAT_QR_CODE',
|
|
};
|
|
return results.map((result) => {
|
|
if (typeof result === 'number') {
|
|
return result;
|
|
}
|
|
if (typeof result === 'string') {
|
|
let tmp = result.toUpperCase().replace(/\W+/g, '_');
|
|
let prefix = 'FORMAT_';
|
|
if (!result.startsWith(prefix)) {
|
|
tmp = prefix + tmp;
|
|
}
|
|
if (tmp in transformer) {
|
|
tmp = transformer[tmp];
|
|
}
|
|
return com.google.mlkit.vision.barcode.common.Barcode[tmp];
|
|
}
|
|
throw TypeError(`Unknown format (value: ${result}, species: ${species(result)}) for barcode`);
|
|
});
|
|
})();
|
|
let enableAllPotentialBarcodes = Boolean(opt.enableAllPotentialBarcodes);
|
|
// noinspection JSValidateTypes
|
|
return scriptRuntime.barcode.detect(img, formats, enableAllPotentialBarcodes);
|
|
},
|
|
detect() {
|
|
let results = this.detectAll.apply(this, arguments);
|
|
if (_.shouldTakenAsAll(arguments)) {
|
|
return results;
|
|
}
|
|
return results.length > 0 ? results[0] : null;
|
|
},
|
|
};
|
|
|
|
return BarcodeCtor;
|
|
})(),
|
|
/**
|
|
* @param {IArguments} args
|
|
* @returns {boolean}
|
|
*/
|
|
shouldTakenAsAll(args) {
|
|
if (args.length === 0) {
|
|
return false;
|
|
}
|
|
/**
|
|
* @type {Internal.Barcode.DetectOptions | boolean | OmniRegion}
|
|
*/
|
|
let arg = args[args.length - 1];
|
|
return arg === true || isObject(arg) && Boolean(arg.isAll);
|
|
},
|
|
};
|
|
|
|
/**
|
|
* @type {Internal.Barcode}
|
|
*/
|
|
const barcode = new _.BarcodeCtor();
|
|
|
|
return barcode;
|
|
}; |