feat: code blocks beta
This commit is contained in:
parent
362b7aa15e
commit
1ecb6d8682
19 changed files with 756 additions and 94 deletions
|
@ -102,6 +102,142 @@ class TokenParser {
|
|||
continue;
|
||||
}
|
||||
|
||||
if (char === "@") {
|
||||
const startPos = current;
|
||||
const startColumn = column;
|
||||
const startLine = line;
|
||||
current++;
|
||||
column++;
|
||||
|
||||
let blockType = "";
|
||||
char = input[current];
|
||||
|
||||
while (current < input.length && /[a-zA-Z]/.test(char)) {
|
||||
blockType += char;
|
||||
current++;
|
||||
column++;
|
||||
char = input[current];
|
||||
}
|
||||
|
||||
if (blockType === "client" || blockType === "server") {
|
||||
if (this.options.debug) {
|
||||
console.log(`[TokenParser] ${blockType} block found at line ${startLine}, column ${startColumn}`);
|
||||
}
|
||||
|
||||
while (current < input.length && /\s/.test(char)) {
|
||||
if (char === "\n") {
|
||||
line++;
|
||||
column = 1;
|
||||
} else {
|
||||
column++;
|
||||
}
|
||||
current++;
|
||||
char = input[current];
|
||||
}
|
||||
|
||||
let params = [];
|
||||
if (blockType === "server" && char === "(") {
|
||||
current++;
|
||||
column++;
|
||||
let paramString = "";
|
||||
let depth = 1;
|
||||
|
||||
while (current < input.length && depth > 0) {
|
||||
char = input[current];
|
||||
|
||||
if (char === "(") depth++;
|
||||
if (char === ")") depth--;
|
||||
|
||||
if (depth === 0) break;
|
||||
|
||||
paramString += char;
|
||||
if (char === "\n") {
|
||||
line++;
|
||||
column = 1;
|
||||
} else {
|
||||
column++;
|
||||
}
|
||||
current++;
|
||||
}
|
||||
|
||||
current++;
|
||||
column++;
|
||||
|
||||
params = paramString.split(",").map(p => p.trim()).filter(p => p);
|
||||
|
||||
if (this.options.debug) {
|
||||
console.log(`[TokenParser] Server block parameters: ${params.join(", ")}`);
|
||||
}
|
||||
|
||||
char = input[current];
|
||||
while (current < input.length && /\s/.test(char)) {
|
||||
if (char === "\n") {
|
||||
line++;
|
||||
column = 1;
|
||||
} else {
|
||||
column++;
|
||||
}
|
||||
current++;
|
||||
char = input[current];
|
||||
}
|
||||
}
|
||||
|
||||
if (char === "{") {
|
||||
current++;
|
||||
column++;
|
||||
let script = "";
|
||||
let braceCount = 1;
|
||||
|
||||
while (current < input.length && braceCount > 0) {
|
||||
char = input[current];
|
||||
|
||||
if (char === "{") braceCount++;
|
||||
if (char === "}") braceCount--;
|
||||
|
||||
if (braceCount === 0) break;
|
||||
|
||||
script += char;
|
||||
if (char === "\n") {
|
||||
line++;
|
||||
column = 1;
|
||||
} else {
|
||||
column++;
|
||||
}
|
||||
current++;
|
||||
}
|
||||
|
||||
current++;
|
||||
column++;
|
||||
|
||||
tokens.push({
|
||||
type: blockType,
|
||||
value: script.trim(),
|
||||
params: params,
|
||||
line: startLine,
|
||||
column: startColumn,
|
||||
});
|
||||
|
||||
if (this.options.debug) {
|
||||
console.log(`[TokenParser] ${blockType} block script: "${script.trim().substring(0, 50)}..."`);
|
||||
}
|
||||
|
||||
continue;
|
||||
} else {
|
||||
throw new BlueprintError(
|
||||
`Expected opening brace after @${blockType}${params.length ? '(...)' : ''}`,
|
||||
line,
|
||||
column
|
||||
);
|
||||
}
|
||||
} else {
|
||||
throw new BlueprintError(
|
||||
`Unknown block type: @${blockType}`,
|
||||
startLine,
|
||||
startColumn
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (/[a-zA-Z]/.test(char)) {
|
||||
let value = "";
|
||||
const startColumn = column;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue