Source code

Revision control

Copy as Markdown

Other Tools

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