| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- 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`)
- }
- }
- /**
- * Get the mirrored character for a given character, if one exists.
- * @param {string} char
- * @return {string|null}
- */
- 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} string
- * @param {Uint8Array} embeddingLevels
- * @param {number?} [start]
- * @param {number?} [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
- }
|