mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 11:11:35 +00:00
refactor(daemon): share quoted arg splitter
This commit is contained in:
48
src/daemon/arg-split.ts
Normal file
48
src/daemon/arg-split.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user