var fs = require('fs'); var regexpu = require('regexpu'); var data = fs.readFileSync('./UnicodeData.txt').toString('utf8'); var entries = data.split('\n'); var rtlCodes = [], rtlCodesLength = 0; var BREAK_SIGNAL = -1; function toUnicodeCode(n) { return n.toString(16).toUpperCase(); } var prevWasRTL = false; for (var i = 0, len = entries.length; i < len; i++) { var entry = entries[i]; var props = entry.split(';'); var code = props[0]; var dir = props[4]; if (dir === 'R' || dir === 'AL') { rtlCodes[rtlCodesLength++] = parseInt(code, 16); prevWasRTL = true; } else if (prevWasRTL) { prevWasRTL = false; rtlCodes[rtlCodesLength++] = BREAK_SIGNAL; } } fs.writeFileSync('rtl-codes.txt', rtlCodes.filter(code => code !== BREAK_SIGNAL).map(toUnicodeCode).join('\n')); var rtlCodeRanges = [], rtlCodeRangesLength = 0; var startCode = rtlCodes[0]; var prevCode = rtlCodes[0]; for (var i = 1; i < rtlCodesLength; i++) { var code = rtlCodes[i]; if (code === BREAK_SIGNAL) { continue; } if (prevCode + 1 !== code) { rtlCodeRanges[rtlCodeRangesLength++] = { from: startCode, to: prevCode }; startCode = code; } prevCode = code; } rtlCodeRanges[rtlCodeRangesLength++] = { from: startCode, to: prevCode }; fs.writeFileSync('rtl-code-ranges.txt', rtlCodeRanges.map(function(entry) { var from = toUnicodeCode(entry.from); var to = toUnicodeCode(entry.to); if (from === to) { return from; } return from + '-' + to; }).join('\n')); var fuzzy = [], fuzzyLength = 0, breakSignal = false; fuzzy[fuzzyLength++] = { from: rtlCodes[0], to: rtlCodes[0] }; for (var i = 1; i < rtlCodesLength; i++) { var code = rtlCodes[i]; if (code === BREAK_SIGNAL) { breakSignal = true; continue; } if (breakSignal) { fuzzy[fuzzyLength++] = { from: code, to: code }; } else { fuzzy[fuzzyLength - 1].to = code; } breakSignal = false; } fs.writeFileSync('rtl-code-ranges-fuzzy.txt', fuzzy.map(function(entry) { var from = toUnicodeCode(entry.from); var to = toUnicodeCode(entry.to); if (from === to) { return from; } return from + '-' + to; }).join('\n')); var isRTLFuzzy = fuzzy.map(function(entry) { var from = '\\u{'+toUnicodeCode(entry.from)+'}'; var to = '\\u{'+toUnicodeCode(entry.to)+'}'; if (from === to) { return from; } return from + '-' + to; }).join(''); var regex = '[' + isRTLFuzzy + ']'; console.log('UNICODE CODE-POINTS RANGES:'); console.log(regex); var r = regexpu.rewritePattern(regex, 'u'); console.log('------'); console.log(r); console.log('------'); // var containsRTL = /(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u08BD\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE33\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDCFF]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD50-\uDFFF]|\uD83B[\uDC00-\uDEBB])/ // var r = containsRTL.test('a'); // console.log(r); //console.log(rtlCodeRanges);