blob: ba7d8f7b087df68d9f040fdd0b3b7c8b572c5805 [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)
Dmitry Jemerovea1f4cc2015-02-19 19:51:01 +01006: StructuredFormatService(locationService, signatureGenerator, "md") {
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +04007 override public fun formatBreadcrumbs(items: Iterable<FormatLink>): String {
8 return items.map { formatLink(it) }.joinToString(" / ")
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +04009 }
10
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040011 override public fun formatText(text: String): String {
12 return text.htmlEscape()
13 }
14
Ilya Ryzhenkov7c6da4b2014-10-03 19:09:31 +040015 override fun formatSymbol(text: String): String {
16 return text.htmlEscape()
17 }
18
19 override fun formatKeyword(text: String): String {
20 return text.htmlEscape()
21 }
Dmitry Jemerov4494fd02015-02-26 21:34:27 +010022 override fun formatIdentifier(text: String, kind: IdentifierKind): String {
Ilya Ryzhenkov7c6da4b2014-10-03 19:09:31 +040023 return text.htmlEscape()
24 }
25
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040026 override public fun formatCode(code: String): String {
27 return "`$code`"
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040028 }
29
Dmitry Jemerov66593372015-03-03 19:35:56 +010030 override public fun formatUnorderedList(text: String): String = text + "\n"
31 override public fun formatOrderedList(text: String): String = text + "\n"
Ilya Ryzhenkov18399492014-12-22 09:50:17 +020032
Dmitry Jemerov66593372015-03-03 19:35:56 +010033 override fun formatListItem(text: String, kind: ListKind): String {
34 val itemText = if (text.endsWith("\n")) text else text + "\n"
35 return if (kind == ListKind.Unordered) "* $itemText" else "1. $itemText"
Ilya Ryzhenkov18399492014-12-22 09:50:17 +020036 }
37
Ilya Ryzhenkov9f0ff552014-10-13 13:38:40 +040038 override public fun formatStrong(text: String): String {
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040039 return "**$text**"
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +040040 }
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040041
Ilya Ryzhenkov9f0ff552014-10-13 13:38:40 +040042 override fun formatEmphasis(text: String): String {
43 return "*$text*"
44 }
45
Dmitry Jemerove17eaa52015-01-09 20:59:58 +010046 override fun formatStrikethrough(text: String): String {
47 return "~~$text~~"
48 }
49
Ilya Ryzhenkov71cd87e2014-10-03 22:51:44 +040050 override fun formatLink(text: String, href: String): String {
51 return "[$text]($href)"
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040052 }
53
54 override public fun appendLine(to: StringBuilder) {
55 to.appendln()
56 }
57
58 override public fun appendLine(to: StringBuilder, text: String) {
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040059 to.appendln(text)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040060 }
61
Dmitry Jemerov85a3ae72015-02-20 14:08:30 +010062 override fun appendAnchor(to: StringBuilder, anchor: String) {
63 // no anchors in Markdown
64 }
65
Dmitry Jemerov8ef68182014-12-30 12:36:14 +010066 override public fun appendParagraph(to: StringBuilder, text: String) {
Ilya Ryzhenkov280dc292014-10-14 16:08:10 +040067 to.appendln()
68 to.appendln(text)
69 to.appendln()
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040070 }
71
72 override public fun appendHeader(to: StringBuilder, text: String, level: Int) {
73 appendLine(to)
74 appendLine(to, "${"#".repeat(level)} $text")
75 appendLine(to)
76 }
77
Dmitry Jemerov44cef5c2015-02-26 19:34:49 +010078 override public fun appendBlockCode(to: StringBuilder, line: String, language: String) {
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040079 appendLine(to)
Dmitry Jemerov44cef5c2015-02-26 19:34:49 +010080 to.appendln("``` ${language}")
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040081 to.appendln(line)
kisenka8fbeb612014-10-10 20:33:05 +040082 to.appendln("```")
83 appendLine(to)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040084 }
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040085
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040086 override fun appendTable(to: StringBuilder, body: () -> Unit) {
87 to.appendln()
88 body()
89 to.appendln()
90 }
91
92 override fun appendTableHeader(to: StringBuilder, body: () -> Unit) {
93 body()
94 }
95
96 override fun appendTableBody(to: StringBuilder, body: () -> Unit) {
97 body()
98 }
99
100 override fun appendTableRow(to: StringBuilder, body: () -> Unit) {
Dmitry Jemerov7fbff242015-01-09 18:54:06 +0100101 to.append("|")
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +0400102 body()
103 to.appendln()
104 }
105
106 override fun appendTableCell(to: StringBuilder, body: () -> Unit) {
Dmitry Jemerov7fbff242015-01-09 18:54:06 +0100107 to.append(" ")
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +0400108 body()
Dmitry Jemerov7fbff242015-01-09 18:54:06 +0100109 to.append(" |")
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +0400110 }
Dmitry Jemerov722c9af2015-02-26 16:28:05 +0100111
112 override fun formatNonBreakingSpace(): String = "&nbsp;"
Ilya Ryzhenkov68d3bc82014-07-14 19:34:52 +0400113}