* bump Signed-off-by: Jess Frazelle <github@jessfraz.com> * some fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * YOYO NEW API SPEC! * reformat Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixups Signed-off-by: Jess Frazelle <github@jessfraz.com> * for now force true Signed-off-by: Jess Frazelle <github@jessfraz.com> * run the tests on generations Signed-off-by: Jess Frazelle <github@jessfraz.com> * add tests Signed-off-by: Jess Frazelle <github@jessfraz.com> * update Signed-off-by: Jess Frazelle <github@jessfraz.com> * update Signed-off-by: Jess Frazelle <github@jessfraz.com> * update Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * update Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix some types Signed-off-by: Jess Frazelle <github@jessfraz.com> * float to top Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix mypy Signed-off-by: Jess Frazelle <github@jessfraz.com> * more noqa Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixups Signed-off-by: Jess Frazelle <github@jessfraz.com> * ruff pass Signed-off-by: Jess Frazelle <github@jessfraz.com> * add docs Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * even less mypy errors Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * add test Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixups Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * cleanup Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix Signed-off-by: Jess Frazelle <github@jessfraz.com> * new path Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes for mypy Signed-off-by: Jess Frazelle <github@jessfraz.com> * skip tests Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
		
			
				
	
	
		
			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
 | 
						|
}
 |