You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
351 lines
12 KiB
351 lines
12 KiB
/* 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 _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 _dom_events = require('./dom_events'); |
|
|
|
var _ui_utils = require('./ui_utils'); |
|
|
|
var PDFLinkService = function PDFLinkServiceClosure() { |
|
function PDFLinkService(options) { |
|
options = options || {}; |
|
this.eventBus = options.eventBus || (0, _dom_events.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 navigateTo(dest) { |
|
var _this = this; |
|
|
|
var goToDestination = function goToDestination(_ref) { |
|
var namedDest = _ref.namedDest, |
|
explicitDest = _ref.explicitDest; |
|
|
|
var destRef = explicitDest[0], |
|
pageNumber = void 0; |
|
if (destRef instanceof Object) { |
|
pageNumber = _this._cachedPageNumber(destRef); |
|
if (pageNumber === null) { |
|
_this.pdfDocument.getPageIndex(destRef).then(function (pageIndex) { |
|
_this.cachePageRef(pageIndex + 1, destRef); |
|
goToDestination({ |
|
namedDest: namedDest, |
|
explicitDest: explicitDest |
|
}); |
|
}).catch(function () { |
|
console.error('PDFLinkService.navigateTo: "' + destRef + '" is not ' + ('a valid page reference, for dest="' + dest + '".')); |
|
}); |
|
return; |
|
} |
|
} else if ((destRef | 0) === destRef) { |
|
pageNumber = destRef + 1; |
|
} else { |
|
console.error('PDFLinkService.navigateTo: "' + destRef + '" is not ' + ('a valid destination reference, for dest="' + dest + '".')); |
|
return; |
|
} |
|
if (!pageNumber || pageNumber < 1 || pageNumber > _this.pagesCount) { |
|
console.error('PDFLinkService.navigateTo: "' + pageNumber + '" is not ' + ('a valid page number, for dest="' + dest + '".')); |
|
return; |
|
} |
|
_this.pdfViewer.scrollPageIntoView({ |
|
pageNumber: pageNumber, |
|
destArray: explicitDest |
|
}); |
|
if (_this.pdfHistory) { |
|
_this.pdfHistory.push({ |
|
dest: explicitDest, |
|
hash: namedDest, |
|
page: pageNumber |
|
}); |
|
} |
|
}; |
|
new Promise(function (resolve, reject) { |
|
if (typeof dest === 'string') { |
|
_this.pdfDocument.getDestination(dest).then(function (destArray) { |
|
resolve({ |
|
namedDest: dest, |
|
explicitDest: destArray |
|
}); |
|
}); |
|
return; |
|
} |
|
resolve({ |
|
namedDest: '', |
|
explicitDest: dest |
|
}); |
|
}).then(function (data) { |
|
if (!(data.explicitDest instanceof Array)) { |
|
console.error('PDFLinkService.navigateTo: "' + data.explicitDest + '" is' + (' not a valid destination array, for dest="' + dest + '".')); |
|
return; |
|
} |
|
goToDestination(data); |
|
}); |
|
}, |
|
getDestinationHash: function getDestinationHash(dest) { |
|
if (typeof dest === 'string') { |
|
return this.getAnchorUrl('#' + 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 (/^\d+$/.test(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 onFileAttachmentAnnotation() { |
|
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
|
|
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 === 'undefined' ? 'undefined' : _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 === 'undefined' ? 'undefined' : _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 navigateTo(dest) {}, |
|
getDestinationHash: function getDestinationHash(dest) { |
|
return '#'; |
|
}, |
|
getAnchorUrl: function getAnchorUrl(hash) { |
|
return '#'; |
|
}, |
|
setHash: function setHash(hash) {}, |
|
executeNamedAction: function executeNamedAction(action) {}, |
|
onFileAttachmentAnnotation: function onFileAttachmentAnnotation(params) {}, |
|
cachePageRef: function cachePageRef(pageNum, pageRef) {} |
|
}; |
|
return SimpleLinkService; |
|
}(); |
|
exports.PDFLinkService = PDFLinkService; |
|
exports.SimpleLinkService = SimpleLinkService; |