sugar-language
Version:
Language module for the Sugar Javascript utility library.
80 lines (67 loc) • 2.58 kB
JavaScript
;
var ZENKAKU_KATAKANA = require('./ZENKAKU_KATAKANA'),
HANKAKU_KATAKANA = require('./HANKAKU_KATAKANA'),
FULL_WIDTH_OFFSET = require('./FULL_WIDTH_OFFSET'),
ZENKAKU_PUNCTUATION = require('./ZENKAKU_PUNCTUATION'),
VOICED_KATAKANA_REG = require('./VOICED_KATAKANA_REG'),
HANKAKU_PUNCTUATION = require('./HANKAKU_PUNCTUATION'),
WIDTH_CONVERSION_RANGES = require('./WIDTH_CONVERSION_RANGES'),
SEMI_VOICED_KATAKANA_REG = require('./SEMI_VOICED_KATAKANA_REG'),
chr = require('../../common/var/chr'),
forEach = require('../../common/internal/forEach'),
shiftChar = require('../internal/shiftChar'),
simpleRepeat = require('../../common/internal/simpleRepeat');
var widthConversionTable;
function buildWidthConversion() {
var hankaku;
widthConversionTable = {
'zenkaku': {},
'hankaku': {}
};
function setWidthConversion(type, half, full) {
setConversionTableEntry('zenkaku', type, half, full);
setConversionTableEntry('hankaku', type, full, half);
}
function setConversionTableEntry(width, type, from, to, all) {
var obj = widthConversionTable[width][from] || {};
if (all !== false) {
obj.all = to;
}
obj[type] = to;
widthConversionTable[width][from] = obj;
}
function setKatakanaConversion() {
for (var i = 0; i < ZENKAKU_KATAKANA.length; i++) {
var c = ZENKAKU_KATAKANA.charAt(i);
hankaku = HANKAKU_KATAKANA.charAt(i);
setWidthConversion('k', hankaku, c);
if (c.match(VOICED_KATAKANA_REG)) {
setWidthConversion('k', hankaku + '゙', shiftChar(c, 1));
}
if (c.match(SEMI_VOICED_KATAKANA_REG)) {
setWidthConversion('k', hankaku + '゚', shiftChar(c, 2));
}
}
}
function setPunctuationConversion() {
for (var i = 0; i < ZENKAKU_PUNCTUATION.length; i++) {
setWidthConversion('p', HANKAKU_PUNCTUATION.charAt(i), ZENKAKU_PUNCTUATION.charAt(i));
}
}
forEach(WIDTH_CONVERSION_RANGES, function(r) {
simpleRepeat(r.end - r.start + 1, function(n) {
n += r.start;
setWidthConversion(r.type, chr(n), chr(n + FULL_WIDTH_OFFSET));
});
});
setKatakanaConversion();
setPunctuationConversion();
setWidthConversion('s', ' ', ' ');
setWidthConversion('k', 'ヴ', 'ヴ');
setWidthConversion('k', 'ヺ', 'ヺ');
setConversionTableEntry('hankaku', 'n', '−', '-');
setConversionTableEntry('hankaku', 'n', 'ー', '-', false);
setConversionTableEntry('zenkaku', 'n', '-', '-', false);
}
buildWidthConversion();
module.exports = widthConversionTable;