104 lines
2.3 KiB
JavaScript
104 lines
2.3 KiB
JavaScript
/* Copyright 2012 Mozilla Foundation
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import { unreachable } from "../shared/util.js";
|
|
|
|
class ToUnicodeMap {
|
|
constructor(cmap = []) {
|
|
// The elements of this._map can be integers or strings, depending on how
|
|
// `cmap` was created.
|
|
this._map = cmap;
|
|
}
|
|
|
|
get length() {
|
|
return this._map.length;
|
|
}
|
|
|
|
forEach(callback) {
|
|
for (const charCode in this._map) {
|
|
callback(charCode, this._map[charCode].charCodeAt(0));
|
|
}
|
|
}
|
|
|
|
has(i) {
|
|
return this._map[i] !== undefined;
|
|
}
|
|
|
|
get(i) {
|
|
return this._map[i];
|
|
}
|
|
|
|
charCodeOf(value) {
|
|
// `Array.prototype.indexOf` is *extremely* inefficient for arrays which
|
|
// are both very sparse and very large (see issue8372.pdf).
|
|
const map = this._map;
|
|
if (map.length <= 0x10000) {
|
|
return map.indexOf(value);
|
|
}
|
|
for (const charCode in map) {
|
|
if (map[charCode] === value) {
|
|
return charCode | 0;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
amend(map) {
|
|
for (const charCode in map) {
|
|
this._map[charCode] = map[charCode];
|
|
}
|
|
}
|
|
}
|
|
|
|
class IdentityToUnicodeMap {
|
|
constructor(firstChar, lastChar) {
|
|
this.firstChar = firstChar;
|
|
this.lastChar = lastChar;
|
|
}
|
|
|
|
get length() {
|
|
return this.lastChar + 1 - this.firstChar;
|
|
}
|
|
|
|
forEach(callback) {
|
|
for (let i = this.firstChar, ii = this.lastChar; i <= ii; i++) {
|
|
callback(i, i);
|
|
}
|
|
}
|
|
|
|
has(i) {
|
|
return this.firstChar <= i && i <= this.lastChar;
|
|
}
|
|
|
|
get(i) {
|
|
if (this.firstChar <= i && i <= this.lastChar) {
|
|
return String.fromCharCode(i);
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
charCodeOf(v) {
|
|
return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar
|
|
? v
|
|
: -1;
|
|
}
|
|
|
|
amend(map) {
|
|
unreachable("Should not call amend()");
|
|
}
|
|
}
|
|
|
|
export { IdentityToUnicodeMap, ToUnicodeMap };
|