Browse Source

Minor refactor

pull/265/head
Jerome Wu 6 years ago
parent
commit
f488f4d204
  1. 21
      src/browser/index.js
  2. 5
      src/common/options.js
  3. 155
      src/common/worker.js
  4. 3
      src/node/index.js

21
src/browser/index.js

@ -1,19 +1,8 @@ @@ -1,19 +1,8 @@
const check = require('check-types');
const resolveURL = require('resolve-url');
const { defaultOptions } = require('../common/options');
const { version } = require('../../package.json');
const defaultOptions = {
corePath: `https://cdn.jsdelivr.net/gh/naptha/tesseract.js-core@v2.0.0-beta.5/tesseract-core${typeof WebAssembly === 'object' ? '' : '.asm'}.js`,
langPath: 'https://tessdata.projectnaptha.com/4.0.0',
};
if (process.env.NODE_ENV === 'development') {
console.debug('Using Development Configuration');
defaultOptions.workerPath = resolveURL(`/dist/worker.dev.js?nocache=${Math.random().toString(36).slice(3)}`);
} else {
defaultOptions.workerPath = `https://cdn.jsdelivr.net/gh/naptha/tesseract.js@${version}/dist/worker.min.js`;
}
const loadImage = (image) => {
if (check.string(image)) {
return fetch(resolveURL(image))
@ -31,7 +20,13 @@ const loadImage = (image) => { @@ -31,7 +20,13 @@ const loadImage = (image) => {
return Promise.reject();
};
exports.defaultOptions = defaultOptions;
exports.defaultOptions = {
...defaultOptions,
workerPath: process.env.NODE_ENV === 'development'
? resolveURL(`/dist/worker.dev.js?nocache=${Math.random().toString(36).slice(3)}`)
: `https://cdn.jsdelivr.net/gh/naptha/tesseract.js@v${version}/dist/worker.min.js`,
corePath: `https://cdn.jsdelivr.net/gh/naptha/tesseract.js-core@v2.0.0-beta.5/tesseract-core${typeof WebAssembly === 'object' ? '' : '.asm'}.js`,
};
exports.spawnWorker = (instance, workerOptions) => {
let worker;

5
src/common/options.js

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
module.exports = {
defaultOptions: {
langPath: 'https://tessdata.projectnaptha.com/4.0.0',
},
};

155
src/common/worker.js

@ -6,6 +6,20 @@ let base; @@ -6,6 +6,20 @@ let base;
let latestJob;
let adapter = {};
const setImage = (image) => {
const {
w, h, bytesPerPixel, data, pix,
} = readImage(Module, Array.from(image));
if (data === null) {
base.SetImage(pix);
} else {
base.SetImage(data, w, h, bytesPerPixel, w * bytesPerPixel);
}
base.SetRectangle(0, 0, w, h);
return data;
};
const handleInit = (req, res) => {
let MIN_MEMORY = 100663296;
@ -31,101 +45,80 @@ const handleInit = (req, res) => { @@ -31,101 +45,80 @@ const handleInit = (req, res) => {
});
}
return new Promise();
};
const setImage = (image) => {
const {
w, h, bytesPerPixel, data, pix,
} = readImage(Module, Array.from(image));
if (data === null) {
base.SetImage(pix);
} else {
base.SetImage(data, w, h, bytesPerPixel, w * bytesPerPixel);
}
base.SetRectangle(0, 0, w, h);
return data;
return Promise.resolve();
};
const loadLanguage = (req, res, cb) => {
const loadLanguage = (req) => {
const { options: { lang }, workerOptions: { langPath } } = req;
return loadLang({
langs: lang,
tessModule: Module,
langURI: langPath,
}).then(cb);
};
const handleRecognize = (req, res) => {
handleInit(req, res)
.then(() => {
loadLanguage(req, res, () => {
const { options } = req;
const progressUpdate = (progress) => {
res.progress({ status: 'initializing api', progress });
};
progressUpdate(0);
base.Init(null, options.lang);
progressUpdate(0.3);
Object.keys(options).forEach((key) => {
base.SetVariable(key, options[key]);
});
progressUpdate(0.6);
const ptr = setImage(req.image);
progressUpdate(1);
base.Recognize(null);
const result = dump(Module, base);
base.End();
Module._free(ptr);
res.resolve(result);
});
});
});
};
const handleDetect = (req, res) => {
const handleRecognize = (req, res) => (
handleInit(req, res)
.then(() => {
req.options.lang = 'osd';
loadLanguage(req, res, () => {
base.Init(null, 'osd');
base.SetPageSegMode(Module.PSM_OSD_ONLY);
const ptr = setImage(req.image);
const results = new Module.OSResults();
if (!base.DetectOS(results)) {
.then(() => (
loadLanguage(req)
.then(() => {
const { options } = req;
const progressUpdate = (progress) => {
res.progress({ status: 'initializing api', progress });
};
progressUpdate(0);
base.Init(null, options.lang);
progressUpdate(0.3);
Object.keys(options).forEach((key) => {
base.SetVariable(key, options[key]);
});
progressUpdate(0.6);
const ptr = setImage(req.image);
progressUpdate(1);
base.Recognize(null);
const result = dump(Module, base);
base.End();
Module._free(ptr);
res.reject('Failed to detect OS');
} else {
const best = results.get_best_result();
const oid = best.get_orientation_id();
const sid = best.get_script_id();
res.resolve(result);
})
))
);
base.End();
Module._free(ptr);
res.resolve({
tesseract_script_id: sid,
script: results.get_unicharset().get_script_from_script_id(sid),
script_confidence: best.get_sconfidence(),
orientation_degrees: [0, 270, 180, 90][oid],
orientation_confidence: best.get_oconfidence(),
});
}
});
});
};
const handleDetect = (req, res) => (
handleInit(req, res)
.then(() => (
loadLanguage({ ...req, options: { ...req.options, lang: 'osd' } })
.then(() => {
base.Init(null, 'osd');
base.SetPageSegMode(Module.PSM_OSD_ONLY);
const ptr = setImage(req.image);
const results = new Module.OSResults();
if (!base.DetectOS(results)) {
base.End();
Module._free(ptr);
res.reject('Failed to detect OS');
} else {
const best = results.get_best_result();
const oid = best.get_orientation_id();
const sid = best.get_script_id();
base.End();
Module._free(ptr);
res.resolve({
tesseract_script_id: sid,
script: results.get_unicharset().get_script_from_script_id(sid),
script_confidence: best.get_sconfidence(),
orientation_degrees: [0, 270, 180, 90][oid],
orientation_confidence: best.get_oconfidence(),
});
}
})
))
);
exports.dispatchHandlers = (packet, send) => {
const respond = (status, data) => {

3
src/node/index.js

@ -4,6 +4,7 @@ const fetch = require('node-fetch'); @@ -4,6 +4,7 @@ const fetch = require('node-fetch');
const isURL = require('is-url');
const { fork } = require('child_process');
const path = require('path');
const { defaultOptions } = require('../common/options');
const readFile = util.promisify(fs.readFile);
@ -16,8 +17,8 @@ const loadImage = (imageURI) => { @@ -16,8 +17,8 @@ const loadImage = (imageURI) => {
};
exports.defaultOptions = {
...defaultOptions,
workerPath: path.join(__dirname, 'worker.js'),
langPath: 'https://tessdata.projectnaptha.com/4.0.0/',
};
exports.spawnWorker = (instance, { workerPath }) => {

Loading…
Cancel
Save