blob: a2e3ce551bf4fdc0c8e45084996b9b03da5329cd [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 Ryzhenkov18399492014-12-22 09:50:17 +020033 override public fun formatList(text: String): String {
34 return text
35 }
36
37 override fun formatListItem(text: String): String {
38 return "* $text"
39 }
40
Ilya Ryzhenkov9f0ff552014-10-13 13:38:40 +040041 override public fun formatStrong(text: String): String {
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040042 return "**$text**"
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +040043 }
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040044
Ilya Ryzhenkov9f0ff552014-10-13 13:38:40 +040045 override fun formatEmphasis(text: String): String {
46 return "*$text*"
47 }
48
Dmitry Jemerove17eaa52015-01-09 20:59:58 +010049 override fun formatStrikethrough(text: String): String {
50 return "~~$text~~"
51 }
52
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040053 override public fun formatLink(text: String, location: Location): String {
Ilya Ryzhenkov71cd87e2014-10-03 22:51:44 +040054 return "[$text](${location.path})"
55 }
56
57 override fun formatLink(text: String, href: String): String {
58 return "[$text]($href)"
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040059 }
60
61 override public fun appendLine(to: StringBuilder) {
62 to.appendln()
63 }
64
65 override public fun appendLine(to: StringBuilder, text: String) {
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040066 to.appendln(text)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040067 }
68
Dmitry Jemerov8ef68182014-12-30 12:36:14 +010069 override public fun appendParagraph(to: StringBuilder, text: String) {
Ilya Ryzhenkov280dc292014-10-14 16:08:10 +040070 to.appendln()
71 to.appendln(text)
72 to.appendln()
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040073 }
74
75 override public fun appendHeader(to: StringBuilder, text: String, level: Int) {
76 appendLine(to)
77 appendLine(to, "${"#".repeat(level)} $text")
78 appendLine(to)
79 }
80
81 override public fun appendBlockCode(to: StringBuilder, lines: Iterable<String>) {
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040082 appendLine(to)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040083 appendLine(to, "```")
84 for (line in lines)
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040085 to.appendln(line)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040086 appendLine(to, "```")
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040087 appendLine(to)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040088 }
89
90 override public fun appendBlockCode(to: StringBuilder, line: String) {
kisenka8fbeb612014-10-10 20:33:05 +040091 appendLine(to)
92 to.appendln("```")
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040093 to.appendln(line)
kisenka8fbeb612014-10-10 20:33:05 +040094 to.appendln("```")
95 appendLine(to)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040096 }
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040097
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040098 override fun appendTable(to: StringBuilder, body: () -> Unit) {
99 to.appendln()
100 body()
101 to.appendln()
102 }
103
104 override fun appendTableHeader(to: StringBuilder, body: () -> Unit) {
105 body()
106 }
107
108 override fun appendTableBody(to: StringBuilder, body: () -> Unit) {
109 body()
110 }
111
112 override fun appendTableRow(to: StringBuilder, body: () -> Unit) {
Dmitry Jemerov7fbff242015-01-09 18:54:06 +0100113 to.append("|")
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +0400114 body()
115 to.appendln()
116 }
117
118 override fun appendTableCell(to: StringBuilder, body: () -> Unit) {
Dmitry Jemerov7fbff242015-01-09 18:54:06 +0100119 to.append(" ")
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +0400120 body()
Dmitry Jemerov7fbff242015-01-09 18:54:06 +0100121 to.append(" |")
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +0400122 }
123
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +0400124 var outlineLevel = 0
125 override fun appendOutlineHeader(to: StringBuilder, node: DocumentationNode) {
126 val indent = " ".repeat(outlineLevel)
127 appendLine(to, "$indent- title: ${languageService.renderName(node)}")
128 appendLine(to, "$indent url: ${locationService.location(node).path}")
129 }
130
131 override fun appendOutlineChildren(to: StringBuilder, nodes: Iterable<DocumentationNode>) {
132 val indent = " ".repeat(outlineLevel)
133 appendLine(to, "$indent content:")
134 outlineLevel++
135 for (node in nodes) {
136 appendOutlineHeader(to, node)
137 if (node.members.any()) {
138 appendOutlineChildren(to, node.members)
139 }
140 appendLine(to)
141 }
142 outlineLevel--
143 }
Ilya Ryzhenkov68d3bc82014-07-14 19:34:52 +0400144}