package cc.unitmesh.xuiper.eval import cc.unitmesh.xuiper.dsl.NanoDSL import cc.unitmesh.xuiper.parser.ParseResult import cc.unitmesh.xuiper.render.HtmlRenderer import java.io.File /** * Renders NanoDSL files to HTML files. * * Run with: ./gradlew :xiuper-ui:renderHtml * Or: ./gradlew :xiuper-ui:renderHtml -PdslDir=testcases/expect -PoutputDir=testcases/html */ fun main(args: Array) { val inputDir = args.getOrNull(0) ?: "testcases/actual/integration" val outputDir = args.getOrNull(1) ?: "testcases/html/integration" val inputDirectory = File(inputDir) val outputDirectory = File(outputDir) if (!inputDirectory.exists() || !inputDirectory.isDirectory) { println("❌ Input directory not found: ${inputDirectory.absolutePath}") return } // Create output directory outputDirectory.mkdirs() val files = inputDirectory.listFiles { f -> f.extension == "nanodsl" }?.sortedBy { it.name } ?: emptyList() if (files.isEmpty()) { println("⚠️ No .nanodsl files found in $inputDir") return } println("=" .repeat(70)) println("NanoDSL to HTML Renderer") println("=" .repeat(70)) println("Input: ${inputDirectory.absolutePath}") println("Output: ${outputDirectory.absolutePath}") println("Files: ${files.size}") println("-".repeat(70)) val renderer = HtmlRenderer() var success = 0 var failed = 0 files.forEach { file -> val source = file.readText() val result = NanoDSL.parseResult(source) when (result) { is ParseResult.Success -> { try { val ir = NanoDSL.toIR(result.ast) val html = renderer.render(ir) val outputFile = File(outputDirectory, file.nameWithoutExtension + ".html") outputFile.writeText(html) println("✅ ${file.name} → ${outputFile.name}") println(" Size: ${html.length} bytes") success++ } catch (e: Exception) { println("❌ ${file.name} - Render failed: ${e.message}") failed++ } } is ParseResult.Failure -> { println("❌ ${file.name} - Parse failed") result.errors.forEach { error -> println(" Line ${error.line}: ${error.message}") } failed++ } } } println("-".repeat(70)) println("Summary: $success rendered, $failed failed") println("=".repeat(70)) if (success > 0) { println("\n📂 HTML files saved to: ${outputDirectory.absolutePath}") println(" Open in browser: file://${outputDirectory.absolutePath}/index.html") // Generate index.html generateIndexHtml(outputDirectory, files.mapNotNull { file -> val outputFile = File(outputDirectory, file.nameWithoutExtension + ".html") if (outputFile.exists()) file.nameWithoutExtension else null }) } } private fun generateIndexHtml(outputDir: File, fileNames: List) { val indexHtml = buildString { append(""" NanoDSL Preview Gallery

🎨 NanoDSL Preview Gallery

Generated from integration test outputs

""".trimIndent()) fileNames.forEach { name -> append(""" """.trimIndent()) } append("""
""".trimIndent()) } File(outputDir, "index.html").writeText(indexHtml) println(" Generated index.html with ${fileNames.size} links") }