| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352 | 
							- /* 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.DefaultTextLayerFactory = exports.TextLayerBuilder = undefined;
 
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
 
- var _dom_events = require('./dom_events');
 
- var _pdf = require('../pdf');
 
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 
- var EXPAND_DIVS_TIMEOUT = 300;
 
- var TextLayerBuilder = function () {
 
-   function TextLayerBuilder(_ref) {
 
-     var textLayerDiv = _ref.textLayerDiv,
 
-         eventBus = _ref.eventBus,
 
-         pageIndex = _ref.pageIndex,
 
-         viewport = _ref.viewport,
 
-         _ref$findController = _ref.findController,
 
-         findController = _ref$findController === undefined ? null : _ref$findController,
 
-         _ref$enhanceTextSelec = _ref.enhanceTextSelection,
 
-         enhanceTextSelection = _ref$enhanceTextSelec === undefined ? false : _ref$enhanceTextSelec;
 
-     _classCallCheck(this, TextLayerBuilder);
 
-     this.textLayerDiv = textLayerDiv;
 
-     this.eventBus = eventBus || (0, _dom_events.getGlobalEventBus)();
 
-     this.textContent = null;
 
-     this.textContentItemsStr = [];
 
-     this.textContentStream = null;
 
-     this.renderingDone = false;
 
-     this.pageIdx = pageIndex;
 
-     this.pageNumber = this.pageIdx + 1;
 
-     this.matches = [];
 
-     this.viewport = viewport;
 
-     this.textDivs = [];
 
-     this.findController = findController;
 
-     this.textLayerRenderTask = null;
 
-     this.enhanceTextSelection = enhanceTextSelection;
 
-     this._bindMouse();
 
-   }
 
-   _createClass(TextLayerBuilder, [{
 
-     key: '_finishRendering',
 
-     value: function _finishRendering() {
 
-       this.renderingDone = true;
 
-       if (!this.enhanceTextSelection) {
 
-         var endOfContent = document.createElement('div');
 
-         endOfContent.className = 'endOfContent';
 
-         this.textLayerDiv.appendChild(endOfContent);
 
-       }
 
-       this.eventBus.dispatch('textlayerrendered', {
 
-         source: this,
 
-         pageNumber: this.pageNumber,
 
-         numTextDivs: this.textDivs.length
 
-       });
 
-     }
 
-   }, {
 
-     key: 'render',
 
-     value: function render() {
 
-       var _this = this;
 
-       var timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
 
-       if (!(this.textContent || this.textContentStream) || this.renderingDone) {
 
-         return;
 
-       }
 
-       this.cancel();
 
-       this.textDivs = [];
 
-       var textLayerFrag = document.createDocumentFragment();
 
-       this.textLayerRenderTask = (0, _pdf.renderTextLayer)({
 
-         textContent: this.textContent,
 
-         textContentStream: this.textContentStream,
 
-         container: textLayerFrag,
 
-         viewport: this.viewport,
 
-         textDivs: this.textDivs,
 
-         textContentItemsStr: this.textContentItemsStr,
 
-         timeout: timeout,
 
-         enhanceTextSelection: this.enhanceTextSelection
 
-       });
 
-       this.textLayerRenderTask.promise.then(function () {
 
-         _this.textLayerDiv.appendChild(textLayerFrag);
 
-         _this._finishRendering();
 
-         _this.updateMatches();
 
-       }, function (reason) {});
 
-     }
 
-   }, {
 
-     key: 'cancel',
 
-     value: function cancel() {
 
-       if (this.textLayerRenderTask) {
 
-         this.textLayerRenderTask.cancel();
 
-         this.textLayerRenderTask = null;
 
-       }
 
-     }
 
-   }, {
 
-     key: 'setTextContentStream',
 
-     value: function setTextContentStream(readableStream) {
 
-       this.cancel();
 
-       this.textContentStream = readableStream;
 
-     }
 
-   }, {
 
-     key: 'setTextContent',
 
-     value: function setTextContent(textContent) {
 
-       this.cancel();
 
-       this.textContent = textContent;
 
-     }
 
-   }, {
 
-     key: 'convertMatches',
 
-     value: function convertMatches(matches, matchesLength) {
 
-       var i = 0;
 
-       var iIndex = 0;
 
-       var textContentItemsStr = this.textContentItemsStr;
 
-       var end = textContentItemsStr.length - 1;
 
-       var queryLen = this.findController === null ? 0 : this.findController.state.query.length;
 
-       var ret = [];
 
-       if (!matches) {
 
-         return ret;
 
-       }
 
-       for (var m = 0, len = matches.length; m < len; m++) {
 
-         var matchIdx = matches[m];
 
-         while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) {
 
-           iIndex += textContentItemsStr[i].length;
 
-           i++;
 
-         }
 
-         if (i === textContentItemsStr.length) {
 
-           console.error('Could not find a matching mapping');
 
-         }
 
-         var match = {
 
-           begin: {
 
-             divIdx: i,
 
-             offset: matchIdx - iIndex
 
-           }
 
-         };
 
-         if (matchesLength) {
 
-           matchIdx += matchesLength[m];
 
-         } else {
 
-           matchIdx += queryLen;
 
-         }
 
-         while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {
 
-           iIndex += textContentItemsStr[i].length;
 
-           i++;
 
-         }
 
-         match.end = {
 
-           divIdx: i,
 
-           offset: matchIdx - iIndex
 
-         };
 
-         ret.push(match);
 
-       }
 
-       return ret;
 
-     }
 
-   }, {
 
-     key: 'renderMatches',
 
-     value: function renderMatches(matches) {
 
-       if (matches.length === 0) {
 
-         return;
 
-       }
 
-       var textContentItemsStr = this.textContentItemsStr;
 
-       var textDivs = this.textDivs;
 
-       var prevEnd = null;
 
-       var pageIdx = this.pageIdx;
 
-       var isSelectedPage = this.findController === null ? false : pageIdx === this.findController.selected.pageIdx;
 
-       var selectedMatchIdx = this.findController === null ? -1 : this.findController.selected.matchIdx;
 
-       var highlightAll = this.findController === null ? false : this.findController.state.highlightAll;
 
-       var infinity = {
 
-         divIdx: -1,
 
-         offset: undefined
 
-       };
 
-       function beginText(begin, className) {
 
-         var divIdx = begin.divIdx;
 
-         textDivs[divIdx].textContent = '';
 
-         appendTextToDiv(divIdx, 0, begin.offset, className);
 
-       }
 
-       function appendTextToDiv(divIdx, fromOffset, toOffset, className) {
 
-         var div = textDivs[divIdx];
 
-         var content = textContentItemsStr[divIdx].substring(fromOffset, toOffset);
 
-         var node = document.createTextNode(content);
 
-         if (className) {
 
-           var span = document.createElement('span');
 
-           span.className = className;
 
-           span.appendChild(node);
 
-           div.appendChild(span);
 
-           return;
 
-         }
 
-         div.appendChild(node);
 
-       }
 
-       var i0 = selectedMatchIdx,
 
-           i1 = i0 + 1;
 
-       if (highlightAll) {
 
-         i0 = 0;
 
-         i1 = matches.length;
 
-       } else if (!isSelectedPage) {
 
-         return;
 
-       }
 
-       for (var i = i0; i < i1; i++) {
 
-         var match = matches[i];
 
-         var begin = match.begin;
 
-         var end = match.end;
 
-         var isSelected = isSelectedPage && i === selectedMatchIdx;
 
-         var highlightSuffix = isSelected ? ' selected' : '';
 
-         if (this.findController) {
 
-           this.findController.updateMatchPosition(pageIdx, i, textDivs, begin.divIdx);
 
-         }
 
-         if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {
 
-           if (prevEnd !== null) {
 
-             appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);
 
-           }
 
-           beginText(begin);
 
-         } else {
 
-           appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);
 
-         }
 
-         if (begin.divIdx === end.divIdx) {
 
-           appendTextToDiv(begin.divIdx, begin.offset, end.offset, 'highlight' + highlightSuffix);
 
-         } else {
 
-           appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, 'highlight begin' + highlightSuffix);
 
-           for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {
 
-             textDivs[n0].className = 'highlight middle' + highlightSuffix;
 
-           }
 
-           beginText(end, 'highlight end' + highlightSuffix);
 
-         }
 
-         prevEnd = end;
 
-       }
 
-       if (prevEnd) {
 
-         appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);
 
-       }
 
-     }
 
-   }, {
 
-     key: 'updateMatches',
 
-     value: function updateMatches() {
 
-       if (!this.renderingDone) {
 
-         return;
 
-       }
 
-       var matches = this.matches;
 
-       var textDivs = this.textDivs;
 
-       var textContentItemsStr = this.textContentItemsStr;
 
-       var clearedUntilDivIdx = -1;
 
-       for (var i = 0, len = matches.length; i < len; i++) {
 
-         var match = matches[i];
 
-         var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);
 
-         for (var n = begin, end = match.end.divIdx; n <= end; n++) {
 
-           var div = textDivs[n];
 
-           div.textContent = textContentItemsStr[n];
 
-           div.className = '';
 
-         }
 
-         clearedUntilDivIdx = match.end.divIdx + 1;
 
-       }
 
-       if (this.findController === null || !this.findController.active) {
 
-         return;
 
-       }
 
-       var pageMatches = void 0,
 
-           pageMatchesLength = void 0;
 
-       if (this.findController !== null) {
 
-         pageMatches = this.findController.pageMatches[this.pageIdx] || null;
 
-         pageMatchesLength = this.findController.pageMatchesLength ? this.findController.pageMatchesLength[this.pageIdx] || null : null;
 
-       }
 
-       this.matches = this.convertMatches(pageMatches, pageMatchesLength);
 
-       this.renderMatches(this.matches);
 
-     }
 
-   }, {
 
-     key: '_bindMouse',
 
-     value: function _bindMouse() {
 
-       var _this2 = this;
 
-       var div = this.textLayerDiv;
 
-       var expandDivsTimer = null;
 
-       div.addEventListener('mousedown', function (evt) {
 
-         if (_this2.enhanceTextSelection && _this2.textLayerRenderTask) {
 
-           _this2.textLayerRenderTask.expandTextDivs(true);
 
-           if (expandDivsTimer) {
 
-             clearTimeout(expandDivsTimer);
 
-             expandDivsTimer = null;
 
-           }
 
-           return;
 
-         }
 
-         var end = div.querySelector('.endOfContent');
 
-         if (!end) {
 
-           return;
 
-         }
 
-         var adjustTop = evt.target !== div;
 
-         adjustTop = adjustTop && window.getComputedStyle(end).getPropertyValue('-moz-user-select') !== 'none';
 
-         if (adjustTop) {
 
-           var divBounds = div.getBoundingClientRect();
 
-           var r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height);
 
-           end.style.top = (r * 100).toFixed(2) + '%';
 
-         }
 
-         end.classList.add('active');
 
-       });
 
-       div.addEventListener('mouseup', function () {
 
-         if (_this2.enhanceTextSelection && _this2.textLayerRenderTask) {
 
-           expandDivsTimer = setTimeout(function () {
 
-             if (_this2.textLayerRenderTask) {
 
-               _this2.textLayerRenderTask.expandTextDivs(false);
 
-             }
 
-             expandDivsTimer = null;
 
-           }, EXPAND_DIVS_TIMEOUT);
 
-           return;
 
-         }
 
-         var end = div.querySelector('.endOfContent');
 
-         if (!end) {
 
-           return;
 
-         }
 
-         end.style.top = '';
 
-         end.classList.remove('active');
 
-       });
 
-     }
 
-   }]);
 
-   return TextLayerBuilder;
 
- }();
 
- var DefaultTextLayerFactory = function () {
 
-   function DefaultTextLayerFactory() {
 
-     _classCallCheck(this, DefaultTextLayerFactory);
 
-   }
 
-   _createClass(DefaultTextLayerFactory, [{
 
-     key: 'createTextLayerBuilder',
 
-     value: function createTextLayerBuilder(textLayerDiv, pageIndex, viewport) {
 
-       var enhanceTextSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
 
-       return new TextLayerBuilder({
 
-         textLayerDiv: textLayerDiv,
 
-         pageIndex: pageIndex,
 
-         viewport: viewport,
 
-         enhanceTextSelection: enhanceTextSelection
 
-       });
 
-     }
 
-   }]);
 
-   return DefaultTextLayerFactory;
 
- }();
 
- exports.TextLayerBuilder = TextLayerBuilder;
 
- exports.DefaultTextLayerFactory = DefaultTextLayerFactory;
 
 
  |