@chanmeng666/archlang 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-ICYNEDSM.js → chunk-3YUQPQPZ.js} +725 -521
- package/dist/chunk-3YUQPQPZ.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/index.d.ts +44 -43
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-ICYNEDSM.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lexer.ts","../src/parser.ts","../src/geometry.ts","../src/validate.ts","../src/render.ts","../src/diagnostics.ts","../src/index.ts"],"sourcesContent":["/** Hand-written lexer for ArchLang. Zero dependencies; tracks line/col. */\r\n\r\nexport type TokenType =\r\n | \"ident\"\r\n | \"number\"\r\n | \"string\"\r\n | \"dimension\" // e.g. 4000x3000\r\n | \"lparen\"\r\n | \"rparen\"\r\n | \"lcurly\"\r\n | \"rcurly\"\r\n | \"comma\"\r\n | \"equals\"\r\n | \"colon\"\r\n | \"arrow\" // ->\r\n | \"eof\";\r\n\r\nexport interface Token {\r\n type: TokenType;\r\n value: string;\r\n /** For \"number\": the parsed value. For \"dimension\": w. */\r\n num?: number;\r\n /** For \"dimension\": h. */\r\n num2?: number;\r\n line: number;\r\n col: number;\r\n /** Byte offset of the token's first character into the source. */\r\n start: number;\r\n /** Byte offset just past the token's last character. */\r\n end: number;\r\n}\r\n\r\nexport interface LexResult {\r\n tokens: Token[];\r\n errors: { message: string; span: { start: number; end: number } }[];\r\n}\r\n\r\nconst isDigit = (c: string) => c >= \"0\" && c <= \"9\";\r\nconst isIdentStart = (c: string) =>\r\n (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\") || c === \"_\";\r\nconst isIdentPart = (c: string) => isIdentStart(c) || isDigit(c);\r\n\r\nexport function lex(src: string): LexResult {\r\n const tokens: Token[] = [];\r\n const errors: { message: string; span: { start: number; end: number } }[] = [];\r\n let i = 0;\r\n let line = 1;\r\n let col = 1;\r\n\r\n const peek = (o = 0) => src[i + o] ?? \"\";\r\n const advance = () => {\r\n const c = src[i++];\r\n if (c === \"\\n\") {\r\n line++;\r\n col = 1;\r\n } else {\r\n col++;\r\n }\r\n return c;\r\n };\r\n const push = (\r\n type: TokenType,\r\n value: string,\r\n startLine: number,\r\n startCol: number,\r\n startIdx: number,\r\n extra?: Partial<Token>,\r\n ) => tokens.push({ type, value, line: startLine, col: startCol, ...extra, start: startIdx, end: i });\r\n\r\n while (i < src.length) {\r\n const c = peek();\r\n const startLine = line;\r\n const startCol = col;\r\n const startIdx = i;\r\n\r\n // Whitespace\r\n if (c === \" \" || c === \"\\t\" || c === \"\\r\" || c === \"\\n\") {\r\n advance();\r\n continue;\r\n }\r\n\r\n // Comment to end of line\r\n if (c === \"#\") {\r\n while (i < src.length && peek() !== \"\\n\") advance();\r\n continue;\r\n }\r\n\r\n // String literal with \\\" and \\\\ escapes\r\n if (c === '\"') {\r\n advance();\r\n let value = \"\";\r\n let terminated = false;\r\n while (i < src.length) {\r\n const ch = peek();\r\n if (ch === \"\\\\\") {\r\n advance();\r\n const esc = advance();\r\n value += esc === \"n\" ? \"\\n\" : esc;\r\n continue;\r\n }\r\n if (ch === '\"') {\r\n advance();\r\n terminated = true;\r\n break;\r\n }\r\n if (ch === \"\\n\") break; // strings don't span lines\r\n value += advance();\r\n }\r\n if (!terminated) {\r\n errors.push({ message: \"Unterminated string literal\", span: { start: startIdx, end: i } });\r\n }\r\n push(\"string\", value, startLine, startCol, startIdx);\r\n continue;\r\n }\r\n\r\n // Punctuation & operators\r\n if (c === \"(\") { advance(); push(\"lparen\", \"(\", startLine, startCol, startIdx); continue; }\r\n if (c === \")\") { advance(); push(\"rparen\", \")\", startLine, startCol, startIdx); continue; }\r\n if (c === \"{\") { advance(); push(\"lcurly\", \"{\", startLine, startCol, startIdx); continue; }\r\n if (c === \"}\") { advance(); push(\"rcurly\", \"}\", startLine, startCol, startIdx); continue; }\r\n if (c === \",\") { advance(); push(\"comma\", \",\", startLine, startCol, startIdx); continue; }\r\n if (c === \"=\") { advance(); push(\"equals\", \"=\", startLine, startCol, startIdx); continue; }\r\n if (c === \":\") { advance(); push(\"colon\", \":\", startLine, startCol, startIdx); continue; }\r\n if (c === \"-\" && peek(1) === \">\") { advance(); advance(); push(\"arrow\", \"->\", startLine, startCol, startIdx); continue; }\r\n\r\n // Number (optionally part of a dimension WxH)\r\n if (isDigit(c) || (c === \"-\" && isDigit(peek(1))) || (c === \".\" && isDigit(peek(1)))) {\r\n let raw = \"\";\r\n if (c === \"-\") raw += advance();\r\n while (isDigit(peek())) raw += advance();\r\n if (peek() === \".\") {\r\n raw += advance();\r\n while (isDigit(peek())) raw += advance();\r\n }\r\n const first = parseFloat(raw);\r\n // Dimension: <num>x<num>\r\n if (peek() === \"x\" && (isDigit(peek(1)) || (peek(1) === \"-\" && isDigit(peek(2))) || (peek(1) === \".\" && isDigit(peek(2))))) {\r\n advance(); // consume 'x'\r\n let raw2 = \"\";\r\n if (peek() === \"-\") raw2 += advance();\r\n while (isDigit(peek())) raw2 += advance();\r\n if (peek() === \".\") {\r\n raw2 += advance();\r\n while (isDigit(peek())) raw2 += advance();\r\n }\r\n const second = parseFloat(raw2);\r\n push(\"dimension\", `${raw}x${raw2}`, startLine, startCol, startIdx, { num: first, num2: second });\r\n continue;\r\n }\r\n push(\"number\", raw, startLine, startCol, startIdx, { num: first });\r\n continue;\r\n }\r\n\r\n // Identifier / keyword\r\n if (isIdentStart(c)) {\r\n let value = \"\";\r\n while (i < src.length && isIdentPart(peek())) value += advance();\r\n push(\"ident\", value, startLine, startCol, startIdx);\r\n continue;\r\n }\r\n\r\n // Unknown character\r\n errors.push({ message: `Unexpected character ${JSON.stringify(c)}`, span: { start: startIdx, end: startIdx + 1 } });\r\n advance();\r\n }\r\n\r\n push(\"eof\", \"\", line, col, i);\r\n return { tokens, errors };\r\n}\r\n","/** Recursive-descent parser: tokens -> PlanNode. Zero dependencies. */\r\n\r\nimport type { Token } from \"./lexer.js\";\r\nimport { lex } from \"./lexer.js\";\r\nimport type { Diagnostic, Span } from \"./diagnostics.js\";\r\nimport type {\r\n DimNode,\r\n DoorNode,\r\n FurnitureNode,\r\n NorthDir,\r\n PlanNode,\r\n Point,\r\n RoomNode,\r\n TitleNode,\r\n WallNode,\r\n WindowNode,\r\n} from \"./ast.js\";\r\n\r\nexport interface ParseOutcome {\r\n plan?: PlanNode;\r\n diagnostics: Diagnostic[];\r\n}\r\n\r\n/** Keywords that begin a plan-body statement; recovery resynchronizes to one. */\r\nconst STATEMENT_STARTS = new Set([\r\n \"units\", \"grid\", \"scale\", \"north\",\r\n \"wall\", \"room\", \"door\", \"window\", \"furniture\", \"dim\", \"title\",\r\n]);\r\n\r\n/** Thrown internally by `eat*` helpers; always caught within the parser. */\r\nclass ParseError extends Error {\r\n constructor(public override message: string, public span: Span) {\r\n super(message);\r\n }\r\n}\r\n\r\nexport function parse(src: string): ParseOutcome {\r\n const { tokens, errors: lexErrors } = lex(src);\r\n const lexDiags: Diagnostic[] = lexErrors.map((e) => ({\r\n severity: \"error\" as const,\r\n message: e.message,\r\n span: e.span,\r\n }));\r\n\r\n const p = new Parser(tokens);\r\n let plan: PlanNode | undefined;\r\n try {\r\n plan = p.parsePlan();\r\n } catch (e) {\r\n // Only a malformed plan *header* escapes parsePlan's per-statement recovery.\r\n if (e instanceof ParseError) {\r\n p.diagnostics.push({ severity: \"error\", message: e.message, span: e.span });\r\n } else {\r\n throw e;\r\n }\r\n }\r\n return { plan, diagnostics: [...lexDiags, ...p.diagnostics] };\r\n}\r\n\r\nclass Parser {\r\n private pos = 0;\r\n public diagnostics: Diagnostic[] = [];\r\n constructor(private toks: Token[]) {}\r\n\r\n private peek(o = 0): Token {\r\n return this.toks[Math.min(this.pos + o, this.toks.length - 1)];\r\n }\r\n private next(): Token {\r\n return this.toks[Math.min(this.pos++, this.toks.length - 1)];\r\n }\r\n private fail(msg: string, t = this.peek()): never {\r\n throw new ParseError(msg, { start: t.start, end: t.end });\r\n }\r\n\r\n /** Span from a start offset to the end of the last consumed token. */\r\n private spanFrom(start: number): Span {\r\n const last = this.toks[Math.max(0, Math.min(this.pos - 1, this.toks.length - 1))];\r\n return { start, end: last.end };\r\n }\r\n\r\n /** Recover after a statement error: skip to the next statement start or block end. */\r\n private synchronize(): void {\r\n // Always make progress so a hard-stuck token can't loop forever.\r\n if (!this.isType(\"rcurly\") && !this.isType(\"eof\")) this.next();\r\n while (!this.isType(\"rcurly\") && !this.isType(\"eof\")) {\r\n const t = this.peek();\r\n if (t.type === \"ident\" && STATEMENT_STARTS.has(t.value)) return;\r\n this.next();\r\n }\r\n }\r\n\r\n private isKeyword(kw: string, o = 0): boolean {\r\n const t = this.peek(o);\r\n return t.type === \"ident\" && t.value === kw;\r\n }\r\n private eatKeyword(kw: string): Token {\r\n const t = this.peek();\r\n if (t.type !== \"ident\" || t.value !== kw) this.fail(`Expected \"${kw}\" but found ${describe(t)}`);\r\n return this.next();\r\n }\r\n private eat(type: Token[\"type\"]): Token {\r\n const t = this.peek();\r\n if (t.type !== type) this.fail(`Expected ${type} but found ${describe(t)}`);\r\n return this.next();\r\n }\r\n private eatIdent(): Token {\r\n return this.eat(\"ident\");\r\n }\r\n private eatNumber(): number {\r\n const t = this.eat(\"number\");\r\n return t.num!;\r\n }\r\n private eatString(): string {\r\n return this.eat(\"string\").value;\r\n }\r\n\r\n parsePlan(): PlanNode {\r\n this.eatKeyword(\"plan\");\r\n const name = this.eatString();\r\n this.eat(\"lcurly\");\r\n\r\n const plan: PlanNode = {\r\n name,\r\n units: \"mm\",\r\n grid: 0,\r\n north: \"up\",\r\n walls: [],\r\n rooms: [],\r\n doors: [],\r\n windows: [],\r\n furniture: [],\r\n dims: [],\r\n };\r\n\r\n while (!this.isType(\"rcurly\") && !this.isType(\"eof\")) {\r\n const t = this.peek();\r\n const start = t.start;\r\n try {\r\n if (t.type !== \"ident\") this.fail(`Expected a statement but found ${describe(t)}`);\r\n switch (t.value) {\r\n case \"units\": {\r\n this.next();\r\n const u = this.eatIdent().value;\r\n if (u !== \"mm\") this.fail(`Unsupported units \"${u}\" (only \"mm\" is supported)`, t);\r\n plan.units = \"mm\";\r\n break;\r\n }\r\n case \"grid\":\r\n this.next();\r\n plan.grid = this.eatNumber();\r\n break;\r\n case \"scale\": {\r\n this.next();\r\n const a = this.eatNumber();\r\n this.eat(\"colon\");\r\n const b = this.eatNumber();\r\n plan.scale = `${a}:${b}`;\r\n break;\r\n }\r\n case \"north\":\r\n this.next();\r\n plan.north = this.parseNorth();\r\n break;\r\n case \"wall\": {\r\n const n = this.parseWall();\r\n n.span = this.spanFrom(start);\r\n plan.walls.push(n);\r\n break;\r\n }\r\n case \"room\": {\r\n const n = this.parseRoom();\r\n n.span = this.spanFrom(start);\r\n plan.rooms.push(n);\r\n break;\r\n }\r\n case \"door\": {\r\n const n = this.parseDoor();\r\n n.span = this.spanFrom(start);\r\n plan.doors.push(n);\r\n break;\r\n }\r\n case \"window\": {\r\n const n = this.parseWindow();\r\n n.span = this.spanFrom(start);\r\n plan.windows.push(n);\r\n break;\r\n }\r\n case \"furniture\": {\r\n const n = this.parseFurniture();\r\n n.span = this.spanFrom(start);\r\n plan.furniture.push(n);\r\n break;\r\n }\r\n case \"dim\": {\r\n const n = this.parseDim();\r\n n.span = this.spanFrom(start);\r\n plan.dims.push(n);\r\n break;\r\n }\r\n case \"title\": {\r\n const n = this.parseTitle();\r\n n.span = this.spanFrom(start);\r\n plan.title = n;\r\n break;\r\n }\r\n default:\r\n this.fail(`Unknown statement \"${t.value}\"`, t);\r\n }\r\n } catch (e) {\r\n if (e instanceof ParseError) {\r\n this.diagnostics.push({ severity: \"error\", message: e.message, span: e.span });\r\n this.synchronize();\r\n } else {\r\n throw e;\r\n }\r\n }\r\n }\r\n // A missing closing brace is reported but the partial plan is still returned.\r\n try {\r\n this.eat(\"rcurly\");\r\n } catch (e) {\r\n if (e instanceof ParseError) {\r\n this.diagnostics.push({ severity: \"error\", message: e.message, span: e.span });\r\n } else {\r\n throw e;\r\n }\r\n }\r\n return plan;\r\n }\r\n\r\n private isType(type: Token[\"type\"]): boolean {\r\n return this.peek().type === type;\r\n }\r\n\r\n /** Optional `id=<ident>` prefix; returns \"\" when absent. */\r\n private parseIdOpt(): string {\r\n if (this.isKeyword(\"id\")) {\r\n this.next();\r\n this.eat(\"equals\");\r\n return this.eatIdent().value;\r\n }\r\n return \"\";\r\n }\r\n\r\n private parseNorth(): NorthDir {\r\n const t = this.peek();\r\n if (t.type === \"number\") {\r\n this.next();\r\n return { deg: t.num! };\r\n }\r\n if (t.type === \"ident\" && [\"up\", \"down\", \"left\", \"right\"].includes(t.value)) {\r\n this.next();\r\n return t.value as NorthDir;\r\n }\r\n this.fail(`Expected a north direction (up|down|left|right|<degrees>) but found ${describe(t)}`);\r\n }\r\n\r\n private parsePoint(): Point {\r\n this.eat(\"lparen\");\r\n const x = this.eatNumber();\r\n this.eat(\"comma\");\r\n const y = this.eatNumber();\r\n this.eat(\"rparen\");\r\n return { x, y };\r\n }\r\n\r\n private parseWall(): WallNode {\r\n const kw = this.eatKeyword(\"wall\");\r\n const id = this.parseIdOpt();\r\n const kind = this.eatIdent().value;\r\n this.eatKeyword(\"thickness\");\r\n const thickness = this.eatNumber();\r\n this.eat(\"lcurly\");\r\n const points: Point[] = [];\r\n let closed = false;\r\n while (!this.isType(\"rcurly\") && !this.isType(\"eof\")) {\r\n if (this.isKeyword(\"close\")) {\r\n this.next();\r\n closed = true;\r\n break;\r\n }\r\n if (this.isType(\"lparen\")) {\r\n points.push(this.parsePoint());\r\n continue;\r\n }\r\n this.fail(`Expected a point \"(x,y)\" or \"close\" in wall body but found ${describe(this.peek())}`);\r\n }\r\n this.eat(\"rcurly\");\r\n if (points.length < 2) this.fail(\"A wall needs at least two points\", kw);\r\n return { id, kind, thickness, points, closed, line: kw.line };\r\n }\r\n\r\n private parseRoom(): RoomNode {\r\n const kw = this.eatKeyword(\"room\");\r\n const id = this.parseIdOpt();\r\n this.eatKeyword(\"at\");\r\n const at = this.parsePoint();\r\n this.eatKeyword(\"size\");\r\n const dim = this.eat(\"dimension\");\r\n const node: RoomNode = { id, at, size: { w: dim.num!, h: dim.num2! }, line: kw.line };\r\n if (this.isKeyword(\"label\")) {\r\n this.next();\r\n node.label = this.eatString();\r\n }\r\n return node;\r\n }\r\n\r\n private parseDoor(): DoorNode {\r\n const kw = this.eatKeyword(\"door\");\r\n const id = this.parseIdOpt();\r\n this.eatKeyword(\"at\");\r\n const at = this.parsePoint();\r\n this.eatKeyword(\"width\");\r\n const width = this.eatNumber();\r\n const node: DoorNode = { id, at, width, hinge: \"left\", swing: \"in\", line: kw.line };\r\n if (this.isKeyword(\"wall\")) {\r\n this.next();\r\n node.wall = this.eatIdent().value;\r\n }\r\n if (this.isKeyword(\"hinge\")) {\r\n this.next();\r\n const h = this.eatIdent().value;\r\n if (h !== \"left\" && h !== \"right\") this.fail(`Expected hinge \"left\" or \"right\" but found \"${h}\"`);\r\n node.hinge = h;\r\n }\r\n if (this.isKeyword(\"swing\")) {\r\n this.next();\r\n const s = this.eatIdent().value;\r\n if (s !== \"in\" && s !== \"out\") this.fail(`Expected swing \"in\" or \"out\" but found \"${s}\"`);\r\n node.swing = s;\r\n }\r\n return node;\r\n }\r\n\r\n private parseWindow(): WindowNode {\r\n const kw = this.eatKeyword(\"window\");\r\n const id = this.parseIdOpt();\r\n this.eatKeyword(\"at\");\r\n const at = this.parsePoint();\r\n this.eatKeyword(\"width\");\r\n const width = this.eatNumber();\r\n const node: WindowNode = { id, at, width, line: kw.line };\r\n if (this.isKeyword(\"wall\")) {\r\n this.next();\r\n node.wall = this.eatIdent().value;\r\n }\r\n return node;\r\n }\r\n\r\n private parseFurniture(): FurnitureNode {\r\n const kw = this.eatKeyword(\"furniture\");\r\n const id = this.parseIdOpt();\r\n const kind = this.eatIdent().value;\r\n this.eatKeyword(\"at\");\r\n const at = this.parsePoint();\r\n this.eatKeyword(\"size\");\r\n const dim = this.eat(\"dimension\");\r\n const node: FurnitureNode = { id, kind, at, size: { w: dim.num!, h: dim.num2! }, line: kw.line };\r\n if (this.isKeyword(\"label\")) {\r\n this.next();\r\n node.label = this.eatString();\r\n }\r\n return node;\r\n }\r\n\r\n private parseDim(): DimNode {\r\n const kw = this.eatKeyword(\"dim\");\r\n const from = this.parsePoint();\r\n this.eat(\"arrow\");\r\n const to = this.parsePoint();\r\n const node: DimNode = { id: \"\", from, to, offset: 300, line: kw.line };\r\n if (this.isKeyword(\"offset\")) {\r\n this.next();\r\n node.offset = this.eatNumber();\r\n }\r\n if (this.isKeyword(\"text\")) {\r\n this.next();\r\n node.text = this.eatString();\r\n }\r\n return node;\r\n }\r\n\r\n private parseTitle(): TitleNode {\r\n const kw = this.eatKeyword(\"title\");\r\n this.eat(\"lcurly\");\r\n const node: TitleNode = { line: kw.line };\r\n while (!this.isType(\"rcurly\") && !this.isType(\"eof\")) {\r\n const t = this.peek();\r\n if (t.type !== \"ident\") this.fail(`Expected a title field but found ${describe(t)}`);\r\n switch (t.value) {\r\n case \"project\":\r\n this.next();\r\n node.project = this.eatString();\r\n break;\r\n case \"drawn_by\":\r\n this.next();\r\n node.drawnBy = this.eatString();\r\n break;\r\n case \"date\":\r\n this.next();\r\n node.date = this.eatString();\r\n break;\r\n default:\r\n this.fail(`Unknown title field \"${t.value}\"`, t);\r\n }\r\n }\r\n this.eat(\"rcurly\");\r\n return node;\r\n }\r\n}\r\n\r\nfunction describe(t: Token): string {\r\n if (t.type === \"eof\") return \"end of input\";\r\n if (t.type === \"string\") return `string ${JSON.stringify(t.value)}`;\r\n return `\"${t.value}\"`;\r\n}\r\n","/** Pure geometry helpers. All coordinates in millimetres. Deterministic. */\n\nimport type { PlanNode, Point } from \"./ast.js\";\n\nexport interface Vec {\n x: number;\n y: number;\n}\n\nexport const sub = (a: Point, b: Point): Vec => ({ x: a.x - b.x, y: a.y - b.y });\nexport const add = (a: Point, b: Vec): Point => ({ x: a.x + b.x, y: a.y + b.y });\nexport const mul = (v: Vec, s: number): Vec => ({ x: v.x * s, y: v.y * s });\nexport const length = (v: Vec): number => Math.hypot(v.x, v.y);\nexport function unit(v: Vec): Vec {\n const l = length(v);\n return l === 0 ? { x: 0, y: 0 } : { x: v.x / l, y: v.y / l };\n}\n/** Left normal (rotate +90°). */\nexport const normal = (v: Vec): Vec => ({ x: -v.y, y: v.x });\n\nexport interface Bounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport const emptyBounds = (): Bounds => ({\n minX: Infinity,\n minY: Infinity,\n maxX: -Infinity,\n maxY: -Infinity,\n});\n\nexport function extendBounds(b: Bounds, x: number, y: number): void {\n if (x < b.minX) b.minX = x;\n if (y < b.minY) b.minY = y;\n if (x > b.maxX) b.maxX = x;\n if (y > b.maxY) b.maxY = y;\n}\n\n/** Distance from point p to segment ab. */\nexport function distPointToSegment(p: Point, a: Point, b: Point): number {\n const abx = b.x - a.x;\n const aby = b.y - a.y;\n const apx = p.x - a.x;\n const apy = p.y - a.y;\n const len2 = abx * abx + aby * aby;\n let t = len2 === 0 ? 0 : (apx * abx + apy * aby) / len2;\n t = Math.max(0, Math.min(1, t));\n const cx = a.x + t * abx;\n const cy = a.y + t * aby;\n return Math.hypot(p.x - cx, p.y - cy);\n}\n\n/** Axis-aligned rectangle corners (clockwise) from origin + size. */\nexport function rectCorners(x: number, y: number, w: number, h: number): Point[] {\n return [\n { x, y },\n { x: x + w, y },\n { x: x + w, y: y + h },\n { x, y: y + h },\n ];\n}\n\n/**\n * Square-capped offset rectangle for a wall segment: the segment is widened by\n * `thickness` and extended by `thickness/2` at each end so orthogonal corners\n * fill cleanly when adjacent segments are drawn.\n */\nexport function segmentRectangle(a: Point, b: Point, thickness: number): Point[] {\n const d = unit(sub(b, a));\n const n = normal(d);\n const half = thickness / 2;\n const a2 = add(a, mul(d, -half));\n const b2 = add(b, mul(d, half));\n return [\n add(a2, mul(n, half)),\n add(b2, mul(n, half)),\n add(b2, mul(n, -half)),\n add(a2, mul(n, -half)),\n ];\n}\n\nexport interface WallSegment {\n a: Point;\n b: Point;\n thickness: number;\n kind: string;\n}\n\n/** Flatten all walls to their individual segments. */\nexport function wallSegments(plan: PlanNode): WallSegment[] {\n const segs: WallSegment[] = [];\n for (const w of plan.walls) {\n for (let k = 0; k < w.points.length - 1; k++) {\n segs.push({ a: w.points[k], b: w.points[k + 1], thickness: w.thickness, kind: w.kind });\n }\n if (w.closed && w.points.length > 2) {\n segs.push({ a: w.points[w.points.length - 1], b: w.points[0], thickness: w.thickness, kind: w.kind });\n }\n }\n return segs;\n}\n\n/** The wall segment hosting an opening point (nearest), filtered by ref if given. */\nexport function hostSegment(plan: PlanNode, at: Point, wallRef?: string): WallSegment | null {\n const walls = wallRef\n ? plan.walls.filter((w) => w.id === wallRef || w.kind === wallRef)\n : plan.walls;\n let best: WallSegment | null = null;\n let bestDist = Infinity;\n for (const w of walls) {\n const segs: [Point, Point][] = [];\n for (let k = 0; k < w.points.length - 1; k++) segs.push([w.points[k], w.points[k + 1]]);\n if (w.closed && w.points.length > 2) segs.push([w.points[w.points.length - 1], w.points[0]]);\n for (const [a, b] of segs) {\n const dist = distPointToSegment(at, a, b);\n if (dist < bestDist) {\n bestDist = dist;\n best = { a, b, thickness: w.thickness, kind: w.kind };\n }\n }\n }\n return best;\n}\n\n/** Drawing bounds over walls (offset by thickness), rooms, furniture, and dims. */\nexport function planBounds(plan: PlanNode): Bounds {\n const b = emptyBounds();\n for (const seg of wallSegments(plan)) {\n for (const c of segmentRectangle(seg.a, seg.b, seg.thickness)) extendBounds(b, c.x, c.y);\n }\n for (const r of plan.rooms) {\n extendBounds(b, r.at.x, r.at.y);\n extendBounds(b, r.at.x + r.size.w, r.at.y + r.size.h);\n }\n for (const f of plan.furniture) {\n extendBounds(b, f.at.x, f.at.y);\n extendBounds(b, f.at.x + f.size.w, f.at.y + f.size.h);\n }\n for (const d of plan.dims) {\n extendBounds(b, d.from.x, d.from.y);\n extendBounds(b, d.to.x, d.to.y);\n }\n if (!isFinite(b.minX)) {\n // Nothing to draw; provide a default frame.\n return { minX: 0, minY: 0, maxX: 1000, maxY: 1000 };\n }\n return b;\n}\n","/** Semantic analysis: grid-snap, auto-id assignment, and sanity checks. */\r\n\r\nimport type { PlanNode, Point } from \"./ast.js\";\r\nimport type { Diagnostic, Span } from \"./diagnostics.js\";\r\nimport { distPointToSegment } from \"./geometry.js\";\r\n\r\n/**\r\n * Validate a parsed plan, returning all semantic problems as diagnostics.\r\n *\r\n * NOTE: still mutates `plan` in place (grid-snap + auto-id assignment); the\r\n * AST→IR split that makes this pure is deferred to v0.3.\r\n */\r\nexport function validate(plan: PlanNode): Diagnostic[] {\r\n const diags: Diagnostic[] = [];\r\n const error = (message: string, code: string, span?: Span) =>\r\n diags.push({ severity: \"error\", message, code, span });\r\n const warn = (message: string, code: string, span?: Span) =>\r\n diags.push({ severity: \"warning\", message, code, span });\r\n\r\n // --- Grid snapping -------------------------------------------------------\r\n const g = plan.grid;\r\n const snap = (v: number) => (g > 0 ? Math.round(v / g) * g : v);\r\n const snapPt = (p: Point): Point => ({ x: snap(p.x), y: snap(p.y) });\r\n\r\n for (const w of plan.walls) {\r\n w.points = w.points.map(snapPt);\r\n w.thickness = snap(w.thickness) || w.thickness;\r\n }\r\n for (const r of plan.rooms) {\r\n r.at = snapPt(r.at);\r\n r.size = { w: snap(r.size.w), h: snap(r.size.h) };\r\n }\r\n for (const f of plan.furniture) {\r\n f.at = snapPt(f.at);\r\n f.size = { w: snap(f.size.w), h: snap(f.size.h) };\r\n }\r\n for (const d of plan.doors) {\r\n d.at = snapPt(d.at);\r\n d.width = snap(d.width) || d.width;\r\n }\r\n for (const win of plan.windows) {\r\n win.at = snapPt(win.at);\r\n win.width = snap(win.width) || win.width;\r\n }\r\n for (const dm of plan.dims) {\r\n dm.from = snapPt(dm.from);\r\n dm.to = snapPt(dm.to);\r\n }\r\n\r\n // --- Auto-id assignment + duplicate detection ----------------------------\r\n const seen = new Set<string>();\r\n const assign = (provided: string, prefix: string, idx: number, span?: Span): string => {\r\n if (provided) {\r\n if (seen.has(provided)) {\r\n error(`Duplicate id \"${provided}\"`, \"E_DUP_ID\", span);\r\n }\r\n seen.add(provided);\r\n return provided;\r\n }\r\n let auto = `${prefix}_${idx}`;\r\n while (seen.has(auto)) auto = `${auto}_`;\r\n seen.add(auto);\r\n return auto;\r\n };\r\n\r\n plan.walls.forEach((w, i) => (w.id = assign(w.id, w.kind || \"wall\", i + 1, w.span)));\r\n plan.rooms.forEach((r, i) => (r.id = assign(r.id, \"room\", i + 1, r.span)));\r\n plan.doors.forEach((d, i) => (d.id = assign(d.id, \"door\", i + 1, d.span)));\r\n plan.windows.forEach((w, i) => (w.id = assign(w.id, \"window\", i + 1, w.span)));\r\n plan.furniture.forEach((f, i) => (f.id = assign(f.id, f.kind || \"furniture\", i + 1, f.span)));\r\n plan.dims.forEach((d, i) => (d.id = assign(d.id, \"dim\", i + 1, d.span)));\r\n\r\n // --- Dimension sanity ----------------------------------------------------\r\n for (const r of plan.rooms) {\r\n if (r.size.w <= 0 || r.size.h <= 0)\r\n error(`Room \"${r.id}\" must have a positive size`, \"E_ROOM_SIZE\", r.span);\r\n }\r\n for (const f of plan.furniture) {\r\n if (f.size.w <= 0 || f.size.h <= 0)\r\n error(`Furniture \"${f.id}\" must have a positive size`, \"E_FURN_SIZE\", f.span);\r\n }\r\n for (const d of plan.doors) {\r\n if (d.width <= 0) error(`Door \"${d.id}\" must have a positive width`, \"E_DOOR_WIDTH\", d.span);\r\n }\r\n for (const w of plan.windows) {\r\n if (w.width <= 0) error(`Window \"${w.id}\" must have a positive width`, \"E_WINDOW_WIDTH\", w.span);\r\n }\r\n for (const w of plan.walls) {\r\n if (w.thickness <= 0)\r\n error(`Wall \"${w.id}\" must have a positive thickness`, \"E_WALL_THICKNESS\", w.span);\r\n }\r\n\r\n if (\r\n plan.walls.length === 0 &&\r\n plan.rooms.length === 0 &&\r\n plan.furniture.length === 0\r\n ) {\r\n warn(\"Plan has no walls, rooms, or furniture — nothing to draw\", \"W_EMPTY_PLAN\");\r\n }\r\n\r\n // --- Openings should lie on a wall --------------------------------------\r\n const onSomeWall = (at: Point, wallRef?: string): boolean => {\r\n const candidates = wallRef\r\n ? plan.walls.filter((w) => w.id === wallRef || w.kind === wallRef)\r\n : plan.walls;\r\n for (const w of candidates) {\r\n const tol = w.thickness / 2 + Math.max(w.thickness, 1);\r\n for (let k = 0; k < w.points.length - 1; k++) {\r\n if (distPointToSegment(at, w.points[k], w.points[k + 1]) <= tol) return true;\r\n }\r\n if (w.closed && w.points.length > 2) {\r\n if (distPointToSegment(at, w.points[w.points.length - 1], w.points[0]) <= tol) return true;\r\n }\r\n }\r\n return false;\r\n };\r\n for (const d of plan.doors) {\r\n if (plan.walls.length > 0 && !onSomeWall(d.at, d.wall))\r\n warn(`Door \"${d.id}\" does not lie on any wall`, \"W_DOOR_OFF_WALL\", d.span);\r\n }\r\n for (const w of plan.windows) {\r\n if (plan.walls.length > 0 && !onSomeWall(w.at, w.wall))\r\n warn(`Window \"${w.id}\" does not lie on any wall`, \"W_WINDOW_OFF_WALL\", w.span);\r\n }\r\n\r\n // --- Overlapping rooms (advisory) ---------------------------------------\r\n for (let a = 0; a < plan.rooms.length; a++) {\r\n for (let b = a + 1; b < plan.rooms.length; b++) {\r\n const r1 = plan.rooms[a];\r\n const r2 = plan.rooms[b];\r\n const ox = Math.max(0, Math.min(r1.at.x + r1.size.w, r2.at.x + r2.size.w) - Math.max(r1.at.x, r2.at.x));\r\n const oy = Math.max(0, Math.min(r1.at.y + r1.size.h, r2.at.y + r2.size.h) - Math.max(r1.at.y, r2.at.y));\r\n if (ox > 1 && oy > 1) {\r\n warn(`Rooms \"${r1.id}\" and \"${r2.id}\" overlap`, \"W_ROOM_OVERLAP\", r2.span);\r\n }\r\n }\r\n }\r\n\r\n return diags;\r\n}\r\n","/** Renders a validated PlanNode to a professional SVG floor plan. Deterministic. */\n\nimport type { PlanNode, Point } from \"./ast.js\";\nimport type { CompileOptions } from \"./types.js\";\nimport {\n add,\n hostSegment,\n length,\n mul,\n normal,\n planBounds,\n rectCorners,\n segmentRectangle,\n sub,\n unit,\n wallSegments,\n} from \"./geometry.js\";\n\nconst THEME = {\n bg: \"#ffffff\",\n pocheBase: \"#e9e4db\",\n pocheHatch: \"#b9b1a4\",\n wallStroke: \"#1b1b1b\",\n roomFill: \"#fbfaf7\",\n roomLabel: \"#222222\",\n areaLabel: \"#7a7a7a\",\n furnitureStroke: \"#a8a29a\",\n furnitureFill: \"#f4f2ee\",\n furnitureLabel: \"#9a948c\",\n opening: \"#ffffff\",\n doorLeaf: \"#555555\",\n windowPane: \"#3a6ea5\",\n dim: \"#0E5484\",\n annotation: \"#333333\",\n annotationMuted: \"#888888\",\n};\n\n/** Round to 2 decimals and strip trailing zeros — keeps output stable & compact. */\nfunction fmt(v: number): string {\n const r = Math.round(v * 100) / 100;\n return Object.is(r, -0) ? \"0\" : String(r);\n}\nconst pt = (p: Point): string => `${fmt(p.x)},${fmt(p.y)}`;\n\nfunction xml(s: string): string {\n return s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\nconst NICE_LENGTHS = [500, 1000, 2000, 5000, 10000, 20000, 50000, 100000];\nfunction niceBarLength(target: number): number {\n let best = NICE_LENGTHS[0];\n for (const v of NICE_LENGTHS) if (v <= target) best = v;\n return best;\n}\n\nexport function render(plan: PlanNode, opts: CompileOptions = {}): string {\n const b = planBounds(plan);\n const drawW = b.maxX - b.minX;\n const drawH = b.maxY - b.minY;\n const refDim = Math.max(drawW, drawH, 1);\n\n const wallStroke = refDim * 0.0028;\n const thin = refDim * 0.0016;\n const roomFont = refDim * 0.03;\n const areaFont = refDim * 0.022;\n const dimFont = refDim * 0.02;\n const furnFont = refDim * 0.017;\n const margin = refDim * 0.17;\n const hatchGap = refDim * 0.013;\n\n const vbX = b.minX - margin;\n const vbY = b.minY - margin;\n const vbW = drawW + margin * 2;\n const vbH = drawH + margin * 2;\n\n const out: string[] = [];\n const svgAttrs = opts.width\n ? `width=\"${fmt(opts.width)}\" height=\"${fmt((opts.width * vbH) / vbW)}\"`\n : \"\";\n out.push(\n `<svg xmlns=\"http://www.w3.org/2000/svg\" ${svgAttrs} viewBox=\"${fmt(vbX)} ${fmt(vbY)} ${fmt(vbW)} ${fmt(vbH)}\" font-family=\"Helvetica, Arial, sans-serif\">`,\n );\n\n // Defs: poché hatch pattern\n out.push(\n `<defs><pattern id=\"poche\" patternUnits=\"userSpaceOnUse\" width=\"${fmt(hatchGap)}\" height=\"${fmt(hatchGap)}\" patternTransform=\"rotate(45)\">` +\n `<rect width=\"${fmt(hatchGap)}\" height=\"${fmt(hatchGap)}\" fill=\"${THEME.pocheBase}\"/>` +\n `<line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"${fmt(hatchGap)}\" stroke=\"${THEME.pocheHatch}\" stroke-width=\"${fmt(thin * 0.7)}\"/>` +\n `</pattern></defs>`,\n );\n\n // Background\n out.push(`<rect x=\"${fmt(vbX)}\" y=\"${fmt(vbY)}\" width=\"${fmt(vbW)}\" height=\"${fmt(vbH)}\" fill=\"${THEME.bg}\"/>`);\n\n // 1. Room floor fills\n for (const r of plan.rooms) {\n const c = rectCorners(r.at.x, r.at.y, r.size.w, r.size.h);\n out.push(`<polygon points=\"${c.map(pt).join(\" \")}\" fill=\"${THEME.roomFill}\"/>`);\n }\n\n // 2. Furniture\n for (const f of plan.furniture) {\n const c = rectCorners(f.at.x, f.at.y, f.size.w, f.size.h);\n out.push(\n `<polygon points=\"${c.map(pt).join(\" \")}\" fill=\"${THEME.furnitureFill}\" stroke=\"${THEME.furnitureStroke}\" stroke-width=\"${fmt(thin)}\"/>`,\n );\n if (f.label) {\n const cx = f.at.x + f.size.w / 2;\n const cy = f.at.y + f.size.h / 2;\n out.push(\n `<text x=\"${fmt(cx)}\" y=\"${fmt(cy)}\" font-size=\"${fmt(furnFont)}\" fill=\"${THEME.furnitureLabel}\" text-anchor=\"middle\" dominant-baseline=\"central\">${xml(f.label)}</text>`,\n );\n }\n }\n\n // 3. Walls — poché fill (extended rect) + crisp faces (non-extended)\n const segs = wallSegments(plan);\n for (const s of segs) {\n const poly = segmentRectangle(s.a, s.b, s.thickness);\n out.push(`<polygon points=\"${poly.map(pt).join(\" \")}\" fill=\"url(#poche)\"/>`);\n }\n for (const s of segs) {\n const d = unit(sub(s.b, s.a));\n const n = normal(d);\n const h = s.thickness / 2;\n const fa1 = add(s.a, mul(n, h));\n const fb1 = add(s.b, mul(n, h));\n const fa2 = add(s.a, mul(n, -h));\n const fb2 = add(s.b, mul(n, -h));\n out.push(\n `<line x1=\"${fmt(fa1.x)}\" y1=\"${fmt(fa1.y)}\" x2=\"${fmt(fb1.x)}\" y2=\"${fmt(fb1.y)}\" stroke=\"${THEME.wallStroke}\" stroke-width=\"${fmt(wallStroke)}\" stroke-linecap=\"square\"/>`,\n );\n out.push(\n `<line x1=\"${fmt(fa2.x)}\" y1=\"${fmt(fa2.y)}\" x2=\"${fmt(fb2.x)}\" y2=\"${fmt(fb2.y)}\" stroke=\"${THEME.wallStroke}\" stroke-width=\"${fmt(wallStroke)}\" stroke-linecap=\"square\"/>`,\n );\n }\n\n // 4. Openings (doors + windows): erase wall, then draw symbol\n for (const dr of plan.doors) {\n const seg = hostSegment(plan, dr.at, dr.wall);\n if (!seg) continue;\n const d = unit(sub(seg.b, seg.a));\n const n = normal(d);\n const h = seg.thickness / 2 + wallStroke;\n const hw = dr.width / 2;\n // erase\n const cover = [\n add(add(dr.at, mul(d, -hw)), mul(n, h)),\n add(add(dr.at, mul(d, hw)), mul(n, h)),\n add(add(dr.at, mul(d, hw)), mul(n, -h)),\n add(add(dr.at, mul(d, -hw)), mul(n, -h)),\n ];\n out.push(`<polygon points=\"${cover.map(pt).join(\" \")}\" fill=\"${THEME.opening}\"/>`);\n // door symbol\n const hinge = dr.hinge === \"left\" ? add(dr.at, mul(d, -hw)) : add(dr.at, mul(d, hw));\n const farJamb = dr.hinge === \"left\" ? add(dr.at, mul(d, hw)) : add(dr.at, mul(d, -hw));\n const leafDir = dr.swing === \"in\" ? n : mul(n, -1);\n const leafEnd = add(hinge, mul(leafDir, dr.width));\n const cross = (leafEnd.x - hinge.x) * (farJamb.y - hinge.y) - (leafEnd.y - hinge.y) * (farJamb.x - hinge.x);\n const sweep = cross < 0 ? 1 : 0;\n out.push(\n `<line x1=\"${fmt(hinge.x)}\" y1=\"${fmt(hinge.y)}\" x2=\"${fmt(leafEnd.x)}\" y2=\"${fmt(leafEnd.y)}\" stroke=\"${THEME.doorLeaf}\" stroke-width=\"${fmt(thin * 1.3)}\"/>`,\n );\n out.push(\n `<path d=\"M ${pt(leafEnd)} A ${fmt(dr.width)} ${fmt(dr.width)} 0 0 ${sweep} ${pt(farJamb)}\" fill=\"none\" stroke=\"${THEME.doorLeaf}\" stroke-width=\"${fmt(thin)}\" stroke-dasharray=\"${fmt(thin * 4)} ${fmt(thin * 3)}\"/>`,\n );\n }\n for (const wn of plan.windows) {\n const seg = hostSegment(plan, wn.at, wn.wall);\n if (!seg) continue;\n const d = unit(sub(seg.b, seg.a));\n const n = normal(d);\n const h = seg.thickness / 2;\n const he = h + wallStroke;\n const hw = wn.width / 2;\n const cover = [\n add(add(wn.at, mul(d, -hw)), mul(n, he)),\n add(add(wn.at, mul(d, hw)), mul(n, he)),\n add(add(wn.at, mul(d, hw)), mul(n, -he)),\n add(add(wn.at, mul(d, -hw)), mul(n, -he)),\n ];\n out.push(`<polygon points=\"${cover.map(pt).join(\" \")}\" fill=\"${THEME.opening}\"/>`);\n const jA = add(wn.at, mul(d, -hw));\n const jB = add(wn.at, mul(d, hw));\n for (const off of [h, -h]) {\n const a = add(jA, mul(n, off));\n const bb = add(jB, mul(n, off));\n out.push(\n `<line x1=\"${fmt(a.x)}\" y1=\"${fmt(a.y)}\" x2=\"${fmt(bb.x)}\" y2=\"${fmt(bb.y)}\" stroke=\"${THEME.wallStroke}\" stroke-width=\"${fmt(thin)}\"/>`,\n );\n }\n out.push(\n `<line x1=\"${fmt(jA.x)}\" y1=\"${fmt(jA.y)}\" x2=\"${fmt(jB.x)}\" y2=\"${fmt(jB.y)}\" stroke=\"${THEME.windowPane}\" stroke-width=\"${fmt(thin)}\"/>`,\n );\n }\n\n // 5. Room labels + area (on top)\n for (const r of plan.rooms) {\n const cx = r.at.x + r.size.w / 2;\n const cy = r.at.y + r.size.h / 2;\n const areaM2 = ((r.size.w / 1000) * (r.size.h / 1000)).toFixed(1);\n if (r.label) {\n out.push(\n `<text x=\"${fmt(cx)}\" y=\"${fmt(cy - roomFont * 0.2)}\" font-size=\"${fmt(roomFont)}\" fill=\"${THEME.roomLabel}\" text-anchor=\"middle\" dominant-baseline=\"central\" font-weight=\"600\">${xml(r.label)}</text>`,\n );\n }\n out.push(\n `<text x=\"${fmt(cx)}\" y=\"${fmt(cy + (r.label ? roomFont * 0.9 : 0))}\" font-size=\"${fmt(areaFont)}\" fill=\"${THEME.areaLabel}\" text-anchor=\"middle\" dominant-baseline=\"central\">${areaM2} m²</text>`,\n );\n }\n\n // 6. Dimensions\n for (const dm of plan.dims) {\n const dir = unit(sub(dm.to, dm.from));\n const n = normal(dir);\n const off = mul(n, dm.offset);\n const p1 = add(dm.from, off);\n const p2 = add(dm.to, off);\n const tick = refDim * 0.012;\n // extension lines\n out.push(\n `<line x1=\"${fmt(dm.from.x)}\" y1=\"${fmt(dm.from.y)}\" x2=\"${fmt(p1.x)}\" y2=\"${fmt(p1.y)}\" stroke=\"${THEME.dim}\" stroke-width=\"${fmt(thin * 0.7)}\"/>`,\n );\n out.push(\n `<line x1=\"${fmt(dm.to.x)}\" y1=\"${fmt(dm.to.y)}\" x2=\"${fmt(p2.x)}\" y2=\"${fmt(p2.y)}\" stroke=\"${THEME.dim}\" stroke-width=\"${fmt(thin * 0.7)}\"/>`,\n );\n // dimension line\n out.push(\n `<line x1=\"${fmt(p1.x)}\" y1=\"${fmt(p1.y)}\" x2=\"${fmt(p2.x)}\" y2=\"${fmt(p2.y)}\" stroke=\"${THEME.dim}\" stroke-width=\"${fmt(thin)}\"/>`,\n );\n // ticks (45°)\n for (const p of [p1, p2]) {\n const t1 = add(p, mul(unit({ x: dir.x + n.x, y: dir.y + n.y }), tick));\n const t2 = add(p, mul(unit({ x: dir.x + n.x, y: dir.y + n.y }), -tick));\n out.push(\n `<line x1=\"${fmt(t1.x)}\" y1=\"${fmt(t1.y)}\" x2=\"${fmt(t2.x)}\" y2=\"${fmt(t2.y)}\" stroke=\"${THEME.dim}\" stroke-width=\"${fmt(thin)}\"/>`,\n );\n }\n // text\n const mid = { x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 };\n const tp = add(mid, mul(n, dimFont * 0.7));\n let angle = (Math.atan2(dir.y, dir.x) * 180) / Math.PI;\n if (angle > 90) angle -= 180;\n if (angle < -90) angle += 180;\n const label = dm.text ?? String(Math.round(length(sub(dm.to, dm.from))));\n out.push(\n `<text x=\"${fmt(tp.x)}\" y=\"${fmt(tp.y)}\" font-size=\"${fmt(dimFont)}\" fill=\"${THEME.dim}\" text-anchor=\"middle\" dominant-baseline=\"central\" transform=\"rotate(${fmt(angle)} ${fmt(tp.x)} ${fmt(tp.y)})\">${xml(label)}</text>`,\n );\n }\n\n // 7. North arrow (top-right band)\n out.push(northArrow(plan, b, margin, refDim));\n\n // 8. Scale bar (bottom-left band)\n out.push(scaleBar(b, margin, refDim, thin));\n\n // 9. Title block (bottom-right band)\n const tb = titleBlock(plan, b, margin, refDim, thin);\n if (tb) out.push(tb);\n\n out.push(\"</svg>\");\n return out.join(\"\\n\");\n}\n\nfunction northArrow(plan: PlanNode, b: ReturnType<typeof planBounds>, margin: number, refDim: number): string {\n const r = refDim * 0.045;\n const cx = b.maxX - r;\n const cy = b.minY - margin * 0.55;\n let deg: number;\n switch (plan.north) {\n case \"up\": deg = 0; break;\n case \"down\": deg = 180; break;\n case \"left\": deg = 270; break;\n case \"right\": deg = 90; break;\n default: deg = typeof plan.north === \"object\" ? plan.north.deg : 0;\n }\n const fs = refDim * 0.026;\n // Triangle points \"up\" before rotation; only the arrow rotates — the \"N\"\n // label stays upright at the pointing end so it always reads correctly.\n const tri = `${fmt(cx)},${fmt(cy - r)} ${fmt(cx - r * 0.5)},${fmt(cy + r * 0.6)} ${fmt(cx)},${fmt(cy + r * 0.25)} ${fmt(cx + r * 0.5)},${fmt(cy + r * 0.6)}`;\n const rad = (deg * Math.PI) / 180;\n // North screen vector (rotate the \"up\" vector (0,-1) clockwise by deg).\n const nx = Math.sin(rad);\n const ny = -Math.cos(rad);\n const lx = cx + nx * (r + fs * 0.8);\n const ly = cy + ny * (r + fs * 0.8);\n return (\n `<g>` +\n `<polygon points=\"${tri}\" fill=\"${THEME.annotation}\" transform=\"rotate(${fmt(deg)} ${fmt(cx)} ${fmt(cy)})\"/>` +\n `<text x=\"${fmt(lx)}\" y=\"${fmt(ly)}\" font-size=\"${fmt(fs)}\" fill=\"${THEME.annotation}\" text-anchor=\"middle\" dominant-baseline=\"central\">N</text>` +\n `</g>`\n );\n}\n\nfunction scaleBar(b: ReturnType<typeof planBounds>, margin: number, refDim: number, thin: number): string {\n const barLen = niceBarLength(refDim * 0.3);\n const x0 = b.minX;\n const y0 = b.maxY + margin * 0.55;\n const hgt = refDim * 0.014;\n const fs = refDim * 0.02;\n const parts: string[] = [];\n const half = barLen / 2;\n // two-segment alternating bar\n parts.push(`<rect x=\"${fmt(x0)}\" y=\"${fmt(y0)}\" width=\"${fmt(half)}\" height=\"${fmt(hgt)}\" fill=\"${THEME.annotation}\"/>`);\n parts.push(\n `<rect x=\"${fmt(x0 + half)}\" y=\"${fmt(y0)}\" width=\"${fmt(half)}\" height=\"${fmt(hgt)}\" fill=\"none\" stroke=\"${THEME.annotation}\" stroke-width=\"${fmt(thin)}\"/>`,\n );\n parts.push(\n `<text x=\"${fmt(x0)}\" y=\"${fmt(y0 + hgt + fs)}\" font-size=\"${fmt(fs)}\" fill=\"${THEME.annotation}\" text-anchor=\"start\" dominant-baseline=\"central\">0</text>`,\n );\n parts.push(\n `<text x=\"${fmt(x0 + barLen)}\" y=\"${fmt(y0 + hgt + fs)}\" font-size=\"${fmt(fs)}\" fill=\"${THEME.annotation}\" text-anchor=\"middle\" dominant-baseline=\"central\">${barLen / 1000} m</text>`,\n );\n return `<g>${parts.join(\"\")}</g>`;\n}\n\nfunction titleBlock(\n plan: PlanNode,\n b: ReturnType<typeof planBounds>,\n margin: number,\n refDim: number,\n thin: number,\n): string | null {\n const t = plan.title;\n if (!t && !plan.scale) return null;\n const boxW = refDim * 0.34;\n const boxH = margin * 0.82;\n const x0 = b.maxX - boxW;\n const y0 = b.maxY + margin * 0.15;\n const fs = refDim * 0.019;\n const pad = boxW * 0.05;\n const lines: { k: string; v: string }[] = [];\n if (t?.project) lines.push({ k: \"PROJECT\", v: t.project });\n if (t?.drawnBy) lines.push({ k: \"DRAWN BY\", v: t.drawnBy });\n if (t?.date) lines.push({ k: \"DATE\", v: t.date });\n if (plan.scale) lines.push({ k: \"SCALE\", v: plan.scale });\n\n const parts: string[] = [];\n parts.push(\n `<rect x=\"${fmt(x0)}\" y=\"${fmt(y0)}\" width=\"${fmt(boxW)}\" height=\"${fmt(boxH)}\" fill=\"none\" stroke=\"${THEME.annotation}\" stroke-width=\"${fmt(thin)}\"/>`,\n );\n const rowH = boxH / Math.max(lines.length, 1);\n lines.forEach((ln, i) => {\n const ly = y0 + rowH * (i + 0.5);\n parts.push(\n `<text x=\"${fmt(x0 + pad)}\" y=\"${fmt(ly)}\" font-size=\"${fmt(fs * 0.8)}\" fill=\"${THEME.annotationMuted}\" dominant-baseline=\"central\">${xml(ln.k)}</text>`,\n );\n parts.push(\n `<text x=\"${fmt(x0 + boxW - pad)}\" y=\"${fmt(ly)}\" font-size=\"${fmt(fs)}\" fill=\"${THEME.annotation}\" text-anchor=\"end\" dominant-baseline=\"central\">${xml(ln.v)}</text>`,\n );\n if (i > 0)\n parts.push(\n `<line x1=\"${fmt(x0)}\" y1=\"${fmt(y0 + rowH * i)}\" x2=\"${fmt(x0 + boxW)}\" y2=\"${fmt(y0 + rowH * i)}\" stroke=\"${THEME.annotation}\" stroke-width=\"${fmt(thin * 0.5)}\"/>`,\n );\n });\n return `<g>${parts.join(\"\")}</g>`;\n}\n","/**\r\n * Diagnostics for the ArchLang compiler.\r\n *\r\n * A {@link Diagnostic} is the single, span-carrying problem record produced by\r\n * every compiler stage (lex/parse/validate). The legacy `{message, line, col}`\r\n * `errors`/`warnings` arrays on {@link import(\"./types.js\").CompileResult} are\r\n * *derived* from these. {@link formatDiagnostic} renders a codespan-style,\r\n * caret-framed snippet — zero dependencies, pure, isomorphic.\r\n */\r\n\r\n/** A half-open byte range `[start, end)` into the source string. */\r\nexport interface Span {\r\n start: number;\r\n end: number;\r\n}\r\n\r\nexport type Severity = \"error\" | \"warning\";\r\n\r\nexport interface Diagnostic {\r\n severity: Severity;\r\n message: string;\r\n /** Source location; absent for whole-program problems (e.g. an empty plan). */\r\n span?: Span;\r\n /** Stable machine code, e.g. `\"E_ROOM_SIZE\"`. */\r\n code?: string;\r\n /** Optional follow-up suggestions, each rendered as a `= help:` line. */\r\n hints?: string[];\r\n}\r\n\r\n/** Convert a byte offset into a 1-based `{line, col}`. Offsets are clamped. */\r\nexport function offsetToLineCol(source: string, offset: number): { line: number; col: number } {\r\n const o = Math.max(0, Math.min(offset, source.length));\r\n let line = 1;\r\n let col = 1;\r\n for (let k = 0; k < o; k++) {\r\n if (source[k] === \"\\n\") {\r\n line++;\r\n col = 1;\r\n } else {\r\n col++;\r\n }\r\n }\r\n return { line, col };\r\n}\r\n\r\n/** Byte offset of the start of the line containing `offset`. */\r\nfunction lineStart(source: string, offset: number): number {\r\n let k = Math.max(0, Math.min(offset, source.length));\r\n while (k > 0 && source[k - 1] !== \"\\n\") k--;\r\n return k;\r\n}\r\n\r\n/** Byte offset just past the end of the line containing `offset` (excludes `\\n`). */\r\nfunction lineEnd(source: string, offset: number): number {\r\n let k = Math.max(0, Math.min(offset, source.length));\r\n while (k < source.length && source[k] !== \"\\n\") k++;\r\n return k;\r\n}\r\n\r\n/**\r\n * Render a diagnostic as a framed source snippet:\r\n *\r\n * ```text\r\n * error[E_ROOM_SIZE]: room \"bed\" must have a positive size\r\n * --> 4:30\r\n * |\r\n * 4 | room id=bed at (0,0) size 0x4000\r\n * | ^^^^^^ width is 0\r\n * = help: did you mean 3000x4000?\r\n * ```\r\n *\r\n * With no `span`, only the header line is produced.\r\n */\r\nexport function formatDiagnostic(source: string, d: Diagnostic): string {\r\n const codeTag = d.code ? `[${d.code}]` : \"\";\r\n const header = `${d.severity}${codeTag}: ${d.message}`;\r\n const lines: string[] = [header];\r\n\r\n if (d.span) {\r\n const { line, col } = offsetToLineCol(source, d.span.start);\r\n const ls = lineStart(source, d.span.start);\r\n const le = lineEnd(source, d.span.start);\r\n const srcLine = source.slice(ls, le);\r\n // Underline within this one line; multi-line spans underline to line end.\r\n const caretStart = d.span.start - ls;\r\n const caretEnd = Math.min(d.span.end, le) - ls;\r\n const caretLen = Math.max(1, caretEnd - caretStart);\r\n\r\n const gutter = String(line);\r\n const pad = \" \".repeat(gutter.length);\r\n lines.push(`${pad} --> ${line}:${col}`);\r\n lines.push(`${pad} |`);\r\n lines.push(`${gutter} | ${srcLine}`);\r\n lines.push(`${pad} | ${\" \".repeat(caretStart)}${\"^\".repeat(caretLen)}`);\r\n for (const hint of d.hints ?? []) {\r\n lines.push(`${pad} = help: ${hint}`);\r\n }\r\n } else {\r\n for (const hint of d.hints ?? []) {\r\n lines.push(` = help: ${hint}`);\r\n }\r\n }\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","/**\r\n * ArchLang — compile declarative floor-plan source to a professional SVG.\r\n *\r\n * @example\r\n * import { compile } from \"@chanmeng666/archlang\";\r\n * const { svg, errors } = compile(`plan \"Demo\" { room at (0,0) size 4000x3000 label \"Room\" }`);\r\n */\r\n\r\nimport { parse } from \"./parser.js\";\r\nimport { validate } from \"./validate.js\";\r\nimport { render } from \"./render.js\";\r\nimport { offsetToLineCol } from \"./diagnostics.js\";\r\nimport type { Diagnostic } from \"./diagnostics.js\";\r\nimport type { CompileError, CompileOptions, CompileResult } from \"./types.js\";\r\n\r\nexport type {\r\n CompileError,\r\n CompileOptions,\r\n CompileResult,\r\n CompileWarning,\r\n Diagnostic,\r\n Span,\r\n Severity,\r\n} from \"./types.js\";\r\nexport { formatDiagnostic, offsetToLineCol } from \"./diagnostics.js\";\r\nexport type * from \"./ast.js\";\r\n\r\n/** Small LRU-ish memo cache keyed by source+options. Bounded to 64 entries. */\r\nconst cache = new Map<string, CompileResult>();\r\nconst CACHE_MAX = 64;\r\n\r\nexport function compile(source: string, opts: CompileOptions = {}): CompileResult {\r\n const key = JSON.stringify([source, opts.width ?? null]);\r\n if (!opts.noCache) {\r\n const hit = cache.get(key);\r\n if (hit) return hit;\r\n }\r\n\r\n const result = compileUncached(source, opts);\r\n\r\n if (!opts.noCache) {\r\n if (cache.size >= CACHE_MAX) {\r\n const oldest = cache.keys().next().value;\r\n if (oldest !== undefined) cache.delete(oldest);\r\n }\r\n cache.set(key, result);\r\n }\r\n return result;\r\n}\r\n\r\n/** Project a span-carrying diagnostic onto the legacy `{message, line, col}` shape. */\r\nfunction toLegacy(source: string, d: Diagnostic): CompileError {\r\n if (!d.span) return { message: d.message };\r\n const { line, col } = offsetToLineCol(source, d.span.start);\r\n return { message: d.message, line, col };\r\n}\r\n\r\nfunction compileUncached(source: string, opts: CompileOptions): CompileResult {\r\n const { plan, diagnostics: parseDiags } = parse(source);\r\n\r\n const diagnostics: Diagnostic[] = plan ? [...parseDiags, ...validate(plan)] : [...parseDiags];\r\n\r\n const errs = diagnostics.filter((d) => d.severity === \"error\");\r\n const errors = errs.map((d) => toLegacy(source, d));\r\n const warnings = diagnostics\r\n .filter((d) => d.severity === \"warning\")\r\n .map((d) => toLegacy(source, d));\r\n\r\n // Warnings never block rendering; any error (or no plan) aborts with svg = \"\".\r\n const svg = plan && errs.length === 0 ? render(plan, opts) : \"\";\r\n\r\n return { svg, errors, warnings, diagnostics, ast: plan };\r\n}\r\n\r\n/** Clear the internal compile cache (useful in long-lived processes/tests). */\r\nexport function clearCache(): void {\r\n cache.clear();\r\n}\r\n"],"mappings":"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","names":[]}
|