Browse Source

Minor refactor

pull/265/head
Jerome Wu 7 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 @@
const check = require('check-types'); const check = require('check-types');
const resolveURL = require('resolve-url'); const resolveURL = require('resolve-url');
const { defaultOptions } = require('../common/options');
const { version } = require('../../package.json'); 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) => { const loadImage = (image) => {
if (check.string(image)) { if (check.string(image)) {
return fetch(resolveURL(image)) return fetch(resolveURL(image))
@ -31,7 +20,13 @@ const loadImage = (image) => {
return Promise.reject(); 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) => { exports.spawnWorker = (instance, workerOptions) => {
let worker; let worker;

5
src/common/options.js

@ -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;
let latestJob; let latestJob;
let adapter = {}; 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) => { const handleInit = (req, res) => {
let MIN_MEMORY = 100663296; let MIN_MEMORY = 100663296;
@ -31,101 +45,80 @@ const handleInit = (req, res) => {
}); });
} }
return new Promise(); return Promise.resolve();
};
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 loadLanguage = (req, res, cb) => { const loadLanguage = (req) => {
const { options: { lang }, workerOptions: { langPath } } = req; const { options: { lang }, workerOptions: { langPath } } = req;
return loadLang({ return loadLang({
langs: lang, langs: lang,
tessModule: Module, tessModule: Module,
langURI: langPath, 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 handleRecognize = (req, res) => (
const handleDetect = (req, res) => {
handleInit(req, res) handleInit(req, res)
.then(() => { .then(() => (
req.options.lang = 'osd'; loadLanguage(req)
loadLanguage(req, res, () => { .then(() => {
base.Init(null, 'osd'); const { options } = req;
base.SetPageSegMode(Module.PSM_OSD_ONLY); const progressUpdate = (progress) => {
res.progress({ status: 'initializing api', progress });
const ptr = setImage(req.image); };
const results = new Module.OSResults(); progressUpdate(0);
base.Init(null, options.lang);
if (!base.DetectOS(results)) { 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(); base.End();
Module._free(ptr); Module._free(ptr);
res.reject('Failed to detect OS'); res.resolve(result);
} 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({ const handleDetect = (req, res) => (
tesseract_script_id: sid, handleInit(req, res)
script: results.get_unicharset().get_script_from_script_id(sid), .then(() => (
script_confidence: best.get_sconfidence(), loadLanguage({ ...req, options: { ...req.options, lang: 'osd' } })
orientation_degrees: [0, 270, 180, 90][oid], .then(() => {
orientation_confidence: best.get_oconfidence(), 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) => { exports.dispatchHandlers = (packet, send) => {
const respond = (status, data) => { const respond = (status, data) => {

3
src/node/index.js

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

Loading…
Cancel
Save