/
Tags.kt
65 lines (52 loc) · 2.98 KB
/
Tags.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package org.jetbrains.dokka.base.renderers.html
import kotlinx.html.*
import kotlinx.html.stream.createHTML
import org.jetbrains.dokka.base.renderers.html.command.consumers.ImmediateResolutionTagConsumer
import org.jetbrains.dokka.base.templating.Command
import org.jetbrains.dokka.base.templating.toJsonString
typealias TemplateBlock = TemplateCommand.() -> Unit
@HtmlTagMarker
fun FlowOrPhrasingContent.wbr(classes: String? = null, block: WBR.() -> Unit = {}): Unit =
WBR(attributesMapOf("class", classes), consumer).visit(block)
@Suppress("unused")
open class WBR(initialAttributes: Map<String, String>, consumer: TagConsumer<*>) :
HTMLTag("wbr", consumer, initialAttributes, namespace = null, inlineTag = true, emptyTag = false),
HtmlBlockInlineTag
/**
* Work-around until next version of kotlinx.html doesn't come out
*/
@HtmlTagMarker
inline fun FlowOrPhrasingContent.strike(classes : String? = null, crossinline block : STRIKE.() -> Unit = {}) : Unit = STRIKE(attributesMapOf("class", classes), consumer).visit(block)
open class STRIKE(initialAttributes : Map<String, String>, override val consumer : TagConsumer<*>) : HTMLTag("strike", consumer, initialAttributes, null, false, false), HtmlBlockInlineTag {
}
const val TEMPLATE_COMMAND_BEGIN_BORDER = "[+]cmd:"
const val TEMPLATE_COMMAND_END_BORDER = "[-]cmd"
fun FlowOrMetaDataContent.templateCommandAsHtmlComment(data: Command, block: FlowOrMetaDataContent.() -> Unit = {}): Unit =
(consumer as? ImmediateResolutionTagConsumer)?.processCommand(data, block)
?: let{
comment( "$TEMPLATE_COMMAND_BEGIN_BORDER${toJsonString(data)}")
block()
comment(TEMPLATE_COMMAND_END_BORDER)
}
fun FlowOrMetaDataContent.templateCommand(data: Command, block: TemplateBlock = {}): Unit =
(consumer as? ImmediateResolutionTagConsumer)?.processCommand(data, block)
?: TemplateCommand(attributesMapOf("data", toJsonString(data)), consumer).visit(block)
fun <T> TagConsumer<T>.templateCommand(data: Command, block: TemplateBlock = {}): T =
(this as? ImmediateResolutionTagConsumer)?.processCommandAndFinalize(data, block)
?: TemplateCommand(attributesMapOf("data", toJsonString(data)), this).visitAndFinalize(this, block)
fun templateCommandFor(data: Command, consumer: TagConsumer<*>) =
TemplateCommand(attributesMapOf("data", toJsonString(data)), consumer)
class TemplateCommand(initialAttributes: Map<String, String>, consumer: TagConsumer<*>) :
HTMLTag(
"dokka-template-command",
consumer,
initialAttributes,
namespace = null,
inlineTag = true,
emptyTag = false
),
CommonAttributeGroupFacadeFlowInteractivePhrasingContent
// This hack is outrageous. I hate it but I cannot find any other way around `kotlinx.html` type system.
fun TemplateBlock.buildAsInnerHtml(): String = createHTML(prettyPrint = false).run {
TemplateCommand(emptyMap, this).visitAndFinalize(this, this@buildAsInnerHtml).substringAfter(">").substringBeforeLast("<")
}