@longgt-public/node-gimei
Version:
random Japanese name and address generator. nodejs port of gimei
173 lines (147 loc) • 3.11 kB
JavaScript
var kata_dakuten_zen = "゛";
var kata_dakuten_han = "゙";
var kata_zen =
"アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョヮヰヱー";
var kata_han = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョワイエー";
var daku_kata_zen = [
"ガ",
"ギ",
"グ",
"ゲ",
"ゴ",
"ザ",
"ジ",
"ズ",
"ゼ",
"ゾ",
"ダ",
"ヂ",
"ヅ",
"デ",
"ド",
"バ",
"ビ",
"ブ",
"ベ",
"ボ",
"パ",
"ピ",
"プ",
"ペ",
"ポ",
"ヴ",
];
var daku_kata_han = [
"ガ",
"ギ",
"グ",
"ゲ",
"ゴ",
"ザ",
"ジ",
"ズ",
"ゼ",
"ゾ",
"ダ",
"ヂ",
"ヅ",
"デ",
"ド",
"バ",
"ビ",
"ブ",
"ベ",
"ボ",
"パ",
"ピ",
"プ",
"ペ",
"ポ",
"ヴ",
];
function isPresent(val) {
return val !== null && val !== undefined;
}
function toArray(val) {
var result = [];
if (isPresent(val)) {
if (Array.isArray(val)) {
result = result.concat(val);
} else {
result.push(val);
}
}
return result;
}
function Pipeline(middlewares) {
var stack = toArray(middlewares);
var push = function (middlewares) {
stack = stack.concat(toArray(middlewares));
};
var execute = function (context) {
var prevIndex = -1;
function runner(index) {
if (index === prevIndex) {
throw new Error("next() called multiple times");
}
prevIndex = index;
var middleware = stack[index];
if (middleware) {
return middleware(context, function () {
return runner(index + 1);
});
}
}
return runner(0);
};
return { push: push, execute: execute };
}
var pipeline = new Pipeline([
// kata_dakuten_zen -> kata_dakuten_han
function (ctx, next) {
var value = ctx.value;
if (value == kata_dakuten_zen) {
return kata_dakuten_han;
}
return next();
},
// kata_zen -> kata_han
function (ctx, next) {
var value = ctx.value;
var kanaIndex = kata_zen.indexOf(value);
if (kanaIndex !== -1) {
return kata_han[kanaIndex];
}
return next();
},
// daku_kata_zen -> daku_kata_han
function (ctx, next) {
var value = ctx.value;
var kanaIndex = daku_kata_zen.findIndex(function (v) {
return v == value;
});
if (kanaIndex !== -1) {
return daku_kata_han[kanaIndex];
}
return next();
},
// NOP
function (ctx, next) {
return ctx.value;
},
]);
function convertZenKanaToHanKana(val) {
var result = val;
if (result) {
var array = [];
for (var i = 0; i < result.length; i++) {
var character = pipeline.execute({ value: result[i] });
array.push(character);
}
result = array.join("");
}
return result;
}
module.exports = {
convertZenKanaToHanKana: convertZenKanaToHanKana,
};