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;
 |