aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/kotlin/renderers/HtmlRenderer.kt
blob: e0b5b7dc89f9a74f7835cedcb969b680fb2fef05 (plain)
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
package org.jetbrains.dokka.renderers

import org.jetbrains.dokka.htmlEscape
import org.jetbrains.dokka.pages.ContentLink
import org.jetbrains.dokka.pages.ContentNode
import org.jetbrains.dokka.pages.PageNode
import org.jetbrains.dokka.resolvers.LocationProvider
import java.io.File
import java.io.InputStreamReader

open class HtmlRenderer(fileWriter: FileWriter, locationProvider: LocationProvider): DefaultRenderer(fileWriter, locationProvider) {

    override fun buildComment(parts: List<ContentNode>, pageContext: PageNode): String = "<p>" + parts.joinToString("<br>") { it.build(pageContext) } + "</p>"

    override fun buildSymbol(parts: List<ContentNode>, pageContext: PageNode): String = "<code>${super.buildSymbol(parts, pageContext)}</code>"

    override fun buildHeader(level: Int, text: String): String = "<h$level>$text</h$level>\n"

    override fun buildNewLine(): String = "<br/>"

    override fun buildLink(text: String, address: String): String = "<a href=\"$address\">${text.htmlEscape()}</a>"

    override fun buildCode(code: String): String = "<code>$code</code>"

    override fun buildText(text: String) = super.buildText(text).htmlEscape()
    
    override fun buildNavigation(page: PageNode): String {
        fun buildNavigationWithContext(page: PageNode, context: PageNode): String =
            page.parent?.let { buildNavigationWithContext(it, context) }.orEmpty() + "/" + buildLink(page.name, locationProvider.resolve(page, context))
        return buildNavigationWithContext(page, page)
    }

    override fun buildGroup(children: List<ContentNode>, pageContext: PageNode): String = children.joinToString("</td>\n<td>\n") { it.build(pageContext) }

    override fun buildBlock(name: String, content: List<ContentNode>, pageContext: PageNode): String =
        buildHeader(3, name) + "<table>\n<tr>\n<td>\n" +
                content.joinToString("</td>\n</tr>\n<tr>\n<td>") { "(" + it.dci.platformDataList.map { it.platformName }.joinToString() + ") " + it.build(pageContext) } + "</td></tr>\n</table>"

    override fun renderPage(page: PageNode) {
        val pageText = buildStartHtml(page) + buildPageContent(page) + buildEndHtml()
        fileWriter.write(locationProvider.resolve(page), pageText, "")
    }

    override fun buildSupportFiles() {
        fileWriter.write("style.css",
            InputStreamReader(javaClass.getResourceAsStream("/dokka/styles/style.css")).readText())
    }

    protected open fun buildStartHtml(page: PageNode) = """<!DOCTYPE html>
        |<html>
        |<head>
        |<title>${page.name}</title>
        |<link rel="stylesheet" href="${locationProvider.resolveRoot(page)}style.css" />
        |</head>
        |<body>
        |""".trimMargin()

    protected open fun buildEndHtml() =
        """
        |
        |</body>
        |</html>
    """.trimMargin()
}