blob: 29a9f5c4dc5be4ba01439c23516f47daf8780ea0 [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
6public open class MarkdownFormatService @Inject constructor(locationService: LocationService,
Ilya Ryzhenkov455d74a2014-09-19 22:25:27 +03007 signatureGenerator: LanguageService)
Dmitry Jemerovea1f4cc2015-02-19 19:51:01 +01008: StructuredFormatService(locationService, signatureGenerator, "md") {
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +04009 override public fun formatBreadcrumbs(items: Iterable<FormatLink>): String {
10 return items.map { formatLink(it) }.joinToString(" / ")
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040011 }
12
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040013 override public fun formatText(text: String): String {
14 return text.htmlEscape()
15 }
16
Ilya Ryzhenkov7c6da4b2014-10-03 19:09:31 +040017 override fun formatSymbol(text: String): String {
18 return text.htmlEscape()
19 }
20
21 override fun formatKeyword(text: String): String {
22 return text.htmlEscape()
23 }
Dmitry Jemerov4494fd02015-02-26 21:34:27 +010024 override fun formatIdentifier(text: String, kind: IdentifierKind): String {
Ilya Ryzhenkov7c6da4b2014-10-03 19:09:31 +040025 return text.htmlEscape()
26 }
27
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040028 override public fun formatCode(code: String): String {
29 return "`$code`"
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040030 }
31
Dmitry Jemerov66593372015-03-03 19:35:56 +010032 override public fun formatUnorderedList(text: String): String = text + "\n"
33 override public fun formatOrderedList(text: String): String = text + "\n"
Ilya Ryzhenkov18399492014-12-22 09:50:17 +020034
Dmitry Jemerov66593372015-03-03 19:35:56 +010035 override fun formatListItem(text: String, kind: ListKind): String {
36 val itemText = if (text.endsWith("\n")) text else text + "\n"
37 return if (kind == ListKind.Unordered) "* $itemText" else "1. $itemText"
Ilya Ryzhenkov18399492014-12-22 09:50:17 +020038 }
39
Ilya Ryzhenkov9f0ff552014-10-13 13:38:40 +040040 override public fun formatStrong(text: String): String {
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040041 return "**$text**"
Ilya Ryzhenkova0bfdbd2014-07-14 15:00:33 +040042 }
Ilya Ryzhenkovcd7084d2014-07-14 21:15:04 +040043
Ilya Ryzhenkov9f0ff552014-10-13 13:38:40 +040044 override fun formatEmphasis(text: String): String {
45 return "*$text*"
46 }
47
Dmitry Jemerove17eaa52015-01-09 20:59:58 +010048 override fun formatStrikethrough(text: String): String {
49 return "~~$text~~"
50 }
51
Ilya Ryzhenkov71cd87e2014-10-03 22:51:44 +040052 override fun formatLink(text: String, href: String): String {
53 return "[$text]($href)"
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040054 }
55
56 override public fun appendLine(to: StringBuilder) {
57 to.appendln()
58 }
59
60 override public fun appendLine(to: StringBuilder, text: String) {
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040061 to.appendln(text)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040062 }
63
Dmitry Jemerov85a3ae72015-02-20 14:08:30 +010064 override fun appendAnchor(to: StringBuilder, anchor: String) {
65 // no anchors in Markdown
66 }
67
Dmitry Jemerov8ef68182014-12-30 12:36:14 +010068 override public fun appendParagraph(to: StringBuilder, text: String) {
Ilya Ryzhenkov280dc292014-10-14 16:08:10 +040069 to.appendln()
70 to.appendln(text)
71 to.appendln()
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040072 }
73
74 override public fun appendHeader(to: StringBuilder, text: String, level: Int) {
75 appendLine(to)
76 appendLine(to, "${"#".repeat(level)} $text")
77 appendLine(to)
78 }
79
Dmitry Jemerov44cef5c2015-02-26 19:34:49 +010080 override public fun appendBlockCode(to: StringBuilder, line: String, language: String) {
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040081 appendLine(to)
Dmitry Jemerov44cef5c2015-02-26 19:34:49 +010082 to.appendln("``` ${language}")
Ilya Ryzhenkovfb41c692014-07-15 18:23:15 +040083 to.appendln(line)
kisenka8fbeb612014-10-10 20:33:05 +040084 to.appendln("```")
85 appendLine(to)
Ilya Ryzhenkov62cb5092014-07-15 15:54:05 +040086 }
Ilya Ryzhenkov499d0822014-07-15 16:18:53 +040087
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +040088 override fun appendTable(to: StringBuilder, body: () -> Unit) {
89 to.appendln()
90 body()
91 to.appendln()
92 }
93
94 override fun appendTableHeader(to: StringBuilder, body: () -> Unit) {
95 body()
96 }
97
98 override fun appendTableBody(to: StringBuilder, body: () -> Unit) {
99 body()
100 }
101
102 override fun appendTableRow(to: StringBuilder, body: () -> Unit) {
Dmitry Jemerov7fbff242015-01-09 18:54:06 +0100103 to.append("|")
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +0400104 body()
105 to.appendln()
106 }
107
108 override fun appendTableCell(to: StringBuilder, body: () -> Unit) {
Dmitry Jemerov7fbff242015-01-09 18:54:06 +0100109 to.append(" ")
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +0400110 body()
Dmitry Jemerov7fbff242015-01-09 18:54:06 +0100111 to.append(" |")
Ilya Ryzhenkovaa59acb2014-07-15 20:05:55 +0400112 }
Dmitry Jemerov722c9af2015-02-26 16:28:05 +0100113
114 override fun formatNonBreakingSpace(): String = "&nbsp;"
Ilya Ryzhenkov68d3bc82014-07-14 19:34:52 +0400115}