| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478 | /** * @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 */"use strict";Object.defineProperty(exports, "__esModule", {  value: true});exports.SimpleLinkService = exports.PDFLinkService = void 0;var _ui_utils = require("./ui_utils.js");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;
 |