pdf-lib
Version:
Library for creating and modifying PDF files in JavaScript
232 lines (231 loc) • 8.22 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
}
Object.defineProperty(exports, "__esModule", { value: true });
/* tslint:disable no-bitwise */
var sum_1 = __importDefault(require("lodash/sum"));
// export const writeToDebugFile = (data: any, postfix = 0) => {
// // eslint-disable-next-line
// const fs = require('fs');
// fs.writeFileSync(`/Users/user/Desktop/pdf-lib/debug${postfix}`, data);
// };
exports.error = function (msg) {
throw new Error(msg);
};
exports.digits = function (num) { return String(num).split('').length; };
exports.sizeInBytes = function (n) { return Math.ceil(n.toString(2).length / 8); };
/**
* Converts a number into its constituent bytes and returns them as
* a number[].
*
* Returns most significant byte as first element in array. It may be necessary
* to call .reverse() to get the bits in the desired order.
*
* Example:
* bytesFor(0x02A41E) => [ 0b10, 0b10100100, 0b11110 ]
*
* Credit for algorithm: https://stackoverflow.com/a/1936865
*/
exports.bytesFor = function (n) {
var bytes = new Uint8Array(exports.sizeInBytes(n));
for (var i = 1; i <= bytes.length; i++) {
bytes[i - 1] = n >> ((bytes.length - i) * 8);
}
return bytes;
};
// Arrays and TypedArrays in JS both have .reverse() methods, which would seem
// to negate the need for this function. However, not all runtimes support this
// method (e.g. React Native), so using this function compensates for that.
exports.reverseArray = function (array) {
for (var i = 0; i < Math.floor(array.length / 2); i++) {
var leftIdx = i;
var rightIdx = array.length - i - 1;
var temp = array[i];
array[leftIdx] = array[rightIdx];
array[rightIdx] = temp;
}
return array;
};
exports.isInt = function (num) { return num % 1 === 0; };
exports.and = function () {
var predicates = [];
for (var _i = 0; _i < arguments.length; _i++) {
predicates[_i] = arguments[_i];
}
return function () {
var values = [];
for (var _i = 0; _i < arguments.length; _i++) {
values[_i] = arguments[_i];
}
return predicates.every(function (predicate) { return predicate.apply(void 0, values); });
};
};
exports.or = function () {
var predicates = [];
for (var _i = 0; _i < arguments.length; _i++) {
predicates[_i] = arguments[_i];
}
return function () {
var values = [];
for (var _i = 0; _i < arguments.length; _i++) {
values[_i] = arguments[_i];
}
return predicates.some(function (predicate) { return predicate.apply(void 0, values); });
};
};
exports.not = function (predicate) { return function () {
var values = [];
for (var _i = 0; _i < arguments.length; _i++) {
values[_i] = arguments[_i];
}
return !predicate.apply(void 0, values);
}; };
exports.toBoolean = function (boolStr) {
if (boolStr === 'true')
return true;
if (boolStr === 'false')
return false;
throw new Error("\"" + boolStr + "\" cannot be converted to a boolean");
};
exports.charCode = function (charStr) {
if (charStr.length !== 1) {
throw new Error('"char" must be exactly one character long');
}
return charStr.charCodeAt(0);
};
exports.charFromCode = function (code) { return String.fromCharCode(code); };
exports.mergeUint8Arrays = function () {
var arrs = [];
for (var _i = 0; _i < arguments.length; _i++) {
arrs[_i] = arguments[_i];
}
var totalLength = sum_1.default(arrs.map(function (a) { return a.length; }));
var newArray = new Uint8Array(totalLength);
var offset = 0;
arrs.forEach(function (a) {
newArray.set(a, offset);
offset += a.length;
});
return newArray;
};
exports.addStringToBuffer = function (str, buffer) {
for (var i = 0; i < str.length; i += 1) {
buffer[i] = str.charCodeAt(i);
}
return buffer.subarray(str.length);
};
exports.charCodes = function (str) {
return str.split('').map(function (c) { return c.charCodeAt(0); });
};
exports.typedArrayFor = function (str) { return new Uint8Array(exports.charCodes(str)); };
exports.arrayToString = function (arr, startAt, stopAt) {
if (startAt === void 0) { startAt = 0; }
var stopIdx = stopAt === undefined || stopAt >= arr.length ? arr.length : stopAt;
var str = '';
for (var i = startAt; i < stopIdx; i += 1) {
str += exports.charFromCode(arr[i]);
}
return str;
};
exports.arrayCharAt = function (arr, idx) {
return String.fromCharCode(arr[idx]);
};
exports.trimArray = function (arr) {
var idx = 0;
while (String.fromCharCode(arr[idx]).match(/^[\0\t\n\f\r ]/) &&
idx < arr.length) {
idx += 1;
}
return arr.subarray(idx);
};
var PERCENT_SIGN_CODE = exports.charCode('%');
var NEWLINE_CODE = exports.charCode('\n');
var CARRIAGE_RETURN_CODE = exports.charCode('\r');
var isEOLMarker = function (code) {
return code === NEWLINE_CODE || code === CARRIAGE_RETURN_CODE;
};
exports.trimArrayAndRemoveComments = function (arr) {
var strippedComment = true;
var newArray = arr;
while (strippedComment) {
newArray = exports.trimArray(newArray);
if (newArray[0] === PERCENT_SIGN_CODE) {
var idx = 0;
while (!isEOLMarker(newArray[idx]) && idx < newArray.length)
idx += 1;
var foundEOLMarker = isEOLMarker(newArray[idx]);
if (foundEOLMarker)
newArray = newArray.subarray(idx);
strippedComment = foundEOLMarker;
}
else {
strippedComment = false;
}
}
return newArray;
};
exports.arraysAreEqual = function (arr1, arr1Start, arr1Stop, arr2, arr2Start, arr2Stop) {
var arr1Length = arr1Stop - arr1Start;
if (arr1Length !== arr2Stop - arr2Start)
return false;
for (var i = 0; i < arr1Length; i += 1) {
if (arr1[arr1Start + i] !== arr2[arr2Start + i])
return false;
}
return true;
};
exports.arrayIndexOf = function (arr, targetStr, startFrom) {
if (startFrom === void 0) { startFrom = 0; }
var targetArr = targetStr.split('').map(function (c) { return c.charCodeAt(0); });
var currIdx = startFrom;
while (!exports.arraysAreEqual(arr, currIdx, currIdx + targetStr.length, targetArr, 0, targetArr.length)) {
currIdx += 1;
if (currIdx >= arr.length)
return undefined;
}
return currIdx;
};
exports.arrayIndexOneOf = function (arr, targetStrings, startFrom) {
if (startFrom === void 0) { startFrom = 0; }
var targetArrs = targetStrings.map(function (str) { return str.split('').map(exports.charCode); });
var currIdx = startFrom;
var match = null;
while (!match) {
currIdx += 1;
if (currIdx >= arr.length)
return undefined;
match = targetArrs.find(function (target) {
return exports.arraysAreEqual(arr, currIdx, currIdx + target.length, target, 0, target.length);
});
}
return [currIdx, exports.arrayToString(match)];
};
exports.arrayIndexOfReverse = function (arr, targetStr, startFrom) {
// validate(
// startFrom,
// and(_.isNumber, not(_.isNaN)),
// `startFrom must be a number, found: "${startFrom}"`,
// );
var targetArr = targetStr.split('').map(function (c) { return c.charCodeAt(0); });
var currIdx = startFrom;
while (!exports.arraysAreEqual(arr, currIdx, currIdx + targetStr.length, targetArr, 0, targetArr.length)) {
currIdx -= 1;
if (currIdx === -1)
return undefined;
}
return currIdx;
};
exports.arrayFindIndexOf = function (arr, predicate, startFrom) {
if (startFrom === void 0) { startFrom = 0; }
var currIdx = startFrom;
while (!predicate(arr.subarray(currIdx, currIdx + 1)[0])) {
currIdx += 1;
if (currIdx >= arr.length)
return undefined;
}
return currIdx;
};
exports.setCharAt = function (str, idx, newChar) {
return str.substring(0, idx) + newChar + str.substring(idx + 1);
};
;