blob: 3b87835f81af8bbc019e67cf84b0da81e7e417f6 [file] [log] [blame]
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +04001package org.jetbrains.dokka
2
Ilya Ryzhenkov68d3bc82014-07-14 19:34:52 +04003
Ilya Ryzhenkov455d74a2014-09-19 22:25:27 +03004public open class MarkdownFormatService(locationService: LocationService,
5 resolutionService: ResolutionService,
6 signatureGenerator: LanguageService)
7: StructuredFormatService(locationService, resolutionService, signatureGenerator) {
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +04008
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +04009 override val extension: String = "md"
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +040010
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040011 override public fun formatBreadcrumbs(items: Iterable<FormatLink>): String {
12 return items.map { formatLink(it) }.joinToString(" / ")
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040013 }
14
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040015 override public fun formatText(text: String): String {
16 return text.htmlEscape()
17 }
18
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040019 override public fun formatCode(code: String): String {
20 return "`$code`"
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040021 }
22
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040023 override public fun formatBold(text: String): String {
24 return "**$text**"
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +040025 }
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040026
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040027 override public fun formatLink(text: String, location: Location): String {
28 return "[${text}](${location.path})"
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040029 }
30
31 override public fun appendLine(to: StringBuilder) {
32 to.appendln()
33 }
34
35 override public fun appendLine(to: StringBuilder, text: String) {
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040036 to.appendln(text)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040037 }
38
39 override public fun appendText(to: StringBuilder, text: String) {
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040040 to.append(text)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040041 }
42
43 override public fun appendHeader(to: StringBuilder, text: String, level: Int) {
44 appendLine(to)
45 appendLine(to, "${"#".repeat(level)} $text")
46 appendLine(to)
47 }
48
49 override public fun appendBlockCode(to: StringBuilder, lines: Iterable<String>) {
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040050 appendLine(to)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040051 appendLine(to, "```")
52 for (line in lines)
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040053 to.appendln(line)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040054 appendLine(to, "```")
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040055 appendLine(to)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040056 }
57
58 override public fun appendBlockCode(to: StringBuilder, line: String) {
59 appendLine(to, "```")
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040060 to.appendln(line)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040061 appendLine(to, "```")
62 }
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040063
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040064 override fun appendTable(to: StringBuilder, body: () -> Unit) {
65 to.appendln()
66 body()
67 to.appendln()
68 }
69
70 override fun appendTableHeader(to: StringBuilder, body: () -> Unit) {
71 body()
72 }
73
74 override fun appendTableBody(to: StringBuilder, body: () -> Unit) {
75 body()
76 }
77
78 override fun appendTableRow(to: StringBuilder, body: () -> Unit) {
79 to.append("|")
80 body()
81 to.appendln()
82 }
83
84 override fun appendTableCell(to: StringBuilder, body: () -> Unit) {
85 body()
86 to.append("|")
87 }
88
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040089 var outlineLevel = 0
90 override fun appendOutlineHeader(to: StringBuilder, node: DocumentationNode) {
91 val indent = " ".repeat(outlineLevel)
92 appendLine(to, "$indent- title: ${languageService.renderName(node)}")
93 appendLine(to, "$indent url: ${locationService.location(node).path}")
94 }
95
96 override fun appendOutlineChildren(to: StringBuilder, nodes: Iterable<DocumentationNode>) {
97 val indent = " ".repeat(outlineLevel)
98 appendLine(to, "$indent content:")
99 outlineLevel++
100 for (node in nodes) {
101 appendOutlineHeader(to, node)
102 if (node.members.any()) {
103 appendOutlineChildren(to, node.members)
104 }
105 appendLine(to)
106 }
107 outlineLevel--
108 }
Ilya Ryzhenkov68d3bc82014-07-14 19:34:52 +0400109}