diff options
author | Ilya Ryzhenkov <orangy@jetbrains.com> | 2014-07-12 03:55:20 +0400 |
---|---|---|
committer | Ilya Ryzhenkov <orangy@jetbrains.com> | 2014-07-12 03:55:20 +0400 |
commit | a83488aae453f1bf01cfb5507317acf0b9ddfb82 (patch) | |
tree | ab1c3e2370480f182ac75a2016bf2dc95d1637bb /src/Model | |
parent | d627d2cfdfebcddd63669734efb82dfc66e7c7fe (diff) | |
download | dokka-a83488aae453f1bf01cfb5507317acf0b9ddfb82.tar.gz dokka-a83488aae453f1bf01cfb5507317acf0b9ddfb82.tar.bz2 dokka-a83488aae453f1bf01cfb5507317acf0b9ddfb82.zip |
Implement section parsing.
Diffstat (limited to 'src/Model')
-rw-r--r-- | src/Model/DocumentationContent.kt | 96 | ||||
-rw-r--r-- | src/Model/Sections.kt | 43 |
2 files changed, 96 insertions, 43 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 diff --git a/src/Model/Sections.kt b/src/Model/Sections.kt deleted file mode 100644 index 733c0d2f..00000000 --- a/src/Model/Sections.kt +++ /dev/null @@ -1,43 +0,0 @@ -package org.jetbrains.dokka - -import org.jetbrains.jet.lang.descriptors.* -import org.jetbrains.jet.lang.resolve.BindingContext - -fun BindingContext.getDocumentation(descriptor: DeclarationDescriptor): DocumentationContent { - val docText = getDocumentationElements(descriptor).map { it.extractText() }.join("\n") - return DocumentationContent(docText, listOf()) -} - -class DocumentationContentSection(val label: String, val text: String) { - -} - -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 { - return "$summary | " + sections.joinToString() - } - - class object { - val Empty = DocumentationContent("", listOf()) - } -} - |