blob: cb1d713cb9eb84a64b7da0410b43816f97c0c036 [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,
Ilya Ryzhenkov455d74a2014-09-19 22:25:27 +03005 signatureGenerator: LanguageService)
Ilya Ryzhenkovd6fd0452014-10-03 20:20:02 +04006: StructuredFormatService(locationService, signatureGenerator) {
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +04007
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +04008 override val extension: String = "md"
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +04009
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040010 override public fun formatBreadcrumbs(items: Iterable<FormatLink>): String {
11 return items.map { formatLink(it) }.joinToString(" / ")
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040012 }
13
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040014 override public fun formatText(text: String): String {
15 return text.htmlEscape()
16 }
17
Ilya Ryzhenkov7c6da4b2014-10-03 19:09:31 +040018 override fun formatSymbol(text: String): String {
19 return text.htmlEscape()
20 }
21
22 override fun formatKeyword(text: String): String {
23 return text.htmlEscape()
24 }
25 override fun formatIdentifier(text: String): String {
26 return text.htmlEscape()
27 }
28
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040029 override public fun formatCode(code: String): String {
30 return "`$code`"
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040031 }
32
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040033 override public fun formatBold(text: String): String {
34 return "**$text**"
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +040035 }
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040036
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040037 override public fun formatLink(text: String, location: Location): String {
38 return "[${text}](${location.path})"
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040039 }
40
41 override public fun appendLine(to: StringBuilder) {
42 to.appendln()
43 }
44
45 override public fun appendLine(to: StringBuilder, text: String) {
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040046 to.appendln(text)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040047 }
48
49 override public fun appendText(to: StringBuilder, text: String) {
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040050 to.append(text)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040051 }
52
53 override public fun appendHeader(to: StringBuilder, text: String, level: Int) {
54 appendLine(to)
55 appendLine(to, "${"#".repeat(level)} $text")
56 appendLine(to)
57 }
58
59 override public fun appendBlockCode(to: StringBuilder, lines: Iterable<String>) {
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040060 appendLine(to)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040061 appendLine(to, "```")
62 for (line in lines)
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040063 to.appendln(line)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040064 appendLine(to, "```")
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040065 appendLine(to)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040066 }
67
68 override public fun appendBlockCode(to: StringBuilder, line: String) {
69 appendLine(to, "```")
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040070 to.appendln(line)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040071 appendLine(to, "```")
72 }
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040073
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040074 override fun appendTable(to: StringBuilder, body: () -> Unit) {
75 to.appendln()
76 body()
77 to.appendln()
78 }
79
80 override fun appendTableHeader(to: StringBuilder, body: () -> Unit) {
81 body()
82 }
83
84 override fun appendTableBody(to: StringBuilder, body: () -> Unit) {
85 body()
86 }
87
88 override fun appendTableRow(to: StringBuilder, body: () -> Unit) {
89 to.append("|")
90 body()
91 to.appendln()
92 }
93
94 override fun appendTableCell(to: StringBuilder, body: () -> Unit) {
95 body()
96 to.append("|")
97 }
98
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040099 var outlineLevel = 0
100 override fun appendOutlineHeader(to: StringBuilder, node: DocumentationNode) {
101 val indent = " ".repeat(outlineLevel)
102 appendLine(to, "$indent- title: ${languageService.renderName(node)}")
103 appendLine(to, "$indent url: ${locationService.location(node).path}")
104 }
105
106 override fun appendOutlineChildren(to: StringBuilder, nodes: Iterable<DocumentationNode>) {
107 val indent = " ".repeat(outlineLevel)
108 appendLine(to, "$indent content:")
109 outlineLevel++
110 for (node in nodes) {
111 appendOutlineHeader(to, node)
112 if (node.members.any()) {
113 appendOutlineChildren(to, node.members)
114 }
115 appendLine(to)
116 }
117 outlineLevel--
118 }
Ilya Ryzhenkov68d3bc82014-07-14 19:34:52 +0400119}