import fs from 'fs'
const data = fs.readFileSync('./UnicodeData.txt', 'utf8')
const lines = data.split('\n')
const types = {
LTR: 0,
RTL: 0,
weak: 0,
neutral: 0,
};
const weaks = []
const neutrals = []
const leftToRights = []
const rightToLefts = []
for (const line of lines) {
const [hexCode,,,, bidiClass] = line.split(';')
if (bidiClass === 'L') {
types.LTR++
var int = parseInt(hexCode, 16)
leftToRights.push(int)
} else if (bidiClass === 'R' || bidiClass === 'AL') {
types.RTL++
var int = parseInt(hexCode, 16)
rightToLefts.push(int)
} else if (
bidiClass === 'EN' ||
bidiClass === 'ES' ||
bidiClass === 'ET' ||
bidiClass === 'AN' ||
bidiClass === 'CS' ||
bidiClass === 'NSM'
) {
types.weak++
var int = parseInt(hexCode, 16)
weaks.push(int)
}
else if (
bidiClass === 'BN' ||
bidiClass === 'B' ||
bidiClass === 'S' ||
bidiClass === 'WS' ||
bidiClass === 'ON' ||
bidiClass === 'LRE' ||
bidiClass === 'LRO' ||
bidiClass === 'RLE' ||
bidiClass === 'RLO' ||
bidiClass === 'PDF' ||
bidiClass === 'LRI' ||
bidiClass === 'RLI' ||
bidiClass === 'FSI' ||
bidiClass === 'PDI'
) {
types.neutral++
var int = parseInt(hexCode, 16)
neutrals.push(int)
}
}
console.log(types)
const NeutralRanges = createRanges(neutrals)
console.log('neutral: ')
var neutralMap = NeutralRanges.map((range) => range.map((n) => {
var str = n.toString(16).toUpperCase()
while (str.length < 4) str = '0' + str
return '0x' + str
}));
var index = neutralMap.findIndex((range) => range[0] === '0x30A0')
neutralMap = neutralMap.slice(index)
console.log(neutralMap)
function createRanges (arr) {
const ranges = []
let curRange = []
for (let i = 0; i < arr.length; i++) {
const n = arr[i]
curRange.push(n)
const next = arr[i + 1]
if (next - n > 1) {
ranges.push(curRange)
curRange = []
}
}
return ranges.map((range) => {
if (range.length > 1) return [range[0], range[range.length - 1]]
else return [range[0], range[0]]
});
}