From d37cf2f32840779706154a3cddbb2239cd80fd84 Mon Sep 17 00:00:00 2001 From: Błażej Kardyś Date: Wed, 27 Nov 2019 17:45:33 +0100 Subject: Cleaning package naming --- core/src/main/kotlin/utilities/DokkaLogging.kt | 31 ++++++++ core/src/main/kotlin/utilities/Html.kt | 12 +++ core/src/main/kotlin/utilities/Path.kt | 5 ++ core/src/main/kotlin/utilities/ServiceLocator.kt | 97 ++++++++++++++++++++++++ core/src/main/kotlin/utilities/Uri.kt | 40 ++++++++++ core/src/main/kotlin/utilities/nodeDebug.kt | 50 ++++++++++++ 6 files changed, 235 insertions(+) create mode 100644 core/src/main/kotlin/utilities/DokkaLogging.kt create mode 100644 core/src/main/kotlin/utilities/Html.kt create mode 100644 core/src/main/kotlin/utilities/Path.kt create mode 100644 core/src/main/kotlin/utilities/ServiceLocator.kt create mode 100644 core/src/main/kotlin/utilities/Uri.kt create mode 100644 core/src/main/kotlin/utilities/nodeDebug.kt (limited to 'core/src/main/kotlin/utilities') diff --git a/core/src/main/kotlin/utilities/DokkaLogging.kt b/core/src/main/kotlin/utilities/DokkaLogging.kt new file mode 100644 index 00000000..6eb7867b --- /dev/null +++ b/core/src/main/kotlin/utilities/DokkaLogging.kt @@ -0,0 +1,31 @@ +package org.jetbrains.dokka.utilities + +interface DokkaLogger { + fun debug(message: String) + fun info(message: String) + fun progress(message: String) + fun warn(message: String) + fun error(message: String) +} + +object DokkaConsoleLogger : DokkaLogger { + var warningCount: Int = 0 + + override fun debug(message: String)= println(message) + + override fun progress(message: String) = println("PROGRESS: $message") + + override fun info(message: String) = println(message) + + override fun warn(message: String) = println("WARN: $message").also { warningCount++ } + + override fun error(message: String) = println("ERROR: $message") + + fun report() { + if (warningCount > 0) { + println("generation completed with $warningCount warnings") + } else { + println("generation completed successfully") + } + } +} diff --git a/core/src/main/kotlin/utilities/Html.kt b/core/src/main/kotlin/utilities/Html.kt new file mode 100644 index 00000000..9dc032f6 --- /dev/null +++ b/core/src/main/kotlin/utilities/Html.kt @@ -0,0 +1,12 @@ +package org.jetbrains.dokka.utilities + +import java.net.URLEncoder + + +/** + * Replaces symbols reserved in HTML with their respective entities. + * Replaces & with &, < with < and > with > + */ +fun String.htmlEscape(): String = replace("&", "&").replace("<", "<").replace(">", ">") + +fun String.urlEncoded(): String = URLEncoder.encode(this, "UTF-8") \ No newline at end of file diff --git a/core/src/main/kotlin/utilities/Path.kt b/core/src/main/kotlin/utilities/Path.kt new file mode 100644 index 00000000..00e2aa60 --- /dev/null +++ b/core/src/main/kotlin/utilities/Path.kt @@ -0,0 +1,5 @@ +package org.jetbrains.dokka.utilities + +import java.io.File + +fun File.appendExtension(extension: String) = if (extension.isEmpty()) this else File(path + "." + extension) diff --git a/core/src/main/kotlin/utilities/ServiceLocator.kt b/core/src/main/kotlin/utilities/ServiceLocator.kt new file mode 100644 index 00000000..00c9ae9f --- /dev/null +++ b/core/src/main/kotlin/utilities/ServiceLocator.kt @@ -0,0 +1,97 @@ +package org.jetbrains.dokka.utilities + +import java.io.File +import java.net.URISyntaxException +import java.net.URL +import java.util.* +import java.util.jar.JarFile +import java.util.zip.ZipEntry + +data class ServiceDescriptor(val name: String, val category: String, val description: String?, val className: String) + +class ServiceLookupException(message: String) : Exception(message) + +object ServiceLocator { + fun lookup(clazz: Class, category: String, implementationName: String): T { + val descriptor = lookupDescriptor(category, implementationName) + return lookup(clazz, descriptor) + } + + fun lookup( + clazz: Class, + descriptor: ServiceDescriptor + ): T { + val loadedClass = javaClass.classLoader.loadClass(descriptor.className) + val constructor = loadedClass.constructors.firstOrNull { it.parameterTypes.isEmpty() } ?: throw ServiceLookupException("Class ${descriptor.className} has no corresponding constructor") + + val implementationRawType: Any = + if (constructor.parameterTypes.isEmpty()) constructor.newInstance() else constructor.newInstance(constructor) + + if (!clazz.isInstance(implementationRawType)) { + throw ServiceLookupException("Class ${descriptor.className} is not a subtype of ${clazz.name}") + } + + @Suppress("UNCHECKED_CAST") + return implementationRawType as T + } + + private fun lookupDescriptor(category: String, implementationName: String): ServiceDescriptor { + val properties = javaClass.classLoader.getResourceAsStream("dokka/$category/$implementationName.properties")?.use { stream -> + Properties().let { properties -> + properties.load(stream) + properties + } + } ?: throw ServiceLookupException("No implementation with name $implementationName found in category $category") + + val className = properties["class"]?.toString() ?: throw ServiceLookupException("Implementation $implementationName has no class configured") + + return ServiceDescriptor(implementationName, category, properties["description"]?.toString(), className) + } + + fun URL.toFile(): File { + assert(protocol == "file") + + return try { + File(toURI()) + } catch (e: URISyntaxException) { //Try to handle broken URLs, with unescaped spaces + File(path) + } + } + + fun allServices(category: String): List { + val entries = this.javaClass.classLoader.getResources("dokka/$category")?.toList() ?: emptyList() + + return entries.flatMap { + when (it.protocol) { + "file" -> it.toFile().listFiles()?.filter { it.extension == "properties" }?.map { lookupDescriptor(category, it.nameWithoutExtension) } ?: emptyList() + "jar" -> { + val file = JarFile(URL(it.file.substringBefore("!")).toFile()) + try { + val jarPath = it.file.substringAfterLast("!").removePrefix("/").removeSuffix("/") + file.entries() + .asSequence() + .filter { entry -> !entry.isDirectory && entry.path == jarPath && entry.extension == "properties" } + .map { entry -> + lookupDescriptor(category, entry.fileName.substringBeforeLast(".")) + }.toList() + } finally { + file.close() + } + } + else -> emptyList() + } + } + } +} + +inline fun ServiceLocator.lookup(category: String, implementationName: String): T = lookup(T::class.java, category, implementationName) +inline fun ServiceLocator.lookup(desc: ServiceDescriptor): T = lookup(T::class.java, desc) + +private val ZipEntry.fileName: String + get() = name.substringAfterLast("/", name) + +private val ZipEntry.path: String + get() = name.substringBeforeLast("/", "").removePrefix("/") + +private val ZipEntry.extension: String? + get() = fileName.let { fn -> if ("." in fn) fn.substringAfterLast(".") else null } diff --git a/core/src/main/kotlin/utilities/Uri.kt b/core/src/main/kotlin/utilities/Uri.kt new file mode 100644 index 00000000..089b3cff --- /dev/null +++ b/core/src/main/kotlin/utilities/Uri.kt @@ -0,0 +1,40 @@ +package org.jetbrains.dokka.utilities + +import java.net.URI + + +fun URI.relativeTo(uri: URI): URI { + // Normalize paths to remove . and .. segments + val base = uri.normalize() + val child = this.normalize() + + fun StringBuilder.appendRelativePath() { + // Split paths into segments + var bParts = base.path.split('/').dropLastWhile { it.isEmpty() } + val cParts = child.path.split('/').dropLastWhile { it.isEmpty() } + + // Discard trailing segment of base path + if (bParts.isNotEmpty() && !base.path.endsWith("/")) { + bParts = bParts.dropLast(1) + } + + // Compute common prefix + val commonPartsSize = bParts.zip(cParts).takeWhile { (basePart, childPart) -> basePart == childPart }.count() + bParts.drop(commonPartsSize).joinTo(this, separator = "") { "../" } + cParts.drop(commonPartsSize).joinTo(this, separator = "/") + } + + return URI.create(buildString { + if (base.path != child.path) { + appendRelativePath() + } + child.rawQuery?.let { + append("?") + append(it) + } + child.rawFragment?.let { + append("#") + append(it) + } + }) +} \ No newline at end of file diff --git a/core/src/main/kotlin/utilities/nodeDebug.kt b/core/src/main/kotlin/utilities/nodeDebug.kt new file mode 100644 index 00000000..3290202e --- /dev/null +++ b/core/src/main/kotlin/utilities/nodeDebug.kt @@ -0,0 +1,50 @@ +package org.jetbrains.dokka.utilities + +import org.jetbrains.dokka.model.DocumentationNode +import org.jetbrains.dokka.pages.* + +const val DOWN = '\u2503' +const val BRANCH = '\u2523' +const val LAST = '\u2517' + +fun DocumentationNode.pretty(prefix: String = "", isLast: Boolean = true): String { + val nextPrefix = prefix + (if (isLast) ' ' else DOWN) + ' ' + + return prefix + (if (isLast) LAST else BRANCH) + this.toString() + + children.dropLast(1) + .map { it.pretty(nextPrefix, false) } + .plus(children.lastOrNull()?.pretty(nextPrefix)) + .filterNotNull() + .takeIf { it.isNotEmpty() } + ?.joinToString(prefix = "\n", separator = "") + .orEmpty() + if (children.isEmpty()) "\n" else "" +} + +//fun Any.genericPretty(prefix: String = "", isLast: Boolean = true): String { +// val nextPrefix = prefix + (if (isLast) ' ' else DOWN) + ' ' +// +// return prefix + (if (isLast) LAST else BRANCH) + this.stringify() + +// allChildren().dropLast(1) +// .map { it.genericPretty(nextPrefix, false) } +// .plus(allChildren().lastOrNull()?.genericPretty(nextPrefix)) +// .filterNotNull() +// .takeIf { it.isNotEmpty() } +// ?.joinToString(prefix = "\n", separator = "") +// .orEmpty() + if (allChildren().isEmpty()) "\n" else "" +//} +private fun Any.stringify() = when(this) { + is ContentNode -> toString() + this.dci + is PageNode -> this.name + this::class.simpleName + else -> toString() +} +//private fun Any.allChildren() = when(this){ +// is PageNode -> children + content +// is ContentBlock -> this.children +// is ContentHeader -> this.items +// is ContentStyle -> this.items +// is ContentSymbol -> this.parts +// is ContentComment -> this.parts +// is ContentGroup -> this.children +// is ContentList -> this.items +// else -> emptyList() +//} -- cgit From dd017a44ed7baae83f4f09a92d9691231f424eaa Mon Sep 17 00:00:00 2001 From: BarkingBad <32793002+BarkingBad@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:01:25 +0100 Subject: Add abstract structure for MD/HTML comments and MD parser --- core/build.gradle | 2 +- core/src/main/kotlin/model/Documentable.kt | 166 +++++++++++++++ core/src/main/kotlin/model/DocumentationNode.kt | 162 --------------- core/src/main/kotlin/model/doc/DocNode.kt | 74 +++++++ core/src/main/kotlin/model/doc/DocType.kt | 18 ++ .../src/main/kotlin/model/doc/DocumentationNode.kt | 3 + .../pages/DefaultMarkdownToContentConverter.kt | 229 --------------------- .../main/kotlin/pages/DocNodeToContentConverter.kt | 82 ++++++++ .../kotlin/pages/MarkdownToContentConverter.kt | 4 +- core/src/main/kotlin/pages/PageBuilder.kt | 23 ++- core/src/main/kotlin/pages/PageContentBuilder.kt | 26 +-- core/src/main/kotlin/pages/PageNodes.kt | 22 +- core/src/main/kotlin/parsers/HtmlParser.kt | 89 ++++++++ core/src/main/kotlin/parsers/MarkdownParser.kt | 206 ++++++++++++++++++ core/src/main/kotlin/parsers/Parser.kt | 44 ++++ .../factories/DocNodesFromIElementFactory.kt | 36 ++++ .../parsers/factories/DocNodesFromStringFactory.kt | 76 +++++++ .../main/kotlin/plugability/DefaultExtensions.kt | 4 +- core/src/main/kotlin/renderers/HtmlRenderer.kt | 9 +- .../DefaultDescriptorToDocumentationTranslator.kt | 38 +--- .../DefaultDocumentationNodeMerger.kt | 9 +- core/src/main/kotlin/utilities/nodeDebug.kt | 4 +- core/src/test/kotlin/markdown/ParserTest.kt | 8 +- plugins/mathjax/src/main/kotlin/MathjaxPlugin.kt | 2 +- plugins/xml/src/main/kotlin/XmlPlugin.kt | 8 +- 25 files changed, 865 insertions(+), 479 deletions(-) create mode 100644 core/src/main/kotlin/model/Documentable.kt delete mode 100644 core/src/main/kotlin/model/DocumentationNode.kt create mode 100644 core/src/main/kotlin/model/doc/DocNode.kt create mode 100644 core/src/main/kotlin/model/doc/DocType.kt create mode 100644 core/src/main/kotlin/model/doc/DocumentationNode.kt delete mode 100644 core/src/main/kotlin/pages/DefaultMarkdownToContentConverter.kt create mode 100644 core/src/main/kotlin/pages/DocNodeToContentConverter.kt create mode 100644 core/src/main/kotlin/parsers/HtmlParser.kt create mode 100644 core/src/main/kotlin/parsers/MarkdownParser.kt create mode 100644 core/src/main/kotlin/parsers/Parser.kt create mode 100644 core/src/main/kotlin/parsers/factories/DocNodesFromIElementFactory.kt create mode 100644 core/src/main/kotlin/parsers/factories/DocNodesFromStringFactory.kt (limited to 'core/src/main/kotlin/utilities') diff --git a/core/build.gradle b/core/build.gradle index 20ff8760..f9ab0f37 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -28,7 +28,7 @@ dependencies { compile "org.jetbrains.kotlin:kotlin-reflect:$bundled_kotlin_compiler_version" compile group: 'com.google.inject', name: 'guice', version: '3.0' - compile "org.jsoup:jsoup:1.8.3" + implementation "org.jsoup:jsoup:1.12.1" compile "org.jetbrains.kotlin:kotlin-compiler:$bundled_kotlin_compiler_version" compile "org.jetbrains.kotlin:kotlin-script-runtime:$bundled_kotlin_compiler_version" diff --git a/core/src/main/kotlin/model/Documentable.kt b/core/src/main/kotlin/model/Documentable.kt new file mode 100644 index 00000000..9f676a1e --- /dev/null +++ b/core/src/main/kotlin/model/Documentable.kt @@ -0,0 +1,166 @@ +package org.jetbrains.dokka.model + +import model.doc.* +import org.jetbrains.dokka.transformers.descriptors.KotlinTypeWrapper +import org.jetbrains.dokka.links.DRI +import org.jetbrains.dokka.pages.PlatformData + +class Module(val packages: List) : Documentable() { + override val dri: DRI = DRI.topLevel + override val children: List = packages + override val extra: MutableSet = mutableSetOf() +} + +class Package( + override val dri: DRI, + override val functions: List, + override val properties: List, + override val classes: List, + override val extra: MutableSet = mutableSetOf() +) : ScopeNode() { + override val name = dri.packageName.orEmpty() +} + +class Class( + override val dri: DRI, + override val name: String, + val kind: ClassKind, + val constructors: List, + override val functions: List, + override val properties: List, + override val classes: List, + override val expected: ClassPlatformInfo?, + override val actual: List, + override val extra: MutableSet = mutableSetOf() +) : ScopeNode() { + val inherited by lazy { platformInfo.mapNotNull { (it as? ClassPlatformInfo)?.inherited }.flatten() } +} + +class Function( + override val dri: DRI, + override val name: String, + val returnType: TypeWrapper?, + val isConstructor: Boolean, + override val receiver: Parameter?, + val parameters: List, + override val expected: PlatformInfo?, + override val actual: List, + override val extra: MutableSet = mutableSetOf() +) : CallableNode() { + override val children: List + get() = listOfNotNull(receiver) + parameters +} + +class Property( + override val dri: DRI, + override val name: String, + override val receiver: Parameter?, + override val expected: PlatformInfo?, + override val actual: List, + override val extra: MutableSet = mutableSetOf() +) : CallableNode() { + override val children: List + get() = listOfNotNull(receiver) +} + +// TODO: treat named Parameters and receivers differently +class Parameter( + override val dri: DRI, + override val name: String?, + val type: TypeWrapper, + override val actual: List, + override val extra: MutableSet = mutableSetOf() +) : Documentable() { + override val children: List + get() = emptyList() +} + +interface PlatformInfo { + val documentationNode: DocumentationNode + val platformData: List +} + +class BasePlatformInfo( + override val documentationNode: DocumentationNode, + override val platformData: List) : PlatformInfo { + + override fun equals(other: Any?): Boolean = + other is PlatformInfo && documentationNode == other.documentationNode + + override fun hashCode(): Int = + documentationNode.hashCode() +} + +class ClassPlatformInfo( + val info: PlatformInfo, + val inherited: List) : PlatformInfo by info + +abstract class Documentable { + open val expected: PlatformInfo? = null + open val actual: List = emptyList() + open val name: String? = null + val platformInfo by lazy { listOfNotNull(expected) + actual } + val platformData by lazy { platformInfo.flatMap { it.platformData }.toSet() } + abstract val dri: DRI + + abstract val children: List + + override fun toString(): String { + return "${javaClass.simpleName}($dri)" + briefDocstring.takeIf { it.isNotBlank() }?.let { " [$it]" }.orEmpty() + } + + override fun equals(other: Any?) = other is Documentable && this.dri == other.dri + + override fun hashCode() = dri.hashCode() + + + + val commentsData: List + get() = platformInfo.map { it.documentationNode } + + val briefDocstring: String + get() = docNodeSummary(platformInfo.firstOrNull()?.documentationNode?.children?.firstOrNull()?.root ?: Text(body = "")).shorten(40) + + private fun docNodeSummary(docNode: DocNode): String { + if(docNode.children.isEmpty() && docNode is Text) + return docNode.body + + return docNode.children.joinToString(" ") { docNodeSummary(it) } + } + + open val extra: MutableSet = mutableSetOf() +} + +abstract class ScopeNode : Documentable() { + abstract val functions: List + abstract val properties: List + abstract val classes: List + + override val children: List + get() = functions + properties + classes +} + +abstract class CallableNode : Documentable() { + abstract val receiver: Parameter? +} + +private fun String.shorten(maxLength: Int) = lineSequence().first().let { + if (it.length != length || it.length > maxLength) it.take(maxLength - 3) + "..." else it +} + +interface TypeWrapper { + val constructorFqName: String? + val constructorNamePathSegments: List + val arguments: List + val dri: DRI? +} +interface ClassKind + +fun Documentable.dfs(predicate: (Documentable) -> Boolean): Documentable? = + if (predicate(this)) { + this + } else { + this.children.asSequence().mapNotNull { it.dfs(predicate) }.firstOrNull() + } + +interface Extra \ No newline at end of file diff --git a/core/src/main/kotlin/model/DocumentationNode.kt b/core/src/main/kotlin/model/DocumentationNode.kt deleted file mode 100644 index 77225eca..00000000 --- a/core/src/main/kotlin/model/DocumentationNode.kt +++ /dev/null @@ -1,162 +0,0 @@ -package org.jetbrains.dokka.model - -import org.jetbrains.dokka.transformers.descriptors.KotlinTypeWrapper -import org.jetbrains.dokka.links.DRI -import org.jetbrains.dokka.pages.PlatformData -import org.jetbrains.kotlin.kdoc.psi.impl.KDocTag - -class Module(val packages: List) : DocumentationNode() { - override val dri: DRI = DRI.topLevel - override val children: List = packages - override val extra: MutableSet = mutableSetOf() -} - -class Package( - override val dri: DRI, - override val functions: List, - override val properties: List, - override val classes: List, - override val extra: MutableSet = mutableSetOf() -) : ScopeNode() { - override val name = dri.packageName.orEmpty() -} - -class Class( - override val dri: DRI, - override val name: String, - val kind: ClassKind, - val constructors: List, - override val functions: List, - override val properties: List, - override val classes: List, - override val expected: ClassPlatformInfo?, - override val actual: List, - override val extra: MutableSet = mutableSetOf() -) : ScopeNode() { - val inherited by lazy { platformInfo.mapNotNull { (it as? ClassPlatformInfo)?.inherited }.flatten() } -} - -class Function( - override val dri: DRI, - override val name: String, - val returnType: TypeWrapper?, - val isConstructor: Boolean, - override val receiver: Parameter?, - val parameters: List, - override val expected: PlatformInfo?, - override val actual: List, - override val extra: MutableSet = mutableSetOf() -) : CallableNode() { - override val children: List - get() = listOfNotNull(receiver) + parameters -} - -class Property( - override val dri: DRI, - override val name: String, - override val receiver: Parameter?, - override val expected: PlatformInfo?, - override val actual: List, - override val extra: MutableSet = mutableSetOf() -) : CallableNode() { - override val children: List - get() = listOfNotNull(receiver) -} - -// TODO: treat named Parameters and receivers differently -class Parameter( - override val dri: DRI, - override val name: String?, - val type: TypeWrapper, - override val actual: List, - override val extra: MutableSet = mutableSetOf() -) : DocumentationNode() { - override val children: List - get() = emptyList() -} - -interface PlatformInfo { - val docTag: KDocTag? - val links: Map - val platformData: List -} - -class BasePlatformInfo( - override val docTag: KDocTag?, - override val links: Map, - override val platformData: List) : PlatformInfo { - - override fun equals(other: Any?): Boolean = - other is PlatformInfo && ( - docTag?.text == other.docTag?.text && - links == other.links) - - override fun hashCode(): Int = - listOf(docTag?.text, links).hashCode() -} - -class ClassPlatformInfo( - val info: PlatformInfo, - val inherited: List) : PlatformInfo by info - -abstract class DocumentationNode { - open val expected: PlatformInfo? = null - open val actual: List = emptyList() - open val name: String? = null - val platformInfo by lazy { listOfNotNull(expected) + actual } - val platformData by lazy { platformInfo.flatMap { it.platformData }.toSet() } - - abstract val dri: DRI - - abstract val children: List - - override fun toString(): String { - return "${javaClass.simpleName}($dri)" + briefDocstring.takeIf { it.isNotBlank() }?.let { " [$it]" }.orEmpty() - } - - override fun equals(other: Any?) = other is DocumentationNode && this.dri == other.dri - - override fun hashCode() = dri.hashCode() - - val commentsData: List>> - get() = platformInfo.mapNotNull { it.docTag?.let { tag -> Pair(tag.getContent(), it.links) } } - - val briefDocstring: String - get() = platformInfo.firstOrNull()?.docTag?.getContent().orEmpty().shorten(40) - - open val extra: MutableSet = mutableSetOf() -} - -abstract class ScopeNode : DocumentationNode() { - abstract val functions: List - abstract val properties: List - abstract val classes: List - - override val children: List - get() = functions + properties + classes -} - -abstract class CallableNode : DocumentationNode() { - abstract val receiver: Parameter? -} - -private fun String.shorten(maxLength: Int) = lineSequence().first().let { - if (it.length != length || it.length > maxLength) it.take(maxLength - 3) + "..." else it -} - -interface TypeWrapper { - val constructorFqName: String? - val constructorNamePathSegments: List - val arguments: List - val dri: DRI? -} -interface ClassKind - -fun DocumentationNode.dfs(predicate: (DocumentationNode) -> Boolean): DocumentationNode? = - if (predicate(this)) { - this - } else { - this.children.asSequence().mapNotNull { it.dfs(predicate) }.firstOrNull() - } - -interface Extra \ No newline at end of file diff --git a/core/src/main/kotlin/model/doc/DocNode.kt b/core/src/main/kotlin/model/doc/DocNode.kt new file mode 100644 index 00000000..0c643551 --- /dev/null +++ b/core/src/main/kotlin/model/doc/DocNode.kt @@ -0,0 +1,74 @@ +package model.doc + +import org.jetbrains.dokka.links.DRI + +sealed class DocNode( + val children: List, + val params: Map +) + +class A(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Big(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class B(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class BlockQuote(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Cite(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Code(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Dd(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Dfn(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Dir(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Div(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Dl(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Dt(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Em(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Font(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Footer(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Frame(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class FrameSet(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class H1(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class H2(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class H3(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class H4(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class H5(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class H6(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Head(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Header(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Html(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class I(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class IFrame(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Img(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Input(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Li(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Link(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Listing(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Main(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Menu(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Meta(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Nav(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class NoFrames(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class NoScript(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Ol(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class P(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Pre(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Script(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Section(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Small(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Span(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Strong(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Sub(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Sup(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Table(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Text(children: List = emptyList(), params: Map = emptyMap(), val body: String = "") : DocNode(children, params) +class TBody(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Td(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class TFoot(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Th(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class THead(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Title(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Tr(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Tt(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class U(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Ul(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class Var(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) +class DocumentationLink(children: List = emptyList(), params: Map = emptyMap(), val dri: DRI) : DocNode(children, params) +class HorizontalRule() : DocNode(emptyList(), emptyMap()) +class CustomNode(children: List = emptyList(), params: Map = emptyMap()) : DocNode(children, params) \ No newline at end of file diff --git a/core/src/main/kotlin/model/doc/DocType.kt b/core/src/main/kotlin/model/doc/DocType.kt new file mode 100644 index 00000000..0888876e --- /dev/null +++ b/core/src/main/kotlin/model/doc/DocType.kt @@ -0,0 +1,18 @@ +package model.doc + +sealed class DocType(val root: DocNode) +class Description(root: DocNode) : DocType(root) +class Author(root: DocNode) : DocType(root) +class Version(root: DocNode) : DocType(root) +class Since(root: DocNode) : DocType(root) +class See(root: DocNode, val name: String) : DocType(root) +class Param(root: DocNode, val name: String) : DocType(root) +class Return(root: DocNode) : DocType(root) +class Receiver(root: DocNode) : DocType(root) +class Constructor(root: DocNode) : DocType(root) +class Throws(root: DocNode, val name: String) : DocType(root) +class Sample(root: DocNode, val name: String) : DocType(root) +class Deprecated(root: DocNode) : DocType(root) +class Property(root: DocNode, val name: String) : DocType(root) +class Suppress(root: DocNode) : DocType(root) +class CustomTag(root: DocNode, val name: String) : DocType(root) diff --git a/core/src/main/kotlin/model/doc/DocumentationNode.kt b/core/src/main/kotlin/model/doc/DocumentationNode.kt new file mode 100644 index 00000000..73424616 --- /dev/null +++ b/core/src/main/kotlin/model/doc/DocumentationNode.kt @@ -0,0 +1,3 @@ +package model.doc + +data class DocumentationNode(val children: List) \ No newline at end of file diff --git a/core/src/main/kotlin/pages/DefaultMarkdownToContentConverter.kt b/core/src/main/kotlin/pages/DefaultMarkdownToContentConverter.kt deleted file mode 100644 index bb8a826d..00000000 --- a/core/src/main/kotlin/pages/DefaultMarkdownToContentConverter.kt +++ /dev/null @@ -1,229 +0,0 @@ -package org.jetbrains.dokka.pages - -import org.intellij.markdown.MarkdownElementTypes -import org.intellij.markdown.MarkdownTokenTypes -import org.jetbrains.dokka.markdown.MarkdownNode -import org.jetbrains.dokka.links.DRI -import org.jetbrains.dokka.plugability.DokkaContext - -class DefaultMarkdownToContentConverter( - private val context: DokkaContext -) : MarkdownToContentConverter { - override fun buildContent( - node: MarkdownNode, - dci: DCI, - platforms: Set, - links: Map, - styles: Set