| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 | /* Copyright 2017 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. */'use strict';Object.defineProperty(exports, "__esModule", {  value: true});exports.SimpleLinkService = exports.PDFLinkService = undefined;var _dom_events = require('pdfjs-web/dom_events');var _ui_utils = require('pdfjs-web/ui_utils');var PageNumberRegExp = /^\d+$/;function isPageNumber(str) {  return PageNumberRegExp.test(str);}var PDFLinkService = function PDFLinkServiceClosure() {  function PDFLinkService(options) {    options = options || {};    this.eventBus = options.eventBus || _dom_events.domEvents.getGlobalEventBus();    this.baseUrl = null;    this.pdfDocument = null;    this.pdfViewer = null;    this.pdfHistory = null;    this._pagesRefCache = null;  }  PDFLinkService.prototype = {    setDocument: function PDFLinkService_setDocument(pdfDocument, baseUrl) {      this.baseUrl = baseUrl;      this.pdfDocument = pdfDocument;      this._pagesRefCache = Object.create(null);    },    setViewer: function PDFLinkService_setViewer(pdfViewer) {      this.pdfViewer = pdfViewer;    },    setHistory: function PDFLinkService_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;    },    navigateTo: function PDFLinkService_navigateTo(dest) {      var destString = '';      var self = this;      var goToDestination = function (destRef) {        var pageNumber;        if (destRef instanceof Object) {          pageNumber = self._cachedPageNumber(destRef);        } else if ((destRef | 0) === destRef) {          pageNumber = destRef + 1;        } else {          console.error('PDFLinkService_navigateTo: "' + destRef + '" is not a valid destination reference.');          return;        }        if (pageNumber) {          if (pageNumber < 1 || pageNumber > self.pagesCount) {            console.error('PDFLinkService_navigateTo: "' + pageNumber + '" is a non-existent page number.');            return;          }          self.pdfViewer.scrollPageIntoView({            pageNumber: pageNumber,            destArray: dest          });          if (self.pdfHistory) {            self.pdfHistory.push({              dest: dest,              hash: destString,              page: pageNumber            });          }        } else {          self.pdfDocument.getPageIndex(destRef).then(function (pageIndex) {            self.cachePageRef(pageIndex + 1, destRef);            goToDestination(destRef);          }).catch(function () {            console.error('PDFLinkService_navigateTo: "' + destRef + '" is not a valid page reference.');          });        }      };      var destinationPromise;      if (typeof dest === 'string') {        destString = dest;        destinationPromise = this.pdfDocument.getDestination(dest);      } else {        destinationPromise = Promise.resolve(dest);      }      destinationPromise.then(function (destination) {        dest = destination;        if (!(destination instanceof Array)) {          console.error('PDFLinkService_navigateTo: "' + destination + '" is not a valid destination array.');          return;        }        goToDestination(destination[0]);      });    },    getDestinationHash: function PDFLinkService_getDestinationHash(dest) {      if (typeof dest === 'string') {        return this.getAnchorUrl('#' + (isPageNumber(dest) ? 'nameddest=' : '') + escape(dest));      }      if (dest instanceof Array) {        var str = JSON.stringify(dest);        return this.getAnchorUrl('#' + escape(str));      }      return this.getAnchorUrl('');    },    getAnchorUrl: function PDFLinkService_getAnchorUrl(anchor) {      return (this.baseUrl || '') + anchor;    },    setHash: function PDFLinkService_setHash(hash) {      var pageNumber, dest;      if (hash.indexOf('=') >= 0) {        var 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 ('nameddest' in params) {          if (this.pdfHistory) {            this.pdfHistory.updateNextHashParam(params.nameddest);          }          this.navigateTo(params.nameddest);          return;        }        if ('page' in params) {          pageNumber = params.page | 0 || 1;        }        if ('zoom' in params) {          var zoomArgs = params.zoom.split(',');          var zoomArg = zoomArgs[0];          var zoomArgNumber = parseFloat(zoomArg);          if (zoomArg.indexOf('Fit') === -1) {            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          });        }      } else {        if (isPageNumber(hash) && hash <= this.pagesCount) {          console.warn('PDFLinkService_setHash: specifying a page number ' + 'directly after the hash symbol (#) is deprecated, ' + 'please use the "#page=' + hash + '" form instead.');          this.page = hash | 0;        }        dest = unescape(hash);        try {          dest = JSON.parse(dest);          if (!(dest instanceof Array)) {            dest = dest.toString();          }        } catch (ex) {}        if (typeof dest === 'string' || isValidExplicitDestination(dest)) {          if (this.pdfHistory) {            this.pdfHistory.updateNextHashParam(dest);          }          this.navigateTo(dest);          return;        }        console.error('PDFLinkService_setHash: \'' + unescape(hash) + '\' is not a valid destination.');      }    },    executeNamedAction: function PDFLinkService_executeNamedAction(action) {      switch (action) {        case 'GoBack':          if (this.pdfHistory) {            this.pdfHistory.back();          }          break;        case 'GoForward':          if (this.pdfHistory) {            this.pdfHistory.forward();          }          break;        case 'NextPage':          if (this.page < this.pagesCount) {            this.page++;          }          break;        case 'PrevPage':          if (this.page > 1) {            this.page--;          }          break;        case 'LastPage':          this.page = this.pagesCount;          break;        case 'FirstPage':          this.page = 1;          break;        default:          break;      }      this.eventBus.dispatch('namedaction', {        source: this,        action: action      });    },    onFileAttachmentAnnotation: function (params) {      this.eventBus.dispatch('fileattachmentannotation', {        source: this,        id: params.id,        filename: params.filename,        content: params.content      });    },    cachePageRef: function PDFLinkService_cachePageRef(pageNum, pageRef) {      var refStr = pageRef.num + ' ' + pageRef.gen + ' R';      this._pagesRefCache[refStr] = pageNum;    },    _cachedPageNumber: function PDFLinkService_cachedPageNumber(pageRef) {      var refStr = pageRef.num + ' ' + pageRef.gen + ' R';      return this._pagesRefCache && this._pagesRefCache[refStr] || null;    }  };  function isValidExplicitDestination(dest) {    if (!(dest instanceof Array)) {      return false;    }    var destLength = dest.length,        allowNull = true;    if (destLength < 2) {      return false;    }    var page = dest[0];    if (!(typeof page === 'object' && typeof page.num === 'number' && (page.num | 0) === page.num && typeof page.gen === 'number' && (page.gen | 0) === page.gen) && !(typeof page === 'number' && (page | 0) === page && page >= 0)) {      return false;    }    var zoom = dest[1];    if (!(typeof zoom === 'object' && typeof zoom.name === 'string')) {      return false;    }    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 (var i = 2; i < destLength; i++) {      var param = dest[i];      if (!(typeof param === 'number' || allowNull && param === null)) {        return false;      }    }    return true;  }  return PDFLinkService;}();var SimpleLinkService = function SimpleLinkServiceClosure() {  function SimpleLinkService() {}  SimpleLinkService.prototype = {    get page() {      return 0;    },    set page(value) {},    navigateTo: function (dest) {},    getDestinationHash: function (dest) {      return '#';    },    getAnchorUrl: function (hash) {      return '#';    },    setHash: function (hash) {},    executeNamedAction: function (action) {},    onFileAttachmentAnnotation: function (params) {},    cachePageRef: function (pageNum, pageRef) {}  };  return SimpleLinkService;}();exports.PDFLinkService = PDFLinkService;exports.SimpleLinkService = SimpleLinkService;
 |