| /** |
| * @licstart The following is the entire license notice for the |
| * Javascript code in this page |
| * |
| * Copyright 2020 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. |
| * |
| * @licend The above is the entire license notice for the |
| * Javascript code in this page |
| */ |
| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.getLookupTableFactory = getLookupTableFactory; |
| exports.getInheritableProperty = getInheritableProperty; |
| exports.toRomanNumerals = toRomanNumerals; |
| exports.log2 = log2; |
| exports.readInt8 = readInt8; |
| exports.readUint16 = readUint16; |
| exports.readUint32 = readUint32; |
| exports.isWhiteSpace = isWhiteSpace; |
| exports.XRefParseException = exports.XRefEntryException = exports.MissingDataException = void 0; |
| |
| var _util = require("../shared/util.js"); |
| |
| function getLookupTableFactory(initializer) { |
| let lookup; |
| return function () { |
| if (initializer) { |
| lookup = Object.create(null); |
| initializer(lookup); |
| initializer = null; |
| } |
| |
| return lookup; |
| }; |
| } |
| |
| class MissingDataException extends _util.BaseException { |
| constructor(begin, end) { |
| super(`Missing data [${begin}, ${end})`); |
| this.begin = begin; |
| this.end = end; |
| } |
| |
| } |
| |
| exports.MissingDataException = MissingDataException; |
| |
| class XRefEntryException extends _util.BaseException {} |
| |
| exports.XRefEntryException = XRefEntryException; |
| |
| class XRefParseException extends _util.BaseException {} |
| |
| exports.XRefParseException = XRefParseException; |
| |
| function getInheritableProperty({ |
| dict, |
| key, |
| getArray = false, |
| stopWhenFound = true |
| }) { |
| const LOOP_LIMIT = 100; |
| let loopCount = 0; |
| let values; |
| |
| while (dict) { |
| const value = getArray ? dict.getArray(key) : dict.get(key); |
| |
| if (value !== undefined) { |
| if (stopWhenFound) { |
| return value; |
| } |
| |
| if (!values) { |
| values = []; |
| } |
| |
| values.push(value); |
| } |
| |
| if (++loopCount > LOOP_LIMIT) { |
| (0, _util.warn)(`getInheritableProperty: maximum loop count exceeded for "${key}"`); |
| break; |
| } |
| |
| dict = dict.get("Parent"); |
| } |
| |
| return values; |
| } |
| |
| const ROMAN_NUMBER_MAP = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]; |
| |
| function toRomanNumerals(number, lowerCase = false) { |
| (0, _util.assert)(Number.isInteger(number) && number > 0, "The number should be a positive integer."); |
| const romanBuf = []; |
| let pos; |
| |
| while (number >= 1000) { |
| number -= 1000; |
| romanBuf.push("M"); |
| } |
| |
| pos = number / 100 | 0; |
| number %= 100; |
| romanBuf.push(ROMAN_NUMBER_MAP[pos]); |
| pos = number / 10 | 0; |
| number %= 10; |
| romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); |
| romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); |
| const romanStr = romanBuf.join(""); |
| return lowerCase ? romanStr.toLowerCase() : romanStr; |
| } |
| |
| function log2(x) { |
| if (x <= 0) { |
| return 0; |
| } |
| |
| return Math.ceil(Math.log2(x)); |
| } |
| |
| function readInt8(data, offset) { |
| return data[offset] << 24 >> 24; |
| } |
| |
| function readUint16(data, offset) { |
| return data[offset] << 8 | data[offset + 1]; |
| } |
| |
| function readUint32(data, offset) { |
| return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; |
| } |
| |
| function isWhiteSpace(ch) { |
| return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a; |
| } |