Re-add page-top anchor to factbook pages master
authorLaniusTrolling <lanius@laniustrolling.dev>
Sun, 18 May 2025 18:58:08 +0000 (14:58 -0400)
committerLaniusTrolling <lanius@laniustrolling.dev>
Sun, 18 May 2025 18:58:08 +0000 (14:58 -0400)
src/main/kotlin/info/mechyrdia/lore/ParserHtml.kt

index c066afb9caef4d4fdec381034d8e4f4a803c0172..d064536a892abb2ec21a42290416b9a04b18ced8 100644 (file)
@@ -282,14 +282,14 @@ class HtmlTagLexerTag(
 val NON_ANCHOR_CHAR = Regex("[^a-zA-Z\\d\\-]+")
 fun String.sanitizeAnchor() = replace(NON_ANCHOR_CHAR, "-")
 
 val NON_ANCHOR_CHAR = Regex("[^a-zA-Z\\d\\-]+")
 fun String.sanitizeAnchor() = replace(NON_ANCHOR_CHAR, "-")
 
-class HtmlHeaderLexerTag(val tagCreator: TagCreator, val anchor: (String) -> String?) : HtmlLexerTag {
+class HtmlHeaderLexerTag(val tagCreator: TagCreator, val isRedirectAnchor: Boolean, val id: (String) -> String) : HtmlLexerTag {
        override fun processTag(env: LexerTagEnvironment<HtmlBuilderContext, HtmlBuilderSubject>, param: String?, subNodes: ParserTree): HtmlBuilderSubject {
                val content = subNodes.treeToText()
        override fun processTag(env: LexerTagEnvironment<HtmlBuilderContext, HtmlBuilderSubject>, param: String?, subNodes: ParserTree): HtmlBuilderSubject {
                val content = subNodes.treeToText()
-               val anchorId = anchor(content)
-               val anchorHash = anchorId?.let { "#$it" }.orEmpty()
+               val anchorId = id(content)
+               val anchorHash = if (isRedirectAnchor) "#$anchorId" else ""
                
                return {
                
                return {
-                       anchorId?.let { a { id = it } }
+                       a { id = anchorId }
                        
                        tagCreator {
                                attributes["data-redirect-id"] = anchorHash
                        
                        tagCreator {
                                attributes["data-redirect-id"] = anchorHash
@@ -416,12 +416,12 @@ enum class FactbookFormattingTag(val type: HtmlLexerTag) {
        
        ERROR(HtmlTagLexerTag(attributes = mapOf("style" to "color: #f00"), tagCreator = TagConsumer<*>::div.toTagCreator())),
        
        
        ERROR(HtmlTagLexerTag(attributes = mapOf("style" to "color: #f00"), tagCreator = TagConsumer<*>::div.toTagCreator())),
        
-       H1(HtmlHeaderLexerTag(tagCreator = TagConsumer<*>::h1.toTagCreator()) { null }),
-       H2(HtmlHeaderLexerTag(tagCreator = TagConsumer<*>::h2.toTagCreator(), String::sanitizeAnchor)),
-       H3(HtmlHeaderLexerTag(tagCreator = TagConsumer<*>::h3.toTagCreator(), String::sanitizeAnchor)),
-       H4(HtmlHeaderLexerTag(tagCreator = TagConsumer<*>::h4.toTagCreator(), String::sanitizeAnchor)),
-       H5(HtmlHeaderLexerTag(tagCreator = TagConsumer<*>::h5.toTagCreator(), String::sanitizeAnchor)),
-       H6(HtmlHeaderLexerTag(tagCreator = TagConsumer<*>::h6.toTagCreator(), String::sanitizeAnchor)),
+       H1(HtmlHeaderLexerTag(tagCreator = TagConsumer<*>::h1.toTagCreator(), false) { "page-top" }),
+       H2(HtmlHeaderLexerTag(tagCreator = TagConsumer<*>::h2.toTagCreator(), true, String::sanitizeAnchor)),
+       H3(HtmlHeaderLexerTag(tagCreator = TagConsumer<*>::h3.toTagCreator(), true, String::sanitizeAnchor)),
+       H4(HtmlHeaderLexerTag(tagCreator = TagConsumer<*>::h4.toTagCreator(), true, String::sanitizeAnchor)),
+       H5(HtmlHeaderLexerTag(tagCreator = TagConsumer<*>::h5.toTagCreator(), true, String::sanitizeAnchor)),
+       H6(HtmlHeaderLexerTag(tagCreator = TagConsumer<*>::h6.toTagCreator(), true, String::sanitizeAnchor)),
        
        ALIGN(HtmlTagLexerTag(attributes = ::processAlign, tagMode = HtmlTagMode.ITEM, tagCreator = TagConsumer<*>::div.toTagCreator())),
        ASIDE(HtmlTagLexerTag(attributes = ::processFloat, tagMode = HtmlTagMode.ITEM, tagCreator = TagConsumer<*>::div.toTagCreator())),
        
        ALIGN(HtmlTagLexerTag(attributes = ::processAlign, tagMode = HtmlTagMode.ITEM, tagCreator = TagConsumer<*>::div.toTagCreator())),
        ASIDE(HtmlTagLexerTag(attributes = ::processFloat, tagMode = HtmlTagMode.ITEM, tagCreator = TagConsumer<*>::div.toTagCreator())),