blob: 3768c3f185df3929ad17c5c9ea411148373ca5fb [file] [log] [blame]
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +04001package org.jetbrains.dokka
2
Ilya Ryzhenkov68d3bc82014-07-14 19:34:52 +04003
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +04004public open class MarkdownFormatService(locationService: LocationService, signatureGenerator: LanguageService)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +04005: StructuredFormatService(locationService, signatureGenerator) {
6
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +04007 override val extension: String = "md"
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +04008
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +04009 override public fun formatBreadcrumbs(items: Iterable<FormatLink>): String {
10 return items.map { formatLink(it) }.joinToString(" / ")
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040011 }
12
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040013 override public fun formatText(text: String): String {
14 return text.htmlEscape()
15 }
16
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040017 override public fun formatCode(code: String): String {
18 return "`$code`"
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040019 }
20
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040021 override public fun formatBold(text: String): String {
22 return "**$text**"
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +040023 }
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040024
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040025 override public fun formatLink(text: String, location: Location): String {
26 return "[${text}](${location.path})"
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040027 }
28
29 override public fun appendLine(to: StringBuilder) {
30 to.appendln()
31 }
32
33 override public fun appendLine(to: StringBuilder, text: String) {
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040034 to.appendln(formatText(text))
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040035 }
36
37 override public fun appendText(to: StringBuilder, text: String) {
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040038 to.append(formatText(text))
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040039 }
40
41 override public fun appendHeader(to: StringBuilder, text: String, level: Int) {
42 appendLine(to)
43 appendLine(to, "${"#".repeat(level)} $text")
44 appendLine(to)
45 }
46
47 override public fun appendBlockCode(to: StringBuilder, lines: Iterable<String>) {
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040048 appendLine(to)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040049 appendLine(to, "```")
50 for (line in lines)
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040051 to.appendln(line)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040052 appendLine(to, "```")
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040053 appendLine(to)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040054 }
55
56 override public fun appendBlockCode(to: StringBuilder, line: String) {
57 appendLine(to, "```")
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040058 to.appendln(line)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040059 appendLine(to, "```")
60 }
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040061
62 var outlineLevel = 0
63 override fun appendOutlineHeader(to: StringBuilder, node: DocumentationNode) {
64 val indent = " ".repeat(outlineLevel)
65 appendLine(to, "$indent- title: ${languageService.renderName(node)}")
66 appendLine(to, "$indent url: ${locationService.location(node).path}")
67 }
68
69 override fun appendOutlineChildren(to: StringBuilder, nodes: Iterable<DocumentationNode>) {
70 val indent = " ".repeat(outlineLevel)
71 appendLine(to, "$indent content:")
72 outlineLevel++
73 for (node in nodes) {
74 appendOutlineHeader(to, node)
75 if (node.members.any()) {
76 appendOutlineChildren(to, node.members)
77 }
78 appendLine(to)
79 }
80 outlineLevel--
81 }
Ilya Ryzhenkov68d3bc82014-07-14 19:34:52 +040082}