diff options
Diffstat (limited to 'vanilla/node_modules/bidi-js/src/mirroring.js')
| -rw-r--r-- | vanilla/node_modules/bidi-js/src/mirroring.js | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/vanilla/node_modules/bidi-js/src/mirroring.js b/vanilla/node_modules/bidi-js/src/mirroring.js new file mode 100644 index 0000000..c214b04 --- /dev/null +++ b/vanilla/node_modules/bidi-js/src/mirroring.js @@ -0,0 +1,48 @@ +import data from './data/bidiMirroring.data.js' +import { parseCharacterMap } from './util/parseCharacterMap.js' + +let mirrorMap + +function parse () { + if (!mirrorMap) { + //const start = performance.now() + const { map, reverseMap } = parseCharacterMap(data, true) + // Combine both maps into one + reverseMap.forEach((value, key) => { + map.set(key, value) + }) + mirrorMap = map + //console.log(`mirrored chars parsed in ${performance.now() - start}ms`) + } +} + +export function getMirroredCharacter (char) { + parse() + return mirrorMap.get(char) || null +} + +/** + * Given a string and its resolved embedding levels, build a map of indices to replacement chars + * for any characters in right-to-left segments that have defined mirrored characters. + * @param string + * @param embeddingLevels + * @param [start] + * @param [end] + * @return {Map<number, string>} + */ +export function getMirroredCharactersMap(string, embeddingLevels, start, end) { + let strLen = string.length + start = Math.max(0, start == null ? 0 : +start) + end = Math.min(strLen - 1, end == null ? strLen - 1 : +end) + + const map = new Map() + for (let i = start; i <= end; i++) { + if (embeddingLevels[i] & 1) { //only odd (rtl) levels + const mirror = getMirroredCharacter(string[i]) + if (mirror !== null) { + map.set(i, mirror) + } + } + } + return map +} |
