blob: f694ae3e48e16f32a88e6199817374ad3068d80e [file] [log] [blame]
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +04001package org.jetbrains.dokka
2
Sergey Mashkovc9d59e92015-07-31 15:35:34 +03003import com.google.inject.Inject
Ilya Ryzhenkov68d3bc82014-07-14 19:34:52 +04004
Sergey Mashkovc9d59e92015-07-31 15:35:34 +03005
Dmitry Jemerove7aeb482015-11-17 12:38:47 +01006public open class MarkdownFormatService
7 @Inject constructor(locationService: LocationService,
8 signatureGenerator: LanguageService,
9 linkExtension: String = "md")
10: StructuredFormatService(locationService, signatureGenerator, "md", linkExtension) {
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 }
Dmitry Jemerov4494fd02015-02-26 21:34:27 +010026 override fun formatIdentifier(text: String, kind: IdentifierKind): String {
Ilya Ryzhenkov7c6da4b2014-10-03 19:09:31 +040027 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
Dmitry Jemerov66593372015-03-03 19:35:56 +010034 override public fun formatUnorderedList(text: String): String = text + "\n"
35 override public fun formatOrderedList(text: String): String = text + "\n"
Ilya Ryzhenkov18399492014-12-22 09:50:17 +020036
Dmitry Jemerov66593372015-03-03 19:35:56 +010037 override fun formatListItem(text: String, kind: ListKind): String {
38 val itemText = if (text.endsWith("\n")) text else text + "\n"
39 return if (kind == ListKind.Unordered) "* $itemText" else "1. $itemText"
Ilya Ryzhenkov18399492014-12-22 09:50:17 +020040 }
41
Ilya Ryzhenkov9f0ff552014-10-13 13:38:40 +040042 override public fun formatStrong(text: String): String {
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040043 return "**$text**"
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +040044 }
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040045
Ilya Ryzhenkov9f0ff552014-10-13 13:38:40 +040046 override fun formatEmphasis(text: String): String {
47 return "*$text*"
48 }
49
Dmitry Jemerove17eaa52015-01-09 20:59:58 +010050 override fun formatStrikethrough(text: String): String {
51 return "~~$text~~"
52 }
53
Ilya Ryzhenkov71cd87e2014-10-03 22:51:44 +040054 override fun formatLink(text: String, href: String): String {
55 return "[$text]($href)"
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040056 }
57
58 override public fun appendLine(to: StringBuilder) {
59 to.appendln()
60 }
61
62 override public fun appendLine(to: StringBuilder, text: String) {
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040063 to.appendln(text)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040064 }
65
Dmitry Jemerov85a3ae72015-02-20 14:08:30 +010066 override fun appendAnchor(to: StringBuilder, anchor: String) {
67 // no anchors in Markdown
68 }
69
Dmitry Jemerov8ef68182014-12-30 12:36:14 +010070 override public fun appendParagraph(to: StringBuilder, text: String) {
Ilya Ryzhenkov280dc292014-10-14 16:08:10 +040071 to.appendln()
72 to.appendln(text)
73 to.appendln()
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040074 }
75
76 override public fun appendHeader(to: StringBuilder, text: String, level: Int) {
77 appendLine(to)
78 appendLine(to, "${"#".repeat(level)} $text")
79 appendLine(to)
80 }
81
Dmitry Jemerov44cef5c2015-02-26 19:34:49 +010082 override public fun appendBlockCode(to: StringBuilder, line: String, language: String) {
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040083 appendLine(to)
Dmitry Jemerov44cef5c2015-02-26 19:34:49 +010084 to.appendln("``` ${language}")
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040085 to.appendln(line)
kisenka8fbeb612014-10-10 20:33:05 +040086 to.appendln("```")
87 appendLine(to)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040088 }
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040089
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040090 override fun appendTable(to: StringBuilder, body: () -> Unit) {
91 to.appendln()
92 body()
93 to.appendln()
94 }
95
96 override fun appendTableHeader(to: StringBuilder, body: () -> Unit) {
97 body()
98 }
99
100 override fun appendTableBody(to: StringBuilder, body: () -> Unit) {
101 body()
102 }
103
104 override fun appendTableRow(to: StringBuilder, body: () -> Unit) {
Dmitry Jemerov7fbff242015-01-09 18:54:06 +0100105 to.append("|")
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +0400106 body()
107 to.appendln()
108 }
109
110 override fun appendTableCell(to: StringBuilder, body: () -> Unit) {
Dmitry Jemerov7fbff242015-01-09 18:54:06 +0100111 to.append(" ")
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +0400112 body()
Dmitry Jemerov7fbff242015-01-09 18:54:06 +0100113 to.append(" |")
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +0400114 }
Dmitry Jemerov722c9af2015-02-26 16:28:05 +0100115
116 override fun formatNonBreakingSpace(): String = "&nbsp;"
Ilya Ryzhenkov68d3bc82014-07-14 19:34:52 +0400117}