43 lines
1.4 KiB
TypeScript
43 lines
1.4 KiB
TypeScript
|
|
/**
|
||
|
|
* Cleans up terminal selections for pasting into other tools.
|
||
|
|
*
|
||
|
|
* Terminal UI padding (left margin from the xterm container, alignment spaces
|
||
|
|
* at end of line) ends up in the copied text. This helper removes that cruft
|
||
|
|
* while preserving the *relative* indentation of the content — so code blocks
|
||
|
|
* keep their shape but lose the wrapper padding.
|
||
|
|
*
|
||
|
|
* Steps:
|
||
|
|
* 1. Dedent — strip the common leading whitespace count from every line.
|
||
|
|
* 2. trimEnd — drop trailing whitespace per line.
|
||
|
|
* 3. Drop fully-blank leading and trailing lines.
|
||
|
|
*
|
||
|
|
* Internal newlines and relative indentation are preserved. Pure function.
|
||
|
|
*/
|
||
|
|
export function trimSelection(text: string): string {
|
||
|
|
if (!text) return text;
|
||
|
|
|
||
|
|
const lines = text.split("\n");
|
||
|
|
|
||
|
|
let minIndent = Infinity;
|
||
|
|
for (const line of lines) {
|
||
|
|
if (line.trim() === "") continue;
|
||
|
|
const match = line.match(/^[ \t]*/);
|
||
|
|
const indent = match ? match[0].length : 0;
|
||
|
|
if (indent < minIndent) minIndent = indent;
|
||
|
|
if (minIndent === 0) break;
|
||
|
|
}
|
||
|
|
if (!Number.isFinite(minIndent)) minIndent = 0;
|
||
|
|
|
||
|
|
const processed = lines.map((line) => {
|
||
|
|
const afterDedent = line.length >= minIndent ? line.slice(minIndent) : "";
|
||
|
|
return afterDedent.trimEnd();
|
||
|
|
});
|
||
|
|
|
||
|
|
let start = 0;
|
||
|
|
let end = processed.length;
|
||
|
|
while (start < end && processed[start] === "") start++;
|
||
|
|
while (end > start && processed[end - 1] === "") end--;
|
||
|
|
|
||
|
|
return processed.slice(start, end).join("\n");
|
||
|
|
}
|