blob: 7b71f6385607af0a15f77381dd02a657848a13f8 [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 Ryzhenkov7c6da4b2014-10-03 19:09:31 +040019 override fun formatSymbol(text: String): String {
20 return text.htmlEscape()
21 }
22
23 override fun formatKeyword(text: String): String {
24 return text.htmlEscape()
25 }
26 override fun formatIdentifier(text: String): String {
27 return text.htmlEscape()
28 }
29
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040030 override public fun formatCode(code: String): String {
31 return "`$code`"
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040032 }
33
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040034 override public fun formatBold(text: String): String {
35 return "**$text**"
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +040036 }
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040037
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040038 override public fun formatLink(text: String, location: Location): String {
39 return "[${text}](${location.path})"
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040040 }
41
42 override public fun appendLine(to: StringBuilder) {
43 to.appendln()
44 }
45
46 override public fun appendLine(to: StringBuilder, text: String) {
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040047 to.appendln(text)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040048 }
49
50 override public fun appendText(to: StringBuilder, text: String) {
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040051 to.append(text)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040052 }
53
54 override public fun appendHeader(to: StringBuilder, text: String, level: Int) {
55 appendLine(to)
56 appendLine(to, "${"#".repeat(level)} $text")
57 appendLine(to)
58 }
59
60 override public fun appendBlockCode(to: StringBuilder, lines: Iterable<String>) {
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040061 appendLine(to)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040062 appendLine(to, "```")
63 for (line in lines)
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040064 to.appendln(line)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040065 appendLine(to, "```")
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040066 appendLine(to)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040067 }
68
69 override public fun appendBlockCode(to: StringBuilder, line: String) {
70 appendLine(to, "```")
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040071 to.appendln(line)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040072 appendLine(to, "```")
73 }
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040074
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040075 override fun appendTable(to: StringBuilder, body: () -> Unit) {
76 to.appendln()
77 body()
78 to.appendln()
79 }
80
81 override fun appendTableHeader(to: StringBuilder, body: () -> Unit) {
82 body()
83 }
84
85 override fun appendTableBody(to: StringBuilder, body: () -> Unit) {
86 body()
87 }
88
89 override fun appendTableRow(to: StringBuilder, body: () -> Unit) {
90 to.append("|")
91 body()
92 to.appendln()
93 }
94
95 override fun appendTableCell(to: StringBuilder, body: () -> Unit) {
96 body()
97 to.append("|")
98 }
99
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +0400100 var outlineLevel = 0
101 override fun appendOutlineHeader(to: StringBuilder, node: DocumentationNode) {
102 val indent = " ".repeat(outlineLevel)
103 appendLine(to, "$indent- title: ${languageService.renderName(node)}")
104 appendLine(to, "$indent url: ${locationService.location(node).path}")
105 }
106
107 override fun appendOutlineChildren(to: StringBuilder, nodes: Iterable<DocumentationNode>) {
108 val indent = " ".repeat(outlineLevel)
109 appendLine(to, "$indent content:")
110 outlineLevel++
111 for (node in nodes) {
112 appendOutlineHeader(to, node)
113 if (node.members.any()) {
114 appendOutlineChildren(to, node.members)
115 }
116 appendLine(to)
117 }
118 outlineLevel--
119 }
Ilya Ryzhenkov68d3bc82014-07-14 19:34:52 +0400120}