40 lines
1.1 KiB
TypeScript
40 lines
1.1 KiB
TypeScript
export interface InterpolationSegment {
|
|
expression: string;
|
|
start: number;
|
|
end: number;
|
|
}
|
|
|
|
/** Extract top-level `{...}` expressions while preserving nested object/array literals. */
|
|
export function extractInterpolations(value: string): InterpolationSegment[] {
|
|
const segments: InterpolationSegment[] = [];
|
|
let index = 0;
|
|
while (index < value.length) {
|
|
if (value[index] !== "{") {
|
|
index++;
|
|
continue;
|
|
}
|
|
const start = index++;
|
|
let depth = 1;
|
|
let quote: string | null = null;
|
|
while (index < value.length && depth > 0) {
|
|
const char = value[index]!;
|
|
if (quote) {
|
|
if (char === "\\" && index + 1 < value.length) index += 2;
|
|
else {
|
|
if (char === quote) quote = null;
|
|
index++;
|
|
}
|
|
continue;
|
|
}
|
|
if (char === '"' || char === "'" || char === "`") quote = char;
|
|
else if (char === "{") depth++;
|
|
else if (char === "}") depth--;
|
|
index++;
|
|
}
|
|
if (depth === 0) {
|
|
segments.push({ expression: value.slice(start + 1, index - 1).trim(), start, end: index });
|
|
}
|
|
}
|
|
return segments;
|
|
}
|