VulpesOS/gaia/apps/keyboard/js/imes/jspinyin/worker.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

175 lines
4.6 KiB
JavaScript
Executable file

/* -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
/* jshint sub: true */
'use strict';
var Module;
var emEngine;
var procFunction;
self.onmessage = function(e) {
var data = e.data;
if (data.id == 'init') {
initModule(data.id, data.param);
} else if (procFunction[data.id]) {
var result = procFunction[data.id](data.param);
post(data.id, result);
} else {
log('echo: ' + JSON.stringify(e.data));
}
};
function initModule(msgId, param) {
Module = {
canvas: {},
stdout: null,
setStatus: log,
preRun: [function() {
if (param.userDict) {
Module['addRunDependency']('fp data/user_dict.data');
Module['FS_createPreloadedFile'](
'/data', 'user_dict.data', param.userDict, true, true, function() {
Module['removeRunDependency']('fp data/user_dict.data');
});
}
}],
_main: function() {
emEngine = {
openDecoder:
Module.cwrap('im_open_decoder', 'number', ['string', 'string']),
closeDecoder:
Module.cwrap('im_close_decoder', '', []),
search:
Module.cwrap('im_search', 'number', ['string', 'number']),
resetSearch:
Module.cwrap('im_reset_search', '', []),
getCandidateAt:
Module.cwrap('im_get_candidate_char', 'string', ['number']),
getPredicts:
Module.cwrap('im_get_predicts_utf8', 'number', ['string', 'number']),
getPredictAt:
Module.cwrap('im_get_predict_at', 'string', ['number']),
choose:
Module.cwrap('im_choose', 'number', ['number']),
getSplStart:
Module.cwrap('im_get_spl_start', 'number', []),
getSplStartAt:
Module.cwrap('im_get_spl_start_at', 'number', ['number']),
getFixedLen:
Module.cwrap('im_get_fixed_len', 'number', []),
flushCache:
Module.cwrap('im_flush_cache', '', [])
};
if (emEngine.openDecoder('data/dict.data', 'data/user_dict.data')) {
initProcFunctions();
post(msgId, true);
} else {
post(msgId, false);
}
}
};
try {
importScripts('empinyin_files.js');
importScripts('libpinyin.js');
} catch (e) {
log(e.toString());
post(msgId, false);
}
}
function initProcFunctions() {
var getSearchResult = function(emEngineGetAt, param) {
var start = param.start;
var count = param.count;
var results = [];
for (var i = start; i < count; i++) {
results.push(emEngineGetAt(i));
}
return results;
};
var search = function(emEngineSearch, emEngineGetAt, param) {
var query = param.queryString;
var numberToReturn = param.limit;
var resultLen = emEngineSearch(query, query.length);
var results;
if (numberToReturn) {
if (numberToReturn < 0 || numberToReturn > resultLen) {
numberToReturn = resultLen;
}
results = getSearchResult(emEngineGetAt, {
start: 0,
count: numberToReturn
});
}
return {
length: resultLen,
results: results
};
};
procFunction = {};
/*jshint -W040 */
procFunction['im_search'] =
search.bind(this, emEngine.search, emEngine.getCandidateAt);
procFunction['im_get_candidates'] =
getSearchResult.bind(this, emEngine.getCandidateAt);
procFunction['im_search_predicts'] =
search.bind(this, emEngine.getPredicts, emEngine.getPredictAt);
procFunction['im_get_predicts'] =
getSearchResult.bind(this, emEngine.getPredictAt);
/*jshint +W040 */
procFunction['im_flush_cache'] =
emEngine.flushCache;
procFunction['im_choose'] = function(param) {
var candsNum = emEngine.choose(param.candId);
if (candsNum == 1 && emEngine.getFixedLen() == emEngine.getSplStart()) {
var convertedText = emEngine.getCandidateAt(0);
emEngine.resetSearch();
return convertedText;
}
return null;
};
procFunction['im_get_pending_symbols_info'] = function() {
var fixedLen = emEngine.getFixedLen();
var splStartLen = emEngine.getSplStart();
var splStart = [];
for (var i = 0; i <= splStartLen; i++) {
splStart.push(emEngine.getSplStartAt(i));
}
return {
fixedLen: fixedLen,
splStart: splStart
};
};
procFunction['im_get_user_dict_data'] = function() {
if (!Module['FS']) {
return null;
}
emEngine.flushCache();
return Module['FS'].findObject('data/user_dict.data').contents;
};
}
function post(id, returnValue) {
postMessage({
id: id,
returnValue: returnValue
});
}
function log(message) {
post('message', message);
}