31 lines
1.1 KiB
JavaScript
31 lines
1.1 KiB
JavaScript
/**
|
|
* Parses an string that holds encoded codepoint mappings, e.g. for bracket pairs or
|
|
* mirroring characters, as encoded by scripts/generateBidiData.js. Returns an object
|
|
* holding the `map`, and optionally a `reverseMap` if `includeReverse:true`.
|
|
* @param {string} encodedString
|
|
* @param {boolean} includeReverse - true if you want reverseMap in the output
|
|
* @return {{map: Map<number, number>, reverseMap?: Map<number, number>}}
|
|
*/
|
|
export function parseCharacterMap (encodedString, includeReverse) {
|
|
const radix = 36
|
|
let lastCode = 0
|
|
const map = new Map()
|
|
const reverseMap = includeReverse && new Map()
|
|
let prevPair
|
|
encodedString.split(',').forEach(function visit(entry) {
|
|
if (entry.indexOf('+') !== -1) {
|
|
for (let i = +entry; i--;) {
|
|
visit(prevPair)
|
|
}
|
|
} else {
|
|
prevPair = entry
|
|
let [a, b] = entry.split('>')
|
|
a = String.fromCodePoint(lastCode += parseInt(a, radix))
|
|
b = String.fromCodePoint(lastCode += parseInt(b, radix))
|
|
map.set(a, b)
|
|
includeReverse && reverseMap.set(b, a)
|
|
}
|
|
})
|
|
return { map, reverseMap }
|
|
}
|