forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			124 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 | |
|  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| this.util = (function () {
 | |
|   // eslint-disable-line no-unused-vars
 | |
|   const exports = {};
 | |
| 
 | |
|   /** Removes a node from its document, if it's a node and the node is attached to a parent */
 | |
|   exports.removeNode = function (el) {
 | |
|     if (el && el.parentNode) {
 | |
|       el.remove();
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   /** Truncates the X coordinate to the document size */
 | |
|   exports.truncateX = function (x) {
 | |
|     const max = Math.max(
 | |
|       document.documentElement.clientWidth,
 | |
|       document.body.clientWidth,
 | |
|       document.documentElement.scrollWidth,
 | |
|       document.body.scrollWidth
 | |
|     );
 | |
|     if (x < 0) {
 | |
|       return 0;
 | |
|     } else if (x > max) {
 | |
|       return max;
 | |
|     }
 | |
|     return x;
 | |
|   };
 | |
| 
 | |
|   /** Truncates the Y coordinate to the document size */
 | |
|   exports.truncateY = function (y) {
 | |
|     const max = Math.max(
 | |
|       document.documentElement.clientHeight,
 | |
|       document.body.clientHeight,
 | |
|       document.documentElement.scrollHeight,
 | |
|       document.body.scrollHeight
 | |
|     );
 | |
|     if (y < 0) {
 | |
|       return 0;
 | |
|     } else if (y > max) {
 | |
|       return max;
 | |
|     }
 | |
|     return y;
 | |
|   };
 | |
| 
 | |
|   // Pixels of wiggle the captured region gets in captureSelectedText:
 | |
|   const CAPTURE_WIGGLE = 10;
 | |
|   const ELEMENT_NODE = document.ELEMENT_NODE;
 | |
| 
 | |
|   exports.captureEnclosedText = function (box) {
 | |
|     const scrollX = window.scrollX;
 | |
|     const scrollY = window.scrollY;
 | |
|     const text = [];
 | |
|     function traverse(el) {
 | |
|       let elBox = el.getBoundingClientRect();
 | |
|       elBox = {
 | |
|         top: elBox.top + scrollY,
 | |
|         bottom: elBox.bottom + scrollY,
 | |
|         left: elBox.left + scrollX,
 | |
|         right: elBox.right + scrollX,
 | |
|       };
 | |
|       if (
 | |
|         elBox.bottom < box.top ||
 | |
|         elBox.top > box.bottom ||
 | |
|         elBox.right < box.left ||
 | |
|         elBox.left > box.right
 | |
|       ) {
 | |
|         // Totally outside of the box
 | |
|         return;
 | |
|       }
 | |
|       if (
 | |
|         elBox.bottom > box.bottom + CAPTURE_WIGGLE ||
 | |
|         elBox.top < box.top - CAPTURE_WIGGLE ||
 | |
|         elBox.right > box.right + CAPTURE_WIGGLE ||
 | |
|         elBox.left < box.left - CAPTURE_WIGGLE
 | |
|       ) {
 | |
|         // Partially outside the box
 | |
|         for (let i = 0; i < el.childNodes.length; i++) {
 | |
|           const child = el.childNodes[i];
 | |
|           if (child.nodeType === ELEMENT_NODE) {
 | |
|             traverse(child);
 | |
|           }
 | |
|         }
 | |
|         return;
 | |
|       }
 | |
|       addText(el);
 | |
|     }
 | |
|     function addText(el) {
 | |
|       let t;
 | |
|       if (el.tagName === "IMG") {
 | |
|         t = el.getAttribute("alt") || el.getAttribute("title");
 | |
|       } else if (el.tagName === "A") {
 | |
|         t = el.innerText;
 | |
|         if (
 | |
|           el.getAttribute("href") &&
 | |
|           !el.getAttribute("href").startsWith("#")
 | |
|         ) {
 | |
|           t += " (" + el.href + ")";
 | |
|         }
 | |
|       } else {
 | |
|         t = el.innerText;
 | |
|       }
 | |
|       if (t) {
 | |
|         text.push(t);
 | |
|       }
 | |
|     }
 | |
|     traverse(document.body);
 | |
|     if (text.length) {
 | |
|       let result = text.join("\n");
 | |
|       result = result.replace(/^\s+/, "");
 | |
|       result = result.replace(/\s+$/, "");
 | |
|       result = result.replace(/[ \t]+\n/g, "\n");
 | |
|       return result;
 | |
|     }
 | |
|     return null;
 | |
|   };
 | |
| 
 | |
|   return exports;
 | |
| })();
 | |
| null;
 | 
