mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-21 15:48:06 +02:00
Merge pull request #7539 from jeremypress/fairexpand
[api-minor] Expanding divs to improve selection
This commit is contained in:
commit
6bb95e3129
9 changed files with 460 additions and 38 deletions
|
@ -101,6 +101,7 @@ var SCALE_SELECT_CONTAINER_PADDING = 8;
|
|||
var SCALE_SELECT_PADDING = 22;
|
||||
var PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading';
|
||||
var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000;
|
||||
var ENHANCE_TEXT_SELECTION = false;
|
||||
|
||||
function configure(PDFJS) {
|
||||
PDFJS.imageResourcesPath = './images/';
|
||||
|
@ -209,7 +210,8 @@ var PDFViewerApplication = {
|
|||
eventBus: eventBus,
|
||||
renderingQueue: pdfRenderingQueue,
|
||||
linkService: pdfLinkService,
|
||||
downloadManager: downloadManager
|
||||
downloadManager: downloadManager,
|
||||
enhanceTextSelection: ENHANCE_TEXT_SELECTION,
|
||||
});
|
||||
pdfRenderingQueue.setViewer(this.pdfViewer);
|
||||
pdfLinkService.setViewer(this.pdfViewer);
|
||||
|
|
|
@ -12,4 +12,4 @@
|
|||
"disableTextLayer": false,
|
||||
"useOnlyCssZoom": false,
|
||||
"externalLinkTarget": 0
|
||||
}
|
||||
}
|
||||
|
|
|
@ -98,9 +98,11 @@ IPDFTextLayerFactory.prototype = {
|
|||
* @param {HTMLDivElement} textLayerDiv
|
||||
* @param {number} pageIndex
|
||||
* @param {PageViewport} viewport
|
||||
* @param {Boolean} enhanceTextSelection
|
||||
* @returns {TextLayerBuilder}
|
||||
*/
|
||||
createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) {}
|
||||
createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport,
|
||||
enhanceTextSelection) {}
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -50,6 +50,8 @@ var TEXT_LAYER_RENDER_DELAY = 200; // ms
|
|||
* @property {PDFRenderingQueue} renderingQueue - The rendering queue object.
|
||||
* @property {IPDFTextLayerFactory} textLayerFactory
|
||||
* @property {IPDFAnnotationLayerFactory} annotationLayerFactory
|
||||
* @property {boolean} enhanceTextSelection - Turns on the text selection
|
||||
* enhancement. The default is `false`.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -69,6 +71,7 @@ var PDFPageView = (function PDFPageViewClosure() {
|
|||
var renderingQueue = options.renderingQueue;
|
||||
var textLayerFactory = options.textLayerFactory;
|
||||
var annotationLayerFactory = options.annotationLayerFactory;
|
||||
var enhanceTextSelection = options.enhanceTextSelection || false;
|
||||
|
||||
this.id = id;
|
||||
this.renderingId = 'page' + id;
|
||||
|
@ -78,6 +81,7 @@ var PDFPageView = (function PDFPageViewClosure() {
|
|||
this.viewport = defaultViewport;
|
||||
this.pdfPageRotate = defaultViewport.rotation;
|
||||
this.hasRestrictedScaling = false;
|
||||
this.enhanceTextSelection = enhanceTextSelection;
|
||||
|
||||
this.eventBus = options.eventBus || domEvents.getGlobalEventBus();
|
||||
this.renderingQueue = renderingQueue;
|
||||
|
@ -395,9 +399,9 @@ var PDFPageView = (function PDFPageViewClosure() {
|
|||
div.appendChild(textLayerDiv);
|
||||
}
|
||||
|
||||
textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv,
|
||||
this.id - 1,
|
||||
this.viewport);
|
||||
textLayer = this.textLayerFactory.
|
||||
createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport,
|
||||
this.enhanceTextSelection);
|
||||
}
|
||||
this.textLayer = textLayer;
|
||||
|
||||
|
|
|
@ -76,6 +76,8 @@ var DEFAULT_CACHE_SIZE = 10;
|
|||
* queue object.
|
||||
* @property {boolean} removePageBorders - (optional) Removes the border shadow
|
||||
* around the pages. The default is false.
|
||||
* @property {boolean} enhanceTextSelection - (optional) Enables the improved
|
||||
* text selection behaviour. The default is `false`.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -127,6 +129,7 @@ var PDFViewer = (function pdfViewer() {
|
|||
this.linkService = options.linkService || new SimpleLinkService();
|
||||
this.downloadManager = options.downloadManager || null;
|
||||
this.removePageBorders = options.removePageBorders || false;
|
||||
this.enhanceTextSelection = options.enhanceTextSelection || false;
|
||||
|
||||
this.defaultRenderingQueue = !options.renderingQueue;
|
||||
if (this.defaultRenderingQueue) {
|
||||
|
@ -352,7 +355,8 @@ var PDFViewer = (function pdfViewer() {
|
|||
defaultViewport: viewport.clone(),
|
||||
renderingQueue: this.renderingQueue,
|
||||
textLayerFactory: textLayerFactory,
|
||||
annotationLayerFactory: this
|
||||
annotationLayerFactory: this,
|
||||
enhanceTextSelection: this.enhanceTextSelection,
|
||||
});
|
||||
bindOnAfterAndBeforeDraw(pageView);
|
||||
this._pages.push(pageView);
|
||||
|
@ -836,13 +840,16 @@ var PDFViewer = (function pdfViewer() {
|
|||
* @param {PageViewport} viewport
|
||||
* @returns {TextLayerBuilder}
|
||||
*/
|
||||
createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) {
|
||||
createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport,
|
||||
enhanceTextSelection) {
|
||||
return new TextLayerBuilder({
|
||||
textLayerDiv: textLayerDiv,
|
||||
eventBus: this.eventBus,
|
||||
pageIndex: pageIndex,
|
||||
viewport: viewport,
|
||||
findController: this.isInPresentationMode ? null : this.findController
|
||||
findController: this.isInPresentationMode ? null : this.findController,
|
||||
enhanceTextSelection: this.isInPresentationMode ? false :
|
||||
enhanceTextSelection,
|
||||
});
|
||||
},
|
||||
|
||||
|
|
|
@ -35,6 +35,8 @@
|
|||
* @property {number} pageIndex - The page index.
|
||||
* @property {PageViewport} viewport - The viewport of the text layer.
|
||||
* @property {PDFFindController} findController
|
||||
* @property {boolean} enhanceTextSelection - Option to turn on improved
|
||||
* text selection.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -57,6 +59,7 @@ var TextLayerBuilder = (function TextLayerBuilderClosure() {
|
|||
this.textDivs = [];
|
||||
this.findController = options.findController || null;
|
||||
this.textLayerRenderTask = null;
|
||||
this.enhanceTextSelection = options.enhanceTextSelection;
|
||||
this._bindMouse();
|
||||
}
|
||||
|
||||
|
@ -64,9 +67,11 @@ var TextLayerBuilder = (function TextLayerBuilderClosure() {
|
|||
_finishRendering: function TextLayerBuilder_finishRendering() {
|
||||
this.renderingDone = true;
|
||||
|
||||
var endOfContent = document.createElement('div');
|
||||
endOfContent.className = 'endOfContent';
|
||||
this.textLayerDiv.appendChild(endOfContent);
|
||||
if (!this.enhanceTextSelection) {
|
||||
var endOfContent = document.createElement('div');
|
||||
endOfContent.className = 'endOfContent';
|
||||
this.textLayerDiv.appendChild(endOfContent);
|
||||
}
|
||||
|
||||
this.eventBus.dispatch('textlayerrendered', {
|
||||
source: this,
|
||||
|
@ -96,7 +101,8 @@ var TextLayerBuilder = (function TextLayerBuilderClosure() {
|
|||
container: textLayerFrag,
|
||||
viewport: this.viewport,
|
||||
textDivs: this.textDivs,
|
||||
timeout: timeout
|
||||
timeout: timeout,
|
||||
enhanceTextSelection: this.enhanceTextSelection,
|
||||
});
|
||||
this.textLayerRenderTask.promise.then(function () {
|
||||
this.textLayerDiv.appendChild(textLayerFrag);
|
||||
|
@ -314,7 +320,12 @@ var TextLayerBuilder = (function TextLayerBuilderClosure() {
|
|||
*/
|
||||
_bindMouse: function TextLayerBuilder_bindMouse() {
|
||||
var div = this.textLayerDiv;
|
||||
var self = this;
|
||||
div.addEventListener('mousedown', function (e) {
|
||||
if (self.enhanceTextSelection && self.textLayerRenderTask) {
|
||||
self.textLayerRenderTask.expandTextDivs(true);
|
||||
return;
|
||||
}
|
||||
var end = div.querySelector('.endOfContent');
|
||||
if (!end) {
|
||||
return;
|
||||
|
@ -338,6 +349,10 @@ var TextLayerBuilder = (function TextLayerBuilderClosure() {
|
|||
end.classList.add('active');
|
||||
});
|
||||
div.addEventListener('mouseup', function (e) {
|
||||
if (self.enhanceTextSelection && self.textLayerRenderTask) {
|
||||
self.textLayerRenderTask.expandTextDivs(false);
|
||||
return;
|
||||
}
|
||||
var end = div.querySelector('.endOfContent');
|
||||
if (!end) {
|
||||
return;
|
||||
|
@ -362,13 +377,16 @@ DefaultTextLayerFactory.prototype = {
|
|||
* @param {HTMLDivElement} textLayerDiv
|
||||
* @param {number} pageIndex
|
||||
* @param {PageViewport} viewport
|
||||
* @param {boolean} enhanceTextSelection
|
||||
* @returns {TextLayerBuilder}
|
||||
*/
|
||||
createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) {
|
||||
createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport,
|
||||
enhanceTextSelection) {
|
||||
return new TextLayerBuilder({
|
||||
textLayerDiv: textLayerDiv,
|
||||
pageIndex: pageIndex,
|
||||
viewport: viewport
|
||||
viewport: viewport,
|
||||
enhanceTextSelection: enhanceTextSelection
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue