Extract Uri Provider from generator, to avoid cycle injection
diff --git a/core/src/main/kotlin/Formats/JavaLayoutHtmlFormat.kt b/core/src/main/kotlin/Formats/JavaLayoutHtmlFormat.kt
index f313aa8..4e139eb 100644
--- a/core/src/main/kotlin/Formats/JavaLayoutHtmlFormat.kt
+++ b/core/src/main/kotlin/Formats/JavaLayoutHtmlFormat.kt
@@ -12,6 +12,7 @@
import org.jetbrains.dokka.NodeKind.Companion.classLike
import org.jetbrains.dokka.NodeKind.Companion.memberLike
import org.jetbrains.dokka.Utilities.bind
+import org.jetbrains.dokka.Utilities.toOptional
import org.jetbrains.dokka.Utilities.toType
import org.jetbrains.kotlin.preprocessor.mkdirsOrFail
import java.io.BufferedWriter
@@ -27,6 +28,8 @@
bind<Generator>() toType generatorServiceClass
bind<LanguageService>() toType languageServiceClass
bind<JavaLayoutHtmlTemplateService>() toType templateServiceClass
+ bind<JavaLayoutHtmlUriProvider>() toType generatorServiceClass
+ bind<JavaLayoutHtmlFormatOutlineFactoryService>() toOptional outlineFactoryClass
}
val generatorServiceClass = JavaLayoutHtmlFormatGenerator::class
@@ -72,14 +75,14 @@
class JavaLayoutHtmlFormatOutputBuilder(
val output: Appendable,
val languageService: LanguageService,
- val generator: JavaLayoutHtmlFormatGenerator,
+ val uriProvider: JavaLayoutHtmlUriProvider,
val templateService: JavaLayoutHtmlTemplateService,
val uri: URI
) {
val htmlConsumer = output.appendHTML()
- val contentToHtmlBuilder = ContentToHtmlBuilder(generator, uri)
+ val contentToHtmlBuilder = ContentToHtmlBuilder(uriProvider, uri)
private fun FlowContent.summaryNodeGroup(nodes: Iterable<DocumentationNode>, header: String, headerAsRow: Boolean = false, row: TBODY.(DocumentationNode) -> Unit) {
if (nodes.none()) return
@@ -106,7 +109,7 @@
}
private fun TBODY.formatClassLikeRow(node: DocumentationNode) = tr {
- td { a(href = generator.linkTo(node, uri)) { +node.simpleName() } }
+ td { a(href = uriProvider.linkTo(node, uri)) { +node.simpleName() } }
td { metaMarkup(node.summary) }
}
@@ -119,7 +122,7 @@
}
td {
div {
- a(href = generator.linkTo(node, uri)) { +node.name }
+ a(href = uriProvider.linkTo(node, uri)) { +node.name }
}
metaMarkup(node.summary)
@@ -208,7 +211,7 @@
)
}
-class ContentToHtmlBuilder(val generator: JavaLayoutHtmlFormatGenerator, val uri: URI) {
+class ContentToHtmlBuilder(val uriProvider: JavaLayoutHtmlUriProvider, val uri: URI) {
fun FlowContent.appendContent(content: List<ContentNode>): Unit = content.forEach { appendContent(it) }
private fun FlowContent.hN(level: Int, classes: String? = null, block: CommonAttributeGroupFacadeFlowHeadingPhrasingContent.() -> Unit) {
@@ -261,7 +264,7 @@
is ContentParagraph -> p { appendContent(content.children) }
is ContentNodeLink -> {
- a(href = generator.linkTo(content.node!!, uri)) { appendContent(content.children) }
+ a(href = uriProvider.linkTo(content.node!!, uri)) { appendContent(content.children) }
}
is ContentExternalLink -> {
a(href = content.href) { appendContent(content.children) }
@@ -272,38 +275,45 @@
}
}
+
+interface JavaLayoutHtmlUriProvider {
+ fun containerUriOfNode(node: DocumentationNode): URI
+ fun mainUriForNode(node: DocumentationNode): URI
+
+ fun linkTo(to: DocumentationNode, from: URI): String {
+ return mainUriForNode(to).relativeTo(from).toString()
+ }
+}
+
class JavaLayoutHtmlFormatGenerator @Inject constructor(
@Named("outputDir") val root: File,
val languageService: LanguageService,
val templateService: JavaLayoutHtmlTemplateService,
val outlineFactoryService: JavaLayoutHtmlFormatOutlineFactoryService
-) : Generator {
+) : Generator, JavaLayoutHtmlUriProvider {
fun createOutputBuilderForNode(node: DocumentationNode, output: Appendable)
= JavaLayoutHtmlFormatOutputBuilder(output, languageService, this, templateService, mainUriForNode(node))
- fun containerUriOfNode(node: DocumentationNode): URI {
+ override fun containerUriOfNode(node: DocumentationNode): URI {
return when (node.kind) {
- NodeKind.Module -> URI("/").resolve(node.name)
+ NodeKind.Module -> URI("/").resolve(node.name + "/")
NodeKind.Package -> containerUriOfNode(node.owner!!).resolve(node.name.replace('.', '/') + '/')
in classLike -> containerUriOfNode(node.owner!!).resolve("${node.name}.html")
else -> error("Can't contain nested")
}
}
- fun mainUriForNode(node: DocumentationNode): URI {
+ override fun mainUriForNode(node: DocumentationNode): URI {
return when (node.kind) {
NodeKind.Package -> containerUriOfNode(node).resolve("package-summary.html")
NodeKind.Class -> containerUriOfNode(node).resolve("#")
in memberLike -> mainUriForNode(node.owner!!).resolve("#${node.signatureUrlEncoded()}")
- else -> error("Not supported")
+ NodeKind.AllTypes -> containerUriOfNode(node.owner!!).resolve("allclasses.html")
+ else -> error("Not supported ${node.kind}")
}
}
- fun linkTo(to: DocumentationNode, from: URI): String {
- return mainUriForNode(to).relativeTo(from).toString()
- }
-
fun buildClass(node: DocumentationNode, parentDir: File) {
val fileForClass = parentDir.resolve(node.simpleName() + ".html")
fileForClass.bufferedWriter().use {