aboutsummaryrefslogtreecommitdiff
path: root/src/Model/DocumentationContent.kt
diff options
context:
space:
mode:
authorIlya Ryzhenkov <orangy@jetbrains.com>2014-07-12 03:55:20 +0400
committerIlya Ryzhenkov <orangy@jetbrains.com>2014-07-12 03:55:20 +0400
commita83488aae453f1bf01cfb5507317acf0b9ddfb82 (patch)
treeab1c3e2370480f182ac75a2016bf2dc95d1637bb /src/Model/DocumentationContent.kt
parentd627d2cfdfebcddd63669734efb82dfc66e7c7fe (diff)
downloaddokka-a83488aae453f1bf01cfb5507317acf0b9ddfb82.tar.gz
dokka-a83488aae453f1bf01cfb5507317acf0b9ddfb82.tar.bz2
dokka-a83488aae453f1bf01cfb5507317acf0b9ddfb82.zip
Implement section parsing.
Diffstat (limited to 'src/Model/DocumentationContent.kt')
-rw-r--r--src/Model/DocumentationContent.kt96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/Model/DocumentationContent.kt b/src/Model/DocumentationContent.kt
new file mode 100644
index 00000000..ee91aed3
--- /dev/null
+++ b/src/Model/DocumentationContent.kt
@@ -0,0 +1,96 @@
+package org.jetbrains.dokka
+
+import org.jetbrains.jet.lang.descriptors.*
+import org.jetbrains.jet.lang.resolve.BindingContext
+
+class DocumentationContentSection(val label: String, val text: String) {
+ override fun toString(): String {
+ return "$label = $text"
+ }
+}
+
+class DocumentationContent(val summary: String, val sections: List<DocumentationContentSection>) {
+
+ override fun equals(other: Any?): Boolean {
+ if (other !is DocumentationContent)
+ return false
+ if (summary != other.summary)
+ return false
+ if (sections.size != other.sections.size)
+ return false
+ for (index in sections.indices)
+ if (sections[index] != other.sections[index])
+ return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ return summary.hashCode() + sections.map { it.hashCode() }.sum()
+ }
+
+ override fun toString(): String {
+ if (sections.isEmpty())
+ return summary
+ return "$summary | " + sections.joinToString()
+ }
+
+ class object {
+ val Empty = DocumentationContent("", listOf())
+ }
+}
+
+
+fun BindingContext.getDocumentation(descriptor: DeclarationDescriptor): DocumentationContent {
+ val docText = getDocumentationElements(descriptor).map { it.extractText() }.join("\n")
+
+ val sections = docText.parseSections()
+
+ return DocumentationContent(sections.first().text, sections.drop(1))
+}
+
+fun String.parseLabel(index: Int): Pair<String, Int> {
+ val c = get(index)
+ when {
+ Character.isJavaIdentifierStart(c) -> {
+ for (end in index + 1..length - 1) {
+ if (!Character.isJavaIdentifierPart(get(end))) {
+ return substring(index, end) to end
+ }
+ }
+ return substring(index, length) to length
+ }
+ c == '{' -> {
+ val end = indexOf('}', index + 1)
+ return substring(index, end) to index + 2
+ }
+ }
+ return "" to -1
+}
+
+fun String.parseSections(): List<DocumentationContentSection> {
+ val sections = arrayListOf<DocumentationContentSection>()
+ var currentLabel = ""
+ var currentSectionStart = 0
+ var currentIndex = 0
+
+ while (currentIndex < length) {
+ if (get(currentIndex) == '$') {
+ val (label, index) = parseLabel(currentIndex + 1)
+ if (index != -1) {
+ // section starts, add previous section
+ sections.add(DocumentationContentSection(currentLabel, substring(currentSectionStart, currentIndex).trim()))
+
+ currentLabel = label
+ currentIndex = index
+ currentSectionStart = currentIndex
+ continue
+ }
+ }
+ currentIndex++
+
+ }
+
+ sections.add(DocumentationContentSection(currentLabel, substring(currentSectionStart, currentIndex).trim()))
+ return sections
+} \ No newline at end of file