mirror of
https://github.com/markqvist/Reticulum.git
synced 2024-12-15 02:44:33 -05:00
74 lines
2.6 KiB
JavaScript
74 lines
2.6 KiB
JavaScript
function escapeRegExp(string) {
|
|
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
|
|
}
|
|
|
|
/**
|
|
* Removes excluded text from a Node.
|
|
*
|
|
* @param {Node} target Node to filter.
|
|
* @param {string} exclude CSS selector of nodes to exclude.
|
|
* @returns {DOMString} Text from `target` with text removed.
|
|
*/
|
|
export function filterText(target, exclude) {
|
|
const clone = target.cloneNode(true); // clone as to not modify the live DOM
|
|
if (exclude) {
|
|
// remove excluded nodes
|
|
clone.querySelectorAll(exclude).forEach(node => node.remove());
|
|
}
|
|
return clone.innerText;
|
|
}
|
|
|
|
// Callback when a copy button is clicked. Will be passed the node that was clicked
|
|
// should then grab the text and replace pieces of text that shouldn't be used in output
|
|
export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") {
|
|
var regexp;
|
|
var match;
|
|
|
|
// Do we check for line continuation characters and "HERE-documents"?
|
|
var useLineCont = !!lineContinuationChar
|
|
var useHereDoc = !!hereDocDelim
|
|
|
|
// create regexp to capture prompt and remaining line
|
|
if (isRegexp) {
|
|
regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)')
|
|
} else {
|
|
regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)')
|
|
}
|
|
|
|
const outputLines = [];
|
|
var promptFound = false;
|
|
var gotLineCont = false;
|
|
var gotHereDoc = false;
|
|
const lineGotPrompt = [];
|
|
for (const line of textContent.split('\n')) {
|
|
match = line.match(regexp)
|
|
if (match || gotLineCont || gotHereDoc) {
|
|
promptFound = regexp.test(line)
|
|
lineGotPrompt.push(promptFound)
|
|
if (removePrompts && promptFound) {
|
|
outputLines.push(match[2])
|
|
} else {
|
|
outputLines.push(line)
|
|
}
|
|
gotLineCont = line.endsWith(lineContinuationChar) & useLineCont
|
|
if (line.includes(hereDocDelim) & useHereDoc)
|
|
gotHereDoc = !gotHereDoc
|
|
} else if (!onlyCopyPromptLines) {
|
|
outputLines.push(line)
|
|
} else if (copyEmptyLines && line.trim() === '') {
|
|
outputLines.push(line)
|
|
}
|
|
}
|
|
|
|
// If no lines with the prompt were found then just use original lines
|
|
if (lineGotPrompt.some(v => v === true)) {
|
|
textContent = outputLines.join('\n');
|
|
}
|
|
|
|
// Remove a trailing newline to avoid auto-running when pasting
|
|
if (textContent.endsWith("\n")) {
|
|
textContent = textContent.slice(0, -1)
|
|
}
|
|
return textContent
|
|
}
|