From a83488aae453f1bf01cfb5507317acf0b9ddfb82 Mon Sep 17 00:00:00 2001 From: Ilya Ryzhenkov Date: Sat, 12 Jul 2014 03:55:20 +0400 Subject: Implement section parsing. --- src/Model/DocumentationContent.kt | 96 +++++++++++++++++++++++++++++++++++++++ src/Model/Sections.kt | 43 ------------------ 2 files changed, 96 insertions(+), 43 deletions(-) create mode 100644 src/Model/DocumentationContent.kt delete mode 100644 src/Model/Sections.kt (limited to 'src/Model') 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) { + + 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 { + 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 { + val sections = arrayListOf() + 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) { - - 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()) - } -} - -- cgit