|
|
@ -35,13 +35,13 @@ class PDFOutlineViewer { |
|
|
|
/** |
|
|
|
/** |
|
|
|
* @param {PDFOutlineViewerOptions} options |
|
|
|
* @param {PDFOutlineViewerOptions} options |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
constructor(options) { |
|
|
|
constructor({ container, linkService, eventBus, }) { |
|
|
|
this.outline = null; |
|
|
|
this.outline = null; |
|
|
|
this.lastToggleIsShow = true; |
|
|
|
this.lastToggleIsShow = true; |
|
|
|
|
|
|
|
|
|
|
|
this.container = options.container; |
|
|
|
this.container = container; |
|
|
|
this.linkService = options.linkService; |
|
|
|
this.linkService = linkService; |
|
|
|
this.eventBus = options.eventBus; |
|
|
|
this.eventBus = eventBus; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
reset() { |
|
|
|
reset() { |
|
|
@ -77,7 +77,7 @@ class PDFOutlineViewer { |
|
|
|
}); |
|
|
|
}); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
var destination = item.dest; |
|
|
|
let destination = item.dest; |
|
|
|
|
|
|
|
|
|
|
|
element.href = this.linkService.getDestinationHash(destination); |
|
|
|
element.href = this.linkService.getDestinationHash(destination); |
|
|
|
element.onclick = () => { |
|
|
|
element.onclick = () => { |
|
|
@ -92,7 +92,7 @@ class PDFOutlineViewer { |
|
|
|
* @private |
|
|
|
* @private |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
_setStyles(element, item) { |
|
|
|
_setStyles(element, item) { |
|
|
|
var styleStr = ''; |
|
|
|
let styleStr = ''; |
|
|
|
if (item.bold) { |
|
|
|
if (item.bold) { |
|
|
|
styleStr += 'font-weight: bold;'; |
|
|
|
styleStr += 'font-weight: bold;'; |
|
|
|
} |
|
|
|
} |
|
|
@ -112,14 +112,14 @@ class PDFOutlineViewer { |
|
|
|
* @private |
|
|
|
* @private |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
_addToggleButton(div) { |
|
|
|
_addToggleButton(div) { |
|
|
|
var toggler = document.createElement('div'); |
|
|
|
let toggler = document.createElement('div'); |
|
|
|
toggler.className = 'outlineItemToggler'; |
|
|
|
toggler.className = 'outlineItemToggler'; |
|
|
|
toggler.onclick = (evt) => { |
|
|
|
toggler.onclick = (evt) => { |
|
|
|
evt.stopPropagation(); |
|
|
|
evt.stopPropagation(); |
|
|
|
toggler.classList.toggle('outlineItemsHidden'); |
|
|
|
toggler.classList.toggle('outlineItemsHidden'); |
|
|
|
|
|
|
|
|
|
|
|
if (evt.shiftKey) { |
|
|
|
if (evt.shiftKey) { |
|
|
|
var shouldShowAll = !toggler.classList.contains('outlineItemsHidden'); |
|
|
|
let shouldShowAll = !toggler.classList.contains('outlineItemsHidden'); |
|
|
|
this._toggleOutlineItem(div, shouldShowAll); |
|
|
|
this._toggleOutlineItem(div, shouldShowAll); |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
@ -137,8 +137,8 @@ class PDFOutlineViewer { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
_toggleOutlineItem(root, show) { |
|
|
|
_toggleOutlineItem(root, show) { |
|
|
|
this.lastToggleIsShow = show; |
|
|
|
this.lastToggleIsShow = show; |
|
|
|
var togglers = root.querySelectorAll('.outlineItemToggler'); |
|
|
|
let togglers = root.querySelectorAll('.outlineItemToggler'); |
|
|
|
for (var i = 0, ii = togglers.length; i < ii; ++i) { |
|
|
|
for (let i = 0, ii = togglers.length; i < ii; ++i) { |
|
|
|
togglers[i].classList[show ? 'remove' : 'add']('outlineItemsHidden'); |
|
|
|
togglers[i].classList[show ? 'remove' : 'add']('outlineItemsHidden'); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -156,32 +156,31 @@ class PDFOutlineViewer { |
|
|
|
/** |
|
|
|
/** |
|
|
|
* @param {PDFOutlineViewerRenderParameters} params |
|
|
|
* @param {PDFOutlineViewerRenderParameters} params |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
render(params = {}) { |
|
|
|
render({ outline, }) { |
|
|
|
var outline = params.outline || null; |
|
|
|
let outlineCount = 0; |
|
|
|
var outlineCount = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (this.outline) { |
|
|
|
if (this.outline) { |
|
|
|
this.reset(); |
|
|
|
this.reset(); |
|
|
|
} |
|
|
|
} |
|
|
|
this.outline = outline; |
|
|
|
this.outline = outline || null; |
|
|
|
|
|
|
|
|
|
|
|
if (!outline) { |
|
|
|
if (!outline) { |
|
|
|
this._dispatchEvent(outlineCount); |
|
|
|
this._dispatchEvent(outlineCount); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var fragment = document.createDocumentFragment(); |
|
|
|
let fragment = document.createDocumentFragment(); |
|
|
|
var queue = [{ parent: fragment, items: this.outline, }]; |
|
|
|
let queue = [{ parent: fragment, items: this.outline, }]; |
|
|
|
var hasAnyNesting = false; |
|
|
|
let hasAnyNesting = false; |
|
|
|
while (queue.length > 0) { |
|
|
|
while (queue.length > 0) { |
|
|
|
var levelData = queue.shift(); |
|
|
|
let levelData = queue.shift(); |
|
|
|
for (var i = 0, len = levelData.items.length; i < len; i++) { |
|
|
|
for (let i = 0, len = levelData.items.length; i < len; i++) { |
|
|
|
var item = levelData.items[i]; |
|
|
|
let item = levelData.items[i]; |
|
|
|
|
|
|
|
|
|
|
|
var div = document.createElement('div'); |
|
|
|
let div = document.createElement('div'); |
|
|
|
div.className = 'outlineItem'; |
|
|
|
div.className = 'outlineItem'; |
|
|
|
|
|
|
|
|
|
|
|
var element = document.createElement('a'); |
|
|
|
let element = document.createElement('a'); |
|
|
|
this._bindLink(element, item); |
|
|
|
this._bindLink(element, item); |
|
|
|
this._setStyles(element, item); |
|
|
|
this._setStyles(element, item); |
|
|
|
element.textContent = |
|
|
|
element.textContent = |
|
|
@ -193,7 +192,7 @@ class PDFOutlineViewer { |
|
|
|
hasAnyNesting = true; |
|
|
|
hasAnyNesting = true; |
|
|
|
this._addToggleButton(div); |
|
|
|
this._addToggleButton(div); |
|
|
|
|
|
|
|
|
|
|
|
var itemsDiv = document.createElement('div'); |
|
|
|
let itemsDiv = document.createElement('div'); |
|
|
|
itemsDiv.className = 'outlineItems'; |
|
|
|
itemsDiv.className = 'outlineItems'; |
|
|
|
div.appendChild(itemsDiv); |
|
|
|
div.appendChild(itemsDiv); |
|
|
|
queue.push({ parent: itemsDiv, items: item.items, }); |
|
|
|
queue.push({ parent: itemsDiv, items: item.items, }); |
|
|
|