Fix KT-13021, KT-13020, Test for already fixed KT-6941

Fixes on javadoc to kdoc comments convert
This commit is contained in:
Simon Ogorodnik
2016-10-13 12:47:13 +03:00
parent 155cfcb1f8
commit d731f97c7d
9 changed files with 106 additions and 9 deletions
@@ -73,7 +73,7 @@ object IdeaDocCommentConverter : DocCommentConverter {
return this
}
private fun convertInlineDocTag(tag: PsiInlineDocTag) = when(tag.name) {
private fun convertInlineDocTag(tag: PsiInlineDocTag) = when (tag.name) {
"code", "literal" -> {
val text = tag.dataElements.joinToString("") { it.text }
val escaped = StringUtil.escapeXml(text.trimStart())
@@ -92,11 +92,17 @@ object IdeaDocCommentConverter : DocCommentConverter {
}
private fun convertJavadocLink(link: String?): String =
if (link != null) link.substringBefore('(').replace('#', '.') else ""
if (link != null) link.substringBefore('(').replace('#', '.') else ""
private fun PsiDocTag.linkElement(): PsiElement? =
valueElement ?: dataElements.firstOrNull { it !is PsiWhiteSpace }
private fun XmlTag.attributesAsString() =
if (attributes.isNotEmpty())
attributes.joinToString(separator = " ", prefix = " ") { it.text }
else
""
private class HtmlToMarkdownConverter() : XmlRecursiveElementVisitor() {
private enum class ListType { Ordered, Unordered; }
data class MarkdownSpan(val prefix: String, val suffix: String) {
@@ -105,6 +111,9 @@ object IdeaDocCommentConverter : DocCommentConverter {
fun wrap(text: String) = MarkdownSpan(text, text)
fun prefix(text: String) = MarkdownSpan(text, "")
fun preserveTag(tag: XmlTag) =
MarkdownSpan("<${tag.name}${tag.attributesAsString()}>", "</${tag.name}>")
}
}
@@ -142,7 +151,7 @@ object IdeaDocCommentConverter : DocCommentConverter {
XmlTokenType.XML_CHAR_ENTITY_REF -> {
appendPendingText()
val grandParent = element.parent.parent
if(grandParent is HtmlTag && (grandParent.name == "code" || grandParent.name == "literal"))
if (grandParent is HtmlTag && (grandParent.name == "code" || grandParent.name == "literal"))
markdownBuilder.append(StringUtil.unescapeXml(element.text))
else
markdownBuilder.append(element.text)
@@ -183,7 +192,7 @@ object IdeaDocCommentConverter : DocCommentConverter {
}
}
private fun getMarkdownForTag(tag: XmlTag, atLineStart: Boolean): MarkdownSpan = when(tag.name) {
private fun getMarkdownForTag(tag: XmlTag, atLineStart: Boolean): MarkdownSpan = when (tag.name) {
"b", "strong" -> MarkdownSpan.wrap("**")
"p" -> if (atLineStart) MarkdownSpan.prefix("\n * ") else MarkdownSpan.prefix("\n *\n *")
@@ -200,22 +209,29 @@ object IdeaDocCommentConverter : DocCommentConverter {
val innerText = tag.value.text
if (docRef == innerText) MarkdownSpan("[", "]") else MarkdownSpan("[", "][$docRef]")
}
else if (tag.getAttributeValue("href") != null) {
MarkdownSpan("[", "](${tag.getAttributeValue("href") ?: ""})")
}
else {
MarkdownSpan("[", "](${tag.getAttributeValue("href")})")
MarkdownSpan.preserveTag(tag)
}
}
"ul" -> { currentListType = ListType.Unordered; MarkdownSpan.Empty }
"ul" -> {
currentListType = ListType.Unordered; MarkdownSpan.Empty
}
"ol" -> { currentListType = ListType.Ordered; MarkdownSpan.Empty }
"ol" -> {
currentListType = ListType.Ordered; MarkdownSpan.Empty
}
"li" -> if (currentListType == ListType.Unordered) MarkdownSpan.prefix(" * ") else MarkdownSpan.prefix(" 1. ")
else -> MarkdownSpan.Empty
else -> MarkdownSpan.preserveTag(tag)
}
private fun appendPendingText() {
if (afterLineBreak ) {
if (afterLineBreak) {
markdownBuilder.append(" * ")
afterLineBreak = false
}