mirror of https://github.com/jkjoy/sunpeiwen.git
111 lines
3.1 KiB
JavaScript
111 lines
3.1 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.replaceStr = undefined;
|
||
|
|
||
|
var _utils = require('./utils');
|
||
|
|
||
|
var _charmap = require('../../data/charmap.json');
|
||
|
|
||
|
var _charmap2 = _interopRequireDefault(_charmap);
|
||
|
|
||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
|
||
|
let charmap = {};
|
||
|
const defaultOptions = {
|
||
|
unknown: '[?]',
|
||
|
replace: [],
|
||
|
replaceAfter: [],
|
||
|
ignore: [],
|
||
|
trim: true
|
||
|
};
|
||
|
let configOptions = {};
|
||
|
|
||
|
/* istanbul ignore next */
|
||
|
const replaceStr = exports.replaceStr = (source, replace) => {
|
||
|
let str = source;
|
||
|
for (const item of replace) {
|
||
|
if (item[0] instanceof RegExp) {
|
||
|
if (!item[0].global) {
|
||
|
item[0] = new RegExp(item[0].toString().replace(/^\/|\/$/), `${item[0].flags}g`);
|
||
|
}
|
||
|
} else if (typeof item[0] === 'string') {
|
||
|
item[0] = new RegExp((0, _utils.escapeRegExp)(item[0]), 'g');
|
||
|
}
|
||
|
if (item[0] instanceof RegExp) {
|
||
|
str = str.replace(item[0], item[1]);
|
||
|
}
|
||
|
}
|
||
|
return str;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @param {string} sourceStr The string which is being transliterated
|
||
|
* @param {object} options options
|
||
|
*/
|
||
|
/* istanbul ignore next */
|
||
|
const transliterate = (sourceStr, options) => {
|
||
|
const opt = options ? (0, _utils.mergeOptions)(defaultOptions, options) : (0, _utils.mergeOptions)(defaultOptions, configOptions);
|
||
|
let str = String(sourceStr);
|
||
|
let i;let j;let splitted;let result;let ignore;let ord;
|
||
|
if (opt.ignore instanceof Array && opt.ignore.length > 0) {
|
||
|
for (i in opt.ignore) {
|
||
|
splitted = str.split(opt.ignore[i]);
|
||
|
result = [];
|
||
|
for (j in splitted) {
|
||
|
ignore = opt.ignore.slice(0);
|
||
|
ignore.splice(i, 1);
|
||
|
result.push(transliterate(splitted[j], (0, _utils.mergeOptions)(opt, { ignore, trim: false })));
|
||
|
}
|
||
|
return result.join(opt.ignore[i]);
|
||
|
}
|
||
|
}
|
||
|
str = replaceStr(str, opt.replace);
|
||
|
str = (0, _utils.fixChineseSpace)(str);
|
||
|
const strArr = (0, _utils.ucs2decode)(str);
|
||
|
const strArrNew = [];
|
||
|
|
||
|
for (ord of strArr) {
|
||
|
// These characters are also transliteratable. Will improve it later if needed
|
||
|
if (ord > 0xffff) {
|
||
|
strArrNew.push(opt.unknown);
|
||
|
} else {
|
||
|
const offset = ord >> 8;
|
||
|
if (typeof charmap[offset] === 'undefined') {
|
||
|
charmap[offset] = _charmap2.default[offset] || [];
|
||
|
}
|
||
|
ord &= 0xff;
|
||
|
const text = charmap[offset][ord];
|
||
|
if (typeof text === 'undefined' || text === null) {
|
||
|
strArrNew.push(opt.unknown);
|
||
|
} else {
|
||
|
strArrNew.push(charmap[offset][ord]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// trim spaces at the beginning and ending of the string
|
||
|
if (opt.trim && strArrNew.length > 1) {
|
||
|
opt.replaceAfter.push([/(^ +?)|( +?$)/g, '']);
|
||
|
}
|
||
|
let strNew = strArrNew.join('');
|
||
|
|
||
|
strNew = replaceStr(strNew, opt.replaceAfter);
|
||
|
return strNew;
|
||
|
};
|
||
|
|
||
|
transliterate.setCharmap = customCharmap => {
|
||
|
charmap = customCharmap || charmap;
|
||
|
return charmap;
|
||
|
};
|
||
|
|
||
|
transliterate.config = options => {
|
||
|
if (options === undefined) {
|
||
|
return configOptions;
|
||
|
}
|
||
|
configOptions = (0, _utils.mergeOptions)(defaultOptions, options);
|
||
|
return configOptions;
|
||
|
};
|
||
|
|
||
|
exports.default = transliterate;
|