";
- var fn = typeof arg1 === "function" ? arg1 : arg2;
- var scope = typeof arg1 === "function" ? arg2 : arg3;
- invariant(typeof fn === "function", getMessage("m002"));
- invariant(fn.length === 0, getMessage("m003"));
- invariant(typeof actionName === "string" && actionName.length > 0, "actions should have valid names, got: '" + actionName + "'");
- return executeAction(actionName, fn, scope, undefined);
- }
- exports.runInAction = runInAction;
- function isAction(thing) {
- return typeof thing === "function" && thing.isMobxAction === true;
- }
- exports.isAction = isAction;
- function defineBoundAction(target, propertyName, fn) {
- var res = function res() {
- return executeAction(propertyName, fn, target, arguments);
- };
- res.isMobxAction = true;
- addHiddenProp(target, propertyName, res);
- }
- function autorun(arg1, arg2, arg3) {
- var name, view, scope;
- if (typeof arg1 === "string") {
- name = arg1;
- view = arg2;
- scope = arg3;
- } else {
- name = arg1.name || "Autorun@" + getNextId();
- view = arg1;
- scope = arg2;
- }
- invariant(typeof view === "function", getMessage("m004"));
- invariant(isAction(view) === false, getMessage("m005"));
- if (scope) view = view.bind(scope);
- var reaction = new Reaction(name, function () {
- this.track(reactionRunner);
- });
- function reactionRunner() {
- view(reaction);
- }
- reaction.schedule();
- return reaction.getDisposer();
- }
- exports.autorun = autorun;
- function when(arg1, arg2, arg3, arg4) {
- var name, predicate, effect, scope;
- if (typeof arg1 === "string") {
- name = arg1;
- predicate = arg2;
- effect = arg3;
- scope = arg4;
- } else {
- name = "When@" + getNextId();
- predicate = arg1;
- effect = arg2;
- scope = arg3;
- }
- var disposer = autorun(name, function (r) {
- if (predicate.call(scope)) {
- r.dispose();
- var prevUntracked = untrackedStart();
- effect.call(scope);
- untrackedEnd(prevUntracked);
- }
- });
- return disposer;
- }
- exports.when = when;
- function autorunAsync(arg1, arg2, arg3, arg4) {
- var name, func, delay, scope;
- if (typeof arg1 === "string") {
- name = arg1;
- func = arg2;
- delay = arg3;
- scope = arg4;
- } else {
- name = arg1.name || "AutorunAsync@" + getNextId();
- func = arg1;
- delay = arg2;
- scope = arg3;
- }
- invariant(isAction(func) === false, getMessage("m006"));
- if (delay === void 0) delay = 1;
- if (scope) func = func.bind(scope);
- var isScheduled = false;
- var r = new Reaction(name, function () {
- if (!isScheduled) {
- isScheduled = true;
- setTimeout(function () {
- isScheduled = false;
- if (!r.isDisposed) r.track(reactionRunner);
- }, delay);
- }
- });
- function reactionRunner() {
- func(r);
- }
- r.schedule();
- return r.getDisposer();
- }
- exports.autorunAsync = autorunAsync;
- function reaction(expression, effect, arg3) {
- if (arguments.length > 3) {
- fail(getMessage("m007"));
- }
- if (isModifierDescriptor(expression)) {
- fail(getMessage("m008"));
- }
- var opts;
- if ((typeof arg3 === "undefined" ? "undefined" : _typeof(arg3)) === "object") {
- opts = arg3;
- } else {
- opts = {};
- }
- opts.name = opts.name || expression.name || effect.name || "Reaction@" + getNextId();
- opts.fireImmediately = arg3 === true || opts.fireImmediately === true;
- opts.delay = opts.delay || 0;
- opts.compareStructural = opts.compareStructural || opts.struct || false;
- effect = action(opts.name, opts.context ? effect.bind(opts.context) : effect);
- if (opts.context) {
- expression = expression.bind(opts.context);
- }
- var firstTime = true;
- var isScheduled = false;
- var nextValue;
- var r = new Reaction(opts.name, function () {
- if (firstTime || opts.delay < 1) {
- reactionRunner();
- } else if (!isScheduled) {
- isScheduled = true;
- setTimeout(function () {
- isScheduled = false;
- reactionRunner();
- }, opts.delay);
- }
- });
- function reactionRunner() {
- if (r.isDisposed) return;
- var changed = false;
- r.track(function () {
- var v = expression(r);
- changed = valueDidChange(opts.compareStructural, nextValue, v);
- nextValue = v;
- });
- if (firstTime && opts.fireImmediately) effect(nextValue, r);
- if (!firstTime && changed === true) effect(nextValue, r);
- if (firstTime) firstTime = false;
- }
- r.schedule();
- return r.getDisposer();
- }
- exports.reaction = reaction;
- function createComputedDecorator(compareStructural) {
- return createClassPropertyDecorator(function (target, name, _, __, originalDescriptor) {
- invariant(typeof originalDescriptor !== "undefined", getMessage("m009"));
- invariant(typeof originalDescriptor.get === "function", getMessage("m010"));
- var adm = asObservableObject(target, "");
- defineComputedProperty(adm, name, originalDescriptor.get, originalDescriptor.set, compareStructural, false);
- }, function (name) {
- var observable = this.$mobx.values[name];
- if (observable === undefined) return undefined;
- return observable.get();
- }, function (name, value) {
- this.$mobx.values[name].set(value);
- }, false, false);
- }
- var computedDecorator = createComputedDecorator(false);
- var computedStructDecorator = createComputedDecorator(true);
- var computed = function computed(arg1, arg2, arg3) {
- if (typeof arg2 === "string") {
- return computedDecorator.apply(null, arguments);
- }
- invariant(typeof arg1 === "function", getMessage("m011"));
- invariant(arguments.length < 3, getMessage("m012"));
- var opts = (typeof arg2 === "undefined" ? "undefined" : _typeof(arg2)) === "object" ? arg2 : {};
- opts.setter = typeof arg2 === "function" ? arg2 : opts.setter;
- return new ComputedValue(arg1, opts.context, opts.compareStructural || opts.struct || false, opts.name || arg1.name || "", opts.setter);
- };
- exports.computed = computed;
- computed.struct = computedStructDecorator;
- function createTransformer(transformer, onCleanup) {
- invariant(typeof transformer === "function" && transformer.length < 2, "createTransformer expects a function that accepts one argument");
- var objectCache = {};
- var resetId = globalState.resetId;
- var Transformer = function (_super) {
- __extends(Transformer, _super);
- function Transformer(sourceIdentifier, sourceObject) {
- var _this = _super.call(this, function () {
- return transformer(sourceObject);
- }, undefined, false, "Transformer-" + transformer.name + "-" + sourceIdentifier, undefined) || this;
- _this.sourceIdentifier = sourceIdentifier;
- _this.sourceObject = sourceObject;
- return _this;
- }
- Transformer.prototype.onBecomeUnobserved = function () {
- var lastValue = this.value;
- _super.prototype.onBecomeUnobserved.call(this);
- delete objectCache[this.sourceIdentifier];
- if (onCleanup) onCleanup(lastValue, this.sourceObject);
- };
- return Transformer;
- }(ComputedValue);
- return function (object) {
- if (resetId !== globalState.resetId) {
- objectCache = {};
- resetId = globalState.resetId;
- }
- var identifier = getMemoizationId(object);
- var reactiveTransformer = objectCache[identifier];
- if (reactiveTransformer) return reactiveTransformer.get();
- reactiveTransformer = objectCache[identifier] = new Transformer(identifier, object);
- return reactiveTransformer.get();
- };
- }
- exports.createTransformer = createTransformer;
- function getMemoizationId(object) {
- if (object === null || (typeof object === "undefined" ? "undefined" : _typeof(object)) !== "object") throw new Error("[mobx] transform expected some kind of object, got: " + object);
- var tid = object.$transformId;
- if (tid === undefined) {
- tid = getNextId();
- addHiddenProp(object, "$transformId", tid);
- }
- return tid;
- }
- function expr(expr, scope) {
- if (!isComputingDerivation()) console.warn(getMessage("m013"));
- return computed(expr, { context: scope }).get();
- }
- exports.expr = expr;
- function extendObservable(target) {
- var properties = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- properties[_i - 1] = arguments[_i];
- }
- return extendObservableHelper(target, deepEnhancer, properties);
- }
- exports.extendObservable = extendObservable;
- function extendShallowObservable(target) {
- var properties = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- properties[_i - 1] = arguments[_i];
- }
- return extendObservableHelper(target, referenceEnhancer, properties);
- }
- exports.extendShallowObservable = extendShallowObservable;
- function extendObservableHelper(target, defaultEnhancer, properties) {
- invariant(arguments.length >= 2, getMessage("m014"));
- invariant((typeof target === "undefined" ? "undefined" : _typeof(target)) === "object", getMessage("m015"));
- invariant(!isObservableMap(target), getMessage("m016"));
- properties.forEach(function (propSet) {
- invariant((typeof propSet === "undefined" ? "undefined" : _typeof(propSet)) === "object", getMessage("m017"));
- invariant(!isObservable(propSet), getMessage("m018"));
- });
- var adm = asObservableObject(target);
- var definedProps = {};
- for (var i = properties.length - 1; i >= 0; i--) {
- var propSet = properties[i];
- for (var key in propSet) {
- if (definedProps[key] !== true && hasOwnProperty(propSet, key)) {
- definedProps[key] = true;
- if (target === propSet && !isPropertyConfigurable(target, key)) continue;
- var descriptor = Object.getOwnPropertyDescriptor(propSet, key);
- defineObservablePropertyFromDescriptor(adm, key, descriptor, defaultEnhancer);
- }
- }
- }
- return target;
- }
- function getDependencyTree(thing, property) {
- return nodeToDependencyTree(getAtom(thing, property));
- }
- function nodeToDependencyTree(node) {
- var result = {
- name: node.name
- };
- if (node.observing && node.observing.length > 0) result.dependencies = unique(node.observing).map(nodeToDependencyTree);
- return result;
- }
- function getObserverTree(thing, property) {
- return nodeToObserverTree(getAtom(thing, property));
- }
- function nodeToObserverTree(node) {
- var result = {
- name: node.name
- };
- if (hasObservers(node)) result.observers = getObservers(node).map(nodeToObserverTree);
- return result;
- }
- function intercept(thing, propOrHandler, handler) {
- if (typeof handler === "function") return interceptProperty(thing, propOrHandler, handler);else return interceptInterceptable(thing, propOrHandler);
- }
- exports.intercept = intercept;
- function interceptInterceptable(thing, handler) {
- return getAdministration(thing).intercept(handler);
- }
- function interceptProperty(thing, property, handler) {
- return getAdministration(thing, property).intercept(handler);
- }
- function isComputed(value, property) {
- if (value === null || value === undefined) return false;
- if (property !== undefined) {
- if (isObservableObject(value) === false) return false;
- var atom = getAtom(value, property);
- return isComputedValue(atom);
- }
- return isComputedValue(value);
- }
- exports.isComputed = isComputed;
- function isObservable(value, property) {
- if (value === null || value === undefined) return false;
- if (property !== undefined) {
- if (isObservableArray(value) || isObservableMap(value)) throw new Error(getMessage("m019"));else if (isObservableObject(value)) {
- var o = value.$mobx;
- return o.values && !!o.values[property];
- }
- return false;
- }
- return isObservableObject(value) || !!value.$mobx || isAtom(value) || isReaction(value) || isComputedValue(value);
- }
- exports.isObservable = isObservable;
- var deepDecorator = createDecoratorForEnhancer(deepEnhancer);
- var shallowDecorator = createDecoratorForEnhancer(shallowEnhancer);
- var refDecorator = createDecoratorForEnhancer(referenceEnhancer);
- var deepStructDecorator = createDecoratorForEnhancer(deepStructEnhancer);
- var refStructDecorator = createDecoratorForEnhancer(refStructEnhancer);
- function createObservable(v) {
- if (v === void 0) {
- v = undefined;
- }
- if (typeof arguments[1] === "string") return deepDecorator.apply(null, arguments);
- invariant(arguments.length <= 1, getMessage("m021"));
- invariant(!isModifierDescriptor(v), getMessage("m020"));
- if (isObservable(v)) return v;
- var res = deepEnhancer(v, undefined, undefined);
- if (res !== v) return res;
- return observable.box(v);
- }
- var IObservableFactories = function () {
- function IObservableFactories() {}
- IObservableFactories.prototype.box = function (value, name) {
- if (arguments.length > 2) incorrectlyUsedAsDecorator("box");
- return new ObservableValue(value, deepEnhancer, name);
- };
- IObservableFactories.prototype.shallowBox = function (value, name) {
- if (arguments.length > 2) incorrectlyUsedAsDecorator("shallowBox");
- return new ObservableValue(value, referenceEnhancer, name);
- };
- IObservableFactories.prototype.array = function (initialValues, name) {
- if (arguments.length > 2) incorrectlyUsedAsDecorator("array");
- return new ObservableArray(initialValues, deepEnhancer, name);
- };
- IObservableFactories.prototype.shallowArray = function (initialValues, name) {
- if (arguments.length > 2) incorrectlyUsedAsDecorator("shallowArray");
- return new ObservableArray(initialValues, referenceEnhancer, name);
- };
- IObservableFactories.prototype.map = function (initialValues, name) {
- if (arguments.length > 2) incorrectlyUsedAsDecorator("map");
- return new ObservableMap(initialValues, deepEnhancer, name);
- };
- IObservableFactories.prototype.shallowMap = function (initialValues, name) {
- if (arguments.length > 2) incorrectlyUsedAsDecorator("shallowMap");
- return new ObservableMap(initialValues, referenceEnhancer, name);
- };
- IObservableFactories.prototype.object = function (props, name) {
- if (arguments.length > 2) incorrectlyUsedAsDecorator("object");
- var res = {};
- asObservableObject(res, name);
- extendObservable(res, props);
- return res;
- };
- IObservableFactories.prototype.shallowObject = function (props, name) {
- if (arguments.length > 2) incorrectlyUsedAsDecorator("shallowObject");
- var res = {};
- asObservableObject(res, name);
- extendShallowObservable(res, props);
- return res;
- };
- IObservableFactories.prototype.ref = function () {
- if (arguments.length < 2) {
- return createModifierDescriptor(referenceEnhancer, arguments[0]);
- } else {
- return refDecorator.apply(null, arguments);
- }
- };
- IObservableFactories.prototype.shallow = function () {
- if (arguments.length < 2) {
- return createModifierDescriptor(shallowEnhancer, arguments[0]);
- } else {
- return shallowDecorator.apply(null, arguments);
- }
- };
- IObservableFactories.prototype.deep = function () {
- if (arguments.length < 2) {
- return createModifierDescriptor(deepEnhancer, arguments[0]);
- } else {
- return deepDecorator.apply(null, arguments);
- }
- };
- IObservableFactories.prototype.struct = function () {
- if (arguments.length < 2) {
- return createModifierDescriptor(deepStructEnhancer, arguments[0]);
- } else {
- return deepStructDecorator.apply(null, arguments);
- }
- };
- return IObservableFactories;
- }();
- exports.IObservableFactories = IObservableFactories;
- var observable = createObservable;
- exports.observable = observable;
- Object.keys(IObservableFactories.prototype).forEach(function (key) {
- return observable[key] = IObservableFactories.prototype[key];
- });
- observable.deep.struct = observable.struct;
- observable.ref.struct = function () {
- if (arguments.length < 2) {
- return createModifierDescriptor(refStructEnhancer, arguments[0]);
- } else {
- return refStructDecorator.apply(null, arguments);
- }
- };
- function incorrectlyUsedAsDecorator(methodName) {
- fail("Expected one or two arguments to observable." + methodName + ". Did you accidentally try to use observable." + methodName + " as decorator?");
- }
- function createDecoratorForEnhancer(enhancer) {
- invariant(!!enhancer, ":(");
- return createClassPropertyDecorator(function (target, name, baseValue, _, baseDescriptor) {
- assertPropertyConfigurable(target, name);
- invariant(!baseDescriptor || !baseDescriptor.get, getMessage("m022"));
- var adm = asObservableObject(target, undefined);
- defineObservableProperty(adm, name, baseValue, enhancer);
- }, function (name) {
- var observable = this.$mobx.values[name];
- if (observable === undefined) return undefined;
- return observable.get();
- }, function (name, value) {
- setPropertyValue(this, name, value);
- }, true, false);
- }
- function observe(thing, propOrCb, cbOrFire, fireImmediately) {
- if (typeof cbOrFire === "function") return observeObservableProperty(thing, propOrCb, cbOrFire, fireImmediately);else return observeObservable(thing, propOrCb, cbOrFire);
- }
- exports.observe = observe;
- function observeObservable(thing, listener, fireImmediately) {
- return getAdministration(thing).observe(listener, fireImmediately);
- }
- function observeObservableProperty(thing, property, listener, fireImmediately) {
- return getAdministration(thing, property).observe(listener, fireImmediately);
- }
- function toJS(source, detectCycles, __alreadySeen) {
- if (detectCycles === void 0) {
- detectCycles = true;
- }
- if (__alreadySeen === void 0) {
- __alreadySeen = [];
- }
- function cache(value) {
- if (detectCycles) __alreadySeen.push([source, value]);
- return value;
- }
- if (isObservable(source)) {
- if (detectCycles && __alreadySeen === null) __alreadySeen = [];
- if (detectCycles && source !== null && (typeof source === "undefined" ? "undefined" : _typeof(source)) === "object") {
- for (var i = 0, l = __alreadySeen.length; i < l; i++) {
- if (__alreadySeen[i][0] === source) return __alreadySeen[i][1];
- }
- }
- if (isObservableArray(source)) {
- var res = cache([]);
- var toAdd = source.map(function (value) {
- return toJS(value, detectCycles, __alreadySeen);
- });
- res.length = toAdd.length;
- for (var i = 0, l = toAdd.length; i < l; i++) {
- res[i] = toAdd[i];
- }return res;
- }
- if (isObservableObject(source)) {
- var res = cache({});
- for (var key in source) {
- res[key] = toJS(source[key], detectCycles, __alreadySeen);
- }return res;
- }
- if (isObservableMap(source)) {
- var res_1 = cache({});
- source.forEach(function (value, key) {
- return res_1[key] = toJS(value, detectCycles, __alreadySeen);
- });
- return res_1;
- }
- if (isObservableValue(source)) return toJS(source.get(), detectCycles, __alreadySeen);
- }
- return source;
- }
- exports.toJS = toJS;
- function transaction(action, thisArg) {
- if (thisArg === void 0) {
- thisArg = undefined;
- }
- deprecated(getMessage("m023"));
- return runInTransaction.apply(undefined, arguments);
- }
- exports.transaction = transaction;
- function runInTransaction(action, thisArg) {
- if (thisArg === void 0) {
- thisArg = undefined;
- }
- return executeAction("", action);
- }
- function log(msg) {
- console.log(msg);
- return msg;
- }
- function whyRun(thing, prop) {
- switch (arguments.length) {
- case 0:
- thing = globalState.trackingDerivation;
- if (!thing) return log(getMessage("m024"));
- break;
- case 2:
- thing = getAtom(thing, prop);
- break;
- }
- thing = getAtom(thing);
- if (isComputedValue(thing)) return log(thing.whyRun());else if (isReaction(thing)) return log(thing.whyRun());
- return fail(getMessage("m025"));
- }
- exports.whyRun = whyRun;
- function createAction(actionName, fn) {
- invariant(typeof fn === "function", getMessage("m026"));
- invariant(typeof actionName === "string" && actionName.length > 0, "actions should have valid names, got: '" + actionName + "'");
- var res = function res() {
- return executeAction(actionName, fn, this, arguments);
- };
- res.originalFn = fn;
- res.isMobxAction = true;
- return res;
- }
- function executeAction(actionName, fn, scope, args) {
- var runInfo = startAction(actionName, fn, scope, args);
- try {
- return fn.apply(scope, args);
- } finally {
- endAction(runInfo);
- }
- }
- function startAction(actionName, fn, scope, args) {
- var notifySpy = isSpyEnabled() && !!actionName;
- var startTime = 0;
- if (notifySpy) {
- startTime = Date.now();
- var l = args && args.length || 0;
- var flattendArgs = new Array(l);
- if (l > 0) for (var i = 0; i < l; i++) {
- flattendArgs[i] = args[i];
- }spyReportStart({
- type: "action",
- name: actionName,
- fn: fn,
- object: scope,
- arguments: flattendArgs
- });
- }
- var prevDerivation = untrackedStart();
- startBatch();
- var prevAllowStateChanges = allowStateChangesStart(true);
- return {
- prevDerivation: prevDerivation,
- prevAllowStateChanges: prevAllowStateChanges,
- notifySpy: notifySpy,
- startTime: startTime
- };
- }
- function endAction(runInfo) {
- allowStateChangesEnd(runInfo.prevAllowStateChanges);
- endBatch();
- untrackedEnd(runInfo.prevDerivation);
- if (runInfo.notifySpy) spyReportEnd({ time: Date.now() - runInfo.startTime });
- }
- function useStrict(strict) {
- invariant(globalState.trackingDerivation === null, getMessage("m028"));
- globalState.strictMode = strict;
- globalState.allowStateChanges = !strict;
- }
- exports.useStrict = useStrict;
- function isStrictModeEnabled() {
- return globalState.strictMode;
- }
- exports.isStrictModeEnabled = isStrictModeEnabled;
- function allowStateChanges(allowStateChanges, func) {
- var prev = allowStateChangesStart(allowStateChanges);
- var res;
- try {
- res = func();
- } finally {
- allowStateChangesEnd(prev);
- }
- return res;
- }
- function allowStateChangesStart(allowStateChanges) {
- var prev = globalState.allowStateChanges;
- globalState.allowStateChanges = allowStateChanges;
- return prev;
- }
- function allowStateChangesEnd(prev) {
- globalState.allowStateChanges = prev;
- }
- var BaseAtom = function () {
- function BaseAtom(name) {
- if (name === void 0) {
- name = "Atom@" + getNextId();
- }
- this.name = name;
- this.isPendingUnobservation = true;
- this.observers = [];
- this.observersIndexes = {};
- this.diffValue = 0;
- this.lastAccessedBy = 0;
- this.lowestObserverState = IDerivationState.NOT_TRACKING;
- }
- BaseAtom.prototype.onBecomeUnobserved = function () {};
- BaseAtom.prototype.reportObserved = function () {
- reportObserved(this);
- };
- BaseAtom.prototype.reportChanged = function () {
- startBatch();
- propagateChanged(this);
- endBatch();
- };
- BaseAtom.prototype.toString = function () {
- return this.name;
- };
- return BaseAtom;
- }();
- exports.BaseAtom = BaseAtom;
- var Atom = function (_super) {
- __extends(Atom, _super);
- function Atom(name, onBecomeObservedHandler, onBecomeUnobservedHandler) {
- if (name === void 0) {
- name = "Atom@" + getNextId();
- }
- if (onBecomeObservedHandler === void 0) {
- onBecomeObservedHandler = noop;
- }
- if (onBecomeUnobservedHandler === void 0) {
- onBecomeUnobservedHandler = noop;
- }
- var _this = _super.call(this, name) || this;
- _this.name = name;
- _this.onBecomeObservedHandler = onBecomeObservedHandler;
- _this.onBecomeUnobservedHandler = onBecomeUnobservedHandler;
- _this.isPendingUnobservation = false;
- _this.isBeingTracked = false;
- return _this;
- }
- Atom.prototype.reportObserved = function () {
- startBatch();
- _super.prototype.reportObserved.call(this);
- if (!this.isBeingTracked) {
- this.isBeingTracked = true;
- this.onBecomeObservedHandler();
- }
- endBatch();
- return !!globalState.trackingDerivation;
- };
- Atom.prototype.onBecomeUnobserved = function () {
- this.isBeingTracked = false;
- this.onBecomeUnobservedHandler();
- };
- return Atom;
- }(BaseAtom);
- exports.Atom = Atom;
- var isAtom = createInstanceofPredicate("Atom", BaseAtom);
- var ComputedValue = function () {
- function ComputedValue(derivation, scope, compareStructural, name, setter) {
- this.derivation = derivation;
- this.scope = scope;
- this.compareStructural = compareStructural;
- this.dependenciesState = IDerivationState.NOT_TRACKING;
- this.observing = [];
- this.newObserving = null;
- this.isPendingUnobservation = false;
- this.observers = [];
- this.observersIndexes = {};
- this.diffValue = 0;
- this.runId = 0;
- this.lastAccessedBy = 0;
- this.lowestObserverState = IDerivationState.UP_TO_DATE;
- this.unboundDepsCount = 0;
- this.__mapid = "#" + getNextId();
- this.value = undefined;
- this.isComputing = false;
- this.isRunningSetter = false;
- this.name = name || "ComputedValue@" + getNextId();
- if (setter) this.setter = createAction(name + "-setter", setter);
- }
- ComputedValue.prototype.onBecomeStale = function () {
- propagateMaybeChanged(this);
- };
- ComputedValue.prototype.onBecomeUnobserved = function () {
- invariant(this.dependenciesState !== IDerivationState.NOT_TRACKING, getMessage("m029"));
- clearObserving(this);
- this.value = undefined;
- };
- ComputedValue.prototype.get = function () {
- invariant(!this.isComputing, "Cycle detected in computation " + this.name, this.derivation);
- if (globalState.inBatch === 0) {
- startBatch();
- if (shouldCompute(this)) this.value = this.computeValue(false);
- endBatch();
- } else {
- reportObserved(this);
- if (shouldCompute(this)) if (this.trackAndCompute()) propagateChangeConfirmed(this);
- }
- var result = this.value;
- if (isCaughtException(result)) throw result.cause;
- return result;
- };
- ComputedValue.prototype.peek = function () {
- var res = this.computeValue(false);
- if (isCaughtException(res)) throw res.cause;
- return res;
- };
- ComputedValue.prototype.set = function (value) {
- if (this.setter) {
- invariant(!this.isRunningSetter, "The setter of computed value '" + this.name + "' is trying to update itself. Did you intend to update an _observable_ value, instead of the computed property?");
- this.isRunningSetter = true;
- try {
- this.setter.call(this.scope, value);
- } finally {
- this.isRunningSetter = false;
- }
- } else invariant(false, "[ComputedValue '" + this.name + "'] It is not possible to assign a new value to a computed value.");
- };
- ComputedValue.prototype.trackAndCompute = function () {
- if (isSpyEnabled()) {
- spyReport({
- object: this.scope,
- type: "compute",
- fn: this.derivation
- });
- }
- var oldValue = this.value;
- var newValue = this.value = this.computeValue(true);
- return isCaughtException(newValue) || valueDidChange(this.compareStructural, newValue, oldValue);
- };
- ComputedValue.prototype.computeValue = function (track) {
- this.isComputing = true;
- globalState.computationDepth++;
- var res;
- if (track) {
- res = trackDerivedFunction(this, this.derivation, this.scope);
- } else {
- try {
- res = this.derivation.call(this.scope);
- } catch (e) {
- res = new CaughtException(e);
- }
- }
- globalState.computationDepth--;
- this.isComputing = false;
- return res;
- };
- ;
- ComputedValue.prototype.observe = function (listener, fireImmediately) {
- var _this = this;
- var firstTime = true;
- var prevValue = undefined;
- return autorun(function () {
- var newValue = _this.get();
- if (!firstTime || fireImmediately) {
- var prevU = untrackedStart();
- listener({
- type: "update",
- object: _this,
- newValue: newValue,
- oldValue: prevValue
- });
- untrackedEnd(prevU);
- }
- firstTime = false;
- prevValue = newValue;
- });
- };
- ComputedValue.prototype.toJSON = function () {
- return this.get();
- };
- ComputedValue.prototype.toString = function () {
- return this.name + "[" + this.derivation.toString() + "]";
- };
- ComputedValue.prototype.valueOf = function () {
- return toPrimitive(this.get());
- };
- ;
- ComputedValue.prototype.whyRun = function () {
- var isTracking = Boolean(globalState.trackingDerivation);
- var observing = unique(this.isComputing ? this.newObserving : this.observing).map(function (dep) {
- return dep.name;
- });
- var observers = unique(getObservers(this).map(function (dep) {
- return dep.name;
- }));
- return "\nWhyRun? computation '" + this.name + "':\n * Running because: " + (isTracking ? "[active] the value of this computation is needed by a reaction" : this.isComputing ? "[get] The value of this computed was requested outside a reaction" : "[idle] not running at the moment") + "\n" + (this.dependenciesState === IDerivationState.NOT_TRACKING ? getMessage("m032") : " * This computation will re-run if any of the following observables changes:\n " + joinStrings(observing) + "\n " + (this.isComputing && isTracking ? " (... or any observable accessed during the remainder of the current run)" : "") + "\n\t" + getMessage("m038") + "\n\n * If the outcome of this computation changes, the following observers will be re-run:\n " + joinStrings(observers) + "\n");
- };
- return ComputedValue;
- }();
- ComputedValue.prototype[primitiveSymbol()] = ComputedValue.prototype.valueOf;
- var isComputedValue = createInstanceofPredicate("ComputedValue", ComputedValue);
- var IDerivationState;
- (function (IDerivationState) {
- IDerivationState[IDerivationState["NOT_TRACKING"] = -1] = "NOT_TRACKING";
- IDerivationState[IDerivationState["UP_TO_DATE"] = 0] = "UP_TO_DATE";
- IDerivationState[IDerivationState["POSSIBLY_STALE"] = 1] = "POSSIBLY_STALE";
- IDerivationState[IDerivationState["STALE"] = 2] = "STALE";
- })(IDerivationState || (IDerivationState = {}));
- exports.IDerivationState = IDerivationState;
- var CaughtException = function () {
- function CaughtException(cause) {
- this.cause = cause;
- }
- return CaughtException;
- }();
- function isCaughtException(e) {
- return e instanceof CaughtException;
- }
- function shouldCompute(derivation) {
- switch (derivation.dependenciesState) {
- case IDerivationState.UP_TO_DATE:
- return false;
- case IDerivationState.NOT_TRACKING:
- case IDerivationState.STALE:
- return true;
- case IDerivationState.POSSIBLY_STALE:
- {
- var prevUntracked = untrackedStart();
- var obs = derivation.observing,
- l = obs.length;
- for (var i = 0; i < l; i++) {
- var obj = obs[i];
- if (isComputedValue(obj)) {
- try {
- obj.get();
- } catch (e) {
- untrackedEnd(prevUntracked);
- return true;
- }
- if (derivation.dependenciesState === IDerivationState.STALE) {
- untrackedEnd(prevUntracked);
- return true;
- }
- }
- }
- changeDependenciesStateTo0(derivation);
- untrackedEnd(prevUntracked);
- return false;
- }
- }
- }
- function isComputingDerivation() {
- return globalState.trackingDerivation !== null;
- }
- function checkIfStateModificationsAreAllowed(atom) {
- var hasObservers = atom.observers.length > 0;
- if (globalState.computationDepth > 0 && hasObservers) fail(getMessage("m031") + atom.name);
- if (!globalState.allowStateChanges && hasObservers) fail(getMessage(globalState.strictMode ? "m030a" : "m030b") + atom.name);
- }
- function trackDerivedFunction(derivation, f, context) {
- changeDependenciesStateTo0(derivation);
- derivation.newObserving = new Array(derivation.observing.length + 100);
- derivation.unboundDepsCount = 0;
- derivation.runId = ++globalState.runId;
- var prevTracking = globalState.trackingDerivation;
- globalState.trackingDerivation = derivation;
- var result;
- try {
- result = f.call(context);
- } catch (e) {
- result = new CaughtException(e);
- }
- globalState.trackingDerivation = prevTracking;
- bindDependencies(derivation);
- return result;
- }
- function bindDependencies(derivation) {
- var prevObserving = derivation.observing;
- var observing = derivation.observing = derivation.newObserving;
- derivation.newObserving = null;
- var i0 = 0,
- l = derivation.unboundDepsCount;
- for (var i = 0; i < l; i++) {
- var dep = observing[i];
- if (dep.diffValue === 0) {
- dep.diffValue = 1;
- if (i0 !== i) observing[i0] = dep;
- i0++;
- }
- }
- observing.length = i0;
- l = prevObserving.length;
- while (l--) {
- var dep = prevObserving[l];
- if (dep.diffValue === 0) {
- removeObserver(dep, derivation);
- }
- dep.diffValue = 0;
- }
- while (i0--) {
- var dep = observing[i0];
- if (dep.diffValue === 1) {
- dep.diffValue = 0;
- addObserver(dep, derivation);
- }
- }
- }
- function clearObserving(derivation) {
- var obs = derivation.observing;
- var i = obs.length;
- while (i--) {
- removeObserver(obs[i], derivation);
- }derivation.dependenciesState = IDerivationState.NOT_TRACKING;
- obs.length = 0;
- }
- function untracked(action) {
- var prev = untrackedStart();
- var res = action();
- untrackedEnd(prev);
- return res;
- }
- exports.untracked = untracked;
- function untrackedStart() {
- var prev = globalState.trackingDerivation;
- globalState.trackingDerivation = null;
- return prev;
- }
- function untrackedEnd(prev) {
- globalState.trackingDerivation = prev;
- }
- function changeDependenciesStateTo0(derivation) {
- if (derivation.dependenciesState === IDerivationState.UP_TO_DATE) return;
- derivation.dependenciesState = IDerivationState.UP_TO_DATE;
- var obs = derivation.observing;
- var i = obs.length;
- while (i--) {
- obs[i].lowestObserverState = IDerivationState.UP_TO_DATE;
- }
- }
- var persistentKeys = ["mobxGuid", "resetId", "spyListeners", "strictMode", "runId"];
- var MobXGlobals = function () {
- function MobXGlobals() {
- this.version = 5;
- this.trackingDerivation = null;
- this.computationDepth = 0;
- this.runId = 0;
- this.mobxGuid = 0;
- this.inBatch = 0;
- this.pendingUnobservations = [];
- this.pendingReactions = [];
- this.isRunningReactions = false;
- this.allowStateChanges = true;
- this.strictMode = false;
- this.resetId = 0;
- this.spyListeners = [];
- this.globalReactionErrorHandlers = [];
- }
- return MobXGlobals;
- }();
- var globalState = new MobXGlobals();
- function shareGlobalState() {
- var global = getGlobal();
- var ownState = globalState;
- if (global.__mobservableTrackingStack || global.__mobservableViewStack) throw new Error("[mobx] An incompatible version of mobservable is already loaded.");
- if (global.__mobxGlobal && global.__mobxGlobal.version !== ownState.version) throw new Error("[mobx] An incompatible version of mobx is already loaded.");
- if (global.__mobxGlobal) globalState = global.__mobxGlobal;else global.__mobxGlobal = ownState;
- }
- function getGlobalState() {
- return globalState;
- }
- function registerGlobals() {}
- function resetGlobalState() {
- globalState.resetId++;
- var defaultGlobals = new MobXGlobals();
- for (var key in defaultGlobals) {
- if (persistentKeys.indexOf(key) === -1) globalState[key] = defaultGlobals[key];
- }globalState.allowStateChanges = !globalState.strictMode;
- }
- function hasObservers(observable) {
- return observable.observers && observable.observers.length > 0;
- }
- function getObservers(observable) {
- return observable.observers;
- }
- function invariantObservers(observable) {
- var list = observable.observers;
- var map = observable.observersIndexes;
- var l = list.length;
- for (var i = 0; i < l; i++) {
- var id = list[i].__mapid;
- if (i) {
- invariant(map[id] === i, "INTERNAL ERROR maps derivation.__mapid to index in list");
- } else {
- invariant(!(id in map), "INTERNAL ERROR observer on index 0 shouldnt be held in map.");
- }
- }
- invariant(list.length === 0 || Object.keys(map).length === list.length - 1, "INTERNAL ERROR there is no junk in map");
- }
- function addObserver(observable, node) {
- var l = observable.observers.length;
- if (l) {
- observable.observersIndexes[node.__mapid] = l;
- }
- observable.observers[l] = node;
- if (observable.lowestObserverState > node.dependenciesState) observable.lowestObserverState = node.dependenciesState;
- }
- function removeObserver(observable, node) {
- if (observable.observers.length === 1) {
- observable.observers.length = 0;
- queueForUnobservation(observable);
- } else {
- var list = observable.observers;
- var map_1 = observable.observersIndexes;
- var filler = list.pop();
- if (filler !== node) {
- var index = map_1[node.__mapid] || 0;
- if (index) {
- map_1[filler.__mapid] = index;
- } else {
- delete map_1[filler.__mapid];
- }
- list[index] = filler;
- }
- delete map_1[node.__mapid];
- }
- }
- function queueForUnobservation(observable) {
- if (!observable.isPendingUnobservation) {
- observable.isPendingUnobservation = true;
- globalState.pendingUnobservations.push(observable);
- }
- }
- function startBatch() {
- globalState.inBatch++;
- }
- function endBatch() {
- if (--globalState.inBatch === 0) {
- runReactions();
- var list = globalState.pendingUnobservations;
- for (var i = 0; i < list.length; i++) {
- var observable_1 = list[i];
- observable_1.isPendingUnobservation = false;
- if (observable_1.observers.length === 0) {
- observable_1.onBecomeUnobserved();
- }
- }
- globalState.pendingUnobservations = [];
- }
- }
- function reportObserved(observable) {
- var derivation = globalState.trackingDerivation;
- if (derivation !== null) {
- if (derivation.runId !== observable.lastAccessedBy) {
- observable.lastAccessedBy = derivation.runId;
- derivation.newObserving[derivation.unboundDepsCount++] = observable;
- }
- } else if (observable.observers.length === 0) {
- queueForUnobservation(observable);
- }
- }
- function invariantLOS(observable, msg) {
- var min = getObservers(observable).reduce(function (a, b) {
- return Math.min(a, b.dependenciesState);
- }, 2);
- if (min >= observable.lowestObserverState) return;
- throw new Error("lowestObserverState is wrong for " + msg + " because " + min + " < " + observable.lowestObserverState);
- }
- function propagateChanged(observable) {
- if (observable.lowestObserverState === IDerivationState.STALE) return;
- observable.lowestObserverState = IDerivationState.STALE;
- var observers = observable.observers;
- var i = observers.length;
- while (i--) {
- var d = observers[i];
- if (d.dependenciesState === IDerivationState.UP_TO_DATE) d.onBecomeStale();
- d.dependenciesState = IDerivationState.STALE;
- }
- }
- function propagateChangeConfirmed(observable) {
- if (observable.lowestObserverState === IDerivationState.STALE) return;
- observable.lowestObserverState = IDerivationState.STALE;
- var observers = observable.observers;
- var i = observers.length;
- while (i--) {
- var d = observers[i];
- if (d.dependenciesState === IDerivationState.POSSIBLY_STALE) d.dependenciesState = IDerivationState.STALE;else if (d.dependenciesState === IDerivationState.UP_TO_DATE) observable.lowestObserverState = IDerivationState.UP_TO_DATE;
- }
- }
- function propagateMaybeChanged(observable) {
- if (observable.lowestObserverState !== IDerivationState.UP_TO_DATE) return;
- observable.lowestObserverState = IDerivationState.POSSIBLY_STALE;
- var observers = observable.observers;
- var i = observers.length;
- while (i--) {
- var d = observers[i];
- if (d.dependenciesState === IDerivationState.UP_TO_DATE) {
- d.dependenciesState = IDerivationState.POSSIBLY_STALE;
- d.onBecomeStale();
- }
- }
- }
- var Reaction = function () {
- function Reaction(name, onInvalidate) {
- if (name === void 0) {
- name = "Reaction@" + getNextId();
- }
- this.name = name;
- this.onInvalidate = onInvalidate;
- this.observing = [];
- this.newObserving = [];
- this.dependenciesState = IDerivationState.NOT_TRACKING;
- this.diffValue = 0;
- this.runId = 0;
- this.unboundDepsCount = 0;
- this.__mapid = "#" + getNextId();
- this.isDisposed = false;
- this._isScheduled = false;
- this._isTrackPending = false;
- this._isRunning = false;
- }
- Reaction.prototype.onBecomeStale = function () {
- this.schedule();
- };
- Reaction.prototype.schedule = function () {
- if (!this._isScheduled) {
- this._isScheduled = true;
- globalState.pendingReactions.push(this);
- runReactions();
- }
- };
- Reaction.prototype.isScheduled = function () {
- return this._isScheduled;
- };
- Reaction.prototype.runReaction = function () {
- if (!this.isDisposed) {
- startBatch();
- this._isScheduled = false;
- if (shouldCompute(this)) {
- this._isTrackPending = true;
- this.onInvalidate();
- if (this._isTrackPending && isSpyEnabled()) {
- spyReport({
- object: this,
- type: "scheduled-reaction"
- });
- }
- }
- endBatch();
- }
- };
- Reaction.prototype.track = function (fn) {
- startBatch();
- var notify = isSpyEnabled();
- var startTime;
- if (notify) {
- startTime = Date.now();
- spyReportStart({
- object: this,
- type: "reaction",
- fn: fn
- });
- }
- this._isRunning = true;
- var result = trackDerivedFunction(this, fn, undefined);
- this._isRunning = false;
- this._isTrackPending = false;
- if (this.isDisposed) {
- clearObserving(this);
- }
- if (isCaughtException(result)) this.reportExceptionInDerivation(result.cause);
- if (notify) {
- spyReportEnd({
- time: Date.now() - startTime
- });
- }
- endBatch();
- };
- Reaction.prototype.reportExceptionInDerivation = function (error) {
- var _this = this;
- if (this.errorHandler) {
- this.errorHandler(error, this);
- return;
- }
- var message = "[mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: '" + this;
- var messageToUser = getMessage("m037");
- console.error(message || messageToUser, error);
- if (isSpyEnabled()) {
- spyReport({
- type: "error",
- message: message,
- error: error,
- object: this
- });
- }
- globalState.globalReactionErrorHandlers.forEach(function (f) {
- return f(error, _this);
- });
- };
- Reaction.prototype.dispose = function () {
- if (!this.isDisposed) {
- this.isDisposed = true;
- if (!this._isRunning) {
- startBatch();
- clearObserving(this);
- endBatch();
- }
- }
- };
- Reaction.prototype.getDisposer = function () {
- var r = this.dispose.bind(this);
- r.$mobx = this;
- r.onError = registerErrorHandler;
- return r;
- };
- Reaction.prototype.toString = function () {
- return "Reaction[" + this.name + "]";
- };
- Reaction.prototype.whyRun = function () {
- var observing = unique(this._isRunning ? this.newObserving : this.observing).map(function (dep) {
- return dep.name;
- });
- return "\nWhyRun? reaction '" + this.name + "':\n * Status: [" + (this.isDisposed ? "stopped" : this._isRunning ? "running" : this.isScheduled() ? "scheduled" : "idle") + "]\n * This reaction will re-run if any of the following observables changes:\n " + joinStrings(observing) + "\n " + (this._isRunning ? " (... or any observable accessed during the remainder of the current run)" : "") + "\n\t" + getMessage("m038") + "\n";
- };
- return Reaction;
- }();
- exports.Reaction = Reaction;
- function registerErrorHandler(handler) {
- invariant(this && this.$mobx && isReaction(this.$mobx), "Invalid `this`");
- invariant(!this.$mobx.errorHandler, "Only one onErrorHandler can be registered");
- this.$mobx.errorHandler = handler;
- }
- function onReactionError(handler) {
- globalState.globalReactionErrorHandlers.push(handler);
- return function () {
- var idx = globalState.globalReactionErrorHandlers.indexOf(handler);
- if (idx >= 0) globalState.globalReactionErrorHandlers.splice(idx, 1);
- };
- }
- var MAX_REACTION_ITERATIONS = 100;
- var reactionScheduler = function reactionScheduler(f) {
- return f();
- };
- function runReactions() {
- if (globalState.inBatch > 0 || globalState.isRunningReactions) return;
- reactionScheduler(runReactionsHelper);
- }
- function runReactionsHelper() {
- globalState.isRunningReactions = true;
- var allReactions = globalState.pendingReactions;
- var iterations = 0;
- while (allReactions.length > 0) {
- if (++iterations === MAX_REACTION_ITERATIONS) {
- console.error("Reaction doesn't converge to a stable state after " + MAX_REACTION_ITERATIONS + " iterations." + (" Probably there is a cycle in the reactive function: " + allReactions[0]));
- allReactions.splice(0);
- }
- var remainingReactions = allReactions.splice(0);
- for (var i = 0, l = remainingReactions.length; i < l; i++) {
- remainingReactions[i].runReaction();
- }
- }
- globalState.isRunningReactions = false;
- }
- var isReaction = createInstanceofPredicate("Reaction", Reaction);
- function setReactionScheduler(fn) {
- var baseScheduler = reactionScheduler;
- reactionScheduler = function reactionScheduler(f) {
- return fn(function () {
- return baseScheduler(f);
- });
- };
- }
- function isSpyEnabled() {
- return !!globalState.spyListeners.length;
- }
- function spyReport(event) {
- if (!globalState.spyListeners.length) return;
- var listeners = globalState.spyListeners;
- for (var i = 0, l = listeners.length; i < l; i++) {
- listeners[i](event);
- }
- }
- function spyReportStart(event) {
- var change = objectAssign({}, event, { spyReportStart: true });
- spyReport(change);
- }
- var END_EVENT = { spyReportEnd: true };
- function spyReportEnd(change) {
- if (change) spyReport(objectAssign({}, change, END_EVENT));else spyReport(END_EVENT);
- }
- function spy(listener) {
- globalState.spyListeners.push(listener);
- return once(function () {
- var idx = globalState.spyListeners.indexOf(listener);
- if (idx !== -1) globalState.spyListeners.splice(idx, 1);
- });
- }
- exports.spy = spy;
- function hasInterceptors(interceptable) {
- return interceptable.interceptors && interceptable.interceptors.length > 0;
- }
- function registerInterceptor(interceptable, handler) {
- var interceptors = interceptable.interceptors || (interceptable.interceptors = []);
- interceptors.push(handler);
- return once(function () {
- var idx = interceptors.indexOf(handler);
- if (idx !== -1) interceptors.splice(idx, 1);
- });
- }
- function interceptChange(interceptable, change) {
- var prevU = untrackedStart();
- try {
- var interceptors = interceptable.interceptors;
- if (interceptors) for (var i = 0, l = interceptors.length; i < l; i++) {
- change = interceptors[i](change);
- invariant(!change || change.type, "Intercept handlers should return nothing or a change object");
- if (!change) break;
- }
- return change;
- } finally {
- untrackedEnd(prevU);
- }
- }
- function hasListeners(listenable) {
- return listenable.changeListeners && listenable.changeListeners.length > 0;
- }
- function registerListener(listenable, handler) {
- var listeners = listenable.changeListeners || (listenable.changeListeners = []);
- listeners.push(handler);
- return once(function () {
- var idx = listeners.indexOf(handler);
- if (idx !== -1) listeners.splice(idx, 1);
- });
- }
- function notifyListeners(listenable, change) {
- var prevU = untrackedStart();
- var listeners = listenable.changeListeners;
- if (!listeners) return;
- listeners = listeners.slice();
- for (var i = 0, l = listeners.length; i < l; i++) {
- listeners[i](change);
- }
- untrackedEnd(prevU);
- }
- function asReference(value) {
- deprecated("asReference is deprecated, use observable.ref instead");
- return observable.ref(value);
- }
- exports.asReference = asReference;
- function asStructure(value) {
- deprecated("asStructure is deprecated. Use observable.struct, computed.struct or reaction options instead.");
- return observable.struct(value);
- }
- exports.asStructure = asStructure;
- function asFlat(value) {
- deprecated("asFlat is deprecated, use observable.shallow instead");
- return observable.shallow(value);
- }
- exports.asFlat = asFlat;
- function asMap(data) {
- deprecated("asMap is deprecated, use observable.map or observable.shallowMap instead");
- return observable.map(data || {});
- }
- exports.asMap = asMap;
- function isModifierDescriptor(thing) {
- return (typeof thing === "undefined" ? "undefined" : _typeof(thing)) === "object" && thing !== null && thing.isMobxModifierDescriptor === true;
- }
- exports.isModifierDescriptor = isModifierDescriptor;
- function createModifierDescriptor(enhancer, initialValue) {
- invariant(!isModifierDescriptor(initialValue), "Modifiers cannot be nested");
- return {
- isMobxModifierDescriptor: true,
- initialValue: initialValue,
- enhancer: enhancer
- };
- }
- function deepEnhancer(v, _, name) {
- if (isModifierDescriptor(v)) fail("You tried to assign a modifier wrapped value to a collection, please define modifiers when creating the collection, not when modifying it");
- if (isObservable(v)) return v;
- if (Array.isArray(v)) return observable.array(v, name);
- if (isPlainObject(v)) return observable.object(v, name);
- if (isES6Map(v)) return observable.map(v, name);
- return v;
- }
- function shallowEnhancer(v, _, name) {
- if (isModifierDescriptor(v)) fail("You tried to assign a modifier wrapped value to a collection, please define modifiers when creating the collection, not when modifying it");
- if (v === undefined || v === null) return v;
- if (isObservableObject(v) || isObservableArray(v) || isObservableMap(v)) return v;
- if (Array.isArray(v)) return observable.shallowArray(v, name);
- if (isPlainObject(v)) return observable.shallowObject(v, name);
- if (isES6Map(v)) return observable.shallowMap(v, name);
- return fail("The shallow modifier / decorator can only used in combination with arrays, objects and maps");
- }
- function referenceEnhancer(newValue) {
- return newValue;
- }
- function deepStructEnhancer(v, oldValue, name) {
- if (deepEqual(v, oldValue)) return oldValue;
- if (isObservable(v)) return v;
- if (Array.isArray(v)) return new ObservableArray(v, deepStructEnhancer, name);
- if (isES6Map(v)) return new ObservableMap(v, deepStructEnhancer, name);
- if (isPlainObject(v)) {
- var res = {};
- asObservableObject(res, name);
- extendObservableHelper(res, deepStructEnhancer, [v]);
- return res;
- }
- return v;
- }
- function refStructEnhancer(v, oldValue, name) {
- if (deepEqual(v, oldValue)) return oldValue;
- return v;
- }
- var MAX_SPLICE_SIZE = 10000;
- var safariPrototypeSetterInheritanceBug = function () {
- var v = false;
- var p = {};
- Object.defineProperty(p, "0", { set: function set() {
- v = true;
- } });
- Object.create(p)["0"] = 1;
- return v === false;
- }();
- var OBSERVABLE_ARRAY_BUFFER_SIZE = 0;
- var StubArray = function () {
- function StubArray() {}
- return StubArray;
- }();
- StubArray.prototype = [];
- var ObservableArrayAdministration = function () {
- function ObservableArrayAdministration(name, enhancer, array, owned) {
- this.array = array;
- this.owned = owned;
- this.lastKnownLength = 0;
- this.interceptors = null;
- this.changeListeners = null;
- this.atom = new BaseAtom(name || "ObservableArray@" + getNextId());
- this.enhancer = function (newV, oldV) {
- return enhancer(newV, oldV, name + "[..]");
- };
- }
- ObservableArrayAdministration.prototype.intercept = function (handler) {
- return registerInterceptor(this, handler);
- };
- ObservableArrayAdministration.prototype.observe = function (listener, fireImmediately) {
- if (fireImmediately === void 0) {
- fireImmediately = false;
- }
- if (fireImmediately) {
- listener({
- object: this.array,
- type: "splice",
- index: 0,
- added: this.values.slice(),
- addedCount: this.values.length,
- removed: [],
- removedCount: 0
- });
- }
- return registerListener(this, listener);
- };
- ObservableArrayAdministration.prototype.getArrayLength = function () {
- this.atom.reportObserved();
- return this.values.length;
- };
- ObservableArrayAdministration.prototype.setArrayLength = function (newLength) {
- if (typeof newLength !== "number" || newLength < 0) throw new Error("[mobx.array] Out of range: " + newLength);
- var currentLength = this.values.length;
- if (newLength === currentLength) return;else if (newLength > currentLength) {
- var newItems = new Array(newLength - currentLength);
- for (var i = 0; i < newLength - currentLength; i++) {
- newItems[i] = undefined;
- }this.spliceWithArray(currentLength, 0, newItems);
- } else this.spliceWithArray(newLength, currentLength - newLength);
- };
- ObservableArrayAdministration.prototype.updateArrayLength = function (oldLength, delta) {
- if (oldLength !== this.lastKnownLength) throw new Error("[mobx] Modification exception: the internal structure of an observable array was changed. Did you use peek() to change it?");
- this.lastKnownLength += delta;
- if (delta > 0 && oldLength + delta + 1 > OBSERVABLE_ARRAY_BUFFER_SIZE) reserveArrayBuffer(oldLength + delta + 1);
- };
- ObservableArrayAdministration.prototype.spliceWithArray = function (index, deleteCount, newItems) {
- var _this = this;
- checkIfStateModificationsAreAllowed(this.atom);
- var length = this.values.length;
- if (index === undefined) index = 0;else if (index > length) index = length;else if (index < 0) index = Math.max(0, length + index);
- if (arguments.length === 1) deleteCount = length - index;else if (deleteCount === undefined || deleteCount === null) deleteCount = 0;else deleteCount = Math.max(0, Math.min(deleteCount, length - index));
- if (newItems === undefined) newItems = [];
- if (hasInterceptors(this)) {
- var change = interceptChange(this, {
- object: this.array,
- type: "splice",
- index: index,
- removedCount: deleteCount,
- added: newItems
- });
- if (!change) return EMPTY_ARRAY;
- deleteCount = change.removedCount;
- newItems = change.added;
- }
- newItems = newItems.map(function (v) {
- return _this.enhancer(v, undefined);
- });
- var lengthDelta = newItems.length - deleteCount;
- this.updateArrayLength(length, lengthDelta);
- var res = this.spliceItemsIntoValues(index, deleteCount, newItems);
- if (deleteCount !== 0 || newItems.length !== 0) this.notifyArraySplice(index, newItems, res);
- return res;
- };
- ObservableArrayAdministration.prototype.spliceItemsIntoValues = function (index, deleteCount, newItems) {
- if (newItems.length < MAX_SPLICE_SIZE) {
- return (_a = this.values).splice.apply(_a, [index, deleteCount].concat(newItems));
- } else {
- var res = this.values.slice(index, index + deleteCount);
- this.values = this.values.slice(0, index).concat(newItems, this.values.slice(index + deleteCount));
- return res;
- }
- var _a;
- };
- ObservableArrayAdministration.prototype.notifyArrayChildUpdate = function (index, newValue, oldValue) {
- var notifySpy = !this.owned && isSpyEnabled();
- var notify = hasListeners(this);
- var change = notify || notifySpy ? {
- object: this.array,
- type: "update",
- index: index, newValue: newValue, oldValue: oldValue
- } : null;
- if (notifySpy) spyReportStart(change);
- this.atom.reportChanged();
- if (notify) notifyListeners(this, change);
- if (notifySpy) spyReportEnd();
- };
- ObservableArrayAdministration.prototype.notifyArraySplice = function (index, added, removed) {
- var notifySpy = !this.owned && isSpyEnabled();
- var notify = hasListeners(this);
- var change = notify || notifySpy ? {
- object: this.array,
- type: "splice",
- index: index, removed: removed, added: added,
- removedCount: removed.length,
- addedCount: added.length
- } : null;
- if (notifySpy) spyReportStart(change);
- this.atom.reportChanged();
- if (notify) notifyListeners(this, change);
- if (notifySpy) spyReportEnd();
- };
- return ObservableArrayAdministration;
- }();
- var ObservableArray = function (_super) {
- __extends(ObservableArray, _super);
- function ObservableArray(initialValues, enhancer, name, owned) {
- if (name === void 0) {
- name = "ObservableArray@" + getNextId();
- }
- if (owned === void 0) {
- owned = false;
- }
- var _this = _super.call(this) || this;
- var adm = new ObservableArrayAdministration(name, enhancer, _this, owned);
- addHiddenFinalProp(_this, "$mobx", adm);
- if (initialValues && initialValues.length) {
- adm.updateArrayLength(0, initialValues.length);
- adm.values = initialValues.map(function (v) {
- return enhancer(v, undefined, name + "[..]");
- });
- adm.notifyArraySplice(0, adm.values.slice(), EMPTY_ARRAY);
- } else {
- adm.values = [];
- }
- if (safariPrototypeSetterInheritanceBug) {
- Object.defineProperty(adm.array, "0", ENTRY_0);
- }
- return _this;
- }
- ObservableArray.prototype.intercept = function (handler) {
- return this.$mobx.intercept(handler);
- };
- ObservableArray.prototype.observe = function (listener, fireImmediately) {
- if (fireImmediately === void 0) {
- fireImmediately = false;
- }
- return this.$mobx.observe(listener, fireImmediately);
- };
- ObservableArray.prototype.clear = function () {
- return this.splice(0);
- };
- ObservableArray.prototype.concat = function () {
- var arrays = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- arrays[_i] = arguments[_i];
- }
- this.$mobx.atom.reportObserved();
- return Array.prototype.concat.apply(this.peek(), arrays.map(function (a) {
- return isObservableArray(a) ? a.peek() : a;
- }));
- };
- ObservableArray.prototype.replace = function (newItems) {
- return this.$mobx.spliceWithArray(0, this.$mobx.values.length, newItems);
- };
- ObservableArray.prototype.toJS = function () {
- return this.slice();
- };
- ObservableArray.prototype.toJSON = function () {
- return this.toJS();
- };
- ObservableArray.prototype.peek = function () {
- return this.$mobx.values;
- };
- ObservableArray.prototype.find = function (predicate, thisArg, fromIndex) {
- if (fromIndex === void 0) {
- fromIndex = 0;
- }
- this.$mobx.atom.reportObserved();
- var items = this.$mobx.values,
- l = items.length;
- for (var i = fromIndex; i < l; i++) {
- if (predicate.call(thisArg, items[i], i, this)) return items[i];
- }return undefined;
- };
- ObservableArray.prototype.splice = function (index, deleteCount) {
- var newItems = [];
- for (var _i = 2; _i < arguments.length; _i++) {
- newItems[_i - 2] = arguments[_i];
- }
- switch (arguments.length) {
- case 0:
- return [];
- case 1:
- return this.$mobx.spliceWithArray(index);
- case 2:
- return this.$mobx.spliceWithArray(index, deleteCount);
- }
- return this.$mobx.spliceWithArray(index, deleteCount, newItems);
- };
- ObservableArray.prototype.spliceWithArray = function (index, deleteCount, newItems) {
- return this.$mobx.spliceWithArray(index, deleteCount, newItems);
- };
- ObservableArray.prototype.push = function () {
- var items = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- items[_i] = arguments[_i];
- }
- var adm = this.$mobx;
- adm.spliceWithArray(adm.values.length, 0, items);
- return adm.values.length;
- };
- ObservableArray.prototype.pop = function () {
- return this.splice(Math.max(this.$mobx.values.length - 1, 0), 1)[0];
- };
- ObservableArray.prototype.shift = function () {
- return this.splice(0, 1)[0];
- };
- ObservableArray.prototype.unshift = function () {
- var items = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- items[_i] = arguments[_i];
- }
- var adm = this.$mobx;
- adm.spliceWithArray(0, 0, items);
- return adm.values.length;
- };
- ObservableArray.prototype.reverse = function () {
- this.$mobx.atom.reportObserved();
- var clone = this.slice();
- return clone.reverse.apply(clone, arguments);
- };
- ObservableArray.prototype.sort = function (compareFn) {
- this.$mobx.atom.reportObserved();
- var clone = this.slice();
- return clone.sort.apply(clone, arguments);
- };
- ObservableArray.prototype.remove = function (value) {
- var idx = this.$mobx.values.indexOf(value);
- if (idx > -1) {
- this.splice(idx, 1);
- return true;
- }
- return false;
- };
- ObservableArray.prototype.move = function (fromIndex, toIndex) {
- function checkIndex(index) {
- if (index < 0) {
- throw new Error("[mobx.array] Index out of bounds: " + index + " is negative");
- }
- var length = this.$mobx.values.length;
- if (index >= length) {
- throw new Error("[mobx.array] Index out of bounds: " + index + " is not smaller than " + length);
- }
- }
- checkIndex.call(this, fromIndex);
- checkIndex.call(this, toIndex);
- if (fromIndex === toIndex) {
- return;
- }
- var oldItems = this.$mobx.values;
- var newItems;
- if (fromIndex < toIndex) {
- newItems = oldItems.slice(0, fromIndex).concat(oldItems.slice(fromIndex + 1, toIndex + 1), [oldItems[fromIndex]], oldItems.slice(toIndex + 1));
- } else {
- newItems = oldItems.slice(0, toIndex).concat([oldItems[fromIndex]], oldItems.slice(toIndex, fromIndex), oldItems.slice(fromIndex + 1));
- }
- this.replace(newItems);
- };
- ObservableArray.prototype.toString = function () {
- this.$mobx.atom.reportObserved();
- return Array.prototype.toString.apply(this.$mobx.values, arguments);
- };
- ObservableArray.prototype.toLocaleString = function () {
- this.$mobx.atom.reportObserved();
- return Array.prototype.toLocaleString.apply(this.$mobx.values, arguments);
- };
- return ObservableArray;
- }(StubArray);
- declareIterator(ObservableArray.prototype, function () {
- return arrayAsIterator(this.slice());
- });
- makeNonEnumerable(ObservableArray.prototype, ["constructor", "intercept", "observe", "clear", "concat", "replace", "toJS", "toJSON", "peek", "find", "splice", "spliceWithArray", "push", "pop", "shift", "unshift", "reverse", "sort", "remove", "move", "toString", "toLocaleString"]);
- Object.defineProperty(ObservableArray.prototype, "length", {
- enumerable: false,
- configurable: true,
- get: function get() {
- return this.$mobx.getArrayLength();
- },
- set: function set(newLength) {
- this.$mobx.setArrayLength(newLength);
- }
- });
- ["every", "filter", "forEach", "indexOf", "join", "lastIndexOf", "map", "reduce", "reduceRight", "slice", "some"].forEach(function (funcName) {
- var baseFunc = Array.prototype[funcName];
- invariant(typeof baseFunc === "function", "Base function not defined on Array prototype: '" + funcName + "'");
- addHiddenProp(ObservableArray.prototype, funcName, function () {
- this.$mobx.atom.reportObserved();
- return baseFunc.apply(this.$mobx.values, arguments);
- });
- });
- var ENTRY_0 = {
- configurable: true,
- enumerable: false,
- set: createArraySetter(0),
- get: createArrayGetter(0)
- };
- function createArrayBufferItem(index) {
- var set = createArraySetter(index);
- var get = createArrayGetter(index);
- Object.defineProperty(ObservableArray.prototype, "" + index, {
- enumerable: false,
- configurable: true,
- set: set, get: get
- });
- }
- function createArraySetter(index) {
- return function (newValue) {
- var adm = this.$mobx;
- var values = adm.values;
- if (index < values.length) {
- checkIfStateModificationsAreAllowed(adm.atom);
- var oldValue = values[index];
- if (hasInterceptors(adm)) {
- var change = interceptChange(adm, {
- type: "update",
- object: adm.array,
- index: index, newValue: newValue
- });
- if (!change) return;
- newValue = change.newValue;
- }
- newValue = adm.enhancer(newValue, oldValue);
- var changed = newValue !== oldValue;
- if (changed) {
- values[index] = newValue;
- adm.notifyArrayChildUpdate(index, newValue, oldValue);
- }
- } else if (index === values.length) {
- adm.spliceWithArray(index, 0, [newValue]);
- } else throw new Error("[mobx.array] Index out of bounds, " + index + " is larger than " + values.length);
- };
- }
- function createArrayGetter(index) {
- return function () {
- var impl = this.$mobx;
- if (impl) {
- if (index < impl.values.length) {
- impl.atom.reportObserved();
- return impl.values[index];
- }
- console.warn("[mobx.array] Attempt to read an array index (" + index + ") that is out of bounds (" + impl.values.length + "). Please check length first. Out of bound indices will not be tracked by MobX");
- }
- return undefined;
- };
- }
- function reserveArrayBuffer(max) {
- for (var index = OBSERVABLE_ARRAY_BUFFER_SIZE; index < max; index++) {
- createArrayBufferItem(index);
- }OBSERVABLE_ARRAY_BUFFER_SIZE = max;
- }
- reserveArrayBuffer(1000);
- var isObservableArrayAdministration = createInstanceofPredicate("ObservableArrayAdministration", ObservableArrayAdministration);
- function isObservableArray(thing) {
- return isObject(thing) && isObservableArrayAdministration(thing.$mobx);
- }
- exports.isObservableArray = isObservableArray;
- var ObservableMapMarker = {};
- var ObservableMap = function () {
- function ObservableMap(initialData, enhancer, name) {
- if (enhancer === void 0) {
- enhancer = deepEnhancer;
- }
- if (name === void 0) {
- name = "ObservableMap@" + getNextId();
- }
- this.enhancer = enhancer;
- this.name = name;
- this.$mobx = ObservableMapMarker;
- this._data = {};
- this._hasMap = {};
- this._keys = new ObservableArray(undefined, referenceEnhancer, this.name + ".keys()", true);
- this.interceptors = null;
- this.changeListeners = null;
- this.merge(initialData);
- }
- ObservableMap.prototype._has = function (key) {
- return typeof this._data[key] !== "undefined";
- };
- ObservableMap.prototype.has = function (key) {
- if (!this.isValidKey(key)) return false;
- key = "" + key;
- if (this._hasMap[key]) return this._hasMap[key].get();
- return this._updateHasMapEntry(key, false).get();
- };
- ObservableMap.prototype.set = function (key, value) {
- this.assertValidKey(key);
- key = "" + key;
- var hasKey = this._has(key);
- if (hasInterceptors(this)) {
- var change = interceptChange(this, {
- type: hasKey ? "update" : "add",
- object: this,
- newValue: value,
- name: key
- });
- if (!change) return this;
- value = change.newValue;
- }
- if (hasKey) {
- this._updateValue(key, value);
- } else {
- this._addValue(key, value);
- }
- return this;
- };
- ObservableMap.prototype.delete = function (key) {
- var _this = this;
- this.assertValidKey(key);
- key = "" + key;
- if (hasInterceptors(this)) {
- var change = interceptChange(this, {
- type: "delete",
- object: this,
- name: key
- });
- if (!change) return false;
- }
- if (this._has(key)) {
- var notifySpy = isSpyEnabled();
- var notify = hasListeners(this);
- var change = notify || notifySpy ? {
- type: "delete",
- object: this,
- oldValue: this._data[key].value,
- name: key
- } : null;
- if (notifySpy) spyReportStart(change);
- runInTransaction(function () {
- _this._keys.remove(key);
- _this._updateHasMapEntry(key, false);
- var observable = _this._data[key];
- observable.setNewValue(undefined);
- _this._data[key] = undefined;
- });
- if (notify) notifyListeners(this, change);
- if (notifySpy) spyReportEnd();
- return true;
- }
- return false;
- };
- ObservableMap.prototype._updateHasMapEntry = function (key, value) {
- var entry = this._hasMap[key];
- if (entry) {
- entry.setNewValue(value);
- } else {
- entry = this._hasMap[key] = new ObservableValue(value, referenceEnhancer, this.name + "." + key + "?", false);
- }
- return entry;
- };
- ObservableMap.prototype._updateValue = function (name, newValue) {
- var observable = this._data[name];
- newValue = observable.prepareNewValue(newValue);
- if (newValue !== UNCHANGED) {
- var notifySpy = isSpyEnabled();
- var notify = hasListeners(this);
- var change = notify || notifySpy ? {
- type: "update",
- object: this,
- oldValue: observable.value,
- name: name, newValue: newValue
- } : null;
- if (notifySpy) spyReportStart(change);
- observable.setNewValue(newValue);
- if (notify) notifyListeners(this, change);
- if (notifySpy) spyReportEnd();
- }
- };
- ObservableMap.prototype._addValue = function (name, newValue) {
- var _this = this;
- runInTransaction(function () {
- var observable = _this._data[name] = new ObservableValue(newValue, _this.enhancer, _this.name + "." + name, false);
- newValue = observable.value;
- _this._updateHasMapEntry(name, true);
- _this._keys.push(name);
- });
- var notifySpy = isSpyEnabled();
- var notify = hasListeners(this);
- var change = notify || notifySpy ? {
- type: "add",
- object: this,
- name: name, newValue: newValue
- } : null;
- if (notifySpy) spyReportStart(change);
- if (notify) notifyListeners(this, change);
- if (notifySpy) spyReportEnd();
- };
- ObservableMap.prototype.get = function (key) {
- key = "" + key;
- if (this.has(key)) return this._data[key].get();
- return undefined;
- };
- ObservableMap.prototype.keys = function () {
- return arrayAsIterator(this._keys.slice());
- };
- ObservableMap.prototype.values = function () {
- return arrayAsIterator(this._keys.map(this.get, this));
- };
- ObservableMap.prototype.entries = function () {
- var _this = this;
- return arrayAsIterator(this._keys.map(function (key) {
- return [key, _this.get(key)];
- }));
- };
- ObservableMap.prototype.forEach = function (callback, thisArg) {
- var _this = this;
- this.keys().forEach(function (key) {
- return callback.call(thisArg, _this.get(key), key, _this);
- });
- };
- ObservableMap.prototype.merge = function (other) {
- var _this = this;
- if (isObservableMap(other)) {
- other = other.toJS();
- }
- runInTransaction(function () {
- if (isPlainObject(other)) Object.keys(other).forEach(function (key) {
- return _this.set(key, other[key]);
- });else if (Array.isArray(other)) other.forEach(function (_a) {
- var key = _a[0],
- value = _a[1];
- return _this.set(key, value);
- });else if (isES6Map(other)) other.forEach(function (value, key) {
- return _this.set(key, value);
- });else if (other !== null && other !== undefined) fail("Cannot initialize map from " + other);
- });
- return this;
- };
- ObservableMap.prototype.clear = function () {
- var _this = this;
- runInTransaction(function () {
- untracked(function () {
- _this.keys().forEach(_this.delete, _this);
- });
- });
- };
- ObservableMap.prototype.replace = function (values) {
- var _this = this;
- runInTransaction(function () {
- _this.clear();
- _this.merge(values);
- });
- return this;
- };
- Object.defineProperty(ObservableMap.prototype, "size", {
- get: function get() {
- return this._keys.length;
- },
- enumerable: true,
- configurable: true
- });
- ObservableMap.prototype.toJS = function () {
- var _this = this;
- var res = {};
- this.keys().forEach(function (key) {
- return res[key] = _this.get(key);
- });
- return res;
- };
- ObservableMap.prototype.toJSON = function () {
- return this.toJS();
- };
- ObservableMap.prototype.isValidKey = function (key) {
- if (key === null || key === undefined) return false;
- if (typeof key === "string" || typeof key === "number" || typeof key === "boolean") return true;
- return false;
- };
- ObservableMap.prototype.assertValidKey = function (key) {
- if (!this.isValidKey(key)) throw new Error("[mobx.map] Invalid key: '" + key + "', only strings, numbers and booleans are accepted as key in observable maps.");
- };
- ObservableMap.prototype.toString = function () {
- var _this = this;
- return this.name + "[{ " + this.keys().map(function (key) {
- return key + ": " + ("" + _this.get(key));
- }).join(", ") + " }]";
- };
- ObservableMap.prototype.observe = function (listener, fireImmediately) {
- invariant(fireImmediately !== true, getMessage("m033"));
- return registerListener(this, listener);
- };
- ObservableMap.prototype.intercept = function (handler) {
- return registerInterceptor(this, handler);
- };
- return ObservableMap;
- }();
- exports.ObservableMap = ObservableMap;
- declareIterator(ObservableMap.prototype, function () {
- return this.entries();
- });
- function map(initialValues) {
- deprecated("`mobx.map` is deprecated, use `new ObservableMap` or `mobx.observable.map` instead");
- return observable.map(initialValues);
- }
- exports.map = map;
- var isObservableMap = createInstanceofPredicate("ObservableMap", ObservableMap);
- exports.isObservableMap = isObservableMap;
- var ObservableObjectAdministration = function () {
- function ObservableObjectAdministration(target, name) {
- this.target = target;
- this.name = name;
- this.values = {};
- this.changeListeners = null;
- this.interceptors = null;
- }
- ObservableObjectAdministration.prototype.observe = function (callback, fireImmediately) {
- invariant(fireImmediately !== true, "`observe` doesn't support the fire immediately property for observable objects.");
- return registerListener(this, callback);
- };
- ObservableObjectAdministration.prototype.intercept = function (handler) {
- return registerInterceptor(this, handler);
- };
- return ObservableObjectAdministration;
- }();
- function asObservableObject(target, name) {
- if (isObservableObject(target)) return target.$mobx;
- invariant(Object.isExtensible(target), getMessage("m035"));
- if (!isPlainObject(target)) name = (target.constructor.name || "ObservableObject") + "@" + getNextId();
- if (!name) name = "ObservableObject@" + getNextId();
- var adm = new ObservableObjectAdministration(target, name);
- addHiddenFinalProp(target, "$mobx", adm);
- return adm;
- }
- function defineObservablePropertyFromDescriptor(adm, propName, descriptor, defaultEnhancer) {
- if (adm.values[propName]) {
- invariant("value" in descriptor, "The property " + propName + " in " + adm.name + " is already observable, cannot redefine it as computed property");
- adm.target[propName] = descriptor.value;
- return;
- }
- if ("value" in descriptor) {
- if (isModifierDescriptor(descriptor.value)) {
- var modifierDescriptor = descriptor.value;
- defineObservableProperty(adm, propName, modifierDescriptor.initialValue, modifierDescriptor.enhancer);
- } else if (isAction(descriptor.value) && descriptor.value.autoBind === true) {
- defineBoundAction(adm.target, propName, descriptor.value.originalFn);
- } else if (isComputedValue(descriptor.value)) {
- defineComputedPropertyFromComputedValue(adm, propName, descriptor.value);
- } else {
- defineObservableProperty(adm, propName, descriptor.value, defaultEnhancer);
- }
- } else {
- defineComputedProperty(adm, propName, descriptor.get, descriptor.set, false, true);
- }
- }
- function defineObservableProperty(adm, propName, newValue, enhancer) {
- assertPropertyConfigurable(adm.target, propName);
- if (hasInterceptors(adm)) {
- var change = interceptChange(adm, {
- object: adm.target,
- name: propName,
- type: "add",
- newValue: newValue
- });
- if (!change) return;
- newValue = change.newValue;
- }
- var observable = adm.values[propName] = new ObservableValue(newValue, enhancer, adm.name + "." + propName, false);
- newValue = observable.value;
- Object.defineProperty(adm.target, propName, generateObservablePropConfig(propName));
- notifyPropertyAddition(adm, adm.target, propName, newValue);
- }
- function defineComputedProperty(adm, propName, getter, setter, compareStructural, asInstanceProperty) {
- if (asInstanceProperty) assertPropertyConfigurable(adm.target, propName);
- adm.values[propName] = new ComputedValue(getter, adm.target, compareStructural, adm.name + "." + propName, setter);
- if (asInstanceProperty) {
- Object.defineProperty(adm.target, propName, generateComputedPropConfig(propName));
- }
- }
- function defineComputedPropertyFromComputedValue(adm, propName, computedValue) {
- var name = adm.name + "." + propName;
- computedValue.name = name;
- if (!computedValue.scope) computedValue.scope = adm.target;
- adm.values[propName] = computedValue;
- Object.defineProperty(adm.target, propName, generateComputedPropConfig(propName));
- }
- var observablePropertyConfigs = {};
- var computedPropertyConfigs = {};
- function generateObservablePropConfig(propName) {
- return observablePropertyConfigs[propName] || (observablePropertyConfigs[propName] = {
- configurable: true,
- enumerable: true,
- get: function get() {
- return this.$mobx.values[propName].get();
- },
- set: function set(v) {
- setPropertyValue(this, propName, v);
- }
- });
- }
- function generateComputedPropConfig(propName) {
- return computedPropertyConfigs[propName] || (computedPropertyConfigs[propName] = {
- configurable: true,
- enumerable: false,
- get: function get() {
- return this.$mobx.values[propName].get();
- },
- set: function set(v) {
- return this.$mobx.values[propName].set(v);
- }
- });
- }
- function setPropertyValue(instance, name, newValue) {
- var adm = instance.$mobx;
- var observable = adm.values[name];
- if (hasInterceptors(adm)) {
- var change = interceptChange(adm, {
- type: "update",
- object: instance,
- name: name, newValue: newValue
- });
- if (!change) return;
- newValue = change.newValue;
- }
- newValue = observable.prepareNewValue(newValue);
- if (newValue !== UNCHANGED) {
- var notify = hasListeners(adm);
- var notifySpy = isSpyEnabled();
- var change = notify || notifySpy ? {
- type: "update",
- object: instance,
- oldValue: observable.value,
- name: name, newValue: newValue
- } : null;
- if (notifySpy) spyReportStart(change);
- observable.setNewValue(newValue);
- if (notify) notifyListeners(adm, change);
- if (notifySpy) spyReportEnd();
- }
- }
- function notifyPropertyAddition(adm, object, name, newValue) {
- var notify = hasListeners(adm);
- var notifySpy = isSpyEnabled();
- var change = notify || notifySpy ? {
- type: "add",
- object: object, name: name, newValue: newValue
- } : null;
- if (notifySpy) spyReportStart(change);
- if (notify) notifyListeners(adm, change);
- if (notifySpy) spyReportEnd();
- }
- var isObservableObjectAdministration = createInstanceofPredicate("ObservableObjectAdministration", ObservableObjectAdministration);
- function isObservableObject(thing) {
- if (isObject(thing)) {
- runLazyInitializers(thing);
- return isObservableObjectAdministration(thing.$mobx);
- }
- return false;
- }
- exports.isObservableObject = isObservableObject;
- var UNCHANGED = {};
- var ObservableValue = function (_super) {
- __extends(ObservableValue, _super);
- function ObservableValue(value, enhancer, name, notifySpy) {
- if (name === void 0) {
- name = "ObservableValue@" + getNextId();
- }
- if (notifySpy === void 0) {
- notifySpy = true;
- }
- var _this = _super.call(this, name) || this;
- _this.enhancer = enhancer;
- _this.hasUnreportedChange = false;
- _this.value = enhancer(value, undefined, name);
- if (notifySpy && isSpyEnabled()) {
- spyReport({ type: "create", object: _this, newValue: _this.value });
- }
- return _this;
- }
- ObservableValue.prototype.set = function (newValue) {
- var oldValue = this.value;
- newValue = this.prepareNewValue(newValue);
- if (newValue !== UNCHANGED) {
- var notifySpy = isSpyEnabled();
- if (notifySpy) {
- spyReportStart({
- type: "update",
- object: this,
- newValue: newValue, oldValue: oldValue
- });
- }
- this.setNewValue(newValue);
- if (notifySpy) spyReportEnd();
- }
- };
- ObservableValue.prototype.prepareNewValue = function (newValue) {
- checkIfStateModificationsAreAllowed(this);
- if (hasInterceptors(this)) {
- var change = interceptChange(this, { object: this, type: "update", newValue: newValue });
- if (!change) return UNCHANGED;
- newValue = change.newValue;
- }
- newValue = this.enhancer(newValue, this.value, this.name);
- return this.value !== newValue ? newValue : UNCHANGED;
- };
- ObservableValue.prototype.setNewValue = function (newValue) {
- var oldValue = this.value;
- this.value = newValue;
- this.reportChanged();
- if (hasListeners(this)) {
- notifyListeners(this, {
- type: "update",
- object: this,
- newValue: newValue,
- oldValue: oldValue
- });
- }
- };
- ObservableValue.prototype.get = function () {
- this.reportObserved();
- return this.value;
- };
- ObservableValue.prototype.intercept = function (handler) {
- return registerInterceptor(this, handler);
- };
- ObservableValue.prototype.observe = function (listener, fireImmediately) {
- if (fireImmediately) listener({
- object: this,
- type: "update",
- newValue: this.value,
- oldValue: undefined
- });
- return registerListener(this, listener);
- };
- ObservableValue.prototype.toJSON = function () {
- return this.get();
- };
- ObservableValue.prototype.toString = function () {
- return this.name + "[" + this.value + "]";
- };
- ObservableValue.prototype.valueOf = function () {
- return toPrimitive(this.get());
- };
- return ObservableValue;
- }(BaseAtom);
- ObservableValue.prototype[primitiveSymbol()] = ObservableValue.prototype.valueOf;
- var isObservableValue = createInstanceofPredicate("ObservableValue", ObservableValue);
- exports.isBoxedObservable = isObservableValue;
- function getAtom(thing, property) {
- if ((typeof thing === "undefined" ? "undefined" : _typeof(thing)) === "object" && thing !== null) {
- if (isObservableArray(thing)) {
- invariant(property === undefined, getMessage("m036"));
- return thing.$mobx.atom;
- }
- if (isObservableMap(thing)) {
- var anyThing = thing;
- if (property === undefined) return getAtom(anyThing._keys);
- var observable_2 = anyThing._data[property] || anyThing._hasMap[property];
- invariant(!!observable_2, "the entry '" + property + "' does not exist in the observable map '" + getDebugName(thing) + "'");
- return observable_2;
- }
- runLazyInitializers(thing);
- if (isObservableObject(thing)) {
- if (!property) return fail("please specify a property");
- var observable_3 = thing.$mobx.values[property];
- invariant(!!observable_3, "no observable property '" + property + "' found on the observable object '" + getDebugName(thing) + "'");
- return observable_3;
- }
- if (isAtom(thing) || isComputedValue(thing) || isReaction(thing)) {
- return thing;
- }
- } else if (typeof thing === "function") {
- if (isReaction(thing.$mobx)) {
- return thing.$mobx;
- }
- }
- return fail("Cannot obtain atom from " + thing);
- }
- function getAdministration(thing, property) {
- invariant(thing, "Expecting some object");
- if (property !== undefined) return getAdministration(getAtom(thing, property));
- if (isAtom(thing) || isComputedValue(thing) || isReaction(thing)) return thing;
- if (isObservableMap(thing)) return thing;
- runLazyInitializers(thing);
- if (thing.$mobx) return thing.$mobx;
- invariant(false, "Cannot obtain administration from " + thing);
- }
- function getDebugName(thing, property) {
- var named;
- if (property !== undefined) named = getAtom(thing, property);else if (isObservableObject(thing) || isObservableMap(thing)) named = getAdministration(thing);else named = getAtom(thing);
- return named.name;
- }
- function createClassPropertyDecorator(onInitialize, _get, _set, enumerable, allowCustomArguments) {
- function classPropertyDecorator(target, key, descriptor, customArgs, argLen) {
- if (argLen === void 0) {
- argLen = 0;
- }
- invariant(allowCustomArguments || quacksLikeADecorator(arguments), "This function is a decorator, but it wasn't invoked like a decorator");
- if (!descriptor) {
- var newDescriptor = {
- enumerable: enumerable,
- configurable: true,
- get: function get() {
- if (!this.__mobxInitializedProps || this.__mobxInitializedProps[key] !== true) typescriptInitializeProperty(this, key, undefined, onInitialize, customArgs, descriptor);
- return _get.call(this, key);
- },
- set: function set(v) {
- if (!this.__mobxInitializedProps || this.__mobxInitializedProps[key] !== true) {
- typescriptInitializeProperty(this, key, v, onInitialize, customArgs, descriptor);
- } else {
- _set.call(this, key, v);
- }
- }
- };
- if (arguments.length < 3 || arguments.length === 5 && argLen < 3) {
- Object.defineProperty(target, key, newDescriptor);
- }
- return newDescriptor;
- } else {
- if (!hasOwnProperty(target, "__mobxLazyInitializers")) {
- addHiddenProp(target, "__mobxLazyInitializers", target.__mobxLazyInitializers && target.__mobxLazyInitializers.slice() || []);
- }
- var value_1 = descriptor.value,
- initializer_1 = descriptor.initializer;
- target.__mobxLazyInitializers.push(function (instance) {
- onInitialize(instance, key, initializer_1 ? initializer_1.call(instance) : value_1, customArgs, descriptor);
- });
- return {
- enumerable: enumerable, configurable: true,
- get: function get() {
- if (this.__mobxDidRunLazyInitializers !== true) runLazyInitializers(this);
- return _get.call(this, key);
- },
- set: function set(v) {
- if (this.__mobxDidRunLazyInitializers !== true) runLazyInitializers(this);
- _set.call(this, key, v);
- }
- };
- }
- }
- if (allowCustomArguments) {
- return function () {
- if (quacksLikeADecorator(arguments)) return classPropertyDecorator.apply(null, arguments);
- var outerArgs = arguments;
- var argLen = arguments.length;
- return function (target, key, descriptor) {
- return classPropertyDecorator(target, key, descriptor, outerArgs, argLen);
- };
- };
- }
- return classPropertyDecorator;
- }
- function typescriptInitializeProperty(instance, key, v, onInitialize, customArgs, baseDescriptor) {
- if (!hasOwnProperty(instance, "__mobxInitializedProps")) addHiddenProp(instance, "__mobxInitializedProps", {});
- instance.__mobxInitializedProps[key] = true;
- onInitialize(instance, key, v, customArgs, baseDescriptor);
- }
- function runLazyInitializers(instance) {
- if (instance.__mobxDidRunLazyInitializers === true) return;
- if (instance.__mobxLazyInitializers) {
- addHiddenProp(instance, "__mobxDidRunLazyInitializers", true);
- instance.__mobxDidRunLazyInitializers && instance.__mobxLazyInitializers.forEach(function (initializer) {
- return initializer(instance);
- });
- }
- }
- function quacksLikeADecorator(args) {
- return (args.length === 2 || args.length === 3) && typeof args[1] === "string";
- }
- function iteratorSymbol() {
- return typeof Symbol === "function" && Symbol.iterator || "@@iterator";
- }
- var IS_ITERATING_MARKER = "__$$iterating";
- function arrayAsIterator(array) {
- invariant(array[IS_ITERATING_MARKER] !== true, "Illegal state: cannot recycle array as iterator");
- addHiddenFinalProp(array, IS_ITERATING_MARKER, true);
- var idx = -1;
- addHiddenFinalProp(array, "next", function next() {
- idx++;
- return {
- done: idx >= this.length,
- value: idx < this.length ? this[idx] : undefined
- };
- });
- return array;
- }
- function declareIterator(prototType, iteratorFactory) {
- addHiddenFinalProp(prototType, iteratorSymbol(), iteratorFactory);
- }
- var messages = {
- "m001": "It is not allowed to assign new values to @action fields",
- "m002": "`runInAction` expects a function",
- "m003": "`runInAction` expects a function without arguments",
- "m004": "autorun expects a function",
- "m005": "Warning: attempted to pass an action to autorun. Actions are untracked and will not trigger on state changes. Use `reaction` or wrap only your state modification code in an action.",
- "m006": "Warning: attempted to pass an action to autorunAsync. Actions are untracked and will not trigger on state changes. Use `reaction` or wrap only your state modification code in an action.",
- "m007": "reaction only accepts 2 or 3 arguments. If migrating from MobX 2, please provide an options object",
- "m008": "wrapping reaction expression in `asReference` is no longer supported, use options object instead",
- "m009": "@computed can only be used on getter functions, like: '@computed get myProps() { return ...; }'. It looks like it was used on a property.",
- "m010": "@computed can only be used on getter functions, like: '@computed get myProps() { return ...; }'",
- "m011": "First argument to `computed` should be an expression. If using computed as decorator, don't pass it arguments",
- "m012": "computed takes one or two arguments if used as function",
- "m013": "[mobx.expr] 'expr' should only be used inside other reactive functions.",
- "m014": "extendObservable expected 2 or more arguments",
- "m015": "extendObservable expects an object as first argument",
- "m016": "extendObservable should not be used on maps, use map.merge instead",
- "m017": "all arguments of extendObservable should be objects",
- "m018": "extending an object with another observable (object) is not supported. Please construct an explicit propertymap, using `toJS` if need. See issue #540",
- "m019": "[mobx.isObservable] isObservable(object, propertyName) is not supported for arrays and maps. Use map.has or array.length instead.",
- "m020": "modifiers can only be used for individual object properties",
- "m021": "observable expects zero or one arguments",
- "m022": "@observable can not be used on getters, use @computed instead",
- "m023": "Using `transaction` is deprecated, use `runInAction` or `(@)action` instead.",
- "m024": "whyRun() can only be used if a derivation is active, or by passing an computed value / reaction explicitly. If you invoked whyRun from inside a computation; the computation is currently suspended but re-evaluating because somebody requested its value.",
- "m025": "whyRun can only be used on reactions and computed values",
- "m026": "`action` can only be invoked on functions",
- "m028": "It is not allowed to set `useStrict` when a derivation is running",
- "m029": "INTERNAL ERROR only onBecomeUnobserved shouldn't be called twice in a row",
- "m030a": "Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an `action` if this change is intended. Tried to modify: ",
- "m030b": "Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, the render function of a React component? Tried to modify: ",
- "m031": "Computed values are not allowed to not cause side effects by changing observables that are already being observed. Tried to modify: ",
- "m032": "* This computation is suspended (not in use by any reaction) and won't run automatically.\n Didn't expect this computation to be suspended at this point?\n 1. Make sure this computation is used by a reaction (reaction, autorun, observer).\n 2. Check whether you are using this computation synchronously (in the same stack as they reaction that needs it).",
- "m033": "`observe` doesn't support the fire immediately property for observable maps.",
- "m034": "`mobx.map` is deprecated, use `new ObservableMap` or `mobx.observable.map` instead",
- "m035": "Cannot make the designated object observable; it is not extensible",
- "m036": "It is not possible to get index atoms from arrays",
- "m037": "Hi there! I'm sorry you have just run into an exception.\nIf your debugger ends up here, know that some reaction (like the render() of an observer component, autorun or reaction)\nthrew an exception and that mobx caught it, to avoid that it brings the rest of your application down.\nThe original cause of the exception (the code that caused this reaction to run (again)), is still in the stack.\n\nHowever, more interesting is the actual stack trace of the error itself.\nHopefully the error is an instanceof Error, because in that case you can inspect the original stack of the error from where it was thrown.\nSee `error.stack` property, or press the very subtle \"(...)\" link you see near the console.error message that probably brought you here.\nThat stack is more interesting than the stack of this console.error itself.\n\nIf the exception you see is an exception you created yourself, make sure to use `throw new Error(\"Oops\")` instead of `throw \"Oops\"`,\nbecause the javascript environment will only preserve the original stack trace in the first form.\n\nYou can also make sure the debugger pauses the next time this very same exception is thrown by enabling \"Pause on caught exception\".\n(Note that it might pause on many other, unrelated exception as well).\n\nIf that all doesn't help you out, feel free to open an issue https://github.com/mobxjs/mobx/issues!\n",
- "m038": "Missing items in this list?\n 1. Check whether all used values are properly marked as observable (use isObservable to verify)\n 2. Make sure you didn't dereference values too early. MobX observes props, not primitives. E.g: use 'person.name' instead of 'name' in your computation.\n"
- };
- function getMessage(id) {
- return messages[id];
- }
- var EMPTY_ARRAY = [];
- Object.freeze(EMPTY_ARRAY);
- function getGlobal() {
- return global;
- }
- function getNextId() {
- return ++globalState.mobxGuid;
- }
- function fail(message, thing) {
- invariant(false, message, thing);
- throw "X";
- }
- function invariant(check, message, thing) {
- if (!check) throw new Error("[mobx] Invariant failed: " + message + (thing ? " in '" + thing + "'" : ""));
- }
- var deprecatedMessages = [];
- function deprecated(msg) {
- if (deprecatedMessages.indexOf(msg) !== -1) return false;
- deprecatedMessages.push(msg);
- console.error("[mobx] Deprecated: " + msg);
- return true;
- }
- function once(func) {
- var invoked = false;
- return function () {
- if (invoked) return;
- invoked = true;
- return func.apply(this, arguments);
- };
- }
- var noop = function noop() {};
- function unique(list) {
- var res = [];
- list.forEach(function (item) {
- if (res.indexOf(item) === -1) res.push(item);
- });
- return res;
- }
- function joinStrings(things, limit, separator) {
- if (limit === void 0) {
- limit = 100;
- }
- if (separator === void 0) {
- separator = " - ";
- }
- if (!things) return "";
- var sliced = things.slice(0, limit);
- return "" + sliced.join(separator) + (things.length > limit ? " (... and " + (things.length - limit) + "more)" : "");
- }
- function isObject(value) {
- return value !== null && (typeof value === "undefined" ? "undefined" : _typeof(value)) === "object";
- }
- function isPlainObject(value) {
- if (value === null || (typeof value === "undefined" ? "undefined" : _typeof(value)) !== "object") return false;
- var proto = Object.getPrototypeOf(value);
- return proto === Object.prototype || proto === null;
- }
- function objectAssign() {
- var res = arguments[0];
- for (var i = 1, l = arguments.length; i < l; i++) {
- var source = arguments[i];
- for (var key in source) {
- if (hasOwnProperty(source, key)) {
- res[key] = source[key];
- }
- }
- }
- return res;
- }
- function valueDidChange(compareStructural, oldValue, newValue) {
- if (typeof oldValue === 'number' && isNaN(oldValue)) {
- return typeof newValue !== 'number' || !isNaN(newValue);
- }
- return compareStructural ? !deepEqual(oldValue, newValue) : oldValue !== newValue;
- }
- var prototypeHasOwnProperty = Object.prototype.hasOwnProperty;
- function hasOwnProperty(object, propName) {
- return prototypeHasOwnProperty.call(object, propName);
- }
- function makeNonEnumerable(object, propNames) {
- for (var i = 0; i < propNames.length; i++) {
- addHiddenProp(object, propNames[i], object[propNames[i]]);
- }
- }
- function addHiddenProp(object, propName, value) {
- Object.defineProperty(object, propName, {
- enumerable: false,
- writable: true,
- configurable: true,
- value: value
- });
- }
- function addHiddenFinalProp(object, propName, value) {
- Object.defineProperty(object, propName, {
- enumerable: false,
- writable: false,
- configurable: true,
- value: value
- });
- }
- function isPropertyConfigurable(object, prop) {
- var descriptor = Object.getOwnPropertyDescriptor(object, prop);
- return !descriptor || descriptor.configurable !== false && descriptor.writable !== false;
- }
- function assertPropertyConfigurable(object, prop) {
- invariant(isPropertyConfigurable(object, prop), "Cannot make property '" + prop + "' observable, it is not configurable and writable in the target object");
- }
- function getEnumerableKeys(obj) {
- var res = [];
- for (var key in obj) {
- res.push(key);
- }return res;
- }
- function deepEqual(a, b) {
- if (a === null && b === null) return true;
- if (a === undefined && b === undefined) return true;
- if ((typeof a === "undefined" ? "undefined" : _typeof(a)) !== "object") return a === b;
- var aIsArray = isArrayLike(a);
- var aIsMap = isMapLike(a);
- if (aIsArray !== isArrayLike(b)) {
- return false;
- } else if (aIsMap !== isMapLike(b)) {
- return false;
- } else if (aIsArray) {
- if (a.length !== b.length) return false;
- for (var i = a.length - 1; i >= 0; i--) {
- if (!deepEqual(a[i], b[i])) return false;
- }return true;
- } else if (aIsMap) {
- if (a.size !== b.size) return false;
- var equals_1 = true;
- a.forEach(function (value, key) {
- equals_1 = equals_1 && deepEqual(b.get(key), value);
- });
- return equals_1;
- } else if ((typeof a === "undefined" ? "undefined" : _typeof(a)) === "object" && (typeof b === "undefined" ? "undefined" : _typeof(b)) === "object") {
- if (a === null || b === null) return false;
- if (isMapLike(a) && isMapLike(b)) {
- if (a.size !== b.size) return false;
- return deepEqual(observable.shallowMap(a).entries(), observable.shallowMap(b).entries());
- }
- if (getEnumerableKeys(a).length !== getEnumerableKeys(b).length) return false;
- for (var prop in a) {
- if (!(prop in b)) return false;
- if (!deepEqual(a[prop], b[prop])) return false;
- }
- return true;
- }
- return false;
- }
- function createInstanceofPredicate(name, clazz) {
- var propName = "isMobX" + name;
- clazz.prototype[propName] = true;
- return function (x) {
- return isObject(x) && x[propName] === true;
- };
- }
- function isArrayLike(x) {
- return Array.isArray(x) || isObservableArray(x);
- }
- exports.isArrayLike = isArrayLike;
- function isMapLike(x) {
- return isES6Map(x) || isObservableMap(x);
- }
- function isES6Map(thing) {
- if (getGlobal().Map !== undefined && thing instanceof getGlobal().Map) return true;
- return false;
- }
- function primitiveSymbol() {
- return typeof Symbol === "function" && Symbol.toPrimitive || "@@toPrimitive";
- }
- function toPrimitive(value) {
- return value === null ? null : (typeof value === "undefined" ? "undefined" : _typeof(value)) === "object" ? "" + value : value;
- }
- /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
-
- /***/ }),
- /* 2 */
- /***/ (function(module, exports, __webpack_require__) {
-
- "use strict";
-
-
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
-
- var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
-
- var _icons = __webpack_require__(6);
-
- var _constants = __webpack_require__(0);
-
- function renderHeader(_ref, instance) {
- var meta = _ref.meta,
- user = _ref.user,
- reactions = _ref.reactions;
-
- var container = document.createElement('div');
- container.lang = "en-US";
- container.className = 'gitment-container gitment-header-container';
-
- var likeButton = document.createElement('span');
- var likedReaction = reactions.find(function (reaction) {
- return reaction.content === 'heart' && reaction.user.login === user.login;
- });
- likeButton.className = 'gitment-header-like-btn';
- likeButton.innerHTML = '\n ' + _icons.heart + '\n ' + (likedReaction ? 'Unlike' : 'Like') + '\n ' + (meta.reactions && meta.reactions.heart ? ' \u2022 ' + meta.reactions.heart + ' Liked' : '') + '\n ';
-
- if (likedReaction) {
- likeButton.classList.add('liked');
- likeButton.onclick = function () {
- return instance.unlike();
- };
- } else {
- likeButton.classList.remove('liked');
- likeButton.onclick = function () {
- return instance.like();
- };
- }
- container.appendChild(likeButton);
-
- var commentsCount = document.createElement('span');
- commentsCount.innerHTML = '\n ' + (meta.comments ? ' \u2022 ' + meta.comments + ' Comments' : '') + '\n ';
- container.appendChild(commentsCount);
-
- var issueLink = document.createElement('a');
- issueLink.className = 'gitment-header-issue-link';
- issueLink.href = meta.html_url;
- issueLink.target = '_blank';
- issueLink.innerText = 'Issue Page';
- container.appendChild(issueLink);
-
- return container;
- }
-
- function renderComments(_ref2, instance) {
- var meta = _ref2.meta,
- comments = _ref2.comments,
- commentReactions = _ref2.commentReactions,
- currentPage = _ref2.currentPage,
- user = _ref2.user,
- error = _ref2.error;
-
- var container = document.createElement('div');
- container.lang = "en-US";
- container.className = 'gitment-container gitment-comments-container';
-
- if (error) {
- var errorBlock = document.createElement('div');
- errorBlock.className = 'gitment-comments-error';
-
- if (error === _constants.NOT_INITIALIZED_ERROR && user.login && user.login.toLowerCase() === instance.owner.toLowerCase()) {
- var initHint = document.createElement('div');
- var initButton = document.createElement('button');
- initButton.className = 'gitment-comments-init-btn';
- initButton.onclick = function () {
- initButton.setAttribute('disabled', true);
- instance.init().catch(function (e) {
- initButton.removeAttribute('disabled');
- alert(e);
- });
- };
- initButton.innerText = 'Initialize Comments';
- initHint.appendChild(initButton);
- errorBlock.appendChild(initHint);
- } else {
- errorBlock.innerText = error;
- }
- container.appendChild(errorBlock);
- return container;
- } else if (comments === undefined) {
- var loading = document.createElement('div');
- loading.innerText = 'Loading comments...';
- loading.className = 'gitment-comments-loading';
- container.appendChild(loading);
- return container;
- } else if (!comments.length) {
- var emptyBlock = document.createElement('div');
- emptyBlock.className = 'gitment-comments-empty';
- emptyBlock.innerText = 'No Comment Yet';
- container.appendChild(emptyBlock);
- return container;
- }
-
- var commentsList = document.createElement('ul');
- commentsList.className = 'gitment-comments-list';
-
- comments.forEach(function (comment) {
- var createDate = new Date(comment.created_at);
- var updateDate = new Date(comment.updated_at);
- var commentItem = document.createElement('li');
- commentItem.className = 'gitment-comment';
- commentItem.innerHTML = '\n \n \n \n
' + comment.body_html + '
\n
\n ';
- var likeButton = commentItem.querySelector('.gitment-comment-like-btn');
- var likedReaction = commentReactions[comment.id] && commentReactions[comment.id].find(function (reaction) {
- return reaction.content === 'heart' && reaction.user.login === user.login;
- });
- if (likedReaction) {
- likeButton.classList.add('liked');
- likeButton.onclick = function () {
- return instance.unlikeAComment(comment.id);
- };
- } else {
- likeButton.classList.remove('liked');
- likeButton.onclick = function () {
- return instance.likeAComment(comment.id);
- };
- }
-
- // dirty
- // use a blank image to trigger height calculating when element rendered
- var imgTrigger = document.createElement('img');
- var markdownBody = commentItem.querySelector('.gitment-comment-body');
- imgTrigger.className = 'gitment-hidden';
- imgTrigger.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
- imgTrigger.onload = function () {
- if (markdownBody.clientHeight > instance.maxCommentHeight) {
- markdownBody.classList.add('gitment-comment-body-folded');
- markdownBody.style.maxHeight = instance.maxCommentHeight + 'px';
- markdownBody.title = 'Click to Expand';
- markdownBody.onclick = function () {
- markdownBody.classList.remove('gitment-comment-body-folded');
- markdownBody.style.maxHeight = '';
- markdownBody.title = '';
- markdownBody.onclick = null;
- };
- }
- };
- commentItem.appendChild(imgTrigger);
-
- commentsList.appendChild(commentItem);
- });
-
- container.appendChild(commentsList);
-
- if (meta) {
- var pageCount = Math.ceil(meta.comments / instance.perPage);
- if (pageCount > 1) {
- var pagination = document.createElement('ul');
- pagination.className = 'gitment-comments-pagination';
-
- if (currentPage > 1) {
- var previousButton = document.createElement('li');
- previousButton.className = 'gitment-comments-page-item';
- previousButton.innerText = 'Previous';
- previousButton.onclick = function () {
- return instance.goto(currentPage - 1);
- };
- pagination.appendChild(previousButton);
- }
-
- var _loop = function _loop(i) {
- var pageItem = document.createElement('li');
- pageItem.className = 'gitment-comments-page-item';
- pageItem.innerText = i;
- pageItem.onclick = function () {
- return instance.goto(i);
- };
- if (currentPage === i) pageItem.classList.add('gitment-selected');
- pagination.appendChild(pageItem);
- };
-
- for (var i = 1; i <= pageCount; i++) {
- _loop(i);
- }
-
- if (currentPage < pageCount) {
- var nextButton = document.createElement('li');
- nextButton.className = 'gitment-comments-page-item';
- nextButton.innerText = 'Next';
- nextButton.onclick = function () {
- return instance.goto(currentPage + 1);
- };
- pagination.appendChild(nextButton);
- }
-
- container.appendChild(pagination);
- }
- }
-
- return container;
- }
-
- function renderEditor(_ref3, instance) {
- var user = _ref3.user,
- error = _ref3.error;
-
- var container = document.createElement('div');
- container.lang = "en-US";
- container.className = 'gitment-container gitment-editor-container';
-
- var shouldDisable = user.login && !error ? '' : 'disabled';
- var disabledTip = user.login ? '' : 'Login to Comment';
- container.innerHTML = '\n ' + (user.login ? '\n \n ' : user.isLoggingIn ? '' + _icons.spinner + '
' : '\n ' + _icons.github + '\n ') + '\n \n \n \n ';
- if (user.login) {
- container.querySelector('.gitment-editor-logout-link').onclick = function () {
- return instance.logout();
- };
- }
-
- var writeField = container.querySelector('.gitment-editor-write-field');
- var previewField = container.querySelector('.gitment-editor-preview-field');
-
- var textarea = writeField.querySelector('textarea');
- textarea.oninput = function () {
- textarea.style.height = 'auto';
- var style = window.getComputedStyle(textarea, null);
- var height = parseInt(style.height, 10);
- var clientHeight = textarea.clientHeight;
- var scrollHeight = textarea.scrollHeight;
- if (clientHeight < scrollHeight) {
- textarea.style.height = height + scrollHeight - clientHeight + 'px';
- }
- };
-
- var _container$querySelec = container.querySelectorAll('.gitment-editor-tab'),
- _container$querySelec2 = _slicedToArray(_container$querySelec, 2),
- writeTab = _container$querySelec2[0],
- previewTab = _container$querySelec2[1];
-
- writeTab.onclick = function () {
- writeTab.classList.add('gitment-selected');
- previewTab.classList.remove('gitment-selected');
- writeField.classList.remove('gitment-hidden');
- previewField.classList.add('gitment-hidden');
-
- textarea.focus();
- };
- previewTab.onclick = function () {
- previewTab.classList.add('gitment-selected');
- writeTab.classList.remove('gitment-selected');
- previewField.classList.remove('gitment-hidden');
- writeField.classList.add('gitment-hidden');
-
- var preview = previewField.querySelector('.gitment-editor-preview');
- var content = textarea.value.trim();
- if (!content) {
- preview.innerText = 'Nothing to preview';
- return;
- }
-
- preview.innerText = 'Loading preview...';
- instance.markdown(content).then(function (html) {
- return preview.innerHTML = html;
- });
- };
-
- var submitButton = container.querySelector('.gitment-editor-submit');
- submitButton.onclick = function () {
- submitButton.innerText = 'Submitting...';
- submitButton.setAttribute('disabled', true);
- instance.post(textarea.value.trim()).then(function (data) {
- textarea.value = '';
- textarea.style.height = 'auto';
- submitButton.removeAttribute('disabled');
- submitButton.innerText = 'Comment';
- }).catch(function (e) {
- alert(e);
- submitButton.removeAttribute('disabled');
- submitButton.innerText = 'Comment';
- });
- };
-
- return container;
- }
-
- function renderFooter() {
- var container = document.createElement('div');
- container.lang = "en-US";
- container.className = 'gitment-container gitment-footer-container';
- container.innerHTML = '\n Powered by\n \n ';
- return container;
- }
-
- function render(state, instance) {
- var container = document.createElement('div');
- container.lang = "en-US";
- container.className = 'gitment-container gitment-root-container';
- container.appendChild(instance.renderHeader(state, instance));
- container.appendChild(instance.renderComments(state, instance));
- container.appendChild(instance.renderEditor(state, instance));
- container.appendChild(instance.renderFooter(state, instance));
- return container;
- }
-
- exports.default = { render: render, renderHeader: renderHeader, renderComments: renderComments, renderEditor: renderEditor, renderFooter: renderFooter };
-
- /***/ }),
- /* 3 */
- /***/ (function(module, exports, __webpack_require__) {
-
- "use strict";
-
-
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.http = exports.Query = exports.isString = undefined;
-
- var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
-
- exports.getTargetContainer = getTargetContainer;
-
- var _constants = __webpack_require__(0);
-
- var isString = exports.isString = function isString(s) {
- return toString.call(s) === '[object String]';
- };
-
- function getTargetContainer(container) {
- var targetContainer = void 0;
- if (container instanceof Element) {
- targetContainer = container;
- } else if (isString(container)) {
- targetContainer = document.getElementById(container);
- } else {
- targetContainer = document.createElement('div');
- }
-
- return targetContainer;
- }
-
- var Query = exports.Query = {
- parse: function parse() {
- var search = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.location.search;
-
- if (!search) return {};
- var queryString = search[0] === '?' ? search.substring(1) : search;
- var query = {};
- queryString.split('&').forEach(function (queryStr) {
- var _queryStr$split = queryStr.split('='),
- _queryStr$split2 = _slicedToArray(_queryStr$split, 2),
- key = _queryStr$split2[0],
- value = _queryStr$split2[1];
-
- if (key) query[key] = value;
- });
-
- return query;
- },
- stringify: function stringify(query) {
- var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '?';
-
- var queryString = Object.keys(query).map(function (key) {
- return key + '=' + encodeURIComponent(query[key] || '');
- }).join('&');
- return queryString ? prefix + queryString : '';
- }
- };
-
- function ajaxFactory(method) {
- return function (apiPath) {
- var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- var base = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'https://api.github.com';
-
- var req = new XMLHttpRequest();
- var token = localStorage.getItem(_constants.LS_ACCESS_TOKEN_KEY);
-
- var url = '' + base + apiPath;
- var body = null;
- if (method === 'GET' || method === 'DELETE') {
- url += Query.stringify(data);
- }
-
- var p = new Promise(function (resolve, reject) {
- req.addEventListener('load', function () {
- var contentType = req.getResponseHeader('content-type');
- var res = req.responseText;
- if (!/json/.test(contentType)) {
- resolve(res);
- return;
- }
- var data = req.responseText ? JSON.parse(res) : {};
- if (data.message) {
- reject(new Error(data.message));
- } else {
- resolve(data);
- }
- });
- req.addEventListener('error', function (error) {
- return reject(error);
- });
- });
- req.open(method, url, true);
-
- req.setRequestHeader('Accept', 'application/vnd.github.squirrel-girl-preview, application/vnd.github.html+json');
- if (token) {
- req.setRequestHeader('Authorization', 'token ' + token);
- }
- if (method !== 'GET' && method !== 'DELETE') {
- body = JSON.stringify(data);
- req.setRequestHeader('Content-Type', 'application/json');
- }
-
- req.send(body);
- return p;
- };
- }
-
- var http = exports.http = {
- get: ajaxFactory('GET'),
- post: ajaxFactory('POST'),
- delete: ajaxFactory('DELETE'),
- put: ajaxFactory('PUT')
- };
-
- /***/ }),
- /* 4 */
- /***/ (function(module, exports, __webpack_require__) {
-
- "use strict";
-
-
- var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
-
- var g;
-
-// This works in non-strict mode
- g = function () {
- return this;
- }();
-
- try {
- // This works if eval is allowed (see CSP)
- g = g || Function("return this")() || (1, eval)("this");
- } catch (e) {
- // This works if the window reference is available
- if ((typeof window === "undefined" ? "undefined" : _typeof(window)) === "object") g = window;
- }
-
-// g can still be undefined, but nothing to do about it...
-// We return undefined, instead of nothing here, so it's
-// easier to handle this case. if(!global) { ...}
-
- module.exports = g;
-
- /***/ }),
- /* 5 */
- /***/ (function(module, exports, __webpack_require__) {
-
- "use strict";
-
-
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
- var _mobx = __webpack_require__(1);
-
- var _constants = __webpack_require__(0);
-
- var _utils = __webpack_require__(3);
-
- var _default = __webpack_require__(2);
-
- var _default2 = _interopRequireDefault(_default);
-
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
- var scope = 'public_repo';
-
- function extendRenderer(instance, renderer) {
- instance[renderer] = function (container) {
- var targetContainer = (0, _utils.getTargetContainer)(container);
- var render = instance.theme[renderer] || instance.defaultTheme[renderer];
-
- (0, _mobx.autorun)(function () {
- var e = render(instance.state, instance);
- if (targetContainer.firstChild) {
- targetContainer.replaceChild(e, targetContainer.firstChild);
- } else {
- targetContainer.appendChild(e);
- }
- });
-
- return targetContainer;
- };
- }
-
- var Gitment = function () {
- _createClass(Gitment, [{
- key: 'accessToken',
- get: function get() {
- return localStorage.getItem(_constants.LS_ACCESS_TOKEN_KEY);
- },
- set: function set(token) {
- localStorage.setItem(_constants.LS_ACCESS_TOKEN_KEY, token);
- }
- }, {
- key: 'loginLink',
- get: function get() {
- var oauthUri = 'https://github.com/login/oauth/authorize';
- var redirect_uri = this.oauth.redirect_uri || window.location.href;
-
- var oauthParams = Object.assign({
- scope: scope,
- redirect_uri: redirect_uri
- }, this.oauth);
-
- return '' + oauthUri + _utils.Query.stringify(oauthParams);
- }
- }]);
-
- function Gitment() {
- var _this = this;
-
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
- _classCallCheck(this, Gitment);
-
- this.defaultTheme = _default2.default;
- this.useTheme(_default2.default);
-
- Object.assign(this, {
- id: window.location.href,
- title: window.document.title,
- link: window.location.href,
- desc: '',
- labels: [],
- theme: _default2.default,
- oauth: {},
- perPage: 20,
- maxCommentHeight: 250
- }, options);
-
- this.useTheme(this.theme);
-
- var user = {};
- try {
- var userInfo = localStorage.getItem(_constants.LS_USER_KEY);
- if (this.accessToken && userInfo) {
- Object.assign(user, JSON.parse(userInfo), {
- fromCache: true
- });
- }
- } catch (e) {
- localStorage.removeItem(_constants.LS_USER_KEY);
- }
-
- this.state = (0, _mobx.observable)({
- user: user,
- error: null,
- meta: {},
- comments: undefined,
- reactions: [],
- commentReactions: {},
- currentPage: 1
- });
-
- var query = _utils.Query.parse();
- if (query.code) {
- var _oauth = this.oauth,
- client_id = _oauth.client_id,
- client_secret = _oauth.client_secret;
-
- var code = query.code;
- delete query.code;
- var search = _utils.Query.stringify(query);
- var replacedUrl = '' + window.location.origin + window.location.pathname + search + window.location.hash;
- history.replaceState({}, '', replacedUrl);
-
- Object.assign(this, {
- id: replacedUrl,
- link: replacedUrl
- }, options);
-
- this.state.user.isLoggingIn = true;
- _utils.http.post('https://gh-oauth.imsun.net', {
- code: code,
- client_id: client_id,
- client_secret: client_secret
- }, '').then(function (data) {
- _this.accessToken = data.access_token;
- _this.update();
- }).catch(function (e) {
- _this.state.user.isLoggingIn = false;
- alert(e);
- });
- } else {
- this.update();
- }
- }
-
- _createClass(Gitment, [{
- key: 'init',
- value: function init() {
- var _this2 = this;
-
- return this.createIssue().then(function () {
- return _this2.loadComments();
- }).then(function (comments) {
- _this2.state.error = null;
- return comments;
- });
- }
- }, {
- key: 'useTheme',
- value: function useTheme() {
- var _this3 = this;
-
- var theme = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
- this.theme = theme;
-
- var renderers = Object.keys(this.theme);
- renderers.forEach(function (renderer) {
- return extendRenderer(_this3, renderer);
- });
- }
- }, {
- key: 'update',
- value: function update() {
- var _this4 = this;
-
- return Promise.all([this.loadMeta(), this.loadUserInfo()]).then(function () {
- return Promise.all([_this4.loadComments().then(function () {
- return _this4.loadCommentReactions();
- }), _this4.loadReactions()]);
- }).catch(function (e) {
- return _this4.state.error = e;
- });
- }
- }, {
- key: 'markdown',
- value: function markdown(text) {
- return _utils.http.post('/markdown', {
- text: text,
- mode: 'gfm'
- });
- }
- }, {
- key: 'createIssue',
- value: function createIssue() {
- var _this5 = this;
-
- var id = this.id,
- owner = this.owner,
- repo = this.repo,
- title = this.title,
- link = this.link,
- desc = this.desc,
- labels = this.labels;
-
-
- return _utils.http.post('/repos/' + owner + '/' + repo + '/issues', {
- title: title,
- labels: labels.concat(['gitment', id]),
- body: link + '\n\n' + desc
- }).then(function (meta) {
- _this5.state.meta = meta;
- return meta;
- });
- }
- }, {
- key: 'getIssue',
- value: function getIssue() {
- if (this.state.meta.id) return Promise.resolve(this.state.meta);
-
- return this.loadMeta();
- }
- }, {
- key: 'post',
- value: function post(body) {
- var _this6 = this;
-
- return this.getIssue().then(function (issue) {
- return _utils.http.post(issue.comments_url, { body: body }, '');
- }).then(function (data) {
- _this6.state.meta.comments++;
- var pageCount = Math.ceil(_this6.state.meta.comments / _this6.perPage);
- if (_this6.state.currentPage === pageCount) {
- _this6.state.comments.push(data);
- }
- return data;
- });
- }
- }, {
- key: 'loadMeta',
- value: function loadMeta() {
- var _this7 = this;
-
- var id = this.id,
- owner = this.owner,
- repo = this.repo;
-
- return _utils.http.get('/repos/' + owner + '/' + repo + '/issues', {
- creator: owner,
- labels: id
- }).then(function (issues) {
- if (!issues.length) return Promise.reject(_constants.NOT_INITIALIZED_ERROR);
- _this7.state.meta = issues[0];
- return issues[0];
- });
- }
- }, {
- key: 'loadComments',
- value: function loadComments() {
- var _this8 = this;
-
- var page = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.currentPage;
-
- return this.getIssue().then(function (issue) {
- return _utils.http.get(issue.comments_url, { page: page, per_page: _this8.perPage }, '');
- }).then(function (comments) {
- _this8.state.comments = comments;
- return comments;
- });
- }
- }, {
- key: 'loadUserInfo',
- value: function loadUserInfo() {
- var _this9 = this;
-
- if (!this.accessToken) {
- this.logout();
- return Promise.resolve({});
- }
-
- return _utils.http.get('/user').then(function (user) {
- _this9.state.user = user;
- localStorage.setItem(_constants.LS_USER_KEY, JSON.stringify(user));
- return user;
- });
- }
- }, {
- key: 'loadReactions',
- value: function loadReactions() {
- var _this10 = this;
-
- if (!this.accessToken) {
- this.state.reactions = [];
- return Promise.resolve([]);
- }
-
- return this.getIssue().then(function (issue) {
- if (!issue.reactions.total_count) return [];
- return _utils.http.get(issue.reactions.url, {}, '');
- }).then(function (reactions) {
- _this10.state.reactions = reactions;
- return reactions;
- });
- }
- }, {
- key: 'loadCommentReactions',
- value: function loadCommentReactions() {
- var _this11 = this;
-
- if (!this.accessToken) {
- this.state.commentReactions = {};
- return Promise.resolve([]);
- }
-
- var comments = this.state.comments;
- var comentReactions = {};
-
- return Promise.all(comments.map(function (comment) {
- if (!comment.reactions.total_count) return [];
-
- var owner = _this11.owner,
- repo = _this11.repo;
-
- return _utils.http.get('/repos/' + owner + '/' + repo + '/issues/comments/' + comment.id + '/reactions', {});
- })).then(function (reactionsArray) {
- comments.forEach(function (comment, index) {
- comentReactions[comment.id] = reactionsArray[index];
- });
- _this11.state.commentReactions = comentReactions;
-
- return comentReactions;
- });
- }
- }, {
- key: 'login',
- value: function login() {
- window.location.href = this.loginLink;
- }
- }, {
- key: 'logout',
- value: function logout() {
- localStorage.removeItem(_constants.LS_ACCESS_TOKEN_KEY);
- localStorage.removeItem(_constants.LS_USER_KEY);
- this.state.user = {};
- }
- }, {
- key: 'goto',
- value: function goto(page) {
- this.state.currentPage = page;
- this.state.comments = undefined;
- return this.loadComments(page);
- }
- }, {
- key: 'like',
- value: function like() {
- var _this12 = this;
-
- if (!this.accessToken) {
- alert('Login to Like');
- return Promise.reject();
- }
-
- var owner = this.owner,
- repo = this.repo;
-
-
- return _utils.http.post('/repos/' + owner + '/' + repo + '/issues/' + this.state.meta.number + '/reactions', {
- content: 'heart'
- }).then(function (reaction) {
- _this12.state.reactions.push(reaction);
- _this12.state.meta.reactions.heart++;
- });
- }
- }, {
- key: 'unlike',
- value: function unlike() {
- var _this13 = this;
-
- if (!this.accessToken) return Promise.reject();
-
- var _state = this.state,
- user = _state.user,
- reactions = _state.reactions;
-
- var index = reactions.findIndex(function (reaction) {
- return reaction.user.login === user.login;
- });
- return _utils.http.delete('/reactions/' + reactions[index].id).then(function () {
- reactions.splice(index, 1);
- _this13.state.meta.reactions.heart--;
- });
- }
- }, {
- key: 'likeAComment',
- value: function likeAComment(commentId) {
- var _this14 = this;
-
- if (!this.accessToken) {
- alert('Login to Like');
- return Promise.reject();
- }
-
- var owner = this.owner,
- repo = this.repo;
-
- var comment = this.state.comments.find(function (comment) {
- return comment.id === commentId;
- });
-
- return _utils.http.post('/repos/' + owner + '/' + repo + '/issues/comments/' + commentId + '/reactions', {
- content: 'heart'
- }).then(function (reaction) {
- _this14.state.commentReactions[commentId].push(reaction);
- comment.reactions.heart++;
- });
- }
- }, {
- key: 'unlikeAComment',
- value: function unlikeAComment(commentId) {
- if (!this.accessToken) return Promise.reject();
-
- var reactions = this.state.commentReactions[commentId];
- var comment = this.state.comments.find(function (comment) {
- return comment.id === commentId;
- });
- var user = this.state.user;
-
- var index = reactions.findIndex(function (reaction) {
- return reaction.user.login === user.login;
- });
-
- return _utils.http.delete('/reactions/' + reactions[index].id).then(function () {
- reactions.splice(index, 1);
- comment.reactions.heart--;
- });
- }
- }]);
-
- return Gitment;
- }();
-
- module.exports = Gitment;
-
- /***/ }),
- /* 6 */
- /***/ (function(module, exports, __webpack_require__) {
-
- "use strict";
-
-
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- /**
- * Modified from https://github.com/evil-icons/evil-icons
- */
-
- var close = exports.close = ' ';
- var github = exports.github = ' ';
- var heart = exports.heart = ' ';
- var spinner = exports.spinner = ' ';
-
- /***/ })
- /******/ ]);
-//# sourceMappingURL=gitment.browser.js.map
\ No newline at end of file
diff --git a/js/index.js b/js/index.js
deleted file mode 100644
index 776bbb95..00000000
--- a/js/index.js
+++ /dev/null
@@ -1,348 +0,0 @@
-/**
- * Created by Xiaotao.Nie on 09/04/2018.
- * All right reserved
- * IF you have any question please email onlythen@yeah.net
- */
-
-// Global functions and listeners
-window.onresize = () => {
- // when window resize , we show remove some class that me be added
- // often for debug
- if(window.document.documentElement.clientWidth > 680){
- let aboutContent = document.getElementById('nav-content')
- aboutContent.classList.remove('hide-block')
- aboutContent.classList.remove('show-block');
- }
- // if(window.isPost){
- // reLayout()
- // }
-
- reHeightToc();
-};
-
-// Nav switch function on mobile
-/*****************************************************************************/
-const navToggle = document.getElementById('site-nav-toggle');
-navToggle.addEventListener('click', () => {
- let aboutContent = document.getElementById('nav-content')
- if (!aboutContent.classList.contains('show-block')) {
- aboutContent.classList.add('show-block');
- aboutContent.classList.remove('hide-block')
- } else {
- aboutContent.classList.add('hide-block')
- aboutContent.classList.remove('show-block');
- }
-})
-
-
-// global search
-/*****************************************************************************/
-
-const searchButton = document.getElementById('search')
-const searchField = document.getElementById('search-field')
-const searchInput = document.getElementById('search-input')
-const searchResultContainer = document.getElementById('search-result-container')
-const escSearch = document.getElementById('esc-search')
-const beginSearch = document.getElementById('begin-search')
-
-searchField.addEventListener('mousewheel',(e) => {
- // e.preventDefault()
- e.stopPropagation()
- return false
-}, false)
-
-var searchJson;
-var caseSensitive = false
-
-searchButton.addEventListener('click', () => {
- search()
-});
-
-escSearch.addEventListener('click',() => {
- hideSearchField()
-})
-
-beginSearch.addEventListener('click',() => {
- let keyword = searchInput.value;
- if(keyword){
- searchFromKeyWord(keyword)
- }
-})
-
-function toggleSeachField(){
- if (!searchField.classList.contains('show-flex-fade')) {
- showSearchField()
- } else {
- hideSearchField()
- }
-}
-
-function showSearchField() {
- searchInput.focus()
- searchField.classList.add('show-flex-fade');
- searchField.classList.remove('hide-flex-fade');
-}
-
-function hideSearchField(){
- window.onkeydown = null;
- searchField.classList.add('hide-flex-fade');
- searchField.classList.remove('show-flex-fade');
-}
-
-function searchFromKeyWord(keyword = ""){
- let result = [];
-
- let sildeWindowSize = 100;
-
- let handleKeyword = keyword
-
- if(!caseSensitive){
- handleKeyword = keyword.toLowerCase()
- }
- if(!searchJson) return -1;
- else {
- searchJson.forEach((item) => {
-
- if(!item.title || !item.content) return 0; // break
-
- let title = item.title
- let content = item.content.trim().replace(/<[^>]+>/g,"").replace(/[`#\n]/g,"");
-
- let lowerTitle = title,lowerContent = content;
-
- if(!caseSensitive){
- lowerTitle = title.toLowerCase();
- lowerContent = content.toLowerCase();
- }
-
-
- if(lowerTitle.indexOf(handleKeyword) !== -1 || lowerContent.indexOf(handleKeyword) !== -1){
- let resultItem = {}
- resultItem.title = title.replace(keyword, "" + keyword + ' ');
- resultItem.url = item.url;
-
- resultItem.content = [];
-
- let lastend = 0
-
- while(lowerContent.indexOf(handleKeyword) !== -1){
- let begin = lowerContent.indexOf(handleKeyword) - sildeWindowSize / 2 < 0 ? 0 : lowerContent.indexOf(handleKeyword) - sildeWindowSize / 2
- let end = begin + sildeWindowSize;
- let reg = caseSensitive ? new RegExp('('+keyword+')','g') : new RegExp('('+keyword+')','ig')
- resultItem.content.push("..." + content.slice(lastend + begin, lastend + end).replace(reg, "$1 ") + "...")
- lowerContent = lowerContent.slice(end, lowerContent.length)
- lastend = end
- }
- // resultItem.title = title.replace(keyword, "" + keyword + ' ');
- result.push(resultItem)
- }
- })
- }
-
- if(!result.length){
- searchResultContainer.innerHTML = `
- No Result
- `
- return;
- }
-
- let searchFragment = document.createElement('ul')
-
- for(let item of result){
- let searchItem = document.createElement('li');
- let searchTitle = document.createElement('a');
- searchTitle.href = item.url
- searchTitle.innerHTML = item.title;
- searchItem.appendChild(searchTitle)
- if(item.content.length) {
- let searchContentLiContainer = document.createElement('ul')
- for (let citem of item.content) {
- let searchContentFragment = document.createElement('li')
- searchContentFragment.innerHTML = citem;
- searchContentLiContainer.appendChild(searchContentFragment)
- }
- searchItem.appendChild(searchContentLiContainer)
- }
- searchFragment.appendChild(searchItem)
- }
- while(searchResultContainer.firstChild){
- searchResultContainer.removeChild(searchResultContainer.firstChild)
- }
- searchResultContainer.appendChild(searchFragment)
-}
-
-function search(){
-
- toggleSeachField()
-
- window.onkeydown = (e) => {
- if (e.which === 27) {
- /** 这里编写当ESC按下时的处理逻辑! */
- toggleSeachField()
- } else if(e.which === 13){
- // 回车按下
- let keyword = searchInput.value;
- if(keyword){
- searchFromKeyWord(keyword)
- }
- }
- }
-
-
- if(!searchJson){
- let isXml;
- let search_path = window.hexo_search_path;
- if (search_path.length === 0) {
- search_path = "search.json";
- } else if (/json$/i.test(search_path)) {
- isXml = false;
- }
- let path = window.hexo_root+ search_path;
- $.ajax({
- url: path,
- dataType: isXml ? "xml" : "json",
- async: true,
- success: function (res) {
- searchJson = isXml ? $("entry", res).map(function() {
- return {
- title: $("title", this).text(),
- content: $("content",this).text(),
- url: $("url" , this).text()
- };
- }).get() : res;
- }
- });
- }
-
-}
-
-// directory function in post pages
-/*****************************************************************************/
-function getDistanceOfLeft(obj) {
- let left = 0;
- let top = 0;
- while (obj) {
- left += obj.offsetLeft;
- top += obj.offsetTop;
- obj = obj.offsetParent;
- }
- return {
- left:left,
- top:top
- };
-}
-
-var toc = document.getElementById('toc')
-
-var tocToTop = getDistanceOfLeft(toc).top;
-
-function reHeightToc(){
- if(toc) { // resize toc height
- toc.style.height = ( document.documentElement.clientHeight - 10 ) + 'px';
- toc.style.overflowY = 'scroll';
- }
-}
-
-reHeightToc();
-
-if(window.isPost){
- var result = []
-
- var nameSet = new Set();
-
- if(!toc || !toc.children || !toc.children[0]){
- // do nothing
- }
- else {
- if (toc.children[0].nodeName === "OL") {
- let ol = Array.from(toc.children[0].children)
-
- function getArrayFromOl(ol) {
- let result = []
-
- // let escape = function (item) {
- // return item.replace(/<[^>]+>/g, "").replace(/^\s\s*/, '').replace(/\s\s*$/, '').replace(/[\. _]/g, '-')
- // }
-
- ol.forEach((item) => {
- if (item.children.length === 1) {
- // TODO: need change
- let value = item.children[0].getAttribute('href').replace(/^#/,"")
- result.push({
- value: [value],
- dom: item
- })
- nameSet.add(value)
- }
- else {
- let concatArray = getArrayFromOl(Array.from(item.children[1].children))
- nameSet.add(item.children[0].getAttribute('href').replace(/^#/,""))
- result.push({
- value: [item.children[0].getAttribute('href').replace(/^#/,"")].concat(concatArray.reduce((p, n) => {
- p = p.concat(n.value)
- return p;
- }, [])),
- dom: item
- })
- result = result.concat(concatArray)
- }
- })
- return result
- }
-
- result = getArrayFromOl(ol)
- }
-
- var nameArray = Array.from(nameSet)
-
- function reLayout() {
- let scrollToTop = document.documentElement.scrollTop || window.pageYOffset // Safari is special
- if(tocToTop === 0) {
- // Fix bug that when resize window the toc layout may be wrong
- toc = document.getElementById('toc')
- toc.classList.remove('toc-fixed')
- tocToTop = getDistanceOfLeft(toc).top;
- }
- if (tocToTop <= scrollToTop + 10) {
- if (!toc.classList.contains('toc-fixed'))
- toc.classList.add('toc-fixed')
- } else {
- if (toc.classList.contains('toc-fixed'))
- toc.classList.remove('toc-fixed')
- }
-
- let minTop = 9999;
- let minTopsValue = ""
-
- for (let item of nameArray) {
- let dom = document.getElementById(item) || document.getElementById(item.replace(/\s/g, ''))
- if (!dom) continue
- let toTop = getDistanceOfLeft(dom).top - scrollToTop;
-
- if (Math.abs(toTop) < minTop) {
- minTop = Math.abs(toTop)
- minTopsValue = item
- }
-
- // console.log(minTopsValue, minTop)
- }
-
- if (minTopsValue) {
- for (let item of result) {
- if (item.value.indexOf(minTopsValue) !== -1) {
- item.dom.classList.add("active")
- } else {
- item.dom.classList.remove("active")
- }
- }
- }
- }
-
- reLayout()
-
- window.addEventListener('scroll', (e) => {
- reLayout()
- })
- }
-}
-
diff --git a/offdown/index.html b/offdown/index.html
deleted file mode 100644
index ddb74787..00000000
--- a/offdown/index.html
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
-
-
-
-
- 离线下载
-
-
-
-
-
-
-
离线下载
-
-
-
-
-
Telegram用户可使用特色服务 利用tg bot离线下载至bot支持网盘。
-
百度网盘存储空间大,还支持离线下载。但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。
-本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。
-
-
-
-
-
-
diff --git a/offlinedownload/index.html b/offlinedownload/index.html
deleted file mode 100644
index ddb74787..00000000
--- a/offlinedownload/index.html
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
-
-
-
-
- 离线下载
-
-
-
-
-
-
-
离线下载
-
-
-
-
-
Telegram用户可使用特色服务 利用tg bot离线下载至bot支持网盘。
-
百度网盘存储空间大,还支持离线下载。但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。
-本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。
-
-
-
-
-
-
diff --git a/searchurl/a.html b/searchurl/a.html
deleted file mode 100644
index 17771432..00000000
--- a/searchurl/a.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/searchurl/a.html~ b/searchurl/a.html~
deleted file mode 100644
index 99f90e80..00000000
--- a/searchurl/a.html~
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-X
-Up
-Down
-Top
-Bottom
-
-H1
-h2
-h3
-h4
-h5
-h6
-h7
-h8
-h9
-ha
diff --git a/searchurl/ace.js~ b/searchurl/ace.js~
deleted file mode 100644
index a048af99..00000000
--- a/searchurl/ace.js~
+++ /dev/null
@@ -1,24 +0,0 @@
-var editor;
-onload=function(){
- function getMode(filename){
- var ext = filename.split('.').pop();
- var prefix = "ace/mode/";
- if(!ext) return prefix + "text";
-
- switch (ext) {
- case "js":
- return prefix + "javascript";
- }
- return prefix + ext;
- }
-
- editor = ace.edit("editor");
- editor.setTheme("ace/theme/clouds");
- editor.setShowPrintMargin(false);
- editor.setOptions({
- enableBasicAutocompletion: true,
- enableSnippets: true,
- enableLiveAutocompletion: true
- });
- editor.session.setMode(getMode(location.href));
-}
diff --git a/searchurl/ace_t.html~ b/searchurl/ace_t.html~
deleted file mode 100644
index db1a0543..00000000
--- a/searchurl/ace_t.html~
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-title
-hi
diff --git a/searchurl/config.html~ b/searchurl/config.html~
deleted file mode 100644
index 220d0dda..00000000
--- a/searchurl/config.html~
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/searchurl/rjs.html~ b/searchurl/rjs.html~
deleted file mode 100644
index c553cc40..00000000
--- a/searchurl/rjs.html~
+++ /dev/null
@@ -1,36 +0,0 @@
-
-运行javascript脚本
-运行javascript脚本
-特定网址用户脚本
-全局脚本 位于js子目录, 长按[☰]按钮配置。点击以下链
-接安装:
-记住密码
-极速网页
-
-大型脚本 可安装到"/sdcard/uweb/bookmarklet"目录下(长按js按钮):
-Eruda
-彩云小译
-Performance
-移除覆盖物
-
-
-远程脚本 配置文件default.rjs样列如下,点击以下链接
-自动安装 (清空后台重启浏览器,长按搜索按钮,则弹出远程脚本菜
-单):
-
-Selection to sentence:'';let g='sentence';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);
-Selection to line:'';let g='line';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);
-Selection to paragraph:'';let g='paragraph';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);
-显示数学公式:'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js'
-md内容的html文件显示:'https://cdn.jsdelivr.net/npm/mdme'
-md+tex内容的html文件:'https://cdn.jsdelivr.net/npm/texme'
-新窗口打开链接:'';b=d.createElement('base');b.setAttribute('target','_blank');d.head.appendChild(b)
-站内搜索:'';open('i:15site:' + location.hostname)
-编辑器拼写检查:'';let t=d.getElementsByTagName('textarea');let v=t[0].spellcheck;if(v==null)v=false;t[0].spellcheck=!v
-
-远程及小型脚本可安装到default.rjs文件中(远程脚本对CSP网站无效):点击安装google翻译、背景图等
-远程脚本配置文件/sdcard/uweb/default.rjs每行格式如下 (url部分支持js代码运算): [远程脚本名]:[返回url的javascript代码]
-其中url可以为本地html5应用 脚本地址。譬如'https://local/sdcard/uweb/app[XXX]/....../[XXX].js'。此时,js脚本也可使用.link文件 方式调用。
-
-
-
diff --git a/searchurl/script/plugins.html b/searchurl/script/plugins.html
deleted file mode 100644
index b43d4e2e..00000000
--- a/searchurl/script/plugins.html
+++ /dev/null
@@ -1,173 +0,0 @@
-
-
-
-
-
-
- 插件汇总
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 插件汇总
-
-
-
-
Post:2019-06-15 14:13:28
-
-
Tags:/
-
- termux
- /
-
-
-
-
-
-
-
-
插件影响到浏览器的安全,故需要完成以下步骤才能开启插件管理系统:
-
-
插件管理系统功能强大,考虑到潜在的安全隐患,使用插件的同学请不要给予超微浏览器或定制termux超级用户的权限。至少要保证每次使用超级用户权限前弹出提醒或警告。本页面亦提供插件关闭插件管理系统,安装完必要的插件后用户应立即关闭插件管理系统。
-
开启插件系统以后,点击下面的链接即可直接安装。插件可反复安装,互相冲突的插件会被新安装覆盖。插件多寡不影响性能。部分插件需浏览器重启后才能生效。插件列表:
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/searchurl/searchcat.html b/searchurl/searchcat.html
deleted file mode 100644
index b852bed2..00000000
--- a/searchurl/searchcat.html
+++ /dev/null
@@ -1,28 +0,0 @@
-
-分类多引擎搜索
-分类多引擎搜索
-
-使用超微浏览器 点击可自动下载本文所有分类引擎 至"/sdcard/uweb/bookmark",至界面网页刷新动态快捷方式 后可用,长按应用图标可显示此目录下4/5个动态快捷方式(需启动器支持)。
-长按下面链接可下载视频及小说分类多引擎搜索配置文件:
-
-http://jamesfengcao.gitee.io/searchurl/searchcat.tar.gz
-
-超微浏览器 中通过“设置”->“总目录”->“↑”->“Download”,点击后缀为.search的下载
-文件,超微浏览器将自动显示分类多引擎搜索。此时可按菜单键(或长按底部工具条后退按
-钮)选择“添加到桌面”方便以后访问。
-.search文件每行格式为如下几种:
-[搜索引擎名]:[不含%s的url]
-[搜索引擎名]:[含%s的url]
-[搜索引擎名]:POST:[含%s的post参数]:[url]
-.search文件首行必须为第一种类型的搜索引擎。由于其它两种类型的引擎数量稀少,为性能
-考虑,超微限制了首个引擎的种类。
-本地引擎
-搜索引擎已经支持命令行url,现在可添加离线字典查询至主页。命令行url格式为
-c:[含%s的命令行]
-d:mimetype:[含%s的命令行]:[外部资源url]
-查询时关键词会自动替换命令行中的%s。
-笔者用来查询各式词典,发现效果非常好。百兆以内的文本文件压缩以后可以直接快速检索
-,定位至特定位置以后可上下滚动阅读全部文本。
-
-
-
diff --git a/searchurl/template/config.html~ b/searchurl/template/config.html~
deleted file mode 100644
index e69de29b..00000000
diff --git a/searchurl/textarea.js~ b/searchurl/textarea.js~
deleted file mode 100644
index b80b009f..00000000
--- a/searchurl/textarea.js~
+++ /dev/null
@@ -1,13 +0,0 @@
-var textarea;
-function deleteLine(ta){
- let startPos = ta.selectionStart;
- let endPos = ta.selectionEnd;
- let text = ta.value;
- let lStart = startPos-1;
- while(lStart>=0 && text.charAt(lStart)!='\n') lStart--;
- let lEnd = endPos;
- let len = text.length;
- while(lEnd
-
-
-
-
-
-
diff --git a/searchurl/txt/night1.css~ b/searchurl/txt/night1.css~
deleted file mode 100644
index 3398ba8f..00000000
--- a/searchurl/txt/night1.css~
+++ /dev/null
@@ -1,4 +0,0 @@
-html, body, header, div, section, main, table, td, thead, tr, th, article, form, li, ul, nav, iframe { background-color: black !important; color: rgba(255, 255, 255, 0.8) !important; border-color: transparent !important;}
-code, input, textarea { border-color: white !important; background-color: black !important; color: white !important; border: 0px 0px 0px 1px; } span, h1, h2, h3, h4, h5, h6, pre, li, p , b { color: rgba(255,
-255, 255, 0.8) !important; border-color: transparent !important; } l a, a:link, a b { color: rgba(53, 221, 162) !important; border-color: transparent !important; } span, h1, h2, h3, h4, h5, h6, pre, li, p, a, a:link { background-color: transparent !important;} *:empty, div:empty, td:empty, span:empty, .Is, .player-container * { background-color: rgba(0,0,0,0) !important;} div:empty, div div:empty, .Is { display: none !important; visibility: collapse !important;} ._57-q, ._57-p { background-color: rgba(0,0,0,0) !important;}
-.dayMode *::after { background: rgba(0,0,0,0) !important;} .player-container .progress-bar-played { background-color: #f00 !important;}
diff --git a/searchurl/txt/pdfviewer.js~ b/searchurl/txt/pdfviewer.js~
deleted file mode 100644
index 1d013ebf..00000000
--- a/searchurl/txt/pdfviewer.js~
+++ /dev/null
@@ -1,15406 +0,0 @@
-/**
- * @licstart The following is the entire license notice for the
- * Javascript code in this page
- *
- * Copyright 2021 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
- */
-
-/******/ (() => { // webpackBootstrap
-/******/ "use strict";
-/******/ var __webpack_modules__ = ([
-/* 0 */,
-/* 1 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.OptionKind = exports.AppOptions = void 0;
-
-var _viewer_compatibility = __webpack_require__(2);
-
-const OptionKind = {
- VIEWER: 0x02,
- API: 0x04,
- WORKER: 0x08,
- PREFERENCE: 0x80
-};
-exports.OptionKind = OptionKind;
-const defaultOptions = {
- cursorToolOnLoad: {
- value: 0,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- defaultUrl: {
- value: "compressed.tracemonkey-pldi-09.pdf",
- kind: OptionKind.VIEWER
- },
- defaultZoomValue: {
- value: "",
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- disableHistory: {
- value: false,
- kind: OptionKind.VIEWER
- },
- disablePageLabels: {
- value: false,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- enablePermissions: {
- value: false,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- enablePrintAutoRotate: {
- value: true,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- enableScripting: {
- value: true,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- externalLinkRel: {
- value: "noopener noreferrer nofollow",
- kind: OptionKind.VIEWER
- },
- externalLinkTarget: {
- value: 0,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- historyUpdateUrl: {
- value: false,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- ignoreDestinationZoom: {
- value: false,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- imageResourcesPath: {
- value: "./images/",
- kind: OptionKind.VIEWER
- },
- maxCanvasPixels: {
- value: 16777216,
- compatibility: _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels,
- kind: OptionKind.VIEWER
- },
- pdfBugEnabled: {
- value: false,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- printResolution: {
- value: 150,
- kind: OptionKind.VIEWER
- },
- renderer: {
- value: "canvas",
- kind: OptionKind.VIEWER
- },
- renderInteractiveForms: {
- value: true,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- sidebarViewOnLoad: {
- value: -1,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- scrollModeOnLoad: {
- value: -1,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- spreadModeOnLoad: {
- value: -1,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- textLayerMode: {
- value: 1,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- useOnlyCssZoom: {
- value: false,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- viewerCssTheme: {
- value: 0,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- viewOnLoad: {
- value: 0,
- kind: OptionKind.VIEWER + OptionKind.PREFERENCE
- },
- cMapPacked: {
- value: true,
- kind: OptionKind.API
- },
- cMapUrl: {
- value: "../web/cmaps/",
- kind: OptionKind.API
- },
- disableAutoFetch: {
- value: false,
- kind: OptionKind.API + OptionKind.PREFERENCE
- },
- disableFontFace: {
- value: false,
- kind: OptionKind.API + OptionKind.PREFERENCE
- },
- disableRange: {
- value: false,
- kind: OptionKind.API + OptionKind.PREFERENCE
- },
- disableStream: {
- value: false,
- kind: OptionKind.API + OptionKind.PREFERENCE
- },
- docBaseUrl: {
- value: "",
- kind: OptionKind.API
- },
- enableXfa: {
- value: false,
- kind: OptionKind.API + OptionKind.PREFERENCE
- },
- fontExtraProperties: {
- value: false,
- kind: OptionKind.API
- },
- isEvalSupported: {
- value: true,
- kind: OptionKind.API
- },
- maxImageSize: {
- value: -1,
- kind: OptionKind.API
- },
- pdfBug: {
- value: false,
- kind: OptionKind.API
- },
- standardFontDataUrl: {
- value: "../web/standard_fonts/",
- kind: OptionKind.API
- },
- verbosity: {
- value: 1,
- kind: OptionKind.API
- },
- workerPort: {
- value: null,
- kind: OptionKind.WORKER
- },
- workerSrc: {
- value: "../build/pdf.worker.js",
- kind: OptionKind.WORKER
- }
-};
-{
- defaultOptions.disablePreferences = {
- value: false,
- kind: OptionKind.VIEWER
- };
- defaultOptions.locale = {
- value: typeof navigator !== "undefined" ? navigator.language : "en-US",
- kind: OptionKind.VIEWER
- };
- defaultOptions.sandboxBundleSrc = {
- value: "../build/pdf.sandbox.js",
- kind: OptionKind.VIEWER
- };
- defaultOptions.renderer.kind += OptionKind.PREFERENCE;
-}
-const userOptions = Object.create(null);
-
-class AppOptions {
- constructor() {
- throw new Error("Cannot initialize AppOptions.");
- }
-
- static get(name) {
- const userOption = userOptions[name];
-
- if (userOption !== undefined) {
- return userOption;
- }
-
- const defaultOption = defaultOptions[name];
-
- if (defaultOption !== undefined) {
- return defaultOption.compatibility ?? defaultOption.value;
- }
-
- return undefined;
- }
-
- static getAll(kind = null) {
- const options = Object.create(null);
-
- for (const name in defaultOptions) {
- const defaultOption = defaultOptions[name];
-
- if (kind) {
- if ((kind & defaultOption.kind) === 0) {
- continue;
- }
-
- if (kind === OptionKind.PREFERENCE) {
- const value = defaultOption.value,
- valueType = typeof value;
-
- if (valueType === "boolean" || valueType === "string" || valueType === "number" && Number.isInteger(value)) {
- options[name] = value;
- continue;
- }
-
- throw new Error(`Invalid type for preference: ${name}`);
- }
- }
-
- const userOption = userOptions[name];
- options[name] = userOption !== undefined ? userOption : defaultOption.compatibility ?? defaultOption.value;
- }
-
- return options;
- }
-
- static set(name, value) {
- userOptions[name] = value;
- }
-
- static setAll(options) {
- for (const name in options) {
- userOptions[name] = options[name];
- }
- }
-
- static remove(name) {
- delete userOptions[name];
- }
-
-}
-
-exports.AppOptions = AppOptions;
-
-/***/ }),
-/* 2 */
-/***/ ((__unused_webpack_module, exports) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.viewerCompatibilityParams = void 0;
-const compatibilityParams = Object.create(null);
-{
- const userAgent = typeof navigator !== "undefined" && navigator.userAgent || "";
- const platform = typeof navigator !== "undefined" && navigator.platform || "";
- const maxTouchPoints = typeof navigator !== "undefined" && navigator.maxTouchPoints || 1;
- const isAndroid = /Android/.test(userAgent);
- const isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === "MacIntel" && maxTouchPoints > 1;
- const isIOSChrome = /CriOS/.test(userAgent);
-
- (function checkOnBlobSupport() {
- if (isIOSChrome) {
- compatibilityParams.disableCreateObjectURL = true;
- }
- })();
-
- (function checkCanvasSizeLimitation() {
- if (isIOS || isAndroid) {
- compatibilityParams.maxCanvasPixels = 5242880;
- }
- })();
-}
-const viewerCompatibilityParams = Object.freeze(compatibilityParams);
-exports.viewerCompatibilityParams = viewerCompatibilityParams;
-
-/***/ }),
-/* 3 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFViewerApplication = exports.PDFPrintServiceFactory = exports.DefaultExternalServices = void 0;
-
-var _ui_utils = __webpack_require__(4);
-
-var _app_options = __webpack_require__(1);
-
-var _pdfjsLib = __webpack_require__(5);
-
-var _pdf_cursor_tools = __webpack_require__(6);
-
-var _pdf_rendering_queue = __webpack_require__(8);
-
-var _overlay_manager = __webpack_require__(9);
-
-var _password_prompt = __webpack_require__(10);
-
-var _pdf_attachment_viewer = __webpack_require__(11);
-
-var _pdf_document_properties = __webpack_require__(13);
-
-var _pdf_find_bar = __webpack_require__(14);
-
-var _pdf_find_controller = __webpack_require__(15);
-
-var _pdf_history = __webpack_require__(17);
-
-var _pdf_layer_viewer = __webpack_require__(18);
-
-var _pdf_link_service = __webpack_require__(19);
-
-var _pdf_outline_viewer = __webpack_require__(20);
-
-var _pdf_presentation_mode = __webpack_require__(21);
-
-var _pdf_scripting_manager = __webpack_require__(22);
-
-var _pdf_sidebar = __webpack_require__(23);
-
-var _pdf_sidebar_resizer = __webpack_require__(24);
-
-var _pdf_thumbnail_viewer = __webpack_require__(25);
-
-var _pdf_viewer = __webpack_require__(27);
-
-var _secondary_toolbar = __webpack_require__(35);
-
-var _toolbar = __webpack_require__(37);
-
-var _viewer_compatibility = __webpack_require__(2);
-
-var _view_history = __webpack_require__(38);
-
-const DEFAULT_SCALE_DELTA = 1.1;
-const DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000;
-const FORCE_PAGES_LOADED_TIMEOUT = 10000;
-const WHEEL_ZOOM_DISABLED_TIMEOUT = 1000;
-const ENABLE_PERMISSIONS_CLASS = "enablePermissions";
-const ViewOnLoad = {
- UNKNOWN: -1,
- PREVIOUS: 0,
- INITIAL: 1
-};
-const ViewerCssTheme = {
- AUTOMATIC: 0,
- LIGHT: 1,
- DARK: 2
-};
-const KNOWN_VERSIONS = ["1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "2.0", "2.1", "2.2", "2.3"];
-const KNOWN_GENERATORS = ["acrobat distiller", "acrobat pdfwriter", "adobe livecycle", "adobe pdf library", "adobe photoshop", "ghostscript", "tcpdf", "cairo", "dvipdfm", "dvips", "pdftex", "pdfkit", "itext", "prince", "quarkxpress", "mac os x", "microsoft", "openoffice", "oracle", "luradocument", "pdf-xchange", "antenna house", "aspose.cells", "fpdf"];
-
-class DefaultExternalServices {
- constructor() {
- throw new Error("Cannot initialize DefaultExternalServices.");
- }
-
- static updateFindControlState(data) {}
-
- static updateFindMatchesCount(data) {}
-
- static initPassiveLoading(callbacks) {}
-
- static async fallback(data) {}
-
- static reportTelemetry(data) {}
-
- static createDownloadManager(options) {
- throw new Error("Not implemented: createDownloadManager");
- }
-
- static createPreferences() {
- throw new Error("Not implemented: createPreferences");
- }
-
- static createL10n(options) {
- throw new Error("Not implemented: createL10n");
- }
-
- static createScripting(options) {
- throw new Error("Not implemented: createScripting");
- }
-
- static get supportsIntegratedFind() {
- return (0, _pdfjsLib.shadow)(this, "supportsIntegratedFind", false);
- }
-
- static get supportsDocumentFonts() {
- return (0, _pdfjsLib.shadow)(this, "supportsDocumentFonts", true);
- }
-
- static get supportedMouseWheelZoomModifierKeys() {
- return (0, _pdfjsLib.shadow)(this, "supportedMouseWheelZoomModifierKeys", {
- ctrlKey: true,
- metaKey: true
- });
- }
-
- static get isInAutomation() {
- return (0, _pdfjsLib.shadow)(this, "isInAutomation", false);
- }
-
-}
-
-exports.DefaultExternalServices = DefaultExternalServices;
-const PDFViewerApplication = {
- initialBookmark: document.location.hash.substring(1),
- _initializedCapability: (0, _pdfjsLib.createPromiseCapability)(),
- _fellback: false,
- appConfig: null,
- pdfDocument: null,
- pdfLoadingTask: null,
- printService: null,
- pdfViewer: null,
- pdfThumbnailViewer: null,
- pdfRenderingQueue: null,
- pdfPresentationMode: null,
- pdfDocumentProperties: null,
- pdfLinkService: null,
- pdfHistory: null,
- pdfSidebar: null,
- pdfSidebarResizer: null,
- pdfOutlineViewer: null,
- pdfAttachmentViewer: null,
- pdfLayerViewer: null,
- pdfCursorTools: null,
- pdfScriptingManager: null,
- store: null,
- downloadManager: null,
- overlayManager: null,
- preferences: null,
- toolbar: null,
- secondaryToolbar: null,
- eventBus: null,
- l10n: null,
- isInitialViewSet: false,
- downloadComplete: false,
- isViewerEmbedded: window.parent !== window,
- url: "",
- baseUrl: "",
- externalServices: DefaultExternalServices,
- _boundEvents: Object.create(null),
- documentInfo: null,
- metadata: null,
- _contentDispositionFilename: null,
- _contentLength: null,
- _saveInProgress: false,
- _wheelUnusedTicks: 0,
- _idleCallbacks: new Set(),
-
- async initialize(appConfig) {
- this.preferences = this.externalServices.createPreferences();
- this.appConfig = appConfig;
- await this._readPreferences();
- await this._parseHashParameters();
-
- this._forceCssTheme();
-
- await this._initializeL10n();
-
- if (this.isViewerEmbedded && _app_options.AppOptions.get("externalLinkTarget") === _pdfjsLib.LinkTarget.NONE) {
- _app_options.AppOptions.set("externalLinkTarget", _pdfjsLib.LinkTarget.TOP);
- }
-
- await this._initializeViewerComponents();
- this.bindEvents();
- this.bindWindowEvents();
- const appContainer = appConfig.appContainer || document.documentElement;
- this.l10n.translate(appContainer).then(() => {
- this.eventBus.dispatch("localized", {
- source: this
- });
- });
-
- this._initializedCapability.resolve();
- },
-
- async _readPreferences() {
- if (_app_options.AppOptions.get("disablePreferences")) {
- return;
- }
-
- try {
- _app_options.AppOptions.setAll(await this.preferences.getAll());
- } catch (reason) {
- console.error(`_readPreferences: "${reason?.message}".`);
- }
- },
-
- async _parseHashParameters() {
- if (!_app_options.AppOptions.get("pdfBugEnabled")) {
- return undefined;
- }
-
- const hash = document.location.hash.substring(1);
-
- if (!hash) {
- return undefined;
- }
-
- const hashParams = (0, _ui_utils.parseQueryString)(hash),
- waitOn = [];
-
- if ("disableworker" in hashParams && hashParams.disableworker === "true") {
- waitOn.push(loadFakeWorker());
- }
-
- if ("disablerange" in hashParams) {
- _app_options.AppOptions.set("disableRange", hashParams.disablerange === "true");
- }
-
- if ("disablestream" in hashParams) {
- _app_options.AppOptions.set("disableStream", hashParams.disablestream === "true");
- }
-
- if ("disableautofetch" in hashParams) {
- _app_options.AppOptions.set("disableAutoFetch", hashParams.disableautofetch === "true");
- }
-
- if ("disablefontface" in hashParams) {
- _app_options.AppOptions.set("disableFontFace", hashParams.disablefontface === "true");
- }
-
- if ("disablehistory" in hashParams) {
- _app_options.AppOptions.set("disableHistory", hashParams.disablehistory === "true");
- }
-
- if ("verbosity" in hashParams) {
- _app_options.AppOptions.set("verbosity", hashParams.verbosity | 0);
- }
-
- if ("textlayer" in hashParams) {
- switch (hashParams.textlayer) {
- case "off":
- _app_options.AppOptions.set("textLayerMode", _ui_utils.TextLayerMode.DISABLE);
-
- break;
-
- case "visible":
- case "shadow":
- case "hover":
- const viewer = this.appConfig.viewerContainer;
- viewer.classList.add("textLayer-" + hashParams.textlayer);
- break;
- }
- }
-
- if ("pdfbug" in hashParams) {
- _app_options.AppOptions.set("pdfBug", true);
-
- _app_options.AppOptions.set("fontExtraProperties", true);
-
- const enabled = hashParams.pdfbug.split(",");
- waitOn.push(loadAndEnablePDFBug(enabled));
- }
-
- if ("locale" in hashParams) {
- _app_options.AppOptions.set("locale", hashParams.locale);
- }
-
- if (waitOn.length === 0) {
- return undefined;
- }
-
- return Promise.all(waitOn).catch(reason => {
- console.error(`_parseHashParameters: "${reason.message}".`);
- });
- },
-
- async _initializeL10n() {
- this.l10n = this.externalServices.createL10n({
- locale: _app_options.AppOptions.get("locale")
- });
- const dir = await this.l10n.getDirection();
- document.getElementsByTagName("html")[0].dir = dir;
- },
-
- _forceCssTheme() {
- const cssTheme = _app_options.AppOptions.get("viewerCssTheme");
-
- if (cssTheme === ViewerCssTheme.AUTOMATIC || !Object.values(ViewerCssTheme).includes(cssTheme)) {
- return;
- }
-
- try {
- const styleSheet = document.styleSheets[0];
- const cssRules = styleSheet?.cssRules || [];
- const mediaMatcher = "prefers-color-scheme";
- const mediaRule = `(${mediaMatcher}: dark)`;
- const mediaRegex = new RegExp(`^@media \\(${mediaMatcher}: dark\\) {\\n\\s*([\\w\\s-.,:;/\\\\{}()]+)\\n}$`);
-
- for (let i = 0, ii = cssRules.length; i < ii; i++) {
- const rule = cssRules[i];
-
- if (rule instanceof CSSMediaRule && rule.media?.[0] === mediaRule) {
- if (cssTheme === ViewerCssTheme.LIGHT) {
- styleSheet.deleteRule(i);
- return;
- }
-
- const darkRules = mediaRegex.exec(rule.cssText);
-
- if (darkRules?.[1]) {
- styleSheet.deleteRule(i);
- styleSheet.insertRule(darkRules[1], i);
- }
-
- return;
- }
- }
- } catch (reason) {
- console.error(`_forceCssTheme: "${reason?.message}".`);
- }
- },
-
- async _initializeViewerComponents() {
- const appConfig = this.appConfig;
- const eventBus = appConfig.eventBus || new _ui_utils.EventBus({
- isInAutomation: this.externalServices.isInAutomation
- });
- this.eventBus = eventBus;
- this.overlayManager = new _overlay_manager.OverlayManager();
- const pdfRenderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();
- pdfRenderingQueue.onIdle = this._cleanup.bind(this);
- this.pdfRenderingQueue = pdfRenderingQueue;
- const pdfLinkService = new _pdf_link_service.PDFLinkService({
- eventBus,
- externalLinkTarget: _app_options.AppOptions.get("externalLinkTarget"),
- externalLinkRel: _app_options.AppOptions.get("externalLinkRel"),
- ignoreDestinationZoom: _app_options.AppOptions.get("ignoreDestinationZoom")
- });
- this.pdfLinkService = pdfLinkService;
- const downloadManager = this.externalServices.createDownloadManager();
- this.downloadManager = downloadManager;
- const findController = new _pdf_find_controller.PDFFindController({
- linkService: pdfLinkService,
- eventBus
- });
- this.findController = findController;
- const pdfScriptingManager = new _pdf_scripting_manager.PDFScriptingManager({
- eventBus,
- sandboxBundleSrc: _app_options.AppOptions.get("sandboxBundleSrc"),
- scriptingFactory: this.externalServices,
- docPropertiesLookup: this._scriptingDocProperties.bind(this)
- });
- this.pdfScriptingManager = pdfScriptingManager;
- const container = appConfig.mainContainer;
- const viewer = appConfig.viewerContainer;
- this.pdfViewer = new _pdf_viewer.PDFViewer({
- container,
- viewer,
- eventBus,
- renderingQueue: pdfRenderingQueue,
- linkService: pdfLinkService,
- downloadManager,
- findController,
- scriptingManager: pdfScriptingManager,
- renderer: _app_options.AppOptions.get("renderer"),
- l10n: this.l10n,
- textLayerMode: _app_options.AppOptions.get("textLayerMode"),
- imageResourcesPath: _app_options.AppOptions.get("imageResourcesPath"),
- renderInteractiveForms: _app_options.AppOptions.get("renderInteractiveForms"),
- enablePrintAutoRotate: _app_options.AppOptions.get("enablePrintAutoRotate"),
- useOnlyCssZoom: _app_options.AppOptions.get("useOnlyCssZoom"),
- maxCanvasPixels: _app_options.AppOptions.get("maxCanvasPixels"),
- enableScripting: _app_options.AppOptions.get("enableScripting")
- });
- pdfRenderingQueue.setViewer(this.pdfViewer);
- pdfLinkService.setViewer(this.pdfViewer);
- pdfScriptingManager.setViewer(this.pdfViewer);
- this.pdfThumbnailViewer = new _pdf_thumbnail_viewer.PDFThumbnailViewer({
- container: appConfig.sidebar.thumbnailView,
- eventBus,
- renderingQueue: pdfRenderingQueue,
- linkService: pdfLinkService,
- l10n: this.l10n
- });
- pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);
- this.pdfHistory = new _pdf_history.PDFHistory({
- linkService: pdfLinkService,
- eventBus
- });
- pdfLinkService.setHistory(this.pdfHistory);
-
- if (!this.supportsIntegratedFind) {
- this.findBar = new _pdf_find_bar.PDFFindBar(appConfig.findBar, eventBus, this.l10n);
- }
-
- this.pdfDocumentProperties = new _pdf_document_properties.PDFDocumentProperties(appConfig.documentProperties, this.overlayManager, eventBus, this.l10n);
- this.pdfCursorTools = new _pdf_cursor_tools.PDFCursorTools({
- container,
- eventBus,
- cursorToolOnLoad: _app_options.AppOptions.get("cursorToolOnLoad")
- });
- this.toolbar = new _toolbar.Toolbar(appConfig.toolbar, eventBus, this.l10n);
- this.secondaryToolbar = new _secondary_toolbar.SecondaryToolbar(appConfig.secondaryToolbar, container, eventBus);
-
- if (this.supportsFullscreen) {
- this.pdfPresentationMode = new _pdf_presentation_mode.PDFPresentationMode({
- container,
- pdfViewer: this.pdfViewer,
- eventBus
- });
- }
-
- this.passwordPrompt = new _password_prompt.PasswordPrompt(appConfig.passwordOverlay, this.overlayManager, this.l10n, this.isViewerEmbedded);
- this.pdfOutlineViewer = new _pdf_outline_viewer.PDFOutlineViewer({
- container: appConfig.sidebar.outlineView,
- eventBus,
- linkService: pdfLinkService
- });
- this.pdfAttachmentViewer = new _pdf_attachment_viewer.PDFAttachmentViewer({
- container: appConfig.sidebar.attachmentsView,
- eventBus,
- downloadManager
- });
- this.pdfLayerViewer = new _pdf_layer_viewer.PDFLayerViewer({
- container: appConfig.sidebar.layersView,
- eventBus,
- l10n: this.l10n
- });
- this.pdfSidebar = new _pdf_sidebar.PDFSidebar({
- elements: appConfig.sidebar,
- pdfViewer: this.pdfViewer,
- pdfThumbnailViewer: this.pdfThumbnailViewer,
- eventBus,
- l10n: this.l10n
- });
- this.pdfSidebar.onToggled = this.forceRendering.bind(this);
- this.pdfSidebarResizer = new _pdf_sidebar_resizer.PDFSidebarResizer(appConfig.sidebarResizer, eventBus, this.l10n);
- },
-
- run(config) {
- this.initialize(config).then(webViewerInitialized);
- },
-
- get initialized() {
- return this._initializedCapability.settled;
- },
-
- get initializedPromise() {
- return this._initializedCapability.promise;
- },
-
- zoomIn(ticks) {
- if (this.pdfViewer.isInPresentationMode) {
- return;
- }
-
- let newScale = this.pdfViewer.currentScale;
-
- do {
- newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);
- newScale = Math.ceil(newScale * 10) / 10;
- newScale = Math.min(_ui_utils.MAX_SCALE, newScale);
- } while (--ticks > 0 && newScale < _ui_utils.MAX_SCALE);
-
- this.pdfViewer.currentScaleValue = newScale;
- },
-
- zoomOut(ticks) {
- if (this.pdfViewer.isInPresentationMode) {
- return;
- }
-
- let newScale = this.pdfViewer.currentScale;
-
- do {
- newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);
- newScale = Math.floor(newScale * 10) / 10;
- newScale = Math.max(_ui_utils.MIN_SCALE, newScale);
- } while (--ticks > 0 && newScale > _ui_utils.MIN_SCALE);
-
- this.pdfViewer.currentScaleValue = newScale;
- },
-
- zoomReset() {
- if (this.pdfViewer.isInPresentationMode) {
- return;
- }
-
- this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;
- },
-
- get pagesCount() {
- return this.pdfDocument ? this.pdfDocument.numPages : 0;
- },
-
- get page() {
- return this.pdfViewer.currentPageNumber;
- },
-
- set page(val) {
- this.pdfViewer.currentPageNumber = val;
- },
-
- get supportsPrinting() {
- return PDFPrintServiceFactory.instance.supportsPrinting;
- },
-
- get supportsFullscreen() {
- const doc = document.documentElement;
- let support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || doc.webkitRequestFullScreen);
-
- if (document.fullscreenEnabled === false || document.mozFullScreenEnabled === false || document.webkitFullscreenEnabled === false) {
- support = false;
- }
-
- return (0, _pdfjsLib.shadow)(this, "supportsFullscreen", support);
- },
-
- get supportsIntegratedFind() {
- return this.externalServices.supportsIntegratedFind;
- },
-
- get supportsDocumentFonts() {
- return this.externalServices.supportsDocumentFonts;
- },
-
- get loadingBar() {
- const bar = new _ui_utils.ProgressBar("#loadingBar");
- return (0, _pdfjsLib.shadow)(this, "loadingBar", bar);
- },
-
- get supportedMouseWheelZoomModifierKeys() {
- return this.externalServices.supportedMouseWheelZoomModifierKeys;
- },
-
- initPassiveLoading() {
- throw new Error("Not implemented: initPassiveLoading");
- },
-
- setTitleUsingUrl(url = "") {
- this.url = url;
- this.baseUrl = url.split("#")[0];
- let title = (0, _pdfjsLib.getPdfFilenameFromUrl)(url, "");
-
- if (!title) {
- try {
- title = decodeURIComponent((0, _pdfjsLib.getFilenameFromUrl)(url)) || url;
- } catch (ex) {
- title = url;
- }
- }
-
- this.setTitle(title);
- },
-
- setTitle(title) {
- if (this.isViewerEmbedded) {
- return;
- }
-
- document.title = title;
- },
-
- get _docFilename() {
- return this._contentDispositionFilename || (0, _pdfjsLib.getPdfFilenameFromUrl)(this.url);
- },
-
- _cancelIdleCallbacks() {
- if (!this._idleCallbacks.size) {
- return;
- }
-
- for (const callback of this._idleCallbacks) {
- window.cancelIdleCallback(callback);
- }
-
- this._idleCallbacks.clear();
- },
-
- async close() {
- this._unblockDocumentLoadEvent();
-
- const {
- container
- } = this.appConfig.errorWrapper;
- container.hidden = true;
-
- if (!this.pdfLoadingTask) {
- return;
- }
-
- if (this.pdfDocument?.annotationStorage.size > 0 && this._annotationStorageModified) {
- try {
- await this.save({
- sourceEventType: "save"
- });
- } catch (reason) {}
- }
-
- const promises = [];
- promises.push(this.pdfLoadingTask.destroy());
- this.pdfLoadingTask = null;
-
- if (this.pdfDocument) {
- this.pdfDocument = null;
- this.pdfThumbnailViewer.setDocument(null);
- this.pdfViewer.setDocument(null);
- this.pdfLinkService.setDocument(null);
- this.pdfDocumentProperties.setDocument(null);
- }
-
- webViewerResetPermissions();
- this.pdfLinkService.externalLinkEnabled = true;
- this._fellback = false;
- this.store = null;
- this.isInitialViewSet = false;
- this.downloadComplete = false;
- this.url = "";
- this.baseUrl = "";
- this.documentInfo = null;
- this.metadata = null;
- this._contentDispositionFilename = null;
- this._contentLength = null;
- this._saveInProgress = false;
-
- this._cancelIdleCallbacks();
-
- promises.push(this.pdfScriptingManager.destroyPromise);
- this.pdfSidebar.reset();
- this.pdfOutlineViewer.reset();
- this.pdfAttachmentViewer.reset();
- this.pdfLayerViewer.reset();
-
- if (this.pdfHistory) {
- this.pdfHistory.reset();
- }
-
- if (this.findBar) {
- this.findBar.reset();
- }
-
- this.toolbar.reset();
- this.secondaryToolbar.reset();
-
- if (typeof PDFBug !== "undefined") {
- PDFBug.cleanup();
- }
-
- await Promise.all(promises);
- },
-
- async open(file, args) {
- if (this.pdfLoadingTask) {
- await this.close();
- }
-
- const workerParameters = _app_options.AppOptions.getAll(_app_options.OptionKind.WORKER);
-
- for (const key in workerParameters) {
- _pdfjsLib.GlobalWorkerOptions[key] = workerParameters[key];
- }
-
- const parameters = Object.create(null);
-
- if (typeof file === "string") {
- this.setTitleUsingUrl(file);
- parameters.url = file;
- } else if (file && "byteLength" in file) {
- parameters.data = file;
- } else if (file.url && file.originalUrl) {
- this.setTitleUsingUrl(file.originalUrl);
- parameters.url = file.url;
- }
-
- const apiParameters = _app_options.AppOptions.getAll(_app_options.OptionKind.API);
-
- for (const key in apiParameters) {
- let value = apiParameters[key];
-
- if (key === "docBaseUrl" && !value) {}
-
- parameters[key] = value;
- }
-
- if (args) {
- for (const key in args) {
- parameters[key] = args[key];
- }
- }
-
- const loadingTask = (0, _pdfjsLib.getDocument)(parameters);
- this.pdfLoadingTask = loadingTask;
-
- loadingTask.onPassword = (updateCallback, reason) => {
- this.pdfLinkService.externalLinkEnabled = false;
- this.passwordPrompt.setUpdateCallback(updateCallback, reason);
- this.passwordPrompt.open();
- };
-
- loadingTask.onProgress = ({
- loaded,
- total
- }) => {
- this.progress(loaded / total);
- };
-
- loadingTask.onUnsupportedFeature = this.fallback.bind(this);
- return loadingTask.promise.then(pdfDocument => {
- this.load(pdfDocument);
- }, exception => {
- if (loadingTask !== this.pdfLoadingTask) {
- return undefined;
- }
-
- let key = "loading_error";
-
- if (exception instanceof _pdfjsLib.InvalidPDFException) {
- key = "invalid_file_error";
- } else if (exception instanceof _pdfjsLib.MissingPDFException) {
- key = "missing_file_error";
- } else if (exception instanceof _pdfjsLib.UnexpectedResponseException) {
- key = "unexpected_response_error";
- }
-
- return this.l10n.get(key).then(msg => {
- this._documentError(msg, {
- message: exception?.message
- });
-
- throw exception;
- });
- });
- },
-
- _ensureDownloadComplete() {
- if (this.pdfDocument && this.downloadComplete) {
- return;
- }
-
- throw new Error("PDF document not downloaded.");
- },
-
- async download({
- sourceEventType = "download"
- } = {}) {
- const url = this.baseUrl,
- filename = this._docFilename;
-
- try {
- this._ensureDownloadComplete();
-
- const data = await this.pdfDocument.getData();
- const blob = new Blob([data], {
- type: "application/pdf"
- });
- await this.downloadManager.download(blob, url, filename, sourceEventType);
- } catch (reason) {
- await this.downloadManager.downloadUrl(url, filename);
- }
- },
-
- async save({
- sourceEventType = "download"
- } = {}) {
- if (this._saveInProgress) {
- return;
- }
-
- this._saveInProgress = true;
- await this.pdfScriptingManager.dispatchWillSave();
- const url = this.baseUrl,
- filename = this._docFilename;
-
- try {
- this._ensureDownloadComplete();
-
- const data = await this.pdfDocument.saveDocument();
- const blob = new Blob([data], {
- type: "application/pdf"
- });
- await this.downloadManager.download(blob, url, filename, sourceEventType);
- } catch (reason) {
- await this.download({
- sourceEventType
- });
- } finally {
- await this.pdfScriptingManager.dispatchDidSave();
- this._saveInProgress = false;
- }
- },
-
- downloadOrSave(options) {
- if (this.pdfDocument?.annotationStorage.size > 0) {
- this.save(options);
- } else {
- this.download(options);
- }
- },
-
- fallback(featureId) {
- this.externalServices.reportTelemetry({
- type: "unsupportedFeature",
- featureId
- });
-
- if (this._fellback) {
- return;
- }
-
- this._fellback = true;
- this.externalServices.fallback({
- featureId,
- url: this.baseUrl
- }).then(download => {
- if (!download) {
- return;
- }
-
- this.download({
- sourceEventType: "download"
- });
- });
- },
-
- _documentError(message, moreInfo = null) {
- this._unblockDocumentLoadEvent();
-
- this._otherError(message, moreInfo);
- },
-
- _otherError(message, moreInfo = null) {
- const moreInfoText = [this.l10n.get("error_version_info", {
- version: _pdfjsLib.version || "?",
- build: _pdfjsLib.build || "?"
- })];
-
- if (moreInfo) {
- moreInfoText.push(this.l10n.get("error_message", {
- message: moreInfo.message
- }));
-
- if (moreInfo.stack) {
- moreInfoText.push(this.l10n.get("error_stack", {
- stack: moreInfo.stack
- }));
- } else {
- if (moreInfo.filename) {
- moreInfoText.push(this.l10n.get("error_file", {
- file: moreInfo.filename
- }));
- }
-
- if (moreInfo.lineNumber) {
- moreInfoText.push(this.l10n.get("error_line", {
- line: moreInfo.lineNumber
- }));
- }
- }
- }
-
- const errorWrapperConfig = this.appConfig.errorWrapper;
- const errorWrapper = errorWrapperConfig.container;
- errorWrapper.hidden = false;
- const errorMessage = errorWrapperConfig.errorMessage;
- errorMessage.textContent = message;
- const closeButton = errorWrapperConfig.closeButton;
-
- closeButton.onclick = function () {
- errorWrapper.hidden = true;
- };
-
- const errorMoreInfo = errorWrapperConfig.errorMoreInfo;
- const moreInfoButton = errorWrapperConfig.moreInfoButton;
- const lessInfoButton = errorWrapperConfig.lessInfoButton;
-
- moreInfoButton.onclick = function () {
- errorMoreInfo.hidden = false;
- moreInfoButton.hidden = true;
- lessInfoButton.hidden = false;
- errorMoreInfo.style.height = errorMoreInfo.scrollHeight + "px";
- };
-
- lessInfoButton.onclick = function () {
- errorMoreInfo.hidden = true;
- moreInfoButton.hidden = false;
- lessInfoButton.hidden = true;
- };
-
- moreInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;
- lessInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;
- closeButton.oncontextmenu = _ui_utils.noContextMenuHandler;
- moreInfoButton.hidden = false;
- lessInfoButton.hidden = true;
- Promise.all(moreInfoText).then(parts => {
- errorMoreInfo.value = parts.join("\n");
- });
- },
-
- progress(level) {
- if (this.downloadComplete) {
- return;
- }
-
- const percent = Math.round(level * 100);
-
- if (percent > this.loadingBar.percent || isNaN(percent)) {
- this.loadingBar.percent = percent;
- const disableAutoFetch = this.pdfDocument ? this.pdfDocument.loadingParams.disableAutoFetch : _app_options.AppOptions.get("disableAutoFetch");
-
- if (disableAutoFetch && percent) {
- if (this.disableAutoFetchLoadingBarTimeout) {
- clearTimeout(this.disableAutoFetchLoadingBarTimeout);
- this.disableAutoFetchLoadingBarTimeout = null;
- }
-
- this.loadingBar.show();
- this.disableAutoFetchLoadingBarTimeout = setTimeout(() => {
- this.loadingBar.hide();
- this.disableAutoFetchLoadingBarTimeout = null;
- }, DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT);
- }
- }
- },
-
- load(pdfDocument) {
- this.pdfDocument = pdfDocument;
- pdfDocument.getDownloadInfo().then(({
- length
- }) => {
- this._contentLength = length;
- this.downloadComplete = true;
- this.loadingBar.hide();
- firstPagePromise.then(() => {
- this.eventBus.dispatch("documentloaded", {
- source: this
- });
- });
- });
- const pageLayoutPromise = pdfDocument.getPageLayout().catch(function () {});
- const pageModePromise = pdfDocument.getPageMode().catch(function () {});
- const openActionPromise = pdfDocument.getOpenAction().catch(function () {});
- this.toolbar.setPagesCount(pdfDocument.numPages, false);
- this.secondaryToolbar.setPagesCount(pdfDocument.numPages);
- let baseDocumentUrl;
- baseDocumentUrl = null;
- this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl);
- this.pdfDocumentProperties.setDocument(pdfDocument, this.url);
- const pdfViewer = this.pdfViewer;
- pdfViewer.setDocument(pdfDocument);
- const {
- firstPagePromise,
- onePageRendered,
- pagesPromise
- } = pdfViewer;
- const pdfThumbnailViewer = this.pdfThumbnailViewer;
- pdfThumbnailViewer.setDocument(pdfDocument);
- const storedPromise = (this.store = new _view_history.ViewHistory(pdfDocument.fingerprints[0])).getMultiple({
- page: null,
- zoom: _ui_utils.DEFAULT_SCALE_VALUE,
- scrollLeft: "0",
- scrollTop: "0",
- rotation: null,
- sidebarView: _ui_utils.SidebarView.UNKNOWN,
- scrollMode: _ui_utils.ScrollMode.UNKNOWN,
- spreadMode: _ui_utils.SpreadMode.UNKNOWN
- }).catch(() => {
- return Object.create(null);
- });
- firstPagePromise.then(pdfPage => {
- this.loadingBar.setWidth(this.appConfig.viewerContainer);
-
- this._initializeAnnotationStorageCallbacks(pdfDocument);
-
- Promise.all([_ui_utils.animationStarted, storedPromise, pageLayoutPromise, pageModePromise, openActionPromise]).then(async ([timeStamp, stored, pageLayout, pageMode, openAction]) => {
- const viewOnLoad = _app_options.AppOptions.get("viewOnLoad");
-
- this._initializePdfHistory({
- fingerprint: pdfDocument.fingerprints[0],
- viewOnLoad,
- initialDest: openAction?.dest
- });
-
- const initialBookmark = this.initialBookmark;
-
- const zoom = _app_options.AppOptions.get("defaultZoomValue");
-
- let hash = zoom ? `zoom=${zoom}` : null;
- let rotation = null;
-
- let sidebarView = _app_options.AppOptions.get("sidebarViewOnLoad");
-
- let scrollMode = _app_options.AppOptions.get("scrollModeOnLoad");
-
- let spreadMode = _app_options.AppOptions.get("spreadModeOnLoad");
-
- if (stored.page && viewOnLoad !== ViewOnLoad.INITIAL) {
- hash = `page=${stored.page}&zoom=${zoom || stored.zoom},` + `${stored.scrollLeft},${stored.scrollTop}`;
- rotation = parseInt(stored.rotation, 10);
-
- if (sidebarView === _ui_utils.SidebarView.UNKNOWN) {
- sidebarView = stored.sidebarView | 0;
- }
-
- if (scrollMode === _ui_utils.ScrollMode.UNKNOWN) {
- scrollMode = stored.scrollMode | 0;
- }
-
- if (spreadMode === _ui_utils.SpreadMode.UNKNOWN) {
- spreadMode = stored.spreadMode | 0;
- }
- }
-
- if (pageMode && sidebarView === _ui_utils.SidebarView.UNKNOWN) {
- sidebarView = (0, _ui_utils.apiPageModeToSidebarView)(pageMode);
- }
-
- if (pageLayout && spreadMode === _ui_utils.SpreadMode.UNKNOWN) {
- spreadMode = (0, _ui_utils.apiPageLayoutToSpreadMode)(pageLayout);
- }
-
- this.setInitialView(hash, {
- rotation,
- sidebarView,
- scrollMode,
- spreadMode
- });
- this.eventBus.dispatch("documentinit", {
- source: this
- });
-
- if (!this.isViewerEmbedded) {
- pdfViewer.focus();
- }
-
- this._initializePermissions(pdfDocument);
-
- await Promise.race([pagesPromise, new Promise(resolve => {
- setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT);
- })]);
-
- if (!initialBookmark && !hash) {
- return;
- }
-
- if (pdfViewer.hasEqualPageSizes) {
- return;
- }
-
- this.initialBookmark = initialBookmark;
- pdfViewer.currentScaleValue = pdfViewer.currentScaleValue;
- this.setInitialView(hash);
- }).catch(() => {
- this.setInitialView();
- }).then(function () {
- pdfViewer.update();
- });
- });
- pagesPromise.then(() => {
- this._unblockDocumentLoadEvent();
-
- this._initializeAutoPrint(pdfDocument, openActionPromise);
- });
- onePageRendered.then(() => {
- pdfDocument.getOutline().then(outline => {
- if (pdfDocument !== this.pdfDocument) {
- return;
- }
-
- this.pdfOutlineViewer.render({
- outline,
- pdfDocument
- });
- });
- pdfDocument.getAttachments().then(attachments => {
- if (pdfDocument !== this.pdfDocument) {
- return;
- }
-
- this.pdfAttachmentViewer.render({
- attachments
- });
- });
- pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => {
- if (pdfDocument !== this.pdfDocument) {
- return;
- }
-
- this.pdfLayerViewer.render({
- optionalContentConfig,
- pdfDocument
- });
- });
-
- if ("requestIdleCallback" in window) {
- const callback = window.requestIdleCallback(() => {
- this._collectTelemetry(pdfDocument);
-
- this._idleCallbacks.delete(callback);
- }, {
- timeout: 1000
- });
-
- this._idleCallbacks.add(callback);
- }
- });
-
- this._initializePageLabels(pdfDocument);
-
- this._initializeMetadata(pdfDocument);
- },
-
- async _scriptingDocProperties(pdfDocument) {
- if (!this.documentInfo) {
- await new Promise(resolve => {
- this.eventBus._on("metadataloaded", resolve, {
- once: true
- });
- });
-
- if (pdfDocument !== this.pdfDocument) {
- return null;
- }
- }
-
- if (!this._contentLength) {
- await new Promise(resolve => {
- this.eventBus._on("documentloaded", resolve, {
- once: true
- });
- });
-
- if (pdfDocument !== this.pdfDocument) {
- return null;
- }
- }
-
- return { ...this.documentInfo,
- baseURL: this.baseUrl,
- filesize: this._contentLength,
- filename: this._docFilename,
- metadata: this.metadata?.getRaw(),
- authors: this.metadata?.get("dc:creator"),
- numPages: this.pagesCount,
- URL: this.url
- };
- },
-
- async _collectTelemetry(pdfDocument) {
- const markInfo = await this.pdfDocument.getMarkInfo();
-
- if (pdfDocument !== this.pdfDocument) {
- return;
- }
-
- const tagged = markInfo?.Marked || false;
- this.externalServices.reportTelemetry({
- type: "tagged",
- tagged
- });
- },
-
- async _initializeAutoPrint(pdfDocument, openActionPromise) {
- const [openAction, javaScript] = await Promise.all([openActionPromise, !this.pdfViewer.enableScripting ? pdfDocument.getJavaScript() : null]);
-
- if (pdfDocument !== this.pdfDocument) {
- return;
- }
-
- let triggerAutoPrint = false;
-
- if (openAction?.action === "Print") {
- triggerAutoPrint = true;
- }
-
- if (javaScript) {
- javaScript.some(js => {
- if (!js) {
- return false;
- }
-
- console.warn("Warning: JavaScript support is not enabled");
- this.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.javaScript);
- return true;
- });
-
- if (!triggerAutoPrint) {
- for (const js of javaScript) {
- if (js && _ui_utils.AutoPrintRegExp.test(js)) {
- triggerAutoPrint = true;
- break;
- }
- }
- }
- }
-
- if (triggerAutoPrint) {
- this.triggerPrinting();
- }
- },
-
- async _initializeMetadata(pdfDocument) {
- const {
- info,
- metadata,
- contentDispositionFilename,
- contentLength
- } = await pdfDocument.getMetadata();
-
- if (pdfDocument !== this.pdfDocument) {
- return;
- }
-
- this.documentInfo = info;
- this.metadata = metadata;
- this._contentDispositionFilename ?? (this._contentDispositionFilename = contentDispositionFilename);
- this._contentLength ?? (this._contentLength = contentLength);
- console.log(`PDF ${pdfDocument.fingerprints[0]} [${info.PDFFormatVersion} ` + `${(info.Producer || "-").trim()} / ${(info.Creator || "-").trim()}] ` + `(PDF.js: ${_pdfjsLib.version || "-"})`);
- let pdfTitle = info?.Title;
- const metadataTitle = metadata?.get("dc:title");
-
- if (metadataTitle) {
- if (metadataTitle !== "Untitled" && !/[\uFFF0-\uFFFF]/g.test(metadataTitle)) {
- pdfTitle = metadataTitle;
- }
- }
-
- if (pdfTitle) {
- this.setTitle(`${pdfTitle} - ${contentDispositionFilename || document.title}`);
- } else if (contentDispositionFilename) {
- this.setTitle(contentDispositionFilename);
- }
-
- if (info.IsXFAPresent && !info.IsAcroFormPresent && !pdfDocument.isPureXfa) {
- console.warn("Warning: XFA support is not enabled");
- this.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.forms);
- } else if ((info.IsAcroFormPresent || info.IsXFAPresent) && !this.pdfViewer.renderInteractiveForms) {
- console.warn("Warning: Interactive form support is not enabled");
- this.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.forms);
- }
-
- if (info.IsSignaturesPresent) {
- console.warn("Warning: Digital signatures validation is not supported");
- this.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.signatures);
- }
-
- let versionId = "other";
-
- if (KNOWN_VERSIONS.includes(info.PDFFormatVersion)) {
- versionId = `v${info.PDFFormatVersion.replace(".", "_")}`;
- }
-
- let generatorId = "other";
-
- if (info.Producer) {
- const producer = info.Producer.toLowerCase();
- KNOWN_GENERATORS.some(function (generator) {
- if (!producer.includes(generator)) {
- return false;
- }
-
- generatorId = generator.replace(/[ .-]/g, "_");
- return true;
- });
- }
-
- let formType = null;
-
- if (info.IsXFAPresent) {
- formType = "xfa";
- } else if (info.IsAcroFormPresent) {
- formType = "acroform";
- }
-
- this.externalServices.reportTelemetry({
- type: "documentInfo",
- version: versionId,
- generator: generatorId,
- formType
- });
- this.eventBus.dispatch("metadataloaded", {
- source: this
- });
- },
-
- async _initializePageLabels(pdfDocument) {
- const labels = await pdfDocument.getPageLabels();
-
- if (pdfDocument !== this.pdfDocument) {
- return;
- }
-
- if (!labels || _app_options.AppOptions.get("disablePageLabels")) {
- return;
- }
-
- const numLabels = labels.length;
-
- if (numLabels !== this.pagesCount) {
- console.error("The number of Page Labels does not match the number of pages in the document.");
- return;
- }
-
- let i = 0;
-
- while (i < numLabels && labels[i] === (i + 1).toString()) {
- i++;
- }
-
- if (i === numLabels) {
- return;
- }
-
- const {
- pdfViewer,
- pdfThumbnailViewer,
- toolbar
- } = this;
- pdfViewer.setPageLabels(labels);
- pdfThumbnailViewer.setPageLabels(labels);
- toolbar.setPagesCount(numLabels, true);
- toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);
- },
-
- _initializePdfHistory({
- fingerprint,
- viewOnLoad,
- initialDest = null
- }) {
- if (this.isViewerEmbedded || _app_options.AppOptions.get("disableHistory")) {
- return;
- }
-
- this.pdfHistory.initialize({
- fingerprint,
- resetHistory: viewOnLoad === ViewOnLoad.INITIAL,
- updateUrl: _app_options.AppOptions.get("historyUpdateUrl")
- });
-
- if (this.pdfHistory.initialBookmark) {
- this.initialBookmark = this.pdfHistory.initialBookmark;
- this.initialRotation = this.pdfHistory.initialRotation;
- }
-
- if (initialDest && !this.initialBookmark && viewOnLoad === ViewOnLoad.UNKNOWN) {
- this.initialBookmark = JSON.stringify(initialDest);
- this.pdfHistory.push({
- explicitDest: initialDest,
- pageNumber: null
- });
- }
- },
-
- async _initializePermissions(pdfDocument) {
- const permissions = await pdfDocument.getPermissions();
-
- if (pdfDocument !== this.pdfDocument) {
- return;
- }
-
- if (!permissions || !_app_options.AppOptions.get("enablePermissions")) {
- return;
- }
-
- if (!permissions.includes(_pdfjsLib.PermissionFlag.COPY)) {
- this.appConfig.viewerContainer.classList.add(ENABLE_PERMISSIONS_CLASS);
- }
- },
-
- _initializeAnnotationStorageCallbacks(pdfDocument) {
- if (pdfDocument !== this.pdfDocument) {
- return;
- }
-
- const {
- annotationStorage
- } = pdfDocument;
-
- annotationStorage.onSetModified = () => {
- window.addEventListener("beforeunload", beforeUnload);
- this._annotationStorageModified = true;
- };
-
- annotationStorage.onResetModified = () => {
- window.removeEventListener("beforeunload", beforeUnload);
- delete this._annotationStorageModified;
- };
- },
-
- setInitialView(storedHash, {
- rotation,
- sidebarView,
- scrollMode,
- spreadMode
- } = {}) {
- const setRotation = angle => {
- if ((0, _ui_utils.isValidRotation)(angle)) {
- this.pdfViewer.pagesRotation = angle;
- }
- };
-
- const setViewerModes = (scroll, spread) => {
- if ((0, _ui_utils.isValidScrollMode)(scroll)) {
- this.pdfViewer.scrollMode = scroll;
- }
-
- if ((0, _ui_utils.isValidSpreadMode)(spread)) {
- this.pdfViewer.spreadMode = spread;
- }
- };
-
- this.isInitialViewSet = true;
- this.pdfSidebar.setInitialView(sidebarView);
- setViewerModes(scrollMode, spreadMode);
-
- if (this.initialBookmark) {
- setRotation(this.initialRotation);
- delete this.initialRotation;
- this.pdfLinkService.setHash(this.initialBookmark);
- this.initialBookmark = null;
- } else if (storedHash) {
- setRotation(rotation);
- this.pdfLinkService.setHash(storedHash);
- }
-
- this.toolbar.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel);
- this.secondaryToolbar.setPageNumber(this.pdfViewer.currentPageNumber);
-
- if (!this.pdfViewer.currentScaleValue) {
- this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;
- }
- },
-
- _cleanup() {
- if (!this.pdfDocument) {
- return;
- }
-
- this.pdfViewer.cleanup();
- this.pdfThumbnailViewer.cleanup();
- this.pdfDocument.cleanup(this.pdfViewer.renderer === _ui_utils.RendererType.SVG);
- },
-
- forceRendering() {
- this.pdfRenderingQueue.printing = !!this.printService;
- this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar.isThumbnailViewVisible;
- this.pdfRenderingQueue.renderHighestPriority();
- },
-
- beforePrint() {
- this.pdfScriptingManager.dispatchWillPrint();
-
- if (this.printService) {
- return;
- }
-
- if (!this.supportsPrinting) {
- this.l10n.get("printing_not_supported").then(msg => {
- this._otherError(msg);
- });
- return;
- }
-
- if (!this.pdfViewer.pageViewsReady) {
- this.l10n.get("printing_not_ready").then(msg => {
- window.alert(msg);
- });
- return;
- }
-
- const pagesOverview = this.pdfViewer.getPagesOverview();
- const printContainer = this.appConfig.printContainer;
-
- const printResolution = _app_options.AppOptions.get("printResolution");
-
- const optionalContentConfigPromise = this.pdfViewer.optionalContentConfigPromise;
- const printService = PDFPrintServiceFactory.instance.createPrintService(this.pdfDocument, pagesOverview, printContainer, printResolution, optionalContentConfigPromise, this.l10n);
- this.printService = printService;
- this.forceRendering();
- printService.layout();
- this.externalServices.reportTelemetry({
- type: "print"
- });
- },
-
- afterPrint() {
- this.pdfScriptingManager.dispatchDidPrint();
-
- if (this.printService) {
- this.printService.destroy();
- this.printService = null;
-
- if (this.pdfDocument) {
- this.pdfDocument.annotationStorage.resetModified();
- }
- }
-
- this.forceRendering();
- },
-
- rotatePages(delta) {
- this.pdfViewer.pagesRotation += delta;
- },
-
- requestPresentationMode() {
- if (!this.pdfPresentationMode) {
- return;
- }
-
- this.pdfPresentationMode.request();
- },
-
- triggerPrinting() {
- if (!this.supportsPrinting) {
- return;
- }
-
- window.print();
- },
-
- bindEvents() {
- const {
- eventBus,
- _boundEvents
- } = this;
- _boundEvents.beforePrint = this.beforePrint.bind(this);
- _boundEvents.afterPrint = this.afterPrint.bind(this);
-
- eventBus._on("resize", webViewerResize);
-
- eventBus._on("hashchange", webViewerHashchange);
-
- eventBus._on("beforeprint", _boundEvents.beforePrint);
-
- eventBus._on("afterprint", _boundEvents.afterPrint);
-
- eventBus._on("pagerendered", webViewerPageRendered);
-
- eventBus._on("updateviewarea", webViewerUpdateViewarea);
-
- eventBus._on("pagechanging", webViewerPageChanging);
-
- eventBus._on("scalechanging", webViewerScaleChanging);
-
- eventBus._on("rotationchanging", webViewerRotationChanging);
-
- eventBus._on("sidebarviewchanged", webViewerSidebarViewChanged);
-
- eventBus._on("pagemode", webViewerPageMode);
-
- eventBus._on("namedaction", webViewerNamedAction);
-
- eventBus._on("presentationmodechanged", webViewerPresentationModeChanged);
-
- eventBus._on("presentationmode", webViewerPresentationMode);
-
- eventBus._on("print", webViewerPrint);
-
- eventBus._on("download", webViewerDownload);
-
- eventBus._on("save", webViewerSave);
-
- eventBus._on("firstpage", webViewerFirstPage);
-
- eventBus._on("lastpage", webViewerLastPage);
-
- eventBus._on("nextpage", webViewerNextPage);
-
- eventBus._on("previouspage", webViewerPreviousPage);
-
- eventBus._on("zoomin", webViewerZoomIn);
-
- eventBus._on("zoomout", webViewerZoomOut);
-
- eventBus._on("zoomreset", webViewerZoomReset);
-
- eventBus._on("pagenumberchanged", webViewerPageNumberChanged);
-
- eventBus._on("scalechanged", webViewerScaleChanged);
-
- eventBus._on("rotatecw", webViewerRotateCw);
-
- eventBus._on("rotateccw", webViewerRotateCcw);
-
- eventBus._on("optionalcontentconfig", webViewerOptionalContentConfig);
-
- eventBus._on("switchscrollmode", webViewerSwitchScrollMode);
-
- eventBus._on("scrollmodechanged", webViewerScrollModeChanged);
-
- eventBus._on("switchspreadmode", webViewerSwitchSpreadMode);
-
- eventBus._on("spreadmodechanged", webViewerSpreadModeChanged);
-
- eventBus._on("documentproperties", webViewerDocumentProperties);
-
- eventBus._on("find", webViewerFind);
-
- eventBus._on("findfromurlhash", webViewerFindFromUrlHash);
-
- eventBus._on("updatefindmatchescount", webViewerUpdateFindMatchesCount);
-
- eventBus._on("updatefindcontrolstate", webViewerUpdateFindControlState);
-
- if (_app_options.AppOptions.get("pdfBug")) {
- _boundEvents.reportPageStatsPDFBug = reportPageStatsPDFBug;
-
- eventBus._on("pagerendered", _boundEvents.reportPageStatsPDFBug);
-
- eventBus._on("pagechanging", _boundEvents.reportPageStatsPDFBug);
- }
-
- eventBus._on("fileinputchange", webViewerFileInputChange);
-
- eventBus._on("openfile", webViewerOpenFile);
- },
-
- bindWindowEvents() {
- const {
- eventBus,
- _boundEvents
- } = this;
-
- _boundEvents.windowResize = () => {
- eventBus.dispatch("resize", {
- source: window
- });
- };
-
- _boundEvents.windowHashChange = () => {
- eventBus.dispatch("hashchange", {
- source: window,
- hash: document.location.hash.substring(1)
- });
- };
-
- _boundEvents.windowBeforePrint = () => {
- eventBus.dispatch("beforeprint", {
- source: window
- });
- };
-
- _boundEvents.windowAfterPrint = () => {
- eventBus.dispatch("afterprint", {
- source: window
- });
- };
-
- _boundEvents.windowUpdateFromSandbox = event => {
- eventBus.dispatch("updatefromsandbox", {
- source: window,
- detail: event.detail
- });
- };
-
- window.addEventListener("visibilitychange", webViewerVisibilityChange);
- window.addEventListener("wheel", webViewerWheel, {
- passive: false
- });
- window.addEventListener("touchstart", webViewerTouchStart, {
- passive: false
- });
- window.addEventListener("click", webViewerClick);
- window.addEventListener("keydown", webViewerKeyDown);
- window.addEventListener("resize", _boundEvents.windowResize);
- window.addEventListener("hashchange", _boundEvents.windowHashChange);
- window.addEventListener("beforeprint", _boundEvents.windowBeforePrint);
- window.addEventListener("afterprint", _boundEvents.windowAfterPrint);
- window.addEventListener("updatefromsandbox", _boundEvents.windowUpdateFromSandbox);
- },
-
- unbindEvents() {
- const {
- eventBus,
- _boundEvents
- } = this;
-
- eventBus._off("resize", webViewerResize);
-
- eventBus._off("hashchange", webViewerHashchange);
-
- eventBus._off("beforeprint", _boundEvents.beforePrint);
-
- eventBus._off("afterprint", _boundEvents.afterPrint);
-
- eventBus._off("pagerendered", webViewerPageRendered);
-
- eventBus._off("updateviewarea", webViewerUpdateViewarea);
-
- eventBus._off("pagechanging", webViewerPageChanging);
-
- eventBus._off("scalechanging", webViewerScaleChanging);
-
- eventBus._off("rotationchanging", webViewerRotationChanging);
-
- eventBus._off("sidebarviewchanged", webViewerSidebarViewChanged);
-
- eventBus._off("pagemode", webViewerPageMode);
-
- eventBus._off("namedaction", webViewerNamedAction);
-
- eventBus._off("presentationmodechanged", webViewerPresentationModeChanged);
-
- eventBus._off("presentationmode", webViewerPresentationMode);
-
- eventBus._off("print", webViewerPrint);
-
- eventBus._off("download", webViewerDownload);
-
- eventBus._off("save", webViewerSave);
-
- eventBus._off("firstpage", webViewerFirstPage);
-
- eventBus._off("lastpage", webViewerLastPage);
-
- eventBus._off("nextpage", webViewerNextPage);
-
- eventBus._off("previouspage", webViewerPreviousPage);
-
- eventBus._off("zoomin", webViewerZoomIn);
-
- eventBus._off("zoomout", webViewerZoomOut);
-
- eventBus._off("zoomreset", webViewerZoomReset);
-
- eventBus._off("pagenumberchanged", webViewerPageNumberChanged);
-
- eventBus._off("scalechanged", webViewerScaleChanged);
-
- eventBus._off("rotatecw", webViewerRotateCw);
-
- eventBus._off("rotateccw", webViewerRotateCcw);
-
- eventBus._off("optionalcontentconfig", webViewerOptionalContentConfig);
-
- eventBus._off("switchscrollmode", webViewerSwitchScrollMode);
-
- eventBus._off("scrollmodechanged", webViewerScrollModeChanged);
-
- eventBus._off("switchspreadmode", webViewerSwitchSpreadMode);
-
- eventBus._off("spreadmodechanged", webViewerSpreadModeChanged);
-
- eventBus._off("documentproperties", webViewerDocumentProperties);
-
- eventBus._off("find", webViewerFind);
-
- eventBus._off("findfromurlhash", webViewerFindFromUrlHash);
-
- eventBus._off("updatefindmatchescount", webViewerUpdateFindMatchesCount);
-
- eventBus._off("updatefindcontrolstate", webViewerUpdateFindControlState);
-
- if (_boundEvents.reportPageStatsPDFBug) {
- eventBus._off("pagerendered", _boundEvents.reportPageStatsPDFBug);
-
- eventBus._off("pagechanging", _boundEvents.reportPageStatsPDFBug);
-
- _boundEvents.reportPageStatsPDFBug = null;
- }
-
- eventBus._off("fileinputchange", webViewerFileInputChange);
-
- eventBus._off("openfile", webViewerOpenFile);
-
- _boundEvents.beforePrint = null;
- _boundEvents.afterPrint = null;
- },
-
- unbindWindowEvents() {
- const {
- _boundEvents
- } = this;
- window.removeEventListener("visibilitychange", webViewerVisibilityChange);
- window.removeEventListener("wheel", webViewerWheel, {
- passive: false
- });
- window.removeEventListener("touchstart", webViewerTouchStart, {
- passive: false
- });
- window.removeEventListener("click", webViewerClick);
- window.removeEventListener("keydown", webViewerKeyDown);
- window.removeEventListener("resize", _boundEvents.windowResize);
- window.removeEventListener("hashchange", _boundEvents.windowHashChange);
- window.removeEventListener("beforeprint", _boundEvents.windowBeforePrint);
- window.removeEventListener("afterprint", _boundEvents.windowAfterPrint);
- window.removeEventListener("updatefromsandbox", _boundEvents.windowUpdateFromSandbox);
- _boundEvents.windowResize = null;
- _boundEvents.windowHashChange = null;
- _boundEvents.windowBeforePrint = null;
- _boundEvents.windowAfterPrint = null;
- _boundEvents.windowUpdateFromSandbox = null;
- },
-
- accumulateWheelTicks(ticks) {
- if (this._wheelUnusedTicks > 0 && ticks < 0 || this._wheelUnusedTicks < 0 && ticks > 0) {
- this._wheelUnusedTicks = 0;
- }
-
- this._wheelUnusedTicks += ticks;
- const wholeTicks = Math.sign(this._wheelUnusedTicks) * Math.floor(Math.abs(this._wheelUnusedTicks));
- this._wheelUnusedTicks -= wholeTicks;
- return wholeTicks;
- },
-
- _unblockDocumentLoadEvent() {
- if (document.blockUnblockOnload) {
- document.blockUnblockOnload(false);
- }
-
- this._unblockDocumentLoadEvent = () => {};
- },
-
- get scriptingReady() {
- return this.pdfScriptingManager.ready;
- }
-
-};
-exports.PDFViewerApplication = PDFViewerApplication;
-let validateFileURL;
-{
- const HOSTED_VIEWER_ORIGINS = ["null", "http://mozilla.github.io", "https://mozilla.github.io"];
-
- validateFileURL = function (file) {
- if (file === undefined) {
- return;
- }
-
- try {
- const viewerOrigin = new URL(window.location.href).origin || "null";
-
- if (HOSTED_VIEWER_ORIGINS.includes(viewerOrigin)) {
- return;
- }
-
- const {
- origin,
- protocol
- } = new URL(file, window.location.href);
-
- if (origin !== viewerOrigin && protocol !== "blob:") {
- throw new Error("file origin does not match viewer's");
- }
- } catch (ex) {
- PDFViewerApplication.l10n.get("loading_error").then(msg => {
- PDFViewerApplication._documentError(msg, {
- message: ex?.message
- });
- });
- throw ex;
- }
- };
-}
-
-async function loadFakeWorker() {
- if (!_pdfjsLib.GlobalWorkerOptions.workerSrc) {
- _pdfjsLib.GlobalWorkerOptions.workerSrc = _app_options.AppOptions.get("workerSrc");
- }
-
- return (0, _pdfjsLib.loadScript)(_pdfjsLib.PDFWorker.getWorkerSrc());
-}
-
-function loadAndEnablePDFBug(enabledTabs) {
- const appConfig = PDFViewerApplication.appConfig;
- return (0, _pdfjsLib.loadScript)(appConfig.debuggerScriptPath).then(function () {
- PDFBug.enable(enabledTabs);
- PDFBug.init({
- OPS: _pdfjsLib.OPS
- }, appConfig.mainContainer);
- });
-}
-
-function reportPageStatsPDFBug({
- pageNumber
-}) {
- if (typeof Stats === "undefined" || !Stats.enabled) {
- return;
- }
-
- const pageView = PDFViewerApplication.pdfViewer.getPageView(pageNumber - 1);
- const pageStats = pageView?.pdfPage?.stats;
-
- if (!pageStats) {
- return;
- }
-
- Stats.add(pageNumber, pageStats);
-}
-
-function webViewerInitialized() {
- const appConfig = PDFViewerApplication.appConfig;
- let file;
- const queryString = document.location.search.substring(1);
- const params = (0, _ui_utils.parseQueryString)(queryString);
- file = "file" in params ? params.file : _app_options.AppOptions.get("defaultUrl");
- validateFileURL(file);
- const fileInput = document.createElement("input");
- fileInput.id = appConfig.openFileInputName;
- fileInput.className = "fileInput";
- fileInput.setAttribute("type", "file");
- fileInput.oncontextmenu = _ui_utils.noContextMenuHandler;
- document.body.appendChild(fileInput);
-
- if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
- appConfig.toolbar.openFile.hidden = true;
- appConfig.secondaryToolbar.openFileButton.hidden = true;
- } else {
- fileInput.value = null;
- }
-
- fileInput.addEventListener("change", function (evt) {
- const files = evt.target.files;
-
- if (!files || files.length === 0) {
- return;
- }
-
- PDFViewerApplication.eventBus.dispatch("fileinputchange", {
- source: this,
- fileInput: evt.target
- });
- });
- appConfig.mainContainer.addEventListener("dragover", function (evt) {
- evt.preventDefault();
- evt.dataTransfer.dropEffect = "move";
- });
- appConfig.mainContainer.addEventListener("drop", function (evt) {
- evt.preventDefault();
- const files = evt.dataTransfer.files;
-
- if (!files || files.length === 0) {
- return;
- }
-
- PDFViewerApplication.eventBus.dispatch("fileinputchange", {
- source: this,
- fileInput: evt.dataTransfer
- });
- });
-
- if (!PDFViewerApplication.supportsDocumentFonts) {
- _app_options.AppOptions.set("disableFontFace", true);
-
- PDFViewerApplication.l10n.get("web_fonts_disabled").then(msg => {
- console.warn(msg);
- });
- }
-
- if (!PDFViewerApplication.supportsPrinting) {
- appConfig.toolbar.print.classList.add("hidden");
- appConfig.secondaryToolbar.printButton.classList.add("hidden");
- }
-
- if (!PDFViewerApplication.supportsFullscreen) {
- appConfig.toolbar.presentationModeButton.classList.add("hidden");
- appConfig.secondaryToolbar.presentationModeButton.classList.add("hidden");
- }
-
- if (PDFViewerApplication.supportsIntegratedFind) {
- appConfig.toolbar.viewFind.classList.add("hidden");
- }
-
- appConfig.mainContainer.addEventListener("transitionend", function (evt) {
- if (evt.target === this) {
- PDFViewerApplication.eventBus.dispatch("resize", {
- source: this
- });
- }
- }, true);
-
- try {
- webViewerOpenFileViaURL(file);
- } catch (reason) {
- PDFViewerApplication.l10n.get("loading_error").then(msg => {
- PDFViewerApplication._documentError(msg, reason);
- });
- }
-}
-
-function webViewerOpenFileViaURL(file) {
- if (file) {
- PDFViewerApplication.open(file);
- }
-}
-
-function webViewerResetPermissions() {
- const {
- appConfig
- } = PDFViewerApplication;
-
- if (!appConfig) {
- return;
- }
-
- appConfig.viewerContainer.classList.remove(ENABLE_PERMISSIONS_CLASS);
-}
-
-function webViewerPageRendered({
- pageNumber,
- timestamp,
- error
-}) {
- if (pageNumber === PDFViewerApplication.page) {
- PDFViewerApplication.toolbar.updateLoadingIndicatorState(false);
- }
-
- if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {
- const pageView = PDFViewerApplication.pdfViewer.getPageView(pageNumber - 1);
- const thumbnailView = PDFViewerApplication.pdfThumbnailViewer.getThumbnail(pageNumber - 1);
-
- if (pageView && thumbnailView) {
- thumbnailView.setImage(pageView);
- }
- }
-
- if (error) {
- PDFViewerApplication.l10n.get("rendering_error").then(msg => {
- PDFViewerApplication._otherError(msg, error);
- });
- }
-
- PDFViewerApplication.externalServices.reportTelemetry({
- type: "pageInfo",
- timestamp
- });
- PDFViewerApplication.pdfDocument.getStats().then(function (stats) {
- PDFViewerApplication.externalServices.reportTelemetry({
- type: "documentStats",
- stats
- });
- });
-}
-
-function webViewerPageMode({
- mode
-}) {
- let view;
-
- switch (mode) {
- case "thumbs":
- view = _ui_utils.SidebarView.THUMBS;
- break;
-
- case "bookmarks":
- case "outline":
- view = _ui_utils.SidebarView.OUTLINE;
- break;
-
- case "attachments":
- view = _ui_utils.SidebarView.ATTACHMENTS;
- break;
-
- case "layers":
- view = _ui_utils.SidebarView.LAYERS;
- break;
-
- case "none":
- view = _ui_utils.SidebarView.NONE;
- break;
-
- default:
- console.error('Invalid "pagemode" hash parameter: ' + mode);
- return;
- }
-
- PDFViewerApplication.pdfSidebar.switchView(view, true);
-}
-
-function webViewerNamedAction(evt) {
- switch (evt.action) {
- case "GoToPage":
- PDFViewerApplication.appConfig.toolbar.pageNumber.select();
- break;
-
- case "Find":
- if (!PDFViewerApplication.supportsIntegratedFind) {
- PDFViewerApplication.findBar.toggle();
- }
-
- break;
-
- case "Print":
- PDFViewerApplication.triggerPrinting();
- break;
-
- case "SaveAs":
- webViewerSave();
- break;
- }
-}
-
-function webViewerPresentationModeChanged(evt) {
- PDFViewerApplication.pdfViewer.presentationModeState = evt.state;
-}
-
-function webViewerSidebarViewChanged(evt) {
- PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled = PDFViewerApplication.pdfSidebar.isThumbnailViewVisible;
- const store = PDFViewerApplication.store;
-
- if (store && PDFViewerApplication.isInitialViewSet) {
- store.set("sidebarView", evt.view).catch(function () {});
- }
-}
-
-function webViewerUpdateViewarea(evt) {
- const location = evt.location,
- store = PDFViewerApplication.store;
-
- if (store && PDFViewerApplication.isInitialViewSet) {
- store.setMultiple({
- page: location.pageNumber,
- zoom: location.scale,
- scrollLeft: location.left,
- scrollTop: location.top,
- rotation: location.rotation
- }).catch(function () {});
- }
-
- const href = PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams);
- PDFViewerApplication.appConfig.toolbar.viewBookmark.href = href;
- PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href = href;
- const currentPage = PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1);
- const loading = currentPage?.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED;
- PDFViewerApplication.toolbar.updateLoadingIndicatorState(loading);
-}
-
-function webViewerScrollModeChanged(evt) {
- const store = PDFViewerApplication.store;
-
- if (store && PDFViewerApplication.isInitialViewSet) {
- store.set("scrollMode", evt.mode).catch(function () {});
- }
-}
-
-function webViewerSpreadModeChanged(evt) {
- const store = PDFViewerApplication.store;
-
- if (store && PDFViewerApplication.isInitialViewSet) {
- store.set("spreadMode", evt.mode).catch(function () {});
- }
-}
-
-function webViewerResize() {
- const {
- pdfDocument,
- pdfViewer
- } = PDFViewerApplication;
-
- if (!pdfDocument) {
- return;
- }
-
- const currentScaleValue = pdfViewer.currentScaleValue;
-
- if (currentScaleValue === "auto" || currentScaleValue === "page-fit" || currentScaleValue === "page-width") {
- pdfViewer.currentScaleValue = currentScaleValue;
- }
-
- pdfViewer.update();
-}
-
-function webViewerHashchange(evt) {
- const hash = evt.hash;
-
- if (!hash) {
- return;
- }
-
- if (!PDFViewerApplication.isInitialViewSet) {
- PDFViewerApplication.initialBookmark = hash;
- } else if (!PDFViewerApplication.pdfHistory.popStateInProgress) {
- PDFViewerApplication.pdfLinkService.setHash(hash);
- }
-}
-
-let webViewerFileInputChange, webViewerOpenFile;
-{
- webViewerFileInputChange = function (evt) {
- if (PDFViewerApplication.pdfViewer?.isInPresentationMode) {
- return;
- }
-
- const file = evt.fileInput.files[0];
-
- if (!_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {
- let url = URL.createObjectURL(file);
-
- if (file.name) {
- url = {
- url,
- originalUrl: file.name
- };
- }
-
- PDFViewerApplication.open(url);
- } else {
- PDFViewerApplication.setTitleUsingUrl(file.name);
- const fileReader = new FileReader();
-
- fileReader.onload = function webViewerChangeFileReaderOnload(event) {
- const buffer = event.target.result;
- PDFViewerApplication.open(new Uint8Array(buffer));
- };
-
- fileReader.readAsArrayBuffer(file);
- }
-
- const appConfig = PDFViewerApplication.appConfig;
- appConfig.toolbar.viewBookmark.hidden = true;
- appConfig.secondaryToolbar.viewBookmarkButton.hidden = true;
- appConfig.toolbar.download.hidden = true;
- appConfig.secondaryToolbar.downloadButton.hidden = true;
- };
-
- webViewerOpenFile = function (evt) {
- const openFileInputName = PDFViewerApplication.appConfig.openFileInputName;
- document.getElementById(openFileInputName).click();
- };
-}
-
-function webViewerPresentationMode() {
- PDFViewerApplication.requestPresentationMode();
-}
-
-function webViewerPrint() {
- PDFViewerApplication.triggerPrinting();
-}
-
-function webViewerDownload() {
- PDFViewerApplication.downloadOrSave({
- sourceEventType: "download"
- });
-}
-
-function webViewerSave() {
- PDFViewerApplication.downloadOrSave({
- sourceEventType: "save"
- });
-}
-
-function webViewerFirstPage() {
- if (PDFViewerApplication.pdfDocument) {
- PDFViewerApplication.page = 1;
- }
-}
-
-function webViewerLastPage() {
- if (PDFViewerApplication.pdfDocument) {
- PDFViewerApplication.page = PDFViewerApplication.pagesCount;
- }
-}
-
-function webViewerNextPage() {
- PDFViewerApplication.pdfViewer.nextPage();
-}
-
-function webViewerPreviousPage() {
- PDFViewerApplication.pdfViewer.previousPage();
-}
-
-function webViewerZoomIn() {
- PDFViewerApplication.zoomIn();
-}
-
-function webViewerZoomOut() {
- PDFViewerApplication.zoomOut();
-}
-
-function webViewerZoomReset() {
- PDFViewerApplication.zoomReset();
-}
-
-function webViewerPageNumberChanged(evt) {
- const pdfViewer = PDFViewerApplication.pdfViewer;
-
- if (evt.value !== "") {
- PDFViewerApplication.pdfLinkService.goToPage(evt.value);
- }
-
- if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) {
- PDFViewerApplication.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);
- }
-}
-
-function webViewerScaleChanged(evt) {
- PDFViewerApplication.pdfViewer.currentScaleValue = evt.value;
-}
-
-function webViewerRotateCw() {
- PDFViewerApplication.rotatePages(90);
-}
-
-function webViewerRotateCcw() {
- PDFViewerApplication.rotatePages(-90);
-}
-
-function webViewerOptionalContentConfig(evt) {
- PDFViewerApplication.pdfViewer.optionalContentConfigPromise = evt.promise;
-}
-
-function webViewerSwitchScrollMode(evt) {
- PDFViewerApplication.pdfViewer.scrollMode = evt.mode;
-}
-
-function webViewerSwitchSpreadMode(evt) {
- PDFViewerApplication.pdfViewer.spreadMode = evt.mode;
-}
-
-function webViewerDocumentProperties() {
- PDFViewerApplication.pdfDocumentProperties.open();
-}
-
-function webViewerFind(evt) {
- PDFViewerApplication.findController.executeCommand("find" + evt.type, {
- query: evt.query,
- phraseSearch: evt.phraseSearch,
- caseSensitive: evt.caseSensitive,
- entireWord: evt.entireWord,
- highlightAll: evt.highlightAll,
- findPrevious: evt.findPrevious
- });
-}
-
-function webViewerFindFromUrlHash(evt) {
- PDFViewerApplication.findController.executeCommand("find", {
- query: evt.query,
- phraseSearch: evt.phraseSearch,
- caseSensitive: false,
- entireWord: false,
- highlightAll: true,
- findPrevious: false
- });
-}
-
-function webViewerUpdateFindMatchesCount({
- matchesCount
-}) {
- if (PDFViewerApplication.supportsIntegratedFind) {
- PDFViewerApplication.externalServices.updateFindMatchesCount(matchesCount);
- } else {
- PDFViewerApplication.findBar.updateResultsCount(matchesCount);
- }
-}
-
-function webViewerUpdateFindControlState({
- state,
- previous,
- matchesCount,
- rawQuery
-}) {
- if (PDFViewerApplication.supportsIntegratedFind) {
- PDFViewerApplication.externalServices.updateFindControlState({
- result: state,
- findPrevious: previous,
- matchesCount,
- rawQuery
- });
- } else {
- PDFViewerApplication.findBar.updateUIState(state, previous, matchesCount);
- }
-}
-
-function webViewerScaleChanging(evt) {
- PDFViewerApplication.toolbar.setPageScale(evt.presetValue, evt.scale);
- PDFViewerApplication.pdfViewer.update();
-}
-
-function webViewerRotationChanging(evt) {
- PDFViewerApplication.pdfThumbnailViewer.pagesRotation = evt.pagesRotation;
- PDFViewerApplication.forceRendering();
- PDFViewerApplication.pdfViewer.currentPageNumber = evt.pageNumber;
-}
-
-function webViewerPageChanging({
- pageNumber,
- pageLabel
-}) {
- PDFViewerApplication.toolbar.setPageNumber(pageNumber, pageLabel);
- PDFViewerApplication.secondaryToolbar.setPageNumber(pageNumber);
-
- if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {
- PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(pageNumber);
- }
-}
-
-function webViewerVisibilityChange(evt) {
- if (document.visibilityState === "visible") {
- setZoomDisabledTimeout();
- }
-}
-
-let zoomDisabledTimeout = null;
-
-function setZoomDisabledTimeout() {
- if (zoomDisabledTimeout) {
- clearTimeout(zoomDisabledTimeout);
- }
-
- zoomDisabledTimeout = setTimeout(function () {
- zoomDisabledTimeout = null;
- }, WHEEL_ZOOM_DISABLED_TIMEOUT);
-}
-
-function webViewerWheel(evt) {
- const {
- pdfViewer,
- supportedMouseWheelZoomModifierKeys
- } = PDFViewerApplication;
-
- if (pdfViewer.isInPresentationMode) {
- return;
- }
-
- if (evt.ctrlKey && supportedMouseWheelZoomModifierKeys.ctrlKey || evt.metaKey && supportedMouseWheelZoomModifierKeys.metaKey) {
- evt.preventDefault();
-
- if (zoomDisabledTimeout || document.visibilityState === "hidden") {
- return;
- }
-
- const previousScale = pdfViewer.currentScale;
- const delta = (0, _ui_utils.normalizeWheelEventDirection)(evt);
- let ticks = 0;
-
- if (evt.deltaMode === WheelEvent.DOM_DELTA_LINE || evt.deltaMode === WheelEvent.DOM_DELTA_PAGE) {
- if (Math.abs(delta) >= 1) {
- ticks = Math.sign(delta);
- } else {
- ticks = PDFViewerApplication.accumulateWheelTicks(delta);
- }
- } else {
- const PIXELS_PER_LINE_SCALE = 30;
- ticks = PDFViewerApplication.accumulateWheelTicks(delta / PIXELS_PER_LINE_SCALE);
- }
-
- if (ticks < 0) {
- PDFViewerApplication.zoomOut(-ticks);
- } else if (ticks > 0) {
- PDFViewerApplication.zoomIn(ticks);
- }
-
- const currentScale = pdfViewer.currentScale;
-
- if (previousScale !== currentScale) {
- const scaleCorrectionFactor = currentScale / previousScale - 1;
- const rect = pdfViewer.container.getBoundingClientRect();
- const dx = evt.clientX - rect.left;
- const dy = evt.clientY - rect.top;
- pdfViewer.container.scrollLeft += dx * scaleCorrectionFactor;
- pdfViewer.container.scrollTop += dy * scaleCorrectionFactor;
- }
- } else {
- setZoomDisabledTimeout();
- }
-}
-
-function webViewerTouchStart(evt) {
- if (evt.touches.length > 1) {
- evt.preventDefault();
- }
-}
-
-function webViewerClick(evt) {
- if (!PDFViewerApplication.secondaryToolbar.isOpen) {
- return;
- }
-
- const appConfig = PDFViewerApplication.appConfig;
-
- if (PDFViewerApplication.pdfViewer.containsElement(evt.target) || appConfig.toolbar.container.contains(evt.target) && evt.target !== appConfig.secondaryToolbar.toggleButton) {
- PDFViewerApplication.secondaryToolbar.close();
- }
-}
-
-function webViewerKeyDown(evt) {
- if (PDFViewerApplication.overlayManager.active) {
- return;
- }
-
- let handled = false,
- ensureViewerFocused = false;
- const cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0);
- const pdfViewer = PDFViewerApplication.pdfViewer;
- const isViewerInPresentationMode = pdfViewer?.isInPresentationMode;
-
- if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {
- switch (evt.keyCode) {
- case 70:
- if (!PDFViewerApplication.supportsIntegratedFind && !evt.shiftKey) {
- PDFViewerApplication.findBar.open();
- handled = true;
- }
-
- break;
-
- case 71:
- if (!PDFViewerApplication.supportsIntegratedFind) {
- const findState = PDFViewerApplication.findController.state;
-
- if (findState) {
- PDFViewerApplication.findController.executeCommand("findagain", {
- query: findState.query,
- phraseSearch: findState.phraseSearch,
- caseSensitive: findState.caseSensitive,
- entireWord: findState.entireWord,
- highlightAll: findState.highlightAll,
- findPrevious: cmd === 5 || cmd === 12
- });
- }
-
- handled = true;
- }
-
- break;
-
- case 61:
- case 107:
- case 187:
- case 171:
- if (!isViewerInPresentationMode) {
- PDFViewerApplication.zoomIn();
- }
-
- handled = true;
- break;
-
- case 173:
- case 109:
- case 189:
- if (!isViewerInPresentationMode) {
- PDFViewerApplication.zoomOut();
- }
-
- handled = true;
- break;
-
- case 48:
- case 96:
- if (!isViewerInPresentationMode) {
- setTimeout(function () {
- PDFViewerApplication.zoomReset();
- });
- handled = false;
- }
-
- break;
-
- case 38:
- if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {
- PDFViewerApplication.page = 1;
- handled = true;
- ensureViewerFocused = true;
- }
-
- break;
-
- case 40:
- if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) {
- PDFViewerApplication.page = PDFViewerApplication.pagesCount;
- handled = true;
- ensureViewerFocused = true;
- }
-
- break;
- }
- }
-
- const {
- eventBus
- } = PDFViewerApplication;
-
- if (cmd === 1 || cmd === 8) {
- switch (evt.keyCode) {
- case 83:
- eventBus.dispatch("download", {
- source: window
- });
- handled = true;
- break;
-
- case 79:
- {
- eventBus.dispatch("openfile", {
- source: window
- });
- handled = true;
- }
- break;
- }
- }
-
- if (cmd === 3 || cmd === 10) {
- switch (evt.keyCode) {
- case 80:
- PDFViewerApplication.requestPresentationMode();
- handled = true;
- break;
-
- case 71:
- PDFViewerApplication.appConfig.toolbar.pageNumber.select();
- handled = true;
- break;
- }
- }
-
- if (handled) {
- if (ensureViewerFocused && !isViewerInPresentationMode) {
- pdfViewer.focus();
- }
-
- evt.preventDefault();
- return;
- }
-
- const curElement = (0, _ui_utils.getActiveOrFocusedElement)();
- const curElementTagName = curElement?.tagName.toUpperCase();
-
- if (curElementTagName === "INPUT" || curElementTagName === "TEXTAREA" || curElementTagName === "SELECT" || curElement?.isContentEditable) {
- if (evt.keyCode !== 27) {
- return;
- }
- }
-
- if (cmd === 0) {
- let turnPage = 0,
- turnOnlyIfPageFit = false;
-
- switch (evt.keyCode) {
- case 38:
- case 33:
- if (pdfViewer.isVerticalScrollbarEnabled) {
- turnOnlyIfPageFit = true;
- }
-
- turnPage = -1;
- break;
-
- case 8:
- if (!isViewerInPresentationMode) {
- turnOnlyIfPageFit = true;
- }
-
- turnPage = -1;
- break;
-
- case 37:
- if (pdfViewer.isHorizontalScrollbarEnabled) {
- turnOnlyIfPageFit = true;
- }
-
- case 75:
- case 80:
- turnPage = -1;
- break;
-
- case 27:
- if (PDFViewerApplication.secondaryToolbar.isOpen) {
- PDFViewerApplication.secondaryToolbar.close();
- handled = true;
- }
-
- if (!PDFViewerApplication.supportsIntegratedFind && PDFViewerApplication.findBar.opened) {
- PDFViewerApplication.findBar.close();
- handled = true;
- }
-
- break;
-
- case 40:
- case 34:
- if (pdfViewer.isVerticalScrollbarEnabled) {
- turnOnlyIfPageFit = true;
- }
-
- turnPage = 1;
- break;
-
- case 13:
- case 32:
- if (!isViewerInPresentationMode) {
- turnOnlyIfPageFit = true;
- }
-
- turnPage = 1;
- break;
-
- case 39:
- if (pdfViewer.isHorizontalScrollbarEnabled) {
- turnOnlyIfPageFit = true;
- }
-
- case 74:
- case 78:
- turnPage = 1;
- break;
-
- case 36:
- if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {
- PDFViewerApplication.page = 1;
- handled = true;
- ensureViewerFocused = true;
- }
-
- break;
-
- case 35:
- if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) {
- PDFViewerApplication.page = PDFViewerApplication.pagesCount;
- handled = true;
- ensureViewerFocused = true;
- }
-
- break;
-
- case 83:
- PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.SELECT);
- break;
-
- case 72:
- PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.HAND);
- break;
-
- case 82:
- PDFViewerApplication.rotatePages(90);
- break;
-
- case 115:
- PDFViewerApplication.pdfSidebar.toggle();
- break;
- }
-
- if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === "page-fit")) {
- if (turnPage > 0) {
- pdfViewer.nextPage();
- } else {
- pdfViewer.previousPage();
- }
-
- handled = true;
- }
- }
-
- if (cmd === 4) {
- switch (evt.keyCode) {
- case 13:
- case 32:
- if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== "page-fit") {
- break;
- }
-
- if (PDFViewerApplication.page > 1) {
- PDFViewerApplication.page--;
- }
-
- handled = true;
- break;
-
- case 82:
- PDFViewerApplication.rotatePages(-90);
- break;
- }
- }
-
- if (!handled && !isViewerInPresentationMode) {
- if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== "BUTTON") {
- ensureViewerFocused = true;
- }
- }
-
- if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) {
- pdfViewer.focus();
- }
-
- if (handled) {
- evt.preventDefault();
- }
-}
-
-function beforeUnload(evt) {
- evt.preventDefault();
- evt.returnValue = "";
- return false;
-}
-
-const PDFPrintServiceFactory = {
- instance: {
- supportsPrinting: false,
-
- createPrintService() {
- throw new Error("Not implemented: createPrintService");
- }
-
- }
-};
-exports.PDFPrintServiceFactory = PDFPrintServiceFactory;
-
-/***/ }),
-/* 4 */
-/***/ ((__unused_webpack_module, exports) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.apiPageLayoutToSpreadMode = apiPageLayoutToSpreadMode;
-exports.apiPageModeToSidebarView = apiPageModeToSidebarView;
-exports.approximateFraction = approximateFraction;
-exports.backtrackBeforeAllVisibleElements = backtrackBeforeAllVisibleElements;
-exports.binarySearchFirstItem = binarySearchFirstItem;
-exports.getActiveOrFocusedElement = getActiveOrFocusedElement;
-exports.getOutputScale = getOutputScale;
-exports.getPageSizeInches = getPageSizeInches;
-exports.getVisibleElements = getVisibleElements;
-exports.isPortraitOrientation = isPortraitOrientation;
-exports.isValidRotation = isValidRotation;
-exports.isValidScrollMode = isValidScrollMode;
-exports.isValidSpreadMode = isValidSpreadMode;
-exports.moveToEndOfArray = moveToEndOfArray;
-exports.noContextMenuHandler = noContextMenuHandler;
-exports.normalizeWheelEventDelta = normalizeWheelEventDelta;
-exports.normalizeWheelEventDirection = normalizeWheelEventDirection;
-exports.parseQueryString = parseQueryString;
-exports.roundToDivide = roundToDivide;
-exports.scrollIntoView = scrollIntoView;
-exports.waitOnEventOrTimeout = waitOnEventOrTimeout;
-exports.watchScroll = watchScroll;
-exports.WaitOnType = exports.VERTICAL_PADDING = exports.UNKNOWN_SCALE = exports.TextLayerMode = exports.SpreadMode = exports.SidebarView = exports.ScrollMode = exports.SCROLLBAR_PADDING = exports.RendererType = exports.ProgressBar = exports.PresentationModeState = exports.MIN_SCALE = exports.MAX_SCALE = exports.MAX_AUTO_SCALE = exports.EventBus = exports.DEFAULT_SCALE_VALUE = exports.DEFAULT_SCALE = exports.CSS_UNITS = exports.AutoPrintRegExp = exports.animationStarted = void 0;
-const CSS_UNITS = 96.0 / 72.0;
-exports.CSS_UNITS = CSS_UNITS;
-const DEFAULT_SCALE_VALUE = "auto";
-exports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE;
-const DEFAULT_SCALE = 1.0;
-exports.DEFAULT_SCALE = DEFAULT_SCALE;
-const MIN_SCALE = 0.1;
-exports.MIN_SCALE = MIN_SCALE;
-const MAX_SCALE = 10.0;
-exports.MAX_SCALE = MAX_SCALE;
-const UNKNOWN_SCALE = 0;
-exports.UNKNOWN_SCALE = UNKNOWN_SCALE;
-const MAX_AUTO_SCALE = 1.25;
-exports.MAX_AUTO_SCALE = MAX_AUTO_SCALE;
-const SCROLLBAR_PADDING = 40;
-exports.SCROLLBAR_PADDING = SCROLLBAR_PADDING;
-const VERTICAL_PADDING = 5;
-exports.VERTICAL_PADDING = VERTICAL_PADDING;
-const LOADINGBAR_END_OFFSET_VAR = "--loadingBar-end-offset";
-const PresentationModeState = {
- UNKNOWN: 0,
- NORMAL: 1,
- CHANGING: 2,
- FULLSCREEN: 3
-};
-exports.PresentationModeState = PresentationModeState;
-const SidebarView = {
- UNKNOWN: -1,
- NONE: 0,
- THUMBS: 1,
- OUTLINE: 2,
- ATTACHMENTS: 3,
- LAYERS: 4
-};
-exports.SidebarView = SidebarView;
-const RendererType = {
- CANVAS: "canvas",
- SVG: "svg"
-};
-exports.RendererType = RendererType;
-const TextLayerMode = {
- DISABLE: 0,
- ENABLE: 1,
- ENABLE_ENHANCE: 2
-};
-exports.TextLayerMode = TextLayerMode;
-const ScrollMode = {
- UNKNOWN: -1,
- VERTICAL: 0,
- HORIZONTAL: 1,
- WRAPPED: 2
-};
-exports.ScrollMode = ScrollMode;
-const SpreadMode = {
- UNKNOWN: -1,
- NONE: 0,
- ODD: 1,
- EVEN: 2
-};
-exports.SpreadMode = SpreadMode;
-const AutoPrintRegExp = /\bprint\s*\(/;
-exports.AutoPrintRegExp = AutoPrintRegExp;
-
-function getOutputScale(ctx) {
- const devicePixelRatio = window.devicePixelRatio || 1;
- const backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;
- const pixelRatio = devicePixelRatio / backingStoreRatio;
- return {
- sx: pixelRatio,
- sy: pixelRatio,
- scaled: pixelRatio !== 1
- };
-}
-
-function scrollIntoView(element, spot, scrollMatches = false) {
- let parent = element.offsetParent;
-
- if (!parent) {
- console.error("offsetParent is not set -- cannot scroll");
- return;
- }
-
- let offsetY = element.offsetTop + element.clientTop;
- let offsetX = element.offsetLeft + element.clientLeft;
-
- while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || scrollMatches && (parent.classList.contains("markedContent") || getComputedStyle(parent).overflow === "hidden")) {
- offsetY += parent.offsetTop;
- offsetX += parent.offsetLeft;
- parent = parent.offsetParent;
-
- if (!parent) {
- return;
- }
- }
-
- if (spot) {
- if (spot.top !== undefined) {
- offsetY += spot.top;
- }
-
- if (spot.left !== undefined) {
- offsetX += spot.left;
- parent.scrollLeft = offsetX;
- }
- }
-
- parent.scrollTop = offsetY;
-}
-
-function watchScroll(viewAreaElement, callback) {
- const debounceScroll = function (evt) {
- if (rAF) {
- return;
- }
-
- rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {
- rAF = null;
- const currentX = viewAreaElement.scrollLeft;
- const lastX = state.lastX;
-
- if (currentX !== lastX) {
- state.right = currentX > lastX;
- }
-
- state.lastX = currentX;
- const currentY = viewAreaElement.scrollTop;
- const lastY = state.lastY;
-
- if (currentY !== lastY) {
- state.down = currentY > lastY;
- }
-
- state.lastY = currentY;
- callback(state);
- });
- };
-
- const state = {
- right: true,
- down: true,
- lastX: viewAreaElement.scrollLeft,
- lastY: viewAreaElement.scrollTop,
- _eventHandler: debounceScroll
- };
- let rAF = null;
- viewAreaElement.addEventListener("scroll", debounceScroll, true);
- return state;
-}
-
-function parseQueryString(query) {
- const parts = query.split("&");
- const params = Object.create(null);
-
- for (let i = 0, ii = parts.length; i < ii; ++i) {
- const param = parts[i].split("=");
- const key = param[0].toLowerCase();
- const value = param.length > 1 ? param[1] : null;
- params[decodeURIComponent(key)] = decodeURIComponent(value);
- }
-
- return params;
-}
-
-function binarySearchFirstItem(items, condition) {
- let minIndex = 0;
- let maxIndex = items.length - 1;
-
- if (maxIndex < 0 || !condition(items[maxIndex])) {
- return items.length;
- }
-
- if (condition(items[minIndex])) {
- return minIndex;
- }
-
- while (minIndex < maxIndex) {
- const currentIndex = minIndex + maxIndex >> 1;
- const currentItem = items[currentIndex];
-
- if (condition(currentItem)) {
- maxIndex = currentIndex;
- } else {
- minIndex = currentIndex + 1;
- }
- }
-
- return minIndex;
-}
-
-function approximateFraction(x) {
- if (Math.floor(x) === x) {
- return [x, 1];
- }
-
- const xinv = 1 / x;
- const limit = 8;
-
- if (xinv > limit) {
- return [1, limit];
- } else if (Math.floor(xinv) === xinv) {
- return [1, xinv];
- }
-
- const x_ = x > 1 ? xinv : x;
- let a = 0,
- b = 1,
- c = 1,
- d = 1;
-
- while (true) {
- const p = a + c,
- q = b + d;
-
- if (q > limit) {
- break;
- }
-
- if (x_ <= p / q) {
- c = p;
- d = q;
- } else {
- a = p;
- b = q;
- }
- }
-
- let result;
-
- if (x_ - a / b < c / d - x_) {
- result = x_ === x ? [a, b] : [b, a];
- } else {
- result = x_ === x ? [c, d] : [d, c];
- }
-
- return result;
-}
-
-function roundToDivide(x, div) {
- const r = x % div;
- return r === 0 ? x : Math.round(x - r + div);
-}
-
-function getPageSizeInches({
- view,
- userUnit,
- rotate
-}) {
- const [x1, y1, x2, y2] = view;
- const changeOrientation = rotate % 180 !== 0;
- const width = (x2 - x1) / 72 * userUnit;
- const height = (y2 - y1) / 72 * userUnit;
- return {
- width: changeOrientation ? height : width,
- height: changeOrientation ? width : height
- };
-}
-
-function backtrackBeforeAllVisibleElements(index, views, top) {
- if (index < 2) {
- return index;
- }
-
- let elt = views[index].div;
- let pageTop = elt.offsetTop + elt.clientTop;
-
- if (pageTop >= top) {
- elt = views[index - 1].div;
- pageTop = elt.offsetTop + elt.clientTop;
- }
-
- for (let i = index - 2; i >= 0; --i) {
- elt = views[i].div;
-
- if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {
- break;
- }
-
- index = i;
- }
-
- return index;
-}
-
-function getVisibleElements({
- scrollEl,
- views,
- sortByVisibility = false,
- horizontal = false,
- rtl = false
-}) {
- const top = scrollEl.scrollTop,
- bottom = top + scrollEl.clientHeight;
- const left = scrollEl.scrollLeft,
- right = left + scrollEl.clientWidth;
-
- function isElementBottomAfterViewTop(view) {
- const element = view.div;
- const elementBottom = element.offsetTop + element.clientTop + element.clientHeight;
- return elementBottom > top;
- }
-
- function isElementNextAfterViewHorizontally(view) {
- const element = view.div;
- const elementLeft = element.offsetLeft + element.clientLeft;
- const elementRight = elementLeft + element.clientWidth;
- return rtl ? elementLeft < right : elementRight > left;
- }
-
- const visible = [],
- numViews = views.length;
- let firstVisibleElementInd = binarySearchFirstItem(views, horizontal ? isElementNextAfterViewHorizontally : isElementBottomAfterViewTop);
-
- if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) {
- firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top);
- }
-
- let lastEdge = horizontal ? right : -1;
-
- for (let i = firstVisibleElementInd; i < numViews; i++) {
- const view = views[i],
- element = view.div;
- const currentWidth = element.offsetLeft + element.clientLeft;
- const currentHeight = element.offsetTop + element.clientTop;
- const viewWidth = element.clientWidth,
- viewHeight = element.clientHeight;
- const viewRight = currentWidth + viewWidth;
- const viewBottom = currentHeight + viewHeight;
-
- if (lastEdge === -1) {
- if (viewBottom >= bottom) {
- lastEdge = viewBottom;
- }
- } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {
- break;
- }
-
- if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) {
- continue;
- }
-
- const hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom);
- const hiddenWidth = Math.max(0, left - currentWidth) + Math.max(0, viewRight - right);
- const fractionHeight = (viewHeight - hiddenHeight) / viewHeight,
- fractionWidth = (viewWidth - hiddenWidth) / viewWidth;
- const percent = fractionHeight * fractionWidth * 100 | 0;
- visible.push({
- id: view.id,
- x: currentWidth,
- y: currentHeight,
- view,
- percent,
- widthPercent: fractionWidth * 100 | 0
- });
- }
-
- const first = visible[0],
- last = visible[visible.length - 1];
-
- if (sortByVisibility) {
- visible.sort(function (a, b) {
- const pc = a.percent - b.percent;
-
- if (Math.abs(pc) > 0.001) {
- return -pc;
- }
-
- return a.id - b.id;
- });
- }
-
- return {
- first,
- last,
- views: visible
- };
-}
-
-function noContextMenuHandler(evt) {
- evt.preventDefault();
-}
-
-function normalizeWheelEventDirection(evt) {
- let delta = Math.hypot(evt.deltaX, evt.deltaY);
- const angle = Math.atan2(evt.deltaY, evt.deltaX);
-
- if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {
- delta = -delta;
- }
-
- return delta;
-}
-
-function normalizeWheelEventDelta(evt) {
- let delta = normalizeWheelEventDirection(evt);
- const MOUSE_DOM_DELTA_PIXEL_MODE = 0;
- const MOUSE_DOM_DELTA_LINE_MODE = 1;
- const MOUSE_PIXELS_PER_LINE = 30;
- const MOUSE_LINES_PER_PAGE = 30;
-
- if (evt.deltaMode === MOUSE_DOM_DELTA_PIXEL_MODE) {
- delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;
- } else if (evt.deltaMode === MOUSE_DOM_DELTA_LINE_MODE) {
- delta /= MOUSE_LINES_PER_PAGE;
- }
-
- return delta;
-}
-
-function isValidRotation(angle) {
- return Number.isInteger(angle) && angle % 90 === 0;
-}
-
-function isValidScrollMode(mode) {
- return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN;
-}
-
-function isValidSpreadMode(mode) {
- return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN;
-}
-
-function isPortraitOrientation(size) {
- return size.width <= size.height;
-}
-
-const WaitOnType = {
- EVENT: "event",
- TIMEOUT: "timeout"
-};
-exports.WaitOnType = WaitOnType;
-
-function waitOnEventOrTimeout({
- target,
- name,
- delay = 0
-}) {
- return new Promise(function (resolve, reject) {
- if (typeof target !== "object" || !(name && typeof name === "string") || !(Number.isInteger(delay) && delay >= 0)) {
- throw new Error("waitOnEventOrTimeout - invalid parameters.");
- }
-
- function handler(type) {
- if (target instanceof EventBus) {
- target._off(name, eventHandler);
- } else {
- target.removeEventListener(name, eventHandler);
- }
-
- if (timeout) {
- clearTimeout(timeout);
- }
-
- resolve(type);
- }
-
- const eventHandler = handler.bind(null, WaitOnType.EVENT);
-
- if (target instanceof EventBus) {
- target._on(name, eventHandler);
- } else {
- target.addEventListener(name, eventHandler);
- }
-
- const timeoutHandler = handler.bind(null, WaitOnType.TIMEOUT);
- const timeout = setTimeout(timeoutHandler, delay);
- });
-}
-
-const animationStarted = new Promise(function (resolve) {
- window.requestAnimationFrame(resolve);
-});
-exports.animationStarted = animationStarted;
-
-function dispatchDOMEvent(eventName, args = null) {
- throw new Error("Not implemented: dispatchDOMEvent");
-}
-
-class EventBus {
- constructor(options) {
- this._listeners = Object.create(null);
- }
-
- on(eventName, listener, options = null) {
- this._on(eventName, listener, {
- external: true,
- once: options?.once
- });
- }
-
- off(eventName, listener, options = null) {
- this._off(eventName, listener, {
- external: true,
- once: options?.once
- });
- }
-
- dispatch(eventName) {
- const eventListeners = this._listeners[eventName];
-
- if (!eventListeners || eventListeners.length === 0) {
- return;
- }
-
- const args = Array.prototype.slice.call(arguments, 1);
- let externalListeners;
-
- for (const {
- listener,
- external,
- once
- } of eventListeners.slice(0)) {
- if (once) {
- this._off(eventName, listener);
- }
-
- if (external) {
- (externalListeners || (externalListeners = [])).push(listener);
- continue;
- }
-
- listener.apply(null, args);
- }
-
- if (externalListeners) {
- for (const listener of externalListeners) {
- listener.apply(null, args);
- }
-
- externalListeners = null;
- }
- }
-
- _on(eventName, listener, options = null) {
- var _this$_listeners;
-
- const eventListeners = (_this$_listeners = this._listeners)[eventName] || (_this$_listeners[eventName] = []);
- eventListeners.push({
- listener,
- external: options?.external === true,
- once: options?.once === true
- });
- }
-
- _off(eventName, listener, options = null) {
- const eventListeners = this._listeners[eventName];
-
- if (!eventListeners) {
- return;
- }
-
- for (let i = 0, ii = eventListeners.length; i < ii; i++) {
- if (eventListeners[i].listener === listener) {
- eventListeners.splice(i, 1);
- return;
- }
- }
- }
-
-}
-
-exports.EventBus = EventBus;
-
-function clamp(v, min, max) {
- return Math.min(Math.max(v, min), max);
-}
-
-class ProgressBar {
- constructor(id, {
- height,
- width,
- units
- } = {}) {
- this.visible = true;
- this.div = document.querySelector(id + " .progress");
- this.bar = this.div.parentNode;
- this.height = height || 100;
- this.width = width || 100;
- this.units = units || "%";
- this.div.style.height = this.height + this.units;
- this.percent = 0;
- }
-
- _updateBar() {
- if (this._indeterminate) {
- this.div.classList.add("indeterminate");
- this.div.style.width = this.width + this.units;
- return;
- }
-
- this.div.classList.remove("indeterminate");
- const progressSize = this.width * this._percent / 100;
- this.div.style.width = progressSize + this.units;
- }
-
- get percent() {
- return this._percent;
- }
-
- set percent(val) {
- this._indeterminate = isNaN(val);
- this._percent = clamp(val, 0, 100);
-
- this._updateBar();
- }
-
- setWidth(viewer) {
- if (!viewer) {
- return;
- }
-
- const container = viewer.parentNode;
- const scrollbarWidth = container.offsetWidth - viewer.offsetWidth;
-
- if (scrollbarWidth > 0) {
- const doc = document.documentElement;
- doc.style.setProperty(LOADINGBAR_END_OFFSET_VAR, `${scrollbarWidth}px`);
- }
- }
-
- hide() {
- if (!this.visible) {
- return;
- }
-
- this.visible = false;
- this.bar.classList.add("hidden");
- }
-
- show() {
- if (this.visible) {
- return;
- }
-
- this.visible = true;
- this.bar.classList.remove("hidden");
- }
-
-}
-
-exports.ProgressBar = ProgressBar;
-
-function moveToEndOfArray(arr, condition) {
- const moved = [],
- len = arr.length;
- let write = 0;
-
- for (let read = 0; read < len; ++read) {
- if (condition(arr[read])) {
- moved.push(arr[read]);
- } else {
- arr[write] = arr[read];
- ++write;
- }
- }
-
- for (let read = 0; write < len; ++read, ++write) {
- arr[write] = moved[read];
- }
-}
-
-function getActiveOrFocusedElement() {
- let curRoot = document;
- let curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus");
-
- while (curActiveOrFocused?.shadowRoot) {
- curRoot = curActiveOrFocused.shadowRoot;
- curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus");
- }
-
- return curActiveOrFocused;
-}
-
-function apiPageLayoutToSpreadMode(layout) {
- switch (layout) {
- case "SinglePage":
- case "OneColumn":
- return SpreadMode.NONE;
-
- case "TwoColumnLeft":
- case "TwoPageLeft":
- return SpreadMode.ODD;
-
- case "TwoColumnRight":
- case "TwoPageRight":
- return SpreadMode.EVEN;
- }
-
- return SpreadMode.NONE;
-}
-
-function apiPageModeToSidebarView(mode) {
- switch (mode) {
- case "UseNone":
- return SidebarView.NONE;
-
- case "UseThumbs":
- return SidebarView.THUMBS;
-
- case "UseOutlines":
- return SidebarView.OUTLINE;
-
- case "UseAttachments":
- return SidebarView.ATTACHMENTS;
-
- case "UseOC":
- return SidebarView.LAYERS;
- }
-
- return SidebarView.NONE;
-}
-
-/***/ }),
-/* 5 */
-/***/ ((module) => {
-
-
-
-let pdfjsLib;
-
-if (typeof window !== "undefined" && window["pdfjs-dist/build/pdf"]) {
- pdfjsLib = window["pdfjs-dist/build/pdf"];
-} else {
- pdfjsLib = require("../build/pdf.js");
-}
-
-module.exports = pdfjsLib;
-
-/***/ }),
-/* 6 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFCursorTools = exports.CursorTool = void 0;
-
-var _grab_to_pan = __webpack_require__(7);
-
-var _ui_utils = __webpack_require__(4);
-
-const CursorTool = {
- SELECT: 0,
- HAND: 1,
- ZOOM: 2
-};
-exports.CursorTool = CursorTool;
-
-class PDFCursorTools {
- constructor({
- container,
- eventBus,
- cursorToolOnLoad = CursorTool.SELECT
- }) {
- this.container = container;
- this.eventBus = eventBus;
- this.active = CursorTool.SELECT;
- this.activeBeforePresentationMode = null;
- this.handTool = new _grab_to_pan.GrabToPan({
- element: this.container
- });
-
- this._addEventListeners();
-
- Promise.resolve().then(() => {
- this.switchTool(cursorToolOnLoad);
- });
- }
-
- get activeTool() {
- return this.active;
- }
-
- switchTool(tool) {
- if (this.activeBeforePresentationMode !== null) {
- return;
- }
-
- if (tool === this.active) {
- return;
- }
-
- const disableActiveTool = () => {
- switch (this.active) {
- case CursorTool.SELECT:
- break;
-
- case CursorTool.HAND:
- this.handTool.deactivate();
- break;
-
- case CursorTool.ZOOM:
- }
- };
-
- switch (tool) {
- case CursorTool.SELECT:
- disableActiveTool();
- break;
-
- case CursorTool.HAND:
- disableActiveTool();
- this.handTool.activate();
- break;
-
- case CursorTool.ZOOM:
- default:
- console.error(`switchTool: "${tool}" is an unsupported value.`);
- return;
- }
-
- this.active = tool;
-
- this._dispatchEvent();
- }
-
- _dispatchEvent() {
- this.eventBus.dispatch("cursortoolchanged", {
- source: this,
- tool: this.active
- });
- }
-
- _addEventListeners() {
- this.eventBus._on("switchcursortool", evt => {
- this.switchTool(evt.tool);
- });
-
- this.eventBus._on("presentationmodechanged", evt => {
- switch (evt.state) {
- case _ui_utils.PresentationModeState.FULLSCREEN:
- {
- const previouslyActive = this.active;
- this.switchTool(CursorTool.SELECT);
- this.activeBeforePresentationMode = previouslyActive;
- break;
- }
-
- case _ui_utils.PresentationModeState.NORMAL:
- {
- const previouslyActive = this.activeBeforePresentationMode;
- this.activeBeforePresentationMode = null;
- this.switchTool(previouslyActive);
- break;
- }
- }
- });
- }
-
-}
-
-exports.PDFCursorTools = PDFCursorTools;
-
-/***/ }),
-/* 7 */
-/***/ ((__unused_webpack_module, exports) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.GrabToPan = GrabToPan;
-
-function GrabToPan(options) {
- this.element = options.element;
- this.document = options.element.ownerDocument;
-
- if (typeof options.ignoreTarget === "function") {
- this.ignoreTarget = options.ignoreTarget;
- }
-
- this.onActiveChanged = options.onActiveChanged;
- this.activate = this.activate.bind(this);
- this.deactivate = this.deactivate.bind(this);
- this.toggle = this.toggle.bind(this);
- this._onmousedown = this._onmousedown.bind(this);
- this._onmousemove = this._onmousemove.bind(this);
- this._endPan = this._endPan.bind(this);
- const overlay = this.overlay = document.createElement("div");
- overlay.className = "grab-to-pan-grabbing";
-}
-
-GrabToPan.prototype = {
- CSS_CLASS_GRAB: "grab-to-pan-grab",
- activate: function GrabToPan_activate() {
- if (!this.active) {
- this.active = true;
- this.element.addEventListener("mousedown", this._onmousedown, true);
- this.element.classList.add(this.CSS_CLASS_GRAB);
-
- if (this.onActiveChanged) {
- this.onActiveChanged(true);
- }
- }
- },
- deactivate: function GrabToPan_deactivate() {
- if (this.active) {
- this.active = false;
- this.element.removeEventListener("mousedown", this._onmousedown, true);
-
- this._endPan();
-
- this.element.classList.remove(this.CSS_CLASS_GRAB);
-
- if (this.onActiveChanged) {
- this.onActiveChanged(false);
- }
- }
- },
- toggle: function GrabToPan_toggle() {
- if (this.active) {
- this.deactivate();
- } else {
- this.activate();
- }
- },
- ignoreTarget: function GrabToPan_ignoreTarget(node) {
- return node.matches("a[href], a[href] *, input, textarea, button, button *, select, option");
- },
- _onmousedown: function GrabToPan__onmousedown(event) {
- if (event.button !== 0 || this.ignoreTarget(event.target)) {
- return;
- }
-
- if (event.originalTarget) {
- try {
- event.originalTarget.tagName;
- } catch (e) {
- return;
- }
- }
-
- this.scrollLeftStart = this.element.scrollLeft;
- this.scrollTopStart = this.element.scrollTop;
- this.clientXStart = event.clientX;
- this.clientYStart = event.clientY;
- this.document.addEventListener("mousemove", this._onmousemove, true);
- this.document.addEventListener("mouseup", this._endPan, true);
- this.element.addEventListener("scroll", this._endPan, true);
- event.preventDefault();
- event.stopPropagation();
- const focusedElement = document.activeElement;
-
- if (focusedElement && !focusedElement.contains(event.target)) {
- focusedElement.blur();
- }
- },
- _onmousemove: function GrabToPan__onmousemove(event) {
- this.element.removeEventListener("scroll", this._endPan, true);
-
- if (isLeftMouseReleased(event)) {
- this._endPan();
-
- return;
- }
-
- const xDiff = event.clientX - this.clientXStart;
- const yDiff = event.clientY - this.clientYStart;
- const scrollTop = this.scrollTopStart - yDiff;
- const scrollLeft = this.scrollLeftStart - xDiff;
-
- if (this.element.scrollTo) {
- this.element.scrollTo({
- top: scrollTop,
- left: scrollLeft,
- behavior: "instant"
- });
- } else {
- this.element.scrollTop = scrollTop;
- this.element.scrollLeft = scrollLeft;
- }
-
- if (!this.overlay.parentNode) {
- document.body.appendChild(this.overlay);
- }
- },
- _endPan: function GrabToPan__endPan() {
- this.element.removeEventListener("scroll", this._endPan, true);
- this.document.removeEventListener("mousemove", this._onmousemove, true);
- this.document.removeEventListener("mouseup", this._endPan, true);
- this.overlay.remove();
- }
-};
-
-function isLeftMouseReleased(event) {
- if ("buttons" in event) {
- return !(event.buttons & 1);
- }
-
- const chrome = window.chrome;
- const isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);
- const isSafari6plus = /Apple/.test(navigator.vendor) && /Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent);
-
- if (isChrome15OrOpera15plus || isSafari6plus) {
- return event.which === 0;
- }
-
- return false;
-}
-
-/***/ }),
-/* 8 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.RenderingStates = exports.PDFRenderingQueue = void 0;
-
-var _pdfjsLib = __webpack_require__(5);
-
-const CLEANUP_TIMEOUT = 30000;
-const RenderingStates = {
- INITIAL: 0,
- RUNNING: 1,
- PAUSED: 2,
- FINISHED: 3
-};
-exports.RenderingStates = RenderingStates;
-
-class PDFRenderingQueue {
- constructor() {
- this.pdfViewer = null;
- this.pdfThumbnailViewer = null;
- this.onIdle = null;
- this.highestPriorityPage = null;
- this.idleTimeout = null;
- this.printing = false;
- this.isThumbnailViewEnabled = false;
- }
-
- setViewer(pdfViewer) {
- this.pdfViewer = pdfViewer;
- }
-
- setThumbnailViewer(pdfThumbnailViewer) {
- this.pdfThumbnailViewer = pdfThumbnailViewer;
- }
-
- isHighestPriority(view) {
- return this.highestPriorityPage === view.renderingId;
- }
-
- renderHighestPriority(currentlyVisiblePages) {
- if (this.idleTimeout) {
- clearTimeout(this.idleTimeout);
- this.idleTimeout = null;
- }
-
- if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {
- return;
- }
-
- if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) {
- if (this.pdfThumbnailViewer.forceRendering()) {
- return;
- }
- }
-
- if (this.printing) {
- return;
- }
-
- if (this.onIdle) {
- this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);
- }
- }
-
- getHighestPriority(visible, views, scrolledDown) {
- const visibleViews = visible.views;
- const numVisible = visibleViews.length;
-
- if (numVisible === 0) {
- return null;
- }
-
- for (let i = 0; i < numVisible; ++i) {
- const view = visibleViews[i].view;
-
- if (!this.isViewFinished(view)) {
- return view;
- }
- }
-
- if (scrolledDown) {
- const nextPageIndex = visible.last.id;
-
- if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {
- return views[nextPageIndex];
- }
- } else {
- const previousPageIndex = visible.first.id - 2;
-
- if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) {
- return views[previousPageIndex];
- }
- }
-
- return null;
- }
-
- isViewFinished(view) {
- return view.renderingState === RenderingStates.FINISHED;
- }
-
- renderView(view) {
- switch (view.renderingState) {
- case RenderingStates.FINISHED:
- return false;
-
- case RenderingStates.PAUSED:
- this.highestPriorityPage = view.renderingId;
- view.resume();
- break;
-
- case RenderingStates.RUNNING:
- this.highestPriorityPage = view.renderingId;
- break;
-
- case RenderingStates.INITIAL:
- this.highestPriorityPage = view.renderingId;
- view.draw().finally(() => {
- this.renderHighestPriority();
- }).catch(reason => {
- if (reason instanceof _pdfjsLib.RenderingCancelledException) {
- return;
- }
-
- console.error(`renderView: "${reason}"`);
- });
- break;
- }
-
- return true;
- }
-
-}
-
-exports.PDFRenderingQueue = PDFRenderingQueue;
-
-/***/ }),
-/* 9 */
-/***/ ((__unused_webpack_module, exports) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.OverlayManager = void 0;
-
-class OverlayManager {
- constructor() {
- this._overlays = {};
- this._active = null;
- this._keyDownBound = this._keyDown.bind(this);
- }
-
- get active() {
- return this._active;
- }
-
- async register(name, element, callerCloseMethod = null, canForceClose = false) {
- let container;
-
- if (!name || !element || !(container = element.parentNode)) {
- throw new Error("Not enough parameters.");
- } else if (this._overlays[name]) {
- throw new Error("The overlay is already registered.");
- }
-
- this._overlays[name] = {
- element,
- container,
- callerCloseMethod,
- canForceClose
- };
- }
-
- async unregister(name) {
- if (!this._overlays[name]) {
- throw new Error("The overlay does not exist.");
- } else if (this._active === name) {
- throw new Error("The overlay cannot be removed while it is active.");
- }
-
- delete this._overlays[name];
- }
-
- async open(name) {
- if (!this._overlays[name]) {
- throw new Error("The overlay does not exist.");
- } else if (this._active) {
- if (this._overlays[name].canForceClose) {
- this._closeThroughCaller();
- } else if (this._active === name) {
- throw new Error("The overlay is already active.");
- } else {
- throw new Error("Another overlay is currently active.");
- }
- }
-
- this._active = name;
-
- this._overlays[this._active].element.classList.remove("hidden");
-
- this._overlays[this._active].container.classList.remove("hidden");
-
- window.addEventListener("keydown", this._keyDownBound);
- }
-
- async close(name) {
- if (!this._overlays[name]) {
- throw new Error("The overlay does not exist.");
- } else if (!this._active) {
- throw new Error("The overlay is currently not active.");
- } else if (this._active !== name) {
- throw new Error("Another overlay is currently active.");
- }
-
- this._overlays[this._active].container.classList.add("hidden");
-
- this._overlays[this._active].element.classList.add("hidden");
-
- this._active = null;
- window.removeEventListener("keydown", this._keyDownBound);
- }
-
- _keyDown(evt) {
- if (this._active && evt.keyCode === 27) {
- this._closeThroughCaller();
-
- evt.preventDefault();
- }
- }
-
- _closeThroughCaller() {
- if (this._overlays[this._active].callerCloseMethod) {
- this._overlays[this._active].callerCloseMethod();
- }
-
- if (this._active) {
- this.close(this._active);
- }
- }
-
-}
-
-exports.OverlayManager = OverlayManager;
-
-/***/ }),
-/* 10 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PasswordPrompt = void 0;
-
-var _pdfjsLib = __webpack_require__(5);
-
-class PasswordPrompt {
- constructor(options, overlayManager, l10n, isViewerEmbedded = false) {
- this.overlayName = options.overlayName;
- this.container = options.container;
- this.label = options.label;
- this.input = options.input;
- this.submitButton = options.submitButton;
- this.cancelButton = options.cancelButton;
- this.overlayManager = overlayManager;
- this.l10n = l10n;
- this._isViewerEmbedded = isViewerEmbedded;
- this.updateCallback = null;
- this.reason = null;
- this.submitButton.addEventListener("click", this.verify.bind(this));
- this.cancelButton.addEventListener("click", this.close.bind(this));
- this.input.addEventListener("keydown", e => {
- if (e.keyCode === 13) {
- this.verify();
- }
- });
- this.overlayManager.register(this.overlayName, this.container, this.close.bind(this), true);
- }
-
- async open() {
- await this.overlayManager.open(this.overlayName);
- const passwordIncorrect = this.reason === _pdfjsLib.PasswordResponses.INCORRECT_PASSWORD;
-
- if (!this._isViewerEmbedded || passwordIncorrect) {
- this.input.focus();
- }
-
- this.label.textContent = await this.l10n.get(`password_${passwordIncorrect ? "invalid" : "label"}`);
- }
-
- close() {
- this.overlayManager.close(this.overlayName).then(() => {
- this.input.value = "";
- });
- }
-
- verify() {
- const password = this.input.value;
-
- if (password?.length > 0) {
- this.close();
- this.updateCallback(password);
- }
- }
-
- setUpdateCallback(updateCallback, reason) {
- this.updateCallback = updateCallback;
- this.reason = reason;
- }
-
-}
-
-exports.PasswordPrompt = PasswordPrompt;
-
-/***/ }),
-/* 11 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFAttachmentViewer = void 0;
-
-var _pdfjsLib = __webpack_require__(5);
-
-var _base_tree_viewer = __webpack_require__(12);
-
-class PDFAttachmentViewer extends _base_tree_viewer.BaseTreeViewer {
- constructor(options) {
- super(options);
- this.downloadManager = options.downloadManager;
-
- this.eventBus._on("fileattachmentannotation", this._appendAttachment.bind(this));
- }
-
- reset(keepRenderedCapability = false) {
- super.reset();
- this._attachments = null;
-
- if (!keepRenderedCapability) {
- this._renderedCapability = (0, _pdfjsLib.createPromiseCapability)();
- }
-
- if (this._pendingDispatchEvent) {
- clearTimeout(this._pendingDispatchEvent);
- }
-
- this._pendingDispatchEvent = null;
- }
-
- _dispatchEvent(attachmentsCount) {
- this._renderedCapability.resolve();
-
- if (this._pendingDispatchEvent) {
- clearTimeout(this._pendingDispatchEvent);
- this._pendingDispatchEvent = null;
- }
-
- if (attachmentsCount === 0) {
- this._pendingDispatchEvent = setTimeout(() => {
- this.eventBus.dispatch("attachmentsloaded", {
- source: this,
- attachmentsCount: 0
- });
- this._pendingDispatchEvent = null;
- });
- return;
- }
-
- this.eventBus.dispatch("attachmentsloaded", {
- source: this,
- attachmentsCount
- });
- }
-
- _bindLink(element, {
- content,
- filename
- }) {
- element.onclick = () => {
- this.downloadManager.openOrDownloadData(element, content, filename);
- return false;
- };
- }
-
- render({
- attachments,
- keepRenderedCapability = false
- }) {
- if (this._attachments) {
- this.reset(keepRenderedCapability);
- }
-
- this._attachments = attachments || null;
-
- if (!attachments) {
- this._dispatchEvent(0);
-
- return;
- }
-
- const names = Object.keys(attachments).sort(function (a, b) {
- return a.toLowerCase().localeCompare(b.toLowerCase());
- });
- const fragment = document.createDocumentFragment();
- let attachmentsCount = 0;
-
- for (const name of names) {
- const item = attachments[name];
- const content = item.content,
- filename = (0, _pdfjsLib.getFilenameFromUrl)(item.filename);
- const div = document.createElement("div");
- div.className = "treeItem";
- const element = document.createElement("a");
-
- this._bindLink(element, {
- content,
- filename
- });
-
- element.textContent = this._normalizeTextContent(filename);
- div.appendChild(element);
- fragment.appendChild(div);
- attachmentsCount++;
- }
-
- this._finishRendering(fragment, attachmentsCount);
- }
-
- _appendAttachment({
- id,
- filename,
- content
- }) {
- const renderedPromise = this._renderedCapability.promise;
- renderedPromise.then(() => {
- if (renderedPromise !== this._renderedCapability.promise) {
- return;
- }
-
- let attachments = this._attachments;
-
- if (!attachments) {
- attachments = Object.create(null);
- } else {
- for (const name in attachments) {
- if (id === name) {
- return;
- }
- }
- }
-
- attachments[id] = {
- filename,
- content
- };
- this.render({
- attachments,
- keepRenderedCapability: true
- });
- });
- }
-
-}
-
-exports.PDFAttachmentViewer = PDFAttachmentViewer;
-
-/***/ }),
-/* 12 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.BaseTreeViewer = void 0;
-
-var _pdfjsLib = __webpack_require__(5);
-
-const TREEITEM_OFFSET_TOP = -100;
-const TREEITEM_SELECTED_CLASS = "selected";
-
-class BaseTreeViewer {
- constructor(options) {
- if (this.constructor === BaseTreeViewer) {
- throw new Error("Cannot initialize BaseTreeViewer.");
- }
-
- this.container = options.container;
- this.eventBus = options.eventBus;
- this.reset();
- }
-
- reset() {
- this._pdfDocument = null;
- this._lastToggleIsShow = true;
- this._currentTreeItem = null;
- this.container.textContent = "";
- this.container.classList.remove("treeWithDeepNesting");
- }
-
- _dispatchEvent(count) {
- throw new Error("Not implemented: _dispatchEvent");
- }
-
- _bindLink(element, params) {
- throw new Error("Not implemented: _bindLink");
- }
-
- _normalizeTextContent(str) {
- return (0, _pdfjsLib.removeNullCharacters)(str) || "\u2013";
- }
-
- _addToggleButton(div, hidden = false) {
- const toggler = document.createElement("div");
- toggler.className = "treeItemToggler";
-
- if (hidden) {
- toggler.classList.add("treeItemsHidden");
- }
-
- toggler.onclick = evt => {
- evt.stopPropagation();
- toggler.classList.toggle("treeItemsHidden");
-
- if (evt.shiftKey) {
- const shouldShowAll = !toggler.classList.contains("treeItemsHidden");
-
- this._toggleTreeItem(div, shouldShowAll);
- }
- };
-
- div.insertBefore(toggler, div.firstChild);
- }
-
- _toggleTreeItem(root, show = false) {
- this._lastToggleIsShow = show;
-
- for (const toggler of root.querySelectorAll(".treeItemToggler")) {
- toggler.classList.toggle("treeItemsHidden", !show);
- }
- }
-
- _toggleAllTreeItems() {
- this._toggleTreeItem(this.container, !this._lastToggleIsShow);
- }
-
- _finishRendering(fragment, count, hasAnyNesting = false) {
- if (hasAnyNesting) {
- this.container.classList.add("treeWithDeepNesting");
- this._lastToggleIsShow = !fragment.querySelector(".treeItemsHidden");
- }
-
- this.container.appendChild(fragment);
-
- this._dispatchEvent(count);
- }
-
- render(params) {
- throw new Error("Not implemented: render");
- }
-
- _updateCurrentTreeItem(treeItem = null) {
- if (this._currentTreeItem) {
- this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS);
-
- this._currentTreeItem = null;
- }
-
- if (treeItem) {
- treeItem.classList.add(TREEITEM_SELECTED_CLASS);
- this._currentTreeItem = treeItem;
- }
- }
-
- _scrollToCurrentTreeItem(treeItem) {
- if (!treeItem) {
- return;
- }
-
- let currentNode = treeItem.parentNode;
-
- while (currentNode && currentNode !== this.container) {
- if (currentNode.classList.contains("treeItem")) {
- const toggler = currentNode.firstElementChild;
- toggler?.classList.remove("treeItemsHidden");
- }
-
- currentNode = currentNode.parentNode;
- }
-
- this._updateCurrentTreeItem(treeItem);
-
- this.container.scrollTo(treeItem.offsetLeft, treeItem.offsetTop + TREEITEM_OFFSET_TOP);
- }
-
-}
-
-exports.BaseTreeViewer = BaseTreeViewer;
-
-/***/ }),
-/* 13 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFDocumentProperties = void 0;
-
-var _pdfjsLib = __webpack_require__(5);
-
-var _ui_utils = __webpack_require__(4);
-
-const DEFAULT_FIELD_CONTENT = "-";
-const NON_METRIC_LOCALES = ["en-us", "en-lr", "my"];
-const US_PAGE_NAMES = {
- "8.5x11": "Letter",
- "8.5x14": "Legal"
-};
-const METRIC_PAGE_NAMES = {
- "297x420": "A3",
- "210x297": "A4"
-};
-
-function getPageName(size, isPortrait, pageNames) {
- const width = isPortrait ? size.width : size.height;
- const height = isPortrait ? size.height : size.width;
- return pageNames[`${width}x${height}`];
-}
-
-class PDFDocumentProperties {
- constructor({
- overlayName,
- fields,
- container,
- closeButton
- }, overlayManager, eventBus, l10n) {
- this.overlayName = overlayName;
- this.fields = fields;
- this.container = container;
- this.overlayManager = overlayManager;
- this.l10n = l10n;
-
- this._reset();
-
- closeButton.addEventListener("click", this.close.bind(this));
- this.overlayManager.register(this.overlayName, this.container, this.close.bind(this));
-
- eventBus._on("pagechanging", evt => {
- this._currentPageNumber = evt.pageNumber;
- });
-
- eventBus._on("rotationchanging", evt => {
- this._pagesRotation = evt.pagesRotation;
- });
-
- this._isNonMetricLocale = true;
- l10n.getLanguage().then(locale => {
- this._isNonMetricLocale = NON_METRIC_LOCALES.includes(locale);
- });
- }
-
- async open() {
- const freezeFieldData = data => {
- Object.defineProperty(this, "fieldData", {
- value: Object.freeze(data),
- writable: false,
- enumerable: true,
- configurable: true
- });
- };
-
- await Promise.all([this.overlayManager.open(this.overlayName), this._dataAvailableCapability.promise]);
- const currentPageNumber = this._currentPageNumber;
- const pagesRotation = this._pagesRotation;
-
- if (this.fieldData && currentPageNumber === this.fieldData._currentPageNumber && pagesRotation === this.fieldData._pagesRotation) {
- this._updateUI();
-
- return;
- }
-
- const {
- info,
- contentDispositionFilename,
- contentLength
- } = await this.pdfDocument.getMetadata();
- const [fileName, fileSize, creationDate, modificationDate, pageSize, isLinearized] = await Promise.all([contentDispositionFilename || (0, _pdfjsLib.getPdfFilenameFromUrl)(this.url), this._parseFileSize(contentLength), this._parseDate(info.CreationDate), this._parseDate(info.ModDate), this.pdfDocument.getPage(currentPageNumber).then(pdfPage => {
- return this._parsePageSize((0, _ui_utils.getPageSizeInches)(pdfPage), pagesRotation);
- }), this._parseLinearization(info.IsLinearized)]);
- freezeFieldData({
- fileName,
- fileSize,
- title: info.Title,
- author: info.Author,
- subject: info.Subject,
- keywords: info.Keywords,
- creationDate,
- modificationDate,
- creator: info.Creator,
- producer: info.Producer,
- version: info.PDFFormatVersion,
- pageCount: this.pdfDocument.numPages,
- pageSize,
- linearized: isLinearized,
- _currentPageNumber: currentPageNumber,
- _pagesRotation: pagesRotation
- });
-
- this._updateUI();
-
- const {
- length
- } = await this.pdfDocument.getDownloadInfo();
-
- if (contentLength === length) {
- return;
- }
-
- const data = Object.assign(Object.create(null), this.fieldData);
- data.fileSize = await this._parseFileSize(length);
- freezeFieldData(data);
-
- this._updateUI();
- }
-
- close() {
- this.overlayManager.close(this.overlayName);
- }
-
- setDocument(pdfDocument, url = null) {
- if (this.pdfDocument) {
- this._reset();
-
- this._updateUI(true);
- }
-
- if (!pdfDocument) {
- return;
- }
-
- this.pdfDocument = pdfDocument;
- this.url = url;
-
- this._dataAvailableCapability.resolve();
- }
-
- _reset() {
- this.pdfDocument = null;
- this.url = null;
- delete this.fieldData;
- this._dataAvailableCapability = (0, _pdfjsLib.createPromiseCapability)();
- this._currentPageNumber = 1;
- this._pagesRotation = 0;
- }
-
- _updateUI(reset = false) {
- if (reset || !this.fieldData) {
- for (const id in this.fields) {
- this.fields[id].textContent = DEFAULT_FIELD_CONTENT;
- }
-
- return;
- }
-
- if (this.overlayManager.active !== this.overlayName) {
- return;
- }
-
- for (const id in this.fields) {
- const content = this.fieldData[id];
- this.fields[id].textContent = content || content === 0 ? content : DEFAULT_FIELD_CONTENT;
- }
- }
-
- async _parseFileSize(fileSize = 0) {
- const kb = fileSize / 1024,
- mb = kb / 1024;
-
- if (!kb) {
- return undefined;
- }
-
- return this.l10n.get(`document_properties_${mb >= 1 ? "mb" : "kb"}`, {
- size_mb: mb >= 1 && (+mb.toPrecision(3)).toLocaleString(),
- size_kb: mb < 1 && (+kb.toPrecision(3)).toLocaleString(),
- size_b: fileSize.toLocaleString()
- });
- }
-
- async _parsePageSize(pageSizeInches, pagesRotation) {
- if (!pageSizeInches) {
- return undefined;
- }
-
- if (pagesRotation % 180 !== 0) {
- pageSizeInches = {
- width: pageSizeInches.height,
- height: pageSizeInches.width
- };
- }
-
- const isPortrait = (0, _ui_utils.isPortraitOrientation)(pageSizeInches);
- let sizeInches = {
- width: Math.round(pageSizeInches.width * 100) / 100,
- height: Math.round(pageSizeInches.height * 100) / 100
- };
- let sizeMillimeters = {
- width: Math.round(pageSizeInches.width * 25.4 * 10) / 10,
- height: Math.round(pageSizeInches.height * 25.4 * 10) / 10
- };
- let rawName = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES);
-
- if (!rawName && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) {
- const exactMillimeters = {
- width: pageSizeInches.width * 25.4,
- height: pageSizeInches.height * 25.4
- };
- const intMillimeters = {
- width: Math.round(sizeMillimeters.width),
- height: Math.round(sizeMillimeters.height)
- };
-
- if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) {
- rawName = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES);
-
- if (rawName) {
- sizeInches = {
- width: Math.round(intMillimeters.width / 25.4 * 100) / 100,
- height: Math.round(intMillimeters.height / 25.4 * 100) / 100
- };
- sizeMillimeters = intMillimeters;
- }
- }
- }
-
- const [{
- width,
- height
- }, unit, name, orientation] = await Promise.all([this._isNonMetricLocale ? sizeInches : sizeMillimeters, this.l10n.get(`document_properties_page_size_unit_${this._isNonMetricLocale ? "inches" : "millimeters"}`), rawName && this.l10n.get(`document_properties_page_size_name_${rawName.toLowerCase()}`), this.l10n.get(`document_properties_page_size_orientation_${isPortrait ? "portrait" : "landscape"}`)]);
- return this.l10n.get(`document_properties_page_size_dimension_${name ? "name_" : ""}string`, {
- width: width.toLocaleString(),
- height: height.toLocaleString(),
- unit,
- name,
- orientation
- });
- }
-
- async _parseDate(inputDate) {
- const dateObject = _pdfjsLib.PDFDateString.toDateObject(inputDate);
-
- if (!dateObject) {
- return undefined;
- }
-
- return this.l10n.get("document_properties_date_string", {
- date: dateObject.toLocaleDateString(),
- time: dateObject.toLocaleTimeString()
- });
- }
-
- _parseLinearization(isLinearized) {
- return this.l10n.get(`document_properties_linearized_${isLinearized ? "yes" : "no"}`);
- }
-
-}
-
-exports.PDFDocumentProperties = PDFDocumentProperties;
-
-/***/ }),
-/* 14 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFFindBar = void 0;
-
-var _pdf_find_controller = __webpack_require__(15);
-
-const MATCHES_COUNT_LIMIT = 1000;
-
-class PDFFindBar {
- constructor(options, eventBus, l10n) {
- this.opened = false;
- this.bar = options.bar;
- this.toggleButton = options.toggleButton;
- this.findField = options.findField;
- this.highlightAll = options.highlightAllCheckbox;
- this.caseSensitive = options.caseSensitiveCheckbox;
- this.entireWord = options.entireWordCheckbox;
- this.findMsg = options.findMsg;
- this.findResultsCount = options.findResultsCount;
- this.findPreviousButton = options.findPreviousButton;
- this.findNextButton = options.findNextButton;
- this.eventBus = eventBus;
- this.l10n = l10n;
- this.toggleButton.addEventListener("click", () => {
- this.toggle();
- });
- this.findField.addEventListener("input", () => {
- this.dispatchEvent("");
- });
- this.bar.addEventListener("keydown", e => {
- switch (e.keyCode) {
- case 13:
- if (e.target === this.findField) {
- this.dispatchEvent("again", e.shiftKey);
- }
-
- break;
-
- case 27:
- this.close();
- break;
- }
- });
- this.findPreviousButton.addEventListener("click", () => {
- this.dispatchEvent("again", true);
- });
- this.findNextButton.addEventListener("click", () => {
- this.dispatchEvent("again", false);
- });
- this.highlightAll.addEventListener("click", () => {
- this.dispatchEvent("highlightallchange");
- });
- this.caseSensitive.addEventListener("click", () => {
- this.dispatchEvent("casesensitivitychange");
- });
- this.entireWord.addEventListener("click", () => {
- this.dispatchEvent("entirewordchange");
- });
-
- this.eventBus._on("resize", this._adjustWidth.bind(this));
- }
-
- reset() {
- this.updateUIState();
- }
-
- dispatchEvent(type, findPrev) {
- this.eventBus.dispatch("find", {
- source: this,
- type,
- query: this.findField.value,
- phraseSearch: true,
- caseSensitive: this.caseSensitive.checked,
- entireWord: this.entireWord.checked,
- highlightAll: this.highlightAll.checked,
- findPrevious: findPrev
- });
- }
-
- updateUIState(state, previous, matchesCount) {
- let findMsg = Promise.resolve("");
- let status = "";
-
- switch (state) {
- case _pdf_find_controller.FindState.FOUND:
- break;
-
- case _pdf_find_controller.FindState.PENDING:
- status = "pending";
- break;
-
- case _pdf_find_controller.FindState.NOT_FOUND:
- findMsg = this.l10n.get("find_not_found");
- status = "notFound";
- break;
-
- case _pdf_find_controller.FindState.WRAPPED:
- findMsg = this.l10n.get(`find_reached_${previous ? "top" : "bottom"}`);
- break;
- }
-
- this.findField.setAttribute("data-status", status);
- findMsg.then(msg => {
- this.findMsg.textContent = msg;
-
- this._adjustWidth();
- });
- this.updateResultsCount(matchesCount);
- }
-
- updateResultsCount({
- current = 0,
- total = 0
- } = {}) {
- const limit = MATCHES_COUNT_LIMIT;
- let matchCountMsg = Promise.resolve("");
-
- if (total > 0) {
- if (total > limit) {
- let key = "find_match_count_limit";
- matchCountMsg = this.l10n.get(key, {
- limit
- });
- } else {
- let key = "find_match_count";
- matchCountMsg = this.l10n.get(key, {
- current,
- total
- });
- }
- }
-
- matchCountMsg.then(msg => {
- this.findResultsCount.textContent = msg;
- this.findResultsCount.classList.toggle("hidden", !total);
-
- this._adjustWidth();
- });
- }
-
- open() {
- if (!this.opened) {
- this.opened = true;
- this.toggleButton.classList.add("toggled");
- this.toggleButton.setAttribute("aria-expanded", "true");
- this.bar.classList.remove("hidden");
- }
-
- this.findField.select();
- this.findField.focus();
-
- this._adjustWidth();
- }
-
- close() {
- if (!this.opened) {
- return;
- }
-
- this.opened = false;
- this.toggleButton.classList.remove("toggled");
- this.toggleButton.setAttribute("aria-expanded", "false");
- this.bar.classList.add("hidden");
- this.eventBus.dispatch("findbarclose", {
- source: this
- });
- }
-
- toggle() {
- if (this.opened) {
- this.close();
- } else {
- this.open();
- }
- }
-
- _adjustWidth() {
- if (!this.opened) {
- return;
- }
-
- this.bar.classList.remove("wrapContainers");
- const findbarHeight = this.bar.clientHeight;
- const inputContainerHeight = this.bar.firstElementChild.clientHeight;
-
- if (findbarHeight > inputContainerHeight) {
- this.bar.classList.add("wrapContainers");
- }
- }
-
-}
-
-exports.PDFFindBar = PDFFindBar;
-
-/***/ }),
-/* 15 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFFindController = exports.FindState = void 0;
-
-var _pdfjsLib = __webpack_require__(5);
-
-var _pdf_find_utils = __webpack_require__(16);
-
-var _ui_utils = __webpack_require__(4);
-
-const FindState = {
- FOUND: 0,
- NOT_FOUND: 1,
- WRAPPED: 2,
- PENDING: 3
-};
-exports.FindState = FindState;
-const FIND_TIMEOUT = 250;
-const MATCH_SCROLL_OFFSET_TOP = -50;
-const MATCH_SCROLL_OFFSET_LEFT = -400;
-const CHARACTERS_TO_NORMALIZE = {
- "\u2010": "-",
- "\u2018": "'",
- "\u2019": "'",
- "\u201A": "'",
- "\u201B": "'",
- "\u201C": '"',
- "\u201D": '"',
- "\u201E": '"',
- "\u201F": '"',
- "\u00BC": "1/4",
- "\u00BD": "1/2",
- "\u00BE": "3/4"
-};
-let normalizationRegex = null;
-
-function normalize(text) {
- if (!normalizationRegex) {
- const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join("");
- normalizationRegex = new RegExp(`[${replace}]`, "g");
- }
-
- let diffs = null;
- const normalizedText = text.replace(normalizationRegex, function (ch, index) {
- const normalizedCh = CHARACTERS_TO_NORMALIZE[ch],
- diff = normalizedCh.length - ch.length;
-
- if (diff !== 0) {
- (diffs || (diffs = [])).push([index, diff]);
- }
-
- return normalizedCh;
- });
- return [normalizedText, diffs];
-}
-
-function getOriginalIndex(matchIndex, diffs = null) {
- if (!diffs) {
- return matchIndex;
- }
-
- let totalDiff = 0;
-
- for (const [index, diff] of diffs) {
- const currentIndex = index + totalDiff;
-
- if (currentIndex >= matchIndex) {
- break;
- }
-
- if (currentIndex + diff > matchIndex) {
- totalDiff += matchIndex - currentIndex;
- break;
- }
-
- totalDiff += diff;
- }
-
- return matchIndex - totalDiff;
-}
-
-class PDFFindController {
- constructor({
- linkService,
- eventBus
- }) {
- this._linkService = linkService;
- this._eventBus = eventBus;
-
- this._reset();
-
- eventBus._on("findbarclose", this._onFindBarClose.bind(this));
- }
-
- get highlightMatches() {
- return this._highlightMatches;
- }
-
- get pageMatches() {
- return this._pageMatches;
- }
-
- get pageMatchesLength() {
- return this._pageMatchesLength;
- }
-
- get selected() {
- return this._selected;
- }
-
- get state() {
- return this._state;
- }
-
- setDocument(pdfDocument) {
- if (this._pdfDocument) {
- this._reset();
- }
-
- if (!pdfDocument) {
- return;
- }
-
- this._pdfDocument = pdfDocument;
-
- this._firstPageCapability.resolve();
- }
-
- executeCommand(cmd, state) {
- if (!state) {
- return;
- }
-
- const pdfDocument = this._pdfDocument;
-
- if (this._state === null || this._shouldDirtyMatch(cmd, state)) {
- this._dirtyMatch = true;
- }
-
- this._state = state;
-
- if (cmd !== "findhighlightallchange") {
- this._updateUIState(FindState.PENDING);
- }
-
- this._firstPageCapability.promise.then(() => {
- if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) {
- return;
- }
-
- this._extractText();
-
- const findbarClosed = !this._highlightMatches;
- const pendingTimeout = !!this._findTimeout;
-
- if (this._findTimeout) {
- clearTimeout(this._findTimeout);
- this._findTimeout = null;
- }
-
- if (cmd === "find") {
- this._findTimeout = setTimeout(() => {
- this._nextMatch();
-
- this._findTimeout = null;
- }, FIND_TIMEOUT);
- } else if (this._dirtyMatch) {
- this._nextMatch();
- } else if (cmd === "findagain") {
- this._nextMatch();
-
- if (findbarClosed && this._state.highlightAll) {
- this._updateAllPages();
- }
- } else if (cmd === "findhighlightallchange") {
- if (pendingTimeout) {
- this._nextMatch();
- } else {
- this._highlightMatches = true;
- }
-
- this._updateAllPages();
- } else {
- this._nextMatch();
- }
- });
- }
-
- scrollMatchIntoView({
- element = null,
- selectedLeft = 0,
- pageIndex = -1,
- matchIndex = -1
- }) {
- if (!this._scrollMatches || !element) {
- return;
- } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) {
- return;
- } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) {
- return;
- }
-
- this._scrollMatches = false;
- const spot = {
- top: MATCH_SCROLL_OFFSET_TOP,
- left: selectedLeft + MATCH_SCROLL_OFFSET_LEFT
- };
- (0, _ui_utils.scrollIntoView)(element, spot, true);
- }
-
- _reset() {
- this._highlightMatches = false;
- this._scrollMatches = false;
- this._pdfDocument = null;
- this._pageMatches = [];
- this._pageMatchesLength = [];
- this._state = null;
- this._selected = {
- pageIdx: -1,
- matchIdx: -1
- };
- this._offset = {
- pageIdx: null,
- matchIdx: null,
- wrapped: false
- };
- this._extractTextPromises = [];
- this._pageContents = [];
- this._pageDiffs = [];
- this._matchesCountTotal = 0;
- this._pagesToSearch = null;
- this._pendingFindMatches = new Set();
- this._resumePageIdx = null;
- this._dirtyMatch = false;
- clearTimeout(this._findTimeout);
- this._findTimeout = null;
- this._firstPageCapability = (0, _pdfjsLib.createPromiseCapability)();
- }
-
- get _query() {
- if (this._state.query !== this._rawQuery) {
- this._rawQuery = this._state.query;
- [this._normalizedQuery] = normalize(this._state.query);
- }
-
- return this._normalizedQuery;
- }
-
- _shouldDirtyMatch(cmd, state) {
- if (state.query !== this._state.query) {
- return true;
- }
-
- switch (cmd) {
- case "findagain":
- const pageNumber = this._selected.pageIdx + 1;
- const linkService = this._linkService;
-
- if (pageNumber >= 1 && pageNumber <= linkService.pagesCount && pageNumber !== linkService.page && !linkService.isPageVisible(pageNumber)) {
- return true;
- }
-
- return false;
-
- case "findhighlightallchange":
- return false;
- }
-
- return true;
- }
-
- _prepareMatches(matchesWithLength, matches, matchesLength) {
- function isSubTerm(currentIndex) {
- const currentElem = matchesWithLength[currentIndex];
- const nextElem = matchesWithLength[currentIndex + 1];
-
- if (currentIndex < matchesWithLength.length - 1 && currentElem.match === nextElem.match) {
- currentElem.skipped = true;
- return true;
- }
-
- for (let i = currentIndex - 1; i >= 0; i--) {
- const prevElem = matchesWithLength[i];
-
- if (prevElem.skipped) {
- continue;
- }
-
- if (prevElem.match + prevElem.matchLength < currentElem.match) {
- break;
- }
-
- if (prevElem.match + prevElem.matchLength >= currentElem.match + currentElem.matchLength) {
- currentElem.skipped = true;
- return true;
- }
- }
-
- return false;
- }
-
- matchesWithLength.sort(function (a, b) {
- return a.match === b.match ? a.matchLength - b.matchLength : a.match - b.match;
- });
-
- for (let i = 0, len = matchesWithLength.length; i < len; i++) {
- if (isSubTerm(i)) {
- continue;
- }
-
- matches.push(matchesWithLength[i].match);
- matchesLength.push(matchesWithLength[i].matchLength);
- }
- }
-
- _isEntireWord(content, startIdx, length) {
- if (startIdx > 0) {
- const first = content.charCodeAt(startIdx);
- const limit = content.charCodeAt(startIdx - 1);
-
- if ((0, _pdf_find_utils.getCharacterType)(first) === (0, _pdf_find_utils.getCharacterType)(limit)) {
- return false;
- }
- }
-
- const endIdx = startIdx + length - 1;
-
- if (endIdx < content.length - 1) {
- const last = content.charCodeAt(endIdx);
- const limit = content.charCodeAt(endIdx + 1);
-
- if ((0, _pdf_find_utils.getCharacterType)(last) === (0, _pdf_find_utils.getCharacterType)(limit)) {
- return false;
- }
- }
-
- return true;
- }
-
- _calculatePhraseMatch(query, pageIndex, pageContent, pageDiffs, entireWord) {
- const matches = [],
- matchesLength = [];
- const queryLen = query.length;
- let matchIdx = -queryLen;
-
- while (true) {
- matchIdx = pageContent.indexOf(query, matchIdx + queryLen);
-
- if (matchIdx === -1) {
- break;
- }
-
- if (entireWord && !this._isEntireWord(pageContent, matchIdx, queryLen)) {
- continue;
- }
-
- const originalMatchIdx = getOriginalIndex(matchIdx, pageDiffs),
- matchEnd = matchIdx + queryLen - 1,
- originalQueryLen = getOriginalIndex(matchEnd, pageDiffs) - originalMatchIdx + 1;
- matches.push(originalMatchIdx);
- matchesLength.push(originalQueryLen);
- }
-
- this._pageMatches[pageIndex] = matches;
- this._pageMatchesLength[pageIndex] = matchesLength;
- }
-
- _calculateWordMatch(query, pageIndex, pageContent, pageDiffs, entireWord) {
- const matchesWithLength = [];
- const queryArray = query.match(/\S+/g);
-
- for (let i = 0, len = queryArray.length; i < len; i++) {
- const subquery = queryArray[i];
- const subqueryLen = subquery.length;
- let matchIdx = -subqueryLen;
-
- while (true) {
- matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen);
-
- if (matchIdx === -1) {
- break;
- }
-
- if (entireWord && !this._isEntireWord(pageContent, matchIdx, subqueryLen)) {
- continue;
- }
-
- const originalMatchIdx = getOriginalIndex(matchIdx, pageDiffs),
- matchEnd = matchIdx + subqueryLen - 1,
- originalQueryLen = getOriginalIndex(matchEnd, pageDiffs) - originalMatchIdx + 1;
- matchesWithLength.push({
- match: originalMatchIdx,
- matchLength: originalQueryLen,
- skipped: false
- });
- }
- }
-
- this._pageMatchesLength[pageIndex] = [];
- this._pageMatches[pageIndex] = [];
-
- this._prepareMatches(matchesWithLength, this._pageMatches[pageIndex], this._pageMatchesLength[pageIndex]);
- }
-
- _calculateMatch(pageIndex) {
- let pageContent = this._pageContents[pageIndex];
- const pageDiffs = this._pageDiffs[pageIndex];
- let query = this._query;
- const {
- caseSensitive,
- entireWord,
- phraseSearch
- } = this._state;
-
- if (query.length === 0) {
- return;
- }
-
- if (!caseSensitive) {
- pageContent = pageContent.toLowerCase();
- query = query.toLowerCase();
- }
-
- if (phraseSearch) {
- this._calculatePhraseMatch(query, pageIndex, pageContent, pageDiffs, entireWord);
- } else {
- this._calculateWordMatch(query, pageIndex, pageContent, pageDiffs, entireWord);
- }
-
- if (this._state.highlightAll) {
- this._updatePage(pageIndex);
- }
-
- if (this._resumePageIdx === pageIndex) {
- this._resumePageIdx = null;
-
- this._nextPageMatch();
- }
-
- const pageMatchesCount = this._pageMatches[pageIndex].length;
-
- if (pageMatchesCount > 0) {
- this._matchesCountTotal += pageMatchesCount;
-
- this._updateUIResultsCount();
- }
- }
-
- _extractText() {
- if (this._extractTextPromises.length > 0) {
- return;
- }
-
- let promise = Promise.resolve();
-
- for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) {
- const extractTextCapability = (0, _pdfjsLib.createPromiseCapability)();
- this._extractTextPromises[i] = extractTextCapability.promise;
- promise = promise.then(() => {
- return this._pdfDocument.getPage(i + 1).then(pdfPage => {
- return pdfPage.getTextContent({
- normalizeWhitespace: true
- });
- }).then(textContent => {
- const textItems = textContent.items;
- const strBuf = [];
-
- for (let j = 0, jj = textItems.length; j < jj; j++) {
- strBuf.push(textItems[j].str);
- }
-
- [this._pageContents[i], this._pageDiffs[i]] = normalize(strBuf.join(""));
- extractTextCapability.resolve(i);
- }, reason => {
- console.error(`Unable to get text content for page ${i + 1}`, reason);
- this._pageContents[i] = "";
- this._pageDiffs[i] = null;
- extractTextCapability.resolve(i);
- });
- });
- }
- }
-
- _updatePage(index) {
- if (this._scrollMatches && this._selected.pageIdx === index) {
- this._linkService.page = index + 1;
- }
-
- this._eventBus.dispatch("updatetextlayermatches", {
- source: this,
- pageIndex: index
- });
- }
-
- _updateAllPages() {
- this._eventBus.dispatch("updatetextlayermatches", {
- source: this,
- pageIndex: -1
- });
- }
-
- _nextMatch() {
- const previous = this._state.findPrevious;
- const currentPageIndex = this._linkService.page - 1;
- const numPages = this._linkService.pagesCount;
- this._highlightMatches = true;
-
- if (this._dirtyMatch) {
- this._dirtyMatch = false;
- this._selected.pageIdx = this._selected.matchIdx = -1;
- this._offset.pageIdx = currentPageIndex;
- this._offset.matchIdx = null;
- this._offset.wrapped = false;
- this._resumePageIdx = null;
- this._pageMatches.length = 0;
- this._pageMatchesLength.length = 0;
- this._matchesCountTotal = 0;
-
- this._updateAllPages();
-
- for (let i = 0; i < numPages; i++) {
- if (this._pendingFindMatches.has(i)) {
- continue;
- }
-
- this._pendingFindMatches.add(i);
-
- this._extractTextPromises[i].then(pageIdx => {
- this._pendingFindMatches.delete(pageIdx);
-
- this._calculateMatch(pageIdx);
- });
- }
- }
-
- if (this._query === "") {
- this._updateUIState(FindState.FOUND);
-
- return;
- }
-
- if (this._resumePageIdx) {
- return;
- }
-
- const offset = this._offset;
- this._pagesToSearch = numPages;
-
- if (offset.matchIdx !== null) {
- const numPageMatches = this._pageMatches[offset.pageIdx].length;
-
- if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) {
- offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;
-
- this._updateMatch(true);
-
- return;
- }
-
- this._advanceOffsetPage(previous);
- }
-
- this._nextPageMatch();
- }
-
- _matchesReady(matches) {
- const offset = this._offset;
- const numMatches = matches.length;
- const previous = this._state.findPrevious;
-
- if (numMatches) {
- offset.matchIdx = previous ? numMatches - 1 : 0;
-
- this._updateMatch(true);
-
- return true;
- }
-
- this._advanceOffsetPage(previous);
-
- if (offset.wrapped) {
- offset.matchIdx = null;
-
- if (this._pagesToSearch < 0) {
- this._updateMatch(false);
-
- return true;
- }
- }
-
- return false;
- }
-
- _nextPageMatch() {
- if (this._resumePageIdx !== null) {
- console.error("There can only be one pending page.");
- }
-
- let matches = null;
-
- do {
- const pageIdx = this._offset.pageIdx;
- matches = this._pageMatches[pageIdx];
-
- if (!matches) {
- this._resumePageIdx = pageIdx;
- break;
- }
- } while (!this._matchesReady(matches));
- }
-
- _advanceOffsetPage(previous) {
- const offset = this._offset;
- const numPages = this._linkService.pagesCount;
- offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;
- offset.matchIdx = null;
- this._pagesToSearch--;
-
- if (offset.pageIdx >= numPages || offset.pageIdx < 0) {
- offset.pageIdx = previous ? numPages - 1 : 0;
- offset.wrapped = true;
- }
- }
-
- _updateMatch(found = false) {
- let state = FindState.NOT_FOUND;
- const wrapped = this._offset.wrapped;
- this._offset.wrapped = false;
-
- if (found) {
- const previousPage = this._selected.pageIdx;
- this._selected.pageIdx = this._offset.pageIdx;
- this._selected.matchIdx = this._offset.matchIdx;
- state = wrapped ? FindState.WRAPPED : FindState.FOUND;
-
- if (previousPage !== -1 && previousPage !== this._selected.pageIdx) {
- this._updatePage(previousPage);
- }
- }
-
- this._updateUIState(state, this._state.findPrevious);
-
- if (this._selected.pageIdx !== -1) {
- this._scrollMatches = true;
-
- this._updatePage(this._selected.pageIdx);
- }
- }
-
- _onFindBarClose(evt) {
- const pdfDocument = this._pdfDocument;
-
- this._firstPageCapability.promise.then(() => {
- if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) {
- return;
- }
-
- if (this._findTimeout) {
- clearTimeout(this._findTimeout);
- this._findTimeout = null;
- }
-
- if (this._resumePageIdx) {
- this._resumePageIdx = null;
- this._dirtyMatch = true;
- }
-
- this._updateUIState(FindState.FOUND);
-
- this._highlightMatches = false;
-
- this._updateAllPages();
- });
- }
-
- _requestMatchesCount() {
- const {
- pageIdx,
- matchIdx
- } = this._selected;
- let current = 0,
- total = this._matchesCountTotal;
-
- if (matchIdx !== -1) {
- for (let i = 0; i < pageIdx; i++) {
- current += this._pageMatches[i]?.length || 0;
- }
-
- current += matchIdx + 1;
- }
-
- if (current < 1 || current > total) {
- current = total = 0;
- }
-
- return {
- current,
- total
- };
- }
-
- _updateUIResultsCount() {
- this._eventBus.dispatch("updatefindmatchescount", {
- source: this,
- matchesCount: this._requestMatchesCount()
- });
- }
-
- _updateUIState(state, previous) {
- this._eventBus.dispatch("updatefindcontrolstate", {
- source: this,
- state,
- previous,
- matchesCount: this._requestMatchesCount(),
- rawQuery: this._state?.query ?? null
- });
- }
-
-}
-
-exports.PDFFindController = PDFFindController;
-
-/***/ }),
-/* 16 */
-/***/ ((__unused_webpack_module, exports) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.getCharacterType = getCharacterType;
-exports.CharacterType = void 0;
-const CharacterType = {
- SPACE: 0,
- ALPHA_LETTER: 1,
- PUNCT: 2,
- HAN_LETTER: 3,
- KATAKANA_LETTER: 4,
- HIRAGANA_LETTER: 5,
- HALFWIDTH_KATAKANA_LETTER: 6,
- THAI_LETTER: 7
-};
-exports.CharacterType = CharacterType;
-
-function isAlphabeticalScript(charCode) {
- return charCode < 0x2e80;
-}
-
-function isAscii(charCode) {
- return (charCode & 0xff80) === 0;
-}
-
-function isAsciiAlpha(charCode) {
- return charCode >= 0x61 && charCode <= 0x7a || charCode >= 0x41 && charCode <= 0x5a;
-}
-
-function isAsciiDigit(charCode) {
- return charCode >= 0x30 && charCode <= 0x39;
-}
-
-function isAsciiSpace(charCode) {
- return charCode === 0x20 || charCode === 0x09 || charCode === 0x0d || charCode === 0x0a;
-}
-
-function isHan(charCode) {
- return charCode >= 0x3400 && charCode <= 0x9fff || charCode >= 0xf900 && charCode <= 0xfaff;
-}
-
-function isKatakana(charCode) {
- return charCode >= 0x30a0 && charCode <= 0x30ff;
-}
-
-function isHiragana(charCode) {
- return charCode >= 0x3040 && charCode <= 0x309f;
-}
-
-function isHalfwidthKatakana(charCode) {
- return charCode >= 0xff60 && charCode <= 0xff9f;
-}
-
-function isThai(charCode) {
- return (charCode & 0xff80) === 0x0e00;
-}
-
-function getCharacterType(charCode) {
- if (isAlphabeticalScript(charCode)) {
- if (isAscii(charCode)) {
- if (isAsciiSpace(charCode)) {
- return CharacterType.SPACE;
- } else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) || charCode === 0x5f) {
- return CharacterType.ALPHA_LETTER;
- }
-
- return CharacterType.PUNCT;
- } else if (isThai(charCode)) {
- return CharacterType.THAI_LETTER;
- } else if (charCode === 0xa0) {
- return CharacterType.SPACE;
- }
-
- return CharacterType.ALPHA_LETTER;
- }
-
- if (isHan(charCode)) {
- return CharacterType.HAN_LETTER;
- } else if (isKatakana(charCode)) {
- return CharacterType.KATAKANA_LETTER;
- } else if (isHiragana(charCode)) {
- return CharacterType.HIRAGANA_LETTER;
- } else if (isHalfwidthKatakana(charCode)) {
- return CharacterType.HALFWIDTH_KATAKANA_LETTER;
- }
-
- return CharacterType.ALPHA_LETTER;
-}
-
-/***/ }),
-/* 17 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.isDestArraysEqual = isDestArraysEqual;
-exports.isDestHashesEqual = isDestHashesEqual;
-exports.PDFHistory = void 0;
-
-var _ui_utils = __webpack_require__(4);
-
-const HASH_CHANGE_TIMEOUT = 1000;
-const POSITION_UPDATED_THRESHOLD = 50;
-const UPDATE_VIEWAREA_TIMEOUT = 1000;
-
-function getCurrentHash() {
- return document.location.hash;
-}
-
-class PDFHistory {
- constructor({
- linkService,
- eventBus
- }) {
- this.linkService = linkService;
- this.eventBus = eventBus;
- this._initialized = false;
- this._fingerprint = "";
- this.reset();
- this._boundEvents = null;
- this._isViewerInPresentationMode = false;
-
- this.eventBus._on("presentationmodechanged", evt => {
- this._isViewerInPresentationMode = evt.state !== _ui_utils.PresentationModeState.NORMAL;
- });
-
- this.eventBus._on("pagesinit", () => {
- this._isPagesLoaded = false;
-
- this.eventBus._on("pagesloaded", evt => {
- this._isPagesLoaded = !!evt.pagesCount;
- }, {
- once: true
- });
- });
- }
-
- initialize({
- fingerprint,
- resetHistory = false,
- updateUrl = false
- }) {
- if (!fingerprint || typeof fingerprint !== "string") {
- console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.');
- return;
- }
-
- if (this._initialized) {
- this.reset();
- }
-
- const reInitialized = this._fingerprint !== "" && this._fingerprint !== fingerprint;
- this._fingerprint = fingerprint;
- this._updateUrl = updateUrl === true;
- this._initialized = true;
-
- this._bindEvents();
-
- const state = window.history.state;
- this._popStateInProgress = false;
- this._blockHashChange = 0;
- this._currentHash = getCurrentHash();
- this._numPositionUpdates = 0;
- this._uid = this._maxUid = 0;
- this._destination = null;
- this._position = null;
-
- if (!this._isValidState(state, true) || resetHistory) {
- const {
- hash,
- page,
- rotation
- } = this._parseCurrentHash(true);
-
- if (!hash || reInitialized || resetHistory) {
- this._pushOrReplaceState(null, true);
-
- return;
- }
-
- this._pushOrReplaceState({
- hash,
- page,
- rotation
- }, true);
-
- return;
- }
-
- const destination = state.destination;
-
- this._updateInternalState(destination, state.uid, true);
-
- if (destination.rotation !== undefined) {
- this._initialRotation = destination.rotation;
- }
-
- if (destination.dest) {
- this._initialBookmark = JSON.stringify(destination.dest);
- this._destination.page = null;
- } else if (destination.hash) {
- this._initialBookmark = destination.hash;
- } else if (destination.page) {
- this._initialBookmark = `page=${destination.page}`;
- }
- }
-
- reset() {
- if (this._initialized) {
- this._pageHide();
-
- this._initialized = false;
-
- this._unbindEvents();
- }
-
- if (this._updateViewareaTimeout) {
- clearTimeout(this._updateViewareaTimeout);
- this._updateViewareaTimeout = null;
- }
-
- this._initialBookmark = null;
- this._initialRotation = null;
- }
-
- push({
- namedDest = null,
- explicitDest,
- pageNumber
- }) {
- if (!this._initialized) {
- return;
- }
-
- if (namedDest && typeof namedDest !== "string") {
- console.error("PDFHistory.push: " + `"${namedDest}" is not a valid namedDest parameter.`);
- return;
- } else if (!Array.isArray(explicitDest)) {
- console.error("PDFHistory.push: " + `"${explicitDest}" is not a valid explicitDest parameter.`);
- return;
- } else if (!this._isValidPage(pageNumber)) {
- if (pageNumber !== null || this._destination) {
- console.error("PDFHistory.push: " + `"${pageNumber}" is not a valid pageNumber parameter.`);
- return;
- }
- }
-
- const hash = namedDest || JSON.stringify(explicitDest);
-
- if (!hash) {
- return;
- }
-
- let forceReplace = false;
-
- if (this._destination && (isDestHashesEqual(this._destination.hash, hash) || isDestArraysEqual(this._destination.dest, explicitDest))) {
- if (this._destination.page) {
- return;
- }
-
- forceReplace = true;
- }
-
- if (this._popStateInProgress && !forceReplace) {
- return;
- }
-
- this._pushOrReplaceState({
- dest: explicitDest,
- hash,
- page: pageNumber,
- rotation: this.linkService.rotation
- }, forceReplace);
-
- if (!this._popStateInProgress) {
- this._popStateInProgress = true;
- Promise.resolve().then(() => {
- this._popStateInProgress = false;
- });
- }
- }
-
- pushPage(pageNumber) {
- if (!this._initialized) {
- return;
- }
-
- if (!this._isValidPage(pageNumber)) {
- console.error(`PDFHistory.pushPage: "${pageNumber}" is not a valid page number.`);
- return;
- }
-
- if (this._destination?.page === pageNumber) {
- return;
- }
-
- if (this._popStateInProgress) {
- return;
- }
-
- this._pushOrReplaceState({
- dest: null,
- hash: `page=${pageNumber}`,
- page: pageNumber,
- rotation: this.linkService.rotation
- });
-
- if (!this._popStateInProgress) {
- this._popStateInProgress = true;
- Promise.resolve().then(() => {
- this._popStateInProgress = false;
- });
- }
- }
-
- pushCurrentPosition() {
- if (!this._initialized || this._popStateInProgress) {
- return;
- }
-
- this._tryPushCurrentPosition();
- }
-
- back() {
- if (!this._initialized || this._popStateInProgress) {
- return;
- }
-
- const state = window.history.state;
-
- if (this._isValidState(state) && state.uid > 0) {
- window.history.back();
- }
- }
-
- forward() {
- if (!this._initialized || this._popStateInProgress) {
- return;
- }
-
- const state = window.history.state;
-
- if (this._isValidState(state) && state.uid < this._maxUid) {
- window.history.forward();
- }
- }
-
- get popStateInProgress() {
- return this._initialized && (this._popStateInProgress || this._blockHashChange > 0);
- }
-
- get initialBookmark() {
- return this._initialized ? this._initialBookmark : null;
- }
-
- get initialRotation() {
- return this._initialized ? this._initialRotation : null;
- }
-
- _pushOrReplaceState(destination, forceReplace = false) {
- const shouldReplace = forceReplace || !this._destination;
- const newState = {
- fingerprint: this._fingerprint,
- uid: shouldReplace ? this._uid : this._uid + 1,
- destination
- };
-
- this._updateInternalState(destination, newState.uid);
-
- let newUrl;
-
- if (this._updateUrl && destination?.hash) {
- const baseUrl = document.location.href.split("#")[0];
-
- if (!baseUrl.startsWith("file://")) {
- newUrl = `${baseUrl}#${destination.hash}`;
- }
- }
-
- if (shouldReplace) {
- window.history.replaceState(newState, "", newUrl);
- } else {
- window.history.pushState(newState, "", newUrl);
- }
- }
-
- _tryPushCurrentPosition(temporary = false) {
- if (!this._position) {
- return;
- }
-
- let position = this._position;
-
- if (temporary) {
- position = Object.assign(Object.create(null), this._position);
- position.temporary = true;
- }
-
- if (!this._destination) {
- this._pushOrReplaceState(position);
-
- return;
- }
-
- if (this._destination.temporary) {
- this._pushOrReplaceState(position, true);
-
- return;
- }
-
- if (this._destination.hash === position.hash) {
- return;
- }
-
- if (!this._destination.page && (POSITION_UPDATED_THRESHOLD <= 0 || this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)) {
- return;
- }
-
- let forceReplace = false;
-
- if (this._destination.page >= position.first && this._destination.page <= position.page) {
- if (this._destination.dest !== undefined || !this._destination.first) {
- return;
- }
-
- forceReplace = true;
- }
-
- this._pushOrReplaceState(position, forceReplace);
- }
-
- _isValidPage(val) {
- return Number.isInteger(val) && val > 0 && val <= this.linkService.pagesCount;
- }
-
- _isValidState(state, checkReload = false) {
- if (!state) {
- return false;
- }
-
- if (state.fingerprint !== this._fingerprint) {
- if (checkReload) {
- if (typeof state.fingerprint !== "string" || state.fingerprint.length !== this._fingerprint.length) {
- return false;
- }
-
- const [perfEntry] = performance.getEntriesByType("navigation");
-
- if (perfEntry?.type !== "reload") {
- return false;
- }
- } else {
- return false;
- }
- }
-
- if (!Number.isInteger(state.uid) || state.uid < 0) {
- return false;
- }
-
- if (state.destination === null || typeof state.destination !== "object") {
- return false;
- }
-
- return true;
- }
-
- _updateInternalState(destination, uid, removeTemporary = false) {
- if (this._updateViewareaTimeout) {
- clearTimeout(this._updateViewareaTimeout);
- this._updateViewareaTimeout = null;
- }
-
- if (removeTemporary && destination?.temporary) {
- delete destination.temporary;
- }
-
- this._destination = destination;
- this._uid = uid;
- this._maxUid = Math.max(this._maxUid, uid);
- this._numPositionUpdates = 0;
- }
-
- _parseCurrentHash(checkNameddest = false) {
- const hash = unescape(getCurrentHash()).substring(1);
- const params = (0, _ui_utils.parseQueryString)(hash);
- const nameddest = params.nameddest || "";
- let page = params.page | 0;
-
- if (!this._isValidPage(page) || checkNameddest && nameddest.length > 0) {
- page = null;
- }
-
- return {
- hash,
- page,
- rotation: this.linkService.rotation
- };
- }
-
- _updateViewarea({
- location
- }) {
- if (this._updateViewareaTimeout) {
- clearTimeout(this._updateViewareaTimeout);
- this._updateViewareaTimeout = null;
- }
-
- this._position = {
- hash: this._isViewerInPresentationMode ? `page=${location.pageNumber}` : location.pdfOpenParams.substring(1),
- page: this.linkService.page,
- first: location.pageNumber,
- rotation: location.rotation
- };
-
- if (this._popStateInProgress) {
- return;
- }
-
- if (POSITION_UPDATED_THRESHOLD > 0 && this._isPagesLoaded && this._destination && !this._destination.page) {
- this._numPositionUpdates++;
- }
-
- if (UPDATE_VIEWAREA_TIMEOUT > 0) {
- this._updateViewareaTimeout = setTimeout(() => {
- if (!this._popStateInProgress) {
- this._tryPushCurrentPosition(true);
- }
-
- this._updateViewareaTimeout = null;
- }, UPDATE_VIEWAREA_TIMEOUT);
- }
- }
-
- _popState({
- state
- }) {
- const newHash = getCurrentHash(),
- hashChanged = this._currentHash !== newHash;
- this._currentHash = newHash;
-
- if (!state) {
- this._uid++;
-
- const {
- hash,
- page,
- rotation
- } = this._parseCurrentHash();
-
- this._pushOrReplaceState({
- hash,
- page,
- rotation
- }, true);
-
- return;
- }
-
- if (!this._isValidState(state)) {
- return;
- }
-
- this._popStateInProgress = true;
-
- if (hashChanged) {
- this._blockHashChange++;
- (0, _ui_utils.waitOnEventOrTimeout)({
- target: window,
- name: "hashchange",
- delay: HASH_CHANGE_TIMEOUT
- }).then(() => {
- this._blockHashChange--;
- });
- }
-
- const destination = state.destination;
-
- this._updateInternalState(destination, state.uid, true);
-
- if ((0, _ui_utils.isValidRotation)(destination.rotation)) {
- this.linkService.rotation = destination.rotation;
- }
-
- if (destination.dest) {
- this.linkService.goToDestination(destination.dest);
- } else if (destination.hash) {
- this.linkService.setHash(destination.hash);
- } else if (destination.page) {
- this.linkService.page = destination.page;
- }
-
- Promise.resolve().then(() => {
- this._popStateInProgress = false;
- });
- }
-
- _pageHide() {
- if (!this._destination || this._destination.temporary) {
- this._tryPushCurrentPosition();
- }
- }
-
- _bindEvents() {
- if (this._boundEvents) {
- return;
- }
-
- this._boundEvents = {
- updateViewarea: this._updateViewarea.bind(this),
- popState: this._popState.bind(this),
- pageHide: this._pageHide.bind(this)
- };
-
- this.eventBus._on("updateviewarea", this._boundEvents.updateViewarea);
-
- window.addEventListener("popstate", this._boundEvents.popState);
- window.addEventListener("pagehide", this._boundEvents.pageHide);
- }
-
- _unbindEvents() {
- if (!this._boundEvents) {
- return;
- }
-
- this.eventBus._off("updateviewarea", this._boundEvents.updateViewarea);
-
- window.removeEventListener("popstate", this._boundEvents.popState);
- window.removeEventListener("pagehide", this._boundEvents.pageHide);
- this._boundEvents = null;
- }
-
-}
-
-exports.PDFHistory = PDFHistory;
-
-function isDestHashesEqual(destHash, pushHash) {
- if (typeof destHash !== "string" || typeof pushHash !== "string") {
- return false;
- }
-
- if (destHash === pushHash) {
- return true;
- }
-
- const {
- nameddest
- } = (0, _ui_utils.parseQueryString)(destHash);
-
- if (nameddest === pushHash) {
- return true;
- }
-
- return false;
-}
-
-function isDestArraysEqual(firstDest, secondDest) {
- function isEntryEqual(first, second) {
- if (typeof first !== typeof second) {
- return false;
- }
-
- if (Array.isArray(first) || Array.isArray(second)) {
- return false;
- }
-
- if (first !== null && typeof first === "object" && second !== null) {
- if (Object.keys(first).length !== Object.keys(second).length) {
- return false;
- }
-
- for (const key in first) {
- if (!isEntryEqual(first[key], second[key])) {
- return false;
- }
- }
-
- return true;
- }
-
- return first === second || Number.isNaN(first) && Number.isNaN(second);
- }
-
- if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) {
- return false;
- }
-
- if (firstDest.length !== secondDest.length) {
- return false;
- }
-
- for (let i = 0, ii = firstDest.length; i < ii; i++) {
- if (!isEntryEqual(firstDest[i], secondDest[i])) {
- return false;
- }
- }
-
- return true;
-}
-
-/***/ }),
-/* 18 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFLayerViewer = void 0;
-
-var _base_tree_viewer = __webpack_require__(12);
-
-class PDFLayerViewer extends _base_tree_viewer.BaseTreeViewer {
- constructor(options) {
- super(options);
- this.l10n = options.l10n;
-
- this.eventBus._on("resetlayers", this._resetLayers.bind(this));
-
- this.eventBus._on("togglelayerstree", this._toggleAllTreeItems.bind(this));
- }
-
- reset() {
- super.reset();
- this._optionalContentConfig = null;
- }
-
- _dispatchEvent(layersCount) {
- this.eventBus.dispatch("layersloaded", {
- source: this,
- layersCount
- });
- }
-
- _bindLink(element, {
- groupId,
- input
- }) {
- const setVisibility = () => {
- this._optionalContentConfig.setVisibility(groupId, input.checked);
-
- this.eventBus.dispatch("optionalcontentconfig", {
- source: this,
- promise: Promise.resolve(this._optionalContentConfig)
- });
- };
-
- element.onclick = evt => {
- if (evt.target === input) {
- setVisibility();
- return true;
- } else if (evt.target !== element) {
- return true;
- }
-
- input.checked = !input.checked;
- setVisibility();
- return false;
- };
- }
-
- async _setNestedName(element, {
- name = null
- }) {
- if (typeof name === "string") {
- element.textContent = this._normalizeTextContent(name);
- return;
- }
-
- element.textContent = await this.l10n.get("additional_layers");
- element.style.fontStyle = "italic";
- }
-
- _addToggleButton(div, {
- name = null
- }) {
- super._addToggleButton(div, name === null);
- }
-
- _toggleAllTreeItems() {
- if (!this._optionalContentConfig) {
- return;
- }
-
- super._toggleAllTreeItems();
- }
-
- render({
- optionalContentConfig,
- pdfDocument
- }) {
- if (this._optionalContentConfig) {
- this.reset();
- }
-
- this._optionalContentConfig = optionalContentConfig || null;
- this._pdfDocument = pdfDocument || null;
- const groups = optionalContentConfig?.getOrder();
-
- if (!groups) {
- this._dispatchEvent(0);
-
- return;
- }
-
- const fragment = document.createDocumentFragment(),
- queue = [{
- parent: fragment,
- groups
- }];
- let layersCount = 0,
- hasAnyNesting = false;
-
- while (queue.length > 0) {
- const levelData = queue.shift();
-
- for (const groupId of levelData.groups) {
- const div = document.createElement("div");
- div.className = "treeItem";
- const element = document.createElement("a");
- div.appendChild(element);
-
- if (typeof groupId === "object") {
- hasAnyNesting = true;
-
- this._addToggleButton(div, groupId);
-
- this._setNestedName(element, groupId);
-
- const itemsDiv = document.createElement("div");
- itemsDiv.className = "treeItems";
- div.appendChild(itemsDiv);
- queue.push({
- parent: itemsDiv,
- groups: groupId.order
- });
- } else {
- const group = optionalContentConfig.getGroup(groupId);
- const input = document.createElement("input");
-
- this._bindLink(element, {
- groupId,
- input
- });
-
- input.type = "checkbox";
- input.id = groupId;
- input.checked = group.visible;
- const label = document.createElement("label");
- label.setAttribute("for", groupId);
- label.textContent = this._normalizeTextContent(group.name);
- element.appendChild(input);
- element.appendChild(label);
- layersCount++;
- }
-
- levelData.parent.appendChild(div);
- }
- }
-
- this._finishRendering(fragment, layersCount, hasAnyNesting);
- }
-
- async _resetLayers() {
- if (!this._optionalContentConfig) {
- return;
- }
-
- const optionalContentConfig = await this._pdfDocument.getOptionalContentConfig();
- this.eventBus.dispatch("optionalcontentconfig", {
- source: this,
- promise: Promise.resolve(optionalContentConfig)
- });
- this.render({
- optionalContentConfig,
- pdfDocument: this._pdfDocument
- });
- }
-
-}
-
-exports.PDFLayerViewer = PDFLayerViewer;
-
-/***/ }),
-/* 19 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.SimpleLinkService = exports.PDFLinkService = void 0;
-
-var _ui_utils = __webpack_require__(4);
-
-class PDFLinkService {
- constructor({
- eventBus,
- externalLinkTarget = null,
- externalLinkRel = null,
- ignoreDestinationZoom = false
- } = {}) {
- this.eventBus = eventBus;
- this.externalLinkTarget = externalLinkTarget;
- this.externalLinkRel = externalLinkRel;
- this.externalLinkEnabled = true;
- this._ignoreDestinationZoom = ignoreDestinationZoom;
- this.baseUrl = null;
- this.pdfDocument = null;
- this.pdfViewer = null;
- this.pdfHistory = null;
- this._pagesRefCache = null;
- }
-
- setDocument(pdfDocument, baseUrl = null) {
- this.baseUrl = baseUrl;
- this.pdfDocument = pdfDocument;
- this._pagesRefCache = Object.create(null);
- }
-
- setViewer(pdfViewer) {
- this.pdfViewer = pdfViewer;
- }
-
- setHistory(pdfHistory) {
- this.pdfHistory = pdfHistory;
- }
-
- get pagesCount() {
- return this.pdfDocument ? this.pdfDocument.numPages : 0;
- }
-
- get page() {
- return this.pdfViewer.currentPageNumber;
- }
-
- set page(value) {
- this.pdfViewer.currentPageNumber = value;
- }
-
- get rotation() {
- return this.pdfViewer.pagesRotation;
- }
-
- set rotation(value) {
- this.pdfViewer.pagesRotation = value;
- }
-
- _goToDestinationHelper(rawDest, namedDest = null, explicitDest) {
- const destRef = explicitDest[0];
- let pageNumber;
-
- if (typeof destRef === "object" && destRef !== null) {
- pageNumber = this._cachedPageNumber(destRef);
-
- if (pageNumber === null) {
- this.pdfDocument.getPageIndex(destRef).then(pageIndex => {
- this.cachePageRef(pageIndex + 1, destRef);
-
- this._goToDestinationHelper(rawDest, namedDest, explicitDest);
- }).catch(() => {
- console.error(`PDFLinkService._goToDestinationHelper: "${destRef}" is not ` + `a valid page reference, for dest="${rawDest}".`);
- });
- return;
- }
- } else if (Number.isInteger(destRef)) {
- pageNumber = destRef + 1;
- } else {
- console.error(`PDFLinkService._goToDestinationHelper: "${destRef}" is not ` + `a valid destination reference, for dest="${rawDest}".`);
- return;
- }
-
- if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) {
- console.error(`PDFLinkService._goToDestinationHelper: "${pageNumber}" is not ` + `a valid page number, for dest="${rawDest}".`);
- return;
- }
-
- if (this.pdfHistory) {
- this.pdfHistory.pushCurrentPosition();
- this.pdfHistory.push({
- namedDest,
- explicitDest,
- pageNumber
- });
- }
-
- this.pdfViewer.scrollPageIntoView({
- pageNumber,
- destArray: explicitDest,
- ignoreDestinationZoom: this._ignoreDestinationZoom
- });
- }
-
- async goToDestination(dest) {
- if (!this.pdfDocument) {
- return;
- }
-
- let namedDest, explicitDest;
-
- if (typeof dest === "string") {
- namedDest = dest;
- explicitDest = await this.pdfDocument.getDestination(dest);
- } else {
- namedDest = null;
- explicitDest = await dest;
- }
-
- if (!Array.isArray(explicitDest)) {
- console.error(`PDFLinkService.goToDestination: "${explicitDest}" is not ` + `a valid destination array, for dest="${dest}".`);
- return;
- }
-
- this._goToDestinationHelper(dest, namedDest, explicitDest);
- }
-
- goToPage(val) {
- if (!this.pdfDocument) {
- return;
- }
-
- const pageNumber = typeof val === "string" && this.pdfViewer.pageLabelToPageNumber(val) || val | 0;
-
- if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) {
- console.error(`PDFLinkService.goToPage: "${val}" is not a valid page.`);
- return;
- }
-
- if (this.pdfHistory) {
- this.pdfHistory.pushCurrentPosition();
- this.pdfHistory.pushPage(pageNumber);
- }
-
- this.pdfViewer.scrollPageIntoView({
- pageNumber
- });
- }
-
- getDestinationHash(dest) {
- if (typeof dest === "string") {
- if (dest.length > 0) {
- return this.getAnchorUrl("#" + escape(dest));
- }
- } else if (Array.isArray(dest)) {
- const str = JSON.stringify(dest);
-
- if (str.length > 0) {
- return this.getAnchorUrl("#" + escape(str));
- }
- }
-
- return this.getAnchorUrl("");
- }
-
- getAnchorUrl(anchor) {
- return (this.baseUrl || "") + anchor;
- }
-
- setHash(hash) {
- if (!this.pdfDocument) {
- return;
- }
-
- let pageNumber, dest;
-
- if (hash.includes("=")) {
- const params = (0, _ui_utils.parseQueryString)(hash);
-
- if ("search" in params) {
- this.eventBus.dispatch("findfromurlhash", {
- source: this,
- query: params.search.replace(/"/g, ""),
- phraseSearch: params.phrase === "true"
- });
- }
-
- if ("page" in params) {
- pageNumber = params.page | 0 || 1;
- }
-
- if ("zoom" in params) {
- const zoomArgs = params.zoom.split(",");
- const zoomArg = zoomArgs[0];
- const zoomArgNumber = parseFloat(zoomArg);
-
- if (!zoomArg.includes("Fit")) {
- dest = [null, {
- name: "XYZ"
- }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg];
- } else {
- if (zoomArg === "Fit" || zoomArg === "FitB") {
- dest = [null, {
- name: zoomArg
- }];
- } else if (zoomArg === "FitH" || zoomArg === "FitBH" || zoomArg === "FitV" || zoomArg === "FitBV") {
- dest = [null, {
- name: zoomArg
- }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null];
- } else if (zoomArg === "FitR") {
- if (zoomArgs.length !== 5) {
- console.error('PDFLinkService.setHash: Not enough parameters for "FitR".');
- } else {
- dest = [null, {
- name: zoomArg
- }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0];
- }
- } else {
- console.error(`PDFLinkService.setHash: "${zoomArg}" is not ` + "a valid zoom value.");
- }
- }
- }
-
- if (dest) {
- this.pdfViewer.scrollPageIntoView({
- pageNumber: pageNumber || this.page,
- destArray: dest,
- allowNegativeOffset: true
- });
- } else if (pageNumber) {
- this.page = pageNumber;
- }
-
- if ("pagemode" in params) {
- this.eventBus.dispatch("pagemode", {
- source: this,
- mode: params.pagemode
- });
- }
-
- if ("nameddest" in params) {
- this.goToDestination(params.nameddest);
- }
- } else {
- dest = unescape(hash);
-
- try {
- dest = JSON.parse(dest);
-
- if (!Array.isArray(dest)) {
- dest = dest.toString();
- }
- } catch (ex) {}
-
- if (typeof dest === "string" || isValidExplicitDestination(dest)) {
- this.goToDestination(dest);
- return;
- }
-
- console.error(`PDFLinkService.setHash: "${unescape(hash)}" is not ` + "a valid destination.");
- }
- }
-
- executeNamedAction(action) {
- switch (action) {
- case "GoBack":
- if (this.pdfHistory) {
- this.pdfHistory.back();
- }
-
- break;
-
- case "GoForward":
- if (this.pdfHistory) {
- this.pdfHistory.forward();
- }
-
- break;
-
- case "NextPage":
- this.pdfViewer.nextPage();
- break;
-
- case "PrevPage":
- this.pdfViewer.previousPage();
- break;
-
- case "LastPage":
- this.page = this.pagesCount;
- break;
-
- case "FirstPage":
- this.page = 1;
- break;
-
- default:
- break;
- }
-
- this.eventBus.dispatch("namedaction", {
- source: this,
- action
- });
- }
-
- cachePageRef(pageNum, pageRef) {
- if (!pageRef) {
- return;
- }
-
- const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`;
- this._pagesRefCache[refStr] = pageNum;
- }
-
- _cachedPageNumber(pageRef) {
- const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`;
- return this._pagesRefCache?.[refStr] || null;
- }
-
- isPageVisible(pageNumber) {
- return this.pdfViewer.isPageVisible(pageNumber);
- }
-
- isPageCached(pageNumber) {
- return this.pdfViewer.isPageCached(pageNumber);
- }
-
-}
-
-exports.PDFLinkService = PDFLinkService;
-
-function isValidExplicitDestination(dest) {
- if (!Array.isArray(dest)) {
- return false;
- }
-
- const destLength = dest.length;
-
- if (destLength < 2) {
- return false;
- }
-
- const page = dest[0];
-
- if (!(typeof page === "object" && Number.isInteger(page.num) && Number.isInteger(page.gen)) && !(Number.isInteger(page) && page >= 0)) {
- return false;
- }
-
- const zoom = dest[1];
-
- if (!(typeof zoom === "object" && typeof zoom.name === "string")) {
- return false;
- }
-
- let allowNull = true;
-
- switch (zoom.name) {
- case "XYZ":
- if (destLength !== 5) {
- return false;
- }
-
- break;
-
- case "Fit":
- case "FitB":
- return destLength === 2;
-
- case "FitH":
- case "FitBH":
- case "FitV":
- case "FitBV":
- if (destLength !== 3) {
- return false;
- }
-
- break;
-
- case "FitR":
- if (destLength !== 6) {
- return false;
- }
-
- allowNull = false;
- break;
-
- default:
- return false;
- }
-
- for (let i = 2; i < destLength; i++) {
- const param = dest[i];
-
- if (!(typeof param === "number" || allowNull && param === null)) {
- return false;
- }
- }
-
- return true;
-}
-
-class SimpleLinkService {
- constructor() {
- this.externalLinkTarget = null;
- this.externalLinkRel = null;
- this.externalLinkEnabled = true;
- this._ignoreDestinationZoom = false;
- }
-
- get pagesCount() {
- return 0;
- }
-
- get page() {
- return 0;
- }
-
- set page(value) {}
-
- get rotation() {
- return 0;
- }
-
- set rotation(value) {}
-
- async goToDestination(dest) {}
-
- goToPage(val) {}
-
- getDestinationHash(dest) {
- return "#";
- }
-
- getAnchorUrl(hash) {
- return "#";
- }
-
- setHash(hash) {}
-
- executeNamedAction(action) {}
-
- cachePageRef(pageNum, pageRef) {}
-
- isPageVisible(pageNumber) {
- return true;
- }
-
- isPageCached(pageNumber) {
- return true;
- }
-
-}
-
-exports.SimpleLinkService = SimpleLinkService;
-
-/***/ }),
-/* 20 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFOutlineViewer = void 0;
-
-var _pdfjsLib = __webpack_require__(5);
-
-var _base_tree_viewer = __webpack_require__(12);
-
-var _ui_utils = __webpack_require__(4);
-
-class PDFOutlineViewer extends _base_tree_viewer.BaseTreeViewer {
- constructor(options) {
- super(options);
- this.linkService = options.linkService;
-
- this.eventBus._on("toggleoutlinetree", this._toggleAllTreeItems.bind(this));
-
- this.eventBus._on("currentoutlineitem", this._currentOutlineItem.bind(this));
-
- this.eventBus._on("pagechanging", evt => {
- this._currentPageNumber = evt.pageNumber;
- });
-
- this.eventBus._on("pagesloaded", evt => {
- this._isPagesLoaded = !!evt.pagesCount;
-
- if (this._currentOutlineItemCapability && !this._currentOutlineItemCapability.settled) {
- this._currentOutlineItemCapability.resolve(this._isPagesLoaded);
- }
- });
-
- this.eventBus._on("sidebarviewchanged", evt => {
- this._sidebarView = evt.view;
- });
- }
-
- reset() {
- super.reset();
- this._outline = null;
- this._pageNumberToDestHashCapability = null;
- this._currentPageNumber = 1;
- this._isPagesLoaded = false;
-
- if (this._currentOutlineItemCapability && !this._currentOutlineItemCapability.settled) {
- this._currentOutlineItemCapability.resolve(false);
- }
-
- this._currentOutlineItemCapability = null;
- }
-
- _dispatchEvent(outlineCount) {
- this._currentOutlineItemCapability = (0, _pdfjsLib.createPromiseCapability)();
-
- if (outlineCount === 0 || this._pdfDocument?.loadingParams.disableAutoFetch) {
- this._currentOutlineItemCapability.resolve(false);
- } else if (this._isPagesLoaded) {
- this._currentOutlineItemCapability.resolve(true);
- }
-
- this.eventBus.dispatch("outlineloaded", {
- source: this,
- outlineCount,
- currentOutlineItemPromise: this._currentOutlineItemCapability.promise
- });
- }
-
- _bindLink(element, {
- url,
- newWindow,
- dest
- }) {
- const {
- linkService
- } = this;
-
- if (url) {
- (0, _pdfjsLib.addLinkAttributes)(element, {
- url,
- target: newWindow ? _pdfjsLib.LinkTarget.BLANK : linkService.externalLinkTarget,
- rel: linkService.externalLinkRel,
- enabled: linkService.externalLinkEnabled
- });
- return;
- }
-
- element.href = linkService.getDestinationHash(dest);
-
- element.onclick = evt => {
- this._updateCurrentTreeItem(evt.target.parentNode);
-
- if (dest) {
- linkService.goToDestination(dest);
- }
-
- return false;
- };
- }
-
- _setStyles(element, {
- bold,
- italic
- }) {
- if (bold) {
- element.style.fontWeight = "bold";
- }
-
- if (italic) {
- element.style.fontStyle = "italic";
- }
- }
-
- _addToggleButton(div, {
- count,
- items
- }) {
- let hidden = false;
-
- if (count < 0) {
- let totalCount = items.length;
-
- if (totalCount > 0) {
- const queue = [...items];
-
- while (queue.length > 0) {
- const {
- count: nestedCount,
- items: nestedItems
- } = queue.shift();
-
- if (nestedCount > 0 && nestedItems.length > 0) {
- totalCount += nestedItems.length;
- queue.push(...nestedItems);
- }
- }
- }
-
- if (Math.abs(count) === totalCount) {
- hidden = true;
- }
- }
-
- super._addToggleButton(div, hidden);
- }
-
- _toggleAllTreeItems() {
- if (!this._outline) {
- return;
- }
-
- super._toggleAllTreeItems();
- }
-
- render({
- outline,
- pdfDocument
- }) {
- if (this._outline) {
- this.reset();
- }
-
- this._outline = outline || null;
- this._pdfDocument = pdfDocument || null;
-
- if (!outline) {
- this._dispatchEvent(0);
-
- return;
- }
-
- const fragment = document.createDocumentFragment();
- const queue = [{
- parent: fragment,
- items: outline
- }];
- let outlineCount = 0,
- hasAnyNesting = false;
-
- while (queue.length > 0) {
- const levelData = queue.shift();
-
- for (const item of levelData.items) {
- const div = document.createElement("div");
- div.className = "treeItem";
- const element = document.createElement("a");
-
- this._bindLink(element, item);
-
- this._setStyles(element, item);
-
- element.textContent = this._normalizeTextContent(item.title);
- div.appendChild(element);
-
- if (item.items.length > 0) {
- hasAnyNesting = true;
-
- this._addToggleButton(div, item);
-
- const itemsDiv = document.createElement("div");
- itemsDiv.className = "treeItems";
- div.appendChild(itemsDiv);
- queue.push({
- parent: itemsDiv,
- items: item.items
- });
- }
-
- levelData.parent.appendChild(div);
- outlineCount++;
- }
- }
-
- this._finishRendering(fragment, outlineCount, hasAnyNesting);
- }
-
- async _currentOutlineItem() {
- if (!this._isPagesLoaded) {
- throw new Error("_currentOutlineItem: All pages have not been loaded.");
- }
-
- if (!this._outline || !this._pdfDocument) {
- return;
- }
-
- const pageNumberToDestHash = await this._getPageNumberToDestHash(this._pdfDocument);
-
- if (!pageNumberToDestHash) {
- return;
- }
-
- this._updateCurrentTreeItem(null);
-
- if (this._sidebarView !== _ui_utils.SidebarView.OUTLINE) {
- return;
- }
-
- for (let i = this._currentPageNumber; i > 0; i--) {
- const destHash = pageNumberToDestHash.get(i);
-
- if (!destHash) {
- continue;
- }
-
- const linkElement = this.container.querySelector(`a[href="${destHash}"]`);
-
- if (!linkElement) {
- continue;
- }
-
- this._scrollToCurrentTreeItem(linkElement.parentNode);
-
- break;
- }
- }
-
- async _getPageNumberToDestHash(pdfDocument) {
- if (this._pageNumberToDestHashCapability) {
- return this._pageNumberToDestHashCapability.promise;
- }
-
- this._pageNumberToDestHashCapability = (0, _pdfjsLib.createPromiseCapability)();
- const pageNumberToDestHash = new Map(),
- pageNumberNesting = new Map();
- const queue = [{
- nesting: 0,
- items: this._outline
- }];
-
- while (queue.length > 0) {
- const levelData = queue.shift(),
- currentNesting = levelData.nesting;
-
- for (const {
- dest,
- items
- } of levelData.items) {
- let explicitDest, pageNumber;
-
- if (typeof dest === "string") {
- explicitDest = await pdfDocument.getDestination(dest);
-
- if (pdfDocument !== this._pdfDocument) {
- return null;
- }
- } else {
- explicitDest = dest;
- }
-
- if (Array.isArray(explicitDest)) {
- const [destRef] = explicitDest;
-
- if (typeof destRef === "object" && destRef !== null) {
- pageNumber = this.linkService._cachedPageNumber(destRef);
-
- if (!pageNumber) {
- try {
- pageNumber = (await pdfDocument.getPageIndex(destRef)) + 1;
-
- if (pdfDocument !== this._pdfDocument) {
- return null;
- }
-
- this.linkService.cachePageRef(pageNumber, destRef);
- } catch (ex) {}
- }
- } else if (Number.isInteger(destRef)) {
- pageNumber = destRef + 1;
- }
-
- if (Number.isInteger(pageNumber) && (!pageNumberToDestHash.has(pageNumber) || currentNesting > pageNumberNesting.get(pageNumber))) {
- const destHash = this.linkService.getDestinationHash(dest);
- pageNumberToDestHash.set(pageNumber, destHash);
- pageNumberNesting.set(pageNumber, currentNesting);
- }
- }
-
- if (items.length > 0) {
- queue.push({
- nesting: currentNesting + 1,
- items
- });
- }
- }
- }
-
- this._pageNumberToDestHashCapability.resolve(pageNumberToDestHash.size > 0 ? pageNumberToDestHash : null);
-
- return this._pageNumberToDestHashCapability.promise;
- }
-
-}
-
-exports.PDFOutlineViewer = PDFOutlineViewer;
-
-/***/ }),
-/* 21 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFPresentationMode = void 0;
-
-var _ui_utils = __webpack_require__(4);
-
-const DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500;
-const DELAY_BEFORE_HIDING_CONTROLS = 3000;
-const ACTIVE_SELECTOR = "pdfPresentationMode";
-const CONTROLS_SELECTOR = "pdfPresentationModeControls";
-const MOUSE_SCROLL_COOLDOWN_TIME = 50;
-const PAGE_SWITCH_THRESHOLD = 0.1;
-const SWIPE_MIN_DISTANCE_THRESHOLD = 50;
-const SWIPE_ANGLE_THRESHOLD = Math.PI / 6;
-
-class PDFPresentationMode {
- constructor({
- container,
- pdfViewer,
- eventBus
- }) {
- this.container = container;
- this.pdfViewer = pdfViewer;
- this.eventBus = eventBus;
- this.active = false;
- this.args = null;
- this.contextMenuOpen = false;
- this.mouseScrollTimeStamp = 0;
- this.mouseScrollDelta = 0;
- this.touchSwipeState = null;
- }
-
- request() {
- if (this.switchInProgress || this.active || !this.pdfViewer.pagesCount) {
- return false;
- }
-
- this._addFullscreenChangeListeners();
-
- this._setSwitchInProgress();
-
- this._notifyStateChange();
-
- if (this.container.requestFullscreen) {
- this.container.requestFullscreen();
- } else if (this.container.mozRequestFullScreen) {
- this.container.mozRequestFullScreen();
- } else if (this.container.webkitRequestFullscreen) {
- this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
- } else {
- return false;
- }
-
- this.args = {
- page: this.pdfViewer.currentPageNumber,
- previousScale: this.pdfViewer.currentScaleValue
- };
- return true;
- }
-
- _mouseWheel(evt) {
- if (!this.active) {
- return;
- }
-
- evt.preventDefault();
- const delta = (0, _ui_utils.normalizeWheelEventDelta)(evt);
- const currentTime = Date.now();
- const storedTime = this.mouseScrollTimeStamp;
-
- if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {
- return;
- }
-
- if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) {
- this._resetMouseScrollState();
- }
-
- this.mouseScrollDelta += delta;
-
- if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {
- const totalDelta = this.mouseScrollDelta;
-
- this._resetMouseScrollState();
-
- const success = totalDelta > 0 ? this.pdfViewer.previousPage() : this.pdfViewer.nextPage();
-
- if (success) {
- this.mouseScrollTimeStamp = currentTime;
- }
- }
- }
-
- get isFullscreen() {
- return !!(document.fullscreenElement || document.mozFullScreen || document.webkitIsFullScreen);
- }
-
- _notifyStateChange() {
- let state = _ui_utils.PresentationModeState.NORMAL;
-
- if (this.switchInProgress) {
- state = _ui_utils.PresentationModeState.CHANGING;
- } else if (this.active) {
- state = _ui_utils.PresentationModeState.FULLSCREEN;
- }
-
- this.eventBus.dispatch("presentationmodechanged", {
- source: this,
- state
- });
- }
-
- _setSwitchInProgress() {
- if (this.switchInProgress) {
- clearTimeout(this.switchInProgress);
- }
-
- this.switchInProgress = setTimeout(() => {
- this._removeFullscreenChangeListeners();
-
- delete this.switchInProgress;
-
- this._notifyStateChange();
- }, DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);
- }
-
- _resetSwitchInProgress() {
- if (this.switchInProgress) {
- clearTimeout(this.switchInProgress);
- delete this.switchInProgress;
- }
- }
-
- _enter() {
- this.active = true;
-
- this._resetSwitchInProgress();
-
- this._notifyStateChange();
-
- this.container.classList.add(ACTIVE_SELECTOR);
- setTimeout(() => {
- this.pdfViewer.currentPageNumber = this.args.page;
- this.pdfViewer.currentScaleValue = "page-fit";
- }, 0);
-
- this._addWindowListeners();
-
- this._showControls();
-
- this.contextMenuOpen = false;
- window.getSelection().removeAllRanges();
- }
-
- _exit() {
- const page = this.pdfViewer.currentPageNumber;
- this.container.classList.remove(ACTIVE_SELECTOR);
- setTimeout(() => {
- this.active = false;
-
- this._removeFullscreenChangeListeners();
-
- this._notifyStateChange();
-
- this.pdfViewer.currentScaleValue = this.args.previousScale;
- this.pdfViewer.currentPageNumber = page;
- this.args = null;
- }, 0);
-
- this._removeWindowListeners();
-
- this._hideControls();
-
- this._resetMouseScrollState();
-
- this.contextMenuOpen = false;
- }
-
- _mouseDown(evt) {
- if (this.contextMenuOpen) {
- this.contextMenuOpen = false;
- evt.preventDefault();
- return;
- }
-
- if (evt.button === 0) {
- const isInternalLink = evt.target.href && evt.target.classList.contains("internalLink");
-
- if (!isInternalLink) {
- evt.preventDefault();
-
- if (evt.shiftKey) {
- this.pdfViewer.previousPage();
- } else {
- this.pdfViewer.nextPage();
- }
- }
- }
- }
-
- _contextMenu() {
- this.contextMenuOpen = true;
- }
-
- _showControls() {
- if (this.controlsTimeout) {
- clearTimeout(this.controlsTimeout);
- } else {
- this.container.classList.add(CONTROLS_SELECTOR);
- }
-
- this.controlsTimeout = setTimeout(() => {
- this.container.classList.remove(CONTROLS_SELECTOR);
- delete this.controlsTimeout;
- }, DELAY_BEFORE_HIDING_CONTROLS);
- }
-
- _hideControls() {
- if (!this.controlsTimeout) {
- return;
- }
-
- clearTimeout(this.controlsTimeout);
- this.container.classList.remove(CONTROLS_SELECTOR);
- delete this.controlsTimeout;
- }
-
- _resetMouseScrollState() {
- this.mouseScrollTimeStamp = 0;
- this.mouseScrollDelta = 0;
- }
-
- _touchSwipe(evt) {
- if (!this.active) {
- return;
- }
-
- if (evt.touches.length > 1) {
- this.touchSwipeState = null;
- return;
- }
-
- switch (evt.type) {
- case "touchstart":
- this.touchSwipeState = {
- startX: evt.touches[0].pageX,
- startY: evt.touches[0].pageY,
- endX: evt.touches[0].pageX,
- endY: evt.touches[0].pageY
- };
- break;
-
- case "touchmove":
- if (this.touchSwipeState === null) {
- return;
- }
-
- this.touchSwipeState.endX = evt.touches[0].pageX;
- this.touchSwipeState.endY = evt.touches[0].pageY;
- evt.preventDefault();
- break;
-
- case "touchend":
- if (this.touchSwipeState === null) {
- return;
- }
-
- let delta = 0;
- const dx = this.touchSwipeState.endX - this.touchSwipeState.startX;
- const dy = this.touchSwipeState.endY - this.touchSwipeState.startY;
- const absAngle = Math.abs(Math.atan2(dy, dx));
-
- if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)) {
- delta = dx;
- } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD) {
- delta = dy;
- }
-
- if (delta > 0) {
- this.pdfViewer.previousPage();
- } else if (delta < 0) {
- this.pdfViewer.nextPage();
- }
-
- break;
- }
- }
-
- _addWindowListeners() {
- this.showControlsBind = this._showControls.bind(this);
- this.mouseDownBind = this._mouseDown.bind(this);
- this.mouseWheelBind = this._mouseWheel.bind(this);
- this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this);
- this.contextMenuBind = this._contextMenu.bind(this);
- this.touchSwipeBind = this._touchSwipe.bind(this);
- window.addEventListener("mousemove", this.showControlsBind);
- window.addEventListener("mousedown", this.mouseDownBind);
- window.addEventListener("wheel", this.mouseWheelBind, {
- passive: false
- });
- window.addEventListener("keydown", this.resetMouseScrollStateBind);
- window.addEventListener("contextmenu", this.contextMenuBind);
- window.addEventListener("touchstart", this.touchSwipeBind);
- window.addEventListener("touchmove", this.touchSwipeBind);
- window.addEventListener("touchend", this.touchSwipeBind);
- }
-
- _removeWindowListeners() {
- window.removeEventListener("mousemove", this.showControlsBind);
- window.removeEventListener("mousedown", this.mouseDownBind);
- window.removeEventListener("wheel", this.mouseWheelBind, {
- passive: false
- });
- window.removeEventListener("keydown", this.resetMouseScrollStateBind);
- window.removeEventListener("contextmenu", this.contextMenuBind);
- window.removeEventListener("touchstart", this.touchSwipeBind);
- window.removeEventListener("touchmove", this.touchSwipeBind);
- window.removeEventListener("touchend", this.touchSwipeBind);
- delete this.showControlsBind;
- delete this.mouseDownBind;
- delete this.mouseWheelBind;
- delete this.resetMouseScrollStateBind;
- delete this.contextMenuBind;
- delete this.touchSwipeBind;
- }
-
- _fullscreenChange() {
- if (this.isFullscreen) {
- this._enter();
- } else {
- this._exit();
- }
- }
-
- _addFullscreenChangeListeners() {
- this.fullscreenChangeBind = this._fullscreenChange.bind(this);
- window.addEventListener("fullscreenchange", this.fullscreenChangeBind);
- window.addEventListener("mozfullscreenchange", this.fullscreenChangeBind);
- window.addEventListener("webkitfullscreenchange", this.fullscreenChangeBind);
- }
-
- _removeFullscreenChangeListeners() {
- window.removeEventListener("fullscreenchange", this.fullscreenChangeBind);
- window.removeEventListener("mozfullscreenchange", this.fullscreenChangeBind);
- window.removeEventListener("webkitfullscreenchange", this.fullscreenChangeBind);
- delete this.fullscreenChangeBind;
- }
-
-}
-
-exports.PDFPresentationMode = PDFPresentationMode;
-
-/***/ }),
-/* 22 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFScriptingManager = void 0;
-
-var _pdfjsLib = __webpack_require__(5);
-
-var _ui_utils = __webpack_require__(4);
-
-var _pdf_rendering_queue = __webpack_require__(8);
-
-class PDFScriptingManager {
- constructor({
- eventBus,
- sandboxBundleSrc = null,
- scriptingFactory = null,
- docPropertiesLookup = null
- }) {
- this._pdfDocument = null;
- this._pdfViewer = null;
- this._closeCapability = null;
- this._destroyCapability = null;
- this._scripting = null;
- this._mouseState = Object.create(null);
- this._ready = false;
- this._eventBus = eventBus;
- this._sandboxBundleSrc = sandboxBundleSrc;
- this._scriptingFactory = scriptingFactory;
- this._docPropertiesLookup = docPropertiesLookup;
- }
-
- setViewer(pdfViewer) {
- this._pdfViewer = pdfViewer;
- }
-
- async setDocument(pdfDocument) {
- if (this._pdfDocument) {
- await this._destroyScripting();
- }
-
- this._pdfDocument = pdfDocument;
-
- if (!pdfDocument) {
- return;
- }
-
- const [objects, calculationOrder, docActions] = await Promise.all([pdfDocument.getFieldObjects(), pdfDocument.getCalculationOrderIds(), pdfDocument.getJSActions()]);
-
- if (!objects && !docActions) {
- await this._destroyScripting();
- return;
- }
-
- if (pdfDocument !== this._pdfDocument) {
- return;
- }
-
- try {
- this._scripting = this._createScripting();
- } catch (error) {
- console.error(`PDFScriptingManager.setDocument: "${error?.message}".`);
- await this._destroyScripting();
- return;
- }
-
- this._internalEvents.set("updatefromsandbox", event => {
- if (event?.source !== window) {
- return;
- }
-
- this._updateFromSandbox(event.detail);
- });
-
- this._internalEvents.set("dispatcheventinsandbox", event => {
- this._scripting?.dispatchEventInSandbox(event.detail);
- });
-
- this._internalEvents.set("pagechanging", ({
- pageNumber,
- previous
- }) => {
- if (pageNumber === previous) {
- return;
- }
-
- this._dispatchPageClose(previous);
-
- this._dispatchPageOpen(pageNumber);
- });
-
- this._internalEvents.set("pagerendered", ({
- pageNumber
- }) => {
- if (!this._pageOpenPending.has(pageNumber)) {
- return;
- }
-
- if (pageNumber !== this._pdfViewer.currentPageNumber) {
- return;
- }
-
- this._dispatchPageOpen(pageNumber);
- });
-
- this._internalEvents.set("pagesdestroy", async event => {
- await this._dispatchPageClose(this._pdfViewer.currentPageNumber);
- await this._scripting?.dispatchEventInSandbox({
- id: "doc",
- name: "WillClose"
- });
- this._closeCapability?.resolve();
- });
-
- this._domEvents.set("mousedown", event => {
- this._mouseState.isDown = true;
- });
-
- this._domEvents.set("mouseup", event => {
- this._mouseState.isDown = false;
- });
-
- for (const [name, listener] of this._internalEvents) {
- this._eventBus._on(name, listener);
- }
-
- for (const [name, listener] of this._domEvents) {
- window.addEventListener(name, listener);
- }
-
- try {
- const docProperties = await this._getDocProperties();
-
- if (pdfDocument !== this._pdfDocument) {
- return;
- }
-
- await this._scripting.createSandbox({
- objects,
- calculationOrder,
- appInfo: {
- platform: navigator.platform,
- language: navigator.language
- },
- docInfo: { ...docProperties,
- actions: docActions
- }
- });
-
- this._eventBus.dispatch("sandboxcreated", {
- source: this
- });
- } catch (error) {
- console.error(`PDFScriptingManager.setDocument: "${error?.message}".`);
- await this._destroyScripting();
- return;
- }
-
- await this._scripting?.dispatchEventInSandbox({
- id: "doc",
- name: "Open"
- });
- await this._dispatchPageOpen(this._pdfViewer.currentPageNumber, true);
- Promise.resolve().then(() => {
- if (pdfDocument === this._pdfDocument) {
- this._ready = true;
- }
- });
- }
-
- async dispatchWillSave(detail) {
- return this._scripting?.dispatchEventInSandbox({
- id: "doc",
- name: "WillSave"
- });
- }
-
- async dispatchDidSave(detail) {
- return this._scripting?.dispatchEventInSandbox({
- id: "doc",
- name: "DidSave"
- });
- }
-
- async dispatchWillPrint(detail) {
- return this._scripting?.dispatchEventInSandbox({
- id: "doc",
- name: "WillPrint"
- });
- }
-
- async dispatchDidPrint(detail) {
- return this._scripting?.dispatchEventInSandbox({
- id: "doc",
- name: "DidPrint"
- });
- }
-
- get mouseState() {
- return this._mouseState;
- }
-
- get destroyPromise() {
- return this._destroyCapability?.promise || null;
- }
-
- get ready() {
- return this._ready;
- }
-
- get _internalEvents() {
- return (0, _pdfjsLib.shadow)(this, "_internalEvents", new Map());
- }
-
- get _domEvents() {
- return (0, _pdfjsLib.shadow)(this, "_domEvents", new Map());
- }
-
- get _pageOpenPending() {
- return (0, _pdfjsLib.shadow)(this, "_pageOpenPending", new Set());
- }
-
- get _visitedPages() {
- return (0, _pdfjsLib.shadow)(this, "_visitedPages", new Map());
- }
-
- async _updateFromSandbox(detail) {
- const isInPresentationMode = this._pdfViewer.isInPresentationMode || this._pdfViewer.isChangingPresentationMode;
- const {
- id,
- siblings,
- command,
- value
- } = detail;
-
- if (!id) {
- switch (command) {
- case "clear":
- console.clear();
- break;
-
- case "error":
- console.error(value);
- break;
-
- case "layout":
- this._pdfViewer.spreadMode = (0, _ui_utils.apiPageLayoutToSpreadMode)(value);
- break;
-
- case "page-num":
- this._pdfViewer.currentPageNumber = value + 1;
- break;
-
- case "print":
- await this._pdfViewer.pagesPromise;
-
- this._eventBus.dispatch("print", {
- source: this
- });
-
- break;
-
- case "println":
- console.log(value);
- break;
-
- case "zoom":
- if (isInPresentationMode) {
- return;
- }
-
- this._pdfViewer.currentScaleValue = value;
- break;
- }
-
- return;
- }
-
- if (isInPresentationMode) {
- if (detail.focus) {
- return;
- }
- }
-
- delete detail.id;
- delete detail.siblings;
- const ids = siblings ? [id, ...siblings] : [id];
-
- for (const elementId of ids) {
- const element = document.getElementById(elementId);
-
- if (element) {
- element.dispatchEvent(new CustomEvent("updatefromsandbox", {
- detail
- }));
- } else {
- this._pdfDocument?.annotationStorage.setValue(elementId, detail);
- }
- }
- }
-
- async _dispatchPageOpen(pageNumber, initialize = false) {
- const pdfDocument = this._pdfDocument,
- visitedPages = this._visitedPages;
-
- if (initialize) {
- this._closeCapability = (0, _pdfjsLib.createPromiseCapability)();
- }
-
- if (!this._closeCapability) {
- return;
- }
-
- const pageView = this._pdfViewer.getPageView(pageNumber - 1);
-
- if (pageView?.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {
- this._pageOpenPending.add(pageNumber);
-
- return;
- }
-
- this._pageOpenPending.delete(pageNumber);
-
- const actionsPromise = (async () => {
- const actions = await (!visitedPages.has(pageNumber) ? pageView.pdfPage?.getJSActions() : null);
-
- if (pdfDocument !== this._pdfDocument) {
- return;
- }
-
- await this._scripting?.dispatchEventInSandbox({
- id: "page",
- name: "PageOpen",
- pageNumber,
- actions
- });
- })();
-
- visitedPages.set(pageNumber, actionsPromise);
- }
-
- async _dispatchPageClose(pageNumber) {
- const pdfDocument = this._pdfDocument,
- visitedPages = this._visitedPages;
-
- if (!this._closeCapability) {
- return;
- }
-
- if (this._pageOpenPending.has(pageNumber)) {
- return;
- }
-
- const actionsPromise = visitedPages.get(pageNumber);
-
- if (!actionsPromise) {
- return;
- }
-
- visitedPages.set(pageNumber, null);
- await actionsPromise;
-
- if (pdfDocument !== this._pdfDocument) {
- return;
- }
-
- await this._scripting?.dispatchEventInSandbox({
- id: "page",
- name: "PageClose",
- pageNumber
- });
- }
-
- async _getDocProperties() {
- if (this._docPropertiesLookup) {
- return this._docPropertiesLookup(this._pdfDocument);
- }
-
- throw new Error("_getDocProperties: Unable to lookup properties.");
- }
-
- _createScripting() {
- this._destroyCapability = (0, _pdfjsLib.createPromiseCapability)();
-
- if (this._scripting) {
- throw new Error("_createScripting: Scripting already exists.");
- }
-
- if (this._scriptingFactory) {
- return this._scriptingFactory.createScripting({
- sandboxBundleSrc: this._sandboxBundleSrc
- });
- }
-
- throw new Error("_createScripting: Cannot create scripting.");
- }
-
- async _destroyScripting() {
- if (!this._scripting) {
- this._pdfDocument = null;
- this._destroyCapability?.resolve();
- return;
- }
-
- if (this._closeCapability) {
- await Promise.race([this._closeCapability.promise, new Promise(resolve => {
- setTimeout(resolve, 1000);
- })]).catch(reason => {});
- this._closeCapability = null;
- }
-
- this._pdfDocument = null;
-
- try {
- await this._scripting.destroySandbox();
- } catch (ex) {}
-
- for (const [name, listener] of this._internalEvents) {
- this._eventBus._off(name, listener);
- }
-
- this._internalEvents.clear();
-
- for (const [name, listener] of this._domEvents) {
- window.removeEventListener(name, listener);
- }
-
- this._domEvents.clear();
-
- this._pageOpenPending.clear();
-
- this._visitedPages.clear();
-
- this._scripting = null;
- delete this._mouseState.isDown;
- this._ready = false;
- this._destroyCapability?.resolve();
- }
-
-}
-
-exports.PDFScriptingManager = PDFScriptingManager;
-
-/***/ }),
-/* 23 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFSidebar = void 0;
-
-var _ui_utils = __webpack_require__(4);
-
-var _pdf_rendering_queue = __webpack_require__(8);
-
-const UI_NOTIFICATION_CLASS = "pdfSidebarNotification";
-
-class PDFSidebar {
- constructor({
- elements,
- pdfViewer,
- pdfThumbnailViewer,
- eventBus,
- l10n
- }) {
- this.isOpen = false;
- this.active = _ui_utils.SidebarView.THUMBS;
- this.isInitialViewSet = false;
- this.onToggled = null;
- this.pdfViewer = pdfViewer;
- this.pdfThumbnailViewer = pdfThumbnailViewer;
- this.outerContainer = elements.outerContainer;
- this.viewerContainer = elements.viewerContainer;
- this.toggleButton = elements.toggleButton;
- this.thumbnailButton = elements.thumbnailButton;
- this.outlineButton = elements.outlineButton;
- this.attachmentsButton = elements.attachmentsButton;
- this.layersButton = elements.layersButton;
- this.thumbnailView = elements.thumbnailView;
- this.outlineView = elements.outlineView;
- this.attachmentsView = elements.attachmentsView;
- this.layersView = elements.layersView;
- this._outlineOptionsContainer = elements.outlineOptionsContainer;
- this._currentOutlineItemButton = elements.currentOutlineItemButton;
- this.eventBus = eventBus;
- this.l10n = l10n;
-
- this._addEventListeners();
- }
-
- reset() {
- this.isInitialViewSet = false;
-
- this._hideUINotification(true);
-
- this.switchView(_ui_utils.SidebarView.THUMBS);
- this.outlineButton.disabled = false;
- this.attachmentsButton.disabled = false;
- this.layersButton.disabled = false;
- this._currentOutlineItemButton.disabled = true;
- }
-
- get visibleView() {
- return this.isOpen ? this.active : _ui_utils.SidebarView.NONE;
- }
-
- get isThumbnailViewVisible() {
- return this.isOpen && this.active === _ui_utils.SidebarView.THUMBS;
- }
-
- get isOutlineViewVisible() {
- return this.isOpen && this.active === _ui_utils.SidebarView.OUTLINE;
- }
-
- get isAttachmentsViewVisible() {
- return this.isOpen && this.active === _ui_utils.SidebarView.ATTACHMENTS;
- }
-
- get isLayersViewVisible() {
- return this.isOpen && this.active === _ui_utils.SidebarView.LAYERS;
- }
-
- setInitialView(view = _ui_utils.SidebarView.NONE) {
- if (this.isInitialViewSet) {
- return;
- }
-
- this.isInitialViewSet = true;
-
- if (view === _ui_utils.SidebarView.NONE || view === _ui_utils.SidebarView.UNKNOWN) {
- this._dispatchEvent();
-
- return;
- }
-
- if (!this._switchView(view, true)) {
- this._dispatchEvent();
- }
- }
-
- switchView(view, forceOpen = false) {
- this._switchView(view, forceOpen);
- }
-
- _switchView(view, forceOpen = false) {
- const isViewChanged = view !== this.active;
- let shouldForceRendering = false;
-
- switch (view) {
- case _ui_utils.SidebarView.NONE:
- if (this.isOpen) {
- this.close();
- return true;
- }
-
- return false;
-
- case _ui_utils.SidebarView.THUMBS:
- if (this.isOpen && isViewChanged) {
- shouldForceRendering = true;
- }
-
- break;
-
- case _ui_utils.SidebarView.OUTLINE:
- if (this.outlineButton.disabled) {
- return false;
- }
-
- break;
-
- case _ui_utils.SidebarView.ATTACHMENTS:
- if (this.attachmentsButton.disabled) {
- return false;
- }
-
- break;
-
- case _ui_utils.SidebarView.LAYERS:
- if (this.layersButton.disabled) {
- return false;
- }
-
- break;
-
- default:
- console.error(`PDFSidebar._switchView: "${view}" is not a valid view.`);
- return false;
- }
-
- this.active = view;
- this.thumbnailButton.classList.toggle("toggled", view === _ui_utils.SidebarView.THUMBS);
- this.outlineButton.classList.toggle("toggled", view === _ui_utils.SidebarView.OUTLINE);
- this.attachmentsButton.classList.toggle("toggled", view === _ui_utils.SidebarView.ATTACHMENTS);
- this.layersButton.classList.toggle("toggled", view === _ui_utils.SidebarView.LAYERS);
- this.thumbnailView.classList.toggle("hidden", view !== _ui_utils.SidebarView.THUMBS);
- this.outlineView.classList.toggle("hidden", view !== _ui_utils.SidebarView.OUTLINE);
- this.attachmentsView.classList.toggle("hidden", view !== _ui_utils.SidebarView.ATTACHMENTS);
- this.layersView.classList.toggle("hidden", view !== _ui_utils.SidebarView.LAYERS);
-
- this._outlineOptionsContainer.classList.toggle("hidden", view !== _ui_utils.SidebarView.OUTLINE);
-
- if (forceOpen && !this.isOpen) {
- this.open();
- return true;
- }
-
- if (shouldForceRendering) {
- this._updateThumbnailViewer();
-
- this._forceRendering();
- }
-
- if (isViewChanged) {
- this._dispatchEvent();
- }
-
- return isViewChanged;
- }
-
- open() {
- if (this.isOpen) {
- return;
- }
-
- this.isOpen = true;
- this.toggleButton.classList.add("toggled");
- this.toggleButton.setAttribute("aria-expanded", "true");
- this.outerContainer.classList.add("sidebarMoving", "sidebarOpen");
-
- if (this.active === _ui_utils.SidebarView.THUMBS) {
- this._updateThumbnailViewer();
- }
-
- this._forceRendering();
-
- this._dispatchEvent();
-
- this._hideUINotification();
- }
-
- close() {
- if (!this.isOpen) {
- return;
- }
-
- this.isOpen = false;
- this.toggleButton.classList.remove("toggled");
- this.toggleButton.setAttribute("aria-expanded", "false");
- this.outerContainer.classList.add("sidebarMoving");
- this.outerContainer.classList.remove("sidebarOpen");
-
- this._forceRendering();
-
- this._dispatchEvent();
- }
-
- toggle() {
- if (this.isOpen) {
- this.close();
- } else {
- this.open();
- }
- }
-
- _dispatchEvent() {
- this.eventBus.dispatch("sidebarviewchanged", {
- source: this,
- view: this.visibleView
- });
- }
-
- _forceRendering() {
- if (this.onToggled) {
- this.onToggled();
- } else {
- this.pdfViewer.forceRendering();
- this.pdfThumbnailViewer.forceRendering();
- }
- }
-
- _updateThumbnailViewer() {
- const {
- pdfViewer,
- pdfThumbnailViewer
- } = this;
- const pagesCount = pdfViewer.pagesCount;
-
- for (let pageIndex = 0; pageIndex < pagesCount; pageIndex++) {
- const pageView = pdfViewer.getPageView(pageIndex);
-
- if (pageView?.renderingState === _pdf_rendering_queue.RenderingStates.FINISHED) {
- const thumbnailView = pdfThumbnailViewer.getThumbnail(pageIndex);
- thumbnailView.setImage(pageView);
- }
- }
-
- pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber);
- }
-
- _showUINotification() {
- this.l10n.get("toggle_sidebar_notification2.title").then(msg => {
- this.toggleButton.title = msg;
- });
-
- if (!this.isOpen) {
- this.toggleButton.classList.add(UI_NOTIFICATION_CLASS);
- }
- }
-
- _hideUINotification(reset = false) {
- if (this.isOpen || reset) {
- this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS);
- }
-
- if (reset) {
- this.l10n.get("toggle_sidebar.title").then(msg => {
- this.toggleButton.title = msg;
- });
- }
- }
-
- _addEventListeners() {
- this.viewerContainer.addEventListener("transitionend", evt => {
- if (evt.target === this.viewerContainer) {
- this.outerContainer.classList.remove("sidebarMoving");
- }
- });
- this.toggleButton.addEventListener("click", () => {
- this.toggle();
- });
- this.thumbnailButton.addEventListener("click", () => {
- this.switchView(_ui_utils.SidebarView.THUMBS);
- });
- this.outlineButton.addEventListener("click", () => {
- this.switchView(_ui_utils.SidebarView.OUTLINE);
- });
- this.outlineButton.addEventListener("dblclick", () => {
- this.eventBus.dispatch("toggleoutlinetree", {
- source: this
- });
- });
- this.attachmentsButton.addEventListener("click", () => {
- this.switchView(_ui_utils.SidebarView.ATTACHMENTS);
- });
- this.layersButton.addEventListener("click", () => {
- this.switchView(_ui_utils.SidebarView.LAYERS);
- });
- this.layersButton.addEventListener("dblclick", () => {
- this.eventBus.dispatch("resetlayers", {
- source: this
- });
- });
-
- this._currentOutlineItemButton.addEventListener("click", () => {
- this.eventBus.dispatch("currentoutlineitem", {
- source: this
- });
- });
-
- const onTreeLoaded = (count, button, view) => {
- button.disabled = !count;
-
- if (count) {
- this._showUINotification();
- } else if (this.active === view) {
- this.switchView(_ui_utils.SidebarView.THUMBS);
- }
- };
-
- this.eventBus._on("outlineloaded", evt => {
- onTreeLoaded(evt.outlineCount, this.outlineButton, _ui_utils.SidebarView.OUTLINE);
- evt.currentOutlineItemPromise.then(enabled => {
- if (!this.isInitialViewSet) {
- return;
- }
-
- this._currentOutlineItemButton.disabled = !enabled;
- });
- });
-
- this.eventBus._on("attachmentsloaded", evt => {
- onTreeLoaded(evt.attachmentsCount, this.attachmentsButton, _ui_utils.SidebarView.ATTACHMENTS);
- });
-
- this.eventBus._on("layersloaded", evt => {
- onTreeLoaded(evt.layersCount, this.layersButton, _ui_utils.SidebarView.LAYERS);
- });
-
- this.eventBus._on("presentationmodechanged", evt => {
- if (evt.state === _ui_utils.PresentationModeState.NORMAL && this.isThumbnailViewVisible) {
- this._updateThumbnailViewer();
- }
- });
- }
-
-}
-
-exports.PDFSidebar = PDFSidebar;
-
-/***/ }),
-/* 24 */
-/***/ ((__unused_webpack_module, exports) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFSidebarResizer = void 0;
-const SIDEBAR_WIDTH_VAR = "--sidebar-width";
-const SIDEBAR_MIN_WIDTH = 200;
-const SIDEBAR_RESIZING_CLASS = "sidebarResizing";
-
-class PDFSidebarResizer {
- constructor(options, eventBus, l10n) {
- this.isRTL = false;
- this.sidebarOpen = false;
- this.doc = document.documentElement;
- this._width = null;
- this._outerContainerWidth = null;
- this._boundEvents = Object.create(null);
- this.outerContainer = options.outerContainer;
- this.resizer = options.resizer;
- this.eventBus = eventBus;
- l10n.getDirection().then(dir => {
- this.isRTL = dir === "rtl";
- });
-
- this._addEventListeners();
- }
-
- get outerContainerWidth() {
- return this._outerContainerWidth || (this._outerContainerWidth = this.outerContainer.clientWidth);
- }
-
- _updateWidth(width = 0) {
- const maxWidth = Math.floor(this.outerContainerWidth / 2);
-
- if (width > maxWidth) {
- width = maxWidth;
- }
-
- if (width < SIDEBAR_MIN_WIDTH) {
- width = SIDEBAR_MIN_WIDTH;
- }
-
- if (width === this._width) {
- return false;
- }
-
- this._width = width;
- this.doc.style.setProperty(SIDEBAR_WIDTH_VAR, `${width}px`);
- return true;
- }
-
- _mouseMove(evt) {
- let width = evt.clientX;
-
- if (this.isRTL) {
- width = this.outerContainerWidth - width;
- }
-
- this._updateWidth(width);
- }
-
- _mouseUp(evt) {
- this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);
- this.eventBus.dispatch("resize", {
- source: this
- });
- const _boundEvents = this._boundEvents;
- window.removeEventListener("mousemove", _boundEvents.mouseMove);
- window.removeEventListener("mouseup", _boundEvents.mouseUp);
- }
-
- _addEventListeners() {
- const _boundEvents = this._boundEvents;
- _boundEvents.mouseMove = this._mouseMove.bind(this);
- _boundEvents.mouseUp = this._mouseUp.bind(this);
- this.resizer.addEventListener("mousedown", evt => {
- if (evt.button !== 0) {
- return;
- }
-
- this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);
- window.addEventListener("mousemove", _boundEvents.mouseMove);
- window.addEventListener("mouseup", _boundEvents.mouseUp);
- });
-
- this.eventBus._on("sidebarviewchanged", evt => {
- this.sidebarOpen = !!evt?.view;
- });
-
- this.eventBus._on("resize", evt => {
- if (evt?.source !== window) {
- return;
- }
-
- this._outerContainerWidth = null;
-
- if (!this._width) {
- return;
- }
-
- if (!this.sidebarOpen) {
- this._updateWidth(this._width);
-
- return;
- }
-
- this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);
-
- const updated = this._updateWidth(this._width);
-
- Promise.resolve().then(() => {
- this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);
-
- if (updated) {
- this.eventBus.dispatch("resize", {
- source: this
- });
- }
- });
- });
- }
-
-}
-
-exports.PDFSidebarResizer = PDFSidebarResizer;
-
-/***/ }),
-/* 25 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFThumbnailViewer = void 0;
-
-var _ui_utils = __webpack_require__(4);
-
-var _pdf_thumbnail_view = __webpack_require__(26);
-
-var _pdf_rendering_queue = __webpack_require__(8);
-
-const THUMBNAIL_SCROLL_MARGIN = -19;
-const THUMBNAIL_SELECTED_CLASS = "selected";
-
-class PDFThumbnailViewer {
- constructor({
- container,
- eventBus,
- linkService,
- renderingQueue,
- l10n
- }) {
- this.container = container;
- this.linkService = linkService;
- this.renderingQueue = renderingQueue;
- this.l10n = l10n;
- this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdated.bind(this));
-
- this._resetView();
-
- eventBus._on("optionalcontentconfigchanged", () => {
- this._setImageDisabled = true;
- });
- }
-
- _scrollUpdated() {
- this.renderingQueue.renderHighestPriority();
- }
-
- getThumbnail(index) {
- return this._thumbnails[index];
- }
-
- _getVisibleThumbs() {
- return (0, _ui_utils.getVisibleElements)({
- scrollEl: this.container,
- views: this._thumbnails
- });
- }
-
- scrollThumbnailIntoView(pageNumber) {
- if (!this.pdfDocument) {
- return;
- }
-
- const thumbnailView = this._thumbnails[pageNumber - 1];
-
- if (!thumbnailView) {
- console.error('scrollThumbnailIntoView: Invalid "pageNumber" parameter.');
- return;
- }
-
- if (pageNumber !== this._currentPageNumber) {
- const prevThumbnailView = this._thumbnails[this._currentPageNumber - 1];
- prevThumbnailView.div.classList.remove(THUMBNAIL_SELECTED_CLASS);
- thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS);
- }
-
- const visibleThumbs = this._getVisibleThumbs();
-
- const numVisibleThumbs = visibleThumbs.views.length;
-
- if (numVisibleThumbs > 0) {
- const first = visibleThumbs.first.id;
- const last = numVisibleThumbs > 1 ? visibleThumbs.last.id : first;
- let shouldScroll = false;
-
- if (pageNumber <= first || pageNumber >= last) {
- shouldScroll = true;
- } else {
- visibleThumbs.views.some(function (view) {
- if (view.id !== pageNumber) {
- return false;
- }
-
- shouldScroll = view.percent < 100;
- return true;
- });
- }
-
- if (shouldScroll) {
- (0, _ui_utils.scrollIntoView)(thumbnailView.div, {
- top: THUMBNAIL_SCROLL_MARGIN
- });
- }
- }
-
- this._currentPageNumber = pageNumber;
- }
-
- get pagesRotation() {
- return this._pagesRotation;
- }
-
- set pagesRotation(rotation) {
- if (!(0, _ui_utils.isValidRotation)(rotation)) {
- throw new Error("Invalid thumbnails rotation angle.");
- }
-
- if (!this.pdfDocument) {
- return;
- }
-
- if (this._pagesRotation === rotation) {
- return;
- }
-
- this._pagesRotation = rotation;
-
- for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {
- this._thumbnails[i].update(rotation);
- }
- }
-
- cleanup() {
- for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {
- if (this._thumbnails[i] && this._thumbnails[i].renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {
- this._thumbnails[i].reset();
- }
- }
-
- _pdf_thumbnail_view.TempImageFactory.destroyCanvas();
- }
-
- _resetView() {
- this._thumbnails = [];
- this._currentPageNumber = 1;
- this._pageLabels = null;
- this._pagesRotation = 0;
- this._optionalContentConfigPromise = null;
- this._pagesRequests = new WeakMap();
- this._setImageDisabled = false;
- this.container.textContent = "";
- }
-
- setDocument(pdfDocument) {
- if (this.pdfDocument) {
- this._cancelRendering();
-
- this._resetView();
- }
-
- this.pdfDocument = pdfDocument;
-
- if (!pdfDocument) {
- return;
- }
-
- const firstPagePromise = pdfDocument.getPage(1);
- const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig();
- firstPagePromise.then(firstPdfPage => {
- this._optionalContentConfigPromise = optionalContentConfigPromise;
- const pagesCount = pdfDocument.numPages;
- const viewport = firstPdfPage.getViewport({
- scale: 1
- });
-
- const checkSetImageDisabled = () => {
- return this._setImageDisabled;
- };
-
- for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {
- const thumbnail = new _pdf_thumbnail_view.PDFThumbnailView({
- container: this.container,
- id: pageNum,
- defaultViewport: viewport.clone(),
- optionalContentConfigPromise,
- linkService: this.linkService,
- renderingQueue: this.renderingQueue,
- checkSetImageDisabled,
- l10n: this.l10n
- });
-
- this._thumbnails.push(thumbnail);
- }
-
- const firstThumbnailView = this._thumbnails[0];
-
- if (firstThumbnailView) {
- firstThumbnailView.setPdfPage(firstPdfPage);
- }
-
- const thumbnailView = this._thumbnails[this._currentPageNumber - 1];
- thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS);
- }).catch(reason => {
- console.error("Unable to initialize thumbnail viewer", reason);
- });
- }
-
- _cancelRendering() {
- for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {
- if (this._thumbnails[i]) {
- this._thumbnails[i].cancelRendering();
- }
- }
- }
-
- setPageLabels(labels) {
- if (!this.pdfDocument) {
- return;
- }
-
- if (!labels) {
- this._pageLabels = null;
- } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) {
- this._pageLabels = null;
- console.error("PDFThumbnailViewer_setPageLabels: Invalid page labels.");
- } else {
- this._pageLabels = labels;
- }
-
- for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {
- this._thumbnails[i].setPageLabel(this._pageLabels?.[i] ?? null);
- }
- }
-
- _ensurePdfPageLoaded(thumbView) {
- if (thumbView.pdfPage) {
- return Promise.resolve(thumbView.pdfPage);
- }
-
- if (this._pagesRequests.has(thumbView)) {
- return this._pagesRequests.get(thumbView);
- }
-
- const promise = this.pdfDocument.getPage(thumbView.id).then(pdfPage => {
- if (!thumbView.pdfPage) {
- thumbView.setPdfPage(pdfPage);
- }
-
- this._pagesRequests.delete(thumbView);
-
- return pdfPage;
- }).catch(reason => {
- console.error("Unable to get page for thumb view", reason);
-
- this._pagesRequests.delete(thumbView);
- });
-
- this._pagesRequests.set(thumbView, promise);
-
- return promise;
- }
-
- forceRendering() {
- const visibleThumbs = this._getVisibleThumbs();
-
- const thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, this.scroll.down);
-
- if (thumbView) {
- this._ensurePdfPageLoaded(thumbView).then(() => {
- this.renderingQueue.renderView(thumbView);
- });
-
- return true;
- }
-
- return false;
- }
-
-}
-
-exports.PDFThumbnailViewer = PDFThumbnailViewer;
-
-/***/ }),
-/* 26 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.TempImageFactory = exports.PDFThumbnailView = void 0;
-
-var _ui_utils = __webpack_require__(4);
-
-var _pdfjsLib = __webpack_require__(5);
-
-var _pdf_rendering_queue = __webpack_require__(8);
-
-const DRAW_UPSCALE_FACTOR = 2;
-const MAX_NUM_SCALING_STEPS = 3;
-const THUMBNAIL_CANVAS_BORDER_WIDTH = 1;
-const THUMBNAIL_WIDTH = 98;
-
-const TempImageFactory = function TempImageFactoryClosure() {
- let tempCanvasCache = null;
- return {
- getCanvas(width, height) {
- let tempCanvas = tempCanvasCache;
-
- if (!tempCanvas) {
- tempCanvas = document.createElement("canvas");
- tempCanvasCache = tempCanvas;
- }
-
- tempCanvas.width = width;
- tempCanvas.height = height;
- tempCanvas.mozOpaque = true;
- const ctx = tempCanvas.getContext("2d", {
- alpha: false
- });
- ctx.save();
- ctx.fillStyle = "rgb(255, 255, 255)";
- ctx.fillRect(0, 0, width, height);
- ctx.restore();
- return [tempCanvas, tempCanvas.getContext("2d")];
- },
-
- destroyCanvas() {
- const tempCanvas = tempCanvasCache;
-
- if (tempCanvas) {
- tempCanvas.width = 0;
- tempCanvas.height = 0;
- }
-
- tempCanvasCache = null;
- }
-
- };
-}();
-
-exports.TempImageFactory = TempImageFactory;
-
-class PDFThumbnailView {
- constructor({
- container,
- id,
- defaultViewport,
- optionalContentConfigPromise,
- linkService,
- renderingQueue,
- checkSetImageDisabled,
- l10n
- }) {
- this.id = id;
- this.renderingId = "thumbnail" + id;
- this.pageLabel = null;
- this.pdfPage = null;
- this.rotation = 0;
- this.viewport = defaultViewport;
- this.pdfPageRotate = defaultViewport.rotation;
- this._optionalContentConfigPromise = optionalContentConfigPromise || null;
- this.linkService = linkService;
- this.renderingQueue = renderingQueue;
- this.renderTask = null;
- this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
- this.resume = null;
-
- this._checkSetImageDisabled = checkSetImageDisabled || function () {
- return false;
- };
-
- const pageWidth = this.viewport.width,
- pageHeight = this.viewport.height,
- pageRatio = pageWidth / pageHeight;
- this.canvasWidth = THUMBNAIL_WIDTH;
- this.canvasHeight = this.canvasWidth / pageRatio | 0;
- this.scale = this.canvasWidth / pageWidth;
- this.l10n = l10n;
- const anchor = document.createElement("a");
- anchor.href = linkService.getAnchorUrl("#page=" + id);
-
- this._thumbPageTitle.then(msg => {
- anchor.title = msg;
- });
-
- anchor.onclick = function () {
- linkService.goToPage(id);
- return false;
- };
-
- this.anchor = anchor;
- const div = document.createElement("div");
- div.className = "thumbnail";
- div.setAttribute("data-page-number", this.id);
- this.div = div;
- const ring = document.createElement("div");
- ring.className = "thumbnailSelectionRing";
- const borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;
- ring.style.width = this.canvasWidth + borderAdjustment + "px";
- ring.style.height = this.canvasHeight + borderAdjustment + "px";
- this.ring = ring;
- div.appendChild(ring);
- anchor.appendChild(div);
- container.appendChild(anchor);
- }
-
- setPdfPage(pdfPage) {
- this.pdfPage = pdfPage;
- this.pdfPageRotate = pdfPage.rotate;
- const totalRotation = (this.rotation + this.pdfPageRotate) % 360;
- this.viewport = pdfPage.getViewport({
- scale: 1,
- rotation: totalRotation
- });
- this.reset();
- }
-
- reset() {
- this.cancelRendering();
- this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
- const pageWidth = this.viewport.width,
- pageHeight = this.viewport.height,
- pageRatio = pageWidth / pageHeight;
- this.canvasHeight = this.canvasWidth / pageRatio | 0;
- this.scale = this.canvasWidth / pageWidth;
- this.div.removeAttribute("data-loaded");
- const ring = this.ring;
- ring.textContent = "";
- const borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;
- ring.style.width = this.canvasWidth + borderAdjustment + "px";
- ring.style.height = this.canvasHeight + borderAdjustment + "px";
-
- if (this.canvas) {
- this.canvas.width = 0;
- this.canvas.height = 0;
- delete this.canvas;
- }
-
- if (this.image) {
- this.image.removeAttribute("src");
- delete this.image;
- }
- }
-
- update(rotation) {
- if (typeof rotation !== "undefined") {
- this.rotation = rotation;
- }
-
- const totalRotation = (this.rotation + this.pdfPageRotate) % 360;
- this.viewport = this.viewport.clone({
- scale: 1,
- rotation: totalRotation
- });
- this.reset();
- }
-
- cancelRendering() {
- if (this.renderTask) {
- this.renderTask.cancel();
- this.renderTask = null;
- }
-
- this.resume = null;
- }
-
- _getPageDrawContext(upscaleFactor = 1) {
- const canvas = document.createElement("canvas");
- canvas.mozOpaque = true;
- const ctx = canvas.getContext("2d", {
- alpha: false
- });
- const outputScale = (0, _ui_utils.getOutputScale)(ctx);
- canvas.width = upscaleFactor * this.canvasWidth * outputScale.sx | 0;
- canvas.height = upscaleFactor * this.canvasHeight * outputScale.sy | 0;
- const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null;
- return {
- ctx,
- canvas,
- transform
- };
- }
-
- _convertCanvasToImage(canvas) {
- if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {
- throw new Error("_convertCanvasToImage: Rendering has not finished.");
- }
-
- const reducedCanvas = this._reduceImage(canvas);
-
- const image = document.createElement("img");
- image.className = "thumbnailImage";
-
- this._thumbPageCanvas.then(msg => {
- image.setAttribute("aria-label", msg);
- });
-
- image.style.width = this.canvasWidth + "px";
- image.style.height = this.canvasHeight + "px";
- image.src = reducedCanvas.toDataURL();
- this.image = image;
- this.div.setAttribute("data-loaded", true);
- this.ring.appendChild(image);
- reducedCanvas.width = 0;
- reducedCanvas.height = 0;
- }
-
- draw() {
- if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {
- console.error("Must be in new state before drawing");
- return Promise.resolve(undefined);
- }
-
- const {
- pdfPage
- } = this;
-
- if (!pdfPage) {
- this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
- return Promise.reject(new Error("pdfPage is not loaded"));
- }
-
- this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;
-
- const finishRenderTask = async (error = null) => {
- if (renderTask === this.renderTask) {
- this.renderTask = null;
- }
-
- if (error instanceof _pdfjsLib.RenderingCancelledException) {
- return;
- }
-
- this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
-
- this._convertCanvasToImage(canvas);
-
- if (error) {
- throw error;
- }
- };
-
- const {
- ctx,
- canvas,
- transform
- } = this._getPageDrawContext(DRAW_UPSCALE_FACTOR);
-
- const drawViewport = this.viewport.clone({
- scale: DRAW_UPSCALE_FACTOR * this.scale
- });
-
- const renderContinueCallback = cont => {
- if (!this.renderingQueue.isHighestPriority(this)) {
- this.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;
-
- this.resume = () => {
- this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;
- cont();
- };
-
- return;
- }
-
- cont();
- };
-
- const renderContext = {
- canvasContext: ctx,
- transform,
- viewport: drawViewport,
- optionalContentConfigPromise: this._optionalContentConfigPromise
- };
- const renderTask = this.renderTask = pdfPage.render(renderContext);
- renderTask.onContinue = renderContinueCallback;
- const resultPromise = renderTask.promise.then(function () {
- return finishRenderTask(null);
- }, function (error) {
- return finishRenderTask(error);
- });
- resultPromise.finally(() => {
- canvas.width = 0;
- canvas.height = 0;
- const pageCached = this.linkService.isPageCached(this.id);
-
- if (!pageCached) {
- this.pdfPage?.cleanup();
- }
- });
- return resultPromise;
- }
-
- setImage(pageView) {
- if (this._checkSetImageDisabled()) {
- return;
- }
-
- if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {
- return;
- }
-
- const {
- canvas,
- pdfPage
- } = pageView;
-
- if (!canvas) {
- return;
- }
-
- if (!this.pdfPage) {
- this.setPdfPage(pdfPage);
- }
-
- this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
-
- this._convertCanvasToImage(canvas);
- }
-
- _reduceImage(img) {
- const {
- ctx,
- canvas
- } = this._getPageDrawContext();
-
- if (img.width <= 2 * canvas.width) {
- ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);
- return canvas;
- }
-
- let reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS;
- let reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS;
- const [reducedImage, reducedImageCtx] = TempImageFactory.getCanvas(reducedWidth, reducedHeight);
-
- while (reducedWidth > img.width || reducedHeight > img.height) {
- reducedWidth >>= 1;
- reducedHeight >>= 1;
- }
-
- reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight);
-
- while (reducedWidth > 2 * canvas.width) {
- reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1);
- reducedWidth >>= 1;
- reducedHeight >>= 1;
- }
-
- ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height);
- return canvas;
- }
-
- get _thumbPageTitle() {
- return this.l10n.get("thumb_page_title", {
- page: this.pageLabel ?? this.id
- });
- }
-
- get _thumbPageCanvas() {
- return this.l10n.get("thumb_page_canvas", {
- page: this.pageLabel ?? this.id
- });
- }
-
- setPageLabel(label) {
- this.pageLabel = typeof label === "string" ? label : null;
-
- this._thumbPageTitle.then(msg => {
- this.anchor.title = msg;
- });
-
- if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {
- return;
- }
-
- this._thumbPageCanvas.then(msg => {
- this.image?.setAttribute("aria-label", msg);
- });
- }
-
-}
-
-exports.PDFThumbnailView = PDFThumbnailView;
-
-/***/ }),
-/* 27 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFViewer = void 0;
-
-var _ui_utils = __webpack_require__(4);
-
-var _base_viewer = __webpack_require__(28);
-
-var _pdfjsLib = __webpack_require__(5);
-
-class PDFViewer extends _base_viewer.BaseViewer {
- get _viewerElement() {
- return (0, _pdfjsLib.shadow)(this, "_viewerElement", this.viewer);
- }
-
- _scrollIntoView({
- pageDiv,
- pageSpot = null,
- pageNumber = null
- }) {
- if (!pageSpot && !this.isInPresentationMode) {
- const left = pageDiv.offsetLeft + pageDiv.clientLeft;
- const right = left + pageDiv.clientWidth;
- const {
- scrollLeft,
- clientWidth
- } = this.container;
-
- if (this._isScrollModeHorizontal || left < scrollLeft || right > scrollLeft + clientWidth) {
- pageSpot = {
- left: 0,
- top: 0
- };
- }
- }
-
- super._scrollIntoView({
- pageDiv,
- pageSpot,
- pageNumber
- });
- }
-
- _getVisiblePages() {
- if (this.isInPresentationMode) {
- return this._getCurrentVisiblePage();
- }
-
- return super._getVisiblePages();
- }
-
- _updateHelper(visiblePages) {
- if (this.isInPresentationMode) {
- return;
- }
-
- let currentId = this._currentPageNumber;
- let stillFullyVisible = false;
-
- for (const page of visiblePages) {
- if (page.percent < 100) {
- break;
- }
-
- if (page.id === currentId && this._scrollMode === _ui_utils.ScrollMode.VERTICAL && this._spreadMode === _ui_utils.SpreadMode.NONE) {
- stillFullyVisible = true;
- break;
- }
- }
-
- if (!stillFullyVisible) {
- currentId = visiblePages[0].id;
- }
-
- this._setCurrentPageNumber(currentId);
- }
-
-}
-
-exports.PDFViewer = PDFViewer;
-
-/***/ }),
-/* 28 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.BaseViewer = void 0;
-
-var _pdfjsLib = __webpack_require__(5);
-
-var _ui_utils = __webpack_require__(4);
-
-var _pdf_rendering_queue = __webpack_require__(8);
-
-var _annotation_layer_builder = __webpack_require__(29);
-
-var _l10n_utils = __webpack_require__(30);
-
-var _pdf_page_view = __webpack_require__(31);
-
-var _pdf_link_service = __webpack_require__(19);
-
-var _struct_tree_layer_builder = __webpack_require__(32);
-
-var _text_layer_builder = __webpack_require__(33);
-
-var _xfa_layer_builder = __webpack_require__(34);
-
-const DEFAULT_CACHE_SIZE = 10;
-
-function PDFPageViewBuffer(size) {
- const data = [];
-
- this.push = function (view) {
- const i = data.indexOf(view);
-
- if (i >= 0) {
- data.splice(i, 1);
- }
-
- data.push(view);
-
- if (data.length > size) {
- data.shift().destroy();
- }
- };
-
- this.resize = function (newSize, pagesToKeep) {
- size = newSize;
-
- if (pagesToKeep) {
- const pageIdsToKeep = new Set();
-
- for (let i = 0, iMax = pagesToKeep.length; i < iMax; ++i) {
- pageIdsToKeep.add(pagesToKeep[i].id);
- }
-
- (0, _ui_utils.moveToEndOfArray)(data, function (page) {
- return pageIdsToKeep.has(page.id);
- });
- }
-
- while (data.length > size) {
- data.shift().destroy();
- }
- };
-
- this.has = function (view) {
- return data.includes(view);
- };
-}
-
-function isSameScale(oldScale, newScale) {
- if (newScale === oldScale) {
- return true;
- }
-
- if (Math.abs(newScale - oldScale) < 1e-15) {
- return true;
- }
-
- return false;
-}
-
-class BaseViewer {
- constructor(options) {
- if (this.constructor === BaseViewer) {
- throw new Error("Cannot initialize BaseViewer.");
- }
-
- const viewerVersion = '2.10.377';
-
- if (_pdfjsLib.version !== viewerVersion) {
- throw new Error(`The API version "${_pdfjsLib.version}" does not match the Viewer version "${viewerVersion}".`);
- }
-
- this._name = this.constructor.name;
- this.container = options.container;
- this.viewer = options.viewer || options.container.firstElementChild;
-
- if (!(this.container?.tagName.toUpperCase() === "DIV" && this.viewer?.tagName.toUpperCase() === "DIV")) {
- throw new Error("Invalid `container` and/or `viewer` option.");
- }
-
- if (this.container.offsetParent && getComputedStyle(this.container).position !== "absolute") {
- throw new Error("The `container` must be absolutely positioned.");
- }
-
- this.eventBus = options.eventBus;
- this.linkService = options.linkService || new _pdf_link_service.SimpleLinkService();
- this.downloadManager = options.downloadManager || null;
- this.findController = options.findController || null;
- this._scriptingManager = options.scriptingManager || null;
- this.removePageBorders = options.removePageBorders || false;
- this.textLayerMode = Number.isInteger(options.textLayerMode) ? options.textLayerMode : _ui_utils.TextLayerMode.ENABLE;
- this.imageResourcesPath = options.imageResourcesPath || "";
- this.renderInteractiveForms = options.renderInteractiveForms !== false;
- this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;
- this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;
- this.useOnlyCssZoom = options.useOnlyCssZoom || false;
- this.maxCanvasPixels = options.maxCanvasPixels;
- this.l10n = options.l10n || _l10n_utils.NullL10n;
- this.enableScripting = options.enableScripting === true && !!this._scriptingManager;
- this.defaultRenderingQueue = !options.renderingQueue;
-
- if (this.defaultRenderingQueue) {
- this.renderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();
- this.renderingQueue.setViewer(this);
- } else {
- this.renderingQueue = options.renderingQueue;
- }
-
- this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdate.bind(this));
- this.presentationModeState = _ui_utils.PresentationModeState.UNKNOWN;
- this._onBeforeDraw = this._onAfterDraw = null;
-
- this._resetView();
-
- if (this.removePageBorders) {
- this.viewer.classList.add("removePageBorders");
- }
-
- Promise.resolve().then(() => {
- this.eventBus.dispatch("baseviewerinit", {
- source: this
- });
- });
- }
-
- get pagesCount() {
- return this._pages.length;
- }
-
- getPageView(index) {
- return this._pages[index];
- }
-
- get pageViewsReady() {
- if (!this._pagesCapability.settled) {
- return false;
- }
-
- return this._pages.every(function (pageView) {
- return pageView?.pdfPage;
- });
- }
-
- get currentPageNumber() {
- return this._currentPageNumber;
- }
-
- set currentPageNumber(val) {
- if (!Number.isInteger(val)) {
- throw new Error("Invalid page number.");
- }
-
- if (!this.pdfDocument) {
- return;
- }
-
- if (!this._setCurrentPageNumber(val, true)) {
- console.error(`${this._name}.currentPageNumber: "${val}" is not a valid page.`);
- }
- }
-
- _setCurrentPageNumber(val, resetCurrentPageView = false) {
- if (this._currentPageNumber === val) {
- if (resetCurrentPageView) {
- this._resetCurrentPageView();
- }
-
- return true;
- }
-
- if (!(0 < val && val <= this.pagesCount)) {
- return false;
- }
-
- const previous = this._currentPageNumber;
- this._currentPageNumber = val;
- this.eventBus.dispatch("pagechanging", {
- source: this,
- pageNumber: val,
- pageLabel: this._pageLabels?.[val - 1] ?? null,
- previous
- });
-
- if (resetCurrentPageView) {
- this._resetCurrentPageView();
- }
-
- return true;
- }
-
- get currentPageLabel() {
- return this._pageLabels?.[this._currentPageNumber - 1] ?? null;
- }
-
- set currentPageLabel(val) {
- if (!this.pdfDocument) {
- return;
- }
-
- let page = val | 0;
-
- if (this._pageLabels) {
- const i = this._pageLabels.indexOf(val);
-
- if (i >= 0) {
- page = i + 1;
- }
- }
-
- if (!this._setCurrentPageNumber(page, true)) {
- console.error(`${this._name}.currentPageLabel: "${val}" is not a valid page.`);
- }
- }
-
- get currentScale() {
- return this._currentScale !== _ui_utils.UNKNOWN_SCALE ? this._currentScale : _ui_utils.DEFAULT_SCALE;
- }
-
- set currentScale(val) {
- if (isNaN(val)) {
- throw new Error("Invalid numeric scale.");
- }
-
- if (!this.pdfDocument) {
- return;
- }
-
- this._setScale(val, false);
- }
-
- get currentScaleValue() {
- return this._currentScaleValue;
- }
-
- set currentScaleValue(val) {
- if (!this.pdfDocument) {
- return;
- }
-
- this._setScale(val, false);
- }
-
- get pagesRotation() {
- return this._pagesRotation;
- }
-
- set pagesRotation(rotation) {
- if (!(0, _ui_utils.isValidRotation)(rotation)) {
- throw new Error("Invalid pages rotation angle.");
- }
-
- if (!this.pdfDocument) {
- return;
- }
-
- rotation %= 360;
-
- if (rotation < 0) {
- rotation += 360;
- }
-
- if (this._pagesRotation === rotation) {
- return;
- }
-
- this._pagesRotation = rotation;
- const pageNumber = this._currentPageNumber;
-
- for (let i = 0, ii = this._pages.length; i < ii; i++) {
- const pageView = this._pages[i];
- pageView.update(pageView.scale, rotation);
- }
-
- if (this._currentScaleValue) {
- this._setScale(this._currentScaleValue, true);
- }
-
- this.eventBus.dispatch("rotationchanging", {
- source: this,
- pagesRotation: rotation,
- pageNumber
- });
-
- if (this.defaultRenderingQueue) {
- this.update();
- }
- }
-
- get firstPagePromise() {
- return this.pdfDocument ? this._firstPageCapability.promise : null;
- }
-
- get onePageRendered() {
- return this.pdfDocument ? this._onePageRenderedCapability.promise : null;
- }
-
- get pagesPromise() {
- return this.pdfDocument ? this._pagesCapability.promise : null;
- }
-
- get _viewerElement() {
- throw new Error("Not implemented: _viewerElement");
- }
-
- _onePageRenderedOrForceFetch() {
- if (!this.container.offsetParent || this._getVisiblePages().views.length === 0) {
- return Promise.resolve();
- }
-
- return this._onePageRenderedCapability.promise;
- }
-
- setDocument(pdfDocument) {
- if (this.pdfDocument) {
- this.eventBus.dispatch("pagesdestroy", {
- source: this
- });
-
- this._cancelRendering();
-
- this._resetView();
-
- if (this.findController) {
- this.findController.setDocument(null);
- }
-
- if (this._scriptingManager) {
- this._scriptingManager.setDocument(null);
- }
- }
-
- this.pdfDocument = pdfDocument;
-
- if (!pdfDocument) {
- return;
- }
-
- const isPureXfa = pdfDocument.isPureXfa;
- const pagesCount = pdfDocument.numPages;
- const firstPagePromise = pdfDocument.getPage(1);
- const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig();
-
- this._pagesCapability.promise.then(() => {
- this.eventBus.dispatch("pagesloaded", {
- source: this,
- pagesCount
- });
- });
-
- this._onBeforeDraw = evt => {
- const pageView = this._pages[evt.pageNumber - 1];
-
- if (!pageView) {
- return;
- }
-
- this._buffer.push(pageView);
- };
-
- this.eventBus._on("pagerender", this._onBeforeDraw);
-
- this._onAfterDraw = evt => {
- if (evt.cssTransform || this._onePageRenderedCapability.settled) {
- return;
- }
-
- this._onePageRenderedCapability.resolve();
-
- this.eventBus._off("pagerendered", this._onAfterDraw);
-
- this._onAfterDraw = null;
- };
-
- this.eventBus._on("pagerendered", this._onAfterDraw);
-
- firstPagePromise.then(firstPdfPage => {
- this._firstPageCapability.resolve(firstPdfPage);
-
- this._optionalContentConfigPromise = optionalContentConfigPromise;
- const scale = this.currentScale;
- const viewport = firstPdfPage.getViewport({
- scale: scale * _ui_utils.CSS_UNITS
- });
- const textLayerFactory = this.textLayerMode !== _ui_utils.TextLayerMode.DISABLE ? this : null;
- const xfaLayerFactory = isPureXfa ? this : null;
-
- for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {
- const pageView = new _pdf_page_view.PDFPageView({
- container: this._viewerElement,
- eventBus: this.eventBus,
- id: pageNum,
- scale,
- defaultViewport: viewport.clone(),
- optionalContentConfigPromise,
- renderingQueue: this.renderingQueue,
- textLayerFactory,
- textLayerMode: this.textLayerMode,
- annotationLayerFactory: this,
- xfaLayerFactory,
- structTreeLayerFactory: this,
- imageResourcesPath: this.imageResourcesPath,
- renderInteractiveForms: this.renderInteractiveForms,
- renderer: this.renderer,
- useOnlyCssZoom: this.useOnlyCssZoom,
- maxCanvasPixels: this.maxCanvasPixels,
- l10n: this.l10n
- });
-
- this._pages.push(pageView);
- }
-
- const firstPageView = this._pages[0];
-
- if (firstPageView) {
- firstPageView.setPdfPage(firstPdfPage);
- this.linkService.cachePageRef(1, firstPdfPage.ref);
- }
-
- if (this._spreadMode !== _ui_utils.SpreadMode.NONE) {
- this._updateSpreadMode();
- }
-
- this._onePageRenderedOrForceFetch().then(() => {
- if (this.findController) {
- this.findController.setDocument(pdfDocument);
- }
-
- if (this.enableScripting) {
- this._scriptingManager.setDocument(pdfDocument);
- }
-
- if (pdfDocument.loadingParams.disableAutoFetch || pagesCount > 7500) {
- this._pagesCapability.resolve();
-
- return;
- }
-
- let getPagesLeft = pagesCount - 1;
-
- if (getPagesLeft <= 0) {
- this._pagesCapability.resolve();
-
- return;
- }
-
- for (let pageNum = 2; pageNum <= pagesCount; ++pageNum) {
- pdfDocument.getPage(pageNum).then(pdfPage => {
- const pageView = this._pages[pageNum - 1];
-
- if (!pageView.pdfPage) {
- pageView.setPdfPage(pdfPage);
- }
-
- this.linkService.cachePageRef(pageNum, pdfPage.ref);
-
- if (--getPagesLeft === 0) {
- this._pagesCapability.resolve();
- }
- }, reason => {
- console.error(`Unable to get page ${pageNum} to initialize viewer`, reason);
-
- if (--getPagesLeft === 0) {
- this._pagesCapability.resolve();
- }
- });
- }
- });
-
- this.eventBus.dispatch("pagesinit", {
- source: this
- });
-
- if (this.defaultRenderingQueue) {
- this.update();
- }
- }).catch(reason => {
- console.error("Unable to initialize viewer", reason);
- });
- }
-
- setPageLabels(labels) {
- if (!this.pdfDocument) {
- return;
- }
-
- if (!labels) {
- this._pageLabels = null;
- } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) {
- this._pageLabels = null;
- console.error(`${this._name}.setPageLabels: Invalid page labels.`);
- } else {
- this._pageLabels = labels;
- }
-
- for (let i = 0, ii = this._pages.length; i < ii; i++) {
- this._pages[i].setPageLabel(this._pageLabels?.[i] ?? null);
- }
- }
-
- _resetView() {
- this._pages = [];
- this._currentPageNumber = 1;
- this._currentScale = _ui_utils.UNKNOWN_SCALE;
- this._currentScaleValue = null;
- this._pageLabels = null;
- this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);
- this._location = null;
- this._pagesRotation = 0;
- this._optionalContentConfigPromise = null;
- this._pagesRequests = new WeakMap();
- this._firstPageCapability = (0, _pdfjsLib.createPromiseCapability)();
- this._onePageRenderedCapability = (0, _pdfjsLib.createPromiseCapability)();
- this._pagesCapability = (0, _pdfjsLib.createPromiseCapability)();
- this._scrollMode = _ui_utils.ScrollMode.VERTICAL;
- this._spreadMode = _ui_utils.SpreadMode.NONE;
-
- if (this._onBeforeDraw) {
- this.eventBus._off("pagerender", this._onBeforeDraw);
-
- this._onBeforeDraw = null;
- }
-
- if (this._onAfterDraw) {
- this.eventBus._off("pagerendered", this._onAfterDraw);
-
- this._onAfterDraw = null;
- }
-
- this.viewer.textContent = "";
-
- this._updateScrollMode();
- }
-
- _scrollUpdate() {
- if (this.pagesCount === 0) {
- return;
- }
-
- this.update();
- }
-
- _scrollIntoView({
- pageDiv,
- pageSpot = null,
- pageNumber = null
- }) {
- (0, _ui_utils.scrollIntoView)(pageDiv, pageSpot);
- }
-
- _setScaleUpdatePages(newScale, newValue, noScroll = false, preset = false) {
- this._currentScaleValue = newValue.toString();
-
- if (isSameScale(this._currentScale, newScale)) {
- if (preset) {
- this.eventBus.dispatch("scalechanging", {
- source: this,
- scale: newScale,
- presetValue: newValue
- });
- }
-
- return;
- }
-
- for (let i = 0, ii = this._pages.length; i < ii; i++) {
- this._pages[i].update(newScale);
- }
-
- this._currentScale = newScale;
-
- if (!noScroll) {
- let page = this._currentPageNumber,
- dest;
-
- if (this._location && !(this.isInPresentationMode || this.isChangingPresentationMode)) {
- page = this._location.pageNumber;
- dest = [null, {
- name: "XYZ"
- }, this._location.left, this._location.top, null];
- }
-
- this.scrollPageIntoView({
- pageNumber: page,
- destArray: dest,
- allowNegativeOffset: true
- });
- }
-
- this.eventBus.dispatch("scalechanging", {
- source: this,
- scale: newScale,
- presetValue: preset ? newValue : undefined
- });
-
- if (this.defaultRenderingQueue) {
- this.update();
- }
- }
-
- get _pageWidthScaleFactor() {
- if (this._spreadMode !== _ui_utils.SpreadMode.NONE && this._scrollMode !== _ui_utils.ScrollMode.HORIZONTAL && !this.isInPresentationMode) {
- return 2;
- }
-
- return 1;
- }
-
- _setScale(value, noScroll = false) {
- let scale = parseFloat(value);
-
- if (scale > 0) {
- this._setScaleUpdatePages(scale, value, noScroll, false);
- } else {
- const currentPage = this._pages[this._currentPageNumber - 1];
-
- if (!currentPage) {
- return;
- }
-
- const noPadding = this.isInPresentationMode || this.removePageBorders;
- let hPadding = noPadding ? 0 : _ui_utils.SCROLLBAR_PADDING;
- let vPadding = noPadding ? 0 : _ui_utils.VERTICAL_PADDING;
-
- if (!noPadding && this._isScrollModeHorizontal) {
- [hPadding, vPadding] = [vPadding, hPadding];
- }
-
- const pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale / this._pageWidthScaleFactor;
- const pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale;
-
- switch (value) {
- case "page-actual":
- scale = 1;
- break;
-
- case "page-width":
- scale = pageWidthScale;
- break;
-
- case "page-height":
- scale = pageHeightScale;
- break;
-
- case "page-fit":
- scale = Math.min(pageWidthScale, pageHeightScale);
- break;
-
- case "auto":
- const horizontalScale = (0, _ui_utils.isPortraitOrientation)(currentPage) ? pageWidthScale : Math.min(pageHeightScale, pageWidthScale);
- scale = Math.min(_ui_utils.MAX_AUTO_SCALE, horizontalScale);
- break;
-
- default:
- console.error(`${this._name}._setScale: "${value}" is an unknown zoom value.`);
- return;
- }
-
- this._setScaleUpdatePages(scale, value, noScroll, true);
- }
- }
-
- _resetCurrentPageView() {
- if (this.isInPresentationMode) {
- this._setScale(this._currentScaleValue, true);
- }
-
- const pageView = this._pages[this._currentPageNumber - 1];
-
- this._scrollIntoView({
- pageDiv: pageView.div
- });
- }
-
- pageLabelToPageNumber(label) {
- if (!this._pageLabels) {
- return null;
- }
-
- const i = this._pageLabels.indexOf(label);
-
- if (i < 0) {
- return null;
- }
-
- return i + 1;
- }
-
- scrollPageIntoView({
- pageNumber,
- destArray = null,
- allowNegativeOffset = false,
- ignoreDestinationZoom = false
- }) {
- if (!this.pdfDocument) {
- return;
- }
-
- const pageView = Number.isInteger(pageNumber) && this._pages[pageNumber - 1];
-
- if (!pageView) {
- console.error(`${this._name}.scrollPageIntoView: ` + `"${pageNumber}" is not a valid pageNumber parameter.`);
- return;
- }
-
- if (this.isInPresentationMode || !destArray) {
- this._setCurrentPageNumber(pageNumber, true);
-
- return;
- }
-
- let x = 0,
- y = 0;
- let width = 0,
- height = 0,
- widthScale,
- heightScale;
- const changeOrientation = pageView.rotation % 180 !== 0;
- const pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / _ui_utils.CSS_UNITS;
- const pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / _ui_utils.CSS_UNITS;
- let scale = 0;
-
- switch (destArray[1].name) {
- case "XYZ":
- x = destArray[2];
- y = destArray[3];
- scale = destArray[4];
- x = x !== null ? x : 0;
- y = y !== null ? y : pageHeight;
- break;
-
- case "Fit":
- case "FitB":
- scale = "page-fit";
- break;
-
- case "FitH":
- case "FitBH":
- y = destArray[2];
- scale = "page-width";
-
- if (y === null && this._location) {
- x = this._location.left;
- y = this._location.top;
- } else if (typeof y !== "number") {
- y = pageHeight;
- }
-
- break;
-
- case "FitV":
- case "FitBV":
- x = destArray[2];
- width = pageWidth;
- height = pageHeight;
- scale = "page-height";
- break;
-
- case "FitR":
- x = destArray[2];
- y = destArray[3];
- width = destArray[4] - x;
- height = destArray[5] - y;
- const hPadding = this.removePageBorders ? 0 : _ui_utils.SCROLLBAR_PADDING;
- const vPadding = this.removePageBorders ? 0 : _ui_utils.VERTICAL_PADDING;
- widthScale = (this.container.clientWidth - hPadding) / width / _ui_utils.CSS_UNITS;
- heightScale = (this.container.clientHeight - vPadding) / height / _ui_utils.CSS_UNITS;
- scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));
- break;
-
- default:
- console.error(`${this._name}.scrollPageIntoView: ` + `"${destArray[1].name}" is not a valid destination type.`);
- return;
- }
-
- if (!ignoreDestinationZoom) {
- if (scale && scale !== this._currentScale) {
- this.currentScaleValue = scale;
- } else if (this._currentScale === _ui_utils.UNKNOWN_SCALE) {
- this.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;
- }
- }
-
- if (scale === "page-fit" && !destArray[4]) {
- this._scrollIntoView({
- pageDiv: pageView.div,
- pageNumber
- });
-
- return;
- }
-
- const boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)];
- let left = Math.min(boundingRect[0][0], boundingRect[1][0]);
- let top = Math.min(boundingRect[0][1], boundingRect[1][1]);
-
- if (!allowNegativeOffset) {
- left = Math.max(left, 0);
- top = Math.max(top, 0);
- }
-
- this._scrollIntoView({
- pageDiv: pageView.div,
- pageSpot: {
- left,
- top
- },
- pageNumber
- });
- }
-
- _updateLocation(firstPage) {
- const currentScale = this._currentScale;
- const currentScaleValue = this._currentScaleValue;
- const normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue;
- const pageNumber = firstPage.id;
- let pdfOpenParams = "#page=" + pageNumber;
- pdfOpenParams += "&zoom=" + normalizedScaleValue;
- const currentPageView = this._pages[pageNumber - 1];
- const container = this.container;
- const topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y);
- const intLeft = Math.round(topLeft[0]);
- const intTop = Math.round(topLeft[1]);
- pdfOpenParams += "," + intLeft + "," + intTop;
- this._location = {
- pageNumber,
- scale: normalizedScaleValue,
- top: intTop,
- left: intLeft,
- rotation: this._pagesRotation,
- pdfOpenParams
- };
- }
-
- _updateHelper(visiblePages) {
- throw new Error("Not implemented: _updateHelper");
- }
-
- update() {
- const visible = this._getVisiblePages();
-
- const visiblePages = visible.views,
- numVisiblePages = visiblePages.length;
-
- if (numVisiblePages === 0) {
- return;
- }
-
- const newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1);
-
- this._buffer.resize(newCacheSize, visiblePages);
-
- this.renderingQueue.renderHighestPriority(visible);
-
- this._updateHelper(visiblePages);
-
- this._updateLocation(visible.first);
-
- this.eventBus.dispatch("updateviewarea", {
- source: this,
- location: this._location
- });
- }
-
- containsElement(element) {
- return this.container.contains(element);
- }
-
- focus() {
- this.container.focus();
- }
-
- get _isScrollModeHorizontal() {
- return this.isInPresentationMode ? false : this._scrollMode === _ui_utils.ScrollMode.HORIZONTAL;
- }
-
- get _isContainerRtl() {
- return getComputedStyle(this.container).direction === "rtl";
- }
-
- get isInPresentationMode() {
- return this.presentationModeState === _ui_utils.PresentationModeState.FULLSCREEN;
- }
-
- get isChangingPresentationMode() {
- return this.presentationModeState === _ui_utils.PresentationModeState.CHANGING;
- }
-
- get isHorizontalScrollbarEnabled() {
- return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth;
- }
-
- get isVerticalScrollbarEnabled() {
- return this.isInPresentationMode ? false : this.container.scrollHeight > this.container.clientHeight;
- }
-
- _getCurrentVisiblePage() {
- if (!this.pagesCount) {
- return {
- views: []
- };
- }
-
- const pageView = this._pages[this._currentPageNumber - 1];
- const element = pageView.div;
- const view = {
- id: pageView.id,
- x: element.offsetLeft + element.clientLeft,
- y: element.offsetTop + element.clientTop,
- view: pageView
- };
- return {
- first: view,
- last: view,
- views: [view]
- };
- }
-
- _getVisiblePages() {
- return (0, _ui_utils.getVisibleElements)({
- scrollEl: this.container,
- views: this._pages,
- sortByVisibility: true,
- horizontal: this._isScrollModeHorizontal,
- rtl: this._isScrollModeHorizontal && this._isContainerRtl
- });
- }
-
- isPageVisible(pageNumber) {
- if (!this.pdfDocument) {
- return false;
- }
-
- if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) {
- console.error(`${this._name}.isPageVisible: "${pageNumber}" is not a valid page.`);
- return false;
- }
-
- return this._getVisiblePages().views.some(function (view) {
- return view.id === pageNumber;
- });
- }
-
- isPageCached(pageNumber) {
- if (!this.pdfDocument || !this._buffer) {
- return false;
- }
-
- if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) {
- console.error(`${this._name}.isPageCached: "${pageNumber}" is not a valid page.`);
- return false;
- }
-
- const pageView = this._pages[pageNumber - 1];
-
- if (!pageView) {
- return false;
- }
-
- return this._buffer.has(pageView);
- }
-
- cleanup() {
- for (let i = 0, ii = this._pages.length; i < ii; i++) {
- if (this._pages[i] && this._pages[i].renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {
- this._pages[i].reset();
- }
- }
- }
-
- _cancelRendering() {
- for (let i = 0, ii = this._pages.length; i < ii; i++) {
- if (this._pages[i]) {
- this._pages[i].cancelRendering();
- }
- }
- }
-
- _ensurePdfPageLoaded(pageView) {
- if (pageView.pdfPage) {
- return Promise.resolve(pageView.pdfPage);
- }
-
- if (this._pagesRequests.has(pageView)) {
- return this._pagesRequests.get(pageView);
- }
-
- const promise = this.pdfDocument.getPage(pageView.id).then(pdfPage => {
- if (!pageView.pdfPage) {
- pageView.setPdfPage(pdfPage);
- }
-
- this._pagesRequests.delete(pageView);
-
- return pdfPage;
- }).catch(reason => {
- console.error("Unable to get page for page view", reason);
-
- this._pagesRequests.delete(pageView);
- });
-
- this._pagesRequests.set(pageView, promise);
-
- return promise;
- }
-
- forceRendering(currentlyVisiblePages) {
- const visiblePages = currentlyVisiblePages || this._getVisiblePages();
-
- const scrollAhead = this._isScrollModeHorizontal ? this.scroll.right : this.scroll.down;
- const pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead);
-
- if (pageView) {
- this._ensurePdfPageLoaded(pageView).then(() => {
- this.renderingQueue.renderView(pageView);
- });
-
- return true;
- }
-
- return false;
- }
-
- createTextLayerBuilder(textLayerDiv, pageIndex, viewport, enhanceTextSelection = false, eventBus) {
- return new _text_layer_builder.TextLayerBuilder({
- textLayerDiv,
- eventBus,
- pageIndex,
- viewport,
- findController: this.isInPresentationMode ? null : this.findController,
- enhanceTextSelection: this.isInPresentationMode ? false : enhanceTextSelection
- });
- }
-
- createAnnotationLayerBuilder(pageDiv, pdfPage, annotationStorage = null, imageResourcesPath = "", renderInteractiveForms = false, l10n = _l10n_utils.NullL10n, enableScripting = null, hasJSActionsPromise = null, mouseState = null) {
- return new _annotation_layer_builder.AnnotationLayerBuilder({
- pageDiv,
- pdfPage,
- annotationStorage: annotationStorage || this.pdfDocument?.annotationStorage,
- imageResourcesPath,
- renderInteractiveForms,
- linkService: this.linkService,
- downloadManager: this.downloadManager,
- l10n,
- enableScripting: enableScripting ?? this.enableScripting,
- hasJSActionsPromise: hasJSActionsPromise || this.pdfDocument?.hasJSActions(),
- mouseState: mouseState || this._scriptingManager?.mouseState
- });
- }
-
- createXfaLayerBuilder(pageDiv, pdfPage, annotationStorage = null) {
- return new _xfa_layer_builder.XfaLayerBuilder({
- pageDiv,
- pdfPage,
- annotationStorage: annotationStorage || this.pdfDocument?.annotationStorage
- });
- }
-
- createStructTreeLayerBuilder(pdfPage) {
- return new _struct_tree_layer_builder.StructTreeLayerBuilder({
- pdfPage
- });
- }
-
- get hasEqualPageSizes() {
- const firstPageView = this._pages[0];
-
- for (let i = 1, ii = this._pages.length; i < ii; ++i) {
- const pageView = this._pages[i];
-
- if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) {
- return false;
- }
- }
-
- return true;
- }
-
- getPagesOverview() {
- return this._pages.map(pageView => {
- const viewport = pageView.pdfPage.getViewport({
- scale: 1
- });
-
- if (!this.enablePrintAutoRotate || (0, _ui_utils.isPortraitOrientation)(viewport)) {
- return {
- width: viewport.width,
- height: viewport.height,
- rotation: viewport.rotation
- };
- }
-
- return {
- width: viewport.height,
- height: viewport.width,
- rotation: (viewport.rotation - 90) % 360
- };
- });
- }
-
- get optionalContentConfigPromise() {
- if (!this.pdfDocument) {
- return Promise.resolve(null);
- }
-
- if (!this._optionalContentConfigPromise) {
- return this.pdfDocument.getOptionalContentConfig();
- }
-
- return this._optionalContentConfigPromise;
- }
-
- set optionalContentConfigPromise(promise) {
- if (!(promise instanceof Promise)) {
- throw new Error(`Invalid optionalContentConfigPromise: ${promise}`);
- }
-
- if (!this.pdfDocument) {
- return;
- }
-
- if (!this._optionalContentConfigPromise) {
- return;
- }
-
- this._optionalContentConfigPromise = promise;
-
- for (const pageView of this._pages) {
- pageView.update(pageView.scale, pageView.rotation, promise);
- }
-
- this.update();
- this.eventBus.dispatch("optionalcontentconfigchanged", {
- source: this,
- promise
- });
- }
-
- get scrollMode() {
- return this._scrollMode;
- }
-
- set scrollMode(mode) {
- if (this._scrollMode === mode) {
- return;
- }
-
- if (!(0, _ui_utils.isValidScrollMode)(mode)) {
- throw new Error(`Invalid scroll mode: ${mode}`);
- }
-
- this._scrollMode = mode;
- this.eventBus.dispatch("scrollmodechanged", {
- source: this,
- mode
- });
-
- this._updateScrollMode(this._currentPageNumber);
- }
-
- _updateScrollMode(pageNumber = null) {
- const scrollMode = this._scrollMode,
- viewer = this.viewer;
- viewer.classList.toggle("scrollHorizontal", scrollMode === _ui_utils.ScrollMode.HORIZONTAL);
- viewer.classList.toggle("scrollWrapped", scrollMode === _ui_utils.ScrollMode.WRAPPED);
-
- if (!this.pdfDocument || !pageNumber) {
- return;
- }
-
- if (this._currentScaleValue && isNaN(this._currentScaleValue)) {
- this._setScale(this._currentScaleValue, true);
- }
-
- this._setCurrentPageNumber(pageNumber, true);
-
- this.update();
- }
-
- get spreadMode() {
- return this._spreadMode;
- }
-
- set spreadMode(mode) {
- if (this._spreadMode === mode) {
- return;
- }
-
- if (!(0, _ui_utils.isValidSpreadMode)(mode)) {
- throw new Error(`Invalid spread mode: ${mode}`);
- }
-
- this._spreadMode = mode;
- this.eventBus.dispatch("spreadmodechanged", {
- source: this,
- mode
- });
-
- this._updateSpreadMode(this._currentPageNumber);
- }
-
- _updateSpreadMode(pageNumber = null) {
- if (!this.pdfDocument) {
- return;
- }
-
- const viewer = this.viewer,
- pages = this._pages;
- viewer.textContent = "";
-
- if (this._spreadMode === _ui_utils.SpreadMode.NONE) {
- for (let i = 0, iMax = pages.length; i < iMax; ++i) {
- viewer.appendChild(pages[i].div);
- }
- } else {
- const parity = this._spreadMode - 1;
- let spread = null;
-
- for (let i = 0, iMax = pages.length; i < iMax; ++i) {
- if (spread === null) {
- spread = document.createElement("div");
- spread.className = "spread";
- viewer.appendChild(spread);
- } else if (i % 2 === parity) {
- spread = spread.cloneNode(false);
- viewer.appendChild(spread);
- }
-
- spread.appendChild(pages[i].div);
- }
- }
-
- if (!pageNumber) {
- return;
- }
-
- if (this._currentScaleValue && isNaN(this._currentScaleValue)) {
- this._setScale(this._currentScaleValue, true);
- }
-
- this._setCurrentPageNumber(pageNumber, true);
-
- this.update();
- }
-
- _getPageAdvance(currentPageNumber, previous = false) {
- if (this.isInPresentationMode) {
- return 1;
- }
-
- switch (this._scrollMode) {
- case _ui_utils.ScrollMode.WRAPPED:
- {
- const {
- views
- } = this._getVisiblePages(),
- pageLayout = new Map();
-
- for (const {
- id,
- y,
- percent,
- widthPercent
- } of views) {
- if (percent === 0 || widthPercent < 100) {
- continue;
- }
-
- let yArray = pageLayout.get(y);
-
- if (!yArray) {
- pageLayout.set(y, yArray || (yArray = []));
- }
-
- yArray.push(id);
- }
-
- for (const yArray of pageLayout.values()) {
- const currentIndex = yArray.indexOf(currentPageNumber);
-
- if (currentIndex === -1) {
- continue;
- }
-
- const numPages = yArray.length;
-
- if (numPages === 1) {
- break;
- }
-
- if (previous) {
- for (let i = currentIndex - 1, ii = 0; i >= ii; i--) {
- const currentId = yArray[i],
- expectedId = yArray[i + 1] - 1;
-
- if (currentId < expectedId) {
- return currentPageNumber - expectedId;
- }
- }
- } else {
- for (let i = currentIndex + 1, ii = numPages; i < ii; i++) {
- const currentId = yArray[i],
- expectedId = yArray[i - 1] + 1;
-
- if (currentId > expectedId) {
- return expectedId - currentPageNumber;
- }
- }
- }
-
- if (previous) {
- const firstId = yArray[0];
-
- if (firstId < currentPageNumber) {
- return currentPageNumber - firstId + 1;
- }
- } else {
- const lastId = yArray[numPages - 1];
-
- if (lastId > currentPageNumber) {
- return lastId - currentPageNumber + 1;
- }
- }
-
- break;
- }
-
- break;
- }
-
- case _ui_utils.ScrollMode.HORIZONTAL:
- {
- break;
- }
-
- case _ui_utils.ScrollMode.VERTICAL:
- {
- if (this._spreadMode === _ui_utils.SpreadMode.NONE) {
- break;
- }
-
- const parity = this._spreadMode - 1;
-
- if (previous && currentPageNumber % 2 !== parity) {
- break;
- } else if (!previous && currentPageNumber % 2 === parity) {
- break;
- }
-
- const {
- views
- } = this._getVisiblePages(),
- expectedId = previous ? currentPageNumber - 1 : currentPageNumber + 1;
-
- for (const {
- id,
- percent,
- widthPercent
- } of views) {
- if (id !== expectedId) {
- continue;
- }
-
- if (percent > 0 && widthPercent === 100) {
- return 2;
- }
-
- break;
- }
-
- break;
- }
- }
-
- return 1;
- }
-
- nextPage() {
- const currentPageNumber = this._currentPageNumber,
- pagesCount = this.pagesCount;
-
- if (currentPageNumber >= pagesCount) {
- return false;
- }
-
- const advance = this._getPageAdvance(currentPageNumber, false) || 1;
- this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount);
- return true;
- }
-
- previousPage() {
- const currentPageNumber = this._currentPageNumber;
-
- if (currentPageNumber <= 1) {
- return false;
- }
-
- const advance = this._getPageAdvance(currentPageNumber, true) || 1;
- this.currentPageNumber = Math.max(currentPageNumber - advance, 1);
- return true;
- }
-
-}
-
-exports.BaseViewer = BaseViewer;
-
-/***/ }),
-/* 29 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.DefaultAnnotationLayerFactory = exports.AnnotationLayerBuilder = void 0;
-
-var _pdfjsLib = __webpack_require__(5);
-
-var _l10n_utils = __webpack_require__(30);
-
-var _pdf_link_service = __webpack_require__(19);
-
-class AnnotationLayerBuilder {
- constructor({
- pageDiv,
- pdfPage,
- linkService,
- downloadManager,
- annotationStorage = null,
- imageResourcesPath = "",
- renderInteractiveForms = true,
- l10n = _l10n_utils.NullL10n,
- enableScripting = false,
- hasJSActionsPromise = null,
- mouseState = null
- }) {
- this.pageDiv = pageDiv;
- this.pdfPage = pdfPage;
- this.linkService = linkService;
- this.downloadManager = downloadManager;
- this.imageResourcesPath = imageResourcesPath;
- this.renderInteractiveForms = renderInteractiveForms;
- this.l10n = l10n;
- this.annotationStorage = annotationStorage;
- this.enableScripting = enableScripting;
- this._hasJSActionsPromise = hasJSActionsPromise;
- this._mouseState = mouseState;
- this.div = null;
- this._cancelled = false;
- }
-
- render(viewport, intent = "display") {
- return Promise.all([this.pdfPage.getAnnotations({
- intent
- }), this._hasJSActionsPromise]).then(([annotations, hasJSActions = false]) => {
- if (this._cancelled) {
- return;
- }
-
- if (annotations.length === 0) {
- return;
- }
-
- const parameters = {
- viewport: viewport.clone({
- dontFlip: true
- }),
- div: this.div,
- annotations,
- page: this.pdfPage,
- imageResourcesPath: this.imageResourcesPath,
- renderInteractiveForms: this.renderInteractiveForms,
- linkService: this.linkService,
- downloadManager: this.downloadManager,
- annotationStorage: this.annotationStorage,
- enableScripting: this.enableScripting,
- hasJSActions,
- mouseState: this._mouseState
- };
-
- if (this.div) {
- _pdfjsLib.AnnotationLayer.update(parameters);
- } else {
- this.div = document.createElement("div");
- this.div.className = "annotationLayer";
- this.pageDiv.appendChild(this.div);
- parameters.div = this.div;
-
- _pdfjsLib.AnnotationLayer.render(parameters);
-
- this.l10n.translate(this.div);
- }
- });
- }
-
- cancel() {
- this._cancelled = true;
- }
-
- hide() {
- if (!this.div) {
- return;
- }
-
- this.div.hidden = true;
- }
-
-}
-
-exports.AnnotationLayerBuilder = AnnotationLayerBuilder;
-
-class DefaultAnnotationLayerFactory {
- createAnnotationLayerBuilder(pageDiv, pdfPage, annotationStorage = null, imageResourcesPath = "", renderInteractiveForms = true, l10n = _l10n_utils.NullL10n, enableScripting = false, hasJSActionsPromise = null, mouseState = null) {
- return new AnnotationLayerBuilder({
- pageDiv,
- pdfPage,
- imageResourcesPath,
- renderInteractiveForms,
- linkService: new _pdf_link_service.SimpleLinkService(),
- l10n,
- annotationStorage,
- enableScripting,
- hasJSActionsPromise,
- mouseState
- });
- }
-
-}
-
-exports.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory;
-
-/***/ }),
-/* 30 */
-/***/ ((__unused_webpack_module, exports) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.fixupLangCode = fixupLangCode;
-exports.getL10nFallback = getL10nFallback;
-exports.NullL10n = void 0;
-const DEFAULT_L10N_STRINGS = {
- of_pages: "of {{pagesCount}}",
- page_of_pages: "({{pageNumber}} of {{pagesCount}})",
- document_properties_kb: "{{size_kb}} KB ({{size_b}} bytes)",
- document_properties_mb: "{{size_mb}} MB ({{size_b}} bytes)",
- document_properties_date_string: "{{date}}, {{time}}",
- document_properties_page_size_unit_inches: "in",
- document_properties_page_size_unit_millimeters: "mm",
- document_properties_page_size_orientation_portrait: "portrait",
- document_properties_page_size_orientation_landscape: "landscape",
- document_properties_page_size_name_a3: "A3",
- document_properties_page_size_name_a4: "A4",
- document_properties_page_size_name_letter: "Letter",
- document_properties_page_size_name_legal: "Legal",
- document_properties_page_size_dimension_string: "{{width}} × {{height}} {{unit}} ({{orientation}})",
- document_properties_page_size_dimension_name_string: "{{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})",
- document_properties_linearized_yes: "Yes",
- document_properties_linearized_no: "No",
- print_progress_percent: "{{progress}}%",
- "toggle_sidebar.title": "Toggle Sidebar",
- "toggle_sidebar_notification2.title": "Toggle Sidebar (document contains outline/attachments/layers)",
- additional_layers: "Additional Layers",
- page_landmark: "Page {{page}}",
- thumb_page_title: "Page {{page}}",
- thumb_page_canvas: "Thumbnail of Page {{page}}",
- find_reached_top: "Reached top of document, continued from bottom",
- find_reached_bottom: "Reached end of document, continued from top",
- "find_match_count[one]": "{{current}} of {{total}} match",
- "find_match_count[other]": "{{current}} of {{total}} matches",
- "find_match_count_limit[one]": "More than {{limit}} match",
- "find_match_count_limit[other]": "More than {{limit}} matches",
- find_not_found: "Phrase not found",
- error_version_info: "PDF.js v{{version}} (build: {{build}})",
- error_message: "Message: {{message}}",
- error_stack: "Stack: {{stack}}",
- error_file: "File: {{file}}",
- error_line: "Line: {{line}}",
- rendering_error: "An error occurred while rendering the page.",
- page_scale_width: "Page Width",
- page_scale_fit: "Page Fit",
- page_scale_auto: "Automatic Zoom",
- page_scale_actual: "Actual Size",
- page_scale_percent: "{{scale}}%",
- loading: "Loading…",
- loading_error: "An error occurred while loading the PDF.",
- invalid_file_error: "Invalid or corrupted PDF file.",
- missing_file_error: "Missing PDF file.",
- unexpected_response_error: "Unexpected server response.",
- printing_not_supported: "Warning: Printing is not fully supported by this browser.",
- printing_not_ready: "Warning: The PDF is not fully loaded for printing.",
- web_fonts_disabled: "Web fonts are disabled: unable to use embedded PDF fonts."
-};
-
-function getL10nFallback(key, args) {
- switch (key) {
- case "find_match_count":
- key = `find_match_count[${args.total === 1 ? "one" : "other"}]`;
- break;
-
- case "find_match_count_limit":
- key = `find_match_count_limit[${args.limit === 1 ? "one" : "other"}]`;
- break;
- }
-
- return DEFAULT_L10N_STRINGS[key] || "";
-}
-
-const PARTIAL_LANG_CODES = {
- en: "en-US",
- es: "es-ES",
- fy: "fy-NL",
- ga: "ga-IE",
- gu: "gu-IN",
- hi: "hi-IN",
- hy: "hy-AM",
- nb: "nb-NO",
- ne: "ne-NP",
- nn: "nn-NO",
- pa: "pa-IN",
- pt: "pt-PT",
- sv: "sv-SE",
- zh: "zh-CN"
-};
-
-function fixupLangCode(langCode) {
- return PARTIAL_LANG_CODES[langCode?.toLowerCase()] || langCode;
-}
-
-function formatL10nValue(text, args) {
- if (!args) {
- return text;
- }
-
- return text.replace(/\{\{\s*(\w+)\s*\}\}/g, (all, name) => {
- return name in args ? args[name] : "{{" + name + "}}";
- });
-}
-
-const NullL10n = {
- async getLanguage() {
- return "en-us";
- },
-
- async getDirection() {
- return "ltr";
- },
-
- async get(key, args = null, fallback = getL10nFallback(key, args)) {
- return formatL10nValue(fallback, args);
- },
-
- async translate(element) {}
-
-};
-exports.NullL10n = NullL10n;
-
-/***/ }),
-/* 31 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFPageView = void 0;
-
-var _ui_utils = __webpack_require__(4);
-
-var _pdfjsLib = __webpack_require__(5);
-
-var _l10n_utils = __webpack_require__(30);
-
-var _pdf_rendering_queue = __webpack_require__(8);
-
-var _viewer_compatibility = __webpack_require__(2);
-
-const MAX_CANVAS_PIXELS = _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels || 16777216;
-
-class PDFPageView {
- constructor(options) {
- const container = options.container;
- const defaultViewport = options.defaultViewport;
- this.id = options.id;
- this.renderingId = "page" + this.id;
- this.pdfPage = null;
- this.pageLabel = null;
- this.rotation = 0;
- this.scale = options.scale || _ui_utils.DEFAULT_SCALE;
- this.viewport = defaultViewport;
- this.pdfPageRotate = defaultViewport.rotation;
- this._optionalContentConfigPromise = options.optionalContentConfigPromise || null;
- this.hasRestrictedScaling = false;
- this.textLayerMode = Number.isInteger(options.textLayerMode) ? options.textLayerMode : _ui_utils.TextLayerMode.ENABLE;
- this.imageResourcesPath = options.imageResourcesPath || "";
- this.renderInteractiveForms = options.renderInteractiveForms !== false;
- this.useOnlyCssZoom = options.useOnlyCssZoom || false;
- this.maxCanvasPixels = options.maxCanvasPixels || MAX_CANVAS_PIXELS;
- this.eventBus = options.eventBus;
- this.renderingQueue = options.renderingQueue;
- this.textLayerFactory = options.textLayerFactory;
- this.annotationLayerFactory = options.annotationLayerFactory;
- this.xfaLayerFactory = options.xfaLayerFactory;
- this.structTreeLayerFactory = options.structTreeLayerFactory;
- this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;
- this.l10n = options.l10n || _l10n_utils.NullL10n;
- this.paintTask = null;
- this.paintedViewportMap = new WeakMap();
- this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
- this.resume = null;
- this._renderError = null;
- this.annotationLayer = null;
- this.textLayer = null;
- this.zoomLayer = null;
- this.xfaLayer = null;
- this.structTreeLayer = null;
- const div = document.createElement("div");
- div.className = "page";
- div.style.width = Math.floor(this.viewport.width) + "px";
- div.style.height = Math.floor(this.viewport.height) + "px";
- div.setAttribute("data-page-number", this.id);
- div.setAttribute("role", "region");
- this.l10n.get("page_landmark", {
- page: this.id
- }).then(msg => {
- div.setAttribute("aria-label", msg);
- });
- this.div = div;
- container.appendChild(div);
- }
-
- setPdfPage(pdfPage) {
- this.pdfPage = pdfPage;
- this.pdfPageRotate = pdfPage.rotate;
- const totalRotation = (this.rotation + this.pdfPageRotate) % 360;
- this.viewport = pdfPage.getViewport({
- scale: this.scale * _ui_utils.CSS_UNITS,
- rotation: totalRotation
- });
- this.reset();
- }
-
- destroy() {
- this.reset();
-
- if (this.pdfPage) {
- this.pdfPage.cleanup();
- }
- }
-
- async _renderAnnotationLayer() {
- let error = null;
-
- try {
- await this.annotationLayer.render(this.viewport, "display");
- } catch (ex) {
- error = ex;
- } finally {
- this.eventBus.dispatch("annotationlayerrendered", {
- source: this,
- pageNumber: this.id,
- error
- });
- }
- }
-
- async _renderXfaLayer() {
- let error = null;
-
- try {
- await this.xfaLayer.render(this.viewport, "display");
- } catch (ex) {
- error = ex;
- } finally {
- this.eventBus.dispatch("xfalayerrendered", {
- source: this,
- pageNumber: this.id,
- error
- });
- }
- }
-
- _resetZoomLayer(removeFromDOM = false) {
- if (!this.zoomLayer) {
- return;
- }
-
- const zoomLayerCanvas = this.zoomLayer.firstChild;
- this.paintedViewportMap.delete(zoomLayerCanvas);
- zoomLayerCanvas.width = 0;
- zoomLayerCanvas.height = 0;
-
- if (removeFromDOM) {
- this.zoomLayer.remove();
- }
-
- this.zoomLayer = null;
- }
-
- reset({
- keepZoomLayer = false,
- keepAnnotationLayer = false,
- keepXfaLayer = false
- } = {}) {
- this.cancelRendering({
- keepAnnotationLayer,
- keepXfaLayer
- });
- this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
- const div = this.div;
- div.style.width = Math.floor(this.viewport.width) + "px";
- div.style.height = Math.floor(this.viewport.height) + "px";
- const childNodes = div.childNodes,
- zoomLayerNode = keepZoomLayer && this.zoomLayer || null,
- annotationLayerNode = keepAnnotationLayer && this.annotationLayer?.div || null,
- xfaLayerNode = keepXfaLayer && this.xfaLayer?.div || null;
-
- for (let i = childNodes.length - 1; i >= 0; i--) {
- const node = childNodes[i];
-
- switch (node) {
- case zoomLayerNode:
- case annotationLayerNode:
- case xfaLayerNode:
- continue;
- }
-
- div.removeChild(node);
- }
-
- div.removeAttribute("data-loaded");
-
- if (annotationLayerNode) {
- this.annotationLayer.hide();
- }
-
- if (xfaLayerNode) {
- this.xfaLayer.hide();
- }
-
- if (!zoomLayerNode) {
- if (this.canvas) {
- this.paintedViewportMap.delete(this.canvas);
- this.canvas.width = 0;
- this.canvas.height = 0;
- delete this.canvas;
- }
-
- this._resetZoomLayer();
- }
-
- if (this.svg) {
- this.paintedViewportMap.delete(this.svg);
- delete this.svg;
- }
-
- this.loadingIconDiv = document.createElement("div");
- this.loadingIconDiv.className = "loadingIcon";
- this.loadingIconDiv.setAttribute("role", "img");
- this.l10n.get("loading").then(msg => {
- this.loadingIconDiv?.setAttribute("aria-label", msg);
- });
- div.appendChild(this.loadingIconDiv);
- }
-
- update(scale, rotation, optionalContentConfigPromise = null) {
- this.scale = scale || this.scale;
-
- if (typeof rotation !== "undefined") {
- this.rotation = rotation;
- }
-
- if (optionalContentConfigPromise instanceof Promise) {
- this._optionalContentConfigPromise = optionalContentConfigPromise;
- }
-
- const totalRotation = (this.rotation + this.pdfPageRotate) % 360;
- this.viewport = this.viewport.clone({
- scale: this.scale * _ui_utils.CSS_UNITS,
- rotation: totalRotation
- });
-
- if (this.svg) {
- this.cssTransform({
- target: this.svg,
- redrawAnnotationLayer: true,
- redrawXfaLayer: true
- });
- this.eventBus.dispatch("pagerendered", {
- source: this,
- pageNumber: this.id,
- cssTransform: true,
- timestamp: performance.now(),
- error: this._renderError
- });
- return;
- }
-
- let isScalingRestricted = false;
-
- if (this.canvas && this.maxCanvasPixels > 0) {
- const outputScale = this.outputScale;
-
- if ((Math.floor(this.viewport.width) * outputScale.sx | 0) * (Math.floor(this.viewport.height) * outputScale.sy | 0) > this.maxCanvasPixels) {
- isScalingRestricted = true;
- }
- }
-
- if (this.canvas) {
- if (this.useOnlyCssZoom || this.hasRestrictedScaling && isScalingRestricted) {
- this.cssTransform({
- target: this.canvas,
- redrawAnnotationLayer: true,
- redrawXfaLayer: true
- });
- this.eventBus.dispatch("pagerendered", {
- source: this,
- pageNumber: this.id,
- cssTransform: true,
- timestamp: performance.now(),
- error: this._renderError
- });
- return;
- }
-
- if (!this.zoomLayer && !this.canvas.hidden) {
- this.zoomLayer = this.canvas.parentNode;
- this.zoomLayer.style.position = "absolute";
- }
- }
-
- if (this.zoomLayer) {
- this.cssTransform({
- target: this.zoomLayer.firstChild
- });
- }
-
- this.reset({
- keepZoomLayer: true,
- keepAnnotationLayer: true,
- keepXfaLayer: true
- });
- }
-
- cancelRendering({
- keepAnnotationLayer = false,
- keepXfaLayer = false
- } = {}) {
- if (this.paintTask) {
- this.paintTask.cancel();
- this.paintTask = null;
- }
-
- this.resume = null;
-
- if (this.textLayer) {
- this.textLayer.cancel();
- this.textLayer = null;
- }
-
- if (this.annotationLayer && (!keepAnnotationLayer || !this.annotationLayer.div)) {
- this.annotationLayer.cancel();
- this.annotationLayer = null;
- }
-
- if (this.xfaLayer && (!keepXfaLayer || !this.xfaLayer.div)) {
- this.xfaLayer.cancel();
- this.xfaLayer = null;
- }
-
- if (this._onTextLayerRendered) {
- this.eventBus._off("textlayerrendered", this._onTextLayerRendered);
-
- this._onTextLayerRendered = null;
- }
- }
-
- cssTransform({
- target,
- redrawAnnotationLayer = false,
- redrawXfaLayer = false
- }) {
- const width = this.viewport.width;
- const height = this.viewport.height;
- const div = this.div;
- target.style.width = target.parentNode.style.width = div.style.width = Math.floor(width) + "px";
- target.style.height = target.parentNode.style.height = div.style.height = Math.floor(height) + "px";
- const relativeRotation = this.viewport.rotation - this.paintedViewportMap.get(target).rotation;
- const absRotation = Math.abs(relativeRotation);
- let scaleX = 1,
- scaleY = 1;
-
- if (absRotation === 90 || absRotation === 270) {
- scaleX = height / width;
- scaleY = width / height;
- }
-
- target.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX}, ${scaleY})`;
-
- if (this.textLayer) {
- const textLayerViewport = this.textLayer.viewport;
- const textRelativeRotation = this.viewport.rotation - textLayerViewport.rotation;
- const textAbsRotation = Math.abs(textRelativeRotation);
- let scale = width / textLayerViewport.width;
-
- if (textAbsRotation === 90 || textAbsRotation === 270) {
- scale = width / textLayerViewport.height;
- }
-
- const textLayerDiv = this.textLayer.textLayerDiv;
- let transX, transY;
-
- switch (textAbsRotation) {
- case 0:
- transX = transY = 0;
- break;
-
- case 90:
- transX = 0;
- transY = "-" + textLayerDiv.style.height;
- break;
-
- case 180:
- transX = "-" + textLayerDiv.style.width;
- transY = "-" + textLayerDiv.style.height;
- break;
-
- case 270:
- transX = "-" + textLayerDiv.style.width;
- transY = 0;
- break;
-
- default:
- console.error("Bad rotation value.");
- break;
- }
-
- textLayerDiv.style.transform = `rotate(${textAbsRotation}deg) ` + `scale(${scale}) ` + `translate(${transX}, ${transY})`;
- textLayerDiv.style.transformOrigin = "0% 0%";
- }
-
- if (redrawAnnotationLayer && this.annotationLayer) {
- this._renderAnnotationLayer();
- }
-
- if (redrawXfaLayer && this.xfaLayer) {
- this._renderXfaLayer();
- }
- }
-
- get width() {
- return this.viewport.width;
- }
-
- get height() {
- return this.viewport.height;
- }
-
- getPagePoint(x, y) {
- return this.viewport.convertToPdfPoint(x, y);
- }
-
- draw() {
- if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {
- console.error("Must be in new state before drawing");
- this.reset();
- }
-
- const {
- div,
- pdfPage
- } = this;
-
- if (!pdfPage) {
- this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
-
- if (this.loadingIconDiv) {
- div.removeChild(this.loadingIconDiv);
- delete this.loadingIconDiv;
- }
-
- return Promise.reject(new Error("pdfPage is not loaded"));
- }
-
- this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;
- const canvasWrapper = document.createElement("div");
- canvasWrapper.style.width = div.style.width;
- canvasWrapper.style.height = div.style.height;
- canvasWrapper.classList.add("canvasWrapper");
-
- if (this.annotationLayer?.div) {
- div.insertBefore(canvasWrapper, this.annotationLayer.div);
- } else {
- div.appendChild(canvasWrapper);
- }
-
- let textLayer = null;
-
- if (this.textLayerMode !== _ui_utils.TextLayerMode.DISABLE && this.textLayerFactory) {
- const textLayerDiv = document.createElement("div");
- textLayerDiv.className = "textLayer";
- textLayerDiv.style.width = canvasWrapper.style.width;
- textLayerDiv.style.height = canvasWrapper.style.height;
-
- if (this.annotationLayer?.div) {
- div.insertBefore(textLayerDiv, this.annotationLayer.div);
- } else {
- div.appendChild(textLayerDiv);
- }
-
- textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport, this.textLayerMode === _ui_utils.TextLayerMode.ENABLE_ENHANCE, this.eventBus);
- }
-
- this.textLayer = textLayer;
-
- if (this.xfaLayer?.div) {
- div.appendChild(this.xfaLayer.div);
- }
-
- let renderContinueCallback = null;
-
- if (this.renderingQueue) {
- renderContinueCallback = cont => {
- if (!this.renderingQueue.isHighestPriority(this)) {
- this.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;
-
- this.resume = () => {
- this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;
- cont();
- };
-
- return;
- }
-
- cont();
- };
- }
-
- const finishPaintTask = async (error = null) => {
- if (paintTask === this.paintTask) {
- this.paintTask = null;
- }
-
- if (error instanceof _pdfjsLib.RenderingCancelledException) {
- this._renderError = null;
- return;
- }
-
- this._renderError = error;
- this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
-
- if (this.loadingIconDiv) {
- div.removeChild(this.loadingIconDiv);
- delete this.loadingIconDiv;
- }
-
- this._resetZoomLayer(true);
-
- this.eventBus.dispatch("pagerendered", {
- source: this,
- pageNumber: this.id,
- cssTransform: false,
- timestamp: performance.now(),
- error: this._renderError
- });
-
- if (error) {
- throw error;
- }
- };
-
- const paintTask = this.renderer === _ui_utils.RendererType.SVG ? this.paintOnSvg(canvasWrapper) : this.paintOnCanvas(canvasWrapper);
- paintTask.onRenderContinue = renderContinueCallback;
- this.paintTask = paintTask;
- const resultPromise = paintTask.promise.then(() => {
- return finishPaintTask(null).then(() => {
- if (textLayer) {
- const readableStream = pdfPage.streamTextContent({
- normalizeWhitespace: true,
- includeMarkedContent: true
- });
- textLayer.setTextContentStream(readableStream);
- textLayer.render();
- }
- });
- }, function (reason) {
- return finishPaintTask(reason);
- });
-
- if (this.annotationLayerFactory) {
- if (!this.annotationLayer) {
- this.annotationLayer = this.annotationLayerFactory.createAnnotationLayerBuilder(div, pdfPage, null, this.imageResourcesPath, this.renderInteractiveForms, this.l10n, null, null, null);
- }
-
- this._renderAnnotationLayer();
- }
-
- if (this.xfaLayerFactory) {
- if (!this.xfaLayer) {
- this.xfaLayer = this.xfaLayerFactory.createXfaLayerBuilder(div, pdfPage, null);
- }
-
- this._renderXfaLayer();
- }
-
- if (this.structTreeLayerFactory && this.textLayer && this.canvas) {
- this._onTextLayerRendered = event => {
- if (event.pageNumber !== this.id) {
- return;
- }
-
- this.eventBus._off("textlayerrendered", this._onTextLayerRendered);
-
- this._onTextLayerRendered = null;
-
- if (!this.canvas) {
- return;
- }
-
- this.pdfPage.getStructTree().then(tree => {
- if (!tree) {
- return;
- }
-
- if (!this.canvas) {
- return;
- }
-
- const treeDom = this.structTreeLayer.render(tree);
- treeDom.classList.add("structTree");
- this.canvas.appendChild(treeDom);
- });
- };
-
- this.eventBus._on("textlayerrendered", this._onTextLayerRendered);
-
- this.structTreeLayer = this.structTreeLayerFactory.createStructTreeLayerBuilder(pdfPage);
- }
-
- div.setAttribute("data-loaded", true);
- this.eventBus.dispatch("pagerender", {
- source: this,
- pageNumber: this.id
- });
- return resultPromise;
- }
-
- paintOnCanvas(canvasWrapper) {
- const renderCapability = (0, _pdfjsLib.createPromiseCapability)();
- const result = {
- promise: renderCapability.promise,
-
- onRenderContinue(cont) {
- cont();
- },
-
- cancel() {
- renderTask.cancel();
- }
-
- };
- const viewport = this.viewport;
- const canvas = document.createElement("canvas");
- canvas.hidden = true;
- let isCanvasHidden = true;
-
- const showCanvas = function () {
- if (isCanvasHidden) {
- canvas.hidden = false;
- isCanvasHidden = false;
- }
- };
-
- canvasWrapper.appendChild(canvas);
- this.canvas = canvas;
- canvas.mozOpaque = true;
- const ctx = canvas.getContext("2d", {
- alpha: false
- });
- const outputScale = (0, _ui_utils.getOutputScale)(ctx);
- this.outputScale = outputScale;
-
- if (this.useOnlyCssZoom) {
- const actualSizeViewport = viewport.clone({
- scale: _ui_utils.CSS_UNITS
- });
- outputScale.sx *= actualSizeViewport.width / viewport.width;
- outputScale.sy *= actualSizeViewport.height / viewport.height;
- outputScale.scaled = true;
- }
-
- if (this.maxCanvasPixels > 0) {
- const pixelsInViewport = viewport.width * viewport.height;
- const maxScale = Math.sqrt(this.maxCanvasPixels / pixelsInViewport);
-
- if (outputScale.sx > maxScale || outputScale.sy > maxScale) {
- outputScale.sx = maxScale;
- outputScale.sy = maxScale;
- outputScale.scaled = true;
- this.hasRestrictedScaling = true;
- } else {
- this.hasRestrictedScaling = false;
- }
- }
-
- const sfx = (0, _ui_utils.approximateFraction)(outputScale.sx);
- const sfy = (0, _ui_utils.approximateFraction)(outputScale.sy);
- canvas.width = (0, _ui_utils.roundToDivide)(viewport.width * outputScale.sx, sfx[0]);
- canvas.height = (0, _ui_utils.roundToDivide)(viewport.height * outputScale.sy, sfy[0]);
- canvas.style.width = (0, _ui_utils.roundToDivide)(viewport.width, sfx[1]) + "px";
- canvas.style.height = (0, _ui_utils.roundToDivide)(viewport.height, sfy[1]) + "px";
- this.paintedViewportMap.set(canvas, viewport);
- const transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0];
- const renderContext = {
- canvasContext: ctx,
- transform,
- viewport: this.viewport,
- renderInteractiveForms: this.renderInteractiveForms,
- optionalContentConfigPromise: this._optionalContentConfigPromise
- };
- const renderTask = this.pdfPage.render(renderContext);
-
- renderTask.onContinue = function (cont) {
- showCanvas();
-
- if (result.onRenderContinue) {
- result.onRenderContinue(cont);
- } else {
- cont();
- }
- };
-
- renderTask.promise.then(function () {
- showCanvas();
- renderCapability.resolve(undefined);
- }, function (error) {
- showCanvas();
- renderCapability.reject(error);
- });
- return result;
- }
-
- paintOnSvg(wrapper) {
- let cancelled = false;
-
- const ensureNotCancelled = () => {
- if (cancelled) {
- throw new _pdfjsLib.RenderingCancelledException(`Rendering cancelled, page ${this.id}`, "svg");
- }
- };
-
- const pdfPage = this.pdfPage;
- const actualSizeViewport = this.viewport.clone({
- scale: _ui_utils.CSS_UNITS
- });
- const promise = pdfPage.getOperatorList().then(opList => {
- ensureNotCancelled();
- const svgGfx = new _pdfjsLib.SVGGraphics(pdfPage.commonObjs, pdfPage.objs, _viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL);
- return svgGfx.getSVG(opList, actualSizeViewport).then(svg => {
- ensureNotCancelled();
- this.svg = svg;
- this.paintedViewportMap.set(svg, actualSizeViewport);
- svg.style.width = wrapper.style.width;
- svg.style.height = wrapper.style.height;
- this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
- wrapper.appendChild(svg);
- });
- });
- return {
- promise,
-
- onRenderContinue(cont) {
- cont();
- },
-
- cancel() {
- cancelled = true;
- }
-
- };
- }
-
- setPageLabel(label) {
- this.pageLabel = typeof label === "string" ? label : null;
-
- if (this.pageLabel !== null) {
- this.div.setAttribute("data-page-label", this.pageLabel);
- } else {
- this.div.removeAttribute("data-page-label");
- }
- }
-
-}
-
-exports.PDFPageView = PDFPageView;
-
-/***/ }),
-/* 32 */
-/***/ ((__unused_webpack_module, exports) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.StructTreeLayerBuilder = exports.DefaultStructTreeLayerFactory = void 0;
-const PDF_ROLE_TO_HTML_ROLE = {
- Document: null,
- DocumentFragment: null,
- Part: "group",
- Sect: "group",
- Div: "group",
- Aside: "note",
- NonStruct: "none",
- P: null,
- H: "heading",
- Title: null,
- FENote: "note",
- Sub: "group",
- Lbl: null,
- Span: null,
- Em: null,
- Strong: null,
- Link: "link",
- Annot: "note",
- Form: "form",
- Ruby: null,
- RB: null,
- RT: null,
- RP: null,
- Warichu: null,
- WT: null,
- WP: null,
- L: "list",
- LI: "listitem",
- LBody: null,
- Table: "table",
- TR: "row",
- TH: "columnheader",
- TD: "cell",
- THead: "columnheader",
- TBody: null,
- TFoot: null,
- Caption: null,
- Figure: "figure",
- Formula: null,
- Artifact: null
-};
-const HEADING_PATTERN = /^H(\d+)$/;
-
-class StructTreeLayerBuilder {
- constructor({
- pdfPage
- }) {
- this.pdfPage = pdfPage;
- }
-
- render(structTree) {
- return this._walk(structTree);
- }
-
- _setAttributes(structElement, htmlElement) {
- if (structElement.alt !== undefined) {
- htmlElement.setAttribute("aria-label", structElement.alt);
- }
-
- if (structElement.id !== undefined) {
- htmlElement.setAttribute("aria-owns", structElement.id);
- }
- }
-
- _walk(node) {
- if (!node) {
- return null;
- }
-
- const element = document.createElement("span");
-
- if ("role" in node) {
- const {
- role
- } = node;
- const match = role.match(HEADING_PATTERN);
-
- if (match) {
- element.setAttribute("role", "heading");
- element.setAttribute("aria-level", match[1]);
- } else if (PDF_ROLE_TO_HTML_ROLE[role]) {
- element.setAttribute("role", PDF_ROLE_TO_HTML_ROLE[role]);
- }
- }
-
- this._setAttributes(node, element);
-
- if (node.children) {
- if (node.children.length === 1 && "id" in node.children[0]) {
- this._setAttributes(node.children[0], element);
- } else {
- for (const kid of node.children) {
- element.appendChild(this._walk(kid));
- }
- }
- }
-
- return element;
- }
-
-}
-
-exports.StructTreeLayerBuilder = StructTreeLayerBuilder;
-
-class DefaultStructTreeLayerFactory {
- createStructTreeLayerBuilder(pdfPage) {
- return new StructTreeLayerBuilder({
- pdfPage
- });
- }
-
-}
-
-exports.DefaultStructTreeLayerFactory = DefaultStructTreeLayerFactory;
-
-/***/ }),
-/* 33 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.TextLayerBuilder = exports.DefaultTextLayerFactory = void 0;
-
-var _pdfjsLib = __webpack_require__(5);
-
-const EXPAND_DIVS_TIMEOUT = 300;
-
-class TextLayerBuilder {
- constructor({
- textLayerDiv,
- eventBus,
- pageIndex,
- viewport,
- findController = null,
- enhanceTextSelection = false
- }) {
- this.textLayerDiv = textLayerDiv;
- this.eventBus = eventBus;
- this.textContent = null;
- this.textContentItemsStr = [];
- this.textContentStream = null;
- this.renderingDone = false;
- this.pageIdx = pageIndex;
- this.pageNumber = this.pageIdx + 1;
- this.matches = [];
- this.viewport = viewport;
- this.textDivs = [];
- this.findController = findController;
- this.textLayerRenderTask = null;
- this.enhanceTextSelection = enhanceTextSelection;
- this._onUpdateTextLayerMatches = null;
-
- this._bindMouse();
- }
-
- _finishRendering() {
- this.renderingDone = true;
-
- if (!this.enhanceTextSelection) {
- const endOfContent = document.createElement("div");
- endOfContent.className = "endOfContent";
- this.textLayerDiv.appendChild(endOfContent);
- }
-
- this.eventBus.dispatch("textlayerrendered", {
- source: this,
- pageNumber: this.pageNumber,
- numTextDivs: this.textDivs.length
- });
- }
-
- render(timeout = 0) {
- if (!(this.textContent || this.textContentStream) || this.renderingDone) {
- return;
- }
-
- this.cancel();
- this.textDivs = [];
- const textLayerFrag = document.createDocumentFragment();
- this.textLayerRenderTask = (0, _pdfjsLib.renderTextLayer)({
- textContent: this.textContent,
- textContentStream: this.textContentStream,
- container: textLayerFrag,
- viewport: this.viewport,
- textDivs: this.textDivs,
- textContentItemsStr: this.textContentItemsStr,
- timeout,
- enhanceTextSelection: this.enhanceTextSelection
- });
- this.textLayerRenderTask.promise.then(() => {
- this.textLayerDiv.appendChild(textLayerFrag);
-
- this._finishRendering();
-
- this._updateMatches();
- }, function (reason) {});
-
- if (!this._onUpdateTextLayerMatches) {
- this._onUpdateTextLayerMatches = evt => {
- if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) {
- this._updateMatches();
- }
- };
-
- this.eventBus._on("updatetextlayermatches", this._onUpdateTextLayerMatches);
- }
- }
-
- cancel() {
- if (this.textLayerRenderTask) {
- this.textLayerRenderTask.cancel();
- this.textLayerRenderTask = null;
- }
-
- if (this._onUpdateTextLayerMatches) {
- this.eventBus._off("updatetextlayermatches", this._onUpdateTextLayerMatches);
-
- this._onUpdateTextLayerMatches = null;
- }
- }
-
- setTextContentStream(readableStream) {
- this.cancel();
- this.textContentStream = readableStream;
- }
-
- setTextContent(textContent) {
- this.cancel();
- this.textContent = textContent;
- }
-
- _convertMatches(matches, matchesLength) {
- if (!matches) {
- return [];
- }
-
- const {
- textContentItemsStr
- } = this;
- let i = 0,
- iIndex = 0;
- const end = textContentItemsStr.length - 1;
- const result = [];
-
- for (let m = 0, mm = matches.length; m < mm; m++) {
- let matchIdx = matches[m];
-
- while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) {
- iIndex += textContentItemsStr[i].length;
- i++;
- }
-
- if (i === textContentItemsStr.length) {
- console.error("Could not find a matching mapping");
- }
-
- const match = {
- begin: {
- divIdx: i,
- offset: matchIdx - iIndex
- }
- };
- matchIdx += matchesLength[m];
-
- while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {
- iIndex += textContentItemsStr[i].length;
- i++;
- }
-
- match.end = {
- divIdx: i,
- offset: matchIdx - iIndex
- };
- result.push(match);
- }
-
- return result;
- }
-
- _renderMatches(matches) {
- if (matches.length === 0) {
- return;
- }
-
- const {
- findController,
- pageIdx,
- textContentItemsStr,
- textDivs
- } = this;
- const isSelectedPage = pageIdx === findController.selected.pageIdx;
- const selectedMatchIdx = findController.selected.matchIdx;
- const highlightAll = findController.state.highlightAll;
- let prevEnd = null;
- const infinity = {
- divIdx: -1,
- offset: undefined
- };
-
- function beginText(begin, className) {
- const divIdx = begin.divIdx;
- textDivs[divIdx].textContent = "";
- return appendTextToDiv(divIdx, 0, begin.offset, className);
- }
-
- function appendTextToDiv(divIdx, fromOffset, toOffset, className) {
- const div = textDivs[divIdx];
- const content = textContentItemsStr[divIdx].substring(fromOffset, toOffset);
- const node = document.createTextNode(content);
-
- if (className) {
- const span = document.createElement("span");
- span.className = `${className} appended`;
- span.appendChild(node);
- div.appendChild(span);
- return className.includes("selected") ? span.offsetLeft : 0;
- }
-
- div.appendChild(node);
- return 0;
- }
-
- let i0 = selectedMatchIdx,
- i1 = i0 + 1;
-
- if (highlightAll) {
- i0 = 0;
- i1 = matches.length;
- } else if (!isSelectedPage) {
- return;
- }
-
- for (let i = i0; i < i1; i++) {
- const match = matches[i];
- const begin = match.begin;
- const end = match.end;
- const isSelected = isSelectedPage && i === selectedMatchIdx;
- const highlightSuffix = isSelected ? " selected" : "";
- let selectedLeft = 0;
-
- if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {
- if (prevEnd !== null) {
- appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);
- }
-
- beginText(begin);
- } else {
- appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);
- }
-
- if (begin.divIdx === end.divIdx) {
- selectedLeft = appendTextToDiv(begin.divIdx, begin.offset, end.offset, "highlight" + highlightSuffix);
- } else {
- selectedLeft = appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, "highlight begin" + highlightSuffix);
-
- for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {
- textDivs[n0].className = "highlight middle" + highlightSuffix;
- }
-
- beginText(end, "highlight end" + highlightSuffix);
- }
-
- prevEnd = end;
-
- if (isSelected) {
- findController.scrollMatchIntoView({
- element: textDivs[begin.divIdx],
- selectedLeft,
- pageIndex: pageIdx,
- matchIndex: selectedMatchIdx
- });
- }
- }
-
- if (prevEnd) {
- appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);
- }
- }
-
- _updateMatches() {
- if (!this.renderingDone) {
- return;
- }
-
- const {
- findController,
- matches,
- pageIdx,
- textContentItemsStr,
- textDivs
- } = this;
- let clearedUntilDivIdx = -1;
-
- for (let i = 0, ii = matches.length; i < ii; i++) {
- const match = matches[i];
- const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);
-
- for (let n = begin, end = match.end.divIdx; n <= end; n++) {
- const div = textDivs[n];
- div.textContent = textContentItemsStr[n];
- div.className = "";
- }
-
- clearedUntilDivIdx = match.end.divIdx + 1;
- }
-
- if (!findController?.highlightMatches) {
- return;
- }
-
- const pageMatches = findController.pageMatches[pageIdx] || null;
- const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null;
- this.matches = this._convertMatches(pageMatches, pageMatchesLength);
-
- this._renderMatches(this.matches);
- }
-
- _bindMouse() {
- const div = this.textLayerDiv;
- let expandDivsTimer = null;
- div.addEventListener("mousedown", evt => {
- if (this.enhanceTextSelection && this.textLayerRenderTask) {
- this.textLayerRenderTask.expandTextDivs(true);
-
- if (expandDivsTimer) {
- clearTimeout(expandDivsTimer);
- expandDivsTimer = null;
- }
-
- return;
- }
-
- const end = div.querySelector(".endOfContent");
-
- if (!end) {
- return;
- }
-
- let adjustTop = evt.target !== div;
- adjustTop = adjustTop && window.getComputedStyle(end).getPropertyValue("-moz-user-select") !== "none";
-
- if (adjustTop) {
- const divBounds = div.getBoundingClientRect();
- const r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height);
- end.style.top = (r * 100).toFixed(2) + "%";
- }
-
- end.classList.add("active");
- });
- div.addEventListener("mouseup", () => {
- if (this.enhanceTextSelection && this.textLayerRenderTask) {
- expandDivsTimer = setTimeout(() => {
- if (this.textLayerRenderTask) {
- this.textLayerRenderTask.expandTextDivs(false);
- }
-
- expandDivsTimer = null;
- }, EXPAND_DIVS_TIMEOUT);
- return;
- }
-
- const end = div.querySelector(".endOfContent");
-
- if (!end) {
- return;
- }
-
- end.style.top = "";
- end.classList.remove("active");
- });
- }
-
-}
-
-exports.TextLayerBuilder = TextLayerBuilder;
-
-class DefaultTextLayerFactory {
- createTextLayerBuilder(textLayerDiv, pageIndex, viewport, enhanceTextSelection = false, eventBus) {
- return new TextLayerBuilder({
- textLayerDiv,
- pageIndex,
- viewport,
- enhanceTextSelection,
- eventBus
- });
- }
-
-}
-
-exports.DefaultTextLayerFactory = DefaultTextLayerFactory;
-
-/***/ }),
-/* 34 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.XfaLayerBuilder = exports.DefaultXfaLayerFactory = void 0;
-
-var _pdfjsLib = __webpack_require__(5);
-
-class XfaLayerBuilder {
- constructor({
- pageDiv,
- pdfPage,
- xfaHtml,
- annotationStorage
- }) {
- this.pageDiv = pageDiv;
- this.pdfPage = pdfPage;
- this.xfaHtml = xfaHtml;
- this.annotationStorage = annotationStorage;
- this.div = null;
- this._cancelled = false;
- }
-
- render(viewport, intent = "display") {
- if (intent === "print") {
- const parameters = {
- viewport: viewport.clone({
- dontFlip: true
- }),
- div: this.div,
- xfa: this.xfaHtml,
- page: null,
- annotationStorage: this.annotationStorage,
- intent
- };
- const div = document.createElement("div");
- this.pageDiv.appendChild(div);
- parameters.div = div;
-
- _pdfjsLib.XfaLayer.render(parameters);
-
- return Promise.resolve();
- }
-
- return this.pdfPage.getXfa().then(xfa => {
- if (this._cancelled) {
- return;
- }
-
- const parameters = {
- viewport: viewport.clone({
- dontFlip: true
- }),
- div: this.div,
- xfa,
- page: this.pdfPage,
- annotationStorage: this.annotationStorage,
- intent
- };
-
- if (this.div) {
- _pdfjsLib.XfaLayer.update(parameters);
- } else {
- this.div = document.createElement("div");
- this.pageDiv.appendChild(this.div);
- parameters.div = this.div;
-
- _pdfjsLib.XfaLayer.render(parameters);
- }
- }).catch(error => {
- console.error(error);
- });
- }
-
- cancel() {
- this._cancelled = true;
- }
-
- hide() {
- if (!this.div) {
- return;
- }
-
- this.div.hidden = true;
- }
-
-}
-
-exports.XfaLayerBuilder = XfaLayerBuilder;
-
-class DefaultXfaLayerFactory {
- createXfaLayerBuilder(pageDiv, pdfPage, annotationStorage = null, xfaHtml = null) {
- return new XfaLayerBuilder({
- pageDiv,
- pdfPage,
- annotationStorage,
- xfaHtml
- });
- }
-
-}
-
-exports.DefaultXfaLayerFactory = DefaultXfaLayerFactory;
-
-/***/ }),
-/* 35 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.SecondaryToolbar = void 0;
-
-var _ui_utils = __webpack_require__(4);
-
-var _pdf_cursor_tools = __webpack_require__(6);
-
-var _pdf_single_page_viewer = __webpack_require__(36);
-
-class SecondaryToolbar {
- constructor(options, mainContainer, eventBus) {
- this.toolbar = options.toolbar;
- this.toggleButton = options.toggleButton;
- this.toolbarButtonContainer = options.toolbarButtonContainer;
- this.buttons = [{
- element: options.presentationModeButton,
- eventName: "presentationmode",
- close: true
- }, {
- element: options.openFileButton,
- eventName: "openfile",
- close: true
- }, {
- element: options.printButton,
- eventName: "print",
- close: true
- }, {
- element: options.downloadButton,
- eventName: "download",
- close: true
- }, {
- element: options.viewBookmarkButton,
- eventName: null,
- close: true
- }, {
- element: options.firstPageButton,
- eventName: "firstpage",
- close: true
- }, {
- element: options.lastPageButton,
- eventName: "lastpage",
- close: true
- }, {
- element: options.pageRotateCwButton,
- eventName: "rotatecw",
- close: false
- }, {
- element: options.pageRotateCcwButton,
- eventName: "rotateccw",
- close: false
- }, {
- element: options.cursorSelectToolButton,
- eventName: "switchcursortool",
- eventDetails: {
- tool: _pdf_cursor_tools.CursorTool.SELECT
- },
- close: true
- }, {
- element: options.cursorHandToolButton,
- eventName: "switchcursortool",
- eventDetails: {
- tool: _pdf_cursor_tools.CursorTool.HAND
- },
- close: true
- }, {
- element: options.scrollVerticalButton,
- eventName: "switchscrollmode",
- eventDetails: {
- mode: _ui_utils.ScrollMode.VERTICAL
- },
- close: true
- }, {
- element: options.scrollHorizontalButton,
- eventName: "switchscrollmode",
- eventDetails: {
- mode: _ui_utils.ScrollMode.HORIZONTAL
- },
- close: true
- }, {
- element: options.scrollWrappedButton,
- eventName: "switchscrollmode",
- eventDetails: {
- mode: _ui_utils.ScrollMode.WRAPPED
- },
- close: true
- }, {
- element: options.spreadNoneButton,
- eventName: "switchspreadmode",
- eventDetails: {
- mode: _ui_utils.SpreadMode.NONE
- },
- close: true
- }, {
- element: options.spreadOddButton,
- eventName: "switchspreadmode",
- eventDetails: {
- mode: _ui_utils.SpreadMode.ODD
- },
- close: true
- }, {
- element: options.spreadEvenButton,
- eventName: "switchspreadmode",
- eventDetails: {
- mode: _ui_utils.SpreadMode.EVEN
- },
- close: true
- }, {
- element: options.documentPropertiesButton,
- eventName: "documentproperties",
- close: true
- }];
- this.items = {
- firstPage: options.firstPageButton,
- lastPage: options.lastPageButton,
- pageRotateCw: options.pageRotateCwButton,
- pageRotateCcw: options.pageRotateCcwButton
- };
- this.mainContainer = mainContainer;
- this.eventBus = eventBus;
- this.opened = false;
- this.containerHeight = null;
- this.previousContainerHeight = null;
- this.reset();
-
- this._bindClickListeners();
-
- this._bindCursorToolsListener(options);
-
- this._bindScrollModeListener(options);
-
- this._bindSpreadModeListener(options);
-
- this.eventBus._on("resize", this._setMaxHeight.bind(this));
-
- this.eventBus._on("baseviewerinit", evt => {
- if (evt.source instanceof _pdf_single_page_viewer.PDFSinglePageViewer) {
- this.toolbarButtonContainer.classList.add("hiddenScrollModeButtons", "hiddenSpreadModeButtons");
- } else {
- this.toolbarButtonContainer.classList.remove("hiddenScrollModeButtons", "hiddenSpreadModeButtons");
- }
- });
- }
-
- get isOpen() {
- return this.opened;
- }
-
- setPageNumber(pageNumber) {
- this.pageNumber = pageNumber;
-
- this._updateUIState();
- }
-
- setPagesCount(pagesCount) {
- this.pagesCount = pagesCount;
-
- this._updateUIState();
- }
-
- reset() {
- this.pageNumber = 0;
- this.pagesCount = 0;
-
- this._updateUIState();
-
- this.eventBus.dispatch("secondarytoolbarreset", {
- source: this
- });
- }
-
- _updateUIState() {
- this.items.firstPage.disabled = this.pageNumber <= 1;
- this.items.lastPage.disabled = this.pageNumber >= this.pagesCount;
- this.items.pageRotateCw.disabled = this.pagesCount === 0;
- this.items.pageRotateCcw.disabled = this.pagesCount === 0;
- }
-
- _bindClickListeners() {
- this.toggleButton.addEventListener("click", this.toggle.bind(this));
-
- for (const {
- element,
- eventName,
- close,
- eventDetails
- } of this.buttons) {
- element.addEventListener("click", evt => {
- if (eventName !== null) {
- const details = {
- source: this
- };
-
- for (const property in eventDetails) {
- details[property] = eventDetails[property];
- }
-
- this.eventBus.dispatch(eventName, details);
- }
-
- if (close) {
- this.close();
- }
- });
- }
- }
-
- _bindCursorToolsListener(buttons) {
- this.eventBus._on("cursortoolchanged", function ({
- tool
- }) {
- buttons.cursorSelectToolButton.classList.toggle("toggled", tool === _pdf_cursor_tools.CursorTool.SELECT);
- buttons.cursorHandToolButton.classList.toggle("toggled", tool === _pdf_cursor_tools.CursorTool.HAND);
- });
- }
-
- _bindScrollModeListener(buttons) {
- function scrollModeChanged({
- mode
- }) {
- buttons.scrollVerticalButton.classList.toggle("toggled", mode === _ui_utils.ScrollMode.VERTICAL);
- buttons.scrollHorizontalButton.classList.toggle("toggled", mode === _ui_utils.ScrollMode.HORIZONTAL);
- buttons.scrollWrappedButton.classList.toggle("toggled", mode === _ui_utils.ScrollMode.WRAPPED);
- const isScrollModeHorizontal = mode === _ui_utils.ScrollMode.HORIZONTAL;
- buttons.spreadNoneButton.disabled = isScrollModeHorizontal;
- buttons.spreadOddButton.disabled = isScrollModeHorizontal;
- buttons.spreadEvenButton.disabled = isScrollModeHorizontal;
- }
-
- this.eventBus._on("scrollmodechanged", scrollModeChanged);
-
- this.eventBus._on("secondarytoolbarreset", evt => {
- if (evt.source === this) {
- scrollModeChanged({
- mode: _ui_utils.ScrollMode.VERTICAL
- });
- }
- });
- }
-
- _bindSpreadModeListener(buttons) {
- function spreadModeChanged({
- mode
- }) {
- buttons.spreadNoneButton.classList.toggle("toggled", mode === _ui_utils.SpreadMode.NONE);
- buttons.spreadOddButton.classList.toggle("toggled", mode === _ui_utils.SpreadMode.ODD);
- buttons.spreadEvenButton.classList.toggle("toggled", mode === _ui_utils.SpreadMode.EVEN);
- }
-
- this.eventBus._on("spreadmodechanged", spreadModeChanged);
-
- this.eventBus._on("secondarytoolbarreset", evt => {
- if (evt.source === this) {
- spreadModeChanged({
- mode: _ui_utils.SpreadMode.NONE
- });
- }
- });
- }
-
- open() {
- if (this.opened) {
- return;
- }
-
- this.opened = true;
-
- this._setMaxHeight();
-
- this.toggleButton.classList.add("toggled");
- this.toggleButton.setAttribute("aria-expanded", "true");
- this.toolbar.classList.remove("hidden");
- }
-
- close() {
- if (!this.opened) {
- return;
- }
-
- this.opened = false;
- this.toolbar.classList.add("hidden");
- this.toggleButton.classList.remove("toggled");
- this.toggleButton.setAttribute("aria-expanded", "false");
- }
-
- toggle() {
- if (this.opened) {
- this.close();
- } else {
- this.open();
- }
- }
-
- _setMaxHeight() {
- if (!this.opened) {
- return;
- }
-
- this.containerHeight = this.mainContainer.clientHeight;
-
- if (this.containerHeight === this.previousContainerHeight) {
- return;
- }
-
- this.toolbarButtonContainer.style.maxHeight = `${this.containerHeight - _ui_utils.SCROLLBAR_PADDING}px`;
- this.previousContainerHeight = this.containerHeight;
- }
-
-}
-
-exports.SecondaryToolbar = SecondaryToolbar;
-
-/***/ }),
-/* 36 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFSinglePageViewer = void 0;
-
-var _base_viewer = __webpack_require__(28);
-
-var _pdfjsLib = __webpack_require__(5);
-
-class PDFSinglePageViewer extends _base_viewer.BaseViewer {
- constructor(options) {
- super(options);
-
- this.eventBus._on("pagesinit", evt => {
- this._ensurePageViewVisible();
- });
- }
-
- get _viewerElement() {
- return (0, _pdfjsLib.shadow)(this, "_viewerElement", this._shadowViewer);
- }
-
- get _pageWidthScaleFactor() {
- return 1;
- }
-
- _resetView() {
- super._resetView();
-
- this._previousPageNumber = 1;
- this._shadowViewer = document.createDocumentFragment();
- this._updateScrollDown = null;
- }
-
- _ensurePageViewVisible() {
- const pageView = this._pages[this._currentPageNumber - 1];
- const previousPageView = this._pages[this._previousPageNumber - 1];
- const viewerNodes = this.viewer.childNodes;
-
- switch (viewerNodes.length) {
- case 0:
- this.viewer.appendChild(pageView.div);
- break;
-
- case 1:
- if (viewerNodes[0] !== previousPageView.div) {
- throw new Error("_ensurePageViewVisible: Unexpected previously visible page.");
- }
-
- if (pageView === previousPageView) {
- break;
- }
-
- this._shadowViewer.appendChild(previousPageView.div);
-
- this.viewer.appendChild(pageView.div);
- this.container.scrollTop = 0;
- break;
-
- default:
- throw new Error("_ensurePageViewVisible: Only one page should be visible at a time.");
- }
-
- this._previousPageNumber = this._currentPageNumber;
- }
-
- _scrollUpdate() {
- if (this._updateScrollDown) {
- this._updateScrollDown();
- }
-
- super._scrollUpdate();
- }
-
- _scrollIntoView({
- pageDiv,
- pageSpot = null,
- pageNumber = null
- }) {
- if (pageNumber) {
- this._setCurrentPageNumber(pageNumber);
- }
-
- const scrolledDown = this._currentPageNumber >= this._previousPageNumber;
-
- this._ensurePageViewVisible();
-
- this.update();
-
- super._scrollIntoView({
- pageDiv,
- pageSpot,
- pageNumber
- });
-
- this._updateScrollDown = () => {
- this.scroll.down = scrolledDown;
- this._updateScrollDown = null;
- };
- }
-
- _getVisiblePages() {
- return this._getCurrentVisiblePage();
- }
-
- _updateHelper(visiblePages) {}
-
- get _isScrollModeHorizontal() {
- return (0, _pdfjsLib.shadow)(this, "_isScrollModeHorizontal", false);
- }
-
- _updateScrollMode() {}
-
- _updateSpreadMode() {}
-
- _getPageAdvance() {
- return 1;
- }
-
-}
-
-exports.PDFSinglePageViewer = PDFSinglePageViewer;
-
-/***/ }),
-/* 37 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.Toolbar = void 0;
-
-var _ui_utils = __webpack_require__(4);
-
-const PAGE_NUMBER_LOADING_INDICATOR = "visiblePageIsLoading";
-const SCALE_SELECT_CONTAINER_WIDTH = 140;
-const SCALE_SELECT_WIDTH = 162;
-
-class Toolbar {
- constructor(options, eventBus, l10n) {
- this.toolbar = options.container;
- this.eventBus = eventBus;
- this.l10n = l10n;
- this.buttons = [{
- element: options.previous,
- eventName: "previouspage"
- }, {
- element: options.next,
- eventName: "nextpage"
- }, {
- element: options.zoomIn,
- eventName: "zoomin"
- }, {
- element: options.zoomOut,
- eventName: "zoomout"
- }, {
- element: options.openFile,
- eventName: "openfile"
- }, {
- element: options.print,
- eventName: "print"
- }, {
- element: options.presentationModeButton,
- eventName: "presentationmode"
- }, {
- element: options.download,
- eventName: "download"
- }, {
- element: options.viewBookmark,
- eventName: null
- }];
- this.items = {
- numPages: options.numPages,
- pageNumber: options.pageNumber,
- scaleSelectContainer: options.scaleSelectContainer,
- scaleSelect: options.scaleSelect,
- customScaleOption: options.customScaleOption,
- previous: options.previous,
- next: options.next,
- zoomIn: options.zoomIn,
- zoomOut: options.zoomOut
- };
- this._wasLocalized = false;
- this.reset();
-
- this._bindListeners();
- }
-
- setPageNumber(pageNumber, pageLabel) {
- this.pageNumber = pageNumber;
- this.pageLabel = pageLabel;
-
- this._updateUIState(false);
- }
-
- setPagesCount(pagesCount, hasPageLabels) {
- this.pagesCount = pagesCount;
- this.hasPageLabels = hasPageLabels;
-
- this._updateUIState(true);
- }
-
- setPageScale(pageScaleValue, pageScale) {
- this.pageScaleValue = (pageScaleValue || pageScale).toString();
- this.pageScale = pageScale;
-
- this._updateUIState(false);
- }
-
- reset() {
- this.pageNumber = 0;
- this.pageLabel = null;
- this.hasPageLabels = false;
- this.pagesCount = 0;
- this.pageScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;
- this.pageScale = _ui_utils.DEFAULT_SCALE;
-
- this._updateUIState(true);
-
- this.updateLoadingIndicatorState();
- }
-
- _bindListeners() {
- const {
- pageNumber,
- scaleSelect
- } = this.items;
- const self = this;
-
- for (const {
- element,
- eventName
- } of this.buttons) {
- element.addEventListener("click", evt => {
- if (eventName !== null) {
- this.eventBus.dispatch(eventName, {
- source: this
- });
- }
- });
- }
-
- pageNumber.addEventListener("click", function () {
- this.select();
- });
- pageNumber.addEventListener("change", function () {
- self.eventBus.dispatch("pagenumberchanged", {
- source: self,
- value: this.value
- });
- });
- scaleSelect.addEventListener("change", function () {
- if (this.value === "custom") {
- return;
- }
-
- self.eventBus.dispatch("scalechanged", {
- source: self,
- value: this.value
- });
- });
- scaleSelect.addEventListener("click", function (evt) {
- const target = evt.target;
-
- if (this.value === self.pageScaleValue && target.tagName.toUpperCase() === "OPTION") {
- this.blur();
- }
- });
- scaleSelect.oncontextmenu = _ui_utils.noContextMenuHandler;
-
- this.eventBus._on("localized", () => {
- this._wasLocalized = true;
-
- this._adjustScaleWidth();
-
- this._updateUIState(true);
- });
- }
-
- _updateUIState(resetNumPages = false) {
- if (!this._wasLocalized) {
- return;
- }
-
- const {
- pageNumber,
- pagesCount,
- pageScaleValue,
- pageScale,
- items
- } = this;
-
- if (resetNumPages) {
- if (this.hasPageLabels) {
- items.pageNumber.type = "text";
- } else {
- items.pageNumber.type = "number";
- this.l10n.get("of_pages", {
- pagesCount
- }).then(msg => {
- items.numPages.textContent = msg;
- });
- }
-
- items.pageNumber.max = pagesCount;
- }
-
- if (this.hasPageLabels) {
- items.pageNumber.value = this.pageLabel;
- this.l10n.get("page_of_pages", {
- pageNumber,
- pagesCount
- }).then(msg => {
- items.numPages.textContent = msg;
- });
- } else {
- items.pageNumber.value = pageNumber;
- }
-
- items.previous.disabled = pageNumber <= 1;
- items.next.disabled = pageNumber >= pagesCount;
- items.zoomOut.disabled = pageScale <= _ui_utils.MIN_SCALE;
- items.zoomIn.disabled = pageScale >= _ui_utils.MAX_SCALE;
- this.l10n.get("page_scale_percent", {
- scale: Math.round(pageScale * 10000) / 100
- }).then(msg => {
- let predefinedValueFound = false;
-
- for (const option of items.scaleSelect.options) {
- if (option.value !== pageScaleValue) {
- option.selected = false;
- continue;
- }
-
- option.selected = true;
- predefinedValueFound = true;
- }
-
- if (!predefinedValueFound) {
- items.customScaleOption.textContent = msg;
- items.customScaleOption.selected = true;
- }
- });
- }
-
- updateLoadingIndicatorState(loading = false) {
- const pageNumberInput = this.items.pageNumber;
- pageNumberInput.classList.toggle(PAGE_NUMBER_LOADING_INDICATOR, loading);
- }
-
- async _adjustScaleWidth() {
- const {
- items,
- l10n
- } = this;
- const predefinedValuesPromise = Promise.all([l10n.get("page_scale_auto"), l10n.get("page_scale_actual"), l10n.get("page_scale_fit"), l10n.get("page_scale_width")]);
- let canvas = document.createElement("canvas");
- canvas.mozOpaque = true;
- let ctx = canvas.getContext("2d", {
- alpha: false
- });
- await _ui_utils.animationStarted;
- const {
- fontSize,
- fontFamily
- } = getComputedStyle(items.scaleSelect);
- ctx.font = `${fontSize} ${fontFamily}`;
- let maxWidth = 0;
-
- for (const predefinedValue of await predefinedValuesPromise) {
- const {
- width
- } = ctx.measureText(predefinedValue);
-
- if (width > maxWidth) {
- maxWidth = width;
- }
- }
-
- const overflow = SCALE_SELECT_WIDTH - SCALE_SELECT_CONTAINER_WIDTH;
- maxWidth += 2 * overflow;
-
- if (maxWidth > SCALE_SELECT_CONTAINER_WIDTH) {
- items.scaleSelect.style.width = `${maxWidth + overflow}px`;
- items.scaleSelectContainer.style.width = `${maxWidth}px`;
- }
-
- canvas.width = 0;
- canvas.height = 0;
- canvas = ctx = null;
- }
-
-}
-
-exports.Toolbar = Toolbar;
-
-/***/ }),
-/* 38 */
-/***/ ((__unused_webpack_module, exports) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.ViewHistory = void 0;
-const DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;
-
-class ViewHistory {
- constructor(fingerprint, cacheSize = DEFAULT_VIEW_HISTORY_CACHE_SIZE) {
- this.fingerprint = fingerprint;
- this.cacheSize = cacheSize;
- this._initializedPromise = this._readFromStorage().then(databaseStr => {
- const database = JSON.parse(databaseStr || "{}");
- let index = -1;
-
- if (!Array.isArray(database.files)) {
- database.files = [];
- } else {
- while (database.files.length >= this.cacheSize) {
- database.files.shift();
- }
-
- for (let i = 0, ii = database.files.length; i < ii; i++) {
- const branch = database.files[i];
-
- if (branch.fingerprint === this.fingerprint) {
- index = i;
- break;
- }
- }
- }
-
- if (index === -1) {
- index = database.files.push({
- fingerprint: this.fingerprint
- }) - 1;
- }
-
- this.file = database.files[index];
- this.database = database;
- });
- }
-
- async _writeToStorage() {
- const databaseStr = JSON.stringify(this.database);
- localStorage.setItem("pdfjs.history", databaseStr);
- }
-
- async _readFromStorage() {
- return localStorage.getItem("pdfjs.history");
- }
-
- async set(name, val) {
- await this._initializedPromise;
- this.file[name] = val;
- return this._writeToStorage();
- }
-
- async setMultiple(properties) {
- await this._initializedPromise;
-
- for (const name in properties) {
- this.file[name] = properties[name];
- }
-
- return this._writeToStorage();
- }
-
- async get(name, defaultValue) {
- await this._initializedPromise;
- const val = this.file[name];
- return val !== undefined ? val : defaultValue;
- }
-
- async getMultiple(properties) {
- await this._initializedPromise;
- const values = Object.create(null);
-
- for (const name in properties) {
- const val = this.file[name];
- values[name] = val !== undefined ? val : properties[name];
- }
-
- return values;
- }
-
-}
-
-exports.ViewHistory = ViewHistory;
-
-/***/ }),
-/* 39 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.GenericCom = void 0;
-
-var _app = __webpack_require__(3);
-
-var _preferences = __webpack_require__(40);
-
-var _download_manager = __webpack_require__(41);
-
-var _genericl10n = __webpack_require__(42);
-
-var _generic_scripting = __webpack_require__(44);
-
-;
-const GenericCom = {};
-exports.GenericCom = GenericCom;
-
-class GenericPreferences extends _preferences.BasePreferences {
- async _writeToStorage(prefObj) {
- localStorage.setItem("pdfjs.preferences", JSON.stringify(prefObj));
- }
-
- async _readFromStorage(prefObj) {
- return JSON.parse(localStorage.getItem("pdfjs.preferences"));
- }
-
-}
-
-class GenericExternalServices extends _app.DefaultExternalServices {
- static createDownloadManager(options) {
- return new _download_manager.DownloadManager();
- }
-
- static createPreferences() {
- return new GenericPreferences();
- }
-
- static createL10n({
- locale = "en-US"
- }) {
- return new _genericl10n.GenericL10n(locale);
- }
-
- static createScripting({
- sandboxBundleSrc
- }) {
- return new _generic_scripting.GenericScripting(sandboxBundleSrc);
- }
-
-}
-
-_app.PDFViewerApplication.externalServices = GenericExternalServices;
-
-/***/ }),
-/* 40 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.BasePreferences = void 0;
-
-var _app_options = __webpack_require__(1);
-
-class BasePreferences {
- constructor() {
- if (this.constructor === BasePreferences) {
- throw new Error("Cannot initialize BasePreferences.");
- }
-
- Object.defineProperty(this, "defaults", {
- value: Object.freeze({
- "cursorToolOnLoad": 0,
- "defaultZoomValue": "",
- "disablePageLabels": false,
- "enablePermissions": false,
- "enablePrintAutoRotate": true,
- "enableScripting": true,
- "externalLinkTarget": 0,
- "historyUpdateUrl": false,
- "ignoreDestinationZoom": false,
- "pdfBugEnabled": false,
- "renderer": "canvas",
- "renderInteractiveForms": true,
- "sidebarViewOnLoad": -1,
- "scrollModeOnLoad": -1,
- "spreadModeOnLoad": -1,
- "textLayerMode": 1,
- "useOnlyCssZoom": false,
- "viewerCssTheme": 0,
- "viewOnLoad": 0,
- "disableAutoFetch": false,
- "disableFontFace": false,
- "disableRange": false,
- "disableStream": false,
- "enableXfa": false
- }),
- writable: false,
- enumerable: true,
- configurable: false
- });
- this.prefs = Object.create(null);
- this._initializedPromise = this._readFromStorage(this.defaults).then(prefs => {
- for (const name in this.defaults) {
- const prefValue = prefs?.[name];
-
- if (typeof prefValue === typeof this.defaults[name]) {
- this.prefs[name] = prefValue;
- }
- }
- });
- }
-
- async _writeToStorage(prefObj) {
- throw new Error("Not implemented: _writeToStorage");
- }
-
- async _readFromStorage(prefObj) {
- throw new Error("Not implemented: _readFromStorage");
- }
-
- async reset() {
- await this._initializedPromise;
- this.prefs = Object.create(null);
- return this._writeToStorage(this.defaults);
- }
-
- async set(name, value) {
- await this._initializedPromise;
- const defaultValue = this.defaults[name];
-
- if (defaultValue === undefined) {
- throw new Error(`Set preference: "${name}" is undefined.`);
- } else if (value === undefined) {
- throw new Error("Set preference: no value is specified.");
- }
-
- const valueType = typeof value;
- const defaultType = typeof defaultValue;
-
- if (valueType !== defaultType) {
- if (valueType === "number" && defaultType === "string") {
- value = value.toString();
- } else {
- throw new Error(`Set preference: "${value}" is a ${valueType}, expected a ${defaultType}.`);
- }
- } else {
- if (valueType === "number" && !Number.isInteger(value)) {
- throw new Error(`Set preference: "${value}" must be an integer.`);
- }
- }
-
- this.prefs[name] = value;
- return this._writeToStorage(this.prefs);
- }
-
- async get(name) {
- await this._initializedPromise;
- const defaultValue = this.defaults[name],
- prefValue = this.prefs[name];
-
- if (defaultValue === undefined) {
- throw new Error(`Get preference: "${name}" is undefined.`);
- }
-
- return prefValue !== undefined ? prefValue : defaultValue;
- }
-
- async getAll() {
- await this._initializedPromise;
- const obj = Object.create(null);
-
- for (const name in this.defaults) {
- const prefValue = this.prefs[name];
- obj[name] = prefValue !== undefined ? prefValue : this.defaults[name];
- }
-
- return obj;
- }
-
-}
-
-exports.BasePreferences = BasePreferences;
-
-/***/ }),
-/* 41 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.DownloadManager = void 0;
-
-var _pdfjsLib = __webpack_require__(5);
-
-var _viewer_compatibility = __webpack_require__(2);
-
-;
-
-function download(blobUrl, filename) {
- const a = document.createElement("a");
-
- if (!a.click) {
- throw new Error('DownloadManager: "a.click()" is not supported.');
- }
-
- a.href = blobUrl;
- a.target = "_parent";
-
- if ("download" in a) {
- a.download = filename;
- }
-
- (document.body || document.documentElement).appendChild(a);
- a.click();
- a.remove();
-}
-
-class DownloadManager {
- constructor() {
- this._openBlobUrls = new WeakMap();
- }
-
- downloadUrl(url, filename) {
- if (!(0, _pdfjsLib.createValidAbsoluteUrl)(url, "http://example.com")) {
- return;
- }
-
- download(url + "#pdfjs.action=download", filename);
- }
-
- downloadData(data, filename, contentType) {
- const blobUrl = (0, _pdfjsLib.createObjectURL)(data, contentType, _viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL);
- download(blobUrl, filename);
- }
-
- openOrDownloadData(element, data, filename) {
- const isPdfData = (0, _pdfjsLib.isPdfFile)(filename);
- const contentType = isPdfData ? "application/pdf" : "";
-
- if (isPdfData && !_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {
- let blobUrl = this._openBlobUrls.get(element);
-
- if (!blobUrl) {
- blobUrl = URL.createObjectURL(new Blob([data], {
- type: contentType
- }));
-
- this._openBlobUrls.set(element, blobUrl);
- }
-
- let viewerUrl;
- viewerUrl = "?file=" + encodeURIComponent(blobUrl + "#" + filename);
-
- try {
- window.open(viewerUrl);
- return true;
- } catch (ex) {
- console.error(`openOrDownloadData: ${ex}`);
- URL.revokeObjectURL(blobUrl);
-
- this._openBlobUrls.delete(element);
- }
- }
-
- this.downloadData(data, filename, contentType);
- return false;
- }
-
- download(blob, url, filename, sourceEventType = "download") {
- if (_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {
- this.downloadUrl(url, filename);
- return;
- }
-
- const blobUrl = URL.createObjectURL(blob);
- download(blobUrl, filename);
- }
-
-}
-
-exports.DownloadManager = DownloadManager;
-
-/***/ }),
-/* 42 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.GenericL10n = void 0;
-
-__webpack_require__(43);
-
-var _l10n_utils = __webpack_require__(30);
-
-const webL10n = document.webL10n;
-
-class GenericL10n {
- constructor(lang) {
- this._lang = lang;
- this._ready = new Promise((resolve, reject) => {
- webL10n.setLanguage((0, _l10n_utils.fixupLangCode)(lang), () => {
- resolve(webL10n);
- });
- });
- }
-
- async getLanguage() {
- const l10n = await this._ready;
- return l10n.getLanguage();
- }
-
- async getDirection() {
- const l10n = await this._ready;
- return l10n.getDirection();
- }
-
- async get(key, args = null, fallback = (0, _l10n_utils.getL10nFallback)(key, args)) {
- const l10n = await this._ready;
- return l10n.get(key, args, fallback);
- }
-
- async translate(element) {
- const l10n = await this._ready;
- return l10n.translate(element);
- }
-
-}
-
-exports.GenericL10n = GenericL10n;
-
-/***/ }),
-/* 43 */
-/***/ (() => {
-
-
-
-document.webL10n = function (window, document, undefined) {
- var gL10nData = {};
- var gTextData = '';
- var gTextProp = 'textContent';
- var gLanguage = '';
- var gMacros = {};
- var gReadyState = 'loading';
- var gAsyncResourceLoading = true;
-
- function getL10nResourceLinks() {
- return document.querySelectorAll('link[type="application/l10n"]');
- }
-
- function getL10nDictionary() {
- var script = document.querySelector('script[type="application/l10n"]');
- return script ? JSON.parse(script.innerHTML) : null;
- }
-
- function getTranslatableChildren(element) {
- return element ? element.querySelectorAll('*[data-l10n-id]') : [];
- }
-
- function getL10nAttributes(element) {
- if (!element) return {};
- var l10nId = element.getAttribute('data-l10n-id');
- var l10nArgs = element.getAttribute('data-l10n-args');
- var args = {};
-
- if (l10nArgs) {
- try {
- args = JSON.parse(l10nArgs);
- } catch (e) {
- console.warn('could not parse arguments for #' + l10nId);
- }
- }
-
- return {
- id: l10nId,
- args: args
- };
- }
-
- function xhrLoadText(url, onSuccess, onFailure) {
- onSuccess = onSuccess || function _onSuccess(data) {};
-
- onFailure = onFailure || function _onFailure() {};
-
- var xhr = new XMLHttpRequest();
- xhr.open('GET', url, gAsyncResourceLoading);
-
- if (xhr.overrideMimeType) {
- xhr.overrideMimeType('text/plain; charset=utf-8');
- }
-
- xhr.onreadystatechange = function () {
- if (xhr.readyState == 4) {
- if (xhr.status == 200 || xhr.status === 0) {
- onSuccess(xhr.responseText);
- } else {
- onFailure();
- }
- }
- };
-
- xhr.onerror = onFailure;
- xhr.ontimeout = onFailure;
-
- try {
- xhr.send(null);
- } catch (e) {
- onFailure();
- }
- }
-
- function parseResource(href, lang, successCallback, failureCallback) {
- var baseURL = href.replace(/[^\/]*$/, '') || './';
-
- function evalString(text) {
- if (text.lastIndexOf('\\') < 0) return text;
- return text.replace(/\\\\/g, '\\').replace(/\\n/g, '\n').replace(/\\r/g, '\r').replace(/\\t/g, '\t').replace(/\\b/g, '\b').replace(/\\f/g, '\f').replace(/\\{/g, '{').replace(/\\}/g, '}').replace(/\\"/g, '"').replace(/\\'/g, "'");
- }
-
- function parseProperties(text, parsedPropertiesCallback) {
- var dictionary = {};
- var reBlank = /^\s*|\s*$/;
- var reComment = /^\s*#|^\s*$/;
- var reSection = /^\s*\[(.*)\]\s*$/;
- var reImport = /^\s*@import\s+url\((.*)\)\s*$/i;
- var reSplit = /^([^=\s]*)\s*=\s*(.+)$/;
-
- function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) {
- var entries = rawText.replace(reBlank, '').split(/[\r\n]+/);
- var currentLang = '*';
- var genericLang = lang.split('-', 1)[0];
- var skipLang = false;
- var match = '';
-
- function nextEntry() {
- while (true) {
- if (!entries.length) {
- parsedRawLinesCallback();
- return;
- }
-
- var line = entries.shift();
- if (reComment.test(line)) continue;
-
- if (extendedSyntax) {
- match = reSection.exec(line);
-
- if (match) {
- currentLang = match[1].toLowerCase();
- skipLang = currentLang !== '*' && currentLang !== lang && currentLang !== genericLang;
- continue;
- } else if (skipLang) {
- continue;
- }
-
- match = reImport.exec(line);
-
- if (match) {
- loadImport(baseURL + match[1], nextEntry);
- return;
- }
- }
-
- var tmp = line.match(reSplit);
-
- if (tmp && tmp.length == 3) {
- dictionary[tmp[1]] = evalString(tmp[2]);
- }
- }
- }
-
- nextEntry();
- }
-
- function loadImport(url, callback) {
- xhrLoadText(url, function (content) {
- parseRawLines(content, false, callback);
- }, function () {
- console.warn(url + ' not found.');
- callback();
- });
- }
-
- parseRawLines(text, true, function () {
- parsedPropertiesCallback(dictionary);
- });
- }
-
- xhrLoadText(href, function (response) {
- gTextData += response;
- parseProperties(response, function (data) {
- for (var key in data) {
- var id,
- prop,
- index = key.lastIndexOf('.');
-
- if (index > 0) {
- id = key.substring(0, index);
- prop = key.substring(index + 1);
- } else {
- id = key;
- prop = gTextProp;
- }
-
- if (!gL10nData[id]) {
- gL10nData[id] = {};
- }
-
- gL10nData[id][prop] = data[key];
- }
-
- if (successCallback) {
- successCallback();
- }
- });
- }, failureCallback);
- }
-
- function loadLocale(lang, callback) {
- if (lang) {
- lang = lang.toLowerCase();
- }
-
- callback = callback || function _callback() {};
-
- clear();
- gLanguage = lang;
- var langLinks = getL10nResourceLinks();
- var langCount = langLinks.length;
-
- if (langCount === 0) {
- var dict = getL10nDictionary();
-
- if (dict && dict.locales && dict.default_locale) {
- console.log('using the embedded JSON directory, early way out');
- gL10nData = dict.locales[lang];
-
- if (!gL10nData) {
- var defaultLocale = dict.default_locale.toLowerCase();
-
- for (var anyCaseLang in dict.locales) {
- anyCaseLang = anyCaseLang.toLowerCase();
-
- if (anyCaseLang === lang) {
- gL10nData = dict.locales[lang];
- break;
- } else if (anyCaseLang === defaultLocale) {
- gL10nData = dict.locales[defaultLocale];
- }
- }
- }
-
- callback();
- } else {
- console.log('no resource to load, early way out');
- }
-
- gReadyState = 'complete';
- return;
- }
-
- var onResourceLoaded = null;
- var gResourceCount = 0;
-
- onResourceLoaded = function () {
- gResourceCount++;
-
- if (gResourceCount >= langCount) {
- callback();
- gReadyState = 'complete';
- }
- };
-
- function L10nResourceLink(link) {
- var href = link.href;
-
- this.load = function (lang, callback) {
- parseResource(href, lang, callback, function () {
- console.warn(href + ' not found.');
- console.warn('"' + lang + '" resource not found');
- gLanguage = '';
- callback();
- });
- };
- }
-
- for (var i = 0; i < langCount; i++) {
- var resource = new L10nResourceLink(langLinks[i]);
- resource.load(lang, onResourceLoaded);
- }
- }
-
- function clear() {
- gL10nData = {};
- gTextData = '';
- gLanguage = '';
- }
-
- function getPluralRules(lang) {
- var locales2rules = {
- 'af': 3,
- 'ak': 4,
- 'am': 4,
- 'ar': 1,
- 'asa': 3,
- 'az': 0,
- 'be': 11,
- 'bem': 3,
- 'bez': 3,
- 'bg': 3,
- 'bh': 4,
- 'bm': 0,
- 'bn': 3,
- 'bo': 0,
- 'br': 20,
- 'brx': 3,
- 'bs': 11,
- 'ca': 3,
- 'cgg': 3,
- 'chr': 3,
- 'cs': 12,
- 'cy': 17,
- 'da': 3,
- 'de': 3,
- 'dv': 3,
- 'dz': 0,
- 'ee': 3,
- 'el': 3,
- 'en': 3,
- 'eo': 3,
- 'es': 3,
- 'et': 3,
- 'eu': 3,
- 'fa': 0,
- 'ff': 5,
- 'fi': 3,
- 'fil': 4,
- 'fo': 3,
- 'fr': 5,
- 'fur': 3,
- 'fy': 3,
- 'ga': 8,
- 'gd': 24,
- 'gl': 3,
- 'gsw': 3,
- 'gu': 3,
- 'guw': 4,
- 'gv': 23,
- 'ha': 3,
- 'haw': 3,
- 'he': 2,
- 'hi': 4,
- 'hr': 11,
- 'hu': 0,
- 'id': 0,
- 'ig': 0,
- 'ii': 0,
- 'is': 3,
- 'it': 3,
- 'iu': 7,
- 'ja': 0,
- 'jmc': 3,
- 'jv': 0,
- 'ka': 0,
- 'kab': 5,
- 'kaj': 3,
- 'kcg': 3,
- 'kde': 0,
- 'kea': 0,
- 'kk': 3,
- 'kl': 3,
- 'km': 0,
- 'kn': 0,
- 'ko': 0,
- 'ksb': 3,
- 'ksh': 21,
- 'ku': 3,
- 'kw': 7,
- 'lag': 18,
- 'lb': 3,
- 'lg': 3,
- 'ln': 4,
- 'lo': 0,
- 'lt': 10,
- 'lv': 6,
- 'mas': 3,
- 'mg': 4,
- 'mk': 16,
- 'ml': 3,
- 'mn': 3,
- 'mo': 9,
- 'mr': 3,
- 'ms': 0,
- 'mt': 15,
- 'my': 0,
- 'nah': 3,
- 'naq': 7,
- 'nb': 3,
- 'nd': 3,
- 'ne': 3,
- 'nl': 3,
- 'nn': 3,
- 'no': 3,
- 'nr': 3,
- 'nso': 4,
- 'ny': 3,
- 'nyn': 3,
- 'om': 3,
- 'or': 3,
- 'pa': 3,
- 'pap': 3,
- 'pl': 13,
- 'ps': 3,
- 'pt': 3,
- 'rm': 3,
- 'ro': 9,
- 'rof': 3,
- 'ru': 11,
- 'rwk': 3,
- 'sah': 0,
- 'saq': 3,
- 'se': 7,
- 'seh': 3,
- 'ses': 0,
- 'sg': 0,
- 'sh': 11,
- 'shi': 19,
- 'sk': 12,
- 'sl': 14,
- 'sma': 7,
- 'smi': 7,
- 'smj': 7,
- 'smn': 7,
- 'sms': 7,
- 'sn': 3,
- 'so': 3,
- 'sq': 3,
- 'sr': 11,
- 'ss': 3,
- 'ssy': 3,
- 'st': 3,
- 'sv': 3,
- 'sw': 3,
- 'syr': 3,
- 'ta': 3,
- 'te': 3,
- 'teo': 3,
- 'th': 0,
- 'ti': 4,
- 'tig': 3,
- 'tk': 3,
- 'tl': 4,
- 'tn': 3,
- 'to': 0,
- 'tr': 0,
- 'ts': 3,
- 'tzm': 22,
- 'uk': 11,
- 'ur': 3,
- 've': 3,
- 'vi': 0,
- 'vun': 3,
- 'wa': 4,
- 'wae': 3,
- 'wo': 0,
- 'xh': 3,
- 'xog': 3,
- 'yo': 0,
- 'zh': 0,
- 'zu': 3
- };
-
- function isIn(n, list) {
- return list.indexOf(n) !== -1;
- }
-
- function isBetween(n, start, end) {
- return start <= n && n <= end;
- }
-
- var pluralRules = {
- '0': function (n) {
- return 'other';
- },
- '1': function (n) {
- if (isBetween(n % 100, 3, 10)) return 'few';
- if (n === 0) return 'zero';
- if (isBetween(n % 100, 11, 99)) return 'many';
- if (n == 2) return 'two';
- if (n == 1) return 'one';
- return 'other';
- },
- '2': function (n) {
- if (n !== 0 && n % 10 === 0) return 'many';
- if (n == 2) return 'two';
- if (n == 1) return 'one';
- return 'other';
- },
- '3': function (n) {
- if (n == 1) return 'one';
- return 'other';
- },
- '4': function (n) {
- if (isBetween(n, 0, 1)) return 'one';
- return 'other';
- },
- '5': function (n) {
- if (isBetween(n, 0, 2) && n != 2) return 'one';
- return 'other';
- },
- '6': function (n) {
- if (n === 0) return 'zero';
- if (n % 10 == 1 && n % 100 != 11) return 'one';
- return 'other';
- },
- '7': function (n) {
- if (n == 2) return 'two';
- if (n == 1) return 'one';
- return 'other';
- },
- '8': function (n) {
- if (isBetween(n, 3, 6)) return 'few';
- if (isBetween(n, 7, 10)) return 'many';
- if (n == 2) return 'two';
- if (n == 1) return 'one';
- return 'other';
- },
- '9': function (n) {
- if (n === 0 || n != 1 && isBetween(n % 100, 1, 19)) return 'few';
- if (n == 1) return 'one';
- return 'other';
- },
- '10': function (n) {
- if (isBetween(n % 10, 2, 9) && !isBetween(n % 100, 11, 19)) return 'few';
- if (n % 10 == 1 && !isBetween(n % 100, 11, 19)) return 'one';
- return 'other';
- },
- '11': function (n) {
- if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few';
- if (n % 10 === 0 || isBetween(n % 10, 5, 9) || isBetween(n % 100, 11, 14)) return 'many';
- if (n % 10 == 1 && n % 100 != 11) return 'one';
- return 'other';
- },
- '12': function (n) {
- if (isBetween(n, 2, 4)) return 'few';
- if (n == 1) return 'one';
- return 'other';
- },
- '13': function (n) {
- if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few';
- if (n != 1 && isBetween(n % 10, 0, 1) || isBetween(n % 10, 5, 9) || isBetween(n % 100, 12, 14)) return 'many';
- if (n == 1) return 'one';
- return 'other';
- },
- '14': function (n) {
- if (isBetween(n % 100, 3, 4)) return 'few';
- if (n % 100 == 2) return 'two';
- if (n % 100 == 1) return 'one';
- return 'other';
- },
- '15': function (n) {
- if (n === 0 || isBetween(n % 100, 2, 10)) return 'few';
- if (isBetween(n % 100, 11, 19)) return 'many';
- if (n == 1) return 'one';
- return 'other';
- },
- '16': function (n) {
- if (n % 10 == 1 && n != 11) return 'one';
- return 'other';
- },
- '17': function (n) {
- if (n == 3) return 'few';
- if (n === 0) return 'zero';
- if (n == 6) return 'many';
- if (n == 2) return 'two';
- if (n == 1) return 'one';
- return 'other';
- },
- '18': function (n) {
- if (n === 0) return 'zero';
- if (isBetween(n, 0, 2) && n !== 0 && n != 2) return 'one';
- return 'other';
- },
- '19': function (n) {
- if (isBetween(n, 2, 10)) return 'few';
- if (isBetween(n, 0, 1)) return 'one';
- return 'other';
- },
- '20': function (n) {
- if ((isBetween(n % 10, 3, 4) || n % 10 == 9) && !(isBetween(n % 100, 10, 19) || isBetween(n % 100, 70, 79) || isBetween(n % 100, 90, 99))) return 'few';
- if (n % 1000000 === 0 && n !== 0) return 'many';
- if (n % 10 == 2 && !isIn(n % 100, [12, 72, 92])) return 'two';
- if (n % 10 == 1 && !isIn(n % 100, [11, 71, 91])) return 'one';
- return 'other';
- },
- '21': function (n) {
- if (n === 0) return 'zero';
- if (n == 1) return 'one';
- return 'other';
- },
- '22': function (n) {
- if (isBetween(n, 0, 1) || isBetween(n, 11, 99)) return 'one';
- return 'other';
- },
- '23': function (n) {
- if (isBetween(n % 10, 1, 2) || n % 20 === 0) return 'one';
- return 'other';
- },
- '24': function (n) {
- if (isBetween(n, 3, 10) || isBetween(n, 13, 19)) return 'few';
- if (isIn(n, [2, 12])) return 'two';
- if (isIn(n, [1, 11])) return 'one';
- return 'other';
- }
- };
- var index = locales2rules[lang.replace(/-.*$/, '')];
-
- if (!(index in pluralRules)) {
- console.warn('plural form unknown for [' + lang + ']');
- return function () {
- return 'other';
- };
- }
-
- return pluralRules[index];
- }
-
- gMacros.plural = function (str, param, key, prop) {
- var n = parseFloat(param);
- if (isNaN(n)) return str;
- if (prop != gTextProp) return str;
-
- if (!gMacros._pluralRules) {
- gMacros._pluralRules = getPluralRules(gLanguage);
- }
-
- var index = '[' + gMacros._pluralRules(n) + ']';
-
- if (n === 0 && key + '[zero]' in gL10nData) {
- str = gL10nData[key + '[zero]'][prop];
- } else if (n == 1 && key + '[one]' in gL10nData) {
- str = gL10nData[key + '[one]'][prop];
- } else if (n == 2 && key + '[two]' in gL10nData) {
- str = gL10nData[key + '[two]'][prop];
- } else if (key + index in gL10nData) {
- str = gL10nData[key + index][prop];
- } else if (key + '[other]' in gL10nData) {
- str = gL10nData[key + '[other]'][prop];
- }
-
- return str;
- };
-
- function getL10nData(key, args, fallback) {
- var data = gL10nData[key];
-
- if (!data) {
- console.warn('#' + key + ' is undefined.');
-
- if (!fallback) {
- return null;
- }
-
- data = fallback;
- }
-
- var rv = {};
-
- for (var prop in data) {
- var str = data[prop];
- str = substIndexes(str, args, key, prop);
- str = substArguments(str, args, key);
- rv[prop] = str;
- }
-
- return rv;
- }
-
- function substIndexes(str, args, key, prop) {
- var reIndex = /\{\[\s*([a-zA-Z]+)\(([a-zA-Z]+)\)\s*\]\}/;
- var reMatch = reIndex.exec(str);
- if (!reMatch || !reMatch.length) return str;
- var macroName = reMatch[1];
- var paramName = reMatch[2];
- var param;
-
- if (args && paramName in args) {
- param = args[paramName];
- } else if (paramName in gL10nData) {
- param = gL10nData[paramName];
- }
-
- if (macroName in gMacros) {
- var macro = gMacros[macroName];
- str = macro(str, param, key, prop);
- }
-
- return str;
- }
-
- function substArguments(str, args, key) {
- var reArgs = /\{\{\s*(.+?)\s*\}\}/g;
- return str.replace(reArgs, function (matched_text, arg) {
- if (args && arg in args) {
- return args[arg];
- }
-
- if (arg in gL10nData) {
- return gL10nData[arg];
- }
-
- console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');
- return matched_text;
- });
- }
-
- function translateElement(element) {
- var l10n = getL10nAttributes(element);
- if (!l10n.id) return;
- var data = getL10nData(l10n.id, l10n.args);
-
- if (!data) {
- console.warn('#' + l10n.id + ' is undefined.');
- return;
- }
-
- if (data[gTextProp]) {
- if (getChildElementCount(element) === 0) {
- element[gTextProp] = data[gTextProp];
- } else {
- var children = element.childNodes;
- var found = false;
-
- for (var i = 0, l = children.length; i < l; i++) {
- if (children[i].nodeType === 3 && /\S/.test(children[i].nodeValue)) {
- if (found) {
- children[i].nodeValue = '';
- } else {
- children[i].nodeValue = data[gTextProp];
- found = true;
- }
- }
- }
-
- if (!found) {
- var textNode = document.createTextNode(data[gTextProp]);
- element.insertBefore(textNode, element.firstChild);
- }
- }
-
- delete data[gTextProp];
- }
-
- for (var k in data) {
- element[k] = data[k];
- }
- }
-
- function getChildElementCount(element) {
- if (element.children) {
- return element.children.length;
- }
-
- if (typeof element.childElementCount !== 'undefined') {
- return element.childElementCount;
- }
-
- var count = 0;
-
- for (var i = 0; i < element.childNodes.length; i++) {
- count += element.nodeType === 1 ? 1 : 0;
- }
-
- return count;
- }
-
- function translateFragment(element) {
- element = element || document.documentElement;
- var children = getTranslatableChildren(element);
- var elementCount = children.length;
-
- for (var i = 0; i < elementCount; i++) {
- translateElement(children[i]);
- }
-
- translateElement(element);
- }
-
- return {
- get: function (key, args, fallbackString) {
- var index = key.lastIndexOf('.');
- var prop = gTextProp;
-
- if (index > 0) {
- prop = key.substring(index + 1);
- key = key.substring(0, index);
- }
-
- var fallback;
-
- if (fallbackString) {
- fallback = {};
- fallback[prop] = fallbackString;
- }
-
- var data = getL10nData(key, args, fallback);
-
- if (data && prop in data) {
- return data[prop];
- }
-
- return '{{' + key + '}}';
- },
- getData: function () {
- return gL10nData;
- },
- getText: function () {
- return gTextData;
- },
- getLanguage: function () {
- return gLanguage;
- },
- setLanguage: function (lang, callback) {
- loadLocale(lang, function () {
- if (callback) callback();
- });
- },
- getDirection: function () {
- var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];
- var shortCode = gLanguage.split('-', 1)[0];
- return rtlList.indexOf(shortCode) >= 0 ? 'rtl' : 'ltr';
- },
- translate: translateFragment,
- getReadyState: function () {
- return gReadyState;
- },
- ready: function (callback) {
- if (!callback) {
- return;
- } else if (gReadyState == 'complete' || gReadyState == 'interactive') {
- window.setTimeout(function () {
- callback();
- });
- } else if (document.addEventListener) {
- document.addEventListener('localized', function once() {
- document.removeEventListener('localized', once);
- callback();
- });
- }
- }
- };
-}(window, document);
-
-/***/ }),
-/* 44 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.docPropertiesLookup = docPropertiesLookup;
-exports.GenericScripting = void 0;
-
-var _pdfjsLib = __webpack_require__(5);
-
-async function docPropertiesLookup(pdfDocument) {
- const url = "",
- baseUrl = url.split("#")[0];
- let {
- info,
- metadata,
- contentDispositionFilename,
- contentLength
- } = await pdfDocument.getMetadata();
-
- if (!contentLength) {
- const {
- length
- } = await pdfDocument.getDownloadInfo();
- contentLength = length;
- }
-
- return { ...info,
- baseURL: baseUrl,
- filesize: contentLength,
- filename: contentDispositionFilename || (0, _pdfjsLib.getPdfFilenameFromUrl)(url),
- metadata: metadata?.getRaw(),
- authors: metadata?.get("dc:creator"),
- numPages: pdfDocument.numPages,
- URL: url
- };
-}
-
-class GenericScripting {
- constructor(sandboxBundleSrc) {
- this._ready = (0, _pdfjsLib.loadScript)(sandboxBundleSrc, true).then(() => {
- return window.pdfjsSandbox.QuickJSSandbox();
- });
- }
-
- async createSandbox(data) {
- const sandbox = await this._ready;
- sandbox.create(data);
- }
-
- async dispatchEventInSandbox(event) {
- const sandbox = await this._ready;
- sandbox.dispatchEvent(event);
- }
-
- async destroySandbox() {
- const sandbox = await this._ready;
- sandbox.nukeSandbox();
- }
-
-}
-
-exports.GenericScripting = GenericScripting;
-
-/***/ }),
-/* 45 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.PDFPrintService = PDFPrintService;
-
-var _app = __webpack_require__(3);
-
-var _print_utils = __webpack_require__(46);
-
-var _viewer_compatibility = __webpack_require__(2);
-
-let activeService = null;
-let overlayManager = null;
-
-function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size, printResolution, optionalContentConfigPromise) {
- const scratchCanvas = activeService.scratchCanvas;
- const PRINT_UNITS = printResolution / 72.0;
- scratchCanvas.width = Math.floor(size.width * PRINT_UNITS);
- scratchCanvas.height = Math.floor(size.height * PRINT_UNITS);
- const ctx = scratchCanvas.getContext("2d");
- ctx.save();
- ctx.fillStyle = "rgb(255, 255, 255)";
- ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height);
- ctx.restore();
- return pdfDocument.getPage(pageNumber).then(function (pdfPage) {
- const renderContext = {
- canvasContext: ctx,
- transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0],
- viewport: pdfPage.getViewport({
- scale: 1,
- rotation: size.rotation
- }),
- intent: "print",
- includeAnnotationStorage: true,
- optionalContentConfigPromise
- };
- return pdfPage.render(renderContext).promise;
- });
-}
-
-function PDFPrintService(pdfDocument, pagesOverview, printContainer, printResolution, optionalContentConfigPromise = null, l10n) {
- this.pdfDocument = pdfDocument;
- this.pagesOverview = pagesOverview;
- this.printContainer = printContainer;
- this._printResolution = printResolution || 150;
- this._optionalContentConfigPromise = optionalContentConfigPromise || pdfDocument.getOptionalContentConfig();
- this.l10n = l10n;
- this.currentPage = -1;
- this.scratchCanvas = document.createElement("canvas");
-}
-
-PDFPrintService.prototype = {
- layout() {
- this.throwIfInactive();
- const body = document.querySelector("body");
- body.setAttribute("data-pdfjsprinting", true);
- const hasEqualPageSizes = this.pagesOverview.every(function (size) {
- return size.width === this.pagesOverview[0].width && size.height === this.pagesOverview[0].height;
- }, this);
-
- if (!hasEqualPageSizes) {
- console.warn("Not all pages have the same size. The printed " + "result may be incorrect!");
- }
-
- this.pageStyleSheet = document.createElement("style");
- const pageSize = this.pagesOverview[0];
- this.pageStyleSheet.textContent = "@page { size: " + pageSize.width + "pt " + pageSize.height + "pt;}";
- body.appendChild(this.pageStyleSheet);
- },
-
- destroy() {
- if (activeService !== this) {
- return;
- }
-
- this.printContainer.textContent = "";
- const body = document.querySelector("body");
- body.removeAttribute("data-pdfjsprinting");
-
- if (this.pageStyleSheet) {
- this.pageStyleSheet.remove();
- this.pageStyleSheet = null;
- }
-
- this.scratchCanvas.width = this.scratchCanvas.height = 0;
- this.scratchCanvas = null;
- activeService = null;
- ensureOverlay().then(function () {
- if (overlayManager.active !== "printServiceOverlay") {
- return;
- }
-
- overlayManager.close("printServiceOverlay");
- });
- },
-
- renderPages() {
- if (this.pdfDocument.isPureXfa) {
- (0, _print_utils.getXfaHtmlForPrinting)(this.printContainer, this.pdfDocument);
- return Promise.resolve();
- }
-
- const pageCount = this.pagesOverview.length;
-
- const renderNextPage = (resolve, reject) => {
- this.throwIfInactive();
-
- if (++this.currentPage >= pageCount) {
- renderProgress(pageCount, pageCount, this.l10n);
- resolve();
- return;
- }
-
- const index = this.currentPage;
- renderProgress(index, pageCount, this.l10n);
- renderPage(this, this.pdfDocument, index + 1, this.pagesOverview[index], this._printResolution, this._optionalContentConfigPromise).then(this.useRenderedPage.bind(this)).then(function () {
- renderNextPage(resolve, reject);
- }, reject);
- };
-
- return new Promise(renderNextPage);
- },
-
- useRenderedPage() {
- this.throwIfInactive();
- const img = document.createElement("img");
- const scratchCanvas = this.scratchCanvas;
-
- if ("toBlob" in scratchCanvas && !_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {
- scratchCanvas.toBlob(function (blob) {
- img.src = URL.createObjectURL(blob);
- });
- } else {
- img.src = scratchCanvas.toDataURL();
- }
-
- const wrapper = document.createElement("div");
- wrapper.className = "printedPage";
- wrapper.appendChild(img);
- this.printContainer.appendChild(wrapper);
- return new Promise(function (resolve, reject) {
- img.onload = resolve;
- img.onerror = reject;
- });
- },
-
- performPrint() {
- this.throwIfInactive();
- return new Promise(resolve => {
- setTimeout(() => {
- if (!this.active) {
- resolve();
- return;
- }
-
- print.call(window);
- setTimeout(resolve, 20);
- }, 0);
- });
- },
-
- get active() {
- return this === activeService;
- },
-
- throwIfInactive() {
- if (!this.active) {
- throw new Error("This print request was cancelled or completed.");
- }
- }
-
-};
-const print = window.print;
-
-window.print = function () {
- if (activeService) {
- console.warn("Ignored window.print() because of a pending print job.");
- return;
- }
-
- ensureOverlay().then(function () {
- if (activeService) {
- overlayManager.open("printServiceOverlay");
- }
- });
-
- try {
- dispatchEvent("beforeprint");
- } finally {
- if (!activeService) {
- console.error("Expected print service to be initialized.");
- ensureOverlay().then(function () {
- if (overlayManager.active === "printServiceOverlay") {
- overlayManager.close("printServiceOverlay");
- }
- });
- return;
- }
-
- const activeServiceOnEntry = activeService;
- activeService.renderPages().then(function () {
- return activeServiceOnEntry.performPrint();
- }).catch(function () {}).then(function () {
- if (activeServiceOnEntry.active) {
- abort();
- }
- });
- }
-};
-
-function dispatchEvent(eventType) {
- const event = document.createEvent("CustomEvent");
- event.initCustomEvent(eventType, false, false, "custom");
- window.dispatchEvent(event);
-}
-
-function abort() {
- if (activeService) {
- activeService.destroy();
- dispatchEvent("afterprint");
- }
-}
-
-function renderProgress(index, total, l10n) {
- const progressContainer = document.getElementById("printServiceOverlay");
- const progress = Math.round(100 * index / total);
- const progressBar = progressContainer.querySelector("progress");
- const progressPerc = progressContainer.querySelector(".relative-progress");
- progressBar.value = progress;
- l10n.get("print_progress_percent", {
- progress
- }).then(msg => {
- progressPerc.textContent = msg;
- });
-}
-
-window.addEventListener("keydown", function (event) {
- if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {
- window.print();
- event.preventDefault();
-
- if (event.stopImmediatePropagation) {
- event.stopImmediatePropagation();
- } else {
- event.stopPropagation();
- }
- }
-}, true);
-
-if ("onbeforeprint" in window) {
- const stopPropagationIfNeeded = function (event) {
- if (event.detail !== "custom" && event.stopImmediatePropagation) {
- event.stopImmediatePropagation();
- }
- };
-
- window.addEventListener("beforeprint", stopPropagationIfNeeded);
- window.addEventListener("afterprint", stopPropagationIfNeeded);
-}
-
-let overlayPromise;
-
-function ensureOverlay() {
- if (!overlayPromise) {
- overlayManager = _app.PDFViewerApplication.overlayManager;
-
- if (!overlayManager) {
- throw new Error("The overlay manager has not yet been initialized.");
- }
-
- overlayPromise = overlayManager.register("printServiceOverlay", document.getElementById("printServiceOverlay"), abort, true);
- document.getElementById("printCancel").onclick = abort;
- }
-
- return overlayPromise;
-}
-
-_app.PDFPrintServiceFactory.instance = {
- supportsPrinting: true,
-
- createPrintService(pdfDocument, pagesOverview, printContainer, printResolution, optionalContentConfigPromise, l10n) {
- if (activeService) {
- throw new Error("The print service is created and active.");
- }
-
- activeService = new PDFPrintService(pdfDocument, pagesOverview, printContainer, printResolution, optionalContentConfigPromise, l10n);
- return activeService;
- }
-
-};
-
-/***/ }),
-/* 46 */
-/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.getXfaHtmlForPrinting = getXfaHtmlForPrinting;
-
-var _ui_utils = __webpack_require__(4);
-
-var _xfa_layer_builder = __webpack_require__(34);
-
-var _pdfjsLib = __webpack_require__(5);
-
-function getXfaHtmlForPrinting(printContainer, pdfDocument) {
- const xfaHtml = pdfDocument.allXfaHtml;
- const factory = new _xfa_layer_builder.DefaultXfaLayerFactory();
- const scale = Math.round(_ui_utils.CSS_UNITS * 100) / 100;
-
- for (const xfaPage of xfaHtml.children) {
- const page = document.createElement("div");
- page.className = "xfaPrintedPage";
- printContainer.appendChild(page);
- const builder = factory.createXfaLayerBuilder(page, null, pdfDocument.annotationStorage, xfaPage);
- const viewport = (0, _pdfjsLib.getXfaPageViewport)(xfaPage, {
- scale
- });
- builder.render(viewport, "print");
- }
-}
-
-/***/ })
-/******/ ]);
-/************************************************************************/
-/******/ // The module cache
-/******/ var __webpack_module_cache__ = {};
-/******/
-/******/ // The require function
-/******/ function __webpack_require__(moduleId) {
-/******/ // Check if module is in cache
-/******/ var cachedModule = __webpack_module_cache__[moduleId];
-/******/ if (cachedModule !== undefined) {
-/******/ return cachedModule.exports;
-/******/ }
-/******/ // Create a new module (and put it into the cache)
-/******/ var module = __webpack_module_cache__[moduleId] = {
-/******/ // no module.id needed
-/******/ // no module.loaded needed
-/******/ exports: {}
-/******/ };
-/******/
-/******/ // Execute the module function
-/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
-/******/
-/******/ // Return the exports of the module
-/******/ return module.exports;
-/******/ }
-/******/
-/************************************************************************/
-var __webpack_exports__ = {};
-// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
-(() => {
-var exports = __webpack_exports__;
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-Object.defineProperty(exports, "PDFViewerApplicationOptions", ({
- enumerable: true,
- get: function () {
- return _app_options.AppOptions;
- }
-}));
-Object.defineProperty(exports, "PDFViewerApplication", ({
- enumerable: true,
- get: function () {
- return _app.PDFViewerApplication;
- }
-}));
-
-var _app_options = __webpack_require__(1);
-
-var _app = __webpack_require__(3);
-
-const pdfjsVersion = '2.10.377';
-const pdfjsBuild = '156762c48';
-window.PDFViewerApplication = _app.PDFViewerApplication;
-window.PDFViewerApplicationOptions = _app_options.AppOptions;
-;
-;
-{
- __webpack_require__(39);
-}
-;
-{
- __webpack_require__(45);
-}
-
-function getViewerConfiguration() {
- let errorWrapper = null;
- errorWrapper = {
- container: document.getElementById("errorWrapper"),
- errorMessage: document.getElementById("errorMessage"),
- closeButton: document.getElementById("errorClose"),
- errorMoreInfo: document.getElementById("errorMoreInfo"),
- moreInfoButton: document.getElementById("errorShowMore"),
- lessInfoButton: document.getElementById("errorShowLess")
- };
- return {
- appContainer: document.body,
- mainContainer: document.getElementById("viewerContainer"),
- viewerContainer: document.getElementById("viewer"),
- eventBus: null,
- toolbar: {
- container: document.getElementById("toolbarViewer"),
- numPages: document.getElementById("numPages"),
- pageNumber: document.getElementById("pageNumber"),
- scaleSelectContainer: document.getElementById("scaleSelectContainer"),
- scaleSelect: document.getElementById("scaleSelect"),
- customScaleOption: document.getElementById("customScaleOption"),
- previous: document.getElementById("previous"),
- next: document.getElementById("next"),
- zoomIn: document.getElementById("zoomIn"),
- zoomOut: document.getElementById("zoomOut"),
- viewFind: document.getElementById("viewFind"),
- openFile: document.getElementById("openFile"),
- print: document.getElementById("print"),
- presentationModeButton: document.getElementById("presentationMode"),
- download: document.getElementById("download"),
- viewBookmark: document.getElementById("viewBookmark")
- },
- secondaryToolbar: {
- toolbar: document.getElementById("secondaryToolbar"),
- toggleButton: document.getElementById("secondaryToolbarToggle"),
- toolbarButtonContainer: document.getElementById("secondaryToolbarButtonContainer"),
- presentationModeButton: document.getElementById("secondaryPresentationMode"),
- openFileButton: document.getElementById("secondaryOpenFile"),
- printButton: document.getElementById("secondaryPrint"),
- downloadButton: document.getElementById("secondaryDownload"),
- viewBookmarkButton: document.getElementById("secondaryViewBookmark"),
- firstPageButton: document.getElementById("firstPage"),
- lastPageButton: document.getElementById("lastPage"),
- pageRotateCwButton: document.getElementById("pageRotateCw"),
- pageRotateCcwButton: document.getElementById("pageRotateCcw"),
- cursorSelectToolButton: document.getElementById("cursorSelectTool"),
- cursorHandToolButton: document.getElementById("cursorHandTool"),
- scrollVerticalButton: document.getElementById("scrollVertical"),
- scrollHorizontalButton: document.getElementById("scrollHorizontal"),
- scrollWrappedButton: document.getElementById("scrollWrapped"),
- spreadNoneButton: document.getElementById("spreadNone"),
- spreadOddButton: document.getElementById("spreadOdd"),
- spreadEvenButton: document.getElementById("spreadEven"),
- documentPropertiesButton: document.getElementById("documentProperties")
- },
- sidebar: {
- outerContainer: document.getElementById("outerContainer"),
- viewerContainer: document.getElementById("viewerContainer"),
- toggleButton: document.getElementById("sidebarToggle"),
- thumbnailButton: document.getElementById("viewThumbnail"),
- outlineButton: document.getElementById("viewOutline"),
- attachmentsButton: document.getElementById("viewAttachments"),
- layersButton: document.getElementById("viewLayers"),
- thumbnailView: document.getElementById("thumbnailView"),
- outlineView: document.getElementById("outlineView"),
- attachmentsView: document.getElementById("attachmentsView"),
- layersView: document.getElementById("layersView"),
- outlineOptionsContainer: document.getElementById("outlineOptionsContainer"),
- currentOutlineItemButton: document.getElementById("currentOutlineItem")
- },
- sidebarResizer: {
- outerContainer: document.getElementById("outerContainer"),
- resizer: document.getElementById("sidebarResizer")
- },
- findBar: {
- bar: document.getElementById("findbar"),
- toggleButton: document.getElementById("viewFind"),
- findField: document.getElementById("findInput"),
- highlightAllCheckbox: document.getElementById("findHighlightAll"),
- caseSensitiveCheckbox: document.getElementById("findMatchCase"),
- entireWordCheckbox: document.getElementById("findEntireWord"),
- findMsg: document.getElementById("findMsg"),
- findResultsCount: document.getElementById("findResultsCount"),
- findPreviousButton: document.getElementById("findPrevious"),
- findNextButton: document.getElementById("findNext")
- },
- passwordOverlay: {
- overlayName: "passwordOverlay",
- container: document.getElementById("passwordOverlay"),
- label: document.getElementById("passwordText"),
- input: document.getElementById("password"),
- submitButton: document.getElementById("passwordSubmit"),
- cancelButton: document.getElementById("passwordCancel")
- },
- documentProperties: {
- overlayName: "documentPropertiesOverlay",
- container: document.getElementById("documentPropertiesOverlay"),
- closeButton: document.getElementById("documentPropertiesClose"),
- fields: {
- fileName: document.getElementById("fileNameField"),
- fileSize: document.getElementById("fileSizeField"),
- title: document.getElementById("titleField"),
- author: document.getElementById("authorField"),
- subject: document.getElementById("subjectField"),
- keywords: document.getElementById("keywordsField"),
- creationDate: document.getElementById("creationDateField"),
- modificationDate: document.getElementById("modificationDateField"),
- creator: document.getElementById("creatorField"),
- producer: document.getElementById("producerField"),
- version: document.getElementById("versionField"),
- pageCount: document.getElementById("pageCountField"),
- pageSize: document.getElementById("pageSizeField"),
- linearized: document.getElementById("linearizedField")
- }
- },
- errorWrapper,
- printContainer: document.getElementById("printContainer"),
- openFileInputName: "fileInput",
- debuggerScriptPath: "./debugger.js"
- };
-}
-
-function webViewerLoad() {
- const config = getViewerConfiguration();
- const event = document.createEvent("CustomEvent");
- event.initCustomEvent("webviewerloaded", true, true, {
- source: window
- });
-
- try {
- parent.document.dispatchEvent(event);
- } catch (ex) {
- console.error(`webviewerloaded: ${ex}`);
- document.dispatchEvent(event);
- }
-
- _app.PDFViewerApplication.run(config);
-}
-
-if (document.blockUnblockOnload) {
- document.blockUnblockOnload(true);
-}
-
-if (document.readyState === "interactive" || document.readyState === "complete") {
- webViewerLoad();
-} else {
- document.addEventListener("DOMContentLoaded", webViewerLoad, true);
-}
-})();
-
-/******/ })()
-;
-//# sourceMappingURL=viewer.js.map
\ No newline at end of file
diff --git a/searchurl/txt/query.autoc~ b/searchurl/txt/query.autoc~
deleted file mode 100644
index 7cd5f2d7..00000000
--- a/searchurl/txt/query.autoc~
+++ /dev/null
@@ -1,4 +0,0 @@
-define
-site:
-stock
-weather
\ No newline at end of file
diff --git a/searchurl/txt/t.pdf b/searchurl/txt/t.pdf
deleted file mode 100644
index f46dbe56..00000000
Binary files a/searchurl/txt/t.pdf and /dev/null differ
diff --git a/searchurl/txt/txtview.html~ b/searchurl/txt/txtview.html~
deleted file mode 100644
index ca0d91c3..00000000
--- a/searchurl/txt/txtview.html~
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
diff --git a/searchurl/txt/viewer.html~ b/searchurl/txt/viewer.html~
deleted file mode 100644
index 503b810b..00000000
--- a/searchurl/txt/viewer.html~
+++ /dev/null
@@ -1,398 +0,0 @@
-
-
-
-
-
-
-
- PDF.js viewer
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- More Information
-
-
- Less Information
-
-
-
-
- Close
-
-
-
-
-
-
-
-
-
-
-
-
Enter the password to open this PDF file:
-
-
-
-
-
- Cancel
- OK
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Close
-
-
-
-
-
-
- Preparing document for printing…
-
-
-
- Cancel
-
-
-
-
-
-
-
-
-
diff --git a/sitemap.xml b/sitemap.xml
index 9b73b8c5..c8d33fb2 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -1,166 +1,16 @@
-
-
- https://jamesfengcao.gitee.io/uwebzh/
- 2022-06-25T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/_posts/
- 2022-06-25T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/adblock/
- 2022-06-25T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/javascript/
- 2022-06-24T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/
- 2022-06-24T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/bookmarklet/
- 2022-06-24T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/sitemap/
- 2022-05-28T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/androidtv/
- 2022-05-18T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/css/
- 2022-05-18T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/
- 2022-05-18T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/adblock_css/
- 2022-05-18T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/bookmark/
- 2022-05-18T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/links/
- 2022-05-10T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/
- 2022-04-25T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/
- 2022-04-25T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/redirect/
- 2022-04-25T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/pc/
- 2022-04-23T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/ssh/
- 2022-04-23T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/termux/
- 2022-04-23T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/windows/
- 2022-04-23T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/
- 2022-04-23T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
- 2022-04-23T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/globalcss/
- 2022-04-03T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/filenames/
- 2022-03-18T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/filemanager/
- 2022-02-11T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/bc/
- 2022-02-10T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/icons/
- 2022-02-06T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tips/
- 2021-11-01T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tcron/
- 2021-02-13T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/logcat/
- 2020-12-28T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/%E7%A6%BB%E7%BA%BF/
- 2020-12-15T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/loadbt/
- 2020-12-15T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/%E7%BD%91%E7%9B%98/
- 2020-12-15T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/%E8%B5%84%E6%BA%90/
- 2020-12-15T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/longclick/
- 2020-11-06T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/%E6%90%9C%E7%B4%A2/
- 2020-09-22T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/video/
- 2020-09-22T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/tdict/
- 2020-09-06T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/tools/
- 2020-09-06T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tools/
- 2020-09-06T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/tags/curl/
- 2020-08-24T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/filecap/
- 2020-08-24T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/html5/
- 2020-08-20T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/gesture/
- 2020-06-18T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/cmd/
- 2018-01-20T00:00:00+00:00
-
- https://jamesfengcao.gitee.io/uwebzh/categories/
-
- https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8B%E8%BD%BD/
-
- https://jamesfengcao.gitee.io/uwebzh/urls/
-
- https://jamesfengcao.gitee.io/uwebzh/searchcat/
-
- https://jamesfengcao.gitee.io/uwebzh/multiaccount/
-
- https://jamesfengcao.gitee.io/uwebzh/gnuplot/
-
- https://jamesfengcao.gitee.io/uwebzh/hosts/
-
- https://jamesfengcao.gitee.io/uwebzh/pcdown/
-
- https://jamesfengcao.gitee.io/uwebzh/sitejs/
-
- https://jamesfengcao.gitee.io/uwebzh/tags/%E7%94%B5%E8%A7%86/
-
- https://jamesfengcao.gitee.io/uwebzh/tvlive/
-
- https://jamesfengcao.gitee.io/uwebzh/adblock_domain/
-
- https://jamesfengcao.gitee.io/uwebzh/offlinecache/
-
-
+
+
+
+ en/sitemap.xml
+
+
+
+
+ zh/sitemap.xml
+
+ 2022-06-25T00:00:00+00:00
+
+
+
+
diff --git a/style.css b/style.css
deleted file mode 100644
index e514b436..00000000
--- a/style.css
+++ /dev/null
@@ -1,34 +0,0 @@
-h1{font-size:100%;}
-
-header.header{
- position: fixed;
- z-index: 2;
- top:0;
-}
-
-header.header>a.logo {
- color:inherit;
- text-decoration:inherit;
- font-size:16px;
-}
-
-ul.posts{
- list-style-type:none
-}
-
-ul.posts>li.post {
- line-height:2;
-}
-
-ul.posts>li.post>a{
- color:inherit;
- text-decoration:inherit;
-}
-
-ul.tags{
- list-style-type:none
-}
-
-ul.tags>li{
- display:inline;
-}
diff --git a/tags/PC/index.html b/tags/PC/index.html
deleted file mode 100644
index c7097164..00000000
--- a/tags/PC/index.html
+++ /dev/null
@@ -1,516 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tags/Windows/index.html b/tags/Windows/index.html
deleted file mode 100644
index c7097164..00000000
--- a/tags/Windows/index.html
+++ /dev/null
@@ -1,516 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tags/不良信息/index.html b/tags/不良信息/index.html
deleted file mode 100644
index 992dfabd..00000000
--- a/tags/不良信息/index.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
- 不良信息
-
-
-
-
-
-
-
-
-
diff --git a/tags/不良信息/index.xml b/tags/不良信息/index.xml
deleted file mode 100644
index f8b6fc25..00000000
--- a/tags/不良信息/index.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- 不良信息 on
- https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF/
- Recent content in 不良信息 on
- Hugo -- gohugo.io
- en-us
- Sun, 23 Aug 2020 00:00:00 +0000
- -
-
拦截技术总览
- https://jamesfengcao.gitee.io/uwebzh/adblock/
- Sun, 23 Aug 2020 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/adblock/
- 超微浏览器提供了多种拦截技术,善于使用的话根本无需求助于复杂的规则。
- 如果网站并非视频类小网站,长按底部工具栏[☰]按钮,选取"禁用iframe"。更多可参看自定义样式拦截。 对非复杂交互非大厂网页而言,特别是小说网站,可以长按设置,选取"拦截外链脚本"。 全屏无干扰播放。 长按[☰]按钮可拦截浮动信息。 双正则表达式hosts文件。 针对特定网站的脚本样式。 对非图片为主的网站可直接关闭图像。 对非交互性网站,可关闭[JS]脚本。
-
-
-
-
diff --git a/tags/广告屏蔽/index.html b/tags/广告屏蔽/index.html
deleted file mode 100644
index af0c8420..00000000
--- a/tags/广告屏蔽/index.html
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
-
-
- 广告屏蔽
-
-
-
-
-
-
-
-
-
diff --git a/tags/广告屏蔽/index.xml b/tags/广告屏蔽/index.xml
deleted file mode 100644
index d3d85116..00000000
--- a/tags/广告屏蔽/index.xml
+++ /dev/null
@@ -1,115 +0,0 @@
-
-
-
- 广告屏蔽 on
- https://jamesfengcao.gitee.io/uwebzh/tags/%E5%B9%BF%E5%91%8A%E5%B1%8F%E8%94%BD/
- Recent content in 广告屏蔽 on
- Hugo -- gohugo.io
- en-us
- Tue, 22 Sep 2020 00:00:00 +0000
- -
-
视频播放小窍门
- https://jamesfengcao.gitee.io/uwebzh/video/
- Tue, 22 Sep 2020 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/video/
- 本文以超微浏览器为例来说明。
-点击安装"视频播放增强(倍速等)"
- 长按设置按钮勾选“弹出视频地址”,则视频播放时会弹出真正的播放地址,点击地址播放可避免一切广告。如果点击后为下载操作,可长按链接分享给视频播放器。用户亦可配置在线播放或安装插件。嗅探的视频/资源类型可由文件“/sdcard/uweb/types.sniff”控制。 很多视频解析结果在UA为PC的情况下非常干净,没什么广告。故用户可在播放前切换UA至PC。如:wn.run/解析结果对PC非常干净。 某些视频网站在全屏播放时都会出现广告占住屏幕一部分。点击全屏播放之前,长按[☰]按钮,超微浏览器将弹出全局脚本菜单,勾选“移除浮动广告”后再点全屏播放则完美播放。 也可利用全屏播放屏蔽一切广告。方法如下: 长按[☰]按钮,勾选“全屏视频”。此选项将让无法全屏播放的网站强制允许全屏播放。 对无法全屏、无法放大的视频网站,可长按[☰]按钮,勾选“强制缩放”,然后手动放大至全屏。 灵活应用JS、图像开关屏蔽一切广告:视频搜索前关闭JS开关,进入播放网页前关闭图像显示并打开JS。 视频解析之电视剧: 首先在视频网站搜索电视剧片名,下面会显示不同的剧集,点击它们再用视频解析即可观看。如果直接点击电视剧用视频解析则每次播放均为第一集。 视频搜索预配置(超过400个引擎)
-视频资源:
- 视频解析配置 ddrk nfmovies 电视直播 OK资源 全国电视直播 免费视频 国外剧 纪录片 网络直播
-
-
- -
-
广告屏蔽技术总览
- https://jamesfengcao.gitee.io/uwebzh/adblock/
- Sun, 23 Aug 2020 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/adblock/
- 超微浏览器提供了形形色色的广告屏蔽技术,善于使用的话根本无需求助于复杂的屏蔽规则。
- 如果网站并非视频类小网站,长按底部工具栏[☰]按钮,选取"禁用iframe",此法可屏蔽大多数广告。更多可参看自定义样式屏蔽广告。 对非复杂交互非国内广告大厂网页而言(譬如云盘管理属复杂交互),特别是小说网站,可以长按设置,选取"屏蔽外链脚本"。(内在逻辑:小网站一般无力开发完整的广告系统,它们经常使用大厂的广告脚本。) 利用视频全屏播放屏蔽一切广告。 长按[☰]按钮可屏蔽浮动广告。 双正则表达式hosts文件绝杀广告。 针对特定网站的脚本样式屏蔽广告。 对非图片为主的网站可直接关闭图像。 对非交互性网站,可关闭[JS]脚本。
-
-
- -
-
利用用户自定义样式屏蔽广告
- https://jamesfengcao.gitee.io/uwebzh/adblock_css/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/adblock_css/
- 超微浏览器支持超级hosts文件,这一技术可以完全绝杀手机广告小厂。但少部分广告大厂本身也提供高质量的内容服务,它们可以将广告伪装成正常的内容从而逃脱hosts文件绝杀。
-对这一部分广告而言,我们可以利用超微浏览器的自定义样式功能加以屏蔽。
-下载下面文件(可改名成“广告屏蔽.css”),将其放到/scard/uweb/css目录下:
-广告屏蔽css文件
-重启浏览器,长按底部工具条[☰]按钮弹出对话框后勾选上述文件名即可屏蔽广告。
-
-
- -
-
利用超级hosts文件加速访问国外网站
- https://jamesfengcao.gitee.io/uwebzh/hosts/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/hosts/
- 不少国外网站本身虽可访问,但由于网站需要下载google,
-facebook等屏蔽网址的资源而导致无法访问。超级hosts文件可屏蔽文件中域名的一切子域名、孙域名、......,从而主动屏蔽这些网址,最终允许浏览器快速访问合法网站。
-使用Android端uweb浏览器。
-/sdcard/uweb/default.hosts内容如下:
-googleadservices.com
-googlesyndication.com
-adsense.com
-google.com
-google-analytics.com
-googletagservices.com
-twitter.com
-facebook.com
-fbcdn.net
-其它国外网址访问技巧:
- 尝试关闭javascript, 譬如程序员网站stackoverflow.com在关闭javascript的情况下国内一般均可快速访问。 关闭网页图片
-
-
- -
-
利用超级hosts绝杀广告
- https://jamesfengcao.gitee.io/uwebzh/adblock_hosts/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/adblock_hosts/
- 超级hosts文件可屏蔽文件中域名的一切子域名、孙域名、......,可彻底绝杀一切广告。所以用户屏蔽根域名时无需选择提示中出现的整个域名,只需选取最后两段或三段(少数很短的域名可取四段)。
- 长按广告链接,点击“图片:屏蔽根域名”,修改弹出域名,一般取最后两段,点击"确定"屏蔽当前图片网址。
- 部分广告没有链接可长按,或虽有链接但长按时不出现图片相关菜单。此时可长按[JS]点击"背景图片"或"看图模式",再长按广告链接点击“图片:屏蔽根域名”,屏蔽图片网址。
- 可长按设置开启"资源嗅探",推荐设置文件"/sdcard/uweb/types.sniff"内容为js,刷新网页后关闭"资源嗅探"选项。在弹出的资源网页上长按链接,屏蔽根域名。
- (可选) 长按广告链接,点击“屏蔽根域名”,屏蔽链接网址。
- (可选) 某些广告靠javascript激发,链接中不出现域名,可点击激发至新网址后将新网址根域名屏蔽。
- 超级hosts文件支持域名及整个网址正则表达式
-default.hosts文件格式每行如下:
-根域名[空格]域名前缀正则表达式[空格]网址路径正则表达式
-空格及后面两个正则表达式为可选择项。正则表达式采用java标准。
- 部分国内大厂广告 (将下列内容放入/sdcard/uweb/default.hosts,点击本链接自动用以下内容覆盖default.hosts):
-lianmeng.360.cn
-appjiagu.com
-adm-cnzz.net
-alimama.com
-ipinyou.com
-mct01.com
-tanx.com
-wrating.com
-cpro.baidu.com
-pos.baidu.com
-share.baidu.com
-e.qq.com
-gdt.qq.com
-l.qq.com
-push.qq.com
-beacon.sina.com.cn
-mix.sina.com.cn
-go.sohu.com
-inte.sogou.com
-epro.sogou.com
-golden1.sogou.com
-uranus.sogou.com
-inte.sogoucdn.com
-lu.sogoucdn.com
-theta.sogoucdn.com
-ad.xiaomi.com
-
-
-
-
diff --git a/uweb/index.html b/uweb/index.html
deleted file mode 100644
index 908e99e4..00000000
--- a/uweb/index.html
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/uweb/style.css b/uweb/style.css
deleted file mode 100644
index e514b436..00000000
--- a/uweb/style.css
+++ /dev/null
@@ -1,34 +0,0 @@
-h1{font-size:100%;}
-
-header.header{
- position: fixed;
- z-index: 2;
- top:0;
-}
-
-header.header>a.logo {
- color:inherit;
- text-decoration:inherit;
- font-size:16px;
-}
-
-ul.posts{
- list-style-type:none
-}
-
-ul.posts>li.post {
- line-height:2;
-}
-
-ul.posts>li.post>a{
- color:inherit;
- text-decoration:inherit;
-}
-
-ul.tags{
- list-style-type:none
-}
-
-ul.tags>li{
- display:inline;
-}
diff --git a/uweb/tags/index.html b/uweb/tags/index.html
deleted file mode 100644
index 99996202..00000000
--- a/uweb/tags/index.html
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/zh/_posts/index.html b/zh/_posts/index.html
new file mode 100644
index 00000000..fc620d7d
--- /dev/null
+++ b/zh/_posts/index.html
@@ -0,0 +1,8 @@
+
+
+
+
+
+
diff --git a/_posts/index.xml b/zh/_posts/index.xml
similarity index 92%
rename from _posts/index.xml
rename to zh/_posts/index.xml
index e34d35af..be1be77a 100644
--- a/_posts/index.xml
+++ b/zh/_posts/index.xml
@@ -2,21 +2,20 @@
_posts on
- https://jamesfengcao.gitee.io/uwebzh/_posts/
+ /zh/_posts/
Recent content in _posts on
Hugo -- gohugo.io
- en-us
- Sat, 25 Jun 2022 00:00:00 +0000
+ Sat, 25 Jun 2022 00:00:00 +0000
-
信息隐藏技术总览
- https://jamesfengcao.gitee.io/uwebzh/adblock/
+ /zh/adblock/
Sat, 25 Jun 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/adblock/
+ /zh/adblock/
总体来说,分为手动控制和针对特定网站的规则两大类办法。手动控制可以保存为网站配置从而自动化。
双正则表达式根域名隐藏。
-可使用列出外部脚本小书签生成外部js文件列表,然后长按底部工具栏"js"按钮,执行"网址转链接"菜单命令,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。 针对特定网站的脚本样式。
-长按底部工具栏"js"按钮,执行"标记不良元素"菜单命令,点击页面元素会弹出对话框显示元素及祖先所有属性,并生成css屏蔽代码。默认使用“display:none”屏蔽,但如果上述显示属性中出现过"display"。则建议使用"transform:scale(0)!important"屏蔽。 长按底部工具栏窗口管理按钮,选取"仅显示图片"或"仅显示视频",图片视频网站彻底干净。选取"禁用伪元素","禁用iframe"。更多可参看自定义样式。
+可使用列出外部脚本小书签生成外部js文件列表,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。 针对特定网站的脚本样式。
+长按底部工具栏"js"按钮,执行"标记不良元素"菜单命令,点击页面元素会弹出对话框显示元素及祖先所有属性,并生成css屏蔽代码。默认使用“display:none”屏蔽,但如果上述显示属性中出现过"display",则建议使用"transform:scale(0)!important"屏蔽。 长按底部工具栏窗口管理按钮,选取"仅显示图片"或"仅显示视频",图片视频网站彻底干净。选取"禁用伪元素","禁用iframe"。更多可参看自定义样式。
保存书签时可在网址前面添加"i:0mc32:",则整个网址树自动采用"仅显示图片"。没有任何不良信息。改为"c16"则为"仅显示视频"。"c12"则同时采用"禁用伪元素","禁用iframe"。 长按[☰]按钮"自动全屏播放",直接全屏无干扰播放。不良信息没有任何机会出现。不使用全局脚本“自动全屏播放”的情况下,还可以有以下几种方法:
使用常用服务自动全屏播放菜单(长按视频链接->命令),则页面视频会自动全屏播放。按设置按钮,如果勾选“允许自动播放”,则今后此窗口内其它任何视频网址都将会自动全屏无干扰播放。保存书签时可在网址前面添加"i:5f"。 保存书签时可在网址前面添加"i:0mi:5f:",则整个网址树自动全屏播放。 长按设置,选取"拦截外链脚本"。可在界面配置及杂项网页额外拦截第三方可疑资源。可配置白名单js.allow。
长按[☰]按钮可隐藏浮动信息,移除横幅,清空定时器(防止定时触发不良信息),中断可疑事件(防止用户操作触发),等待(防止延迟触发)。
@@ -27,10 +26,10 @@ url.deny。需要屏蔽的url正则表达式(java语法),忽视回车,
-
小书签
- https://jamesfengcao.gitee.io/uwebzh/bookmarklet/
+ /zh/bookmarklet/
Fri, 24 Jun 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/bookmarklet/
+ /zh/bookmarklet/
超微浏览器支持直接运行远程网址上的小书签(Bookmarklet),将本页面或其它包含小书签网址加入书签。使用时只需长按小书签链接,点击“新窗口打开”,小书签将作用于超微浏览器最后一个窗口(非小书签窗口)页面上。
列出外部脚本
查看浏览器UA
@@ -55,19 +54,19 @@ BugMeNot
-
技巧网站导航
- https://jamesfengcao.gitee.io/uwebzh/sitemap/
+ /zh/sitemap/
Sat, 28 May 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/sitemap/
+ /zh/sitemap/
界面配置 搜索引擎 主页 快速访问 界面配置及杂项 (gitee镜像) 备份与恢复 个性化 工具条按钮长按菜单 浏览器标识 js脚本 常用服务 常用链接 常用命令 远程脚本 选中文本类菜单 长按链接弹出菜单 底部工具条定制 手势 高级个性化定制 高级设置 内容类 信息隐藏 CSS样式 重定向 特定网址用户脚本及样式 网站离线资源 工具应用类 小书签 文件预处理 html5应用 文件管理器 工具汇总 终端应用及Termux 超级计算器 函数作图 定时脚本 离线下载 输入法辅助 部件检索 综合 配置文件列表 插件 使用技巧 使用技巧 视频 安卓系统出错诊断
-
Android TV
- https://jamesfengcao.gitee.io/uwebzh/androidtv/
+ /zh/androidtv/
Wed, 18 May 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/androidtv/
+ /zh/androidtv/
TV端推荐打开自动播放选项,全局脚本打开自动全屏播放,全局样式打开“仅显示图片“,禁止js confirm对话框。
点击以下链接可直接设置主屏为书签并添加链接。Android TV可从手机端接收视频url并打开,发送见常用服务:
等待从网络接收url并打开
@@ -78,25 +77,12 @@ BugMeNot
Android TV可利用顺序搜索使用箭头按钮切换频道。顺序搜索引擎文件engine.search中的搜索引擎url如果不包含'%s',则搜索引擎只是简单的固定网页url,此时顺序搜索表现为频道切换。更多信息见多引擎搜索页面。
- -
-
利用用户自定义样式屏蔽不良信息
- https://jamesfengcao.gitee.io/uwebzh/adblock_css/
- Wed, 18 May 2022 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/adblock_css/
- 点击以下链接可安装全局样式,清后台重启浏览器,长按底部工具条窗口按钮弹出对话框后勾选上述文件名即可屏蔽不良信息。
-floppymoose 广告屏蔽样式
-gozer 广告屏蔽样式
-超微浏览器支持根域名屏蔽,完全绝杀手机不良信息小厂。但少部分不良信息大厂本身也提供高质量的内容服务,它们可以将不良信息伪装成正常的内容从而逃脱域名绝杀。
-对这一部分不良信息而言,我们可以利用超微浏览器的自定义样式功能加以屏蔽。
-
-
-
常用书签
- https://jamesfengcao.gitee.io/uwebzh/bookmark/
+ /zh/bookmark/
Wed, 18 May 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/bookmark/
+ /zh/bookmark/
gamezop
点击以下链接可安装模板至分类书签目录。保存至“小说”类别的网站会自动使用阅读模式。
"小说.html": 自动使用阅读模式
@@ -115,12 +101,25 @@ wikipedia search gopher
reddit gopher
+ -
+
利用用户自定义样式屏蔽不良信息
+ /zh/adblock_css/
+ Wed, 18 May 2022 00:00:00 +0000
+
+ /zh/adblock_css/
+ 点击以下链接可安装全局样式,清后台重启浏览器,长按底部工具条窗口按钮弹出对话框后勾选上述文件名即可屏蔽不良信息。
+floppymoose 广告屏蔽样式
+gozer 广告屏蔽样式
+超微浏览器支持根域名屏蔽,完全绝杀手机不良信息小厂。但少部分不良信息大厂本身也提供高质量的内容服务,它们可以将不良信息伪装成正常的内容从而逃脱域名绝杀。
+对这一部分不良信息而言,我们可以利用超微浏览器的自定义样式功能加以屏蔽。
+
+
-
常用链接
- https://jamesfengcao.gitee.io/uwebzh/links/
+ /zh/links/
Tue, 10 May 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/links/
+ /zh/links/
点击以下链接可安装至常用链接
显示网站安全证书
迅雷盘离线
@@ -178,10 +177,10 @@ i:1c
-
重定向国外网址至国内镜像(附编辑本地文件)
- https://jamesfengcao.gitee.io/uwebzh/redirect/
+ /zh/redirect/
Mon, 25 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/redirect/
+ /zh/redirect/
github mirror:fastgit
github mirror 2
github mirror 3
@@ -222,10 +221,10 @@ item.gome.com.cn::item.gomevvv.com.cn
-
操作选中(富)文本/元素
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
+ /zh/pccopy/
Sat, 23 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
+ /zh/pccopy/
点击以下链接可安装长按“链接”按钮菜单:
google划词翻译
bing翻译
@@ -266,10 +265,10 @@ pclip
-
CSS样式
- https://jamesfengcao.gitee.io/uwebzh/globalcss/
+ /zh/globalcss/
Sun, 03 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/globalcss/
+ /zh/globalcss/
超微浏览器自动装载"/sdcard/uweb/css"目录下所有.css文件作为全局样式供用户选用。点击以下配置链接可自动添加为全局样式:
强制使用默认字体
配合透明状态栏(沉浸)
@@ -280,10 +279,10 @@ webview 80- 夜间模式
-
超微浏览器配置文件列表
- https://jamesfengcao.gitee.io/uwebzh/filenames/
+ /zh/filenames/
Fri, 18 Mar 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/filenames/
+ /zh/filenames/
下面列表中以"/"结尾者为目录,其余为文件。如果用户勾选“使用内部目录配置”,"sitejs/","sitecache/"等位于应用内部保护目录下。否则以下所有文件/目录均位于"/sdcard/uweb":
"css/":全局样式目录
"js/": 全局脚本目录
@@ -340,10 +339,10 @@ webview 80- 夜间模式
-
文件管理器及文件挑选并批量处理
- https://jamesfengcao.gitee.io/uwebzh/filemanager/
+ /zh/filemanager/
Fri, 11 Feb 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/filemanager/
+ /zh/filemanager/
超微浏览器访问以"/"结尾 (包括"/?"及后面参数)的"file://" url,则进入文件管理器。
对任何目录型(以“/”结尾)文件url,后面可附"?[文件前缀][*[文件后缀]]"。譬如"file:///sdcard/?*.png"会列举出"/sdcard"目录下所有.png文件。"?IMG"列举出所有IMG开头的文件。此时可选定文件,并安装checked.js对选取文件进行批量处理。
文件批量处理配置default.select例子:
@@ -352,10 +351,10 @@ webview 80- 夜间模式
-
超级计算器(bc)
- https://jamesfengcao.gitee.io/uwebzh/bc/
+ /zh/bc/
Thu, 10 Feb 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/bc/
+ /zh/bc/
使用uweb浏览器。
Gnu bc计算器支持无限精度,可扩展函数库、常数库。
安装bc (Android11+无需安装) 安装uweb定制Termux应用 Termux下运行以下命令:
@@ -376,10 +375,10 @@ http://www.numbertheory.org/gnubc/gnubc.html
-
工具栏定制
- https://jamesfengcao.gitee.io/uwebzh/icons/
+ /zh/icons/
Sun, 06 Feb 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/icons/
+ /zh/icons/
超微浏览器配置目录下如果存在目录"icon",则此目录下的文件名为"0","1","2"...
会作为底部工具栏图标。文件"0"替换原后退按钮,"1"为前进按钮,"2"为设置按钮,"3"为主页按钮......。
如果定义有新按钮(当前版本存在文件"20"),则uweb支持向量格式图标VectorDrawable,格式为compiled XML。此时所有图标文件必须都是compiled XML格式,或都是普通的图像格式(png,jpg,gif等)。用户可将VectorDrawable XML文件放到安卓项目目录assets下面,重新生成apk文件以后将apk文件解压即可得compiled XML格式图标文件。
@@ -389,10 +388,10 @@ http://www.numbertheory.org/gnubc/gnubc.html
-
小技巧
- https://jamesfengcao.gitee.io/uwebzh/tips/
+ /zh/tips/
Mon, 01 Nov 2021 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tips/
+ /zh/tips/
准确显示一切PC网页:
PC模式 + 勾选选项"宽屏显示" + 全局脚本"强制缩放"。
多主屏:
@@ -410,10 +409,10 @@ UA为非默认时,点击PC按钮将恢复UA为默认,同时触发不保存UA
-
定时脚本
- https://jamesfengcao.gitee.io/uwebzh/tcron/
+ /zh/tcron/
Sat, 13 Feb 2021 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tcron/
+ /zh/tcron/
如果勾选“文件预处理”,则uweb启动时运行"default.rc" shell脚本。可与tcron定时管
理工具(安装tcron)配合运行定时任务,如存储清理、网页签到等。
勾选“文件预处理”的情况下,如果存在文件"default.rc2",则在超微浏览器成为前台时,此文件代码被执行。在超微永不退出的情况下,"default.rc"将没有任何执行机会,而"default.rc2"保证即使超微长时间不重启,定时脚本仍可以执行。
@@ -446,10 +445,10 @@ crontab例子内容如下:
-
安卓系统出错诊断
- https://jamesfengcao.gitee.io/uwebzh/logcat/
+ /zh/logcat/
Mon, 28 Dec 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/logcat/
+ /zh/logcat/
超微浏览器如果闪退,会生成出错文件"/sdcard/uweb/error.log"。
如果超微或安卓系统或任何应用出现问题,则可利用超微浏览器进行诊断,方法如下:
访问常用命令网页,点击安装logcat相关的两个命令。 清空后台并重启超微浏览器。 长按历史按钮,执行命令"清空logcat"。 触发有问题的功能。 长按历史按钮,执行命令"输出logcat.log". 检查文件"/sdcard/uweb/logcat.log"内容。 超微浏览器是手机上调试javascript脚本的最佳工具,无需打包就可有多种方式运行javascript代码。webview dev版自带devtools,运行此工具,打开flag "webview-log-js-console-messages"以后所有js出错信息及console输出会被复制到logcat中。然后用户可根据上一段所述方法诊断。
@@ -460,10 +459,10 @@ devtools for com.android.webview
-
离线下载
- https://jamesfengcao.gitee.io/uwebzh/loadbt/
+ /zh/loadbt/
Tue, 15 Dec 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/loadbt/
+ /zh/loadbt/
seedr用户可使用常用链接利用seedr离线下载。使用时长按链接->命令->seedr离线...。 Telegram用户可使用特色服务利用tg bot离线下载至bot支持网盘。使用时长按链接->命令->tg...。 百度网盘存储空间大,但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。
本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。
超微浏览器上配置百度离线下载
@@ -484,10 +483,10 @@ BaiduPCS-Go config set -appid=266719
-
长按链接弹出菜单
- https://jamesfengcao.gitee.io/uwebzh/longclick/
+ /zh/longclick/
Fri, 06 Nov 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/longclick/
+ /zh/longclick/
长按链接运行第三方程序 配置文件/sdcard/uweb/default.longclick每行格式如下(同default.cmds)
菜单名:mimetype:命令路径
命令可以包含%c(当前网址cookie)等,执行时会被相应内容自动替换。
@@ -498,10 +497,10 @@ js文件格式如下:
-
视频播放小窍门
- https://jamesfengcao.gitee.io/uwebzh/video/
+ /zh/video/
Tue, 22 Sep 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/video/
+ /zh/video/
覆盖安装全屏播放菜单示例:屏幕旋转,退出
本文以超微浏览器为例来说明。
创建文件"default.playrate"可定制全屏倍速播放菜单项,格式与文件default.link完全相同。倍速播放菜单链接部分为空,譬如".5x:",倍速菜单至少有一个。链接部分非空的菜单必须在所有倍速菜单之后。 长按设置按钮勾选“弹出视频地址”,则视频播放时会弹出真正的播放地址,点击地址播放可避免一切不良信息。如果点击后为下载操作,可长按链接分享给视频播放器。用户亦可配置在线播放或安装插件。嗅探的视频/资源类型可由文件“/sdcard/uweb/types.sniff”控制。 很多视频解析结果在UA为PC的情况下非常干净,没什么不良信息。故用户可在播放前切换UA至PC。如:wn.run/解析结果对PC非常干净。 某些视频网站在全屏播放时都会出现不良信息占住屏幕一部分。点击全屏播放之前,长按[☰]按钮,超微浏览器将弹出全局脚本菜单,勾选“移除浮动不良信息”后再点全屏播放则完美播放。 也可利用全屏播放屏蔽一切不良信息。方法如下: 长按[☰]按钮,勾选“全屏视频”。此选项将让无法全屏播放的网站强制允许全屏播放。 对无法全屏、无法放大的视频网站,可长按[☰]按钮,勾选“强制缩放”,然后手动放大至全屏。 灵活应用JS、图像开关屏蔽一切不良信息:视频搜索前关闭JS开关,进入播放网页前关闭图像显示并打开JS。 视频解析之电视剧: 首先在视频网站搜索电视剧片名,下面会显示不同的剧集,点击它们再用视频解析即可观看。如果直接点击电视剧用视频解析则每次播放均为第一集。 视频搜索预配置(超过400个引擎)
@@ -511,10 +510,10 @@ js文件格式如下:
-
工具汇总
- https://jamesfengcao.gitee.io/uwebzh/tools/
+ /zh/tools/
Sun, 06 Sep 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tools/
+ /zh/tools/
安装tdict检索工具 (本地检索,远程内容) 安装完tdict本地检索工具后,可选择性安装字典索引及对应的搜索引擎至主屏。以下引擎仅作测试使用。
安装双解字典索引
安装双解字典至主屏
@@ -545,10 +544,10 @@ Merriam Webster Unabridged
-
利用文件预处理预览/查看/播放一切可下载资源
- https://jamesfengcao.gitee.io/uwebzh/filecap/
+ /zh/filecap/
Mon, 24 Aug 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/filecap/
+ /zh/filecap/
技巧等级:中级
文件预处理配置文件为/sdcard/uweb/default.filecap,每行格式如下:
[文件后缀]:[mimetype]:[处理命令]
@@ -565,10 +564,10 @@ pdf:uweb:echo file:///sdcard/uweb/app/pdf.js/web/viewer.html?file=%u djvu:uweb:e
-
html5应用
- https://jamesfengcao.gitee.io/uwebzh/html5/
+ /zh/html5/
Thu, 20 Aug 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/html5/
+ /zh/html5/
点击安装超大文件阅读器(支持txt, html, markdown)
点击安装超大文件阅读器(markdeep版, latex, diagram,graphviz等)
点击安装plyr视频播放器
@@ -604,10 +603,10 @@ MoePlayer/APlayer : music player
-
手势
- https://jamesfengcao.gitee.io/uwebzh/gesture/
+ /zh/gesture/
Thu, 18 Jun 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/gesture/
+ /zh/gesture/
顶部下拉弹出地址栏; 顶部上划隐藏地址栏。底部下划隐藏工具条; 底部左右角落划动弹出工具条。
紧靠工具条左右划动切换当前窗口; 左右大幅度划动切换到第一或最后一个窗口。
起点终点紧靠地址栏划动操作调用"default.gesture"文件中对应链接。文件格式与文件default.link完全相同。每行第一部分为助记名,第二部分为链接。手势操作对应方式如下:
@@ -621,10 +620,10 @@ back2:javascript:history.go(-2)
-
一键执行任意预定义命令(附手机PC剪贴板互通)
- https://jamesfengcao.gitee.io/uwebzh/cmd/
+ /zh/cmd/
Sat, 20 Jan 2018 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/cmd/
+ /zh/cmd/
技巧等级:中级 PC剪贴板(高级)
uweb浏览器支持一键执行任意预定义命令,这些命令可以与剪贴板交互,可以将结果(文本、图像、音视频)输出到浏览器窗口。
手机推荐安装uweb定制Termux,否则能够执行的命令极其有限。
@@ -644,128 +643,19 @@ mimetype用来表示命令的输出类型。除了标准的mimetype之外,超
-
便利链接
- https://jamesfengcao.gitee.io/uwebzh/urls/
+ /zh/urls/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/urls/
+ /zh/urls/
Termux内部目录
- -
-
分类多引擎搜索
- https://jamesfengcao.gitee.io/uwebzh/searchcat/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/searchcat/
- 点击本链接自动安装分类多引擎文件至"/sdcard/uweb/bookmark"目录下。
-超微浏览器中通过“设置”->“总目录”->“↑”->“Download”,点击后缀为.search的下载文件,超微浏览器将自动显示分类多引擎搜索。此时可按菜单键(或长按底部工具条后退按钮)选择“添加到桌面”方便以后访问。
-.search文件每行格式为如下几种:
-[搜索引擎名]:[不含%s的url]
-[搜索引擎名]:[含%s的url]
-[搜索引擎名]:POST:[含%s的post参数]:[url]
-.search文件首行必须为第一种类型的搜索引擎。由于其它两种类型的引擎数量稀少,为性能考虑,超微限制了首个引擎的种类。
-本地引擎 搜索引擎已经支持命令行url,现在可添加离线字典查询至主页。命令行url格式为
-c:[含%s的命令行]
-d:mimetype:[含%s的命令行]:[外部资源url]
-查询时关键词会自动替换命令行中的%s。
-笔者用来查询各式词典,发现效果非常好。百兆以内的文本文件压缩以后可以直接快速检索,定位至特定位置以后可上下滚动阅读全部文本。
-
-
- -
-
利用多账号登录获取资源
- https://jamesfengcao.gitee.io/uwebzh/multiaccount/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/multiaccount/
- 谈到资源就离不开bt, bt下载费时费力,离线bt是最佳选择。国内离线下载由于关键节点屏蔽,基本没啥用。我的个人体验是彻彻底底完全没用,但别人也许还有点用?国外唯一一个有好体验的是seedr, 不过seedr有个大问题需要解决。
-其它我曾推荐过的台湾bt, bug实在太多,现在看来也成了半个垃圾。万般无奈之下只能重拾seedr.
-seedr的问题是首次登录需要google人机验证,登录成功以后可以永久使用,无需小飞机辅助。
-以前偶尔飞飞一点问题也没有,毕竟1分钟飞行就可解决很长时间问题了。但目前的状态是信息基本被彻底封死,1分钟飞行也成了奢望。所以十分有必要珍惜这来之不易的1分钟飞行成果。
-现在直接上方案,使用超微浏览器多账号登录。飞行1分钟以后成功登录seedr, 此时退出浏览器,千万不能强退,一定要让运存中的登录信息写到内部存储。然后用户可备份应用内部目录下的.cjar文件,一旦浏览器失去登录状态,可恢复此文件,即可使用多账号登录重新登录,让这1分钟飞行成果保存下来,供万万年使用。需要注意的一点是:用户退出seedr账号会使保存的文件作废。故千万不要退出账号,需要用其它账号登录的请使用多账号登录。
-
-
- -
-
利用浏览器地址栏对函数作图
- https://jamesfengcao.gitee.io/uwebzh/gnuplot/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/gnuplot/
- 使用Android端uweb浏览器。
-Termux提供了方便的软件包管理系统,缺省的uWeb地址栏功能配置需用到作图软件gnuplot。
-安装gnuplot 安装 uweb定制Termux应用 Termux下运行以下命令:
-apt update
-apt upgrade
-apt install gnuplot 地址栏功能配置: 配置文件/sdcard/uweb/default.acmd每行格式如下:
-菜单名:mimeType:命令行 命令行可包含参数%s,运行时自动用地址栏输入内容替换。 如果浏览器窗口当前地址为本地url,则此目录同时作为命令行工作目录。 配置文件/sdcard/uweb/default.acmd如下: 命令:text/plain:%s 函数作图:image/svg+xml:gnuplot -e 'set term svg;set output; plot %s' 函数作图(3d):image/svg+xml:gnuplot -e 'set term svg;set output; splot %s' 超级计算器:text/html:echo "%s"|bc -l -q 长按uweb浏览器底部工具条刷新按钮弹出地址栏功能选择,选择“函数作图”,地址栏内输入函数如sin(x)**5就可显示函数图案。
-常见问题及诊断 确保gnuplot正确安装,在Termux提示符下,敲入gnuplot,然后回车,保证出现"gnuplot>"。 确保gnuplot正常运行, 在Termux提示符下,执行下面命令:
-gnuplot -e 'set term svg;set output; plot x'
-屏幕输出应该为正常的svg文件(类似html文本)。 Termux应为uweb定制包,否则有一堆设定需要修改。 超微浏览器下长按设置按钮,勾选“标准错误输出”。再次在地址栏执行画图操作,此时浏览器会显示出错信息。 为保证地址栏输入函数符合gnuplot规范,首个测试函数建议为"x",即整个地址栏内输入为"x"。
-
-
- -
-
加速访问国外网站
- https://jamesfengcao.gitee.io/uwebzh/hosts/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/hosts/
- 不少国外网站本身虽可访问,但由于网站需要下载其它网址的资源而导致无法访问。根域名屏蔽可屏蔽文件中域名的一切子域名、孙域名、......,从而主动排除这些网址,最终允许浏览器快速访问。
-使用Android端uweb浏览器。
-域名文件内容如下:
-googleadservices.com
-googlesyndication.com
-adsense.com
-googleapis.com
-google-analytics.com
-googletagservices.com
-twitter.com
-facebook.com
-fbcdn.net
-其它国外网址访问技巧:
-尝试关闭javascript, 譬如程序员网站stackoverflow.com在关闭javascript的情况下国内一般均可快速访问。 关闭网页图片
-
-
- -
-
浏览器一键控制台式机/服务器下载资源
- https://jamesfengcao.gitee.io/uwebzh/pcdown/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/pcdown/
- 技巧等级:高级
-小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法:
-手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令:
-apt update
-apt upgrade
-apt install openssl
-脚本pcdownload内容如下(可放置在任意应用内部目录下,并相应修改default.longclick配置中文件路径):
-#!/data/data/com.termux/files/usr/bin/sh
-ssh [user:password]@192.168.2.102 "DISPLAY=:0 firefox \"$1\""
-脚本需设置为可执行,Termux下执行命令:
-chmod 755 /data/data/com.termux/files/usr/bin/pcdownload
-这里假定用户已经在台式机上设好ssh服务,台式机IP地址为192.168.2.102,准备用firefox下载。如果下载工具不是图形程序,则上述脚本中可删去“DISPLAY=:0”。
-配置文件/sdcard/uweb/default.longclick如下:
-PCdown:/data/data/com.termux/files/usr/bin/pcdownload
-重启超微浏览器,点击链接下载时会弹出菜单,选择"PCdown",台式机会启动firefox下载手机指定文档。
-可能大家有疑问,台式机无法登录,为什么手机可以登录?这是因为手机上应用多哈。
-
-
- -
-
特定网址用户脚本及样式
- https://jamesfengcao.gitee.io/uwebzh/sitejs/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/sitejs/
- 技巧等级:中级
-脚本 (第一时间装载js脚本见下面sitecss条目)
-脚本需命名为 "[根域名].js",譬如baidu.com.js 或tieba.baidu.com.js 。此脚本将自动作用于所有相同根域名的网址上。如有多个脚本满足条件,以最长文件名为准。 这些脚本需放到/sdcard/uweb/sitejs或/data/data/info.torapp.uweb/files/sitejs目录下,数量没有限制,上百万都不成问题。如果内部目录下sitejs存在,则/sdcard/uweb/sitejs不起任何作用。内部sitejs目录的存在同时也影响一切对安全敏感的资源(包括网站离线资源等)的配置,一旦内部sitejs目录存在,则这些资源必须位于内部目录才会生效。 长按窗口按钮,勾选“执行网址用户脚本”。 脚本执行对浏览器无性能影响,即使有百万脚本存在。 目前支持两段、三段及少数四段域名(最后两段不超过6字如com.cn的域名可取四段)。所以脚本请不要以很长的域名来命名。 样式及第一时间装载js脚本
-与此类似,用户样式需命名为 "[根域名].css",譬如baidu.com.css 或tieba.baidu.com.css。 样式文件需放到/sdcard/uweb/sitecss目录下。 sitecss目录下"[根域名].js"文件会在第一时间装载。 长按窗口按钮,勾选“使用网址用户样式”。 如果文件“/sdcard/uweb/default.css”存在,访问网址时如果没有与域名匹配的css文件,则使用此默认样式文件。 default.css可作为夜间模式来使用,此时default.css为夜间模式css,而黑色主题类网址对应的域名为空文件。此种设定情况下仅白色主题网页会使用夜间模式css。 文件sitejs/.js 和sitecss/.css, sitecss/.js可作用于一切非http url(本地文件,浏览器界面等)。
-
-
-
电视直播
- https://jamesfengcao.gitee.io/uwebzh/tvlive/
+ /zh/tvlive/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tvlive/
+ /zh/tvlive/
CCTV1
CCTV2财经
CCTV3综艺
@@ -839,11 +729,53 @@ CCTV17农村
-
-
绝杀完整域名树
- https://jamesfengcao.gitee.io/uwebzh/adblock_domain/
+ 分类多引擎搜索
+ /zh/searchcat/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/adblock_domain/
+ /zh/searchcat/
+ 点击本链接自动安装分类多引擎文件至"/sdcard/uweb/bookmark"目录下。
+超微浏览器中通过“设置”->“总目录”->“↑”->“Download”,点击后缀为.search的下载文件,超微浏览器将自动显示分类多引擎搜索。此时可按菜单键(或长按底部工具条后退按钮)选择“添加到桌面”方便以后访问。
+.search文件每行格式为如下几种:
+[搜索引擎名]:[不含%s的url]
+[搜索引擎名]:[含%s的url]
+[搜索引擎名]:POST:[含%s的post参数]:[url]
+.search文件首行必须为第一种类型的搜索引擎。由于其它两种类型的引擎数量稀少,为性能考虑,超微限制了首个引擎的种类。
+本地引擎 搜索引擎已经支持命令行url,现在可添加离线字典查询至主页。命令行url格式为
+c:[含%s的命令行]
+d:mimetype:[含%s的命令行]:[外部资源url]
+查询时关键词会自动替换命令行中的%s。
+笔者用来查询各式词典,发现效果非常好。百兆以内的文本文件压缩以后可以直接快速检索,定位至特定位置以后可上下滚动阅读全部文本。
+
+
+ -
+
加速访问国外网站
+ /zh/hosts/
+ Mon, 01 Jan 0001 00:00:00 +0000
+
+ /zh/hosts/
+ 不少国外网站本身虽可访问,但由于网站需要下载其它网址的资源而导致无法访问。根域名屏蔽可屏蔽文件中域名的一切子域名、孙域名、......,从而主动排除这些网址,最终允许浏览器快速访问。
+使用Android端uweb浏览器。
+域名文件内容如下:
+googleadservices.com
+googlesyndication.com
+adsense.com
+googleapis.com
+google-analytics.com
+googletagservices.com
+twitter.com
+facebook.com
+fbcdn.net
+其它国外网址访问技巧:
+尝试关闭javascript, 譬如程序员网站stackoverflow.com在关闭javascript的情况下国内一般均可快速访问。 关闭网页图片
+
+
+ -
+
绝杀完整域名树
+ /zh/adblock_domain/
+ Mon, 01 Jan 0001 00:00:00 +0000
+
+ /zh/adblock_domain/
域名文件可屏蔽文件中域名的一切子域名、孙域名、......,可彻底绝杀一切不良信息。所以用户屏蔽根域名时无需选择提示中出现的整个域名,只需选取最后两段或三段(最后两段不超过6字符如com.cn的域名可取四段)。
可使用列出外部脚本小书签生成外部js文件列表,然后长按底部工具栏"js"按钮,执行"网址转链接"菜单命令,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。
长按不良信息链接,点击“图片:屏蔽根域名”,修改弹出域名,一般取最后两段,点击"确定"屏蔽当前图片网址。
@@ -860,11 +792,78 @@ CCTV17农村
-
-
装载网站离线资源
- https://jamesfengcao.gitee.io/uwebzh/offlinecache/
+ 利用多账号登录获取资源
+ /zh/multiaccount/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/offlinecache/
+ /zh/multiaccount/
+ 谈到资源就离不开bt, bt下载费时费力,离线bt是最佳选择。国内离线下载由于关键节点屏蔽,基本没啥用。我的个人体验是彻彻底底完全没用,但别人也许还有点用?国外唯一一个有好体验的是seedr, 不过seedr有个大问题需要解决。
+其它我曾推荐过的台湾bt, bug实在太多,现在看来也成了半个垃圾。万般无奈之下只能重拾seedr.
+seedr的问题是首次登录需要google人机验证,登录成功以后可以永久使用,无需小飞机辅助。
+以前偶尔飞飞一点问题也没有,毕竟1分钟飞行就可解决很长时间问题了。但目前的状态是信息基本被彻底封死,1分钟飞行也成了奢望。所以十分有必要珍惜这来之不易的1分钟飞行成果。
+现在直接上方案,使用超微浏览器多账号登录。飞行1分钟以后成功登录seedr, 此时退出浏览器,千万不能强退,一定要让运存中的登录信息写到内部存储。然后用户可备份应用内部目录下的.cjar文件,一旦浏览器失去登录状态,可恢复此文件,即可使用多账号登录重新登录,让这1分钟飞行成果保存下来,供万万年使用。需要注意的一点是:用户退出seedr账号会使保存的文件作废。故千万不要退出账号,需要用其它账号登录的请使用多账号登录。
+
+
+ -
+
利用浏览器地址栏对函数作图
+ /zh/gnuplot/
+ Mon, 01 Jan 0001 00:00:00 +0000
+
+ /zh/gnuplot/
+ 使用Android端uweb浏览器。
+Termux提供了方便的软件包管理系统,缺省的uWeb地址栏功能配置需用到作图软件gnuplot。
+安装gnuplot 安装 uweb定制Termux应用 Termux下运行以下命令:
+apt update
+apt upgrade
+apt install gnuplot 地址栏功能配置: 配置文件/sdcard/uweb/default.acmd每行格式如下:
+菜单名:mimeType:命令行 命令行可包含参数%s,运行时自动用地址栏输入内容替换。 如果浏览器窗口当前地址为本地url,则此目录同时作为命令行工作目录。 配置文件/sdcard/uweb/default.acmd如下: 命令:text/plain:%s 函数作图:image/svg+xml:gnuplot -e 'set term svg;set output; plot %s' 函数作图(3d):image/svg+xml:gnuplot -e 'set term svg;set output; splot %s' 超级计算器:text/html:echo "%s"|bc -l -q 长按uweb浏览器底部工具条刷新按钮弹出地址栏功能选择,选择“函数作图”,地址栏内输入函数如sin(x)**5就可显示函数图案。
+常见问题及诊断 确保gnuplot正确安装,在Termux提示符下,敲入gnuplot,然后回车,保证出现"gnuplot>"。 确保gnuplot正常运行, 在Termux提示符下,执行下面命令:
+gnuplot -e 'set term svg;set output; plot x'
+屏幕输出应该为正常的svg文件(类似html文本)。 Termux应为uweb定制包,否则有一堆设定需要修改。 超微浏览器下长按设置按钮,勾选“标准错误输出”。再次在地址栏执行画图操作,此时浏览器会显示出错信息。 为保证地址栏输入函数符合gnuplot规范,首个测试函数建议为"x",即整个地址栏内输入为"x"。
+
+
+ -
+
浏览器一键控制台式机/服务器下载资源
+ /zh/pcdown/
+ Mon, 01 Jan 0001 00:00:00 +0000
+
+ /zh/pcdown/
+ 技巧等级:高级
+小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法:
+手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令:
+apt update
+apt upgrade
+apt install openssl
+脚本pcdownload内容如下(可放置在任意应用内部目录下,并相应修改default.longclick配置中文件路径):
+#!/data/data/com.termux/files/usr/bin/sh
+ssh [user:password]@192.168.2.102 "DISPLAY=:0 firefox \"$1\""
+脚本需设置为可执行,Termux下执行命令:
+chmod 755 /data/data/com.termux/files/usr/bin/pcdownload
+这里假定用户已经在台式机上设好ssh服务,台式机IP地址为192.168.2.102,准备用firefox下载。如果下载工具不是图形程序,则上述脚本中可删去“DISPLAY=:0”。
+配置文件/sdcard/uweb/default.longclick如下:
+PCdown:/data/data/com.termux/files/usr/bin/pcdownload
+重启超微浏览器,点击链接下载时会弹出菜单,选择"PCdown",台式机会启动firefox下载手机指定文档。
+可能大家有疑问,台式机无法登录,为什么手机可以登录?这是因为手机上应用多哈。
+
+
+ -
+
特定网址用户脚本及样式
+ /zh/sitejs/
+ Mon, 01 Jan 0001 00:00:00 +0000
+
+ /zh/sitejs/
+ 技巧等级:中级
+脚本 (第一时间装载js脚本见下面sitecss条目)
+脚本需命名为 "[根域名].js",譬如baidu.com.js 或tieba.baidu.com.js 。此脚本将自动作用于所有相同根域名的网址上。如有多个脚本满足条件,以最长文件名为准。 这些脚本需放到/sdcard/uweb/sitejs或/data/data/info.torapp.uweb/files/sitejs目录下,数量没有限制,上百万都不成问题。如果内部目录下sitejs存在,则/sdcard/uweb/sitejs不起任何作用。内部sitejs目录的存在同时也影响一切对安全敏感的资源(包括网站离线资源等)的配置,一旦内部sitejs目录存在,则这些资源必须位于内部目录才会生效。 长按窗口按钮,勾选“执行网址用户脚本”。 脚本执行对浏览器无性能影响,即使有百万脚本存在。 目前支持两段、三段及少数四段域名(最后两段不超过6字如com.cn的域名可取四段)。所以脚本请不要以很长的域名来命名。 样式及第一时间装载js脚本
+与此类似,用户样式需命名为 "[根域名].css",譬如baidu.com.css 或tieba.baidu.com.css。 样式文件需放到/sdcard/uweb/sitecss目录下。 sitecss目录下"[根域名].js"文件会在第一时间装载。 长按窗口按钮,勾选“使用网址用户样式”。 如果文件“/sdcard/uweb/default.css”存在,访问网址时如果没有与域名匹配的css文件,则使用此默认样式文件。 default.css可作为夜间模式来使用,此时default.css为夜间模式css,而黑色主题类网址对应的域名为空文件。此种设定情况下仅白色主题网页会使用夜间模式css。 文件sitejs/.js 和sitecss/.css, sitecss/.js可作用于一切非http url(本地文件,浏览器界面等)。
+
+
+ -
+
装载网站离线资源
+ /zh/offlinecache/
+ Mon, 01 Jan 0001 00:00:00 +0000
+
+ /zh/offlinecache/
uweb浏览器支持装载网站离线资源。只需要将离线资源存为文件"/sdcard/uweb/sitecache/[域名]/[全部路径,包括文件名,?,&,=, 与url一模一样]"。如果应用内部目录有文件夹"sitejs"存在,则“/sdcard/uweb”下的离线资源不再生效,此时生效离线资源为内部目录下的"sitecache"文件夹。
打开选项以后超微将自动装载这些离线资源。
离线资源可作为缓存提高浏览器性能; 可作为国外网站部分备份修复服务访问; 也可替换部分网站资源达到定制网站的作用。
diff --git a/adblock/index.html b/zh/adblock/index.html
similarity index 83%
rename from adblock/index.html
rename to zh/adblock/index.html
index 880a9c73..a7a9ad69 100644
--- a/adblock/index.html
+++ b/zh/adblock/index.html
@@ -6,10 +6,20 @@
信息隐藏技术总览
+
@@ -28,13 +38,13 @@
双正则表达式根域名隐藏 。
-可使用列出外部脚本小书签 生成外部js文件列表,然后长按底部工具栏"js"按钮,执行"网址转链接"菜单命令,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。
+可使用列出外部脚本小书签 生成外部js文件列表,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。
针对特定网站的脚本样式 。
-长按底部工具栏"js"按钮,执行"标记不良元素"菜单命令,点击页面元素会弹出对话框显示元素及祖先所有属性,并生成css屏蔽代码。默认使用“display:none”屏蔽,但如果上述显示属性中出现过"display"。则建议使用"transform:scale(0)!important"屏蔽。
+长按底部工具栏"js"按钮,执行"标记不良元素"菜单命令,点击页面元素会弹出对话框显示元素及祖先所有属性,并生成css屏蔽代码。默认使用“display:none”屏蔽,但如果上述显示属性中出现过"display",则建议使用"transform:scale(0)!important"屏蔽。
diff --git a/adblock_css/index.html b/zh/adblock_css/index.html
similarity index 76%
rename from adblock_css/index.html
rename to zh/adblock_css/index.html
index 80c53083..2c8b91e7 100644
--- a/adblock_css/index.html
+++ b/zh/adblock_css/index.html
@@ -6,10 +6,20 @@
利用用户自定义样式屏蔽不良信息
+
diff --git a/adblock_domain/index.html b/zh/adblock_domain/index.html
similarity index 85%
rename from adblock_domain/index.html
rename to zh/adblock_domain/index.html
index 60e343ad..51044274 100644
--- a/adblock_domain/index.html
+++ b/zh/adblock_domain/index.html
@@ -6,10 +6,20 @@
绝杀完整域名树
+
diff --git a/androidtv/index.html b/zh/androidtv/index.html
similarity index 76%
rename from androidtv/index.html
rename to zh/androidtv/index.html
index 9a74412d..1f363f8a 100644
--- a/androidtv/index.html
+++ b/zh/androidtv/index.html
@@ -6,10 +6,20 @@
Android TV
+
diff --git a/bc/index.html b/zh/bc/index.html
similarity index 80%
rename from bc/index.html
rename to zh/bc/index.html
index b0df7dcd..bcbda19b 100644
--- a/bc/index.html
+++ b/zh/bc/index.html
@@ -6,10 +6,20 @@
超级计算器(bc)
+
diff --git a/bookmark/index.html b/zh/bookmark/index.html
similarity index 80%
rename from bookmark/index.html
rename to zh/bookmark/index.html
index dcfbfd15..8e3065a3 100644
--- a/bookmark/index.html
+++ b/zh/bookmark/index.html
@@ -6,10 +6,20 @@
常用书签
+
diff --git a/bookmarklet/index.html b/zh/bookmarklet/index.html
similarity index 94%
rename from bookmarklet/index.html
rename to zh/bookmarklet/index.html
index 13a0d960..3db5d32c 100644
--- a/bookmarklet/index.html
+++ b/zh/bookmarklet/index.html
@@ -6,10 +6,20 @@
小书签
+
@@ -26,7 +36,7 @@
超微浏览器 支持直接运行远程网址上的小书签(Bookmarklet),将本页面或其它包含小书签网址加入书签。使用时只需长按小书签链接,点击“新窗口打开”,小书签将作用于超微浏览器最后一个窗口(非小书签窗口)页面上。
-列出外部脚本
+列出外部脚本
查看浏览器UA
网页cookie
网页源码
diff --git a/zh/categories/index.html b/zh/categories/index.html
new file mode 100644
index 00000000..fc620d7d
--- /dev/null
+++ b/zh/categories/index.html
@@ -0,0 +1,8 @@
+
+
+
+
+
+
diff --git a/zh/categories/index.xml b/zh/categories/index.xml
new file mode 100644
index 00000000..351c8349
--- /dev/null
+++ b/zh/categories/index.xml
@@ -0,0 +1,9 @@
+
+
+
+ Categories on
+ /zh/categories/
+ Recent content in Categories on
+ Hugo -- gohugo.io
+
+
diff --git a/cmd/index.html b/zh/cmd/index.html
similarity index 85%
rename from cmd/index.html
rename to zh/cmd/index.html
index 6f398288..2f4ceede 100644
--- a/cmd/index.html
+++ b/zh/cmd/index.html
@@ -6,10 +6,20 @@
一键执行任意预定义命令(附手机PC剪贴板互通)
+
diff --git a/filecap/index.html b/zh/filecap/index.html
similarity index 89%
rename from filecap/index.html
rename to zh/filecap/index.html
index 21b6a47f..eadc7e9e 100644
--- a/filecap/index.html
+++ b/zh/filecap/index.html
@@ -6,10 +6,20 @@
利用文件预处理预览/查看/播放一切可下载资源
+
diff --git a/filemanager/index.html b/zh/filemanager/index.html
similarity index 73%
rename from filemanager/index.html
rename to zh/filemanager/index.html
index f49553c7..8241606d 100644
--- a/filemanager/index.html
+++ b/zh/filemanager/index.html
@@ -6,10 +6,20 @@
文件管理器及文件挑选并批量处理
+
diff --git a/filenames/index.html b/zh/filenames/index.html
similarity index 94%
rename from filenames/index.html
rename to zh/filenames/index.html
index 8e3f16b7..a53b423a 100644
--- a/filenames/index.html
+++ b/zh/filenames/index.html
@@ -6,10 +6,20 @@
超微浏览器配置文件列表
+
diff --git a/gesture/index.html b/zh/gesture/index.html
similarity index 77%
rename from gesture/index.html
rename to zh/gesture/index.html
index ddd62839..09aa4a47 100644
--- a/gesture/index.html
+++ b/zh/gesture/index.html
@@ -6,10 +6,20 @@
手势
+
diff --git a/globalcss/index.html b/zh/globalcss/index.html
similarity index 75%
rename from globalcss/index.html
rename to zh/globalcss/index.html
index e32b0e97..32f8d25e 100644
--- a/globalcss/index.html
+++ b/zh/globalcss/index.html
@@ -6,10 +6,20 @@
CSS样式
+
diff --git a/gnuplot/index.html b/zh/gnuplot/index.html
similarity index 84%
rename from gnuplot/index.html
rename to zh/gnuplot/index.html
index 175268cb..10b15920 100644
--- a/gnuplot/index.html
+++ b/zh/gnuplot/index.html
@@ -6,10 +6,20 @@
利用浏览器地址栏对函数作图
+
diff --git a/hosts/index.html b/zh/hosts/index.html
similarity index 75%
rename from hosts/index.html
rename to zh/hosts/index.html
index dfe38bed..5c92699e 100644
--- a/hosts/index.html
+++ b/zh/hosts/index.html
@@ -6,10 +6,20 @@
加速访问国外网站
+
diff --git a/html5/index.html b/zh/html5/index.html
similarity index 88%
rename from html5/index.html
rename to zh/html5/index.html
index 48075a07..0d5a0b0a 100644
--- a/html5/index.html
+++ b/zh/html5/index.html
@@ -6,10 +6,20 @@
html5应用
+
diff --git a/icons/index.html b/zh/icons/index.html
similarity index 76%
rename from icons/index.html
rename to zh/icons/index.html
index 24e2e618..15180ce0 100644
--- a/icons/index.html
+++ b/zh/icons/index.html
@@ -6,10 +6,20 @@
工具栏定制
+
diff --git a/zh/index.html b/zh/index.html
new file mode 100644
index 00000000..bfdefd0e
--- /dev/null
+++ b/zh/index.html
@@ -0,0 +1,302 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/index.xml b/zh/index.xml
similarity index 92%
rename from index.xml
rename to zh/index.xml
index 0a7e761c..8764cba3 100644
--- a/index.xml
+++ b/zh/index.xml
@@ -2,21 +2,20 @@
- https://jamesfengcao.gitee.io/uwebzh/
+ /zh/
Recent content on
Hugo -- gohugo.io
- en-us
- Sat, 25 Jun 2022 00:00:00 +0000
+ Sat, 25 Jun 2022 00:00:00 +0000
-
信息隐藏技术总览
- https://jamesfengcao.gitee.io/uwebzh/adblock/
+ /zh/adblock/
Sat, 25 Jun 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/adblock/
+ /zh/adblock/
总体来说,分为手动控制和针对特定网站的规则两大类办法。手动控制可以保存为网站配置从而自动化。
双正则表达式根域名隐藏。
-可使用列出外部脚本小书签生成外部js文件列表,然后长按底部工具栏"js"按钮,执行"网址转链接"菜单命令,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。 针对特定网站的脚本样式。
-长按底部工具栏"js"按钮,执行"标记不良元素"菜单命令,点击页面元素会弹出对话框显示元素及祖先所有属性,并生成css屏蔽代码。默认使用“display:none”屏蔽,但如果上述显示属性中出现过"display"。则建议使用"transform:scale(0)!important"屏蔽。 长按底部工具栏窗口管理按钮,选取"仅显示图片"或"仅显示视频",图片视频网站彻底干净。选取"禁用伪元素","禁用iframe"。更多可参看自定义样式。
+可使用列出外部脚本小书签生成外部js文件列表,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。 针对特定网站的脚本样式。
+长按底部工具栏"js"按钮,执行"标记不良元素"菜单命令,点击页面元素会弹出对话框显示元素及祖先所有属性,并生成css屏蔽代码。默认使用“display:none”屏蔽,但如果上述显示属性中出现过"display",则建议使用"transform:scale(0)!important"屏蔽。 长按底部工具栏窗口管理按钮,选取"仅显示图片"或"仅显示视频",图片视频网站彻底干净。选取"禁用伪元素","禁用iframe"。更多可参看自定义样式。
保存书签时可在网址前面添加"i:0mc32:",则整个网址树自动采用"仅显示图片"。没有任何不良信息。改为"c16"则为"仅显示视频"。"c12"则同时采用"禁用伪元素","禁用iframe"。 长按[☰]按钮"自动全屏播放",直接全屏无干扰播放。不良信息没有任何机会出现。不使用全局脚本“自动全屏播放”的情况下,还可以有以下几种方法:
使用常用服务自动全屏播放菜单(长按视频链接->命令),则页面视频会自动全屏播放。按设置按钮,如果勾选“允许自动播放”,则今后此窗口内其它任何视频网址都将会自动全屏无干扰播放。保存书签时可在网址前面添加"i:5f"。 保存书签时可在网址前面添加"i:0mi:5f:",则整个网址树自动全屏播放。 长按设置,选取"拦截外链脚本"。可在界面配置及杂项网页额外拦截第三方可疑资源。可配置白名单js.allow。
长按[☰]按钮可隐藏浮动信息,移除横幅,清空定时器(防止定时触发不良信息),中断可疑事件(防止用户操作触发),等待(防止延迟触发)。
@@ -27,10 +26,10 @@ url.deny。需要屏蔽的url正则表达式(java语法),忽视回车,
-
小书签
- https://jamesfengcao.gitee.io/uwebzh/bookmarklet/
+ /zh/bookmarklet/
Fri, 24 Jun 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/bookmarklet/
+ /zh/bookmarklet/
超微浏览器支持直接运行远程网址上的小书签(Bookmarklet),将本页面或其它包含小书签网址加入书签。使用时只需长按小书签链接,点击“新窗口打开”,小书签将作用于超微浏览器最后一个窗口(非小书签窗口)页面上。
列出外部脚本
查看浏览器UA
@@ -55,19 +54,19 @@ BugMeNot
-
技巧网站导航
- https://jamesfengcao.gitee.io/uwebzh/sitemap/
+ /zh/sitemap/
Sat, 28 May 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/sitemap/
+ /zh/sitemap/
界面配置 搜索引擎 主页 快速访问 界面配置及杂项 (gitee镜像) 备份与恢复 个性化 工具条按钮长按菜单 浏览器标识 js脚本 常用服务 常用链接 常用命令 远程脚本 选中文本类菜单 长按链接弹出菜单 底部工具条定制 手势 高级个性化定制 高级设置 内容类 信息隐藏 CSS样式 重定向 特定网址用户脚本及样式 网站离线资源 工具应用类 小书签 文件预处理 html5应用 文件管理器 工具汇总 终端应用及Termux 超级计算器 函数作图 定时脚本 离线下载 输入法辅助 部件检索 综合 配置文件列表 插件 使用技巧 使用技巧 视频 安卓系统出错诊断
-
Android TV
- https://jamesfengcao.gitee.io/uwebzh/androidtv/
+ /zh/androidtv/
Wed, 18 May 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/androidtv/
+ /zh/androidtv/
TV端推荐打开自动播放选项,全局脚本打开自动全屏播放,全局样式打开“仅显示图片“,禁止js confirm对话框。
点击以下链接可直接设置主屏为书签并添加链接。Android TV可从手机端接收视频url并打开,发送见常用服务:
等待从网络接收url并打开
@@ -78,25 +77,12 @@ BugMeNot
Android TV可利用顺序搜索使用箭头按钮切换频道。顺序搜索引擎文件engine.search中的搜索引擎url如果不包含'%s',则搜索引擎只是简单的固定网页url,此时顺序搜索表现为频道切换。更多信息见多引擎搜索页面。
- -
-
利用用户自定义样式屏蔽不良信息
- https://jamesfengcao.gitee.io/uwebzh/adblock_css/
- Wed, 18 May 2022 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/adblock_css/
- 点击以下链接可安装全局样式,清后台重启浏览器,长按底部工具条窗口按钮弹出对话框后勾选上述文件名即可屏蔽不良信息。
-floppymoose 广告屏蔽样式
-gozer 广告屏蔽样式
-超微浏览器支持根域名屏蔽,完全绝杀手机不良信息小厂。但少部分不良信息大厂本身也提供高质量的内容服务,它们可以将不良信息伪装成正常的内容从而逃脱域名绝杀。
-对这一部分不良信息而言,我们可以利用超微浏览器的自定义样式功能加以屏蔽。
-
-
-
常用书签
- https://jamesfengcao.gitee.io/uwebzh/bookmark/
+ /zh/bookmark/
Wed, 18 May 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/bookmark/
+ /zh/bookmark/
gamezop
点击以下链接可安装模板至分类书签目录。保存至“小说”类别的网站会自动使用阅读模式。
"小说.html": 自动使用阅读模式
@@ -115,12 +101,25 @@ wikipedia search gopher
reddit gopher
+ -
+
利用用户自定义样式屏蔽不良信息
+ /zh/adblock_css/
+ Wed, 18 May 2022 00:00:00 +0000
+
+ /zh/adblock_css/
+ 点击以下链接可安装全局样式,清后台重启浏览器,长按底部工具条窗口按钮弹出对话框后勾选上述文件名即可屏蔽不良信息。
+floppymoose 广告屏蔽样式
+gozer 广告屏蔽样式
+超微浏览器支持根域名屏蔽,完全绝杀手机不良信息小厂。但少部分不良信息大厂本身也提供高质量的内容服务,它们可以将不良信息伪装成正常的内容从而逃脱域名绝杀。
+对这一部分不良信息而言,我们可以利用超微浏览器的自定义样式功能加以屏蔽。
+
+
-
常用链接
- https://jamesfengcao.gitee.io/uwebzh/links/
+ /zh/links/
Tue, 10 May 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/links/
+ /zh/links/
点击以下链接可安装至常用链接
显示网站安全证书
迅雷盘离线
@@ -178,10 +177,10 @@ i:1c
-
重定向国外网址至国内镜像(附编辑本地文件)
- https://jamesfengcao.gitee.io/uwebzh/redirect/
+ /zh/redirect/
Mon, 25 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/redirect/
+ /zh/redirect/
github mirror:fastgit
github mirror 2
github mirror 3
@@ -222,10 +221,10 @@ item.gome.com.cn::item.gomevvv.com.cn
-
操作选中(富)文本/元素
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
+ /zh/pccopy/
Sat, 23 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
+ /zh/pccopy/
点击以下链接可安装长按“链接”按钮菜单:
google划词翻译
bing翻译
@@ -266,10 +265,10 @@ pclip
-
CSS样式
- https://jamesfengcao.gitee.io/uwebzh/globalcss/
+ /zh/globalcss/
Sun, 03 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/globalcss/
+ /zh/globalcss/
超微浏览器自动装载"/sdcard/uweb/css"目录下所有.css文件作为全局样式供用户选用。点击以下配置链接可自动添加为全局样式:
强制使用默认字体
配合透明状态栏(沉浸)
@@ -280,10 +279,10 @@ webview 80- 夜间模式
-
超微浏览器配置文件列表
- https://jamesfengcao.gitee.io/uwebzh/filenames/
+ /zh/filenames/
Fri, 18 Mar 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/filenames/
+ /zh/filenames/
下面列表中以"/"结尾者为目录,其余为文件。如果用户勾选“使用内部目录配置”,"sitejs/","sitecache/"等位于应用内部保护目录下。否则以下所有文件/目录均位于"/sdcard/uweb":
"css/":全局样式目录
"js/": 全局脚本目录
@@ -340,10 +339,10 @@ webview 80- 夜间模式
-
文件管理器及文件挑选并批量处理
- https://jamesfengcao.gitee.io/uwebzh/filemanager/
+ /zh/filemanager/
Fri, 11 Feb 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/filemanager/
+ /zh/filemanager/
超微浏览器访问以"/"结尾 (包括"/?"及后面参数)的"file://" url,则进入文件管理器。
对任何目录型(以“/”结尾)文件url,后面可附"?[文件前缀][*[文件后缀]]"。譬如"file:///sdcard/?*.png"会列举出"/sdcard"目录下所有.png文件。"?IMG"列举出所有IMG开头的文件。此时可选定文件,并安装checked.js对选取文件进行批量处理。
文件批量处理配置default.select例子:
@@ -352,10 +351,10 @@ webview 80- 夜间模式
-
超级计算器(bc)
- https://jamesfengcao.gitee.io/uwebzh/bc/
+ /zh/bc/
Thu, 10 Feb 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/bc/
+ /zh/bc/
使用uweb浏览器。
Gnu bc计算器支持无限精度,可扩展函数库、常数库。
安装bc (Android11+无需安装) 安装uweb定制Termux应用 Termux下运行以下命令:
@@ -376,10 +375,10 @@ http://www.numbertheory.org/gnubc/gnubc.html
-
工具栏定制
- https://jamesfengcao.gitee.io/uwebzh/icons/
+ /zh/icons/
Sun, 06 Feb 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/icons/
+ /zh/icons/
超微浏览器配置目录下如果存在目录"icon",则此目录下的文件名为"0","1","2"...
会作为底部工具栏图标。文件"0"替换原后退按钮,"1"为前进按钮,"2"为设置按钮,"3"为主页按钮......。
如果定义有新按钮(当前版本存在文件"20"),则uweb支持向量格式图标VectorDrawable,格式为compiled XML。此时所有图标文件必须都是compiled XML格式,或都是普通的图像格式(png,jpg,gif等)。用户可将VectorDrawable XML文件放到安卓项目目录assets下面,重新生成apk文件以后将apk文件解压即可得compiled XML格式图标文件。
@@ -389,10 +388,10 @@ http://www.numbertheory.org/gnubc/gnubc.html
-
小技巧
- https://jamesfengcao.gitee.io/uwebzh/tips/
+ /zh/tips/
Mon, 01 Nov 2021 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tips/
+ /zh/tips/
准确显示一切PC网页:
PC模式 + 勾选选项"宽屏显示" + 全局脚本"强制缩放"。
多主屏:
@@ -410,10 +409,10 @@ UA为非默认时,点击PC按钮将恢复UA为默认,同时触发不保存UA
-
定时脚本
- https://jamesfengcao.gitee.io/uwebzh/tcron/
+ /zh/tcron/
Sat, 13 Feb 2021 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tcron/
+ /zh/tcron/
如果勾选“文件预处理”,则uweb启动时运行"default.rc" shell脚本。可与tcron定时管
理工具(安装tcron)配合运行定时任务,如存储清理、网页签到等。
勾选“文件预处理”的情况下,如果存在文件"default.rc2",则在超微浏览器成为前台时,此文件代码被执行。在超微永不退出的情况下,"default.rc"将没有任何执行机会,而"default.rc2"保证即使超微长时间不重启,定时脚本仍可以执行。
@@ -446,10 +445,10 @@ crontab例子内容如下:
-
安卓系统出错诊断
- https://jamesfengcao.gitee.io/uwebzh/logcat/
+ /zh/logcat/
Mon, 28 Dec 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/logcat/
+ /zh/logcat/
超微浏览器如果闪退,会生成出错文件"/sdcard/uweb/error.log"。
如果超微或安卓系统或任何应用出现问题,则可利用超微浏览器进行诊断,方法如下:
访问常用命令网页,点击安装logcat相关的两个命令。 清空后台并重启超微浏览器。 长按历史按钮,执行命令"清空logcat"。 触发有问题的功能。 长按历史按钮,执行命令"输出logcat.log". 检查文件"/sdcard/uweb/logcat.log"内容。 超微浏览器是手机上调试javascript脚本的最佳工具,无需打包就可有多种方式运行javascript代码。webview dev版自带devtools,运行此工具,打开flag "webview-log-js-console-messages"以后所有js出错信息及console输出会被复制到logcat中。然后用户可根据上一段所述方法诊断。
@@ -460,10 +459,10 @@ devtools for com.android.webview
-
离线下载
- https://jamesfengcao.gitee.io/uwebzh/loadbt/
+ /zh/loadbt/
Tue, 15 Dec 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/loadbt/
+ /zh/loadbt/
seedr用户可使用常用链接利用seedr离线下载。使用时长按链接->命令->seedr离线...。 Telegram用户可使用特色服务利用tg bot离线下载至bot支持网盘。使用时长按链接->命令->tg...。 百度网盘存储空间大,但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。
本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。
超微浏览器上配置百度离线下载
@@ -484,10 +483,10 @@ BaiduPCS-Go config set -appid=266719
-
长按链接弹出菜单
- https://jamesfengcao.gitee.io/uwebzh/longclick/
+ /zh/longclick/
Fri, 06 Nov 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/longclick/
+ /zh/longclick/
长按链接运行第三方程序 配置文件/sdcard/uweb/default.longclick每行格式如下(同default.cmds)
菜单名:mimetype:命令路径
命令可以包含%c(当前网址cookie)等,执行时会被相应内容自动替换。
@@ -498,10 +497,10 @@ js文件格式如下:
-
视频播放小窍门
- https://jamesfengcao.gitee.io/uwebzh/video/
+ /zh/video/
Tue, 22 Sep 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/video/
+ /zh/video/
覆盖安装全屏播放菜单示例:屏幕旋转,退出
本文以超微浏览器为例来说明。
创建文件"default.playrate"可定制全屏倍速播放菜单项,格式与文件default.link完全相同。倍速播放菜单链接部分为空,譬如".5x:",倍速菜单至少有一个。链接部分非空的菜单必须在所有倍速菜单之后。 长按设置按钮勾选“弹出视频地址”,则视频播放时会弹出真正的播放地址,点击地址播放可避免一切不良信息。如果点击后为下载操作,可长按链接分享给视频播放器。用户亦可配置在线播放或安装插件。嗅探的视频/资源类型可由文件“/sdcard/uweb/types.sniff”控制。 很多视频解析结果在UA为PC的情况下非常干净,没什么不良信息。故用户可在播放前切换UA至PC。如:wn.run/解析结果对PC非常干净。 某些视频网站在全屏播放时都会出现不良信息占住屏幕一部分。点击全屏播放之前,长按[☰]按钮,超微浏览器将弹出全局脚本菜单,勾选“移除浮动不良信息”后再点全屏播放则完美播放。 也可利用全屏播放屏蔽一切不良信息。方法如下: 长按[☰]按钮,勾选“全屏视频”。此选项将让无法全屏播放的网站强制允许全屏播放。 对无法全屏、无法放大的视频网站,可长按[☰]按钮,勾选“强制缩放”,然后手动放大至全屏。 灵活应用JS、图像开关屏蔽一切不良信息:视频搜索前关闭JS开关,进入播放网页前关闭图像显示并打开JS。 视频解析之电视剧: 首先在视频网站搜索电视剧片名,下面会显示不同的剧集,点击它们再用视频解析即可观看。如果直接点击电视剧用视频解析则每次播放均为第一集。 视频搜索预配置(超过400个引擎)
@@ -511,10 +510,10 @@ js文件格式如下:
-
工具汇总
- https://jamesfengcao.gitee.io/uwebzh/tools/
+ /zh/tools/
Sun, 06 Sep 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tools/
+ /zh/tools/
安装tdict检索工具 (本地检索,远程内容) 安装完tdict本地检索工具后,可选择性安装字典索引及对应的搜索引擎至主屏。以下引擎仅作测试使用。
安装双解字典索引
安装双解字典至主屏
@@ -545,10 +544,10 @@ Merriam Webster Unabridged
-
利用文件预处理预览/查看/播放一切可下载资源
- https://jamesfengcao.gitee.io/uwebzh/filecap/
+ /zh/filecap/
Mon, 24 Aug 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/filecap/
+ /zh/filecap/
技巧等级:中级
文件预处理配置文件为/sdcard/uweb/default.filecap,每行格式如下:
[文件后缀]:[mimetype]:[处理命令]
@@ -565,10 +564,10 @@ pdf:uweb:echo file:///sdcard/uweb/app/pdf.js/web/viewer.html?file=%u djvu:uweb:e
-
html5应用
- https://jamesfengcao.gitee.io/uwebzh/html5/
+ /zh/html5/
Thu, 20 Aug 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/html5/
+ /zh/html5/
点击安装超大文件阅读器(支持txt, html, markdown)
点击安装超大文件阅读器(markdeep版, latex, diagram,graphviz等)
点击安装plyr视频播放器
@@ -604,10 +603,10 @@ MoePlayer/APlayer : music player
-
手势
- https://jamesfengcao.gitee.io/uwebzh/gesture/
+ /zh/gesture/
Thu, 18 Jun 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/gesture/
+ /zh/gesture/
顶部下拉弹出地址栏; 顶部上划隐藏地址栏。底部下划隐藏工具条; 底部左右角落划动弹出工具条。
紧靠工具条左右划动切换当前窗口; 左右大幅度划动切换到第一或最后一个窗口。
起点终点紧靠地址栏划动操作调用"default.gesture"文件中对应链接。文件格式与文件default.link完全相同。每行第一部分为助记名,第二部分为链接。手势操作对应方式如下:
@@ -621,10 +620,10 @@ back2:javascript:history.go(-2)
-
一键执行任意预定义命令(附手机PC剪贴板互通)
- https://jamesfengcao.gitee.io/uwebzh/cmd/
+ /zh/cmd/
Sat, 20 Jan 2018 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/cmd/
+ /zh/cmd/
技巧等级:中级 PC剪贴板(高级)
uweb浏览器支持一键执行任意预定义命令,这些命令可以与剪贴板交互,可以将结果(文本、图像、音视频)输出到浏览器窗口。
手机推荐安装uweb定制Termux,否则能够执行的命令极其有限。
@@ -644,128 +643,19 @@ mimetype用来表示命令的输出类型。除了标准的mimetype之外,超
-
便利链接
- https://jamesfengcao.gitee.io/uwebzh/urls/
+ /zh/urls/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/urls/
+ /zh/urls/
Termux内部目录
- -
-
分类多引擎搜索
- https://jamesfengcao.gitee.io/uwebzh/searchcat/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/searchcat/
- 点击本链接自动安装分类多引擎文件至"/sdcard/uweb/bookmark"目录下。
-超微浏览器中通过“设置”->“总目录”->“↑”->“Download”,点击后缀为.search的下载文件,超微浏览器将自动显示分类多引擎搜索。此时可按菜单键(或长按底部工具条后退按钮)选择“添加到桌面”方便以后访问。
-.search文件每行格式为如下几种:
-[搜索引擎名]:[不含%s的url]
-[搜索引擎名]:[含%s的url]
-[搜索引擎名]:POST:[含%s的post参数]:[url]
-.search文件首行必须为第一种类型的搜索引擎。由于其它两种类型的引擎数量稀少,为性能考虑,超微限制了首个引擎的种类。
-本地引擎 搜索引擎已经支持命令行url,现在可添加离线字典查询至主页。命令行url格式为
-c:[含%s的命令行]
-d:mimetype:[含%s的命令行]:[外部资源url]
-查询时关键词会自动替换命令行中的%s。
-笔者用来查询各式词典,发现效果非常好。百兆以内的文本文件压缩以后可以直接快速检索,定位至特定位置以后可上下滚动阅读全部文本。
-
-
- -
-
利用多账号登录获取资源
- https://jamesfengcao.gitee.io/uwebzh/multiaccount/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/multiaccount/
- 谈到资源就离不开bt, bt下载费时费力,离线bt是最佳选择。国内离线下载由于关键节点屏蔽,基本没啥用。我的个人体验是彻彻底底完全没用,但别人也许还有点用?国外唯一一个有好体验的是seedr, 不过seedr有个大问题需要解决。
-其它我曾推荐过的台湾bt, bug实在太多,现在看来也成了半个垃圾。万般无奈之下只能重拾seedr.
-seedr的问题是首次登录需要google人机验证,登录成功以后可以永久使用,无需小飞机辅助。
-以前偶尔飞飞一点问题也没有,毕竟1分钟飞行就可解决很长时间问题了。但目前的状态是信息基本被彻底封死,1分钟飞行也成了奢望。所以十分有必要珍惜这来之不易的1分钟飞行成果。
-现在直接上方案,使用超微浏览器多账号登录。飞行1分钟以后成功登录seedr, 此时退出浏览器,千万不能强退,一定要让运存中的登录信息写到内部存储。然后用户可备份应用内部目录下的.cjar文件,一旦浏览器失去登录状态,可恢复此文件,即可使用多账号登录重新登录,让这1分钟飞行成果保存下来,供万万年使用。需要注意的一点是:用户退出seedr账号会使保存的文件作废。故千万不要退出账号,需要用其它账号登录的请使用多账号登录。
-
-
- -
-
利用浏览器地址栏对函数作图
- https://jamesfengcao.gitee.io/uwebzh/gnuplot/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/gnuplot/
- 使用Android端uweb浏览器。
-Termux提供了方便的软件包管理系统,缺省的uWeb地址栏功能配置需用到作图软件gnuplot。
-安装gnuplot 安装 uweb定制Termux应用 Termux下运行以下命令:
-apt update
-apt upgrade
-apt install gnuplot 地址栏功能配置: 配置文件/sdcard/uweb/default.acmd每行格式如下:
-菜单名:mimeType:命令行 命令行可包含参数%s,运行时自动用地址栏输入内容替换。 如果浏览器窗口当前地址为本地url,则此目录同时作为命令行工作目录。 配置文件/sdcard/uweb/default.acmd如下: 命令:text/plain:%s 函数作图:image/svg+xml:gnuplot -e 'set term svg;set output; plot %s' 函数作图(3d):image/svg+xml:gnuplot -e 'set term svg;set output; splot %s' 超级计算器:text/html:echo "%s"|bc -l -q 长按uweb浏览器底部工具条刷新按钮弹出地址栏功能选择,选择“函数作图”,地址栏内输入函数如sin(x)**5就可显示函数图案。
-常见问题及诊断 确保gnuplot正确安装,在Termux提示符下,敲入gnuplot,然后回车,保证出现"gnuplot>"。 确保gnuplot正常运行, 在Termux提示符下,执行下面命令:
-gnuplot -e 'set term svg;set output; plot x'
-屏幕输出应该为正常的svg文件(类似html文本)。 Termux应为uweb定制包,否则有一堆设定需要修改。 超微浏览器下长按设置按钮,勾选“标准错误输出”。再次在地址栏执行画图操作,此时浏览器会显示出错信息。 为保证地址栏输入函数符合gnuplot规范,首个测试函数建议为"x",即整个地址栏内输入为"x"。
-
-
- -
-
加速访问国外网站
- https://jamesfengcao.gitee.io/uwebzh/hosts/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/hosts/
- 不少国外网站本身虽可访问,但由于网站需要下载其它网址的资源而导致无法访问。根域名屏蔽可屏蔽文件中域名的一切子域名、孙域名、......,从而主动排除这些网址,最终允许浏览器快速访问。
-使用Android端uweb浏览器。
-域名文件内容如下:
-googleadservices.com
-googlesyndication.com
-adsense.com
-googleapis.com
-google-analytics.com
-googletagservices.com
-twitter.com
-facebook.com
-fbcdn.net
-其它国外网址访问技巧:
-尝试关闭javascript, 譬如程序员网站stackoverflow.com在关闭javascript的情况下国内一般均可快速访问。 关闭网页图片
-
-
- -
-
浏览器一键控制台式机/服务器下载资源
- https://jamesfengcao.gitee.io/uwebzh/pcdown/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/pcdown/
- 技巧等级:高级
-小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法:
-手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令:
-apt update
-apt upgrade
-apt install openssl
-脚本pcdownload内容如下(可放置在任意应用内部目录下,并相应修改default.longclick配置中文件路径):
-#!/data/data/com.termux/files/usr/bin/sh
-ssh [user:password]@192.168.2.102 "DISPLAY=:0 firefox \"$1\""
-脚本需设置为可执行,Termux下执行命令:
-chmod 755 /data/data/com.termux/files/usr/bin/pcdownload
-这里假定用户已经在台式机上设好ssh服务,台式机IP地址为192.168.2.102,准备用firefox下载。如果下载工具不是图形程序,则上述脚本中可删去“DISPLAY=:0”。
-配置文件/sdcard/uweb/default.longclick如下:
-PCdown:/data/data/com.termux/files/usr/bin/pcdownload
-重启超微浏览器,点击链接下载时会弹出菜单,选择"PCdown",台式机会启动firefox下载手机指定文档。
-可能大家有疑问,台式机无法登录,为什么手机可以登录?这是因为手机上应用多哈。
-
-
- -
-
特定网址用户脚本及样式
- https://jamesfengcao.gitee.io/uwebzh/sitejs/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/sitejs/
- 技巧等级:中级
-脚本 (第一时间装载js脚本见下面sitecss条目)
-脚本需命名为 "[根域名].js",譬如baidu.com.js 或tieba.baidu.com.js 。此脚本将自动作用于所有相同根域名的网址上。如有多个脚本满足条件,以最长文件名为准。 这些脚本需放到/sdcard/uweb/sitejs或/data/data/info.torapp.uweb/files/sitejs目录下,数量没有限制,上百万都不成问题。如果内部目录下sitejs存在,则/sdcard/uweb/sitejs不起任何作用。内部sitejs目录的存在同时也影响一切对安全敏感的资源(包括网站离线资源等)的配置,一旦内部sitejs目录存在,则这些资源必须位于内部目录才会生效。 长按窗口按钮,勾选“执行网址用户脚本”。 脚本执行对浏览器无性能影响,即使有百万脚本存在。 目前支持两段、三段及少数四段域名(最后两段不超过6字如com.cn的域名可取四段)。所以脚本请不要以很长的域名来命名。 样式及第一时间装载js脚本
-与此类似,用户样式需命名为 "[根域名].css",譬如baidu.com.css 或tieba.baidu.com.css。 样式文件需放到/sdcard/uweb/sitecss目录下。 sitecss目录下"[根域名].js"文件会在第一时间装载。 长按窗口按钮,勾选“使用网址用户样式”。 如果文件“/sdcard/uweb/default.css”存在,访问网址时如果没有与域名匹配的css文件,则使用此默认样式文件。 default.css可作为夜间模式来使用,此时default.css为夜间模式css,而黑色主题类网址对应的域名为空文件。此种设定情况下仅白色主题网页会使用夜间模式css。 文件sitejs/.js 和sitecss/.css, sitecss/.js可作用于一切非http url(本地文件,浏览器界面等)。
-
-
-
电视直播
- https://jamesfengcao.gitee.io/uwebzh/tvlive/
+ /zh/tvlive/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tvlive/
+ /zh/tvlive/
CCTV1
CCTV2财经
CCTV3综艺
@@ -839,11 +729,53 @@ CCTV17农村
-
-
绝杀完整域名树
- https://jamesfengcao.gitee.io/uwebzh/adblock_domain/
+ 分类多引擎搜索
+ /zh/searchcat/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/adblock_domain/
+ /zh/searchcat/
+ 点击本链接自动安装分类多引擎文件至"/sdcard/uweb/bookmark"目录下。
+超微浏览器中通过“设置”->“总目录”->“↑”->“Download”,点击后缀为.search的下载文件,超微浏览器将自动显示分类多引擎搜索。此时可按菜单键(或长按底部工具条后退按钮)选择“添加到桌面”方便以后访问。
+.search文件每行格式为如下几种:
+[搜索引擎名]:[不含%s的url]
+[搜索引擎名]:[含%s的url]
+[搜索引擎名]:POST:[含%s的post参数]:[url]
+.search文件首行必须为第一种类型的搜索引擎。由于其它两种类型的引擎数量稀少,为性能考虑,超微限制了首个引擎的种类。
+本地引擎 搜索引擎已经支持命令行url,现在可添加离线字典查询至主页。命令行url格式为
+c:[含%s的命令行]
+d:mimetype:[含%s的命令行]:[外部资源url]
+查询时关键词会自动替换命令行中的%s。
+笔者用来查询各式词典,发现效果非常好。百兆以内的文本文件压缩以后可以直接快速检索,定位至特定位置以后可上下滚动阅读全部文本。
+
+
+ -
+
加速访问国外网站
+ /zh/hosts/
+ Mon, 01 Jan 0001 00:00:00 +0000
+
+ /zh/hosts/
+ 不少国外网站本身虽可访问,但由于网站需要下载其它网址的资源而导致无法访问。根域名屏蔽可屏蔽文件中域名的一切子域名、孙域名、......,从而主动排除这些网址,最终允许浏览器快速访问。
+使用Android端uweb浏览器。
+域名文件内容如下:
+googleadservices.com
+googlesyndication.com
+adsense.com
+googleapis.com
+google-analytics.com
+googletagservices.com
+twitter.com
+facebook.com
+fbcdn.net
+其它国外网址访问技巧:
+尝试关闭javascript, 譬如程序员网站stackoverflow.com在关闭javascript的情况下国内一般均可快速访问。 关闭网页图片
+
+
+ -
+
绝杀完整域名树
+ /zh/adblock_domain/
+ Mon, 01 Jan 0001 00:00:00 +0000
+
+ /zh/adblock_domain/
域名文件可屏蔽文件中域名的一切子域名、孙域名、......,可彻底绝杀一切不良信息。所以用户屏蔽根域名时无需选择提示中出现的整个域名,只需选取最后两段或三段(最后两段不超过6字符如com.cn的域名可取四段)。
可使用列出外部脚本小书签生成外部js文件列表,然后长按底部工具栏"js"按钮,执行"网址转链接"菜单命令,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。
长按不良信息链接,点击“图片:屏蔽根域名”,修改弹出域名,一般取最后两段,点击"确定"屏蔽当前图片网址。
@@ -860,11 +792,78 @@ CCTV17农村
-
-
装载网站离线资源
- https://jamesfengcao.gitee.io/uwebzh/offlinecache/
+ 利用多账号登录获取资源
+ /zh/multiaccount/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/offlinecache/
+ /zh/multiaccount/
+ 谈到资源就离不开bt, bt下载费时费力,离线bt是最佳选择。国内离线下载由于关键节点屏蔽,基本没啥用。我的个人体验是彻彻底底完全没用,但别人也许还有点用?国外唯一一个有好体验的是seedr, 不过seedr有个大问题需要解决。
+其它我曾推荐过的台湾bt, bug实在太多,现在看来也成了半个垃圾。万般无奈之下只能重拾seedr.
+seedr的问题是首次登录需要google人机验证,登录成功以后可以永久使用,无需小飞机辅助。
+以前偶尔飞飞一点问题也没有,毕竟1分钟飞行就可解决很长时间问题了。但目前的状态是信息基本被彻底封死,1分钟飞行也成了奢望。所以十分有必要珍惜这来之不易的1分钟飞行成果。
+现在直接上方案,使用超微浏览器多账号登录。飞行1分钟以后成功登录seedr, 此时退出浏览器,千万不能强退,一定要让运存中的登录信息写到内部存储。然后用户可备份应用内部目录下的.cjar文件,一旦浏览器失去登录状态,可恢复此文件,即可使用多账号登录重新登录,让这1分钟飞行成果保存下来,供万万年使用。需要注意的一点是:用户退出seedr账号会使保存的文件作废。故千万不要退出账号,需要用其它账号登录的请使用多账号登录。
+
+
+ -
+
利用浏览器地址栏对函数作图
+ /zh/gnuplot/
+ Mon, 01 Jan 0001 00:00:00 +0000
+
+ /zh/gnuplot/
+ 使用Android端uweb浏览器。
+Termux提供了方便的软件包管理系统,缺省的uWeb地址栏功能配置需用到作图软件gnuplot。
+安装gnuplot 安装 uweb定制Termux应用 Termux下运行以下命令:
+apt update
+apt upgrade
+apt install gnuplot 地址栏功能配置: 配置文件/sdcard/uweb/default.acmd每行格式如下:
+菜单名:mimeType:命令行 命令行可包含参数%s,运行时自动用地址栏输入内容替换。 如果浏览器窗口当前地址为本地url,则此目录同时作为命令行工作目录。 配置文件/sdcard/uweb/default.acmd如下: 命令:text/plain:%s 函数作图:image/svg+xml:gnuplot -e 'set term svg;set output; plot %s' 函数作图(3d):image/svg+xml:gnuplot -e 'set term svg;set output; splot %s' 超级计算器:text/html:echo "%s"|bc -l -q 长按uweb浏览器底部工具条刷新按钮弹出地址栏功能选择,选择“函数作图”,地址栏内输入函数如sin(x)**5就可显示函数图案。
+常见问题及诊断 确保gnuplot正确安装,在Termux提示符下,敲入gnuplot,然后回车,保证出现"gnuplot>"。 确保gnuplot正常运行, 在Termux提示符下,执行下面命令:
+gnuplot -e 'set term svg;set output; plot x'
+屏幕输出应该为正常的svg文件(类似html文本)。 Termux应为uweb定制包,否则有一堆设定需要修改。 超微浏览器下长按设置按钮,勾选“标准错误输出”。再次在地址栏执行画图操作,此时浏览器会显示出错信息。 为保证地址栏输入函数符合gnuplot规范,首个测试函数建议为"x",即整个地址栏内输入为"x"。
+
+
+ -
+
浏览器一键控制台式机/服务器下载资源
+ /zh/pcdown/
+ Mon, 01 Jan 0001 00:00:00 +0000
+
+ /zh/pcdown/
+ 技巧等级:高级
+小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法:
+手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令:
+apt update
+apt upgrade
+apt install openssl
+脚本pcdownload内容如下(可放置在任意应用内部目录下,并相应修改default.longclick配置中文件路径):
+#!/data/data/com.termux/files/usr/bin/sh
+ssh [user:password]@192.168.2.102 "DISPLAY=:0 firefox \"$1\""
+脚本需设置为可执行,Termux下执行命令:
+chmod 755 /data/data/com.termux/files/usr/bin/pcdownload
+这里假定用户已经在台式机上设好ssh服务,台式机IP地址为192.168.2.102,准备用firefox下载。如果下载工具不是图形程序,则上述脚本中可删去“DISPLAY=:0”。
+配置文件/sdcard/uweb/default.longclick如下:
+PCdown:/data/data/com.termux/files/usr/bin/pcdownload
+重启超微浏览器,点击链接下载时会弹出菜单,选择"PCdown",台式机会启动firefox下载手机指定文档。
+可能大家有疑问,台式机无法登录,为什么手机可以登录?这是因为手机上应用多哈。
+
+
+ -
+
特定网址用户脚本及样式
+ /zh/sitejs/
+ Mon, 01 Jan 0001 00:00:00 +0000
+
+ /zh/sitejs/
+ 技巧等级:中级
+脚本 (第一时间装载js脚本见下面sitecss条目)
+脚本需命名为 "[根域名].js",譬如baidu.com.js 或tieba.baidu.com.js 。此脚本将自动作用于所有相同根域名的网址上。如有多个脚本满足条件,以最长文件名为准。 这些脚本需放到/sdcard/uweb/sitejs或/data/data/info.torapp.uweb/files/sitejs目录下,数量没有限制,上百万都不成问题。如果内部目录下sitejs存在,则/sdcard/uweb/sitejs不起任何作用。内部sitejs目录的存在同时也影响一切对安全敏感的资源(包括网站离线资源等)的配置,一旦内部sitejs目录存在,则这些资源必须位于内部目录才会生效。 长按窗口按钮,勾选“执行网址用户脚本”。 脚本执行对浏览器无性能影响,即使有百万脚本存在。 目前支持两段、三段及少数四段域名(最后两段不超过6字如com.cn的域名可取四段)。所以脚本请不要以很长的域名来命名。 样式及第一时间装载js脚本
+与此类似,用户样式需命名为 "[根域名].css",譬如baidu.com.css 或tieba.baidu.com.css。 样式文件需放到/sdcard/uweb/sitecss目录下。 sitecss目录下"[根域名].js"文件会在第一时间装载。 长按窗口按钮,勾选“使用网址用户样式”。 如果文件“/sdcard/uweb/default.css”存在,访问网址时如果没有与域名匹配的css文件,则使用此默认样式文件。 default.css可作为夜间模式来使用,此时default.css为夜间模式css,而黑色主题类网址对应的域名为空文件。此种设定情况下仅白色主题网页会使用夜间模式css。 文件sitejs/.js 和sitecss/.css, sitecss/.js可作用于一切非http url(本地文件,浏览器界面等)。
+
+
+ -
+
装载网站离线资源
+ /zh/offlinecache/
+ Mon, 01 Jan 0001 00:00:00 +0000
+
+ /zh/offlinecache/
uweb浏览器支持装载网站离线资源。只需要将离线资源存为文件"/sdcard/uweb/sitecache/[域名]/[全部路径,包括文件名,?,&,=, 与url一模一样]"。如果应用内部目录有文件夹"sitejs"存在,则“/sdcard/uweb”下的离线资源不再生效,此时生效离线资源为内部目录下的"sitecache"文件夹。
打开选项以后超微将自动装载这些离线资源。
离线资源可作为缓存提高浏览器性能; 可作为国外网站部分备份修复服务访问; 也可替换部分网站资源达到定制网站的作用。
diff --git a/links/index.html b/zh/links/index.html
similarity index 93%
rename from links/index.html
rename to zh/links/index.html
index 496e121e..0c067574 100644
--- a/links/index.html
+++ b/zh/links/index.html
@@ -6,10 +6,20 @@
常用链接
+
diff --git a/loadbt/index.html b/zh/loadbt/index.html
similarity index 84%
rename from loadbt/index.html
rename to zh/loadbt/index.html
index 66d27958..e8f90898 100644
--- a/loadbt/index.html
+++ b/zh/loadbt/index.html
@@ -6,10 +6,20 @@
离线下载
+
diff --git a/logcat/index.html b/zh/logcat/index.html
similarity index 79%
rename from logcat/index.html
rename to zh/logcat/index.html
index ffac7516..f4760a4a 100644
--- a/logcat/index.html
+++ b/zh/logcat/index.html
@@ -6,10 +6,20 @@
安卓系统出错诊断
+
diff --git a/longclick/index.html b/zh/longclick/index.html
similarity index 77%
rename from longclick/index.html
rename to zh/longclick/index.html
index bda34bfc..a01c4637 100644
--- a/longclick/index.html
+++ b/zh/longclick/index.html
@@ -6,10 +6,20 @@
长按链接弹出菜单
+
diff --git a/multiaccount/index.html b/zh/multiaccount/index.html
similarity index 80%
rename from multiaccount/index.html
rename to zh/multiaccount/index.html
index 3a0f83b4..6935058a 100644
--- a/multiaccount/index.html
+++ b/zh/multiaccount/index.html
@@ -6,10 +6,20 @@
利用多账号登录获取资源
+
diff --git a/offlinecache/index.html b/zh/offlinecache/index.html
similarity index 82%
rename from offlinecache/index.html
rename to zh/offlinecache/index.html
index 53b65407..a992a540 100644
--- a/offlinecache/index.html
+++ b/zh/offlinecache/index.html
@@ -6,10 +6,20 @@
装载网站离线资源
+
diff --git a/pccopy/index.html b/zh/pccopy/index.html
similarity index 92%
rename from pccopy/index.html
rename to zh/pccopy/index.html
index f303dfab..37ac4864 100644
--- a/pccopy/index.html
+++ b/zh/pccopy/index.html
@@ -6,10 +6,20 @@
操作选中(富)文本/元素
+
diff --git a/pcdown/index.html b/zh/pcdown/index.html
similarity index 83%
rename from pcdown/index.html
rename to zh/pcdown/index.html
index 50e5abc8..540f3161 100644
--- a/pcdown/index.html
+++ b/zh/pcdown/index.html
@@ -6,10 +6,20 @@
浏览器一键控制台式机/服务器下载资源
+
diff --git a/redirect/index.html b/zh/redirect/index.html
similarity index 88%
rename from redirect/index.html
rename to zh/redirect/index.html
index a3f55c7a..7e029ef0 100644
--- a/redirect/index.html
+++ b/zh/redirect/index.html
@@ -6,10 +6,20 @@
重定向国外网址至国内镜像(附编辑本地文件)
+
diff --git a/searchcat/index.html b/zh/searchcat/index.html
similarity index 80%
rename from searchcat/index.html
rename to zh/searchcat/index.html
index f1e570dc..091df821 100644
--- a/searchcat/index.html
+++ b/zh/searchcat/index.html
@@ -6,10 +6,20 @@
分类多引擎搜索
+
diff --git a/searchurl/ace.js b/zh/searchurl/ace.js
similarity index 100%
rename from searchurl/ace.js
rename to zh/searchurl/ace.js
diff --git a/searchurl/ace_t.html b/zh/searchurl/ace_t.html
similarity index 100%
rename from searchurl/ace_t.html
rename to zh/searchurl/ace_t.html
diff --git a/searchurl/alipay.png b/zh/searchurl/alipay.png
similarity index 100%
rename from searchurl/alipay.png
rename to zh/searchurl/alipay.png
diff --git a/searchurl/backup.html b/zh/searchurl/backup.html
similarity index 100%
rename from searchurl/backup.html
rename to zh/searchurl/backup.html
diff --git a/searchurl/bin/tdict.tar.gz b/zh/searchurl/bin/tdict.tar.gz
similarity index 100%
rename from searchurl/bin/tdict.tar.gz
rename to zh/searchurl/bin/tdict.tar.gz
diff --git a/searchurl/bml/content/comparecells.js b/zh/searchurl/bml/content/comparecells.js
similarity index 100%
rename from searchurl/bml/content/comparecells.js
rename to zh/searchurl/bml/content/comparecells.js
diff --git a/searchurl/bml/content/designmode.js b/zh/searchurl/bml/content/designmode.js
similarity index 100%
rename from searchurl/bml/content/designmode.js
rename to zh/searchurl/bml/content/designmode.js
diff --git a/searchurl/bml/content/freeviddy.js b/zh/searchurl/bml/content/freeviddy.js
similarity index 100%
rename from searchurl/bml/content/freeviddy.js
rename to zh/searchurl/bml/content/freeviddy.js
diff --git a/searchurl/bml/content/fullimg.js b/zh/searchurl/bml/content/fullimg.js
similarity index 100%
rename from searchurl/bml/content/fullimg.js
rename to zh/searchurl/bml/content/fullimg.js
diff --git a/searchurl/bml/content/read.js b/zh/searchurl/bml/content/read.js
similarity index 100%
rename from searchurl/bml/content/read.js
rename to zh/searchurl/bml/content/read.js
diff --git a/searchurl/bml/content/rmi.js b/zh/searchurl/bml/content/rmi.js
similarity index 100%
rename from searchurl/bml/content/rmi.js
rename to zh/searchurl/bml/content/rmi.js
diff --git a/searchurl/bml/content/rmo.js b/zh/searchurl/bml/content/rmo.js
similarity index 100%
rename from searchurl/bml/content/rmo.js
rename to zh/searchurl/bml/content/rmo.js
diff --git a/searchurl/bml/content/vidspeed.js b/zh/searchurl/bml/content/vidspeed.js
similarity index 100%
rename from searchurl/bml/content/vidspeed.js
rename to zh/searchurl/bml/content/vidspeed.js
diff --git a/searchurl/bookmark/novel.html b/zh/searchurl/bookmark/novel.html
similarity index 100%
rename from searchurl/bookmark/novel.html
rename to zh/searchurl/bookmark/novel.html
diff --git a/searchurl/bookmark/viewtxt.html b/zh/searchurl/bookmark/viewtxt.html
similarity index 100%
rename from searchurl/bookmark/viewtxt.html
rename to zh/searchurl/bookmark/viewtxt.html
diff --git a/searchurl/cmds.html b/zh/searchurl/cmds.html
similarity index 100%
rename from searchurl/cmds.html
rename to zh/searchurl/cmds.html
diff --git a/searchurl/config.html b/zh/searchurl/config.html
similarity index 100%
rename from searchurl/config.html
rename to zh/searchurl/config.html
diff --git a/searchurl/config.js b/zh/searchurl/config.js
similarity index 100%
rename from searchurl/config.js
rename to zh/searchurl/config.js
diff --git a/searchurl/default.hosts.tar.gz b/zh/searchurl/default.hosts.tar.gz
similarity index 100%
rename from searchurl/default.hosts.tar.gz
rename to zh/searchurl/default.hosts.tar.gz
diff --git a/searchurl/donate.html b/zh/searchurl/donate.html
similarity index 100%
rename from searchurl/donate.html
rename to zh/searchurl/donate.html
diff --git a/searchurl/func.html b/zh/searchurl/func.html
similarity index 100%
rename from searchurl/func.html
rename to zh/searchurl/func.html
diff --git a/searchurl/homescreen.html b/zh/searchurl/homescreen.html
similarity index 100%
rename from searchurl/homescreen.html
rename to zh/searchurl/homescreen.html
diff --git a/searchurl/input.html b/zh/searchurl/input.html
similarity index 100%
rename from searchurl/input.html
rename to zh/searchurl/input.html
diff --git a/searchurl/js/beep.js b/zh/searchurl/js/beep.js
similarity index 100%
rename from searchurl/js/beep.js
rename to zh/searchurl/js/beep.js
diff --git a/searchurl/plugins.html b/zh/searchurl/plugins.html
similarity index 100%
rename from searchurl/plugins.html
rename to zh/searchurl/plugins.html
diff --git a/searchurl/privacy.html b/zh/searchurl/privacy.html
similarity index 100%
rename from searchurl/privacy.html
rename to zh/searchurl/privacy.html
diff --git a/searchurl/quickstart.html b/zh/searchurl/quickstart.html
similarity index 100%
rename from searchurl/quickstart.html
rename to zh/searchurl/quickstart.html
diff --git a/searchurl/res.html b/zh/searchurl/res.html
similarity index 100%
rename from searchurl/res.html
rename to zh/searchurl/res.html
diff --git a/searchurl/rjs.html b/zh/searchurl/rjs.html
similarity index 100%
rename from searchurl/rjs.html
rename to zh/searchurl/rjs.html
diff --git a/searchurl/script/axel.sh b/zh/searchurl/script/axel.sh
similarity index 100%
rename from searchurl/script/axel.sh
rename to zh/searchurl/script/axel.sh
diff --git a/searchurl/script/baidupcs.sh b/zh/searchurl/script/baidupcs.sh
similarity index 100%
rename from searchurl/script/baidupcs.sh
rename to zh/searchurl/script/baidupcs.sh
diff --git a/searchurl/script/bc.sh b/zh/searchurl/script/bc.sh
similarity index 100%
rename from searchurl/script/bc.sh
rename to zh/searchurl/script/bc.sh
diff --git a/searchurl/script/disable_sh.sh b/zh/searchurl/script/disable_sh.sh
similarity index 100%
rename from searchurl/script/disable_sh.sh
rename to zh/searchurl/script/disable_sh.sh
diff --git a/searchurl/script/filecap_app.sh b/zh/searchurl/script/filecap_app.sh
similarity index 100%
rename from searchurl/script/filecap_app.sh
rename to zh/searchurl/script/filecap_app.sh
diff --git a/searchurl/script/filecap_microsoft.sh b/zh/searchurl/script/filecap_microsoft.sh
similarity index 100%
rename from searchurl/script/filecap_microsoft.sh
rename to zh/searchurl/script/filecap_microsoft.sh
diff --git a/searchurl/script/filecap_search.sh b/zh/searchurl/script/filecap_search.sh
similarity index 100%
rename from searchurl/script/filecap_search.sh
rename to zh/searchurl/script/filecap_search.sh
diff --git a/searchurl/script/filecap_sh.sh b/zh/searchurl/script/filecap_sh.sh
similarity index 100%
rename from searchurl/script/filecap_sh.sh
rename to zh/searchurl/script/filecap_sh.sh
diff --git a/searchurl/script/filecap_tar.sh b/zh/searchurl/script/filecap_tar.sh
similarity index 100%
rename from searchurl/script/filecap_tar.sh
rename to zh/searchurl/script/filecap_tar.sh
diff --git a/searchurl/script/filecap_ziprar.sh b/zh/searchurl/script/filecap_ziprar.sh
similarity index 100%
rename from searchurl/script/filecap_ziprar.sh
rename to zh/searchurl/script/filecap_ziprar.sh
diff --git a/searchurl/script/gnuplot.sh b/zh/searchurl/script/gnuplot.sh
similarity index 100%
rename from searchurl/script/gnuplot.sh
rename to zh/searchurl/script/gnuplot.sh
diff --git a/searchurl/script/histuniq.sh b/zh/searchurl/script/histuniq.sh
similarity index 100%
rename from searchurl/script/histuniq.sh
rename to zh/searchurl/script/histuniq.sh
diff --git a/searchurl/script/hosts_ad.sh b/zh/searchurl/script/hosts_ad.sh
similarity index 100%
rename from searchurl/script/hosts_ad.sh
rename to zh/searchurl/script/hosts_ad.sh
diff --git a/searchurl/script/js_caiyun.sh b/zh/searchurl/script/js_caiyun.sh
similarity index 100%
rename from searchurl/script/js_caiyun.sh
rename to zh/searchurl/script/js_caiyun.sh
diff --git a/searchurl/script/xzdic.sh b/zh/searchurl/script/xzdic.sh
similarity index 100%
rename from searchurl/script/xzdic.sh
rename to zh/searchurl/script/xzdic.sh
diff --git a/searchurl/script/xzgrep.sh b/zh/searchurl/script/xzgrep.sh
similarity index 100%
rename from searchurl/script/xzgrep.sh
rename to zh/searchurl/script/xzgrep.sh
diff --git a/searchurl/sdcard/uweb/bookmark/movie_zh.search b/zh/searchurl/sdcard/uweb/bookmark/movie_zh.search
similarity index 100%
rename from searchurl/sdcard/uweb/bookmark/movie_zh.search
rename to zh/searchurl/sdcard/uweb/bookmark/movie_zh.search
diff --git a/searchurl/sdcard/uweb/bookmark/novel_zh.search b/zh/searchurl/sdcard/uweb/bookmark/novel_zh.search
similarity index 100%
rename from searchurl/sdcard/uweb/bookmark/novel_zh.search
rename to zh/searchurl/sdcard/uweb/bookmark/novel_zh.search
diff --git a/searchurl/sdcard/uweb/default.hosts b/zh/searchurl/sdcard/uweb/default.hosts
similarity index 100%
rename from searchurl/sdcard/uweb/default.hosts
rename to zh/searchurl/sdcard/uweb/default.hosts
diff --git a/searchurl/search.html b/zh/searchurl/search.html
similarity index 100%
rename from searchurl/search.html
rename to zh/searchurl/search.html
diff --git a/searchurl/searchcat.tar.gz b/zh/searchurl/searchcat.tar.gz
similarity index 100%
rename from searchurl/searchcat.tar.gz
rename to zh/searchurl/searchcat.tar.gz
diff --git a/searchurl/sitecss/m.baidu.com.css b/zh/searchurl/sitecss/m.baidu.com.css
similarity index 100%
rename from searchurl/sitecss/m.baidu.com.css
rename to zh/searchurl/sitecss/m.baidu.com.css
diff --git a/searchurl/sitejs/m.baidu.com.js b/zh/searchurl/sitejs/m.baidu.com.js
similarity index 100%
rename from searchurl/sitejs/m.baidu.com.js
rename to zh/searchurl/sitejs/m.baidu.com.js
diff --git a/searchurl/template/backup.html b/zh/searchurl/template/backup.html
similarity index 100%
rename from searchurl/template/backup.html
rename to zh/searchurl/template/backup.html
diff --git a/searchurl/template/config.html b/zh/searchurl/template/config.html
similarity index 100%
rename from searchurl/template/config.html
rename to zh/searchurl/template/config.html
diff --git a/searchurl/template/font.css b/zh/searchurl/template/font.css
similarity index 100%
rename from searchurl/template/font.css
rename to zh/searchurl/template/font.css
diff --git a/searchurl/template/home.css b/zh/searchurl/template/home.css
similarity index 100%
rename from searchurl/template/home.css
rename to zh/searchurl/template/home.css
diff --git a/searchurl/template/refresh.html b/zh/searchurl/template/refresh.html
similarity index 100%
rename from searchurl/template/refresh.html
rename to zh/searchurl/template/refresh.html
diff --git a/searchurl/textarea.js b/zh/searchurl/textarea.js
similarity index 100%
rename from searchurl/textarea.js
rename to zh/searchurl/textarea.js
diff --git a/searchurl/textarea_t.html b/zh/searchurl/textarea_t.html
similarity index 100%
rename from searchurl/textarea_t.html
rename to zh/searchurl/textarea_t.html
diff --git a/searchurl/txt/accusoft.html b/zh/searchurl/txt/accusoft.html
similarity index 100%
rename from searchurl/txt/accusoft.html
rename to zh/searchurl/txt/accusoft.html
diff --git a/searchurl/txt/checked.js b/zh/searchurl/txt/checked.js
similarity index 100%
rename from searchurl/txt/checked.js
rename to zh/searchurl/txt/checked.js
diff --git a/searchurl/txt/clearfont.css b/zh/searchurl/txt/clearfont.css
similarity index 100%
rename from searchurl/txt/clearfont.css
rename to zh/searchurl/txt/clearfont.css
diff --git a/searchurl/txt/cmds.cfg b/zh/searchurl/txt/cmds.cfg
similarity index 100%
rename from searchurl/txt/cmds.cfg
rename to zh/searchurl/txt/cmds.cfg
diff --git a/searchurl/txt/default.rc b/zh/searchurl/txt/default.rc
similarity index 100%
rename from searchurl/txt/default.rc
rename to zh/searchurl/txt/default.rc
diff --git a/searchurl/txt/djvu.html b/zh/searchurl/txt/djvu.html
similarity index 100%
rename from searchurl/txt/djvu.html
rename to zh/searchurl/txt/djvu.html
diff --git a/searchurl/txt/dplayer.html b/zh/searchurl/txt/dplayer.html
similarity index 100%
rename from searchurl/txt/dplayer.html
rename to zh/searchurl/txt/dplayer.html
diff --git a/searchurl/txt/epub.html b/zh/searchurl/txt/epub.html
similarity index 100%
rename from searchurl/txt/epub.html
rename to zh/searchurl/txt/epub.html
diff --git a/searchurl/txt/filecap.cfg b/zh/searchurl/txt/filecap.cfg
similarity index 100%
rename from searchurl/txt/filecap.cfg
rename to zh/searchurl/txt/filecap.cfg
diff --git a/searchurl/txt/filecap_css.cfg b/zh/searchurl/txt/filecap_css.cfg
similarity index 100%
rename from searchurl/txt/filecap_css.cfg
rename to zh/searchurl/txt/filecap_css.cfg
diff --git a/searchurl/txt/filecap_video.cfg b/zh/searchurl/txt/filecap_video.cfg
similarity index 100%
rename from searchurl/txt/filecap_video.cfg
rename to zh/searchurl/txt/filecap_video.cfg
diff --git a/searchurl/txt/link.cfg b/zh/searchurl/txt/link.cfg
similarity index 100%
rename from searchurl/txt/link.cfg
rename to zh/searchurl/txt/link.cfg
diff --git a/searchurl/txt/magnet.search b/zh/searchurl/txt/magnet.search
similarity index 100%
rename from searchurl/txt/magnet.search
rename to zh/searchurl/txt/magnet.search
diff --git a/searchurl/txt/margintop.css b/zh/searchurl/txt/margintop.css
similarity index 100%
rename from searchurl/txt/margintop.css
rename to zh/searchurl/txt/margintop.css
diff --git a/searchurl/txt/markdeep.html b/zh/searchurl/txt/markdeep.html
similarity index 100%
rename from searchurl/txt/markdeep.html
rename to zh/searchurl/txt/markdeep.html
diff --git a/searchurl/txt/mdict.html b/zh/searchurl/txt/mdict.html
similarity index 100%
rename from searchurl/txt/mdict.html
rename to zh/searchurl/txt/mdict.html
diff --git a/searchurl/txt/nav.cfg b/zh/searchurl/txt/nav.cfg
similarity index 100%
rename from searchurl/txt/nav.cfg
rename to zh/searchurl/txt/nav.cfg
diff --git a/searchurl/txt/night.css b/zh/searchurl/txt/night.css
similarity index 100%
rename from searchurl/txt/night.css
rename to zh/searchurl/txt/night.css
diff --git a/searchurl/txt/night1.css b/zh/searchurl/txt/night1.css
similarity index 100%
rename from searchurl/txt/night1.css
rename to zh/searchurl/txt/night1.css
diff --git a/searchurl/txt/night_old.css b/zh/searchurl/txt/night_old.css
similarity index 100%
rename from searchurl/txt/night_old.css
rename to zh/searchurl/txt/night_old.css
diff --git a/searchurl/txt/offline.link b/zh/searchurl/txt/offline.link
similarity index 100%
rename from searchurl/txt/offline.link
rename to zh/searchurl/txt/offline.link
diff --git a/searchurl/txt/onlyimg.css b/zh/searchurl/txt/onlyimg.css
similarity index 100%
rename from searchurl/txt/onlyimg.css
rename to zh/searchurl/txt/onlyimg.css
diff --git a/searchurl/txt/passwdsave.js b/zh/searchurl/txt/passwdsave.js
similarity index 100%
rename from searchurl/txt/passwdsave.js
rename to zh/searchurl/txt/passwdsave.js
diff --git a/searchurl/txt/pdfviewer.html b/zh/searchurl/txt/pdfviewer.html
similarity index 100%
rename from searchurl/txt/pdfviewer.html
rename to zh/searchurl/txt/pdfviewer.html
diff --git a/searchurl/txt/pdfviewer.js b/zh/searchurl/txt/pdfviewer.js
similarity index 100%
rename from searchurl/txt/pdfviewer.js
rename to zh/searchurl/txt/pdfviewer.js
diff --git a/searchurl/txt/plyr.cfg b/zh/searchurl/txt/plyr.cfg
similarity index 100%
rename from searchurl/txt/plyr.cfg
rename to zh/searchurl/txt/plyr.cfg
diff --git a/searchurl/txt/query.autoc b/zh/searchurl/txt/query.autoc
similarity index 100%
rename from searchurl/txt/query.autoc
rename to zh/searchurl/txt/query.autoc
diff --git a/searchurl/txt/redirect.cfg b/zh/searchurl/txt/redirect.cfg
similarity index 100%
rename from searchurl/txt/redirect.cfg
rename to zh/searchurl/txt/redirect.cfg
diff --git a/searchurl/txt/rjs.cfg b/zh/searchurl/txt/rjs.cfg
similarity index 100%
rename from searchurl/txt/rjs.cfg
rename to zh/searchurl/txt/rjs.cfg
diff --git a/searchurl/txt/select.cfg b/zh/searchurl/txt/select.cfg
similarity index 100%
rename from searchurl/txt/select.cfg
rename to zh/searchurl/txt/select.cfg
diff --git a/searchurl/txt/txtview.html b/zh/searchurl/txt/txtview.html
similarity index 100%
rename from searchurl/txt/txtview.html
rename to zh/searchurl/txt/txtview.html
diff --git a/searchurl/txt/videojs.html b/zh/searchurl/txt/videojs.html
similarity index 100%
rename from searchurl/txt/videojs.html
rename to zh/searchurl/txt/videojs.html
diff --git a/searchurl/txt/videoplay.js b/zh/searchurl/txt/videoplay.js
similarity index 100%
rename from searchurl/txt/videoplay.js
rename to zh/searchurl/txt/videoplay.js
diff --git a/searchurl/uas.html b/zh/searchurl/uas.html
similarity index 100%
rename from searchurl/uas.html
rename to zh/searchurl/uas.html
diff --git a/searchurl/urls.html b/zh/searchurl/urls.html
similarity index 100%
rename from searchurl/urls.html
rename to zh/searchurl/urls.html
diff --git a/searchurl/useragreement.html b/zh/searchurl/useragreement.html
similarity index 100%
rename from searchurl/useragreement.html
rename to zh/searchurl/useragreement.html
diff --git a/searchurl/v541.search b/zh/searchurl/v541.search
similarity index 100%
rename from searchurl/v541.search
rename to zh/searchurl/v541.search
diff --git a/searchurl/v678.search b/zh/searchurl/v678.search
similarity index 100%
rename from searchurl/v678.search
rename to zh/searchurl/v678.search
diff --git a/searchurl/weixin.png b/zh/searchurl/weixin.png
similarity index 100%
rename from searchurl/weixin.png
rename to zh/searchurl/weixin.png
diff --git a/sitejs/index.html b/zh/sitejs/index.html
similarity index 84%
rename from sitejs/index.html
rename to zh/sitejs/index.html
index f6f20f78..80c55dfc 100644
--- a/sitejs/index.html
+++ b/zh/sitejs/index.html
@@ -6,10 +6,20 @@
特定网址用户脚本及样式
+
diff --git a/zh/sitemap.xml b/zh/sitemap.xml
new file mode 100644
index 00000000..250c5036
--- /dev/null
+++ b/zh/sitemap.xml
@@ -0,0 +1,196 @@
+
+
+
+ /zh/
+ 2022-06-25T00:00:00+00:00
+
+
+
+ /zh/_posts/
+ 2022-06-25T00:00:00+00:00
+
+ /zh/adblock/
+ 2022-06-25T00:00:00+00:00
+
+ /zh/tags/javascript/
+ 2022-06-24T00:00:00+00:00
+
+ /zh/tags/
+ 2022-06-24T00:00:00+00:00
+
+
+
+ /zh/bookmarklet/
+ 2022-06-24T00:00:00+00:00
+
+ /zh/sitemap/
+ 2022-05-28T00:00:00+00:00
+
+ /zh/androidtv/
+ 2022-05-18T00:00:00+00:00
+
+ /zh/tags/css/
+ 2022-05-18T00:00:00+00:00
+
+ /zh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/
+ 2022-05-18T00:00:00+00:00
+
+ /zh/bookmark/
+ 2022-05-18T00:00:00+00:00
+
+ /zh/adblock_css/
+ 2022-05-18T00:00:00+00:00
+
+ /zh/links/
+ 2022-05-10T00:00:00+00:00
+
+ /zh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/
+ 2022-04-25T00:00:00+00:00
+
+ /zh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/
+ 2022-04-25T00:00:00+00:00
+
+ /zh/redirect/
+ 2022-04-25T00:00:00+00:00
+
+ /zh/tags/pc/
+ 2022-04-23T00:00:00+00:00
+
+ /zh/tags/ssh/
+ 2022-04-23T00:00:00+00:00
+
+ /zh/tags/termux/
+ 2022-04-23T00:00:00+00:00
+
+ /zh/tags/windows/
+ 2022-04-23T00:00:00+00:00
+
+ /zh/pccopy/
+ 2022-04-23T00:00:00+00:00
+
+ /zh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/
+ 2022-04-23T00:00:00+00:00
+
+ /zh/globalcss/
+ 2022-04-03T00:00:00+00:00
+
+ /zh/filenames/
+ 2022-03-18T00:00:00+00:00
+
+ /zh/filemanager/
+ 2022-02-11T00:00:00+00:00
+
+ /zh/bc/
+ 2022-02-10T00:00:00+00:00
+
+ /zh/icons/
+ 2022-02-06T00:00:00+00:00
+
+ /zh/tips/
+ 2021-11-01T00:00:00+00:00
+
+ /zh/tcron/
+ 2021-02-13T00:00:00+00:00
+
+ /zh/logcat/
+ 2020-12-28T00:00:00+00:00
+
+ /zh/tags/%E7%A6%BB%E7%BA%BF/
+ 2020-12-15T00:00:00+00:00
+
+ /zh/loadbt/
+ 2020-12-15T00:00:00+00:00
+
+ /zh/tags/%E7%BD%91%E7%9B%98/
+ 2020-12-15T00:00:00+00:00
+
+ /zh/tags/%E8%B5%84%E6%BA%90/
+ 2020-12-15T00:00:00+00:00
+
+ /zh/longclick/
+ 2020-11-06T00:00:00+00:00
+
+ /zh/video/
+ 2020-09-22T00:00:00+00:00
+
+ /zh/tags/%E6%90%9C%E7%B4%A2/
+ 2020-09-22T00:00:00+00:00
+
+ /zh/tags/tdict/
+ 2020-09-06T00:00:00+00:00
+
+ /zh/tags/tools/
+ 2020-09-06T00:00:00+00:00
+
+ /zh/tools/
+ 2020-09-06T00:00:00+00:00
+
+ /zh/tags/curl/
+ 2020-08-24T00:00:00+00:00
+
+ /zh/filecap/
+ 2020-08-24T00:00:00+00:00
+
+ /zh/html5/
+ 2020-08-20T00:00:00+00:00
+
+ /zh/gesture/
+ 2020-06-18T00:00:00+00:00
+
+ /zh/cmd/
+ 2018-01-20T00:00:00+00:00
+
+ /zh/categories/
+
+
+
+ /zh/urls/
+
+ /zh/tags/%E7%94%B5%E8%A7%86/
+
+ /zh/tvlive/
+
+ /zh/searchcat/
+
+ /zh/hosts/
+
+ /zh/adblock_domain/
+
+ /zh/multiaccount/
+
+ /zh/gnuplot/
+
+ /zh/pcdown/
+
+ /zh/sitejs/
+
+ /zh/tags/%E4%B8%8B%E8%BD%BD/
+
+ /zh/offlinecache/
+
+
diff --git a/sitemap/index.html b/zh/sitemap/index.html
similarity index 87%
rename from sitemap/index.html
rename to zh/sitemap/index.html
index 28cd7fe5..9722d5d8 100644
--- a/sitemap/index.html
+++ b/zh/sitemap/index.html
@@ -6,10 +6,20 @@
技巧网站导航
+
diff --git a/tags/css/index.html b/zh/tags/css/index.html
similarity index 59%
rename from tags/css/index.html
rename to zh/tags/css/index.html
index 480f5c5c..1f889d30 100644
--- a/tags/css/index.html
+++ b/zh/tags/css/index.html
@@ -6,10 +6,20 @@
css
+
diff --git a/tags/css/index.xml b/zh/tags/css/index.xml
similarity index 86%
rename from tags/css/index.xml
rename to zh/tags/css/index.xml
index 82dd810b..b9472117 100644
--- a/tags/css/index.xml
+++ b/zh/tags/css/index.xml
@@ -2,17 +2,16 @@
css on
- https://jamesfengcao.gitee.io/uwebzh/tags/css/
+ /zh/tags/css/
Recent content in css on
Hugo -- gohugo.io
- en-us
- Wed, 18 May 2022 00:00:00 +0000
+ Wed, 18 May 2022 00:00:00 +0000
-
利用用户自定义样式屏蔽不良信息
- https://jamesfengcao.gitee.io/uwebzh/adblock_css/
+ /zh/adblock_css/
Wed, 18 May 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/adblock_css/
+ /zh/adblock_css/
点击以下链接可安装全局样式,清后台重启浏览器,长按底部工具条窗口按钮弹出对话框后勾选上述文件名即可屏蔽不良信息。
floppymoose 广告屏蔽样式
gozer 广告屏蔽样式
@@ -22,10 +21,10 @@ gozer 广告屏蔽样式
-
特定网址用户脚本及样式
- https://jamesfengcao.gitee.io/uwebzh/sitejs/
+ /zh/sitejs/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/sitejs/
+ /zh/sitejs/
技巧等级:中级
脚本 (第一时间装载js脚本见下面sitecss条目)
脚本需命名为 "[根域名].js",譬如baidu.com.js 或tieba.baidu.com.js 。此脚本将自动作用于所有相同根域名的网址上。如有多个脚本满足条件,以最长文件名为准。 这些脚本需放到/sdcard/uweb/sitejs或/data/data/info.torapp.uweb/files/sitejs目录下,数量没有限制,上百万都不成问题。如果内部目录下sitejs存在,则/sdcard/uweb/sitejs不起任何作用。内部sitejs目录的存在同时也影响一切对安全敏感的资源(包括网站离线资源等)的配置,一旦内部sitejs目录存在,则这些资源必须位于内部目录才会生效。 长按窗口按钮,勾选“执行网址用户脚本”。 脚本执行对浏览器无性能影响,即使有百万脚本存在。 目前支持两段、三段及少数四段域名(最后两段不超过6字如com.cn的域名可取四段)。所以脚本请不要以很长的域名来命名。 样式及第一时间装载js脚本
diff --git a/tags/curl/index.html b/zh/tags/curl/index.html
similarity index 55%
rename from tags/curl/index.html
rename to zh/tags/curl/index.html
index 5e738365..76dc3b56 100644
--- a/tags/curl/index.html
+++ b/zh/tags/curl/index.html
@@ -6,10 +6,20 @@
curl
+
diff --git a/tags/curl/index.xml b/zh/tags/curl/index.xml
similarity index 89%
rename from tags/curl/index.xml
rename to zh/tags/curl/index.xml
index 8aba75e7..927d6387 100644
--- a/tags/curl/index.xml
+++ b/zh/tags/curl/index.xml
@@ -2,17 +2,16 @@
curl on
- https://jamesfengcao.gitee.io/uwebzh/tags/curl/
+ /zh/tags/curl/
Recent content in curl on
Hugo -- gohugo.io
- en-us
- Mon, 24 Aug 2020 00:00:00 +0000
+ Mon, 24 Aug 2020 00:00:00 +0000
-
利用文件预处理预览/查看/播放一切可下载资源
- https://jamesfengcao.gitee.io/uwebzh/filecap/
+ /zh/filecap/
Mon, 24 Aug 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/filecap/
+ /zh/filecap/
技巧等级:中级
文件预处理配置文件为/sdcard/uweb/default.filecap,每行格式如下:
[文件后缀]:[mimetype]:[处理命令]
diff --git a/tags/index.html b/zh/tags/index.html
similarity index 100%
rename from tags/index.html
rename to zh/tags/index.html
index f2ba4f41..71aaa01d 100644
--- a/tags/index.html
+++ b/zh/tags/index.html
@@ -21,26 +21,26 @@
Windows 1
- 下载 1
-
不良信息屏蔽 4
- 剪贴板 2
-
- 国外网址 2
-
- 搜索 2
-
电视 1
+ 国外网址 2
+
+ 剪贴板 2
+
离线 1
+ 搜索 2
+
网盘 1
- 资源 2
+ 下载 1
重定向 1
+ 资源 2
+
diff --git a/tags/index.xml b/zh/tags/index.xml
similarity index 50%
rename from tags/index.xml
rename to zh/tags/index.xml
index c64184dd..f829a6fe 100644
--- a/tags/index.xml
+++ b/zh/tags/index.xml
@@ -2,179 +2,178 @@
Tags on
- https://jamesfengcao.gitee.io/uwebzh/tags/
+ /zh/tags/
Recent content in Tags on
Hugo -- gohugo.io
- en-us
- Fri, 24 Jun 2022 00:00:00 +0000
+ Fri, 24 Jun 2022 00:00:00 +0000
-
javascript
- https://jamesfengcao.gitee.io/uwebzh/tags/javascript/
+ /zh/tags/javascript/
Fri, 24 Jun 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/javascript/
+ /zh/tags/javascript/
-
css
- https://jamesfengcao.gitee.io/uwebzh/tags/css/
+ /zh/tags/css/
Wed, 18 May 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/css/
+ /zh/tags/css/
-
不良信息屏蔽
- https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/
+ /zh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/
Wed, 18 May 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/
+ /zh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/
-
国外网址
- https://jamesfengcao.gitee.io/uwebzh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/
+ /zh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/
Mon, 25 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/
+ /zh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/
-
重定向
- https://jamesfengcao.gitee.io/uwebzh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/
+ /zh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/
Mon, 25 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/
+ /zh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/
-
PC
- https://jamesfengcao.gitee.io/uwebzh/tags/pc/
+ /zh/tags/pc/
Sat, 23 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/pc/
+ /zh/tags/pc/
-
ssh
- https://jamesfengcao.gitee.io/uwebzh/tags/ssh/
+ /zh/tags/ssh/
Sat, 23 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/ssh/
+ /zh/tags/ssh/
-
termux
- https://jamesfengcao.gitee.io/uwebzh/tags/termux/
+ /zh/tags/termux/
Sat, 23 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/termux/
+ /zh/tags/termux/
-
Windows
- https://jamesfengcao.gitee.io/uwebzh/tags/windows/
+ /zh/tags/windows/
Sat, 23 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/windows/
+ /zh/tags/windows/
-
剪贴板
- https://jamesfengcao.gitee.io/uwebzh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/
+ /zh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/
Sat, 23 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/
+ /zh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/
-
离线
- https://jamesfengcao.gitee.io/uwebzh/tags/%E7%A6%BB%E7%BA%BF/
+ /zh/tags/%E7%A6%BB%E7%BA%BF/
Tue, 15 Dec 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/%E7%A6%BB%E7%BA%BF/
+ /zh/tags/%E7%A6%BB%E7%BA%BF/
-
网盘
- https://jamesfengcao.gitee.io/uwebzh/tags/%E7%BD%91%E7%9B%98/
+ /zh/tags/%E7%BD%91%E7%9B%98/
Tue, 15 Dec 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/%E7%BD%91%E7%9B%98/
+ /zh/tags/%E7%BD%91%E7%9B%98/
-
资源
- https://jamesfengcao.gitee.io/uwebzh/tags/%E8%B5%84%E6%BA%90/
+ /zh/tags/%E8%B5%84%E6%BA%90/
Tue, 15 Dec 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/%E8%B5%84%E6%BA%90/
+ /zh/tags/%E8%B5%84%E6%BA%90/
-
搜索
- https://jamesfengcao.gitee.io/uwebzh/tags/%E6%90%9C%E7%B4%A2/
+ /zh/tags/%E6%90%9C%E7%B4%A2/
Tue, 22 Sep 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/%E6%90%9C%E7%B4%A2/
+ /zh/tags/%E6%90%9C%E7%B4%A2/
-
tdict
- https://jamesfengcao.gitee.io/uwebzh/tags/tdict/
+ /zh/tags/tdict/
Sun, 06 Sep 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/tdict/
+ /zh/tags/tdict/
-
tools
- https://jamesfengcao.gitee.io/uwebzh/tags/tools/
+ /zh/tags/tools/
Sun, 06 Sep 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/tools/
+ /zh/tags/tools/
-
curl
- https://jamesfengcao.gitee.io/uwebzh/tags/curl/
+ /zh/tags/curl/
Mon, 24 Aug 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/curl/
-
-
-
- -
-
下载
- https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8B%E8%BD%BD/
- Mon, 01 Jan 0001 00:00:00 +0000
-
- https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8B%E8%BD%BD/
+ /zh/tags/curl/
-
电视
- https://jamesfengcao.gitee.io/uwebzh/tags/%E7%94%B5%E8%A7%86/
+ /zh/tags/%E7%94%B5%E8%A7%86/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tags/%E7%94%B5%E8%A7%86/
+ /zh/tags/%E7%94%B5%E8%A7%86/
+
+
+
+ -
+
下载
+ /zh/tags/%E4%B8%8B%E8%BD%BD/
+ Mon, 01 Jan 0001 00:00:00 +0000
+
+ /zh/tags/%E4%B8%8B%E8%BD%BD/
diff --git a/tags/javascript/index.html b/zh/tags/javascript/index.html
similarity index 63%
rename from tags/javascript/index.html
rename to zh/tags/javascript/index.html
index 4c77ba34..8feed891 100644
--- a/tags/javascript/index.html
+++ b/zh/tags/javascript/index.html
@@ -6,10 +6,20 @@
javascript
+
diff --git a/tags/javascript/index.xml b/zh/tags/javascript/index.xml
similarity index 87%
rename from tags/javascript/index.xml
rename to zh/tags/javascript/index.xml
index ad859d9a..6af99fc7 100644
--- a/tags/javascript/index.xml
+++ b/zh/tags/javascript/index.xml
@@ -2,17 +2,16 @@
javascript on
- https://jamesfengcao.gitee.io/uwebzh/tags/javascript/
+ /zh/tags/javascript/
Recent content in javascript on
Hugo -- gohugo.io
- en-us
- Fri, 24 Jun 2022 00:00:00 +0000
+ Fri, 24 Jun 2022 00:00:00 +0000
-
小书签
- https://jamesfengcao.gitee.io/uwebzh/bookmarklet/
+ /zh/bookmarklet/
Fri, 24 Jun 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/bookmarklet/
+ /zh/bookmarklet/
超微浏览器支持直接运行远程网址上的小书签(Bookmarklet),将本页面或其它包含小书签网址加入书签。使用时只需长按小书签链接,点击“新窗口打开”,小书签将作用于超微浏览器最后一个窗口(非小书签窗口)页面上。
列出外部脚本
查看浏览器UA
@@ -37,10 +36,10 @@ BugMeNot
-
长按链接弹出菜单
- https://jamesfengcao.gitee.io/uwebzh/longclick/
+ /zh/longclick/
Fri, 06 Nov 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/longclick/
+ /zh/longclick/
长按链接运行第三方程序 配置文件/sdcard/uweb/default.longclick每行格式如下(同default.cmds)
菜单名:mimetype:命令路径
命令可以包含%c(当前网址cookie)等,执行时会被相应内容自动替换。
@@ -51,10 +50,10 @@ js文件格式如下:
-
特定网址用户脚本及样式
- https://jamesfengcao.gitee.io/uwebzh/sitejs/
+ /zh/sitejs/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/sitejs/
+ /zh/sitejs/
技巧等级:中级
脚本 (第一时间装载js脚本见下面sitecss条目)
脚本需命名为 "[根域名].js",譬如baidu.com.js 或tieba.baidu.com.js 。此脚本将自动作用于所有相同根域名的网址上。如有多个脚本满足条件,以最长文件名为准。 这些脚本需放到/sdcard/uweb/sitejs或/data/data/info.torapp.uweb/files/sitejs目录下,数量没有限制,上百万都不成问题。如果内部目录下sitejs存在,则/sdcard/uweb/sitejs不起任何作用。内部sitejs目录的存在同时也影响一切对安全敏感的资源(包括网站离线资源等)的配置,一旦内部sitejs目录存在,则这些资源必须位于内部目录才会生效。 长按窗口按钮,勾选“执行网址用户脚本”。 脚本执行对浏览器无性能影响,即使有百万脚本存在。 目前支持两段、三段及少数四段域名(最后两段不超过6字如com.cn的域名可取四段)。所以脚本请不要以很长的域名来命名。 样式及第一时间装载js脚本
diff --git a/tags/pc/index.html b/zh/tags/pc/index.html
similarity index 60%
rename from tags/pc/index.html
rename to zh/tags/pc/index.html
index ac17c827..adddc347 100644
--- a/tags/pc/index.html
+++ b/zh/tags/pc/index.html
@@ -6,10 +6,20 @@
PC
+
diff --git a/tags/pc/index.xml b/zh/tags/pc/index.xml
similarity index 92%
rename from tags/pc/index.xml
rename to zh/tags/pc/index.xml
index 1403466c..47e04cc8 100644
--- a/tags/pc/index.xml
+++ b/zh/tags/pc/index.xml
@@ -2,17 +2,16 @@
PC on
- https://jamesfengcao.gitee.io/uwebzh/tags/pc/
+ /zh/tags/pc/
Recent content in PC on
Hugo -- gohugo.io
- en-us
- Sat, 23 Apr 2022 00:00:00 +0000
+ Sat, 23 Apr 2022 00:00:00 +0000
-
操作选中(富)文本/元素
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
+ /zh/pccopy/
Sat, 23 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
+ /zh/pccopy/
点击以下链接可安装长按“链接”按钮菜单:
google划词翻译
bing翻译
@@ -53,10 +52,10 @@ pclip
-
浏览器一键控制台式机/服务器下载资源
- https://jamesfengcao.gitee.io/uwebzh/pcdown/
+ /zh/pcdown/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/pcdown/
+ /zh/pcdown/
技巧等级:高级
小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法:
手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令:
diff --git a/tags/ssh/index.html b/zh/tags/ssh/index.html
similarity index 64%
rename from tags/ssh/index.html
rename to zh/tags/ssh/index.html
index 1de0e4b9..2b6c8cbe 100644
--- a/tags/ssh/index.html
+++ b/zh/tags/ssh/index.html
@@ -6,10 +6,20 @@
ssh
+
diff --git a/tags/ssh/index.xml b/zh/tags/ssh/index.xml
similarity index 92%
rename from tags/ssh/index.xml
rename to zh/tags/ssh/index.xml
index 77b88af7..3a5f5ac0 100644
--- a/tags/ssh/index.xml
+++ b/zh/tags/ssh/index.xml
@@ -2,17 +2,16 @@
ssh on
- https://jamesfengcao.gitee.io/uwebzh/tags/ssh/
+ /zh/tags/ssh/
Recent content in ssh on
Hugo -- gohugo.io
- en-us
- Sat, 23 Apr 2022 00:00:00 +0000
+ Sat, 23 Apr 2022 00:00:00 +0000
-
操作选中(富)文本/元素
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
+ /zh/pccopy/
Sat, 23 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
+ /zh/pccopy/
点击以下链接可安装长按“链接”按钮菜单:
google划词翻译
bing翻译
@@ -53,10 +52,10 @@ pclip
-
一键执行任意预定义命令(附手机PC剪贴板互通)
- https://jamesfengcao.gitee.io/uwebzh/cmd/
+ /zh/cmd/
Sat, 20 Jan 2018 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/cmd/
+ /zh/cmd/
技巧等级:中级 PC剪贴板(高级)
uweb浏览器支持一键执行任意预定义命令,这些命令可以与剪贴板交互,可以将结果(文本、图像、音视频)输出到浏览器窗口。
手机推荐安装uweb定制Termux,否则能够执行的命令极其有限。
@@ -76,10 +75,10 @@ mimetype用来表示命令的输出类型。除了标准的mimetype之外,超
-
浏览器一键控制台式机/服务器下载资源
- https://jamesfengcao.gitee.io/uwebzh/pcdown/
+ /zh/pcdown/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/pcdown/
+ /zh/pcdown/
技巧等级:高级
小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法:
手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令:
diff --git a/tags/tdict/index.html b/zh/tags/tdict/index.html
similarity index 53%
rename from tags/tdict/index.html
rename to zh/tags/tdict/index.html
index ecc4dc68..9aacab76 100644
--- a/tags/tdict/index.html
+++ b/zh/tags/tdict/index.html
@@ -6,10 +6,20 @@
tdict
+
diff --git a/tags/tdict/index.xml b/zh/tags/tdict/index.xml
similarity index 84%
rename from tags/tdict/index.xml
rename to zh/tags/tdict/index.xml
index bc2d4460..366f5a31 100644
--- a/tags/tdict/index.xml
+++ b/zh/tags/tdict/index.xml
@@ -2,17 +2,16 @@
tdict on
- https://jamesfengcao.gitee.io/uwebzh/tags/tdict/
+ /zh/tags/tdict/
Recent content in tdict on
Hugo -- gohugo.io
- en-us
- Sun, 06 Sep 2020 00:00:00 +0000
+ Sun, 06 Sep 2020 00:00:00 +0000
-
工具汇总
- https://jamesfengcao.gitee.io/uwebzh/tools/
+ /zh/tools/
Sun, 06 Sep 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tools/
+ /zh/tools/
安装tdict检索工具 (本地检索,远程内容) 安装完tdict本地检索工具后,可选择性安装字典索引及对应的搜索引擎至主屏。以下引擎仅作测试使用。
安装双解字典索引
安装双解字典至主屏
diff --git a/tags/termux/index.html b/zh/tags/termux/index.html
similarity index 74%
rename from tags/termux/index.html
rename to zh/tags/termux/index.html
index 029219b6..69bd2445 100644
--- a/tags/termux/index.html
+++ b/zh/tags/termux/index.html
@@ -6,10 +6,20 @@
termux
+
diff --git a/tags/termux/index.xml b/zh/tags/termux/index.xml
similarity index 93%
rename from tags/termux/index.xml
rename to zh/tags/termux/index.xml
index 78854eb8..5ad576ad 100644
--- a/tags/termux/index.xml
+++ b/zh/tags/termux/index.xml
@@ -2,17 +2,16 @@
termux on
- https://jamesfengcao.gitee.io/uwebzh/tags/termux/
+ /zh/tags/termux/
Recent content in termux on
Hugo -- gohugo.io
- en-us
- Sat, 23 Apr 2022 00:00:00 +0000
+ Sat, 23 Apr 2022 00:00:00 +0000
-
操作选中(富)文本/元素
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
+ /zh/pccopy/
Sat, 23 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
+ /zh/pccopy/
点击以下链接可安装长按“链接”按钮菜单:
google划词翻译
bing翻译
@@ -53,10 +52,10 @@ pclip
-
离线下载
- https://jamesfengcao.gitee.io/uwebzh/loadbt/
+ /zh/loadbt/
Tue, 15 Dec 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/loadbt/
+ /zh/loadbt/
seedr用户可使用常用链接利用seedr离线下载。使用时长按链接->命令->seedr离线...。 Telegram用户可使用特色服务利用tg bot离线下载至bot支持网盘。使用时长按链接->命令->tg...。 百度网盘存储空间大,但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。
本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。
超微浏览器上配置百度离线下载
@@ -77,10 +76,10 @@ BaiduPCS-Go config set -appid=266719
-
工具汇总
- https://jamesfengcao.gitee.io/uwebzh/tools/
+ /zh/tools/
Sun, 06 Sep 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tools/
+ /zh/tools/
安装tdict检索工具 (本地检索,远程内容) 安装完tdict本地检索工具后,可选择性安装字典索引及对应的搜索引擎至主屏。以下引擎仅作测试使用。
安装双解字典索引
安装双解字典至主屏
@@ -111,10 +110,10 @@ Merriam Webster Unabridged
-
利用文件预处理预览/查看/播放一切可下载资源
- https://jamesfengcao.gitee.io/uwebzh/filecap/
+ /zh/filecap/
Mon, 24 Aug 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/filecap/
+ /zh/filecap/
技巧等级:中级
文件预处理配置文件为/sdcard/uweb/default.filecap,每行格式如下:
[文件后缀]:[mimetype]:[处理命令]
@@ -131,10 +130,10 @@ pdf:uweb:echo file:///sdcard/uweb/app/pdf.js/web/viewer.html?file=%u djvu:uweb:e
-
一键执行任意预定义命令(附手机PC剪贴板互通)
- https://jamesfengcao.gitee.io/uwebzh/cmd/
+ /zh/cmd/
Sat, 20 Jan 2018 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/cmd/
+ /zh/cmd/
技巧等级:中级 PC剪贴板(高级)
uweb浏览器支持一键执行任意预定义命令,这些命令可以与剪贴板交互,可以将结果(文本、图像、音视频)输出到浏览器窗口。
手机推荐安装uweb定制Termux,否则能够执行的命令极其有限。
@@ -154,10 +153,10 @@ mimetype用来表示命令的输出类型。除了标准的mimetype之外,超
-
利用浏览器地址栏对函数作图
- https://jamesfengcao.gitee.io/uwebzh/gnuplot/
+ /zh/gnuplot/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/gnuplot/
+ /zh/gnuplot/
使用Android端uweb浏览器。
Termux提供了方便的软件包管理系统,缺省的uWeb地址栏功能配置需用到作图软件gnuplot。
安装gnuplot 安装 uweb定制Termux应用 Termux下运行以下命令:
@@ -172,10 +171,10 @@ gnuplot -e 'set term svg;set output; plot x'
-
浏览器一键控制台式机/服务器下载资源
- https://jamesfengcao.gitee.io/uwebzh/pcdown/
+ /zh/pcdown/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/pcdown/
+ /zh/pcdown/
技巧等级:高级
小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法:
手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令:
diff --git a/tags/tools/index.html b/zh/tags/tools/index.html
similarity index 53%
rename from tags/tools/index.html
rename to zh/tags/tools/index.html
index 0952739d..65754f8e 100644
--- a/tags/tools/index.html
+++ b/zh/tags/tools/index.html
@@ -6,10 +6,20 @@
tools
+
diff --git a/tags/tools/index.xml b/zh/tags/tools/index.xml
similarity index 84%
rename from tags/tools/index.xml
rename to zh/tags/tools/index.xml
index 8cafc46c..134d4cb6 100644
--- a/tags/tools/index.xml
+++ b/zh/tags/tools/index.xml
@@ -2,17 +2,16 @@
tools on
- https://jamesfengcao.gitee.io/uwebzh/tags/tools/
+ /zh/tags/tools/
Recent content in tools on
Hugo -- gohugo.io
- en-us
- Sun, 06 Sep 2020 00:00:00 +0000
+ Sun, 06 Sep 2020 00:00:00 +0000
-
工具汇总
- https://jamesfengcao.gitee.io/uwebzh/tools/
+ /zh/tools/
Sun, 06 Sep 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tools/
+ /zh/tools/
安装tdict检索工具 (本地检索,远程内容) 安装完tdict本地检索工具后,可选择性安装字典索引及对应的搜索引擎至主屏。以下引擎仅作测试使用。
安装双解字典索引
安装双解字典至主屏
diff --git a/tags/windows/index.html b/zh/tags/windows/index.html
similarity index 54%
rename from tags/windows/index.html
rename to zh/tags/windows/index.html
index 4c7c9edb..793f8e0e 100644
--- a/tags/windows/index.html
+++ b/zh/tags/windows/index.html
@@ -6,10 +6,20 @@
Windows
+
diff --git a/tags/windows/index.xml b/zh/tags/windows/index.xml
similarity index 91%
rename from tags/windows/index.xml
rename to zh/tags/windows/index.xml
index 5ab7a2dc..cbfc7966 100644
--- a/tags/windows/index.xml
+++ b/zh/tags/windows/index.xml
@@ -2,17 +2,16 @@
Windows on
- https://jamesfengcao.gitee.io/uwebzh/tags/windows/
+ /zh/tags/windows/
Recent content in Windows on
Hugo -- gohugo.io
- en-us
- Sat, 23 Apr 2022 00:00:00 +0000
+ Sat, 23 Apr 2022 00:00:00 +0000
-
操作选中(富)文本/元素
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
+ /zh/pccopy/
Sat, 23 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
+ /zh/pccopy/
点击以下链接可安装长按“链接”按钮菜单:
google划词翻译
bing翻译
diff --git a/tags/下载/index.html b/zh/tags/下载/index.html
similarity index 55%
rename from tags/下载/index.html
rename to zh/tags/下载/index.html
index ca8ac72f..0d139e2c 100644
--- a/tags/下载/index.html
+++ b/zh/tags/下载/index.html
@@ -6,10 +6,20 @@
下载
+
diff --git a/tags/下载/index.xml b/zh/tags/下载/index.xml
similarity index 82%
rename from tags/下载/index.xml
rename to zh/tags/下载/index.xml
index b12cb6be..b019ec98 100644
--- a/tags/下载/index.xml
+++ b/zh/tags/下载/index.xml
@@ -2,16 +2,15 @@
下载 on
- https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8B%E8%BD%BD/
+ /zh/tags/%E4%B8%8B%E8%BD%BD/
Recent content in 下载 on
- Hugo -- gohugo.io
- en-us
+ Hugo -- gohugo.io
-
浏览器一键控制台式机/服务器下载资源
- https://jamesfengcao.gitee.io/uwebzh/pcdown/
+ /zh/pcdown/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/pcdown/
+ /zh/pcdown/
技巧等级:高级
小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法:
手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令:
diff --git a/tags/不良信息屏蔽/index.html b/zh/tags/不良信息屏蔽/index.html
similarity index 67%
rename from tags/不良信息屏蔽/index.html
rename to zh/tags/不良信息屏蔽/index.html
index 72670333..07309a36 100644
--- a/tags/不良信息屏蔽/index.html
+++ b/zh/tags/不良信息屏蔽/index.html
@@ -6,10 +6,20 @@
不良信息屏蔽
+
diff --git a/tags/不良信息屏蔽/index.xml b/zh/tags/不良信息屏蔽/index.xml
similarity index 88%
rename from tags/不良信息屏蔽/index.xml
rename to zh/tags/不良信息屏蔽/index.xml
index b8df53b5..833de65f 100644
--- a/tags/不良信息屏蔽/index.xml
+++ b/zh/tags/不良信息屏蔽/index.xml
@@ -2,17 +2,16 @@
不良信息屏蔽 on
- https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/
+ /zh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/
Recent content in 不良信息屏蔽 on
Hugo -- gohugo.io
- en-us
- Wed, 18 May 2022 00:00:00 +0000
+ Wed, 18 May 2022 00:00:00 +0000
-
利用用户自定义样式屏蔽不良信息
- https://jamesfengcao.gitee.io/uwebzh/adblock_css/
+ /zh/adblock_css/
Wed, 18 May 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/adblock_css/
+ /zh/adblock_css/
点击以下链接可安装全局样式,清后台重启浏览器,长按底部工具条窗口按钮弹出对话框后勾选上述文件名即可屏蔽不良信息。
floppymoose 广告屏蔽样式
gozer 广告屏蔽样式
@@ -22,10 +21,10 @@ gozer 广告屏蔽样式
-
视频播放小窍门
- https://jamesfengcao.gitee.io/uwebzh/video/
+ /zh/video/
Tue, 22 Sep 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/video/
+ /zh/video/
覆盖安装全屏播放菜单示例:屏幕旋转,退出
本文以超微浏览器为例来说明。
创建文件"default.playrate"可定制全屏倍速播放菜单项,格式与文件default.link完全相同。倍速播放菜单链接部分为空,譬如".5x:",倍速菜单至少有一个。链接部分非空的菜单必须在所有倍速菜单之后。 长按设置按钮勾选“弹出视频地址”,则视频播放时会弹出真正的播放地址,点击地址播放可避免一切不良信息。如果点击后为下载操作,可长按链接分享给视频播放器。用户亦可配置在线播放或安装插件。嗅探的视频/资源类型可由文件“/sdcard/uweb/types.sniff”控制。 很多视频解析结果在UA为PC的情况下非常干净,没什么不良信息。故用户可在播放前切换UA至PC。如:wn.run/解析结果对PC非常干净。 某些视频网站在全屏播放时都会出现不良信息占住屏幕一部分。点击全屏播放之前,长按[☰]按钮,超微浏览器将弹出全局脚本菜单,勾选“移除浮动不良信息”后再点全屏播放则完美播放。 也可利用全屏播放屏蔽一切不良信息。方法如下: 长按[☰]按钮,勾选“全屏视频”。此选项将让无法全屏播放的网站强制允许全屏播放。 对无法全屏、无法放大的视频网站,可长按[☰]按钮,勾选“强制缩放”,然后手动放大至全屏。 灵活应用JS、图像开关屏蔽一切不良信息:视频搜索前关闭JS开关,进入播放网页前关闭图像显示并打开JS。 视频解析之电视剧: 首先在视频网站搜索电视剧片名,下面会显示不同的剧集,点击它们再用视频解析即可观看。如果直接点击电视剧用视频解析则每次播放均为第一集。 视频搜索预配置(超过400个引擎)
@@ -35,10 +34,10 @@ gozer 广告屏蔽样式
-
加速访问国外网站
- https://jamesfengcao.gitee.io/uwebzh/hosts/
+ /zh/hosts/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/hosts/
+ /zh/hosts/
不少国外网站本身虽可访问,但由于网站需要下载其它网址的资源而导致无法访问。根域名屏蔽可屏蔽文件中域名的一切子域名、孙域名、......,从而主动排除这些网址,最终允许浏览器快速访问。
使用Android端uweb浏览器。
域名文件内容如下:
@@ -57,10 +56,10 @@ fbcdn.net
-
绝杀完整域名树
- https://jamesfengcao.gitee.io/uwebzh/adblock_domain/
+ /zh/adblock_domain/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/adblock_domain/
+ /zh/adblock_domain/
域名文件可屏蔽文件中域名的一切子域名、孙域名、......,可彻底绝杀一切不良信息。所以用户屏蔽根域名时无需选择提示中出现的整个域名,只需选取最后两段或三段(最后两段不超过6字符如com.cn的域名可取四段)。
可使用列出外部脚本小书签生成外部js文件列表,然后长按底部工具栏"js"按钮,执行"网址转链接"菜单命令,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。
长按不良信息链接,点击“图片:屏蔽根域名”,修改弹出域名,一般取最后两段,点击"确定"屏蔽当前图片网址。
diff --git a/tags/剪贴板/index.html b/zh/tags/剪贴板/index.html
similarity index 60%
rename from tags/剪贴板/index.html
rename to zh/tags/剪贴板/index.html
index 4f154294..462c05e9 100644
--- a/tags/剪贴板/index.html
+++ b/zh/tags/剪贴板/index.html
@@ -6,10 +6,20 @@
剪贴板
+
diff --git a/tags/剪贴板/index.xml b/zh/tags/剪贴板/index.xml
similarity index 92%
rename from tags/剪贴板/index.xml
rename to zh/tags/剪贴板/index.xml
index 02cd8369..55f6a119 100644
--- a/tags/剪贴板/index.xml
+++ b/zh/tags/剪贴板/index.xml
@@ -2,17 +2,16 @@
剪贴板 on
- https://jamesfengcao.gitee.io/uwebzh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/
+ /zh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/
Recent content in 剪贴板 on
Hugo -- gohugo.io
- en-us
- Sat, 23 Apr 2022 00:00:00 +0000
+ Sat, 23 Apr 2022 00:00:00 +0000
-
操作选中(富)文本/元素
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
+ /zh/pccopy/
Sat, 23 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/pccopy/
+ /zh/pccopy/
点击以下链接可安装长按“链接”按钮菜单:
google划词翻译
bing翻译
@@ -53,10 +52,10 @@ pclip
-
一键执行任意预定义命令(附手机PC剪贴板互通)
- https://jamesfengcao.gitee.io/uwebzh/cmd/
+ /zh/cmd/
Sat, 20 Jan 2018 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/cmd/
+ /zh/cmd/
技巧等级:中级 PC剪贴板(高级)
uweb浏览器支持一键执行任意预定义命令,这些命令可以与剪贴板交互,可以将结果(文本、图像、音视频)输出到浏览器窗口。
手机推荐安装uweb定制Termux,否则能够执行的命令极其有限。
diff --git a/tags/国外网址/index.html b/zh/tags/国外网址/index.html
similarity index 60%
rename from tags/国外网址/index.html
rename to zh/tags/国外网址/index.html
index dc6f0932..14150af6 100644
--- a/tags/国外网址/index.html
+++ b/zh/tags/国外网址/index.html
@@ -6,10 +6,20 @@
国外网址
+
diff --git a/tags/国外网址/index.xml b/zh/tags/国外网址/index.xml
similarity index 87%
rename from tags/国外网址/index.xml
rename to zh/tags/国外网址/index.xml
index 12206b71..4a33db27 100644
--- a/tags/国外网址/index.xml
+++ b/zh/tags/国外网址/index.xml
@@ -2,17 +2,16 @@
国外网址 on
- https://jamesfengcao.gitee.io/uwebzh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/
+ /zh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/
Recent content in 国外网址 on
Hugo -- gohugo.io
- en-us
- Mon, 25 Apr 2022 00:00:00 +0000
+ Mon, 25 Apr 2022 00:00:00 +0000
-
重定向国外网址至国内镜像(附编辑本地文件)
- https://jamesfengcao.gitee.io/uwebzh/redirect/
+ /zh/redirect/
Mon, 25 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/redirect/
+ /zh/redirect/
github mirror:fastgit
github mirror 2
github mirror 3
@@ -53,10 +52,10 @@ item.gome.com.cn::item.gomevvv.com.cn
-
加速访问国外网站
- https://jamesfengcao.gitee.io/uwebzh/hosts/
+ /zh/hosts/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/hosts/
+ /zh/hosts/
不少国外网站本身虽可访问,但由于网站需要下载其它网址的资源而导致无法访问。根域名屏蔽可屏蔽文件中域名的一切子域名、孙域名、......,从而主动排除这些网址,最终允许浏览器快速访问。
使用Android端uweb浏览器。
域名文件内容如下:
diff --git a/tags/搜索/index.html b/zh/tags/搜索/index.html
similarity index 58%
rename from tags/搜索/index.html
rename to zh/tags/搜索/index.html
index add7fb89..c4bcb6a7 100644
--- a/tags/搜索/index.html
+++ b/zh/tags/搜索/index.html
@@ -6,10 +6,20 @@
搜索
+
diff --git a/tags/搜索/index.xml b/zh/tags/搜索/index.xml
similarity index 88%
rename from tags/搜索/index.xml
rename to zh/tags/搜索/index.xml
index 4895f104..2b6c85d5 100644
--- a/tags/搜索/index.xml
+++ b/zh/tags/搜索/index.xml
@@ -2,17 +2,16 @@
搜索 on
- https://jamesfengcao.gitee.io/uwebzh/tags/%E6%90%9C%E7%B4%A2/
+ /zh/tags/%E6%90%9C%E7%B4%A2/
Recent content in 搜索 on
Hugo -- gohugo.io
- en-us
- Tue, 22 Sep 2020 00:00:00 +0000
+ Tue, 22 Sep 2020 00:00:00 +0000
-
视频播放小窍门
- https://jamesfengcao.gitee.io/uwebzh/video/
+ /zh/video/
Tue, 22 Sep 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/video/
+ /zh/video/
覆盖安装全屏播放菜单示例:屏幕旋转,退出
本文以超微浏览器为例来说明。
创建文件"default.playrate"可定制全屏倍速播放菜单项,格式与文件default.link完全相同。倍速播放菜单链接部分为空,譬如".5x:",倍速菜单至少有一个。链接部分非空的菜单必须在所有倍速菜单之后。 长按设置按钮勾选“弹出视频地址”,则视频播放时会弹出真正的播放地址,点击地址播放可避免一切不良信息。如果点击后为下载操作,可长按链接分享给视频播放器。用户亦可配置在线播放或安装插件。嗅探的视频/资源类型可由文件“/sdcard/uweb/types.sniff”控制。 很多视频解析结果在UA为PC的情况下非常干净,没什么不良信息。故用户可在播放前切换UA至PC。如:wn.run/解析结果对PC非常干净。 某些视频网站在全屏播放时都会出现不良信息占住屏幕一部分。点击全屏播放之前,长按[☰]按钮,超微浏览器将弹出全局脚本菜单,勾选“移除浮动不良信息”后再点全屏播放则完美播放。 也可利用全屏播放屏蔽一切不良信息。方法如下: 长按[☰]按钮,勾选“全屏视频”。此选项将让无法全屏播放的网站强制允许全屏播放。 对无法全屏、无法放大的视频网站,可长按[☰]按钮,勾选“强制缩放”,然后手动放大至全屏。 灵活应用JS、图像开关屏蔽一切不良信息:视频搜索前关闭JS开关,进入播放网页前关闭图像显示并打开JS。 视频解析之电视剧: 首先在视频网站搜索电视剧片名,下面会显示不同的剧集,点击它们再用视频解析即可观看。如果直接点击电视剧用视频解析则每次播放均为第一集。 视频搜索预配置(超过400个引擎)
@@ -22,10 +21,10 @@
-
分类多引擎搜索
- https://jamesfengcao.gitee.io/uwebzh/searchcat/
+ /zh/searchcat/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/searchcat/
+ /zh/searchcat/
点击本链接自动安装分类多引擎文件至"/sdcard/uweb/bookmark"目录下。
超微浏览器中通过“设置”->“总目录”->“↑”->“Download”,点击后缀为.search的下载文件,超微浏览器将自动显示分类多引擎搜索。此时可按菜单键(或长按底部工具条后退按钮)选择“添加到桌面”方便以后访问。
.search文件每行格式为如下几种:
diff --git a/tags/电视/index.html b/zh/tags/电视/index.html
similarity index 53%
rename from tags/电视/index.html
rename to zh/tags/电视/index.html
index 52c811c7..c3b7d6a1 100644
--- a/tags/电视/index.html
+++ b/zh/tags/电视/index.html
@@ -6,10 +6,20 @@
电视
+
diff --git a/tags/电视/index.xml b/zh/tags/电视/index.xml
similarity index 79%
rename from tags/电视/index.xml
rename to zh/tags/电视/index.xml
index 404a8820..5f0cfb3d 100644
--- a/tags/电视/index.xml
+++ b/zh/tags/电视/index.xml
@@ -2,16 +2,15 @@
电视 on
- https://jamesfengcao.gitee.io/uwebzh/tags/%E7%94%B5%E8%A7%86/
+ /zh/tags/%E7%94%B5%E8%A7%86/
Recent content in 电视 on
- Hugo -- gohugo.io
- en-us
+ Hugo -- gohugo.io
-
电视直播
- https://jamesfengcao.gitee.io/uwebzh/tvlive/
+ /zh/tvlive/
Mon, 01 Jan 0001 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/tvlive/
+ /zh/tvlive/
CCTV1
CCTV2财经
CCTV3综艺
diff --git a/tags/离线/index.html b/zh/tags/离线/index.html
similarity index 53%
rename from tags/离线/index.html
rename to zh/tags/离线/index.html
index d8ba5956..d6507f40 100644
--- a/tags/离线/index.html
+++ b/zh/tags/离线/index.html
@@ -6,10 +6,20 @@
离线
+
diff --git a/tags/离线/index.xml b/zh/tags/离线/index.xml
similarity index 84%
rename from tags/离线/index.xml
rename to zh/tags/离线/index.xml
index 7eff9634..eeff2e87 100644
--- a/tags/离线/index.xml
+++ b/zh/tags/离线/index.xml
@@ -2,17 +2,16 @@
离线 on
- https://jamesfengcao.gitee.io/uwebzh/tags/%E7%A6%BB%E7%BA%BF/
+ /zh/tags/%E7%A6%BB%E7%BA%BF/
Recent content in 离线 on
Hugo -- gohugo.io
- en-us
- Tue, 15 Dec 2020 00:00:00 +0000
+ Tue, 15 Dec 2020 00:00:00 +0000
-
离线下载
- https://jamesfengcao.gitee.io/uwebzh/loadbt/
+ /zh/loadbt/
Tue, 15 Dec 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/loadbt/
+ /zh/loadbt/
seedr用户可使用常用链接利用seedr离线下载。使用时长按链接->命令->seedr离线...。 Telegram用户可使用特色服务利用tg bot离线下载至bot支持网盘。使用时长按链接->命令->tg...。 百度网盘存储空间大,但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。
本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。
超微浏览器上配置百度离线下载
diff --git a/tags/网盘/index.html b/zh/tags/网盘/index.html
similarity index 53%
rename from tags/网盘/index.html
rename to zh/tags/网盘/index.html
index 93d58547..535c4d1d 100644
--- a/tags/网盘/index.html
+++ b/zh/tags/网盘/index.html
@@ -6,10 +6,20 @@
网盘
+
diff --git a/tags/网盘/index.xml b/zh/tags/网盘/index.xml
similarity index 84%
rename from tags/网盘/index.xml
rename to zh/tags/网盘/index.xml
index 88a14885..b021e48b 100644
--- a/tags/网盘/index.xml
+++ b/zh/tags/网盘/index.xml
@@ -2,17 +2,16 @@
网盘 on
- https://jamesfengcao.gitee.io/uwebzh/tags/%E7%BD%91%E7%9B%98/
+ /zh/tags/%E7%BD%91%E7%9B%98/
Recent content in 网盘 on
Hugo -- gohugo.io
- en-us
- Tue, 15 Dec 2020 00:00:00 +0000
+ Tue, 15 Dec 2020 00:00:00 +0000
-
离线下载
- https://jamesfengcao.gitee.io/uwebzh/loadbt/
+ /zh/loadbt/
Tue, 15 Dec 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/loadbt/
+ /zh/loadbt/
seedr用户可使用常用链接利用seedr离线下载。使用时长按链接->命令->seedr离线...。 Telegram用户可使用特色服务利用tg bot离线下载至bot支持网盘。使用时长按链接->命令->tg...。 百度网盘存储空间大,但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。
本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。
超微浏览器上配置百度离线下载
diff --git a/tags/资源/index.html b/zh/tags/资源/index.html
similarity index 58%
rename from tags/资源/index.html
rename to zh/tags/资源/index.html
index b8b2b929..0a1b7480 100644
--- a/tags/资源/index.html
+++ b/zh/tags/资源/index.html
@@ -6,10 +6,20 @@
资源
+
diff --git a/tags/资源/index.xml b/zh/tags/资源/index.xml
similarity index 89%
rename from tags/资源/index.xml
rename to zh/tags/资源/index.xml
index 43c56668..b8ead936 100644
--- a/tags/资源/index.xml
+++ b/zh/tags/资源/index.xml
@@ -2,17 +2,16 @@
资源 on
- https://jamesfengcao.gitee.io/uwebzh/tags/%E8%B5%84%E6%BA%90/
+ /zh/tags/%E8%B5%84%E6%BA%90/
Recent content in 资源 on
Hugo -- gohugo.io
- en-us
- Tue, 15 Dec 2020 00:00:00 +0000
+ Tue, 15 Dec 2020 00:00:00 +0000
-
离线下载
- https://jamesfengcao.gitee.io/uwebzh/loadbt/
+ /zh/loadbt/
Tue, 15 Dec 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/loadbt/
+ /zh/loadbt/
seedr用户可使用常用链接利用seedr离线下载。使用时长按链接->命令->seedr离线...。 Telegram用户可使用特色服务利用tg bot离线下载至bot支持网盘。使用时长按链接->命令->tg...。 百度网盘存储空间大,但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。
本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。
超微浏览器上配置百度离线下载
@@ -33,10 +32,10 @@ BaiduPCS-Go config set -appid=266719
-
视频播放小窍门
- https://jamesfengcao.gitee.io/uwebzh/video/
+ /zh/video/
Tue, 22 Sep 2020 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/video/
+ /zh/video/
覆盖安装全屏播放菜单示例:屏幕旋转,退出
本文以超微浏览器为例来说明。
创建文件"default.playrate"可定制全屏倍速播放菜单项,格式与文件default.link完全相同。倍速播放菜单链接部分为空,譬如".5x:",倍速菜单至少有一个。链接部分非空的菜单必须在所有倍速菜单之后。 长按设置按钮勾选“弹出视频地址”,则视频播放时会弹出真正的播放地址,点击地址播放可避免一切不良信息。如果点击后为下载操作,可长按链接分享给视频播放器。用户亦可配置在线播放或安装插件。嗅探的视频/资源类型可由文件“/sdcard/uweb/types.sniff”控制。 很多视频解析结果在UA为PC的情况下非常干净,没什么不良信息。故用户可在播放前切换UA至PC。如:wn.run/解析结果对PC非常干净。 某些视频网站在全屏播放时都会出现不良信息占住屏幕一部分。点击全屏播放之前,长按[☰]按钮,超微浏览器将弹出全局脚本菜单,勾选“移除浮动不良信息”后再点全屏播放则完美播放。 也可利用全屏播放屏蔽一切不良信息。方法如下: 长按[☰]按钮,勾选“全屏视频”。此选项将让无法全屏播放的网站强制允许全屏播放。 对无法全屏、无法放大的视频网站,可长按[☰]按钮,勾选“强制缩放”,然后手动放大至全屏。 灵活应用JS、图像开关屏蔽一切不良信息:视频搜索前关闭JS开关,进入播放网页前关闭图像显示并打开JS。 视频解析之电视剧: 首先在视频网站搜索电视剧片名,下面会显示不同的剧集,点击它们再用视频解析即可观看。如果直接点击电视剧用视频解析则每次播放均为第一集。 视频搜索预配置(超过400个引擎)
diff --git a/tags/重定向/index.html b/zh/tags/重定向/index.html
similarity index 56%
rename from tags/重定向/index.html
rename to zh/tags/重定向/index.html
index a961b8f8..67ae836e 100644
--- a/tags/重定向/index.html
+++ b/zh/tags/重定向/index.html
@@ -6,10 +6,20 @@
重定向
+
diff --git a/tags/重定向/index.xml b/zh/tags/重定向/index.xml
similarity index 88%
rename from tags/重定向/index.xml
rename to zh/tags/重定向/index.xml
index 4ec2ac4c..d97d6178 100644
--- a/tags/重定向/index.xml
+++ b/zh/tags/重定向/index.xml
@@ -2,17 +2,16 @@
重定向 on
- https://jamesfengcao.gitee.io/uwebzh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/
+ /zh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/
Recent content in 重定向 on
Hugo -- gohugo.io
- en-us
- Mon, 25 Apr 2022 00:00:00 +0000
+ Mon, 25 Apr 2022 00:00:00 +0000
-
重定向国外网址至国内镜像(附编辑本地文件)
- https://jamesfengcao.gitee.io/uwebzh/redirect/
+ /zh/redirect/
Mon, 25 Apr 2022 00:00:00 +0000
- https://jamesfengcao.gitee.io/uwebzh/redirect/
+ /zh/redirect/
github mirror:fastgit
github mirror 2
github mirror 3
diff --git a/tcron/index.html b/zh/tcron/index.html
similarity index 87%
rename from tcron/index.html
rename to zh/tcron/index.html
index ea8f888d..5b429044 100644
--- a/tcron/index.html
+++ b/zh/tcron/index.html
@@ -6,10 +6,20 @@
定时脚本
+
diff --git a/tips/index.html b/zh/tips/index.html
similarity index 79%
rename from tips/index.html
rename to zh/tips/index.html
index fffcce1d..cc25aa46 100644
--- a/tips/index.html
+++ b/zh/tips/index.html
@@ -6,10 +6,20 @@
小技巧
+
diff --git a/tools/index.html b/zh/tools/index.html
similarity index 91%
rename from tools/index.html
rename to zh/tools/index.html
index 070ba346..89d0ccfa 100644
--- a/tools/index.html
+++ b/zh/tools/index.html
@@ -6,10 +6,20 @@
工具汇总
+
diff --git a/tvlive/index.html b/zh/tvlive/index.html
similarity index 98%
rename from tvlive/index.html
rename to zh/tvlive/index.html
index 701e1dd9..14330b29 100644
--- a/tvlive/index.html
+++ b/zh/tvlive/index.html
@@ -6,10 +6,20 @@
电视直播
+
diff --git a/urls/index.html b/zh/urls/index.html
similarity index 54%
rename from urls/index.html
rename to zh/urls/index.html
index 36cd0496..578c6599 100644
--- a/urls/index.html
+++ b/zh/urls/index.html
@@ -6,10 +6,20 @@
便利链接
+
diff --git a/video/index.html b/zh/video/index.html
similarity index 89%
rename from video/index.html
rename to zh/video/index.html
index 635c6dd5..cbbc1258 100644
--- a/video/index.html
+++ b/zh/video/index.html
@@ -6,10 +6,20 @@
视频播放小窍门
+