Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
175 lines
4.6 KiB
JavaScript
Executable file
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);
|
|
}
|