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()
- val anchorId = anchor(content)
- val anchorHash = anchorId?.let { "#$it" }.orEmpty()
+ val anchorId = id(content)
+ val anchorHash = if (isRedirectAnchor) "#$anchorId" else ""
return {
- anchorId?.let { a { id = it } }
+ a { id = anchorId }
tagCreator {
attributes["data-redirect-id"] = anchorHash
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())),