blob: 60e38290c6c624300da48d602f91d29bf2a3e363 [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 Ryzhenkovaa59acb2014-07-15 20:05:55 +040034 to.appendln(text)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040035 }
36
37 override public fun appendText(to: StringBuilder, text: String) {
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040038 to.append(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
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040062 override fun appendTable(to: StringBuilder, body: () -> Unit) {
63 to.appendln()
64 body()
65 to.appendln()
66 }
67
68 override fun appendTableHeader(to: StringBuilder, body: () -> Unit) {
69 body()
70 }
71
72 override fun appendTableBody(to: StringBuilder, body: () -> Unit) {
73 body()
74 }
75
76 override fun appendTableRow(to: StringBuilder, body: () -> Unit) {
77 to.append("|")
78 body()
79 to.appendln()
80 }
81
82 override fun appendTableCell(to: StringBuilder, body: () -> Unit) {
83 body()
84 to.append("|")
85 }
86
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040087 var outlineLevel = 0
88 override fun appendOutlineHeader(to: StringBuilder, node: DocumentationNode) {
89 val indent = " ".repeat(outlineLevel)
90 appendLine(to, "$indent- title: ${languageService.renderName(node)}")
91 appendLine(to, "$indent url: ${locationService.location(node).path}")
92 }
93
94 override fun appendOutlineChildren(to: StringBuilder, nodes: Iterable<DocumentationNode>) {
95 val indent = " ".repeat(outlineLevel)
96 appendLine(to, "$indent content:")
97 outlineLevel++
98 for (node in nodes) {
99 appendOutlineHeader(to, node)
100 if (node.members.any()) {
101 appendOutlineChildren(to, node.members)
102 }
103 appendLine(to)
104 }
105 outlineLevel--
106 }
Ilya Ryzhenkov68d3bc82014-07-14 19:34:52 +0400107}