mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-13 11:00:50 +00:00
49 lines
1.0 KiB
TypeScript
49 lines
1.0 KiB
TypeScript
export type ArgSplitEscapeMode = "none" | "backslash" | "backslash-quote-only";
|
|
|
|
export function splitArgsPreservingQuotes(
|
|
value: string,
|
|
options?: { escapeMode?: ArgSplitEscapeMode },
|
|
): string[] {
|
|
const args: string[] = [];
|
|
let current = "";
|
|
let inQuotes = false;
|
|
const escapeMode = options?.escapeMode ?? "none";
|
|
|
|
for (let i = 0; i < value.length; i++) {
|
|
const char = value[i];
|
|
if (escapeMode === "backslash" && char === "\\") {
|
|
if (i + 1 < value.length) {
|
|
current += value[i + 1];
|
|
i++;
|
|
}
|
|
continue;
|
|
}
|
|
if (
|
|
escapeMode === "backslash-quote-only" &&
|
|
char === "\\" &&
|
|
i + 1 < value.length &&
|
|
value[i + 1] === '"'
|
|
) {
|
|
current += '"';
|
|
i++;
|
|
continue;
|
|
}
|
|
if (char === '"') {
|
|
inQuotes = !inQuotes;
|
|
continue;
|
|
}
|
|
if (!inQuotes && /\s/.test(char)) {
|
|
if (current) {
|
|
args.push(current);
|
|
current = "";
|
|
}
|
|
continue;
|
|
}
|
|
current += char;
|
|
}
|
|
if (current) {
|
|
args.push(current);
|
|
}
|
|
return args;
|
|
}
|