Add [random] tag to BBCode
authorLaniusTrolling <lanius@laniustrolling.dev>
Sun, 11 May 2025 19:25:39 +0000 (15:25 -0400)
committerLaniusTrolling <lanius@laniustrolling.dev>
Sun, 11 May 2025 19:25:39 +0000 (15:25 -0400)
src/main/kotlin/info/mechyrdia/lore/ParserPreprocess.kt

index 188e89c551ce5c7c82a40cb1e14b13a9f191053a..0b934f9953e01ad78f6810a9003bef838cc6c683 100644 (file)
@@ -450,6 +450,23 @@ enum class PreProcessorTags(val type: PreProcessorLexerTag) {
                        PreProcessorTemplateLoader.loadTemplate(env.processTree(subNodes).treeToText())
                }
        }),
+       RANDOM(PreProcessorLexerTag { env, param, subNodes ->
+               param.forbidParam("random") {
+                       subNodes
+                               .flatMap { subNode ->
+                                       if (subNode is ParserTreeNode.Tag && subNode isTag "item")
+                                               listOf(subNode)
+                                       else
+                                               env.processNode(subNode)
+                               }
+                               .filterIsInstance<ParserTreeNode.Tag>()
+                               .filter { it isTag "item" }
+                               .randomOrNull()
+                               ?.subNodes
+                               ?.let { env.processTree(it) }
+                               ?: formatErrorToParserTree("At least one [item] subtag required inside body of [random] tag")
+               }
+       }),
        ;
        
        companion object {
@@ -469,13 +486,15 @@ suspend fun ParserTree.preProcess(context: PreProcessorContext): ParserTree {
 }
 
 fun Exception.renderInBBCode(): ParserTree = listOf(
-       ParserTreeNode.Tag("error", null, listOf(
-               ParserTreeNode.Tag("b", null, listOf(ParserTreeNode.Text("${this::class.qualifiedName}: $message"))),
-               ParserTreeNode.LineBreak,
-               ParserTreeNode.Tag("ul", null,
-                       stackTraceToString().split(System.lineSeparator()).map {
-                               ParserTreeNode.Tag("li", null, listOf(ParserTreeNode.Text(it)))
-                       }
-               ),
-       )),
+       ParserTreeNode.Tag(
+               "error", null, listOf(
+                       ParserTreeNode.Tag("b", null, listOf(ParserTreeNode.Text("${this::class.qualifiedName}: $message"))),
+                       ParserTreeNode.LineBreak,
+                       ParserTreeNode.Tag(
+                               "ul", null,
+                               stackTraceToString().split(System.lineSeparator()).map {
+                                       ParserTreeNode.Tag("li", null, listOf(ParserTreeNode.Text(it)))
+                               }
+                       ),
+               )),
 )