aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build.gradle1
-rw-r--r--core/build.gradle2
-rw-r--r--core/src/main/kotlin/Formats/AnalysisComponents.kt45
-rw-r--r--core/src/main/kotlin/Formats/FormatDescriptor.kt44
-rw-r--r--core/src/main/kotlin/Formats/GFMFormatService.kt46
-rw-r--r--core/src/main/kotlin/Formats/HtmlFormatService.kt22
-rw-r--r--core/src/main/kotlin/Formats/HtmlTemplateService.kt8
-rw-r--r--core/src/main/kotlin/Formats/JavaLayoutHtmlFormat.kt92
-rw-r--r--core/src/main/kotlin/Formats/JekyllFormatService.kt26
-rw-r--r--core/src/main/kotlin/Formats/KotlinWebsiteFormatService.kt67
-rw-r--r--core/src/main/kotlin/Formats/KotlinWebsiteHtmlFormatService.kt34
-rw-r--r--core/src/main/kotlin/Formats/MarkdownFormatService.kt14
-rw-r--r--core/src/main/kotlin/Formats/PackageListService.kt10
-rw-r--r--core/src/main/kotlin/Formats/StandardFormats.kt44
-rw-r--r--core/src/main/kotlin/Formats/StructuredFormatService.kt19
-rw-r--r--core/src/main/kotlin/Formats/YamlOutlineService.kt8
-rw-r--r--core/src/main/kotlin/Generation/ConsoleGenerator.kt42
-rw-r--r--core/src/main/kotlin/Generation/FileGenerator.kt31
-rw-r--r--core/src/main/kotlin/Generation/Generator.kt8
-rw-r--r--core/src/main/kotlin/Locations/FoldersLocationService.kt30
-rw-r--r--core/src/main/kotlin/Locations/Location.kt61
-rw-r--r--core/src/main/kotlin/Locations/LocationService.kt78
-rw-r--r--core/src/main/kotlin/Locations/SingleFolderLocationService.kt20
-rw-r--r--core/src/main/kotlin/Utilities/DokkaModules.kt57
-rw-r--r--core/src/main/kotlin/javadoc/dokka-adapters.kt26
-rw-r--r--core/src/main/resources/dokka/format/java-layout-html.properties2
-rw-r--r--core/src/main/resources/dokka/format/javadoc.properties3
-rw-r--r--core/src/main/resources/dokka/generator/default.properties2
-rw-r--r--core/src/main/resources/dokka/generator/javadoc.properties2
-rw-r--r--core/src/main/resources/dokka/language/java.properties1
-rw-r--r--core/src/main/resources/dokka/language/kotlin.properties1
-rw-r--r--core/src/main/resources/dokka/outline/yaml.properties1
-rw-r--r--core/src/test/kotlin/TestAPI.kt15
-rw-r--r--core/src/test/kotlin/format/FileGeneratorTestCase.kt35
-rw-r--r--core/src/test/kotlin/format/GFMFormatTest.kt15
-rw-r--r--core/src/test/kotlin/format/HtmlFormatTest.kt18
-rw-r--r--core/src/test/kotlin/format/KotlinWebSiteFormatTest.kt17
-rw-r--r--core/src/test/kotlin/format/KotlinWebSiteHtmlFormatTest.kt15
-rw-r--r--core/src/test/kotlin/format/KotlinWebSiteRunnableSamplesFormatTest.kt56
-rw-r--r--core/src/test/kotlin/format/MarkdownFormatTest.kt51
-rw-r--r--core/src/test/kotlin/format/PackageDocsTest.kt14
-rw-r--r--core/testdata/format/JavaSupertype.html10
-rw-r--r--core/testdata/format/accessor.md2
-rw-r--r--core/testdata/format/annotatedTypeParameter.md4
-rw-r--r--core/testdata/format/annotationClass.md4
-rw-r--r--core/testdata/format/annotationClass.package.md4
-rw-r--r--core/testdata/format/annotationParams.md2
-rw-r--r--core/testdata/format/annotations.md8
-rw-r--r--core/testdata/format/arrayAverage.md6
-rw-r--r--core/testdata/format/backtickInCodeBlock.md2
-rw-r--r--core/testdata/format/blankLineInsideCodeBlock.html2
-rw-r--r--core/testdata/format/blankLineInsideCodeBlock.md2
-rw-r--r--core/testdata/format/bracket.html2
-rw-r--r--core/testdata/format/brokenLink.html2
-rw-r--r--core/testdata/format/classWithCompanionObject.html8
-rw-r--r--core/testdata/format/classWithCompanionObject.md8
-rw-r--r--core/testdata/format/codeBlock.html44
-rw-r--r--core/testdata/format/codeBlock.md14
-rw-r--r--core/testdata/format/codeBlockNoHtmlEscape.md2
-rw-r--r--core/testdata/format/codeSpan.html2
-rw-r--r--core/testdata/format/companionImplements.md8
-rw-r--r--core/testdata/format/companionObjectExtension.md6
-rw-r--r--core/testdata/format/crossLanguage/kotlinExtendsJava/Bar.html12
-rw-r--r--core/testdata/format/deprecated.class.html38
-rw-r--r--core/testdata/format/deprecated.package.html8
-rw-r--r--core/testdata/format/dynamicExtension.md4
-rw-r--r--core/testdata/format/dynamicType.md2
-rw-r--r--core/testdata/format/emptyDescription.md2
-rw-r--r--core/testdata/format/entity.html4
-rw-r--r--core/testdata/format/enumClass.md6
-rw-r--r--core/testdata/format/enumClass.value.md2
-rw-r--r--core/testdata/format/exceptionClass.md4
-rw-r--r--core/testdata/format/exceptionClass.package.md4
-rw-r--r--core/testdata/format/exclInCodeBlock.md2
-rw-r--r--core/testdata/format/extensionFunctionParameter.md4
-rw-r--r--core/testdata/format/extensionScope.md4
-rw-r--r--core/testdata/format/extensionWithDocumentedReceiver.md2
-rw-r--r--core/testdata/format/extensions.class.md6
-rw-r--r--core/testdata/format/extensions.package.md4
-rw-r--r--core/testdata/format/externalReferenceLink.md2
-rw-r--r--core/testdata/format/functionWithDefaultParameter.md2
-rw-r--r--core/testdata/format/functionalTypeWithNamedParameters.html90
-rw-r--r--core/testdata/format/functionalTypeWithNamedParameters.md36
-rw-r--r--core/testdata/format/genericInheritedExtensions.md10
-rw-r--r--core/testdata/format/gfm/listInTableCell.md6
-rw-r--r--core/testdata/format/gfm/sample.md8
-rw-r--r--core/testdata/format/htmlEscaping.html4
-rw-r--r--core/testdata/format/inapplicableExtensionFunctions.md8
-rw-r--r--core/testdata/format/indentedCodeBlock.html2
-rw-r--r--core/testdata/format/indentedCodeBlock.md2
-rw-r--r--core/testdata/format/inheritedCompanionObjectProperties.md16
-rw-r--r--core/testdata/format/inheritedExtensions.md10
-rw-r--r--core/testdata/format/inheritedMembers.md14
-rw-r--r--core/testdata/format/javaCodeInParam.md4
-rw-r--r--core/testdata/format/javaCodeLiteralTags.md4
-rw-r--r--core/testdata/format/javaDeprecated.html4
-rw-r--r--core/testdata/format/javaLinkTag.html10
-rw-r--r--core/testdata/format/javaLinkTagWithLabel.html10
-rw-r--r--core/testdata/format/javaSeeTag.html8
-rw-r--r--core/testdata/format/javaSpaceInAuthor.md4
-rw-r--r--core/testdata/format/javadocHtml.md4
-rw-r--r--core/testdata/format/javadocOrderedList.md4
-rw-r--r--core/testdata/format/jdkLinks.md4
-rw-r--r--core/testdata/format/linkWithLabel.html10
-rw-r--r--core/testdata/format/linkWithStarProjection.html4
-rw-r--r--core/testdata/format/linksInEmphasis.md14
-rw-r--r--core/testdata/format/linksInHeaders.md28
-rw-r--r--core/testdata/format/linksInStrong.md14
-rw-r--r--core/testdata/format/markdownInLinks.html2
-rw-r--r--core/testdata/format/memberExtension.md6
-rw-r--r--core/testdata/format/multiplatform/breadcrumbsInMemberOfMemberOfGroupNode/multiplatform.md2
-rw-r--r--core/testdata/format/multiplatform/groupNode/multiplatform.md6
-rw-r--r--core/testdata/format/multiplatform/groupNode/multiplatform.package.md8
-rw-r--r--core/testdata/format/multiplatform/implied/foo.md16
-rw-r--r--core/testdata/format/multiplatform/merge/multiplatform.package.md4
-rw-r--r--core/testdata/format/multiplatform/mergeMembers/foo.md16
-rw-r--r--core/testdata/format/multiplatform/omitRedundant/foo.md8
-rw-r--r--core/testdata/format/multiplatform/packagePlatformsFromMembers/multiplatform.index.md4
-rw-r--r--core/testdata/format/multiplatform/packagePlatformsFromMembers/multiplatform.package.md4
-rw-r--r--core/testdata/format/multiplatform/packagePlatformsWithExtExtensions/multiplatform.index.md4
-rw-r--r--core/testdata/format/multiplatform/packagePlatformsWithExtExtensions/multiplatform.package.md4
-rw-r--r--core/testdata/format/multiplatform/simple/multiplatform.package.md6
-rw-r--r--core/testdata/format/multipleTypeParameterConstraints.md13
-rw-r--r--core/testdata/format/nestedLists.md30
-rw-r--r--core/testdata/format/newlineInTableCell.package.md4
-rw-r--r--core/testdata/format/notPublishedTypeAliasAutoExpansion.md6
-rw-r--r--core/testdata/format/nullability.md6
-rw-r--r--core/testdata/format/operatorOverloading.md4
-rw-r--r--core/testdata/format/orderedList.html4
-rw-r--r--core/testdata/format/overloads.html4
-rw-r--r--core/testdata/format/overloadsWithDescription.html4
-rw-r--r--core/testdata/format/overloadsWithDifferentDescriptions.html2
-rw-r--r--core/testdata/format/overridingFunction.md4
-rw-r--r--core/testdata/format/paramTag.md2
-rw-r--r--core/testdata/format/parameterAnchor.html6
-rw-r--r--core/testdata/format/parenthesis.html2
-rw-r--r--core/testdata/format/propertyVar.md2
-rw-r--r--core/testdata/format/qualifiedNameLink.md2
-rw-r--r--core/testdata/format/receiverParameterTypeBound.md6
-rw-r--r--core/testdata/format/receiverReference.md4
-rw-r--r--core/testdata/format/referenceLink.md10
-rw-r--r--core/testdata/format/reifiedTypeParameter.md2
-rw-r--r--core/testdata/format/renderFunctionalTypeInParenthesisWhenItIsReceiver.md4
-rw-r--r--core/testdata/format/returnWithLink.html4
-rw-r--r--core/testdata/format/sampleByFQName.md7
-rw-r--r--core/testdata/format/sampleByShortName.md7
-rw-r--r--core/testdata/format/see.html31
-rw-r--r--core/testdata/format/shadowedExtensionFunctions.md10
-rw-r--r--core/testdata/format/sinceKotlin.html4
-rw-r--r--core/testdata/format/sinceKotlin.md4
-rw-r--r--core/testdata/format/sinceKotlin.package.md4
-rw-r--r--core/testdata/format/sinceKotlinWide.package.md6
-rw-r--r--core/testdata/format/starProjection.md4
-rw-r--r--core/testdata/format/summarizeSignatures.md10
-rw-r--r--core/testdata/format/summarizeSignaturesProperty.md10
-rw-r--r--core/testdata/format/suspendParam.md2
-rw-r--r--core/testdata/format/suspendParam.package.md4
-rw-r--r--core/testdata/format/throwsTag.md2
-rw-r--r--core/testdata/format/tokensInEmphasis.md10
-rw-r--r--core/testdata/format/tokensInHeaders.md26
-rw-r--r--core/testdata/format/tokensInStrong.md12
-rw-r--r--core/testdata/format/tripleBackticks.html2
-rw-r--r--core/testdata/format/typeAliases.md73
-rw-r--r--core/testdata/format/typeAliases.package.md30
-rw-r--r--core/testdata/format/typeLink.html6
-rw-r--r--core/testdata/format/typeParameterBounds.md4
-rw-r--r--core/testdata/format/typeParameterReference.md6
-rw-r--r--core/testdata/format/typeParameterVariance.md4
-rw-r--r--core/testdata/format/typeProjectionVariance.md4
-rw-r--r--core/testdata/format/uninterpretedEmphasisCharacters.html2
-rw-r--r--core/testdata/format/unorderedLists.md24
-rw-r--r--core/testdata/format/varargsFunction.md2
-rw-r--r--core/testdata/format/website-html/dataTags/multiplatform.package.html18
-rw-r--r--core/testdata/format/website-html/dataTagsInGroupNode/multiplatform.html6
-rw-r--r--core/testdata/format/website-html/dataTagsInGroupNode/multiplatform.package.html8
-rw-r--r--core/testdata/format/website-html/dropImport.html2
-rw-r--r--core/testdata/format/website-html/newLinesInImportList.html2
-rw-r--r--core/testdata/format/website-html/newLinesInSamples.html2
-rw-r--r--core/testdata/format/website-html/overloadGroup.html2
-rw-r--r--core/testdata/format/website-html/returnTag.html8
-rw-r--r--core/testdata/format/website-html/sample.html2
-rw-r--r--core/testdata/format/website-html/sampleWithAsserts.html2
182 files changed, 1307 insertions, 939 deletions
diff --git a/build.gradle b/build.gradle
index f1748259..35ec271e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -34,6 +34,7 @@ allprojects {
maven { url 'https://jitpack.io' }
maven { url "https://teamcity.jetbrains.com/guestAuth/repository/download/Kotlin_dev_CompilerAllPlugins/$bundled_kotlin_compiler_version/maven" }
ivy(repo)
+ maven { url "https://dl.bintray.com/kotlin/kotlinx.html" }
}
}
diff --git a/core/build.gradle b/core/build.gradle
index 1a93bb48..a87d3c97 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -33,6 +33,8 @@ dependencies {
compile intellijCoreAnalysis()
+ compile 'org.jetbrains.kotlinx:kotlinx-html-jvm:0.6.8'
+
//tools.jar
def toolsJar = files(((URLClassLoader) ToolProvider.getSystemToolClassLoader()).getURLs().findAll { it.path.endsWith("jar") })
compileOnly toolsJar
diff --git a/core/src/main/kotlin/Formats/AnalysisComponents.kt b/core/src/main/kotlin/Formats/AnalysisComponents.kt
new file mode 100644
index 00000000..c4d97dbb
--- /dev/null
+++ b/core/src/main/kotlin/Formats/AnalysisComponents.kt
@@ -0,0 +1,45 @@
+package org.jetbrains.dokka.Formats
+
+import com.google.inject.Binder
+import org.jetbrains.dokka.*
+import org.jetbrains.dokka.Kotlin.KotlinAsJavaDescriptorSignatureProvider
+import org.jetbrains.dokka.Kotlin.KotlinDescriptorSignatureProvider
+import org.jetbrains.dokka.Model.DescriptorSignatureProvider
+import org.jetbrains.dokka.Samples.DefaultSampleProcessingService
+import org.jetbrains.dokka.Samples.SampleProcessingService
+import org.jetbrains.dokka.Utilities.bind
+import org.jetbrains.dokka.Utilities.toType
+import kotlin.reflect.KClass
+
+
+interface DefaultAnalysisComponentServices {
+ val packageDocumentationBuilderClass: KClass<out PackageDocumentationBuilder>
+ val javaDocumentationBuilderClass: KClass<out JavaDocumentationBuilder>
+ val sampleProcessingService: KClass<out SampleProcessingService>
+ val descriptorSignatureProvider: KClass<out DescriptorSignatureProvider>
+}
+
+interface DefaultAnalysisComponent : FormatDescriptorAnalysisComponent, DefaultAnalysisComponentServices {
+ override fun configureAnalysis(binder: Binder): Unit = with(binder) {
+ bind<DescriptorSignatureProvider>() toType descriptorSignatureProvider
+ bind<PackageDocumentationBuilder>() toType packageDocumentationBuilderClass
+ bind<JavaDocumentationBuilder>() toType javaDocumentationBuilderClass
+ bind<SampleProcessingService>() toType sampleProcessingService
+ }
+}
+
+
+object KotlinAsJava : DefaultAnalysisComponentServices {
+ override val packageDocumentationBuilderClass = KotlinAsJavaDocumentationBuilder::class
+ override val javaDocumentationBuilderClass = JavaPsiDocumentationBuilder::class
+ override val sampleProcessingService = DefaultSampleProcessingService::class
+ override val descriptorSignatureProvider = KotlinAsJavaDescriptorSignatureProvider::class
+}
+
+
+object KotlinAsKotlin : DefaultAnalysisComponentServices {
+ override val packageDocumentationBuilderClass = KotlinPackageDocumentationBuilder::class
+ override val javaDocumentationBuilderClass = KotlinJavaDocumentationBuilder::class
+ override val sampleProcessingService = DefaultSampleProcessingService::class
+ override val descriptorSignatureProvider = KotlinDescriptorSignatureProvider::class
+} \ No newline at end of file
diff --git a/core/src/main/kotlin/Formats/FormatDescriptor.kt b/core/src/main/kotlin/Formats/FormatDescriptor.kt
index da0156a7..a1120c00 100644
--- a/core/src/main/kotlin/Formats/FormatDescriptor.kt
+++ b/core/src/main/kotlin/Formats/FormatDescriptor.kt
@@ -1,17 +1,39 @@
package org.jetbrains.dokka.Formats
+import com.google.inject.Binder
import org.jetbrains.dokka.*
-import org.jetbrains.dokka.Model.DescriptorSignatureProvider
-import org.jetbrains.dokka.Samples.SampleProcessingService
+import org.jetbrains.dokka.Utilities.bind
+import org.jetbrains.dokka.Utilities.lazyBind
+import org.jetbrains.dokka.Utilities.toOptional
+import org.jetbrains.dokka.Utilities.toType
import kotlin.reflect.KClass
-interface FormatDescriptor {
- val formatServiceClass: KClass<out FormatService>?
- val outlineServiceClass: KClass<out OutlineFormatService>?
- val generatorServiceClass: KClass<out Generator>
- val packageDocumentationBuilderClass: KClass<out PackageDocumentationBuilder>
- val javaDocumentationBuilderClass: KClass<out JavaDocumentationBuilder>
- val sampleProcessingService: KClass<out SampleProcessingService>
- val packageListServiceClass: KClass<out PackageListService>?
- val descriptorSignatureProvider: KClass<out DescriptorSignatureProvider>
+
+interface FormatDescriptorAnalysisComponent {
+ fun configureAnalysis(binder: Binder)
+}
+
+interface FormatDescriptorOutputComponent {
+ fun configureOutput(binder: Binder)
}
+
+interface FormatDescriptor : FormatDescriptorAnalysisComponent, FormatDescriptorOutputComponent
+
+
+abstract class FileGeneratorBasedFormatDescriptor : FormatDescriptor {
+
+ override fun configureOutput(binder: Binder): Unit = with(binder) {
+ bind<Generator>() toType NodeLocationAwareGenerator::class
+ bind<NodeLocationAwareGenerator>() toType generatorServiceClass
+
+
+ lazyBind<OutlineFormatService>() toOptional (outlineServiceClass)
+ lazyBind<FormatService>() toOptional formatServiceClass
+ lazyBind<PackageListService>() toOptional packageListServiceClass
+ }
+
+ abstract val formatServiceClass: KClass<out FormatService>?
+ abstract val outlineServiceClass: KClass<out OutlineFormatService>?
+ abstract val generatorServiceClass: KClass<out FileGenerator>
+ abstract val packageListServiceClass: KClass<out PackageListService>?
+} \ No newline at end of file
diff --git a/core/src/main/kotlin/Formats/GFMFormatService.kt b/core/src/main/kotlin/Formats/GFMFormatService.kt
index f741561c..036ec856 100644
--- a/core/src/main/kotlin/Formats/GFMFormatService.kt
+++ b/core/src/main/kotlin/Formats/GFMFormatService.kt
@@ -4,14 +4,14 @@ import com.google.inject.Inject
import com.google.inject.name.Named
import org.jetbrains.dokka.Utilities.impliedPlatformsName
-open class GFMOutputBuilder(to: StringBuilder,
- location: Location,
- locationService: LocationService,
- languageService: LanguageService,
- extension: String,
- impliedPlatforms: List<String>)
- : MarkdownOutputBuilder(to, location, locationService, languageService, extension, impliedPlatforms)
-{
+open class GFMOutputBuilder(
+ to: StringBuilder,
+ location: Location,
+ generator: NodeLocationAwareGenerator,
+ languageService: LanguageService,
+ extension: String,
+ impliedPlatforms: List<String>
+) : MarkdownOutputBuilder(to, location, generator, languageService, extension, impliedPlatforms) {
override fun appendTable(vararg columns: String, body: () -> Unit) {
to.appendln(columns.joinToString(" | ", "| ", " |"))
to.appendln("|" + "---|".repeat(columns.size))
@@ -21,8 +21,7 @@ open class GFMOutputBuilder(to: StringBuilder,
override fun appendUnorderedList(body: () -> Unit) {
if (inTableCell) {
wrapInTag("ul", body)
- }
- else {
+ } else {
super.appendUnorderedList(body)
}
}
@@ -30,8 +29,7 @@ open class GFMOutputBuilder(to: StringBuilder,
override fun appendOrderedList(body: () -> Unit) {
if (inTableCell) {
wrapInTag("ol", body)
- }
- else {
+ } else {
super.appendOrderedList(body)
}
}
@@ -39,23 +37,25 @@ open class GFMOutputBuilder(to: StringBuilder,
override fun appendListItem(body: () -> Unit) {
if (inTableCell) {
wrapInTag("li", body)
- }
- else {
+ } else {
super.appendListItem(body)
}
}
}
-open class GFMFormatService(locationService: LocationService,
- signatureGenerator: LanguageService,
- linkExtension: String,
- impliedPlatforms: List<String>)
-: MarkdownFormatService(locationService, signatureGenerator, linkExtension, impliedPlatforms) {
+open class GFMFormatService(
+ generator: NodeLocationAwareGenerator,
+ signatureGenerator: LanguageService,
+ linkExtension: String,
+ impliedPlatforms: List<String>
+) : MarkdownFormatService(generator, signatureGenerator, linkExtension, impliedPlatforms) {
- @Inject constructor(locationService: LocationService,
- signatureGenerator: LanguageService,
- @Named(impliedPlatformsName) impliedPlatforms: List<String>) : this(locationService, signatureGenerator, "md", impliedPlatforms)
+ @Inject constructor(
+ generator: NodeLocationAwareGenerator,
+ signatureGenerator: LanguageService,
+ @Named(impliedPlatformsName) impliedPlatforms: List<String>
+ ) : this(generator, signatureGenerator, "md", impliedPlatforms)
override fun createOutputBuilder(to: StringBuilder, location: Location): FormattedOutputBuilder =
- GFMOutputBuilder(to, location, locationService, languageService, extension, impliedPlatforms)
+ GFMOutputBuilder(to, location, generator, languageService, extension, impliedPlatforms)
}
diff --git a/core/src/main/kotlin/Formats/HtmlFormatService.kt b/core/src/main/kotlin/Formats/HtmlFormatService.kt
index 5e05f51a..0073553c 100644
--- a/core/src/main/kotlin/Formats/HtmlFormatService.kt
+++ b/core/src/main/kotlin/Formats/HtmlFormatService.kt
@@ -5,16 +5,15 @@ import com.google.inject.name.Named
import org.jetbrains.dokka.Utilities.impliedPlatformsName
import java.io.File
import java.nio.file.Path
-import java.nio.file.Paths
open class HtmlOutputBuilder(to: StringBuilder,
location: Location,
- locationService: LocationService,
+ generator: NodeLocationAwareGenerator,
languageService: LanguageService,
extension: String,
impliedPlatforms: List<String>,
val templateService: HtmlTemplateService)
- : StructuredOutputBuilder(to, location, locationService, languageService, extension, impliedPlatforms)
+ : StructuredOutputBuilder(to, location, generator, languageService, extension, impliedPlatforms)
{
override fun appendText(text: String) {
to.append(text.htmlEscape())
@@ -81,7 +80,7 @@ open class HtmlOutputBuilder(to: StringBuilder,
}
override fun appendNodes(nodes: Iterable<DocumentationNode>) {
- templateService.appendHeader(to, getPageTitle(nodes), locationService.calcPathToRoot(location))
+ templateService.appendHeader(to, getPageTitle(nodes), generator.relativeToRoot(location))
super.appendNodes(nodes)
templateService.appendFooter(to)
}
@@ -95,21 +94,21 @@ open class HtmlOutputBuilder(to: StringBuilder,
}
}
-open class HtmlFormatService @Inject constructor(@Named("folders") locationService: LocationService,
+open class HtmlFormatService @Inject constructor(generator: NodeLocationAwareGenerator,
signatureGenerator: LanguageService,
val templateService: HtmlTemplateService,
@Named(impliedPlatformsName) val impliedPlatforms: List<String>)
-: StructuredFormatService(locationService, signatureGenerator, "html"), OutlineFormatService {
+: StructuredFormatService(generator, signatureGenerator, "html"), OutlineFormatService {
override fun enumerateSupportFiles(callback: (String, String) -> Unit) {
callback("/dokka/styles/style.css", "style.css")
}
override fun createOutputBuilder(to: StringBuilder, location: Location) =
- HtmlOutputBuilder(to, location, locationService, languageService, extension, impliedPlatforms, templateService)
+ HtmlOutputBuilder(to, location, generator, languageService, extension, impliedPlatforms, templateService)
override fun appendOutline(location: Location, to: StringBuilder, nodes: Iterable<DocumentationNode>) {
- templateService.appendHeader(to, "Module Contents", locationService.calcPathToRoot(location))
+ templateService.appendHeader(to, "Module Contents", generator.relativeToRoot(location))
super.appendOutline(location, to, nodes)
templateService.appendFooter(to)
}
@@ -123,7 +122,7 @@ open class HtmlFormatService @Inject constructor(@Named("folders") locationServi
link.append(languageService.render(node, LanguageService.RenderMode.FULL))
val tempBuilder = StringBuilder()
createOutputBuilder(tempBuilder, location).appendContent(link)
- to.appendln("<a href=\"${location.path}\">${tempBuilder.toString()}</a><br/>")
+ to.appendln("<a href=\"${location.path}\">$tempBuilder</a><br/>")
}
override fun appendOutlineLevel(to: StringBuilder, body: () -> Unit) {
@@ -133,11 +132,6 @@ open class HtmlFormatService @Inject constructor(@Named("folders") locationServi
}
}
-private fun LocationService.calcPathToRoot(location: Location): Path {
- val path = Paths.get(location.path)
- return path.parent?.relativize(Paths.get(root.path + '/')) ?: path
-}
-
fun getPageTitle(nodes: Iterable<DocumentationNode>): String? {
val breakdownByLocation = nodes.groupBy { node -> formatPageTitle(node) }
return breakdownByLocation.keys.singleOrNull()
diff --git a/core/src/main/kotlin/Formats/HtmlTemplateService.kt b/core/src/main/kotlin/Formats/HtmlTemplateService.kt
index 010bc702..a65a7b18 100644
--- a/core/src/main/kotlin/Formats/HtmlTemplateService.kt
+++ b/core/src/main/kotlin/Formats/HtmlTemplateService.kt
@@ -1,9 +1,9 @@
package org.jetbrains.dokka
-import java.nio.file.Path
+import java.io.File
interface HtmlTemplateService {
- fun appendHeader(to: StringBuilder, title: String?, basePath: Path)
+ fun appendHeader(to: StringBuilder, title: String?, basePath: File)
fun appendFooter(to: StringBuilder)
companion object {
@@ -16,7 +16,7 @@ interface HtmlTemplateService {
to.appendln("</BODY>")
to.appendln("</HTML>")
}
- override fun appendHeader(to: StringBuilder, title: String?, basePath: Path) {
+ override fun appendHeader(to: StringBuilder, title: String?, basePath: File) {
to.appendln("<HTML>")
to.appendln("<HEAD>")
to.appendln("<meta charset=\"UTF-8\">")
@@ -24,7 +24,7 @@ interface HtmlTemplateService {
to.appendln("<title>$title</title>")
}
if (css != null) {
- val cssPath = basePath.resolve(css)
+ val cssPath = basePath.resolve(css).toUnixString()
to.appendln("<link rel=\"stylesheet\" href=\"$cssPath\">")
}
to.appendln("</HEAD>")
diff --git a/core/src/main/kotlin/Formats/JavaLayoutHtmlFormat.kt b/core/src/main/kotlin/Formats/JavaLayoutHtmlFormat.kt
new file mode 100644
index 00000000..f73cd23e
--- /dev/null
+++ b/core/src/main/kotlin/Formats/JavaLayoutHtmlFormat.kt
@@ -0,0 +1,92 @@
+package org.jetbrains.dokka.Formats
+
+import com.google.inject.Binder
+import com.google.inject.Inject
+import kotlinx.html.li
+import kotlinx.html.stream.appendHTML
+import kotlinx.html.ul
+import org.jetbrains.dokka.*
+import org.jetbrains.dokka.Kotlin.KotlinDescriptorSignatureProvider
+import org.jetbrains.dokka.Samples.DefaultSampleProcessingService
+import org.jetbrains.dokka.Utilities.bind
+import org.jetbrains.dokka.Utilities.toType
+import java.io.File
+
+
+class JavaLayoutHtmlFormatDescriptor : FormatDescriptor, DefaultAnalysisComponent {
+ override val packageDocumentationBuilderClass = KotlinPackageDocumentationBuilder::class
+ override val javaDocumentationBuilderClass = KotlinJavaDocumentationBuilder::class
+ override val sampleProcessingService = DefaultSampleProcessingService::class
+ override val descriptorSignatureProvider = KotlinDescriptorSignatureProvider::class
+
+ override fun configureOutput(binder: Binder): Unit = with(binder) {
+ bind<Generator>() toType generatorServiceClass
+ }
+
+ val formatServiceClass = JavaLayoutHtmlFormatService::class
+ val generatorServiceClass = JavaLayoutHtmlFormatGenerator::class
+}
+
+
+class JavaLayoutHtmlFormatService : FormatService {
+ override val extension: String
+ get() = TODO("not implemented")
+
+
+ override fun createOutputBuilder(to: StringBuilder, location: Location): FormattedOutputBuilder {
+ TODO("not implemented")
+ }
+}
+
+class JavaLayoutHtmlFormatOutputBuilder : FormattedOutputBuilder {
+ override fun appendNodes(nodes: Iterable<DocumentationNode>) {
+
+ }
+}
+
+
+class JavaLayoutHtmlFormatNavListBuilder @Inject constructor() : OutlineFormatService {
+ override fun getOutlineFileName(location: Location): File {
+ TODO()
+ }
+
+ override fun appendOutlineHeader(location: Location, node: DocumentationNode, to: StringBuilder) {
+ with(to.appendHTML()) {
+ //a(href = )
+ li {
+ when {
+ node.kind == NodeKind.Package -> appendOutline(location, to, node.members)
+ }
+ }
+ }
+ }
+
+ override fun appendOutlineLevel(to: StringBuilder, body: () -> Unit) {
+ with(to.appendHTML()) {
+ ul { body() }
+ }
+ }
+
+}
+
+class JavaLayoutHtmlFormatGenerator @Inject constructor(
+ private val outlineFormatService: OutlineFormatService
+) : Generator {
+ override fun buildPages(nodes: Iterable<DocumentationNode>) {
+
+ }
+
+ override fun buildOutlines(nodes: Iterable<DocumentationNode>) {
+ for (node in nodes) {
+ if (node.kind == NodeKind.Module) {
+ //outlineFormatService.formatOutline()
+ }
+ }
+ }
+
+ override fun buildSupportFiles() {}
+
+ override fun buildPackageList(nodes: Iterable<DocumentationNode>) {
+
+ }
+} \ No newline at end of file
diff --git a/core/src/main/kotlin/Formats/JekyllFormatService.kt b/core/src/main/kotlin/Formats/JekyllFormatService.kt
index 6b97bbe0..a948dfa9 100644
--- a/core/src/main/kotlin/Formats/JekyllFormatService.kt
+++ b/core/src/main/kotlin/Formats/JekyllFormatService.kt
@@ -6,12 +6,11 @@ import org.jetbrains.dokka.Utilities.impliedPlatformsName
open class JekyllOutputBuilder(to: StringBuilder,
location: Location,
- locationService: LocationService,
+ generator: NodeLocationAwareGenerator,
languageService: LanguageService,
extension: String,
impliedPlatforms: List<String>)
- : MarkdownOutputBuilder(to, location, locationService, languageService, extension, impliedPlatforms)
-{
+ : MarkdownOutputBuilder(to, location, generator, languageService, extension, impliedPlatforms) {
override fun appendNodes(nodes: Iterable<DocumentationNode>) {
to.appendln("---")
appendFrontMatter(nodes, to)
@@ -26,17 +25,20 @@ open class JekyllOutputBuilder(to: StringBuilder,
}
-open class JekyllFormatService(locationService: LocationService,
- signatureGenerator: LanguageService,
- linkExtension: String,
- impliedPlatforms: List<String>)
-: MarkdownFormatService(locationService, signatureGenerator, linkExtension, impliedPlatforms) {
+open class JekyllFormatService(
+ generator: NodeLocationAwareGenerator,
+ signatureGenerator: LanguageService,
+ linkExtension: String,
+ impliedPlatforms: List<String>
+) : MarkdownFormatService(generator, signatureGenerator, linkExtension, impliedPlatforms) {
- @Inject constructor(locationService: LocationService,
- signatureGenerator: LanguageService,
- @Named(impliedPlatformsName) impliedPlatforms: List<String>): this(locationService, signatureGenerator, "html", impliedPlatforms)
+ @Inject constructor(
+ generator: NodeLocationAwareGenerator,
+ signatureGenerator: LanguageService,
+ @Named(impliedPlatformsName) impliedPlatforms: List<String>
+ ) : this(generator, signatureGenerator, "html", impliedPlatforms)
override fun createOutputBuilder(to: StringBuilder, location: Location): FormattedOutputBuilder =
- JekyllOutputBuilder(to, location, locationService, languageService, extension, impliedPlatforms)
+ JekyllOutputBuilder(to, location, generator, languageService, extension, impliedPlatforms)
}
diff --git a/core/src/main/kotlin/Formats/KotlinWebsiteFormatService.kt b/core/src/main/kotlin/Formats/KotlinWebsiteFormatService.kt
index 08349980..a98002d4 100644
--- a/core/src/main/kotlin/Formats/KotlinWebsiteFormatService.kt
+++ b/core/src/main/kotlin/Formats/KotlinWebsiteFormatService.kt
@@ -6,14 +6,14 @@ import org.jetbrains.dokka.Utilities.impliedPlatformsName
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
-open class KotlinWebsiteOutputBuilder(to: StringBuilder,
- location: Location,
- locationService: LocationService,
- languageService: LanguageService,
- extension: String,
- impliedPlatforms: List<String>)
- : JekyllOutputBuilder(to, location, locationService, languageService, extension, impliedPlatforms)
-{
+open class KotlinWebsiteOutputBuilder(
+ to: StringBuilder,
+ location: Location,
+ generator: NodeLocationAwareGenerator,
+ languageService: LanguageService,
+ extension: String,
+ impliedPlatforms: List<String>
+) : JekyllOutputBuilder(to, location, generator, languageService, extension, impliedPlatforms) {
private var needHardLineBreaks = false
private var insideDiv = 0
@@ -70,8 +70,7 @@ open class KotlinWebsiteOutputBuilder(to: StringBuilder,
override fun appendHeader(level: Int, body: () -> Unit) {
if (insideDiv > 0) {
wrapInTag("p", body, newlineAfterClose = true)
- }
- else {
+ } else {
super.appendHeader(level, body)
}
}
@@ -79,8 +78,7 @@ open class KotlinWebsiteOutputBuilder(to: StringBuilder,
override fun appendLine() {
if (insideDiv > 0) {
to.appendln("<br/>")
- }
- else {
+ } else {
super.appendLine()
}
}
@@ -135,13 +133,14 @@ open class KotlinWebsiteOutputBuilder(to: StringBuilder,
to.append("<br/>")
}
+
override fun appendIndentedSoftLineBreak() {
if (needHardLineBreaks) {
to.append("<br/>&nbsp;&nbsp;&nbsp;&nbsp;")
}
}
- private fun identifierClassName(kind: IdentifierKind) = when(kind) {
+ private fun identifierClassName(kind: IdentifierKind) = when (kind) {
IdentifierKind.ParameterName -> "parameterName"
IdentifierKind.SummarizedTypeName -> "summarizedTypeName"
else -> "identifier"
@@ -172,28 +171,29 @@ open class KotlinWebsiteOutputBuilder(to: StringBuilder,
}
}
-class KotlinWebsiteFormatService @Inject constructor(locationService: LocationService,
- signatureGenerator: LanguageService,
- @Named(impliedPlatformsName) impliedPlatforms: List<String>,
- logger: DokkaLogger)
- : JekyllFormatService(locationService, signatureGenerator, "html", impliedPlatforms)
-{
+class KotlinWebsiteFormatService @Inject constructor(
+ generator: NodeLocationAwareGenerator,
+ signatureGenerator: LanguageService,
+ @Named(impliedPlatformsName) impliedPlatforms: List<String>,
+ logger: DokkaLogger
+) : JekyllFormatService(generator, signatureGenerator, "html", impliedPlatforms) {
init {
logger.warn("Format kotlin-website deprecated and will be removed in next release")
}
override fun createOutputBuilder(to: StringBuilder, location: Location) =
- KotlinWebsiteOutputBuilder(to, location, locationService, languageService, extension, impliedPlatforms)
+ KotlinWebsiteOutputBuilder(to, location, generator, languageService, extension, impliedPlatforms)
}
-class KotlinWebsiteRunnableSamplesOutputBuilder(to: StringBuilder,
- location: Location,
- locationService: LocationService,
- languageService: LanguageService,
- extension: String,
- impliedPlatforms: List<String>)
- : KotlinWebsiteOutputBuilder(to, location, locationService, languageService, extension, impliedPlatforms) {
+class KotlinWebsiteRunnableSamplesOutputBuilder(
+ to: StringBuilder,
+ location: Location,
+ generator: NodeLocationAwareGenerator,
+ languageService: LanguageService,
+ extension: String,
+ impliedPlatforms: List<String>
+) : KotlinWebsiteOutputBuilder(to, location, generator, languageService, extension, impliedPlatforms) {
override fun appendSampleBlockCode(language: String, imports: () -> Unit, body: () -> Unit) {
div(to, "sample", markdown = true) {
@@ -207,17 +207,18 @@ class KotlinWebsiteRunnableSamplesOutputBuilder(to: StringBuilder,
}
}
-class KotlinWebsiteRunnableSamplesFormatService @Inject constructor(locationService: LocationService,
- signatureGenerator: LanguageService,
- @Named(impliedPlatformsName) impliedPlatforms: List<String>,
- logger: DokkaLogger)
- : JekyllFormatService(locationService, signatureGenerator, "html", impliedPlatforms) {
+class KotlinWebsiteRunnableSamplesFormatService @Inject constructor(
+ generator: NodeLocationAwareGenerator,
+ signatureGenerator: LanguageService,
+ @Named(impliedPlatformsName) impliedPlatforms: List<String>,
+ logger: DokkaLogger
+) : JekyllFormatService(generator, signatureGenerator, "html", impliedPlatforms) {
init {
logger.warn("Format kotlin-website-samples deprecated and will be removed in next release")
}
override fun createOutputBuilder(to: StringBuilder, location: Location) =
- KotlinWebsiteRunnableSamplesOutputBuilder(to, location, locationService, languageService, extension, impliedPlatforms)
+ KotlinWebsiteRunnableSamplesOutputBuilder(to, location, generator, languageService, extension, impliedPlatforms)
}
diff --git a/core/src/main/kotlin/Formats/KotlinWebsiteHtmlFormatService.kt b/core/src/main/kotlin/Formats/KotlinWebsiteHtmlFormatService.kt
index 378401f3..6ced75b5 100644
--- a/core/src/main/kotlin/Formats/KotlinWebsiteHtmlFormatService.kt
+++ b/core/src/main/kotlin/Formats/KotlinWebsiteHtmlFormatService.kt
@@ -4,23 +4,25 @@ import com.google.inject.Inject
import com.google.inject.name.Named
import org.jetbrains.dokka.Utilities.impliedPlatformsName
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
-import java.nio.file.Path
+import java.io.File
-private object EmptyHtmlTemplateService : HtmlTemplateService {
+object EmptyHtmlTemplateService : HtmlTemplateService {
override fun appendFooter(to: StringBuilder) {}
- override fun appendHeader(to: StringBuilder, title: String?, basePath: Path) {}
+ override fun appendHeader(to: StringBuilder, title: String?, basePath: File) {}
}
-open class KotlinWebsiteHtmlOutputBuilder(to: StringBuilder,
- location: Location,
- locationService: LocationService,
- languageService: LanguageService,
- extension: String,
- impliedPlatforms: List<String>)
- : HtmlOutputBuilder(to, location, locationService, languageService, extension, impliedPlatforms, EmptyHtmlTemplateService) {
+open class KotlinWebsiteHtmlOutputBuilder(
+ to: StringBuilder,
+ location: Location,
+ generator: NodeLocationAwareGenerator,
+ languageService: LanguageService,
+ extension: String,
+ impliedPlatforms: List<String>,
+ templateService: HtmlTemplateService
+) : HtmlOutputBuilder(to, location, generator, languageService, extension, impliedPlatforms, templateService) {
private var needHardLineBreaks = false
private var insideDiv = 0
@@ -169,14 +171,16 @@ open class KotlinWebsiteHtmlOutputBuilder(to: StringBuilder,
}
}
-class KotlinWebsiteHtmlFormatService @Inject constructor(locationService: LocationService,
- signatureGenerator: LanguageService,
- @Named(impliedPlatformsName) impliedPlatforms: List<String>)
- : HtmlFormatService(locationService, signatureGenerator, EmptyHtmlTemplateService, impliedPlatforms) {
+class KotlinWebsiteHtmlFormatService @Inject constructor(
+ generator: NodeLocationAwareGenerator,
+ signatureGenerator: LanguageService,
+ @Named(impliedPlatformsName) impliedPlatforms: List<String>,
+ templateService: HtmlTemplateService
+) : HtmlFormatService(generator, signatureGenerator, templateService, impliedPlatforms) {
override fun enumerateSupportFiles(callback: (String, String) -> Unit) {}
override fun createOutputBuilder(to: StringBuilder, location: Location) =
- KotlinWebsiteHtmlOutputBuilder(to, location, locationService, languageService, extension, impliedPlatforms)
+ KotlinWebsiteHtmlOutputBuilder(to, location, generator, languageService, extension, impliedPlatforms, templateService)
}
diff --git a/core/src/main/kotlin/Formats/MarkdownFormatService.kt b/core/src/main/kotlin/Formats/MarkdownFormatService.kt
index a7c18a28..4265394f 100644
--- a/core/src/main/kotlin/Formats/MarkdownFormatService.kt
+++ b/core/src/main/kotlin/Formats/MarkdownFormatService.kt
@@ -21,11 +21,11 @@ private val TWO_LINE_BREAKS = System.lineSeparator() + System.lineSeparator()
open class MarkdownOutputBuilder(to: StringBuilder,
location: Location,
- locationService: LocationService,
+ generator: NodeLocationAwareGenerator,
languageService: LanguageService,
extension: String,
impliedPlatforms: List<String>)
- : StructuredOutputBuilder(to, location, locationService, languageService, extension, impliedPlatforms)
+ : StructuredOutputBuilder(to, location, generator, languageService, extension, impliedPlatforms)
{
private val listStack = ArrayDeque<ListState>()
protected var inTableCell = false
@@ -225,15 +225,15 @@ open class MarkdownOutputBuilder(to: StringBuilder,
}
}
-open class MarkdownFormatService(locationService: LocationService,
+open class MarkdownFormatService(generator: NodeLocationAwareGenerator,
signatureGenerator: LanguageService,
linkExtension: String,
val impliedPlatforms: List<String>)
-: StructuredFormatService(locationService, signatureGenerator, "md", linkExtension) {
- @Inject constructor(locationService: LocationService,
+: StructuredFormatService(generator, signatureGenerator, "md", linkExtension) {
+ @Inject constructor(generator: NodeLocationAwareGenerator,
signatureGenerator: LanguageService,
- @Named(impliedPlatformsName) impliedPlatforms: List<String>): this(locationService, signatureGenerator, "md", impliedPlatforms)
+ @Named(impliedPlatformsName) impliedPlatforms: List<String>): this(generator, signatureGenerator, "md", impliedPlatforms)
override fun createOutputBuilder(to: StringBuilder, location: Location): FormattedOutputBuilder =
- MarkdownOutputBuilder(to, location, locationService, languageService, extension, impliedPlatforms)
+ MarkdownOutputBuilder(to, location, generator, languageService, extension, impliedPlatforms)
}
diff --git a/core/src/main/kotlin/Formats/PackageListService.kt b/core/src/main/kotlin/Formats/PackageListService.kt
index e7f4e952..7b68098e 100644
--- a/core/src/main/kotlin/Formats/PackageListService.kt
+++ b/core/src/main/kotlin/Formats/PackageListService.kt
@@ -7,10 +7,10 @@ interface PackageListService {
fun formatPackageList(module: DocumentationModule): String
}
-class DefaultPackageListService @Inject constructor(locationService: FileLocationService,
- val formatService: FormatService) : PackageListService {
-
- val locationService: FileLocationService = locationService.withExtension(formatService.linkExtension)
+class DefaultPackageListService @Inject constructor(
+ val generator: NodeLocationAwareGenerator,
+ val formatService: FormatService
+) : PackageListService {
override fun formatPackageList(module: DocumentationModule): String {
val packages = mutableSetOf<String>()
@@ -26,7 +26,7 @@ class DefaultPackageListService @Inject constructor(locationService: FileLocatio
}
NodeKind.Signature -> {
if (relocated)
- nonStandardLocations[node.name] = locationService.relativePathToLocation(module, node.owner!!)
+ nonStandardLocations[node.name] = generator.relativePathToLocation(module, node.owner!!)
}
NodeKind.ExternalClass -> {
node.members.forEach { visit(it, relocated = true) }
diff --git a/core/src/main/kotlin/Formats/StandardFormats.kt b/core/src/main/kotlin/Formats/StandardFormats.kt
index f3d638c6..dd67ac97 100644
--- a/core/src/main/kotlin/Formats/StandardFormats.kt
+++ b/core/src/main/kotlin/Formats/StandardFormats.kt
@@ -1,41 +1,36 @@
package org.jetbrains.dokka.Formats
+import com.google.inject.Binder
import org.jetbrains.dokka.*
-import org.jetbrains.dokka.Kotlin.KotlinAsJavaDescriptorSignatureProvider
-import org.jetbrains.dokka.Kotlin.KotlinDescriptorSignatureProvider
-import org.jetbrains.dokka.Model.DescriptorSignatureProvider
-import org.jetbrains.dokka.Samples.DefaultSampleProcessingService
import org.jetbrains.dokka.Samples.KotlinWebsiteSampleProcessingService
-import org.jetbrains.dokka.Samples.SampleProcessingService
+import org.jetbrains.dokka.Utilities.bind
import kotlin.reflect.KClass
-abstract class KotlinFormatDescriptorBase : FormatDescriptor {
- override val packageDocumentationBuilderClass = KotlinPackageDocumentationBuilder::class
- override val javaDocumentationBuilderClass = KotlinJavaDocumentationBuilder::class
-
+abstract class KotlinFormatDescriptorBase
+ : FileGeneratorBasedFormatDescriptor(),
+ DefaultAnalysisComponent,
+ DefaultAnalysisComponentServices by KotlinAsKotlin {
override val generatorServiceClass = FileGenerator::class
override val outlineServiceClass: KClass<out OutlineFormatService>? = null
- override val sampleProcessingService: KClass<out SampleProcessingService> = DefaultSampleProcessingService::class
override val packageListServiceClass: KClass<out PackageListService>? = DefaultPackageListService::class
- override val descriptorSignatureProvider = KotlinDescriptorSignatureProvider::class
-}
-
-class HtmlFormatDescriptor : KotlinFormatDescriptorBase() {
- override val formatServiceClass = HtmlFormatService::class
- override val outlineServiceClass = HtmlFormatService::class
}
-class HtmlAsJavaFormatDescriptor : FormatDescriptor {
+abstract class HtmlFormatDescriptorBase : FileGeneratorBasedFormatDescriptor(), DefaultAnalysisComponent {
override val formatServiceClass = HtmlFormatService::class
override val outlineServiceClass = HtmlFormatService::class
override val generatorServiceClass = FileGenerator::class
- override val packageDocumentationBuilderClass = KotlinAsJavaDocumentationBuilder::class
- override val javaDocumentationBuilderClass = JavaPsiDocumentationBuilder::class
- override val sampleProcessingService: KClass<out SampleProcessingService> = DefaultSampleProcessingService::class
- override val packageListServiceClass: KClass<out PackageListService>? = DefaultPackageListService::class
- override val descriptorSignatureProvider = KotlinAsJavaDescriptorSignatureProvider::class
+ override val packageListServiceClass = DefaultPackageListService::class
+
+ override fun configureOutput(binder: Binder): Unit = with(binder) {
+ super.configureOutput(binder)
+ bind<HtmlTemplateService>().toProvider { HtmlTemplateService.default("style.css") }
+ }
}
+class HtmlFormatDescriptor : HtmlFormatDescriptorBase(), DefaultAnalysisComponentServices by KotlinAsKotlin
+
+class HtmlAsJavaFormatDescriptor : HtmlFormatDescriptorBase(), DefaultAnalysisComponentServices by KotlinAsJava
+
class KotlinWebsiteFormatDescriptor : KotlinFormatDescriptorBase() {
override val formatServiceClass = KotlinWebsiteFormatService::class
override val outlineServiceClass = YamlOutlineService::class
@@ -51,6 +46,11 @@ class KotlinWebsiteHtmlFormatDescriptor : KotlinFormatDescriptorBase() {
override val formatServiceClass = KotlinWebsiteHtmlFormatService::class
override val sampleProcessingService = KotlinWebsiteSampleProcessingService::class
override val outlineServiceClass = YamlOutlineService::class
+
+ override fun configureOutput(binder: Binder) = with(binder) {
+ super.configureOutput(binder)
+ bind<HtmlTemplateService>().toInstance(EmptyHtmlTemplateService)
+ }
}
class JekyllFormatDescriptor : KotlinFormatDescriptorBase() {
diff --git a/core/src/main/kotlin/Formats/StructuredFormatService.kt b/core/src/main/kotlin/Formats/StructuredFormatService.kt
index 5167a102..952e14cf 100644
--- a/core/src/main/kotlin/Formats/StructuredFormatService.kt
+++ b/core/src/main/kotlin/Formats/StructuredFormatService.kt
@@ -7,11 +7,13 @@ data class FormatLink(val text: String, val href: String)
abstract class StructuredOutputBuilder(val to: StringBuilder,
val location: Location,
- val locationService: LocationService,
+ val generator: NodeLocationAwareGenerator,
val languageService: LanguageService,
val extension: String,
val impliedPlatforms: List<String>) : FormattedOutputBuilder {
+ protected fun DocumentationNode.location() = generator.location(this)
+
protected fun wrap(prefix: String, suffix: String, body: () -> Unit) {
to.append(prefix)
body()
@@ -204,16 +206,16 @@ abstract class StructuredOutputBuilder(val to: StringBuilder,
if (from.owner?.kind == NodeKind.GroupNode)
return link(from.owner!!, to, extension, name)
- return FormatLink(name(to), locationService.relativePathToLocation(from, to))
+ return FormatLink(name(to), from.location().relativePathTo(to.location()))
}
fun locationHref(from: Location, to: DocumentationNode): String {
val topLevelPage = to.references(RefKind.TopLevelPage).singleOrNull()?.to
if (topLevelPage != null) {
val signature = to.detailOrNull(NodeKind.Signature)
- return from.relativePathTo(locationService.location(topLevelPage), signature?.name ?: to.name)
+ return from.relativePathTo(topLevelPage.location(), signature?.name ?: to.name)
}
- return from.relativePathTo(locationService.location(to))
+ return from.relativePathTo(to.location())
}
private fun DocumentationNode.isModuleOrPackage(): Boolean =
@@ -349,7 +351,8 @@ abstract class StructuredOutputBuilder(val to: StringBuilder,
overrides.forEach {
appendParagraph {
to.append("Overrides ")
- val location = locationService.relativePathToLocation(this, it)
+ val location = location().relativePathTo(it.location())
+
appendLink(FormatLink(it.owner!!.name + "." + it.name, location))
}
}
@@ -383,7 +386,7 @@ abstract class StructuredOutputBuilder(val to: StringBuilder,
else
platformsToShow
- if(platforms.isEmpty()) return
+ if (platforms.isEmpty()) return
appendParagraph {
appendStrong { to.append("Platform and version requirements:") }
@@ -674,9 +677,9 @@ abstract class StructuredOutputBuilder(val to: StringBuilder,
}
}
-abstract class StructuredFormatService(locationService: LocationService,
+abstract class StructuredFormatService(val generator: NodeLocationAwareGenerator,
val languageService: LanguageService,
override val extension: String,
override final val linkExtension: String = extension) : FormatService {
- val locationService: LocationService = locationService.withExtension(linkExtension)
+
}
diff --git a/core/src/main/kotlin/Formats/YamlOutlineService.kt b/core/src/main/kotlin/Formats/YamlOutlineService.kt
index 7968824c..c36f98eb 100644
--- a/core/src/main/kotlin/Formats/YamlOutlineService.kt
+++ b/core/src/main/kotlin/Formats/YamlOutlineService.kt
@@ -3,15 +3,17 @@ package org.jetbrains.dokka
import com.google.inject.Inject
import java.io.File
-class YamlOutlineService @Inject constructor(val locationService: LocationService,
- val languageService: LanguageService) : OutlineFormatService {
+class YamlOutlineService @Inject constructor(
+ val generator: NodeLocationAwareGenerator,
+ val languageService: LanguageService
+) : OutlineFormatService {
override fun getOutlineFileName(location: Location): File = File("${location.path}.yml")
var outlineLevel = 0
override fun appendOutlineHeader(location: Location, node: DocumentationNode, to: StringBuilder) {
val indent = " ".repeat(outlineLevel)
to.appendln("$indent- title: ${languageService.renderName(node)}")
- to.appendln("$indent url: ${locationService.location(node).path}")
+ to.appendln("$indent url: ${generator.location(node).path}")
}
override fun appendOutlineLevel(to: StringBuilder, body: () -> Unit) {
diff --git a/core/src/main/kotlin/Generation/ConsoleGenerator.kt b/core/src/main/kotlin/Generation/ConsoleGenerator.kt
deleted file mode 100644
index 301f86b9..00000000
--- a/core/src/main/kotlin/Generation/ConsoleGenerator.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.jetbrains.dokka
-
-class ConsoleGenerator(val signatureGenerator: LanguageService, val locationService: LocationService) {
- val IndentStep = " "
-
- fun generate(node: DocumentationNode, indent: String = "") {
- println("@${locationService.location(node).path}")
- generateHeader(node, indent)
- //generateDetails(node, indent)
- generateMembers(node, indent)
- generateLinks(node, indent)
- }
-
- fun generateHeader(node: DocumentationNode, indent: String = "") {
- println(indent + signatureGenerator.render(node))
- val docString = node.content.toString()
- if (!docString.isEmpty())
- println("$indent\"${docString.replace("\n", "\n$indent")}\"")
- println()
- }
-
- fun generateMembers(node: DocumentationNode, indent: String = "") {
- val items = node.members.sortedBy { it.name }
- for (child in items)
- generate(child, indent + IndentStep)
- }
-
- fun generateDetails(node: DocumentationNode, indent: String = "") {
- val items = node.details
- for (child in items)
- generate(child, indent + " ")
- }
-
- fun generateLinks(node: DocumentationNode, indent: String = "") {
- val items = node.links
- if (items.isEmpty())
- return
- println("$indent Links")
- for (child in items)
- generate(child, indent + " ")
- }
-} \ No newline at end of file
diff --git a/core/src/main/kotlin/Generation/FileGenerator.kt b/core/src/main/kotlin/Generation/FileGenerator.kt
index e055c537..bc08e180 100644
--- a/core/src/main/kotlin/Generation/FileGenerator.kt
+++ b/core/src/main/kotlin/Generation/FileGenerator.kt
@@ -1,28 +1,43 @@
package org.jetbrains.dokka
import com.google.inject.Inject
+import com.google.inject.name.Named
+import org.jetbrains.kotlin.utils.fileUtils.withReplacedExtensionOrNull
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.io.OutputStreamWriter
-class FileGenerator @Inject constructor(val locationService: FileLocationService) : Generator {
+class FileGenerator @Inject constructor(@Named("outputDir") val rootFile: File) : NodeLocationAwareGenerator {
@set:Inject(optional = true) var outlineService: OutlineFormatService? = null
@set:Inject(optional = true) lateinit var formatService: FormatService
@set:Inject(optional = true) lateinit var options: DocumentationOptions
@set:Inject(optional = true) var packageListService: PackageListService? = null
+ override val root: File = rootFile
+
+ override fun location(node: DocumentationNode): FileLocation {
+ return FileLocation(fileForNode(node, formatService.linkExtension))
+ }
+
+ private fun fileForNode(node: DocumentationNode, extension: String = ""): File {
+ return File(root, relativePathToNode(node)).appendExtension(extension)
+ }
+
+ fun locationWithoutExtension(node: DocumentationNode): FileLocation {
+ return FileLocation(fileForNode(node))
+ }
+
override fun buildPages(nodes: Iterable<DocumentationNode>) {
- val specificLocationService = locationService.withExtension(formatService.extension)
- for ((location, items) in nodes.groupBy { specificLocationService.location(it) }) {
- val file = location.file
+ for ((file, items) in nodes.groupBy { fileForNode(it, formatService.extension) }) {
+
file.parentFile?.mkdirsOrFail()
try {
FileOutputStream(file).use {
OutputStreamWriter(it, Charsets.UTF_8).use {
- it.write(formatService.format(location, items))
+ it.write(formatService.format(location(items.first()), items))
}
}
} catch (e: Throwable) {
@@ -34,7 +49,7 @@ class FileGenerator @Inject constructor(val locationService: FileLocationService
override fun buildOutlines(nodes: Iterable<DocumentationNode>) {
val outlineService = this.outlineService ?: return
- for ((location, items) in nodes.groupBy { locationService.location(it) }) {
+ for ((location, items) in nodes.groupBy { locationWithoutExtension(it) }) {
val file = outlineService.getOutlineFileName(location)
file.parentFile?.mkdirsOrFail()
FileOutputStream(file).use {
@@ -47,7 +62,7 @@ class FileGenerator @Inject constructor(val locationService: FileLocationService
override fun buildSupportFiles() {
formatService.enumerateSupportFiles { resource, targetPath ->
- FileOutputStream(locationService.location(listOf(targetPath), false).file).use {
+ FileOutputStream(File(root, relativePathToNode(listOf(targetPath), false))).use {
javaClass.getResourceAsStream(resource).copyTo(it)
}
}
@@ -58,7 +73,7 @@ class FileGenerator @Inject constructor(val locationService: FileLocationService
for (module in nodes) {
- val moduleRoot = locationService.location(module).file.parentFile
+ val moduleRoot = location(module).file.parentFile
val packageListFile = File(moduleRoot, "package-list")
packageListFile.writeText("\$dokka.format:${options.outputFormat}\n" +
diff --git a/core/src/main/kotlin/Generation/Generator.kt b/core/src/main/kotlin/Generation/Generator.kt
index 76a5f350..23286e29 100644
--- a/core/src/main/kotlin/Generation/Generator.kt
+++ b/core/src/main/kotlin/Generation/Generator.kt
@@ -1,5 +1,7 @@
package org.jetbrains.dokka
+import java.io.File
+
interface Generator {
fun buildPages(nodes: Iterable<DocumentationNode>)
fun buildOutlines(nodes: Iterable<DocumentationNode>)
@@ -19,3 +21,9 @@ fun Generator.buildPage(node: DocumentationNode): Unit = buildPages(listOf(node)
fun Generator.buildOutline(node: DocumentationNode): Unit = buildOutlines(listOf(node))
fun Generator.buildAll(node: DocumentationNode): Unit = buildAll(listOf(node))
+
+
+interface NodeLocationAwareGenerator: Generator {
+ fun location(node: DocumentationNode): Location
+ val root: File
+} \ No newline at end of file
diff --git a/core/src/main/kotlin/Locations/FoldersLocationService.kt b/core/src/main/kotlin/Locations/FoldersLocationService.kt
deleted file mode 100644
index 83e1cf6a..00000000
--- a/core/src/main/kotlin/Locations/FoldersLocationService.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.jetbrains.dokka
-
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import java.io.File
-
-class FoldersLocationService @Inject constructor(@Named("outputDir") val rootFile: File, val extension: String) : FileLocationService {
- constructor(root: String): this(File(root), "")
-
- override val root: Location
- get() = FileLocation(rootFile)
-
- override fun withExtension(newExtension: String): FileLocationService {
- return if (extension.isEmpty()) FoldersLocationService(rootFile, newExtension) else this
- }
-
- override fun location(qualifiedName: List<String>, hasMembers: Boolean): FileLocation {
- return FileLocation(File(rootFile, relativePathToNode(qualifiedName, hasMembers)).appendExtension(extension))
- }
-}
-
-fun relativePathToNode(qualifiedName: List<String>, hasMembers: Boolean): String {
- val parts = qualifiedName.map { identifierToFilename(it) }.filterNot { it.isEmpty() }
- return if (!hasMembers) {
- // leaf node, use file in owner's folder
- parts.joinToString("/")
- } else {
- parts.joinToString("/") + (if (parts.none()) "" else "/") + "index"
- }
-}
diff --git a/core/src/main/kotlin/Locations/Location.kt b/core/src/main/kotlin/Locations/Location.kt
new file mode 100644
index 00000000..0e6572d9
--- /dev/null
+++ b/core/src/main/kotlin/Locations/Location.kt
@@ -0,0 +1,61 @@
+package org.jetbrains.dokka
+
+import java.io.File
+
+interface Location {
+ val path: String get
+ fun relativePathTo(other: Location, anchor: String? = null): String
+}
+
+/**
+ * Represents locations in the documentation in the form of [path](File).
+ *
+ * $file: [File] for this location
+ * $path: [String] representing path of this location
+ */
+data class FileLocation(val file: File) : Location {
+ override val path: String
+ get() = file.path
+
+ override fun relativePathTo(other: Location, anchor: String?): String {
+ if (other !is FileLocation) {
+ throw IllegalArgumentException("$other is not a FileLocation")
+ }
+ if (file.path.substringBeforeLast(".") == other.file.path.substringBeforeLast(".") && anchor == null) {
+ return "./${file.name}"
+ }
+ val ownerFolder = file.parentFile!!
+ val relativePath = ownerFolder.toPath().relativize(other.file.toPath()).toString().replace(File.separatorChar, '/')
+ return if (anchor == null) relativePath else relativePath + "#" + anchor
+ }
+}
+
+fun relativePathToNode(qualifiedName: List<String>, hasMembers: Boolean): String {
+ val parts = qualifiedName.map { identifierToFilename(it) }.filterNot { it.isEmpty() }
+ return if (!hasMembers) {
+ // leaf node, use file in owner's folder
+ parts.joinToString("/")
+ } else {
+ parts.joinToString("/") + (if (parts.none()) "" else "/") + "index"
+ }
+}
+
+
+fun relativePathToNode(node: DocumentationNode) = relativePathToNode(node.path.map { it.name }, node.members.any())
+
+fun identifierToFilename(path: String): String {
+ val escaped = path.replace('<', '-').replace('>', '-')
+ val lowercase = escaped.replace("[A-Z]".toRegex()) { matchResult -> "-" + matchResult.value.toLowerCase() }
+ return if (lowercase == "index") "--index--" else lowercase
+}
+
+fun NodeLocationAwareGenerator.relativePathToLocation(owner: DocumentationNode, node: DocumentationNode): String {
+ return location(owner).relativePathTo(location(node), null)
+}
+
+fun NodeLocationAwareGenerator.relativeToRoot(from: Location): File {
+ val file = File(from.path)
+ return file.relativeTo(root)
+}
+
+fun File.toUnixString() = toString().replace(File.separatorChar, '/')
diff --git a/core/src/main/kotlin/Locations/LocationService.kt b/core/src/main/kotlin/Locations/LocationService.kt
deleted file mode 100644
index a51ef8d4..00000000
--- a/core/src/main/kotlin/Locations/LocationService.kt
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.jetbrains.dokka
-
-import java.io.File
-
-interface Location {
- val path: String get
- fun relativePathTo(other: Location, anchor: String? = null): String
-}
-
-/**
- * Represents locations in the documentation in the form of [path](File).
- *
- * Locations are provided by [LocationService.location] function.
- *
- * $file: [File] for this location
- * $path: [String] representing path of this location
- */
-data class FileLocation(val file: File): Location {
- override val path : String
- get() = file.path
-
- override fun relativePathTo(other: Location, anchor: String?): String {
- if (other !is FileLocation) {
- throw IllegalArgumentException("$other is not a FileLocation")
- }
- if (file.path.substringBeforeLast(".") == other.file.path.substringBeforeLast(".") && anchor == null) {
- return "./${file.name}"
- }
- val ownerFolder = file.parentFile!!
- val relativePath = ownerFolder.toPath().relativize(other.file.toPath()).toString().replace(File.separatorChar, '/')
- return if (anchor == null) relativePath else relativePath + "#" + anchor
- }
-}
-
-/**
- * Provides means of retrieving locations for [DocumentationNode](documentation nodes)
- *
- * `LocationService` determines where documentation for particular node should be generated
- *
- * * [FoldersLocationService] – represent packages and types as folders, members as files in those folders.
- * * [SingleFolderLocationService] – all documentation is generated into single folder using fully qualified names
- * for file names.
- */
-interface LocationService {
- fun withExtension(newExtension: String) = this
-
- fun location(node: DocumentationNode): Location = location(node.path.map { it.name }, node.members.any())
-
- /**
- * Calculates a location corresponding to the specified [qualifiedName].
- * @param hasMembers if true, the node for which the location is calculated has member nodes.
- */
- fun location(qualifiedName: List<String>, hasMembers: Boolean): Location
-
- val root: Location
-}
-
-
-interface FileLocationService: LocationService {
- override fun withExtension(newExtension: String): FileLocationService = this
-
- override fun location(node: DocumentationNode): FileLocation = location(node.path.map { it.name }, node.members.any())
- override fun location(qualifiedName: List<String>, hasMembers: Boolean): FileLocation
-}
-
-
-fun identifierToFilename(path: String): String {
- val escaped = path.replace('<', '-').replace('>', '-')
- val lowercase = escaped.replace("[A-Z]".toRegex()) { matchResult -> "-" + matchResult.value.toLowerCase() }
- return if (lowercase == "index") "--index--" else lowercase
-}
-
-/**
- * Returns relative location between two nodes. Used for relative links in documentation.
- */
-fun LocationService.relativePathToLocation(owner: DocumentationNode, node: DocumentationNode): String {
- return location(owner).relativePathTo(location(node), null)
-}
diff --git a/core/src/main/kotlin/Locations/SingleFolderLocationService.kt b/core/src/main/kotlin/Locations/SingleFolderLocationService.kt
deleted file mode 100644
index 1b4fdc28..00000000
--- a/core/src/main/kotlin/Locations/SingleFolderLocationService.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.jetbrains.dokka
-
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import java.io.File
-
-class SingleFolderLocationService @Inject constructor(@Named("outputDir") val rootFile: File, val extension: String) : FileLocationService {
- constructor(root: String): this(File(root), "")
-
- override fun withExtension(newExtension: String): FileLocationService =
- SingleFolderLocationService(rootFile, newExtension)
-
- override fun location(qualifiedName: List<String>, hasMembers: Boolean): FileLocation {
- val filename = qualifiedName.map { identifierToFilename(it) }.joinToString("-")
- return FileLocation(File(rootFile, filename).appendExtension(extension))
- }
-
- override val root: Location
- get() = FileLocation(rootFile)
-} \ No newline at end of file
diff --git a/core/src/main/kotlin/Utilities/DokkaModules.kt b/core/src/main/kotlin/Utilities/DokkaModules.kt
index dfb114ec..36704918 100644
--- a/core/src/main/kotlin/Utilities/DokkaModules.kt
+++ b/core/src/main/kotlin/Utilities/DokkaModules.kt
@@ -4,6 +4,7 @@ import com.google.inject.Binder
import com.google.inject.Module
import com.google.inject.Provider
import com.google.inject.TypeLiteral
+import com.google.inject.binder.AnnotatedBindingBuilder
import com.google.inject.name.Names
import org.jetbrains.dokka.*
import org.jetbrains.dokka.Formats.FormatDescriptor
@@ -11,6 +12,7 @@ import org.jetbrains.dokka.Model.DescriptorSignatureProvider
import org.jetbrains.dokka.Samples.SampleProcessingService
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import java.io.File
+import kotlin.reflect.KClass
const val impliedPlatformsName = "impliedPlatforms"
@@ -22,13 +24,6 @@ class DokkaAnalysisModule(val environment: AnalysisEnvironment,
override fun configure(binder: Binder) {
binder.bind<DokkaLogger>().toInstance(logger)
- val descriptor = ServiceLocator.lookup<FormatDescriptor>("format", options.outputFormat)
- binder.bind<DescriptorSignatureProvider>().to(descriptor.descriptorSignatureProvider.java)
- binder.registerCategory<LanguageService>("language")
- binder.bind<PackageDocumentationBuilder>().to(descriptor.packageDocumentationBuilderClass.java)
- binder.bind<JavaDocumentationBuilder>().to(descriptor.javaDocumentationBuilderClass.java)
- binder.bind<SampleProcessingService>().to(descriptor.sampleProcessingService.java)
-
val coreEnvironment = environment.createCoreEnvironment()
binder.bind<KotlinCoreEnvironment>().toInstance(coreEnvironment)
@@ -40,6 +35,9 @@ class DokkaAnalysisModule(val environment: AnalysisEnvironment,
binder.bind<DefaultPlatformsProvider>().toInstance(defaultPlatformsProvider)
binder.bind<NodeReferenceGraph>().toInstance(nodeReferenceGraph)
+
+ val descriptor = ServiceLocator.lookup<FormatDescriptor>("format", options.outputFormat)
+ descriptor.configureAnalysis(binder)
}
}
@@ -48,43 +46,15 @@ object StringListType : TypeLiteral<@JvmSuppressWildcards List<String>>()
class DokkaOutputModule(val options: DocumentationOptions,
val logger: DokkaLogger) : Module {
override fun configure(binder: Binder) {
- binder.bind(LanguageService::class.java).to(KotlinLanguageService::class.java)
-
- binder.bind(HtmlTemplateService::class.java).toProvider(object : Provider<HtmlTemplateService> {
- override fun get(): HtmlTemplateService = HtmlTemplateService.default("style.css")
- })
-
binder.bind(File::class.java).annotatedWith(Names.named("outputDir")).toInstance(File(options.outputDir))
- binder.bindNameAnnotated<LocationService, SingleFolderLocationService>("singleFolder")
- binder.bindNameAnnotated<FileLocationService, SingleFolderLocationService>("singleFolder")
- binder.bindNameAnnotated<LocationService, FoldersLocationService>("folders")
- binder.bindNameAnnotated<FileLocationService, FoldersLocationService>("folders")
-
- // defaults
- binder.bind(LocationService::class.java).to(FoldersLocationService::class.java)
- binder.bind(FileLocationService::class.java).to(FoldersLocationService::class.java)
-
- binder.registerCategory<OutlineFormatService>("outline")
- binder.registerCategory<FormatService>("format")
- binder.registerCategory<Generator>("generator")
-
- val descriptor = ServiceLocator.lookup<FormatDescriptor>("format", options.outputFormat)
-
- descriptor.outlineServiceClass?.let { clazz ->
- binder.bind(OutlineFormatService::class.java).to(clazz.java)
- }
- descriptor.formatServiceClass?.let { clazz ->
- binder.bind(FormatService::class.java).to(clazz.java)
- }
-
- binder.bind<Generator>().to(descriptor.generatorServiceClass.java)
-
- descriptor.packageListServiceClass?.let { binder.bind<PackageListService>().to(it.java) }
-
binder.bind<DocumentationOptions>().toInstance(options)
binder.bind<DokkaLogger>().toInstance(logger)
binder.bind(StringListType).annotatedWith(Names.named(impliedPlatformsName)).toInstance(options.impliedPlatforms)
+
+ val descriptor = ServiceLocator.lookup<FormatDescriptor>("format", options.outputFormat)
+
+ descriptor.configureOutput(binder)
}
}
@@ -100,4 +70,11 @@ private inline fun <reified Base : Any, reified T : Base> Binder.bindNameAnnotat
}
-inline fun <reified T: Any> Binder.bind() = bind(T::class.java)
+inline fun <reified T: Any> Binder.bind(): AnnotatedBindingBuilder<T> = bind(T::class.java)
+
+inline fun <reified T: Any> Binder.lazyBind(): Lazy<AnnotatedBindingBuilder<T>> = lazy { bind(T::class.java) }
+
+inline infix fun <reified T: Any, TKClass: KClass<out T>> Lazy<AnnotatedBindingBuilder<T>>.toOptional(kClass: TKClass?) =
+ kClass?.let { value toType it }
+
+inline infix fun <reified T: Any, TKClass: KClass<out T>> AnnotatedBindingBuilder<T>.toType(kClass: TKClass) = to(kClass.java)
diff --git a/core/src/main/kotlin/javadoc/dokka-adapters.kt b/core/src/main/kotlin/javadoc/dokka-adapters.kt
index c98a3801..4676db18 100644
--- a/core/src/main/kotlin/javadoc/dokka-adapters.kt
+++ b/core/src/main/kotlin/javadoc/dokka-adapters.kt
@@ -1,13 +1,12 @@
package org.jetbrains.dokka.javadoc
+import com.google.inject.Binder
import com.google.inject.Inject
import com.sun.tools.doclets.formats.html.HtmlDoclet
import org.jetbrains.dokka.*
-import org.jetbrains.dokka.Formats.FormatDescriptor
-import org.jetbrains.dokka.Kotlin.KotlinAsJavaDescriptorSignatureProvider
-import org.jetbrains.dokka.Model.DescriptorSignatureProvider
-import org.jetbrains.dokka.Samples.DefaultSampleProcessingService
-import kotlin.reflect.KClass
+import org.jetbrains.dokka.Formats.*
+import org.jetbrains.dokka.Utilities.bind
+import org.jetbrains.dokka.Utilities.toType
class JavadocGenerator @Inject constructor(val options: DocumentationOptions, val logger: DokkaLogger) : Generator {
@@ -30,13 +29,12 @@ class JavadocGenerator @Inject constructor(val options: DocumentationOptions, va
}
}
-class JavadocFormatDescriptor : FormatDescriptor {
- override val formatServiceClass = null
- override val outlineServiceClass = null
- override val generatorServiceClass = JavadocGenerator::class
- override val packageDocumentationBuilderClass = KotlinAsJavaDocumentationBuilder::class
- override val javaDocumentationBuilderClass = JavaPsiDocumentationBuilder::class
- override val sampleProcessingService = DefaultSampleProcessingService::class
- override val packageListServiceClass: KClass<out PackageListService>? = null
- override val descriptorSignatureProvider = KotlinAsJavaDescriptorSignatureProvider::class
+class JavadocFormatDescriptor :
+ FormatDescriptor,
+ DefaultAnalysisComponent,
+ DefaultAnalysisComponentServices by KotlinAsJava {
+
+ override fun configureOutput(binder: Binder): Unit = with(binder) {
+ bind<Generator>() toType JavadocGenerator::class
+ }
}
diff --git a/core/src/main/resources/dokka/format/java-layout-html.properties b/core/src/main/resources/dokka/format/java-layout-html.properties
new file mode 100644
index 00000000..fbb2bbed
--- /dev/null
+++ b/core/src/main/resources/dokka/format/java-layout-html.properties
@@ -0,0 +1,2 @@
+class=org.jetbrains.dokka.Formats.JavaLayoutHtmlFormatDescriptor
+description=Produces Kotlin Style Docs with Javadoc like layout \ No newline at end of file
diff --git a/core/src/main/resources/dokka/format/javadoc.properties b/core/src/main/resources/dokka/format/javadoc.properties
index a58317fc..a0d8a945 100644
--- a/core/src/main/resources/dokka/format/javadoc.properties
+++ b/core/src/main/resources/dokka/format/javadoc.properties
@@ -1 +1,2 @@
-class=org.jetbrains.dokka.javadoc.JavadocFormatDescriptor \ No newline at end of file
+class=org.jetbrains.dokka.javadoc.JavadocFormatDescriptor
+description=Produces Javadoc, with Kotlin declarations as Java view \ No newline at end of file
diff --git a/core/src/main/resources/dokka/generator/default.properties b/core/src/main/resources/dokka/generator/default.properties
deleted file mode 100644
index a4a16200..00000000
--- a/core/src/main/resources/dokka/generator/default.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-class=org.jetbrains.dokka.FileGenerator
-description=Default documentation generator \ No newline at end of file
diff --git a/core/src/main/resources/dokka/generator/javadoc.properties b/core/src/main/resources/dokka/generator/javadoc.properties
deleted file mode 100644
index 4075704f..00000000
--- a/core/src/main/resources/dokka/generator/javadoc.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-class=org.jetbrains.dokka.javadoc.JavadocGenerator
-description=Produces output via JDK javadoc tool \ No newline at end of file
diff --git a/core/src/main/resources/dokka/language/java.properties b/core/src/main/resources/dokka/language/java.properties
deleted file mode 100644
index ab42f532..00000000
--- a/core/src/main/resources/dokka/language/java.properties
+++ /dev/null
@@ -1 +0,0 @@
-class=org.jetbrains.dokka.JavaLanguageService \ No newline at end of file
diff --git a/core/src/main/resources/dokka/language/kotlin.properties b/core/src/main/resources/dokka/language/kotlin.properties
deleted file mode 100644
index 16092007..00000000
--- a/core/src/main/resources/dokka/language/kotlin.properties
+++ /dev/null
@@ -1 +0,0 @@
-class=org.jetbrains.dokka.KotlinLanguageService \ No newline at end of file
diff --git a/core/src/main/resources/dokka/outline/yaml.properties b/core/src/main/resources/dokka/outline/yaml.properties
deleted file mode 100644
index 7268af37..00000000
--- a/core/src/main/resources/dokka/outline/yaml.properties
+++ /dev/null
@@ -1 +0,0 @@
-class=org.jetbrains.dokka.YamlOutlineService \ No newline at end of file
diff --git a/core/src/test/kotlin/TestAPI.kt b/core/src/test/kotlin/TestAPI.kt
index ff8a5260..aa3eff48 100644
--- a/core/src/test/kotlin/TestAPI.kt
+++ b/core/src/test/kotlin/TestAPI.kt
@@ -270,21 +270,6 @@ fun ContentNode.toTestString(): String {
}.toString()
}
-class InMemoryLocation(override val path: String): Location {
- override fun relativePathTo(other: Location, anchor: String?): String =
- if (anchor != null) other.path + "#" + anchor else other.path
-}
-
-object InMemoryLocationService: LocationService {
- override fun location(qualifiedName: List<String>, hasMembers: Boolean) =
- InMemoryLocation(relativePathToNode(qualifiedName, hasMembers))
-
- override val root: Location
- get() = InMemoryLocation("")
-}
-
-val tempLocation = InMemoryLocation("")
-
val ContentRoot.path: String
get() = when(this) {
is KotlinSourceRoot -> path
diff --git a/core/src/test/kotlin/format/FileGeneratorTestCase.kt b/core/src/test/kotlin/format/FileGeneratorTestCase.kt
new file mode 100644
index 00000000..948426ea
--- /dev/null
+++ b/core/src/test/kotlin/format/FileGeneratorTestCase.kt
@@ -0,0 +1,35 @@
+package org.jetbrains.dokka.tests
+
+import org.jetbrains.dokka.*
+import org.junit.Before
+import org.junit.Rule
+import org.junit.rules.TemporaryFolder
+
+
+abstract class FileGeneratorTestCase {
+ abstract val formatService: FormatService
+
+ @get:Rule
+ var folder = TemporaryFolder()
+
+ val fileGenerator = FileGenerator(folder.apply { create() }.root)
+
+ @Before
+ fun bindGenerator() {
+ fileGenerator.formatService = formatService
+ }
+
+ fun buildPagesAndReadInto(nodes: List<DocumentationNode>, sb: StringBuilder) = with(fileGenerator) {
+ buildPages(nodes)
+ val byLocations = nodes.groupBy { location(it) }
+ byLocations.forEach { (loc, _) ->
+ if (byLocations.size > 1) {
+ if (sb.isNotBlank() && !sb.endsWith('\n')) {
+ sb.appendln()
+ }
+ sb.appendln("<!-- File: ${relativeToRoot(loc).toUnixString()} -->")
+ }
+ sb.append(loc.file.readText())
+ }
+ }
+} \ No newline at end of file
diff --git a/core/src/test/kotlin/format/GFMFormatTest.kt b/core/src/test/kotlin/format/GFMFormatTest.kt
index c097c5c8..b90ab2bf 100644
--- a/core/src/test/kotlin/format/GFMFormatTest.kt
+++ b/core/src/test/kotlin/format/GFMFormatTest.kt
@@ -4,20 +4,25 @@ import org.jetbrains.dokka.GFMFormatService
import org.jetbrains.dokka.KotlinLanguageService
import org.junit.Test
-class GFMFormatTest {
- private val gfmService = GFMFormatService(InMemoryLocationService, KotlinLanguageService(), listOf())
+class GFMFormatTest : FileGeneratorTestCase() {
+ override val formatService = GFMFormatService(fileGenerator, KotlinLanguageService(), listOf())
- @Test fun sample() {
+ @Test
+ fun sample() {
verifyGFMNodeByName("sample", "Foo")
}
- @Test fun listInTableCell() {
+ @Test
+ fun listInTableCell() {
verifyGFMNodeByName("listInTableCell", "Foo")
}
private fun verifyGFMNodeByName(fileName: String, name: String) {
verifyOutput("testdata/format/gfm/$fileName.kt", ".md") { model, output ->
- gfmService.createOutputBuilder(output, tempLocation).appendNodes(model.members.single().members.filter { it.name == name })
+ buildPagesAndReadInto(
+ model.members.single().members.filter { it.name == name },
+ output
+ )
}
}
}
diff --git a/core/src/test/kotlin/format/HtmlFormatTest.kt b/core/src/test/kotlin/format/HtmlFormatTest.kt
index 01e4559e..54c367fd 100644
--- a/core/src/test/kotlin/format/HtmlFormatTest.kt
+++ b/core/src/test/kotlin/format/HtmlFormatTest.kt
@@ -3,11 +3,12 @@ package org.jetbrains.dokka.tests
import org.jetbrains.dokka.*
import org.jetbrains.kotlin.cli.jvm.config.JavaSourceRoot
import org.jetbrains.kotlin.config.KotlinSourceRoot
+import org.junit.Before
import org.junit.Test
import java.io.File
-class HtmlFormatTest {
- private val htmlService = HtmlFormatService(InMemoryLocationService, KotlinLanguageService(), HtmlTemplateService.default(), listOf())
+class HtmlFormatTest: FileGeneratorTestCase() {
+ override val formatService = HtmlFormatService(fileGenerator, KotlinLanguageService(), HtmlTemplateService.default(), listOf())
@Test fun classWithCompanionObject() {
verifyHtmlNode("classWithCompanionObject")
@@ -31,10 +32,10 @@ class HtmlFormatTest {
@Test fun deprecated() {
verifyOutput("testdata/format/deprecated.kt", ".package.html") { model, output ->
- htmlService.createOutputBuilder(output, tempLocation).appendNodes(model.members)
+ buildPagesAndReadInto(model.members, output)
}
verifyOutput("testdata/format/deprecated.kt", ".class.html") { model, output ->
- htmlService.createOutputBuilder(output, tempLocation).appendNodes(model.members.single().members)
+ buildPagesAndReadInto(model.members.single().members, output)
}
}
@@ -102,7 +103,10 @@ class HtmlFormatTest {
verifyOutput(arrayOf(KotlinSourceRoot("testdata/format/crossLanguage/kotlinExtendsJava/Bar.kt"),
JavaSourceRoot(File("testdata/format/crossLanguage/kotlinExtendsJava"), null)),
".html") { model, output ->
- htmlService.createOutputBuilder(output, tempLocation).appendNodes(model.members.single().members.filter { it.name == "Bar" })
+ buildPagesAndReadInto(
+ model.members.single().members.filter { it.name == "Bar" },
+ output
+ )
}
}
@@ -158,7 +162,7 @@ class HtmlFormatTest {
withKotlinRuntime: Boolean = false,
nodeFilter: (DocumentationModule) -> List<DocumentationNode>) {
verifyOutput("testdata/format/$fileName.kt", ".html", withKotlinRuntime = withKotlinRuntime) { model, output ->
- htmlService.createOutputBuilder(output, tempLocation).appendNodes(nodeFilter(model))
+ buildPagesAndReadInto(nodeFilter(model), output)
}
}
@@ -170,7 +174,7 @@ class HtmlFormatTest {
withKotlinRuntime: Boolean = false,
nodeFilter: (DocumentationModule) -> List<DocumentationNode>) {
verifyJavaOutput("testdata/format/$fileName.java", ".html", withKotlinRuntime = withKotlinRuntime) { model, output ->
- htmlService.createOutputBuilder(output, tempLocation).appendNodes(nodeFilter(model))
+ buildPagesAndReadInto(nodeFilter(model), output)
}
}
}
diff --git a/core/src/test/kotlin/format/KotlinWebSiteFormatTest.kt b/core/src/test/kotlin/format/KotlinWebSiteFormatTest.kt
index af44b048..b971b54d 100644
--- a/core/src/test/kotlin/format/KotlinWebSiteFormatTest.kt
+++ b/core/src/test/kotlin/format/KotlinWebSiteFormatTest.kt
@@ -1,12 +1,13 @@
package org.jetbrains.dokka.tests
import org.jetbrains.dokka.*
+import org.junit.Before
import org.junit.Ignore
import org.junit.Test
@Ignore
-class KotlinWebSiteFormatTest {
- private val kwsService = KotlinWebsiteFormatService(InMemoryLocationService, KotlinLanguageService(), listOf(), DokkaConsoleLogger)
+class KotlinWebSiteFormatTest: FileGeneratorTestCase() {
+ override val formatService = KotlinWebsiteFormatService(fileGenerator, KotlinLanguageService(), listOf(), DokkaConsoleLogger)
@Test fun sample() {
verifyKWSNodeByName("sample", "foo")
@@ -29,14 +30,20 @@ class KotlinWebSiteFormatTest {
val path = "dataTagsInGroupNode"
val module = buildMultiplePlatforms(path)
verifyModelOutput(module, ".md", "testdata/format/website/$path/multiplatform.kt") { model, output ->
- kwsService.createOutputBuilder(output, tempLocation).appendNodes(listOfNotNull(model.members.single().members.find { it.kind == NodeKind.GroupNode }))
+ buildPagesAndReadInto(
+ listOfNotNull(model.members.single().members.find { it.kind == NodeKind.GroupNode }),
+ output
+ )
}
verifyMultiplatformPackage(module, path)
}
private fun verifyKWSNodeByName(fileName: String, name: String) {
verifyOutput("testdata/format/website/$fileName.kt", ".md", format = "kotlin-website") { model, output ->
- kwsService.createOutputBuilder(output, tempLocation).appendNodes(model.members.single().members.filter { it.name == name })
+ buildPagesAndReadInto(
+ model.members.single().members.filter { it.name == name },
+ output
+ )
}
}
@@ -58,7 +65,7 @@ class KotlinWebSiteFormatTest {
private fun verifyMultiplatformPackage(module: DocumentationModule, path: String) {
verifyModelOutput(module, ".package.md", "testdata/format/website/$path/multiplatform.kt") { model, output ->
- kwsService.createOutputBuilder(output, tempLocation).appendNodes(model.members)
+ buildPagesAndReadInto(model.members, output)
}
}
diff --git a/core/src/test/kotlin/format/KotlinWebSiteHtmlFormatTest.kt b/core/src/test/kotlin/format/KotlinWebSiteHtmlFormatTest.kt
index 433c9c13..49fa6d2f 100644
--- a/core/src/test/kotlin/format/KotlinWebSiteHtmlFormatTest.kt
+++ b/core/src/test/kotlin/format/KotlinWebSiteHtmlFormatTest.kt
@@ -1,11 +1,11 @@
package org.jetbrains.dokka.tests
import org.jetbrains.dokka.*
+import org.junit.Before
import org.junit.Test
-class KotlinWebSiteHtmlFormatTest {
- private val kwsService = KotlinWebsiteHtmlFormatService(InMemoryLocationService, KotlinLanguageService(), listOf())
-
+class KotlinWebSiteHtmlFormatTest: FileGeneratorTestCase() {
+ override val formatService = KotlinWebsiteHtmlFormatService(fileGenerator, KotlinLanguageService(), listOf(), EmptyHtmlTemplateService)
@Test fun dropImport() {
verifyKWSNodeByName("dropImport", "foo")
@@ -44,14 +44,17 @@ class KotlinWebSiteHtmlFormatTest {
val path = "dataTagsInGroupNode"
val module = buildMultiplePlatforms(path)
verifyModelOutput(module, ".html", "testdata/format/website-html/$path/multiplatform.kt") { model, output ->
- kwsService.createOutputBuilder(output, tempLocation).appendNodes(listOfNotNull(model.members.single().members.find { it.kind == NodeKind.GroupNode }))
+ buildPagesAndReadInto(
+ listOfNotNull(model.members.single().members.find { it.kind == NodeKind.GroupNode }),
+ output
+ )
}
verifyMultiplatformPackage(module, path)
}
private fun verifyKWSNodeByName(fileName: String, name: String) {
verifyOutput("testdata/format/website-html/$fileName.kt", ".html", format = "kotlin-website-html") { model, output ->
- kwsService.createOutputBuilder(output, tempLocation).appendNodes(model.members.single().members.filter { it.name == name })
+ buildPagesAndReadInto(model.members.single().members.filter { it.name == name }, output)
}
}
@@ -73,7 +76,7 @@ class KotlinWebSiteHtmlFormatTest {
private fun verifyMultiplatformPackage(module: DocumentationModule, path: String) {
verifyModelOutput(module, ".package.html", "testdata/format/website-html/$path/multiplatform.kt") { model, output ->
- kwsService.createOutputBuilder(output, tempLocation).appendNodes(model.members)
+ buildPagesAndReadInto(model.members, output)
}
}
diff --git a/core/src/test/kotlin/format/KotlinWebSiteRunnableSamplesFormatTest.kt b/core/src/test/kotlin/format/KotlinWebSiteRunnableSamplesFormatTest.kt
index 44155004..453b1de8 100644
--- a/core/src/test/kotlin/format/KotlinWebSiteRunnableSamplesFormatTest.kt
+++ b/core/src/test/kotlin/format/KotlinWebSiteRunnableSamplesFormatTest.kt
@@ -8,32 +8,32 @@ import org.junit.Test
@Ignore
class KotlinWebSiteRunnableSamplesFormatTest {
- private val kwsService = KotlinWebsiteRunnableSamplesFormatService(InMemoryLocationService, KotlinLanguageService(), listOf(), DokkaConsoleLogger)
-
-
- @Test fun dropImport() {
- verifyKWSNodeByName("dropImport", "foo")
- }
-
- @Test fun sample() {
- verifyKWSNodeByName("sample", "foo")
- }
-
- @Test fun sampleWithAsserts() {
- verifyKWSNodeByName("sampleWithAsserts", "a")
- }
-
- @Test fun newLinesInSamples() {
- verifyKWSNodeByName("newLinesInSamples", "foo")
- }
-
- @Test fun newLinesInImportList() {
- verifyKWSNodeByName("newLinesInImportList", "foo")
- }
-
- private fun verifyKWSNodeByName(fileName: String, name: String) {
- verifyOutput("testdata/format/website-samples/$fileName.kt", ".md", format = "kotlin-website-samples") { model, output ->
- kwsService.createOutputBuilder(output, tempLocation).appendNodes(model.members.single().members.filter { it.name == name })
- }
- }
+// private val kwsService = KotlinWebsiteRunnableSamplesFormatService(InMemoryLocationService, KotlinLanguageService(), listOf(), DokkaConsoleLogger)
+//
+//
+// @Test fun dropImport() {
+// verifyKWSNodeByName("dropImport", "foo")
+// }
+//
+// @Test fun sample() {
+// verifyKWSNodeByName("sample", "foo")
+// }
+//
+// @Test fun sampleWithAsserts() {
+// verifyKWSNodeByName("sampleWithAsserts", "a")
+// }
+//
+// @Test fun newLinesInSamples() {
+// verifyKWSNodeByName("newLinesInSamples", "foo")
+// }
+//
+// @Test fun newLinesInImportList() {
+// verifyKWSNodeByName("newLinesInImportList", "foo")
+// }
+//
+// private fun verifyKWSNodeByName(fileName: String, name: String) {
+// verifyOutput("testdata/format/website-samples/$fileName.kt", ".md", format = "kotlin-website-samples") { model, output ->
+// kwsService.createOutputBuilder(output, tempLocation).appendNodes(model.members.single().members.filter { it.name == name })
+// }
+// }
}
diff --git a/core/src/test/kotlin/format/MarkdownFormatTest.kt b/core/src/test/kotlin/format/MarkdownFormatTest.kt
index 820af361..f60969fc 100644
--- a/core/src/test/kotlin/format/MarkdownFormatTest.kt
+++ b/core/src/test/kotlin/format/MarkdownFormatTest.kt
@@ -1,10 +1,11 @@
package org.jetbrains.dokka.tests
import org.jetbrains.dokka.*
+import org.junit.Before
import org.junit.Test
-class MarkdownFormatTest {
- private val markdownService = MarkdownFormatService(InMemoryLocationService, KotlinLanguageService(), listOf())
+class MarkdownFormatTest: FileGeneratorTestCase() {
+ override val formatService = MarkdownFormatService(fileGenerator, KotlinLanguageService(), listOf())
@Test fun emptyDescription() {
verifyMarkdownNode("emptyDescription")
@@ -34,21 +35,23 @@ class MarkdownFormatTest {
@Test fun extensions() {
verifyOutput("testdata/format/extensions.kt", ".package.md") { model, output ->
- markdownService.createOutputBuilder(output, tempLocation).appendNodes(model.members)
+ buildPagesAndReadInto(model.members, output)
}
verifyOutput("testdata/format/extensions.kt", ".class.md") { model, output ->
- markdownService.createOutputBuilder(output, tempLocation).appendNodes(model.members.single().members)
+ buildPagesAndReadInto(model.members.single().members, output)
}
}
@Test fun enumClass() {
verifyOutput("testdata/format/enumClass.kt", ".md") { model, output ->
- markdownService.createOutputBuilder(output, tempLocation).appendNodes(model.members.single().members)
+ buildPagesAndReadInto(model.members.single().members, output)
}
verifyOutput("testdata/format/enumClass.kt", ".value.md") { model, output ->
val enumClassNode = model.members.single().members[0]
- markdownService.createOutputBuilder(output, tempLocation).appendNodes(
- enumClassNode.members.filter { it.name == "LOCAL_CONTINUE_AND_BREAK" })
+ buildPagesAndReadInto(
+ enumClassNode.members.filter { it.name == "LOCAL_CONTINUE_AND_BREAK" },
+ output
+ )
}
}
@@ -282,22 +285,23 @@ class MarkdownFormatTest {
@Test fun multiplePlatformsMergeMembers() {
val module = buildMultiplePlatforms("multiplatform/mergeMembers")
verifyModelOutput(module, ".md", "testdata/format/multiplatform/mergeMembers/foo.kt") { model, output ->
- markdownService.createOutputBuilder(output, tempLocation).appendNodes(model.members.single().members)
+ buildPagesAndReadInto(model.members.single().members, output)
}
}
@Test fun multiplePlatformsOmitRedundant() {
val module = buildMultiplePlatforms("multiplatform/omitRedundant")
verifyModelOutput(module, ".md", "testdata/format/multiplatform/omitRedundant/foo.kt") { model, output ->
- markdownService.createOutputBuilder(output, tempLocation).appendNodes(model.members.single().members)
+ buildPagesAndReadInto(model.members.single().members, output)
}
}
@Test fun multiplePlatformsImplied() {
val module = buildMultiplePlatforms("multiplatform/implied")
verifyModelOutput(module, ".md", "testdata/format/multiplatform/implied/foo.kt") { model, output ->
- MarkdownFormatService(InMemoryLocationService, KotlinLanguageService(), listOf("JVM", "JS"))
- .createOutputBuilder(output, tempLocation).appendNodes(model.members.single().members)
+ val service = MarkdownFormatService(fileGenerator, KotlinLanguageService(), listOf("JVM", "JS"))
+ fileGenerator.formatService = service
+ buildPagesAndReadInto(model.members.single().members, output)
}
}
@@ -328,8 +332,10 @@ class MarkdownFormatTest {
val path = "multiplatform/groupNode"
val module = buildMultiplePlatforms(path)
verifyModelOutput(module, ".md", "testdata/format/$path/multiplatform.kt") { model, output ->
- markdownService.createOutputBuilder(output, tempLocation)
- .appendNodes(listOfNotNull(model.members.single().members.find { it.kind == NodeKind.GroupNode }))
+ buildPagesAndReadInto(
+ listOfNotNull(model.members.single().members.find { it.kind == NodeKind.GroupNode }),
+ output
+ )
}
verifyMultiplatformPackage(module, path)
}
@@ -338,8 +344,10 @@ class MarkdownFormatTest {
val path = "multiplatform/breadcrumbsInMemberOfMemberOfGroupNode"
val module = buildMultiplePlatforms(path)
verifyModelOutput(module, ".md", "testdata/format/$path/multiplatform.kt") { model, output ->
- markdownService.createOutputBuilder(output, tempLocation)
- .appendNodes(listOfNotNull(model.members.single().members.find { it.kind == NodeKind.GroupNode }?.member(NodeKind.Class)?.member(NodeKind.Function)))
+ buildPagesAndReadInto(
+ listOfNotNull(model.members.single().members.find { it.kind == NodeKind.GroupNode }?.member(NodeKind.Class)?.member(NodeKind.Function)),
+ output
+ )
}
}
@@ -428,15 +436,16 @@ class MarkdownFormatTest {
private fun verifyMultiplatformPackage(module: DocumentationModule, path: String) {
verifyModelOutput(module, ".package.md", "testdata/format/$path/multiplatform.kt") { model, output ->
- markdownService.createOutputBuilder(output, tempLocation).appendNodes(model.members)
+ buildPagesAndReadInto(model.members, output)
}
}
private fun verifyMultiplatformIndex(module: DocumentationModule, path: String) {
verifyModelOutput(module, ".md", "testdata/format/$path/multiplatform.index.kt") {
model, output ->
- MarkdownFormatService(InMemoryLocationService, KotlinLanguageService(), listOf())
- .createOutputBuilder(output, tempLocation).appendNodes(listOf(model))
+ val service = MarkdownFormatService(fileGenerator, KotlinLanguageService(), listOf())
+ fileGenerator.formatService = service
+ buildPagesAndReadInto(listOf(model), output)
}
}
@@ -446,7 +455,7 @@ class MarkdownFormatTest {
private fun verifyMarkdownPackage(fileName: String, withKotlinRuntime: Boolean = false) {
verifyOutput("testdata/format/$fileName.kt", ".package.md", withKotlinRuntime = withKotlinRuntime) { model, output ->
- markdownService.createOutputBuilder(output, tempLocation).appendNodes(model.members)
+ buildPagesAndReadInto(model.members, output)
}
}
@@ -466,7 +475,7 @@ class MarkdownFormatTest {
withKotlinRuntime = withKotlinRuntime,
includeNonPublic = includeNonPublic
) { model, output ->
- markdownService.createOutputBuilder(output, tempLocation).appendNodes(nodeFilter(model))
+ buildPagesAndReadInto(nodeFilter(model), output)
}
}
@@ -476,7 +485,7 @@ class MarkdownFormatTest {
private fun verifyJavaMarkdownNodes(fileName: String, withKotlinRuntime: Boolean = false, nodeFilter: (DocumentationModule) -> List<DocumentationNode>) {
verifyJavaOutput("testdata/format/$fileName.java", ".md", withKotlinRuntime = withKotlinRuntime) { model, output ->
- markdownService.createOutputBuilder(output, tempLocation).appendNodes(nodeFilter(model))
+ buildPagesAndReadInto(nodeFilter(model), output)
}
}
diff --git a/core/src/test/kotlin/format/PackageDocsTest.kt b/core/src/test/kotlin/format/PackageDocsTest.kt
index a5547025..704f7b99 100644
--- a/core/src/test/kotlin/format/PackageDocsTest.kt
+++ b/core/src/test/kotlin/format/PackageDocsTest.kt
@@ -5,14 +5,13 @@ import com.nhaarman.mockito_kotlin.doAnswer
import com.nhaarman.mockito_kotlin.eq
import com.nhaarman.mockito_kotlin.mock
import org.jetbrains.dokka.*
-import org.jetbrains.dokka.tests.InMemoryLocationService
import org.jetbrains.dokka.tests.assertEqualsIgnoringSeparators
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.junit.Assert.assertEquals
import org.junit.Test
import java.io.File
-public class PackageDocsTest {
+class PackageDocsTest {
@Test fun verifyParse() {
val docs = PackageDocs(null, DokkaConsoleLogger)
docs.parse("testdata/packagedocs/stdlib.md", emptyList())
@@ -37,8 +36,17 @@ public class PackageDocsTest {
fun checkMarkdownOutput(docs: PackageDocs, expectedFilePrefix: String) {
+ val generator = FileGenerator(File(""))
+
val out = StringBuilder()
- val outputBuilder = MarkdownOutputBuilder(out, InMemoryLocationService.root, InMemoryLocationService, KotlinLanguageService(), ".md", emptyList())
+ val outputBuilder = MarkdownOutputBuilder(
+ out,
+ FileLocation(generator.root),
+ generator,
+ KotlinLanguageService(),
+ ".md",
+ emptyList()
+ )
fun checkOutput(content: Content, filePostfix: String) {
outputBuilder.appendContent(content)
val expectedFile = File(expectedFilePrefix + filePostfix)
diff --git a/core/testdata/format/JavaSupertype.html b/core/testdata/format/JavaSupertype.html
index 3e5e273a..27b8e5d0 100644
--- a/core/testdata/format/JavaSupertype.html
+++ b/core/testdata/format/JavaSupertype.html
@@ -4,16 +4,16 @@
<title>JavaSupertype.Bar - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-java-supertype/index">JavaSupertype</a>&nbsp;/&nbsp;<a href="test/-java-supertype/-bar/index">Bar</a><br/>
+<a href="../../index.html">test</a>&nbsp;/&nbsp;<a href="../index.html">JavaSupertype</a>&nbsp;/&nbsp;<a href="./index.html">Bar</a><br/>
<br/>
<h1>Bar</h1>
-<code><span class="keyword">open</span> <span class="keyword">class </span><span class="identifier">Bar</span>&nbsp;<span class="symbol">:</span>&nbsp;<a href="test/-java-supertype/-foo/index"><span class="identifier">Foo</span></a></code>
+<code><span class="keyword">open</span> <span class="keyword">class </span><span class="identifier">Bar</span>&nbsp;<span class="symbol">:</span>&nbsp;<a href="../-foo/index.html"><span class="identifier">Foo</span></a></code>
<h3>Constructors</h3>
<table>
<tbody>
<tr>
<td>
-<p><a href="test/-java-supertype/-bar/-init-">&lt;init&gt;</a></p>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
</td>
<td>
<code><span class="identifier">Bar</span><span class="symbol">(</span><span class="symbol">)</span></code></td>
@@ -25,10 +25,10 @@
<tbody>
<tr>
<td>
-<p><a href="test/-java-supertype/-bar/return-foo">returnFoo</a></p>
+<p><a href="return-foo.html">returnFoo</a></p>
</td>
<td>
-<code><span class="keyword">open</span> <span class="keyword">fun </span><span class="identifier">returnFoo</span><span class="symbol">(</span><span class="identifier" id="JavaSupertype.Bar$returnFoo(JavaSupertype.Foo)/foo">foo</span><span class="symbol">:</span>&nbsp;<a href="test/-java-supertype/-foo/index"><span class="identifier">Foo</span></a><span class="symbol">)</span><span class="symbol">: </span><a href="test/-java-supertype/-foo/index"><span class="identifier">Foo</span></a></code></td>
+<code><span class="keyword">open</span> <span class="keyword">fun </span><span class="identifier">returnFoo</span><span class="symbol">(</span><span class="identifier" id="JavaSupertype.Bar$returnFoo(JavaSupertype.Foo)/foo">foo</span><span class="symbol">:</span>&nbsp;<a href="../-foo/index.html"><span class="identifier">Foo</span></a><span class="symbol">)</span><span class="symbol">: </span><a href="../-foo/index.html"><span class="identifier">Foo</span></a></code></td>
</tr>
</tbody>
</table>
diff --git a/core/testdata/format/accessor.md b/core/testdata/format/accessor.md
index dcdef0f8..190e8538 100644
--- a/core/testdata/format/accessor.md
+++ b/core/testdata/format/accessor.md
@@ -1,4 +1,4 @@
-[test](test/index) / [C](test/-c/index) / [x](test/-c/x)
+[test](../index.md) / [C](index.md) / [x](./x.md)
# x
diff --git a/core/testdata/format/annotatedTypeParameter.md b/core/testdata/format/annotatedTypeParameter.md
index aa8b8592..aa622eac 100644
--- a/core/testdata/format/annotatedTypeParameter.md
+++ b/core/testdata/format/annotatedTypeParameter.md
@@ -1,5 +1,5 @@
-[test](test/index) / [containsAll](test/contains-all)
+[test](index.md) / [containsAll](./contains-all.md)
# containsAll
-`fun <E> containsAll(elements: Collection<@UnsafeVariance `[`E`](test/contains-all#E)`>): @UnsafeVariance `[`E`](test/contains-all#E) \ No newline at end of file
+`fun <E> containsAll(elements: Collection<@UnsafeVariance `[`E`](contains-all.md#E)`>): @UnsafeVariance `[`E`](contains-all.md#E) \ No newline at end of file
diff --git a/core/testdata/format/annotationClass.md b/core/testdata/format/annotationClass.md
index 2f4da736..55fda40c 100644
--- a/core/testdata/format/annotationClass.md
+++ b/core/testdata/format/annotationClass.md
@@ -1,4 +1,4 @@
-[test](test/index) / [fancy](test/fancy/index)
+[test](../index.md) / [fancy](./index.md)
# fancy
@@ -6,5 +6,5 @@
### Constructors
-| [&lt;init&gt;](test/fancy/-init-) | `fancy()` |
+| [&lt;init&gt;](-init-.md) | `fancy()` |
diff --git a/core/testdata/format/annotationClass.package.md b/core/testdata/format/annotationClass.package.md
index f52b28b6..c8aff7a3 100644
--- a/core/testdata/format/annotationClass.package.md
+++ b/core/testdata/format/annotationClass.package.md
@@ -1,8 +1,8 @@
-[test](test/index)
+[test](./index.md)
## Package &lt;root&gt;
### Annotations
-| [fancy](test/fancy/index) | `annotation class fancy` |
+| [fancy](fancy/index.md) | `annotation class fancy` |
diff --git a/core/testdata/format/annotationParams.md b/core/testdata/format/annotationParams.md
index 132078ce..cfa3b822 100644
--- a/core/testdata/format/annotationParams.md
+++ b/core/testdata/format/annotationParams.md
@@ -1,4 +1,4 @@
-[test](test/index) / [f](test/f)
+[test](index.md) / [f](./f.md)
# f
diff --git a/core/testdata/format/annotations.md b/core/testdata/format/annotations.md
index cc27d5af..2e1604d0 100644
--- a/core/testdata/format/annotations.md
+++ b/core/testdata/format/annotations.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Foo](test/-foo/index)
+[test](../index.md) / [Foo](./index.md)
# Foo
@@ -6,13 +6,13 @@
### Constructors
-| [&lt;init&gt;](test/-foo/-init-) | `Foo()` |
+| [&lt;init&gt;](-init-.md) | `Foo()` |
### Properties
-| [x](test/-foo/x) | `val x: Int` |
+| [x](x.md) | `val x: Int` |
### Functions
-| [bar](test/-foo/bar) | `fun bar(notInlined: () -> Unit): Unit` |
+| [bar](bar.md) | `fun bar(notInlined: () -> Unit): Unit` |
diff --git a/core/testdata/format/arrayAverage.md b/core/testdata/format/arrayAverage.md
index 7cc31c47..2c6927d6 100644
--- a/core/testdata/format/arrayAverage.md
+++ b/core/testdata/format/arrayAverage.md
@@ -1,4 +1,4 @@
-[test](test/index) / [XArray](test/-x-array/index)
+[test](../index.md) / [XArray](./index.md)
# XArray
@@ -6,9 +6,9 @@
### Constructors
-| [&lt;init&gt;](test/-x-array/-init-) | `XArray()` |
+| [&lt;init&gt;](-init-.md) | `XArray()` |
### Extension Functions
-| [average](test/average) | `fun `[`XArray`](test/-x-array/index)`<out Byte>.average(): Double`<br>`fun `[`XArray`](test/-x-array/index)`<out Double>.average(): Double`<br>`fun `[`XArray`](test/-x-array/index)`<out Float>.average(): Double`<br>`fun `[`XArray`](test/-x-array/index)`<out Int>.average(): Double`<br>`fun `[`XArray`](test/-x-array/index)`<out Long>.average(): Double`<br>`fun `[`XArray`](test/-x-array/index)`<out Short>.average(): Double` |
+| [average](../average.md) | `fun `[`XArray`](./index.md)`<out Byte>.average(): Double`<br>`fun `[`XArray`](./index.md)`<out Double>.average(): Double`<br>`fun `[`XArray`](./index.md)`<out Float>.average(): Double`<br>`fun `[`XArray`](./index.md)`<out Int>.average(): Double`<br>`fun `[`XArray`](./index.md)`<out Long>.average(): Double`<br>`fun `[`XArray`](./index.md)`<out Short>.average(): Double` |
diff --git a/core/testdata/format/backtickInCodeBlock.md b/core/testdata/format/backtickInCodeBlock.md
index fc244630..830539ac 100644
--- a/core/testdata/format/backtickInCodeBlock.md
+++ b/core/testdata/format/backtickInCodeBlock.md
@@ -1,4 +1,4 @@
-[test](test/index) / [foo](test/foo)
+[test](index.md) / [foo](./foo.md)
# foo
diff --git a/core/testdata/format/blankLineInsideCodeBlock.html b/core/testdata/format/blankLineInsideCodeBlock.html
index 168dd0dd..f0351d72 100644
--- a/core/testdata/format/blankLineInsideCodeBlock.html
+++ b/core/testdata/format/blankLineInsideCodeBlock.html
@@ -4,7 +4,7 @@
<title>u - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/u">u</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./u.html">u</a><br/>
<br/>
<h1>u</h1>
<a name="$u()"></a>
diff --git a/core/testdata/format/blankLineInsideCodeBlock.md b/core/testdata/format/blankLineInsideCodeBlock.md
index 66f4d65f..956f8954 100644
--- a/core/testdata/format/blankLineInsideCodeBlock.md
+++ b/core/testdata/format/blankLineInsideCodeBlock.md
@@ -1,4 +1,4 @@
-[test](test/index) / [u](test/u)
+[test](index.md) / [u](./u.md)
# u
diff --git a/core/testdata/format/bracket.html b/core/testdata/format/bracket.html
index a76ff885..01aaaf04 100644
--- a/core/testdata/format/bracket.html
+++ b/core/testdata/format/bracket.html
@@ -4,7 +4,7 @@
<title>foo - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/foo">foo</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./foo.html">foo</a><br/>
<br/>
<h1>foo</h1>
<a name="$foo()"></a>
diff --git a/core/testdata/format/brokenLink.html b/core/testdata/format/brokenLink.html
index d1b8ccb0..c598a73e 100644
--- a/core/testdata/format/brokenLink.html
+++ b/core/testdata/format/brokenLink.html
@@ -4,7 +4,7 @@
<title>f - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/f">f</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./f.html">f</a><br/>
<br/>
<h1>f</h1>
<a name="$f()"></a>
diff --git a/core/testdata/format/classWithCompanionObject.html b/core/testdata/format/classWithCompanionObject.html
index 2954d5a7..88feea5e 100644
--- a/core/testdata/format/classWithCompanionObject.html
+++ b/core/testdata/format/classWithCompanionObject.html
@@ -4,7 +4,7 @@
<title>Klass - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-klass/index">Klass</a><br/>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">Klass</a><br/>
<br/>
<h1>Klass</h1>
<code><span class="keyword">class </span><span class="identifier">Klass</span></code>
@@ -13,7 +13,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/-klass/-init-">&lt;init&gt;</a></p>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
</td>
<td>
<code><span class="identifier">Klass</span><span class="symbol">(</span><span class="symbol">)</span></code></td>
@@ -25,7 +25,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/-klass/x">x</a></p>
+<p><a href="x.html">x</a></p>
</td>
<td>
<code><span class="keyword">val </span><span class="identifier">x</span><span class="symbol">: </span><span class="identifier">Int</span></code></td>
@@ -37,7 +37,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/-klass/foo">foo</a></p>
+<p><a href="foo.html">foo</a></p>
</td>
<td>
<code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td>
diff --git a/core/testdata/format/classWithCompanionObject.md b/core/testdata/format/classWithCompanionObject.md
index 45684c0e..40f605be 100644
--- a/core/testdata/format/classWithCompanionObject.md
+++ b/core/testdata/format/classWithCompanionObject.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Klass](test/-klass/index)
+[test](../index.md) / [Klass](./index.md)
# Klass
@@ -6,13 +6,13 @@
### Constructors
-| [&lt;init&gt;](test/-klass/-init-) | `Klass()` |
+| [&lt;init&gt;](-init-.md) | `Klass()` |
### Companion Object Properties
-| [x](test/-klass/x) | `val x: Int` |
+| [x](x.md) | `val x: Int` |
### Companion Object Functions
-| [foo](test/-klass/foo) | `fun foo(): Unit` |
+| [foo](foo.md) | `fun foo(): Unit` |
diff --git a/core/testdata/format/codeBlock.html b/core/testdata/format/codeBlock.html
index 48c2ffd2..1e07ff09 100644
--- a/core/testdata/format/codeBlock.html
+++ b/core/testdata/format/codeBlock.html
@@ -1,9 +1,11 @@
+<!-- File: test/-throws/index.html -->
<HTML>
<HEAD>
<meta charset="UTF-8">
+<title>Throws - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-throws/index">Throws</a><br/>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">Throws</a><br/>
<br/>
<h1>Throws</h1>
<code><span class="keyword">class </span><span class="identifier">Throws</span></code>
@@ -11,12 +13,50 @@
<p>Example:</p>
<pre><code>Throws(IOException::class)
fun readFile(name: String): String {...}
-</code></pre><a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-it-does-some-obfuscated-thing/index">ItDoesSomeObfuscatedThing</a><br/>
+</code></pre>
+<h3>Constructors</h3>
+<table>
+<tbody>
+<tr>
+<td>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
+</td>
+<td>
+<code><span class="identifier">Throws</span><span class="symbol">(</span><span class="symbol">)</span></code>
+<p>This annotation indicates what exceptions should be declared by a function when compiled to a JVM method.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</BODY>
+</HTML>
+<!-- File: test/-it-does-some-obfuscated-thing/index.html -->
+<HTML>
+<HEAD>
+<meta charset="UTF-8">
+<title>ItDoesSomeObfuscatedThing - test</title>
+</HEAD>
+<BODY>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">ItDoesSomeObfuscatedThing</a><br/>
<br/>
<h1>ItDoesSomeObfuscatedThing</h1>
<code><span class="keyword">class </span><span class="identifier">ItDoesSomeObfuscatedThing</span></code>
<p>Check output of</p>
<pre><code class="lang-brainfuck">++++++++++[&gt;+++++++&gt;++++++++++&gt;+++&gt;+&lt;&lt;&lt;&lt;-]&gt;++.&gt;+.+++++++..+++.&gt;++.&lt;&lt;+++++++++++++++.&gt;.+++.------.--------.&gt;+.&gt;.
</code></pre>
+<h3>Constructors</h3>
+<table>
+<tbody>
+<tr>
+<td>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
+</td>
+<td>
+<code><span class="identifier">ItDoesSomeObfuscatedThing</span><span class="symbol">(</span><span class="symbol">)</span></code>
+<p>Check output of</p>
+</td>
+</tr>
+</tbody>
+</table>
</BODY>
</HTML>
diff --git a/core/testdata/format/codeBlock.md b/core/testdata/format/codeBlock.md
index d64fb9fd..d183a8ba 100644
--- a/core/testdata/format/codeBlock.md
+++ b/core/testdata/format/codeBlock.md
@@ -1,4 +1,5 @@
-[test](test/index) / [Throws](test/-throws/index)
+<!-- File: test/-throws/index.md -->
+[test](../index.md) / [Throws](./index.md)
# Throws
@@ -13,7 +14,12 @@ Throws(IOException::class)
fun readFile(name: String): String {...}
```
-[test](test/index) / [ItDoesSomeObfuscatedThing](test/-it-does-some-obfuscated-thing/index)
+### Constructors
+
+| [&lt;init&gt;](-init-.md) | `Throws()`<br>This annotation indicates what exceptions should be declared by a function when compiled to a JVM method. |
+
+<!-- File: test/-it-does-some-obfuscated-thing/index.md -->
+[test](../index.md) / [ItDoesSomeObfuscatedThing](./index.md)
# ItDoesSomeObfuscatedThing
@@ -25,3 +31,7 @@ Check output of
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
```
+### Constructors
+
+| [&lt;init&gt;](-init-.md) | `ItDoesSomeObfuscatedThing()`<br>Check output of |
+
diff --git a/core/testdata/format/codeBlockNoHtmlEscape.md b/core/testdata/format/codeBlockNoHtmlEscape.md
index 2622ef38..548dac4f 100644
--- a/core/testdata/format/codeBlockNoHtmlEscape.md
+++ b/core/testdata/format/codeBlockNoHtmlEscape.md
@@ -1,4 +1,4 @@
-[test](test/index) / [hackTheArithmetic](test/hack-the-arithmetic)
+[test](index.md) / [hackTheArithmetic](./hack-the-arithmetic.md)
# hackTheArithmetic
diff --git a/core/testdata/format/codeSpan.html b/core/testdata/format/codeSpan.html
index 33cbdba3..bfe93f36 100644
--- a/core/testdata/format/codeSpan.html
+++ b/core/testdata/format/codeSpan.html
@@ -4,7 +4,7 @@
<title>foo - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/foo">foo</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./foo.html">foo</a><br/>
<br/>
<h1>foo</h1>
<a name="$foo()"></a>
diff --git a/core/testdata/format/companionImplements.md b/core/testdata/format/companionImplements.md
index 8a93ed6b..aac7b3e6 100644
--- a/core/testdata/format/companionImplements.md
+++ b/core/testdata/format/companionImplements.md
@@ -1,16 +1,16 @@
-[test](test/index) / [Foo](test/-foo/index)
+[test](../index.md) / [Foo](./index.md)
# Foo
`class Foo`
-Correct ref [Foo.Companion](test/-foo/-companion)
+Correct ref [Foo.Companion](-companion.md)
### Types
-| [Companion](test/-foo/-companion) | `companion object Companion : `[`Bar`](test/-bar) |
+| [Companion](-companion.md) | `companion object Companion : `[`Bar`](../-bar.md) |
### Constructors
-| [&lt;init&gt;](test/-foo/-init-) | `Foo()`<br>Correct ref [Foo.Companion](test/-foo/-companion) |
+| [&lt;init&gt;](-init-.md) | `Foo()`<br>Correct ref [Foo.Companion](-companion.md) |
diff --git a/core/testdata/format/companionObjectExtension.md b/core/testdata/format/companionObjectExtension.md
index e019c184..c0e268e6 100644
--- a/core/testdata/format/companionObjectExtension.md
+++ b/core/testdata/format/companionObjectExtension.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Foo](test/-foo/index)
+[test](../index.md) / [Foo](./index.md)
# Foo
@@ -6,9 +6,9 @@
### Constructors
-| [&lt;init&gt;](test/-foo/-init-) | `Foo()` |
+| [&lt;init&gt;](-init-.md) | `Foo()` |
### Companion Object Extension Properties
-| [x](test/x) | `val Foo.Default.x: Int`<br>The default object property. |
+| [x](../x.md) | `val Foo.Default.x: Int`<br>The default object property. |
diff --git a/core/testdata/format/crossLanguage/kotlinExtendsJava/Bar.html b/core/testdata/format/crossLanguage/kotlinExtendsJava/Bar.html
index 42f21d3c..8842969e 100644
--- a/core/testdata/format/crossLanguage/kotlinExtendsJava/Bar.html
+++ b/core/testdata/format/crossLanguage/kotlinExtendsJava/Bar.html
@@ -4,21 +4,21 @@
<title>Bar - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/test/index">test</a>&nbsp;/&nbsp;<a href="test/test/-bar/index">Bar</a><br/>
+<a href="../../index.html">test</a>&nbsp;/&nbsp;<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">Bar</a><br/>
<br/>
<h1>Bar</h1>
-<code><span class="keyword">class </span><span class="identifier">Bar</span>&nbsp;<span class="symbol">:</span>&nbsp;<a href="test/test/-foo/index"><span class="identifier">Foo</span></a></code>
-<p>See <a href="test/test/-foo/xyzzy">xyzzy</a></p>
+<code><span class="keyword">class </span><span class="identifier">Bar</span>&nbsp;<span class="symbol">:</span>&nbsp;<a href="../-foo/index.html"><span class="identifier">Foo</span></a></code>
+<p>See <a href="../-foo/xyzzy.html">xyzzy</a></p>
<h3>Constructors</h3>
<table>
<tbody>
<tr>
<td>
-<p><a href="test/test/-bar/-init-">&lt;init&gt;</a></p>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
</td>
<td>
<code><span class="identifier">Bar</span><span class="symbol">(</span><span class="symbol">)</span></code>
-<p>See <a href="test/test/-foo/xyzzy">xyzzy</a></p>
+<p>See <a href="../-foo/xyzzy.html">xyzzy</a></p>
</td>
</tr>
</tbody>
@@ -28,7 +28,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/test/-foo/xyzzy">xyzzy</a></p>
+<p><a href="../-foo/xyzzy.html">xyzzy</a></p>
</td>
<td>
<code><span class="keyword">open</span> <span class="keyword">fun </span><span class="identifier">xyzzy</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td>
diff --git a/core/testdata/format/deprecated.class.html b/core/testdata/format/deprecated.class.html
index 66eb9ff1..540060d1 100644
--- a/core/testdata/format/deprecated.class.html
+++ b/core/testdata/format/deprecated.class.html
@@ -1,22 +1,54 @@
+<!-- File: test/-c/index.html -->
<HTML>
<HEAD>
<meta charset="UTF-8">
+<title>C - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-c/index">C</a><br/>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">C</a><br/>
<br/>
<h1>C</h1>
<code><span class="keyword">class </span><s><span class="identifier">C</span></s></code><br/>
<strong>Deprecated:</strong> This class sucks<br/>
<br/>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/f">f</a><br/>
+<h3>Constructors</h3>
+<table>
+<tbody>
+<tr>
+<td>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
+</td>
+<td>
+<code><span class="identifier">C</span><span class="symbol">(</span><span class="symbol">)</span></code></td>
+</tr>
+</tbody>
+</table>
+</BODY>
+</HTML>
+<!-- File: test/f.html -->
+<HTML>
+<HEAD>
+<meta charset="UTF-8">
+<title>f - test</title>
+</HEAD>
+<BODY>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./f.html">f</a><br/>
<br/>
<h1>f</h1>
<a name="$f()"></a>
<code><span class="keyword">fun </span><s><span class="identifier">f</span></s><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/>
<strong>Deprecated:</strong> This function sucks<br/>
<br/>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/p">p</a><br/>
+</BODY>
+</HTML>
+<!-- File: test/p.html -->
+<HTML>
+<HEAD>
+<meta charset="UTF-8">
+<title>p - test</title>
+</HEAD>
+<BODY>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./p.html">p</a><br/>
<br/>
<h1>p</h1>
<a name="$p"></a>
diff --git a/core/testdata/format/deprecated.package.html b/core/testdata/format/deprecated.package.html
index b85e53bd..3506de61 100644
--- a/core/testdata/format/deprecated.package.html
+++ b/core/testdata/format/deprecated.package.html
@@ -4,7 +4,7 @@
<title>root package - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a><br/>
+<a href="./index.html">test</a><br/>
<br/>
<h2>Package &lt;root&gt;</h2>
<h3>Types</h3>
@@ -12,7 +12,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/-c/index">C</a></p>
+<p><a href="-c/index.html">C</a></p>
</td>
<td>
<code><span class="keyword">class </span><s><span class="identifier">C</span></s></code></td>
@@ -24,7 +24,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/p">p</a></p>
+<p><a href="p.html">p</a></p>
</td>
<td>
<code><span class="keyword">val </span><s><span class="identifier">p</span></s><span class="symbol">: </span><span class="identifier">Int</span></code></td>
@@ -36,7 +36,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/f">f</a></p>
+<p><a href="f.html">f</a></p>
</td>
<td>
<code><span class="keyword">fun </span><s><span class="identifier">f</span></s><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td>
diff --git a/core/testdata/format/dynamicExtension.md b/core/testdata/format/dynamicExtension.md
index 2fd928f6..382cf973 100644
--- a/core/testdata/format/dynamicExtension.md
+++ b/core/testdata/format/dynamicExtension.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Foo](test/-foo/index)
+[test](../index.md) / [Foo](./index.md)
# Foo
@@ -6,5 +6,5 @@
### Constructors
-| [&lt;init&gt;](test/-foo/-init-) | `Foo()` |
+| [&lt;init&gt;](-init-.md) | `Foo()` |
diff --git a/core/testdata/format/dynamicType.md b/core/testdata/format/dynamicType.md
index a3d6696b..07a1d103 100644
--- a/core/testdata/format/dynamicType.md
+++ b/core/testdata/format/dynamicType.md
@@ -1,4 +1,4 @@
-[test](test/index) / [foo](test/foo)
+[test](index.md) / [foo](./foo.md)
# foo
diff --git a/core/testdata/format/emptyDescription.md b/core/testdata/format/emptyDescription.md
index 8c0fe109..5d56d968 100644
--- a/core/testdata/format/emptyDescription.md
+++ b/core/testdata/format/emptyDescription.md
@@ -1,4 +1,4 @@
-[test](test/index) / [fn](test/fn)
+[test](index.md) / [fn](./fn.md)
# fn
diff --git a/core/testdata/format/entity.html b/core/testdata/format/entity.html
index abe89502..639f2903 100644
--- a/core/testdata/format/entity.html
+++ b/core/testdata/format/entity.html
@@ -4,7 +4,7 @@
<title>Bar - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-bar/index">Bar</a><br/>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">Bar</a><br/>
<br/>
<h1>Bar</h1>
<code><span class="keyword">class </span><span class="identifier">Bar</span></code>
@@ -14,7 +14,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/-bar/-init-">&lt;init&gt;</a></p>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
</td>
<td>
<code><span class="identifier">Bar</span><span class="symbol">(</span><span class="symbol">)</span></code>
diff --git a/core/testdata/format/enumClass.md b/core/testdata/format/enumClass.md
index d3a6f186..50cccfbb 100644
--- a/core/testdata/format/enumClass.md
+++ b/core/testdata/format/enumClass.md
@@ -1,4 +1,4 @@
-[test](test/index) / [InlineOption](test/-inline-option/index)
+[test](../index.md) / [InlineOption](./index.md)
# InlineOption
@@ -6,6 +6,6 @@
### Enum Values
-| [ONLY_LOCAL_RETURN](test/-inline-option/-o-n-l-y_-l-o-c-a-l_-r-e-t-u-r-n) | |
-| [LOCAL_CONTINUE_AND_BREAK](test/-inline-option/-l-o-c-a-l_-c-o-n-t-i-n-u-e_-a-n-d_-b-r-e-a-k) | |
+| [ONLY_LOCAL_RETURN](-o-n-l-y_-l-o-c-a-l_-r-e-t-u-r-n.md) | |
+| [LOCAL_CONTINUE_AND_BREAK](-l-o-c-a-l_-c-o-n-t-i-n-u-e_-a-n-d_-b-r-e-a-k.md) | |
diff --git a/core/testdata/format/enumClass.value.md b/core/testdata/format/enumClass.value.md
index feed2fe5..150016cc 100644
--- a/core/testdata/format/enumClass.value.md
+++ b/core/testdata/format/enumClass.value.md
@@ -1,4 +1,4 @@
-[test](test/index) / [InlineOption](test/-inline-option/index) / [LOCAL_CONTINUE_AND_BREAK](test/-inline-option/-l-o-c-a-l_-c-o-n-t-i-n-u-e_-a-n-d_-b-r-e-a-k)
+[test](../index.md) / [InlineOption](index.md) / [LOCAL_CONTINUE_AND_BREAK](./-l-o-c-a-l_-c-o-n-t-i-n-u-e_-a-n-d_-b-r-e-a-k.md)
# LOCAL_CONTINUE_AND_BREAK
diff --git a/core/testdata/format/exceptionClass.md b/core/testdata/format/exceptionClass.md
index e3714ecc..1e928bb6 100644
--- a/core/testdata/format/exceptionClass.md
+++ b/core/testdata/format/exceptionClass.md
@@ -1,4 +1,4 @@
-[test](test/index) / [MyException](test/-my-exception/index)
+[test](../index.md) / [MyException](./index.md)
# MyException
@@ -6,5 +6,5 @@
### Constructors
-| [&lt;init&gt;](test/-my-exception/-init-) | `MyException()` |
+| [&lt;init&gt;](-init-.md) | `MyException()` |
diff --git a/core/testdata/format/exceptionClass.package.md b/core/testdata/format/exceptionClass.package.md
index e10478e4..8716df0a 100644
--- a/core/testdata/format/exceptionClass.package.md
+++ b/core/testdata/format/exceptionClass.package.md
@@ -1,8 +1,8 @@
-[test](test/index)
+[test](./index.md)
## Package &lt;root&gt;
### Exceptions
-| [MyException](test/-my-exception/index) | `class MyException : Exception` |
+| [MyException](-my-exception/index.md) | `class MyException : Exception` |
diff --git a/core/testdata/format/exclInCodeBlock.md b/core/testdata/format/exclInCodeBlock.md
index 9c9e424a..d665c415 100644
--- a/core/testdata/format/exclInCodeBlock.md
+++ b/core/testdata/format/exclInCodeBlock.md
@@ -1,4 +1,4 @@
-[test](test/index) / [foo](test/foo)
+[test](index.md) / [foo](./foo.md)
# foo
diff --git a/core/testdata/format/extensionFunctionParameter.md b/core/testdata/format/extensionFunctionParameter.md
index 501d731d..e1e85824 100644
--- a/core/testdata/format/extensionFunctionParameter.md
+++ b/core/testdata/format/extensionFunctionParameter.md
@@ -1,5 +1,5 @@
-[test](test/index) / [apply](test/apply)
+[test](index.md) / [apply](./apply.md)
# apply
-`inline fun <T> `[`T`](test/apply#T)`.apply(f: `[`T`](test/apply#T)`.() -> Unit): `[`T`](test/apply#T) \ No newline at end of file
+`inline fun <T> `[`T`](apply.md#T)`.apply(f: `[`T`](apply.md#T)`.() -> Unit): `[`T`](apply.md#T) \ No newline at end of file
diff --git a/core/testdata/format/extensionScope.md b/core/testdata/format/extensionScope.md
index 3515ed84..ea765bd5 100644
--- a/core/testdata/format/extensionScope.md
+++ b/core/testdata/format/extensionScope.md
@@ -1,8 +1,8 @@
-[test](test/index) / [test](test/test)
+[test](index.md) / [test](./test.md)
# test
`fun test(): Unit`
-Correct link: [Foo.ext](test/ext)
+Correct link: [Foo.ext](ext.md)
diff --git a/core/testdata/format/extensionWithDocumentedReceiver.md b/core/testdata/format/extensionWithDocumentedReceiver.md
index 125da37e..0679ac8f 100644
--- a/core/testdata/format/extensionWithDocumentedReceiver.md
+++ b/core/testdata/format/extensionWithDocumentedReceiver.md
@@ -1,4 +1,4 @@
-[test](test/index) / [kotlin.String](test/kotlin.-string/index) / [fn](test/kotlin.-string/fn)
+[test](../index.md) / [kotlin.String](index.md) / [fn](./fn.md)
# fn
diff --git a/core/testdata/format/extensions.class.md b/core/testdata/format/extensions.class.md
index f75b4dc8..b8fa200a 100644
--- a/core/testdata/format/extensions.class.md
+++ b/core/testdata/format/extensions.class.md
@@ -1,7 +1,7 @@
-[test](test/index) / [foo](test/foo/index) / [kotlin.String](test/foo/kotlin.-string/index)
+[test](../../index.md) / [foo](../index.md) / [kotlin.String](./index.md)
### Extensions for kotlin.String
-| [fn](test/foo/kotlin.-string/fn) | `fun String.fn(): Unit`<br>`fun String.fn(x: Int): Unit`<br>Function with receiver |
-| [foobar](test/foo/kotlin.-string/foobar) | `val String.foobar: Int`<br>Property with receiver. |
+| [fn](fn.md) | `fun String.fn(): Unit`<br>`fun String.fn(x: Int): Unit`<br>Function with receiver |
+| [foobar](foobar.md) | `val String.foobar: Int`<br>Property with receiver. |
diff --git a/core/testdata/format/extensions.package.md b/core/testdata/format/extensions.package.md
index 4dc0cfab..ad895116 100644
--- a/core/testdata/format/extensions.package.md
+++ b/core/testdata/format/extensions.package.md
@@ -1,8 +1,8 @@
-[test](test/index) / [foo](test/foo/index)
+[test](../index.md) / [foo](./index.md)
## Package foo
### Extensions for External Classes
-| [kotlin.String](test/foo/kotlin.-string/index) | |
+| [kotlin.String](kotlin.-string/index.md) | |
diff --git a/core/testdata/format/externalReferenceLink.md b/core/testdata/format/externalReferenceLink.md
index 29d64afe..38ffde78 100644
--- a/core/testdata/format/externalReferenceLink.md
+++ b/core/testdata/format/externalReferenceLink.md
@@ -1,4 +1,4 @@
-[test](test/index) / [a](test/a)
+[test](index.md) / [a](./a.md)
# a
diff --git a/core/testdata/format/functionWithDefaultParameter.md b/core/testdata/format/functionWithDefaultParameter.md
index 568c106c..05f7fbe6 100644
--- a/core/testdata/format/functionWithDefaultParameter.md
+++ b/core/testdata/format/functionWithDefaultParameter.md
@@ -1,4 +1,4 @@
-[test](test/index) / [f](test/f)
+[test](index.md) / [f](./f.md)
# f
diff --git a/core/testdata/format/functionalTypeWithNamedParameters.html b/core/testdata/format/functionalTypeWithNamedParameters.html
index 84a489ff..83d03d8f 100644
--- a/core/testdata/format/functionalTypeWithNamedParameters.html
+++ b/core/testdata/format/functionalTypeWithNamedParameters.html
@@ -1,25 +1,103 @@
+<!-- File: test/-a/index.html -->
<HTML>
<HEAD>
<meta charset="UTF-8">
+<title>A - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-a/index">A</a><br/>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">A</a><br/>
<br/>
<h1>A</h1>
-<code><span class="keyword">class </span><span class="identifier">A</span></code><a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-b/index">B</a><br/>
+<code><span class="keyword">class </span><span class="identifier">A</span></code>
+<h3>Constructors</h3>
+<table>
+<tbody>
+<tr>
+<td>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
+</td>
+<td>
+<code><span class="identifier">A</span><span class="symbol">(</span><span class="symbol">)</span></code></td>
+</tr>
+</tbody>
+</table>
+</BODY>
+</HTML>
+<!-- File: test/-b/index.html -->
+<HTML>
+<HEAD>
+<meta charset="UTF-8">
+<title>B - test</title>
+</HEAD>
+<BODY>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">B</a><br/>
<br/>
<h1>B</h1>
-<code><span class="keyword">class </span><span class="identifier">B</span></code><a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-c/index">C</a><br/>
+<code><span class="keyword">class </span><span class="identifier">B</span></code>
+<h3>Constructors</h3>
+<table>
+<tbody>
+<tr>
+<td>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
+</td>
+<td>
+<code><span class="identifier">B</span><span class="symbol">(</span><span class="symbol">)</span></code></td>
+</tr>
+</tbody>
+</table>
+</BODY>
+</HTML>
+<!-- File: test/-c/index.html -->
+<HTML>
+<HEAD>
+<meta charset="UTF-8">
+<title>C - test</title>
+</HEAD>
+<BODY>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">C</a><br/>
<br/>
<h1>C</h1>
-<code><span class="keyword">class </span><span class="identifier">C</span></code><a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/f">f</a><br/>
+<code><span class="keyword">class </span><span class="identifier">C</span></code>
+<h3>Constructors</h3>
+<table>
+<tbody>
+<tr>
+<td>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
+</td>
+<td>
+<code><span class="identifier">C</span><span class="symbol">(</span><span class="symbol">)</span></code></td>
+</tr>
+</tbody>
+</table>
+</BODY>
+</HTML>
+<!-- File: test/f.html -->
+<HTML>
+<HEAD>
+<meta charset="UTF-8">
+<title>f - test</title>
+</HEAD>
+<BODY>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./f.html">f</a><br/>
<br/>
<h1>f</h1>
<a name="$f"></a>
-<code><span class="keyword">val </span><span class="identifier">f</span><span class="symbol">: </span><span class="symbol">(</span><span class="identifier">a</span><span class="symbol">:</span>&nbsp;<a href="test/-a/index"><span class="identifier">A</span></a><span class="symbol">,</span>&nbsp;<span class="identifier">b</span><span class="symbol">:</span>&nbsp;<a href="test/-b/index"><span class="identifier">B</span></a><span class="symbol">)</span>&nbsp;<span class="symbol">-&gt;</span>&nbsp;<a href="test/-c/index"><span class="identifier">C</span></a></code><a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/accept-function-type-with-named-arguments">acceptFunctionTypeWithNamedArguments</a><br/>
+<code><span class="keyword">val </span><span class="identifier">f</span><span class="symbol">: </span><span class="symbol">(</span><span class="identifier">a</span><span class="symbol">:</span>&nbsp;<a href="-a/index.html"><span class="identifier">A</span></a><span class="symbol">,</span>&nbsp;<span class="identifier">b</span><span class="symbol">:</span>&nbsp;<a href="-b/index.html"><span class="identifier">B</span></a><span class="symbol">)</span>&nbsp;<span class="symbol">-&gt;</span>&nbsp;<a href="-c/index.html"><span class="identifier">C</span></a></code>
+</BODY>
+</HTML>
+<!-- File: test/accept-function-type-with-named-arguments.html -->
+<HTML>
+<HEAD>
+<meta charset="UTF-8">
+<title>acceptFunctionTypeWithNamedArguments - test</title>
+</HEAD>
+<BODY>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./accept-function-type-with-named-arguments.html">acceptFunctionTypeWithNamedArguments</a><br/>
<br/>
<h1>acceptFunctionTypeWithNamedArguments</h1>
<a name="$acceptFunctionTypeWithNamedArguments(kotlin.Function2((B, A, C)))"></a>
-<code><span class="keyword">fun </span><span class="identifier">acceptFunctionTypeWithNamedArguments</span><span class="symbol">(</span><span class="identifier" id="$acceptFunctionTypeWithNamedArguments(kotlin.Function2((B, A, C)))/f">f</span><span class="symbol">:</span>&nbsp;<span class="symbol">(</span><span class="identifier">bb</span><span class="symbol">:</span>&nbsp;<a href="test/-b/index"><span class="identifier">B</span></a><span class="symbol">,</span>&nbsp;<span class="identifier">aa</span><span class="symbol">:</span>&nbsp;<a href="test/-a/index"><span class="identifier">A</span></a><span class="symbol">)</span>&nbsp;<span class="symbol">-&gt;</span>&nbsp;<a href="test/-c/index"><span class="identifier">C</span></a><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code>
+<code><span class="keyword">fun </span><span class="identifier">acceptFunctionTypeWithNamedArguments</span><span class="symbol">(</span><span class="identifier" id="$acceptFunctionTypeWithNamedArguments(kotlin.Function2((B, A, C)))/f">f</span><span class="symbol">:</span>&nbsp;<span class="symbol">(</span><span class="identifier">bb</span><span class="symbol">:</span>&nbsp;<a href="-b/index.html"><span class="identifier">B</span></a><span class="symbol">,</span>&nbsp;<span class="identifier">aa</span><span class="symbol">:</span>&nbsp;<a href="-a/index.html"><span class="identifier">A</span></a><span class="symbol">)</span>&nbsp;<span class="symbol">-&gt;</span>&nbsp;<a href="-c/index.html"><span class="identifier">C</span></a><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code>
</BODY>
</HTML>
diff --git a/core/testdata/format/functionalTypeWithNamedParameters.md b/core/testdata/format/functionalTypeWithNamedParameters.md
index 317fa6af..4e78694c 100644
--- a/core/testdata/format/functionalTypeWithNamedParameters.md
+++ b/core/testdata/format/functionalTypeWithNamedParameters.md
@@ -1,21 +1,45 @@
-[test](test/index) / [A](test/-a/index)
+<!-- File: test/-a/index.md -->
+[test](../index.md) / [A](./index.md)
# A
-`class A`[test](test/index) / [B](test/-b/index)
+`class A`
+
+### Constructors
+
+| [&lt;init&gt;](-init-.md) | `A()` |
+
+<!-- File: test/-b/index.md -->
+[test](../index.md) / [B](./index.md)
# B
-`class B`[test](test/index) / [C](test/-c/index)
+`class B`
+
+### Constructors
+
+| [&lt;init&gt;](-init-.md) | `B()` |
+
+<!-- File: test/-c/index.md -->
+[test](../index.md) / [C](./index.md)
# C
-`class C`[test](test/index) / [f](test/f)
+`class C`
+
+### Constructors
+
+| [&lt;init&gt;](-init-.md) | `C()` |
+
+<!-- File: test/f.md -->
+[test](index.md) / [f](./f.md)
# f
-`val f: (a: `[`A`](test/-a/index)`, b: `[`B`](test/-b/index)`) -> `[`C`](test/-c/index)[test](test/index) / [acceptFunctionTypeWithNamedArguments](test/accept-function-type-with-named-arguments)
+`val f: (a: `[`A`](-a/index.md)`, b: `[`B`](-b/index.md)`) -> `[`C`](-c/index.md)
+<!-- File: test/accept-function-type-with-named-arguments.md -->
+[test](index.md) / [acceptFunctionTypeWithNamedArguments](./accept-function-type-with-named-arguments.md)
# acceptFunctionTypeWithNamedArguments
-`fun acceptFunctionTypeWithNamedArguments(f: (bb: `[`B`](test/-b/index)`, aa: `[`A`](test/-a/index)`) -> `[`C`](test/-c/index)`): Unit` \ No newline at end of file
+`fun acceptFunctionTypeWithNamedArguments(f: (bb: `[`B`](-b/index.md)`, aa: `[`A`](-a/index.md)`) -> `[`C`](-c/index.md)`): Unit` \ No newline at end of file
diff --git a/core/testdata/format/genericInheritedExtensions.md b/core/testdata/format/genericInheritedExtensions.md
index 163ff0c9..8d0e316f 100644
--- a/core/testdata/format/genericInheritedExtensions.md
+++ b/core/testdata/format/genericInheritedExtensions.md
@@ -1,15 +1,15 @@
-[test](test/index) / [Bar](test/-bar/index)
+[test](../index.md) / [Bar](./index.md)
# Bar
-`class Bar<T> : `[`Foo`](test/-foo/index)`<`[`T`](test/-bar/index#T)`>`
+`class Bar<T> : `[`Foo`](../-foo/index.md)`<`[`T`](index.md#T)`>`
### Constructors
-| [&lt;init&gt;](test/-bar/-init-) | `Bar()` |
+| [&lt;init&gt;](-init-.md) | `Bar()` |
### Extension Functions
-| [first](test/first) | `fun <T> `[`Foo`](test/-foo/index)`<`[`T`](test/first#T)`>.first(): Unit` |
-| [second](test/second) | `fun <T> `[`Bar`](test/-bar/index)`<`[`T`](test/second#T)`>.second(): Unit` |
+| [first](../first.md) | `fun <T> `[`Foo`](../-foo/index.md)`<`[`T`](../first.md#T)`>.first(): Unit` |
+| [second](../second.md) | `fun <T> `[`Bar`](./index.md)`<`[`T`](../second.md#T)`>.second(): Unit` |
diff --git a/core/testdata/format/gfm/listInTableCell.md b/core/testdata/format/gfm/listInTableCell.md
index 73152ac9..359ad916 100644
--- a/core/testdata/format/gfm/listInTableCell.md
+++ b/core/testdata/format/gfm/listInTableCell.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Foo](test/-foo/index)
+[test](../index.md) / [Foo](./index.md)
# Foo
@@ -8,10 +8,10 @@
| Name | Summary |
|---|---|
-| [&lt;init&gt;](test/-foo/-init-) | `Foo()` |
+| [&lt;init&gt;](-init-.md) | `Foo()` |
### Functions
| Name | Summary |
|---|---|
-| [foo](test/-foo/foo) | `fun foo(): Unit`<ol><li>Foo</li><li>Bar</li></ol> |
+| [foo](foo.md) | `fun foo(): Unit`<ol><li>Foo</li><li>Bar</li></ol> |
diff --git a/core/testdata/format/gfm/sample.md b/core/testdata/format/gfm/sample.md
index c2af1c1e..2b082296 100644
--- a/core/testdata/format/gfm/sample.md
+++ b/core/testdata/format/gfm/sample.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Foo](test/-foo/index)
+[test](../index.md) / [Foo](./index.md)
# Foo
@@ -10,11 +10,11 @@ The class Foo.
| Name | Summary |
|---|---|
-| [&lt;init&gt;](test/-foo/-init-) | `Foo()`<br>The class Foo. |
+| [&lt;init&gt;](-init-.md) | `Foo()`<br>The class Foo. |
### Functions
| Name | Summary |
|---|---|
-| [bar](test/-foo/bar) | `fun bar(): Unit`<br>The method bar. |
-| [baz](test/-foo/baz) | `fun baz(): Unit`<br>The method baz. |
+| [bar](bar.md) | `fun bar(): Unit`<br>The method bar. |
+| [baz](baz.md) | `fun baz(): Unit`<br>The method baz. |
diff --git a/core/testdata/format/htmlEscaping.html b/core/testdata/format/htmlEscaping.html
index 17d48161..bd64454d 100644
--- a/core/testdata/format/htmlEscaping.html
+++ b/core/testdata/format/htmlEscaping.html
@@ -4,11 +4,11 @@
<title>x - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/x">x</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./x.html">x</a><br/>
<br/>
<h1>x</h1>
<a name="$x()"></a>
-<code><span class="keyword">fun </span><span class="symbol">&lt;</span><span class="identifier">T</span><span class="symbol">&gt;</span> <span class="identifier">x</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><a href="test/x#T"><span class="identifier">T</span></a><span class="symbol">?</span></code>
+<code><span class="keyword">fun </span><span class="symbol">&lt;</span><span class="identifier">T</span><span class="symbol">&gt;</span> <span class="identifier">x</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><a href="x.html#T"><span class="identifier">T</span></a><span class="symbol">?</span></code>
<p>Special characters: &lt; is "less than", &gt; is "greater than", &amp; is "ampersand"</p>
</BODY>
</HTML>
diff --git a/core/testdata/format/inapplicableExtensionFunctions.md b/core/testdata/format/inapplicableExtensionFunctions.md
index 30246faa..08fc2739 100644
--- a/core/testdata/format/inapplicableExtensionFunctions.md
+++ b/core/testdata/format/inapplicableExtensionFunctions.md
@@ -1,14 +1,14 @@
-[test](test/index) / [Bar](test/-bar/index)
+[test](../index.md) / [Bar](./index.md)
# Bar
-`class Bar : `[`Foo`](test/-foo/index)`<Char>`
+`class Bar : `[`Foo`](../-foo/index.md)`<Char>`
### Constructors
-| [&lt;init&gt;](test/-bar/-init-) | `Bar()` |
+| [&lt;init&gt;](-init-.md) | `Bar()` |
### Extension Functions
-| [xyzzy](test/xyzzy) | `fun `[`Bar`](test/-bar/index)`.xyzzy(): Unit` |
+| [xyzzy](../xyzzy.md) | `fun `[`Bar`](./index.md)`.xyzzy(): Unit` |
diff --git a/core/testdata/format/indentedCodeBlock.html b/core/testdata/format/indentedCodeBlock.html
index 1ccf800a..86c129fb 100644
--- a/core/testdata/format/indentedCodeBlock.html
+++ b/core/testdata/format/indentedCodeBlock.html
@@ -4,7 +4,7 @@
<title>foo - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/foo">foo</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./foo.html">foo</a><br/>
<br/>
<h1>foo</h1>
<a name="$foo()"></a>
diff --git a/core/testdata/format/indentedCodeBlock.md b/core/testdata/format/indentedCodeBlock.md
index 515bfee3..77b0630a 100644
--- a/core/testdata/format/indentedCodeBlock.md
+++ b/core/testdata/format/indentedCodeBlock.md
@@ -1,4 +1,4 @@
-[test](test/index) / [foo](test/foo)
+[test](index.md) / [foo](./foo.md)
# foo
diff --git a/core/testdata/format/inheritedCompanionObjectProperties.md b/core/testdata/format/inheritedCompanionObjectProperties.md
index db764ff0..ab8f0aa5 100644
--- a/core/testdata/format/inheritedCompanionObjectProperties.md
+++ b/core/testdata/format/inheritedCompanionObjectProperties.md
@@ -1,30 +1,30 @@
-[test](test/index) / [C](test/-c/index)
+[test](../index.md) / [C](./index.md)
# C
-`class C : `[`A`](test/-a/index)
+`class C : `[`A`](../-a/index.md)
### Types
-| [Companion](test/-c/-companion/index) | `companion object Companion : `[`B`](test/-b/index) |
+| [Companion](-companion/index.md) | `companion object Companion : `[`B`](../-b/index.md) |
### Constructors
-| [&lt;init&gt;](test/-c/-init-) | `C()` |
+| [&lt;init&gt;](-init-.md) | `C()` |
### Functions
-| [xyzzy](test/-c/xyzzy) | `fun xyzzy(): Unit` |
+| [xyzzy](xyzzy.md) | `fun xyzzy(): Unit` |
### Inherited Functions
-| [foo](test/-a/foo) | `fun foo(): Unit` |
+| [foo](../-a/foo.md) | `fun foo(): Unit` |
### Companion Object Functions
-| [shazam](test/-c/shazam) | `fun shazam(): Unit` |
+| [shazam](shazam.md) | `fun shazam(): Unit` |
### Inherited Companion Object Functions
-| [bar](test/-b/bar) | `fun bar(): Unit` |
+| [bar](../-b/bar.md) | `fun bar(): Unit` |
diff --git a/core/testdata/format/inheritedExtensions.md b/core/testdata/format/inheritedExtensions.md
index 611b4f6a..97a73666 100644
--- a/core/testdata/format/inheritedExtensions.md
+++ b/core/testdata/format/inheritedExtensions.md
@@ -1,15 +1,15 @@
-[test](test/index) / [Bar](test/-bar/index)
+[test](../index.md) / [Bar](./index.md)
# Bar
-`class Bar : `[`Foo`](test/-foo/index)
+`class Bar : `[`Foo`](../-foo/index.md)
### Constructors
-| [&lt;init&gt;](test/-bar/-init-) | `Bar()` |
+| [&lt;init&gt;](-init-.md) | `Bar()` |
### Extension Functions
-| [first](test/first) | `fun `[`Foo`](test/-foo/index)`.first(): Unit` |
-| [second](test/second) | `fun `[`Bar`](test/-bar/index)`.second(): Unit` |
+| [first](../first.md) | `fun `[`Foo`](../-foo/index.md)`.first(): Unit` |
+| [second](../second.md) | `fun `[`Bar`](./index.md)`.second(): Unit` |
diff --git a/core/testdata/format/inheritedMembers.md b/core/testdata/format/inheritedMembers.md
index bed5bd44..334df360 100644
--- a/core/testdata/format/inheritedMembers.md
+++ b/core/testdata/format/inheritedMembers.md
@@ -1,26 +1,26 @@
-[test](test/index) / [Bar](test/-bar/index)
+[test](../index.md) / [Bar](./index.md)
# Bar
-`class Bar : `[`Foo`](test/-foo/index)
+`class Bar : `[`Foo`](../-foo/index.md)
### Constructors
-| [&lt;init&gt;](test/-bar/-init-) | `Bar()` |
+| [&lt;init&gt;](-init-.md) | `Bar()` |
### Properties
-| [secondProp](test/-bar/second-prop) | `val secondProp: Int` |
+| [secondProp](second-prop.md) | `val secondProp: Int` |
### Inherited Properties
-| [firstProp](test/-foo/first-prop) | `val firstProp: Int` |
+| [firstProp](../-foo/first-prop.md) | `val firstProp: Int` |
### Functions
-| [second](test/-bar/second) | `fun second(): Unit` |
+| [second](second.md) | `fun second(): Unit` |
### Inherited Functions
-| [first](test/-foo/first) | `fun first(): Unit` |
+| [first](../-foo/first.md) | `fun first(): Unit` |
diff --git a/core/testdata/format/javaCodeInParam.md b/core/testdata/format/javaCodeInParam.md
index 696abdc4..319c6d87 100644
--- a/core/testdata/format/javaCodeInParam.md
+++ b/core/testdata/format/javaCodeInParam.md
@@ -1,4 +1,4 @@
-[test](test/index) / [C](test/-c/index)
+[test](../index.md) / [C](./index.md)
# C
@@ -10,5 +10,5 @@
### Constructors
-| [&lt;init&gt;](test/-c/-init-) | `C()` |
+| [&lt;init&gt;](-init-.md) | `C()` |
diff --git a/core/testdata/format/javaCodeLiteralTags.md b/core/testdata/format/javaCodeLiteralTags.md
index 99dbccfd..b36be04d 100644
--- a/core/testdata/format/javaCodeLiteralTags.md
+++ b/core/testdata/format/javaCodeLiteralTags.md
@@ -1,4 +1,4 @@
-[test](test/index) / [C](test/-c/index)
+[test](../index.md) / [C](./index.md)
# C
@@ -12,5 +12,5 @@ A&lt;B&gt;C
### Constructors
-| [&lt;init&gt;](test/-c/-init-) | `C()`<br>`A<B>C` <br>A&lt;B&gt;C |
+| [&lt;init&gt;](-init-.md) | `C()`<br>`A<B>C` <br>A&lt;B&gt;C |
diff --git a/core/testdata/format/javaDeprecated.html b/core/testdata/format/javaDeprecated.html
index 67c5fd8f..d938fb9d 100644
--- a/core/testdata/format/javaDeprecated.html
+++ b/core/testdata/format/javaDeprecated.html
@@ -4,11 +4,11 @@
<title>Foo.foo - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-foo/index">Foo</a>&nbsp;/&nbsp;<a href="test/-foo/foo">foo</a><br/>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="index.html">Foo</a>&nbsp;/&nbsp;<a href="./foo.html">foo</a><br/>
<br/>
<h1>foo</h1>
<a name="Foo$foo()"></a>
<code><span class="keyword">open</span> <span class="keyword">fun </span><s><span class="identifier">foo</span></s><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/>
-<strong>Deprecated:</strong> use <code><a href="test/-foo/bar">#bar</a></code> instead
+<strong>Deprecated:</strong> use <code><a href="bar.html">#bar</a></code> instead
</BODY>
</HTML>
diff --git a/core/testdata/format/javaLinkTag.html b/core/testdata/format/javaLinkTag.html
index 035bdd06..f90a58df 100644
--- a/core/testdata/format/javaLinkTag.html
+++ b/core/testdata/format/javaLinkTag.html
@@ -4,21 +4,21 @@
<title>Foo - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-foo/index">Foo</a><br/>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">Foo</a><br/>
<br/>
<h1>Foo</h1>
<code><span class="keyword">protected</span> <span class="keyword">open</span> <span class="keyword">class </span><span class="identifier">Foo</span></code>
-<p>Call <code><a href="test/-foo/bar">#bar()</a></code> to do the job.</p>
+<p>Call <code><a href="bar.html">#bar()</a></code> to do the job.</p>
<h3>Constructors</h3>
<table>
<tbody>
<tr>
<td>
-<p><a href="test/-foo/-init-">&lt;init&gt;</a></p>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
</td>
<td>
<code><span class="identifier">Foo</span><span class="symbol">(</span><span class="symbol">)</span></code>
-<p>Call <code><a href="test/-foo/bar">#bar()</a></code> to do the job.</p>
+<p>Call <code><a href="bar.html">#bar()</a></code> to do the job.</p>
</td>
</tr>
</tbody>
@@ -28,7 +28,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/-foo/bar">bar</a></p>
+<p><a href="bar.html">bar</a></p>
</td>
<td>
<code><span class="keyword">open</span> <span class="keyword">fun </span><span class="identifier">bar</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td>
diff --git a/core/testdata/format/javaLinkTagWithLabel.html b/core/testdata/format/javaLinkTagWithLabel.html
index 69a15bc7..51917f7a 100644
--- a/core/testdata/format/javaLinkTagWithLabel.html
+++ b/core/testdata/format/javaLinkTagWithLabel.html
@@ -4,21 +4,21 @@
<title>Foo - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-foo/index">Foo</a><br/>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">Foo</a><br/>
<br/>
<h1>Foo</h1>
<code><span class="keyword">protected</span> <span class="keyword">open</span> <span class="keyword">class </span><span class="identifier">Foo</span></code>
-<p>Call <code><a href="test/-foo/bar">this wonderful method</a></code> to do the job.</p>
+<p>Call <code><a href="bar.html">this wonderful method</a></code> to do the job.</p>
<h3>Constructors</h3>
<table>
<tbody>
<tr>
<td>
-<p><a href="test/-foo/-init-">&lt;init&gt;</a></p>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
</td>
<td>
<code><span class="identifier">Foo</span><span class="symbol">(</span><span class="symbol">)</span></code>
-<p>Call <code><a href="test/-foo/bar">this wonderful method</a></code> to do the job.</p>
+<p>Call <code><a href="bar.html">this wonderful method</a></code> to do the job.</p>
</td>
</tr>
</tbody>
@@ -28,7 +28,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/-foo/bar">bar</a></p>
+<p><a href="bar.html">bar</a></p>
</td>
<td>
<code><span class="keyword">open</span> <span class="keyword">fun </span><span class="identifier">bar</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td>
diff --git a/core/testdata/format/javaSeeTag.html b/core/testdata/format/javaSeeTag.html
index c81eec31..f8866dc2 100644
--- a/core/testdata/format/javaSeeTag.html
+++ b/core/testdata/format/javaSeeTag.html
@@ -4,18 +4,18 @@
<title>Foo - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-foo/index">Foo</a><br/>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">Foo</a><br/>
<br/>
<h1>Foo</h1>
<code><span class="keyword">open</span> <span class="keyword">class </span><span class="identifier">Foo</span></code>
<p><strong>See Also</strong><br/>
-<a href="test/-foo/bar">#bar</a></p>
+<a href="bar.html">#bar</a></p>
<h3>Constructors</h3>
<table>
<tbody>
<tr>
<td>
-<p><a href="test/-foo/-init-">&lt;init&gt;</a></p>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
</td>
<td>
<code><span class="identifier">Foo</span><span class="symbol">(</span><span class="symbol">)</span></code></td>
@@ -27,7 +27,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/-foo/bar">bar</a></p>
+<p><a href="bar.html">bar</a></p>
</td>
<td>
<code><span class="keyword">open</span> <span class="keyword">fun </span><span class="identifier">bar</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td>
diff --git a/core/testdata/format/javaSpaceInAuthor.md b/core/testdata/format/javaSpaceInAuthor.md
index 6d738087..1d2251d0 100644
--- a/core/testdata/format/javaSpaceInAuthor.md
+++ b/core/testdata/format/javaSpaceInAuthor.md
@@ -1,4 +1,4 @@
-[test](test/index) / [C](test/-c/index)
+[test](../index.md) / [C](./index.md)
# C
@@ -9,5 +9,5 @@ Dmitry Jemerov
### Constructors
-| [&lt;init&gt;](test/-c/-init-) | `C()` |
+| [&lt;init&gt;](-init-.md) | `C()` |
diff --git a/core/testdata/format/javadocHtml.md b/core/testdata/format/javadocHtml.md
index 8aba2059..a3c1baff 100644
--- a/core/testdata/format/javadocHtml.md
+++ b/core/testdata/format/javadocHtml.md
@@ -1,4 +1,4 @@
-[test](test/index) / [C](test/-c/index)
+[test](../index.md) / [C](./index.md)
# C
@@ -18,7 +18,7 @@ Block code
### Constructors
-| [&lt;init&gt;](test/-c/-init-) | `C()`<br>**Bold** **Strong** *Italic* *Emphasized* <br>Paragraph ~~Strikethrough~~ ~~Deleted~~ `Code`
+| [&lt;init&gt;](-init-.md) | `C()`<br>**Bold** **Strong** *Italic* *Emphasized* <br>Paragraph ~~Strikethrough~~ ~~Deleted~~ `Code`
```
Block code<br>```
diff --git a/core/testdata/format/javadocOrderedList.md b/core/testdata/format/javadocOrderedList.md
index f18ee96a..88d5f5b6 100644
--- a/core/testdata/format/javadocOrderedList.md
+++ b/core/testdata/format/javadocOrderedList.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Bar](test/-bar/index)
+[test](../index.md) / [Bar](./index.md)
# Bar
@@ -10,7 +10,7 @@
### Constructors
-| [&lt;init&gt;](test/-bar/-init-) | `Bar()`<br>
+| [&lt;init&gt;](-init-.md) | `Bar()`<br>
1. Rinse
2. Repeat
<br> |
diff --git a/core/testdata/format/jdkLinks.md b/core/testdata/format/jdkLinks.md
index 607d63e5..7498171d 100644
--- a/core/testdata/format/jdkLinks.md
+++ b/core/testdata/format/jdkLinks.md
@@ -1,4 +1,4 @@
-[test](test/index) / [C](test/-c/index)
+[test](../index.md) / [C](./index.md)
# C
@@ -10,5 +10,5 @@ You can print something to [java.lang.System.out](http://docs.oracle.com/javase/
### Constructors
-| [&lt;init&gt;](test/-c/-init-) | `C()`<br>This is a [ClassLoader](http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html) and I can get its [ClassLoader.getResource](http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)) |
+| [&lt;init&gt;](-init-.md) | `C()`<br>This is a [ClassLoader](http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html) and I can get its [ClassLoader.getResource](http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)) |
diff --git a/core/testdata/format/linkWithLabel.html b/core/testdata/format/linkWithLabel.html
index b8fe2228..59bc6ddf 100644
--- a/core/testdata/format/linkWithLabel.html
+++ b/core/testdata/format/linkWithLabel.html
@@ -4,21 +4,21 @@
<title>Bar - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-bar/index">Bar</a><br/>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">Bar</a><br/>
<br/>
<h1>Bar</h1>
<code><span class="keyword">class </span><span class="identifier">Bar</span></code>
-<p>Use <a href="test/-bar/foo">this method</a> for best results.</p>
+<p>Use <a href="foo.html">this method</a> for best results.</p>
<h3>Constructors</h3>
<table>
<tbody>
<tr>
<td>
-<p><a href="test/-bar/-init-">&lt;init&gt;</a></p>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
</td>
<td>
<code><span class="identifier">Bar</span><span class="symbol">(</span><span class="symbol">)</span></code>
-<p>Use <a href="test/-bar/foo">this method</a> for best results.</p>
+<p>Use <a href="foo.html">this method</a> for best results.</p>
</td>
</tr>
</tbody>
@@ -28,7 +28,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/-bar/foo">foo</a></p>
+<p><a href="foo.html">foo</a></p>
</td>
<td>
<code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td>
diff --git a/core/testdata/format/linkWithStarProjection.html b/core/testdata/format/linkWithStarProjection.html
index bb9ce43c..e1b6e098 100644
--- a/core/testdata/format/linkWithStarProjection.html
+++ b/core/testdata/format/linkWithStarProjection.html
@@ -4,7 +4,7 @@
<title>KClassLoader - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-k-class-loader/index">KClassLoader</a><br/>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">KClassLoader</a><br/>
<br/>
<h1>KClassLoader</h1>
<code><span class="keyword">object </span><span class="identifier">KClassLoader</span></code>
@@ -13,7 +13,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/-k-class-loader/foo">foo</a></p>
+<p><a href="foo.html">foo</a></p>
</td>
<td>
<code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="identifier" id="KClassLoader$foo(kotlin.Enum(()))/c">c</span><span class="symbol">:</span>&nbsp;<span class="identifier">Enum</span><span class="symbol">&lt;</span><span class="identifier">*</span><span class="symbol">&gt;</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td>
diff --git a/core/testdata/format/linksInEmphasis.md b/core/testdata/format/linksInEmphasis.md
index 9441ef6a..d0ae70c8 100644
--- a/core/testdata/format/linksInEmphasis.md
+++ b/core/testdata/format/linksInEmphasis.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Bar](test/-bar/index)
+[test](../index.md) / [Bar](./index.md)
# Bar
@@ -6,18 +6,18 @@
An emphasised class.
-*This class [Bar](test/-bar/index) is awesome.*
+*This class [Bar](./index.md) is awesome.*
-*Even more awesomer is the function [Bar.foo](test/-bar/foo)*
+*Even more awesomer is the function [Bar.foo](foo.md)*
-*[Bar.hello](test/-bar/hello) is also OK*
+*[Bar.hello](hello.md) is also OK*
### Constructors
-| [&lt;init&gt;](test/-bar/-init-) | `Bar()`<br>An emphasised class. |
+| [&lt;init&gt;](-init-.md) | `Bar()`<br>An emphasised class. |
### Functions
-| [foo](test/-bar/foo) | `fun foo(): Unit` |
-| [hello](test/-bar/hello) | `fun hello(): Unit` |
+| [foo](foo.md) | `fun foo(): Unit` |
+| [hello](hello.md) | `fun hello(): Unit` |
diff --git a/core/testdata/format/linksInHeaders.md b/core/testdata/format/linksInHeaders.md
index 85d51356..1dc7d18b 100644
--- a/core/testdata/format/linksInHeaders.md
+++ b/core/testdata/format/linksInHeaders.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Bar](test/-bar/index)
+[test](../index.md) / [Bar](./index.md)
# Bar
@@ -6,29 +6,29 @@
Some class with really useless documentation.
-# Beer o'clock - time to go to the [Bar](test/-bar/index)
+# Beer o'clock - time to go to the [Bar](./index.md)
## But **is [it](isitbeeroclock.com)** really?
-### [Bar.hello](test/-bar/hello) to the [Bar.world](test/-bar/world)!
+### [Bar.hello](hello.md) to the [Bar.world](world.md)!
-#### *Kotlin is amazing, [Bar.none](test/-bar/none)*
+#### *Kotlin is amazing, [Bar.none](none.md)*
-##### We need to go [Bar.deeper](test/-bar/deeper)
+##### We need to go [Bar.deeper](deeper.md)
-###### End of the [Bar.line](test/-bar/line) - we need to go back!
+###### End of the [Bar.line](line.md) - we need to go back!
### Constructors
-| [&lt;init&gt;](test/-bar/-init-) | `Bar()`<br>Some class with really useless documentation. |
+| [&lt;init&gt;](-init-.md) | `Bar()`<br>Some class with really useless documentation. |
### Functions
-| [deeper](test/-bar/deeper) | `fun deeper(): Unit` |
-| [foo](test/-bar/foo) | `fun foo(): Unit` |
-| [hello](test/-bar/hello) | `fun hello(): Unit` |
-| [kotlin](test/-bar/kotlin) | `fun kotlin(): Unit` |
-| [line](test/-bar/line) | `fun line(): Unit` |
-| [none](test/-bar/none) | `fun none(): Unit` |
-| [world](test/-bar/world) | `fun world(): Unit` |
+| [deeper](deeper.md) | `fun deeper(): Unit` |
+| [foo](foo.md) | `fun foo(): Unit` |
+| [hello](hello.md) | `fun hello(): Unit` |
+| [kotlin](kotlin.md) | `fun kotlin(): Unit` |
+| [line](line.md) | `fun line(): Unit` |
+| [none](none.md) | `fun none(): Unit` |
+| [world](world.md) | `fun world(): Unit` |
diff --git a/core/testdata/format/linksInStrong.md b/core/testdata/format/linksInStrong.md
index e98d31cc..5b44112d 100644
--- a/core/testdata/format/linksInStrong.md
+++ b/core/testdata/format/linksInStrong.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Bar](test/-bar/index)
+[test](../index.md) / [Bar](./index.md)
# Bar
@@ -6,18 +6,18 @@
A strong class.
-**This class [Bar](test/-bar/index) is awesome.**
+**This class [Bar](./index.md) is awesome.**
-**Even more awesomer is the function [Bar.foo](test/-bar/foo)**
+**Even more awesomer is the function [Bar.foo](foo.md)**
-**[Bar.hello](test/-bar/hello) is also OK**
+**[Bar.hello](hello.md) is also OK**
### Constructors
-| [&lt;init&gt;](test/-bar/-init-) | `Bar()`<br>A strong class. |
+| [&lt;init&gt;](-init-.md) | `Bar()`<br>A strong class. |
### Functions
-| [foo](test/-bar/foo) | `fun foo(): Unit` |
-| [hello](test/-bar/hello) | `fun hello(): Unit` |
+| [foo](foo.md) | `fun foo(): Unit` |
+| [hello](hello.md) | `fun hello(): Unit` |
diff --git a/core/testdata/format/markdownInLinks.html b/core/testdata/format/markdownInLinks.html
index 6d2327be..596cca73 100644
--- a/core/testdata/format/markdownInLinks.html
+++ b/core/testdata/format/markdownInLinks.html
@@ -4,7 +4,7 @@
<title>foo - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/foo">foo</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./foo.html">foo</a><br/>
<br/>
<h1>foo</h1>
<a name="$foo()"></a>
diff --git a/core/testdata/format/memberExtension.md b/core/testdata/format/memberExtension.md
index b9db4e3d..0ec1fda3 100644
--- a/core/testdata/format/memberExtension.md
+++ b/core/testdata/format/memberExtension.md
@@ -1,10 +1,10 @@
-[test](test/index) / [Foo](test/-foo/index)
+[test](../index.md) / [Foo](./index.md)
# Foo
-`class Foo : `[`X`](test/-x/index)
+`class Foo : `[`X`](../-x/index.md)
### Constructors
-| [&lt;init&gt;](test/-foo/-init-) | `Foo()` |
+| [&lt;init&gt;](-init-.md) | `Foo()` |
diff --git a/core/testdata/format/multiplatform/breadcrumbsInMemberOfMemberOfGroupNode/multiplatform.md b/core/testdata/format/multiplatform/breadcrumbsInMemberOfMemberOfGroupNode/multiplatform.md
index e3d4c070..37e943ad 100644
--- a/core/testdata/format/multiplatform/breadcrumbsInMemberOfMemberOfGroupNode/multiplatform.md
+++ b/core/testdata/format/multiplatform/breadcrumbsInMemberOfMemberOfGroupNode/multiplatform.md
@@ -1,4 +1,4 @@
-[test](test/index) / [pack](test/pack/index) / [Some](test/pack/-some/index) / [magic](test/pack/-some/-some/magic)
+[test](../../../index.md) / [pack](../../index.md) / [Some](../index.md) / [magic](./magic.md)
# magic
diff --git a/core/testdata/format/multiplatform/groupNode/multiplatform.md b/core/testdata/format/multiplatform/groupNode/multiplatform.md
index c0ef14b1..74d464c9 100644
--- a/core/testdata/format/multiplatform/groupNode/multiplatform.md
+++ b/core/testdata/format/multiplatform/groupNode/multiplatform.md
@@ -1,4 +1,4 @@
-[test](test/index) / [pack](test/pack/index) / [Some](test/pack/-some/index)
+[test](../../index.md) / [pack](../index.md) / [Some](./index.md)
# Some
@@ -12,9 +12,9 @@
### Constructors
-| [&lt;init&gt;](test/pack/-some/-some/-init-) | `Some()` |
+| [&lt;init&gt;](-some/-init-.md) | `Some()` |
### Functions
-| [magic](test/pack/-some/-some/magic) | `fun magic(): Unit` |
+| [magic](-some/magic.md) | `fun magic(): Unit` |
diff --git a/core/testdata/format/multiplatform/groupNode/multiplatform.package.md b/core/testdata/format/multiplatform/groupNode/multiplatform.package.md
index a9e2e404..5708795e 100644
--- a/core/testdata/format/multiplatform/groupNode/multiplatform.package.md
+++ b/core/testdata/format/multiplatform/groupNode/multiplatform.package.md
@@ -1,13 +1,13 @@
-[test](test/index) / [pack](test/pack/index)
+[test](../index.md) / [pack](./index.md)
## Package pack
### Types
-| [Some](test/pack/-some/index)<br>(JS) | `class Some` |
-| [SomeCoolJvmClass](test/pack/-some-cool-jvm-class/index)<br>(JVM) | `class SomeCoolJvmClass` |
+| [Some](-some/index.md)<br>(JS) | `class Some` |
+| [SomeCoolJvmClass](-some-cool-jvm-class/index.md)<br>(JVM) | `class SomeCoolJvmClass` |
### Type Aliases
-| [Some](test/pack/-some/index)<br>(JVM) | `typealias Some = SomeCoolJvmClass` |
+| [Some](-some/index.md)<br>(JVM) | `typealias Some = SomeCoolJvmClass` |
diff --git a/core/testdata/format/multiplatform/implied/foo.md b/core/testdata/format/multiplatform/implied/foo.md
index c615dd8e..fca2aff4 100644
--- a/core/testdata/format/multiplatform/implied/foo.md
+++ b/core/testdata/format/multiplatform/implied/foo.md
@@ -1,4 +1,4 @@
-[test](test/index) / [foo](test/foo/index) / [Foo](test/foo/-foo/index)
+[test](../../index.md) / [foo](../index.md) / [Foo](./index.md)
# Foo
@@ -8,17 +8,17 @@ This is a foo.
### Constructors
-| [&lt;init&gt;](test/foo/-foo/-init-) | `Foo()`<br>This is a foo. |
+| [&lt;init&gt;](-init-.md) | `Foo()`<br>This is a foo. |
### Properties
-| [propJs](test/foo/-foo/prop-js)<br>(JS) | `val propJs: String` |
-| [propJvm](test/foo/-foo/prop-jvm)<br>(JVM) | `val propJvm: String` |
-| [propJvmAndJs](test/foo/-foo/prop-jvm-and-js) | `val propJvmAndJs: Int` |
+| [propJs](prop-js.md)<br>(JS) | `val propJs: String` |
+| [propJvm](prop-jvm.md)<br>(JVM) | `val propJvm: String` |
+| [propJvmAndJs](prop-jvm-and-js.md) | `val propJvmAndJs: Int` |
### Functions
-| [bothJvmAndJs](test/foo/-foo/both-jvm-and-js) | `fun bothJvmAndJs(): Unit` |
-| [js](test/foo/-foo/js)<br>(JS) | `fun js(): Unit` |
-| [jvm](test/foo/-foo/jvm)<br>(JVM) | `fun jvm(): Unit` |
+| [bothJvmAndJs](both-jvm-and-js.md) | `fun bothJvmAndJs(): Unit` |
+| [js](js.md)<br>(JS) | `fun js(): Unit` |
+| [jvm](jvm.md)<br>(JVM) | `fun jvm(): Unit` |
diff --git a/core/testdata/format/multiplatform/merge/multiplatform.package.md b/core/testdata/format/multiplatform/merge/multiplatform.package.md
index 8e463327..ea78b5a3 100644
--- a/core/testdata/format/multiplatform/merge/multiplatform.package.md
+++ b/core/testdata/format/multiplatform/merge/multiplatform.package.md
@@ -1,4 +1,4 @@
-[test](test/index) / [foo](test/foo/index)
+[test](../index.md) / [foo](./index.md)
## Package foo
@@ -6,5 +6,5 @@
### Types
-| [Foo](test/foo/-foo/index)<br>(JVM, JS) | `class Foo`<br>This is a foo. |
+| [Foo](-foo/index.md)<br>(JVM, JS) | `class Foo`<br>This is a foo. |
diff --git a/core/testdata/format/multiplatform/mergeMembers/foo.md b/core/testdata/format/multiplatform/mergeMembers/foo.md
index 7490c878..7f41b7d1 100644
--- a/core/testdata/format/multiplatform/mergeMembers/foo.md
+++ b/core/testdata/format/multiplatform/mergeMembers/foo.md
@@ -1,4 +1,4 @@
-[test](test/index) / [foo](test/foo/index) / [Foo](test/foo/-foo/index)
+[test](../../index.md) / [foo](../index.md) / [Foo](./index.md)
# Foo
@@ -10,17 +10,17 @@ This is a foo.
### Constructors
-| [&lt;init&gt;](test/foo/-foo/-init-) | `Foo()`<br>This is a foo. |
+| [&lt;init&gt;](-init-.md) | `Foo()`<br>This is a foo. |
### Properties
-| [propJs](test/foo/-foo/prop-js)<br>(JS) | `val propJs: String` |
-| [propJvm](test/foo/-foo/prop-jvm)<br>(JVM) | `val propJvm: String` |
-| [propJvmAndJs](test/foo/-foo/prop-jvm-and-js) | `val propJvmAndJs: Int` |
+| [propJs](prop-js.md)<br>(JS) | `val propJs: String` |
+| [propJvm](prop-jvm.md)<br>(JVM) | `val propJvm: String` |
+| [propJvmAndJs](prop-jvm-and-js.md) | `val propJvmAndJs: Int` |
### Functions
-| [bothJvmAndJs](test/foo/-foo/both-jvm-and-js) | `fun bothJvmAndJs(): Unit` |
-| [js](test/foo/-foo/js)<br>(JS) | `fun js(): Unit` |
-| [jvm](test/foo/-foo/jvm)<br>(JVM) | `fun jvm(): Unit` |
+| [bothJvmAndJs](both-jvm-and-js.md) | `fun bothJvmAndJs(): Unit` |
+| [js](js.md)<br>(JS) | `fun js(): Unit` |
+| [jvm](jvm.md)<br>(JVM) | `fun jvm(): Unit` |
diff --git a/core/testdata/format/multiplatform/omitRedundant/foo.md b/core/testdata/format/multiplatform/omitRedundant/foo.md
index 088ced2c..a20b14cf 100644
--- a/core/testdata/format/multiplatform/omitRedundant/foo.md
+++ b/core/testdata/format/multiplatform/omitRedundant/foo.md
@@ -1,4 +1,4 @@
-[test](test/index) / [foo](test/foo/index) / [Foo](test/foo/-foo/index)
+[test](../../index.md) / [foo](../index.md) / [Foo](./index.md)
# Foo
@@ -10,13 +10,13 @@ This is a foo.
### Constructors
-| [&lt;init&gt;](test/foo/-foo/-init-) | `Foo()`<br>This is a foo. |
+| [&lt;init&gt;](-init-.md) | `Foo()`<br>This is a foo. |
### Properties
-| [propJvm](test/foo/-foo/prop-jvm) | `val propJvm: String` |
+| [propJvm](prop-jvm.md) | `val propJvm: String` |
### Functions
-| [jvm](test/foo/-foo/jvm) | `fun jvm(): Unit` |
+| [jvm](jvm.md) | `fun jvm(): Unit` |
diff --git a/core/testdata/format/multiplatform/packagePlatformsFromMembers/multiplatform.index.md b/core/testdata/format/multiplatform/packagePlatformsFromMembers/multiplatform.index.md
index 1dda25d4..6f45342b 100644
--- a/core/testdata/format/multiplatform/packagePlatformsFromMembers/multiplatform.index.md
+++ b/core/testdata/format/multiplatform/packagePlatformsFromMembers/multiplatform.index.md
@@ -1,10 +1,10 @@
-[test](test/index)
+[test](./index.md)
**Platform and version requirements:** JVM, JS
### Packages
-| [foo.bar](test/foo.bar/index)<br>(JVM, JS) | |
+| [foo.bar](foo.bar/index.md)<br>(JVM, JS) | |
### Index
diff --git a/core/testdata/format/multiplatform/packagePlatformsFromMembers/multiplatform.package.md b/core/testdata/format/multiplatform/packagePlatformsFromMembers/multiplatform.package.md
index 2921cdd1..4ddfe2e3 100644
--- a/core/testdata/format/multiplatform/packagePlatformsFromMembers/multiplatform.package.md
+++ b/core/testdata/format/multiplatform/packagePlatformsFromMembers/multiplatform.package.md
@@ -1,4 +1,4 @@
-[test](test/index) / [foo.bar](test/foo.bar/index)
+[test](../index.md) / [foo.bar](./index.md)
## Package foo.bar
@@ -6,5 +6,5 @@
### Functions
-| [buz](test/foo.bar/buz)<br>(JVM, JS) | `fun buz(): Unit` |
+| [buz](buz.md)<br>(JVM, JS) | `fun buz(): Unit` |
diff --git a/core/testdata/format/multiplatform/packagePlatformsWithExtExtensions/multiplatform.index.md b/core/testdata/format/multiplatform/packagePlatformsWithExtExtensions/multiplatform.index.md
index f6e770b2..f4186b6e 100644
--- a/core/testdata/format/multiplatform/packagePlatformsWithExtExtensions/multiplatform.index.md
+++ b/core/testdata/format/multiplatform/packagePlatformsWithExtExtensions/multiplatform.index.md
@@ -1,10 +1,10 @@
-[test](test/index)
+[test](./index.md)
**Platform and version requirements:** JVM
### Packages
-| [some](test/some/index)<br>(JVM) | |
+| [some](some/index.md)<br>(JVM) | |
### Index
diff --git a/core/testdata/format/multiplatform/packagePlatformsWithExtExtensions/multiplatform.package.md b/core/testdata/format/multiplatform/packagePlatformsWithExtExtensions/multiplatform.package.md
index 22f778d6..ff480b5a 100644
--- a/core/testdata/format/multiplatform/packagePlatformsWithExtExtensions/multiplatform.package.md
+++ b/core/testdata/format/multiplatform/packagePlatformsWithExtExtensions/multiplatform.package.md
@@ -1,4 +1,4 @@
-[test](test/index) / [some](test/some/index)
+[test](../index.md) / [some](./index.md)
## Package some
@@ -6,5 +6,5 @@
### Extensions for External Classes
-| [kotlin.String](test/some/kotlin.-string/index) | |
+| [kotlin.String](kotlin.-string/index.md) | |
diff --git a/core/testdata/format/multiplatform/simple/multiplatform.package.md b/core/testdata/format/multiplatform/simple/multiplatform.package.md
index 3574942c..fad7e90d 100644
--- a/core/testdata/format/multiplatform/simple/multiplatform.package.md
+++ b/core/testdata/format/multiplatform/simple/multiplatform.package.md
@@ -1,9 +1,9 @@
-[test](test/index) / [foo](test/foo/index)
+[test](../index.md) / [foo](./index.md)
## Package foo
### Types
-| [Bar](test/foo/-bar/index)<br>(JS) | `class Bar`<br>This is a bar. |
-| [Foo](test/foo/-foo/index)<br>(JVM) | `class Foo`<br>This is a foo. |
+| [Bar](-bar/index.md)<br>(JS) | `class Bar`<br>This is a bar. |
+| [Foo](-foo/index.md)<br>(JVM) | `class Foo`<br>This is a foo. |
diff --git a/core/testdata/format/multipleTypeParameterConstraints.md b/core/testdata/format/multipleTypeParameterConstraints.md
index 5dd45e4e..78586aca 100644
--- a/core/testdata/format/multipleTypeParameterConstraints.md
+++ b/core/testdata/format/multipleTypeParameterConstraints.md
@@ -1,13 +1,18 @@
-[test](test/index) / [A](test/-a)
+<!-- File: test/-a.md -->
+[test](index.md) / [A](./-a.md)
# A
-`interface A`[test](test/index) / [B](test/-b)
+`interface A`
+<!-- File: test/-b.md -->
+[test](index.md) / [B](./-b.md)
# B
-`interface B`[test](test/index) / [f](test/f)
+`interface B`
+<!-- File: test/f.md -->
+[test](index.md) / [f](./f.md)
# f
-`fun <T> f(): Unit where T : `[`A`](test/-a)`, T : `[`B`](test/-b) \ No newline at end of file
+`fun <T> f(): Unit where T : `[`A`](-a.md)`, T : `[`B`](-b.md) \ No newline at end of file
diff --git a/core/testdata/format/nestedLists.md b/core/testdata/format/nestedLists.md
index dd151944..fb25bc32 100644
--- a/core/testdata/format/nestedLists.md
+++ b/core/testdata/format/nestedLists.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Bar](test/-bar/index)
+[test](../index.md) / [Bar](./index.md)
# Bar
@@ -8,36 +8,36 @@ Usage instructions:
* **Rinse**
1. Alter any rinse options *(optional)*
- * Recommended to [Bar.useSoap](test/-bar/use-soap)
+ * Recommended to [Bar.useSoap](use-soap.md)
* Optionally apply [Bar.elbowGrease](#) for best results
- 2. [Bar.rinse](test/-bar/rinse) to begin rinse
- 1. Thus you should call [Bar.rinse](test/-bar/rinse)
- 2. *Then* call [Bar.repeat](test/-bar/repeat)
+ 2. [Bar.rinse](rinse.md) to begin rinse
+ 1. Thus you should call [Bar.rinse](rinse.md)
+ 2. *Then* call [Bar.repeat](repeat.md)
* Don't forget to use:
* Soap
* Elbow Grease
- 3. Finally, adjust soap usage [Bar.useSoap](test/-bar/use-soap) as needed
- 3. Repeat with [Bar.repeat](test/-bar/repeat)
+ 3. Finally, adjust soap usage [Bar.useSoap](use-soap.md) as needed
+ 3. Repeat with [Bar.repeat](repeat.md)
* **Repeat**
* Will use previously used rinse options
- * [Bar.rinse](test/-bar/rinse) must have been called once before
+ * [Bar.rinse](rinse.md) must have been called once before
* Can be repeated any number of times
* Options include:
- * [Bar.useSoap](test/-bar/use-soap)
- * [Bar.useElbowGrease](test/-bar/use-elbow-grease)
+ * [Bar.useSoap](use-soap.md)
+ * [Bar.useElbowGrease](use-elbow-grease.md)
### Constructors
-| [&lt;init&gt;](test/-bar/-init-) | `Bar()`<br>Usage instructions: |
+| [&lt;init&gt;](-init-.md) | `Bar()`<br>Usage instructions: |
### Properties
-| [useElbowGrease](test/-bar/use-elbow-grease) | `var useElbowGrease: Boolean` |
-| [useSoap](test/-bar/use-soap) | `var useSoap: Boolean` |
+| [useElbowGrease](use-elbow-grease.md) | `var useElbowGrease: Boolean` |
+| [useSoap](use-soap.md) | `var useSoap: Boolean` |
### Functions
-| [repeat](test/-bar/repeat) | `fun repeat(): Unit` |
-| [rinse](test/-bar/rinse) | `fun rinse(): Unit` |
+| [repeat](repeat.md) | `fun repeat(): Unit` |
+| [rinse](rinse.md) | `fun rinse(): Unit` |
diff --git a/core/testdata/format/newlineInTableCell.package.md b/core/testdata/format/newlineInTableCell.package.md
index 4b3875ba..53716db3 100644
--- a/core/testdata/format/newlineInTableCell.package.md
+++ b/core/testdata/format/newlineInTableCell.package.md
@@ -1,8 +1,8 @@
-[test](test/index)
+[test](./index.md)
## Package &lt;root&gt;
### Types
-| [A](test/-a/index) | `class A`<br>There is `long long int` story full of new lines |
+| [A](-a/index.md) | `class A`<br>There is `long long int` story full of new lines |
diff --git a/core/testdata/format/notPublishedTypeAliasAutoExpansion.md b/core/testdata/format/notPublishedTypeAliasAutoExpansion.md
index 9e0f1560..ca95093c 100644
--- a/core/testdata/format/notPublishedTypeAliasAutoExpansion.md
+++ b/core/testdata/format/notPublishedTypeAliasAutoExpansion.md
@@ -1,9 +1,9 @@
-[test](test/index) / [foo](test/foo)
+[test](index.md) / [foo](./foo.md)
# foo
`fun foo(): Unit`
-Correct ref [TA](test/-a/index)
-Correct ref [TB](test/-b/index)
+Correct ref [TA](-a/index.md)
+Correct ref [TB](-b/index.md)
diff --git a/core/testdata/format/nullability.md b/core/testdata/format/nullability.md
index 014eb485..7b81c255 100644
--- a/core/testdata/format/nullability.md
+++ b/core/testdata/format/nullability.md
@@ -1,4 +1,4 @@
-[test](test/index) / [C](test/-c/index)
+[test](../index.md) / [C](./index.md)
# C
@@ -6,9 +6,9 @@
### Constructors
-| [&lt;init&gt;](test/-c/-init-) | `C()` |
+| [&lt;init&gt;](-init-.md) | `C()` |
### Functions
-| [foo](test/-c/foo) | `fun foo(): Comparable<`[`T`](test/-c/index#T)`>?` |
+| [foo](foo.md) | `fun foo(): Comparable<`[`T`](index.md#T)`>?` |
diff --git a/core/testdata/format/operatorOverloading.md b/core/testdata/format/operatorOverloading.md
index 8e8d36eb..0a4c87b6 100644
--- a/core/testdata/format/operatorOverloading.md
+++ b/core/testdata/format/operatorOverloading.md
@@ -1,5 +1,5 @@
-[test](test/index) / [C](test/-c/index) / [plus](test/-c/plus)
+[test](../index.md) / [C](index.md) / [plus](./plus.md)
# plus
-`fun plus(other: `[`C`](test/-c/index)`): `[`C`](test/-c/index) \ No newline at end of file
+`fun plus(other: `[`C`](index.md)`): `[`C`](index.md) \ No newline at end of file
diff --git a/core/testdata/format/orderedList.html b/core/testdata/format/orderedList.html
index 66f37876..6f735bfd 100644
--- a/core/testdata/format/orderedList.html
+++ b/core/testdata/format/orderedList.html
@@ -4,7 +4,7 @@
<title>Bar - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-bar/index">Bar</a><br/>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">Bar</a><br/>
<br/>
<h1>Bar</h1>
<code><span class="keyword">class </span><span class="identifier">Bar</span></code>
@@ -17,7 +17,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/-bar/-init-">&lt;init&gt;</a></p>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
</td>
<td>
<code><span class="identifier">Bar</span><span class="symbol">(</span><span class="symbol">)</span></code>
diff --git a/core/testdata/format/overloads.html b/core/testdata/format/overloads.html
index d0f7f37d..feda82e4 100644
--- a/core/testdata/format/overloads.html
+++ b/core/testdata/format/overloads.html
@@ -4,7 +4,7 @@
<title>root package - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a><br/>
+<a href="./index.html">test</a><br/>
<br/>
<h2>Package &lt;root&gt;</h2>
<h3>Functions</h3>
@@ -12,7 +12,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/f">f</a></p>
+<p><a href="f.html">f</a></p>
</td>
<td>
<code><span class="keyword">fun </span><span class="identifier">f</span><span class="symbol">(</span><span class="identifier" id="$f(kotlin.Int)/x">x</span><span class="symbol">:</span>&nbsp;<span class="identifier">Int</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/>
diff --git a/core/testdata/format/overloadsWithDescription.html b/core/testdata/format/overloadsWithDescription.html
index fe98b8fe..16b03f7e 100644
--- a/core/testdata/format/overloadsWithDescription.html
+++ b/core/testdata/format/overloadsWithDescription.html
@@ -4,14 +4,14 @@
<title>f - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/f">f</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./f.html">f</a><br/>
<br/>
<h1>f</h1>
<a name="$f(kotlin.Int)"></a>
<code><span class="keyword">fun </span><span class="identifier">f</span><span class="symbol">(</span><span class="identifier" id="$f(kotlin.Int)/x">x</span><span class="symbol">:</span>&nbsp;<span class="identifier">Int</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/>
<a name="$f(kotlin.String)"></a>
<code><span class="keyword">fun </span><span class="identifier">f</span><span class="symbol">(</span><span class="identifier" id="$f(kotlin.String)/x">x</span><span class="symbol">:</span>&nbsp;<span class="identifier">String</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code>
-<p>Performs an action on <a href="test/f#$f(kotlin.Int)/x">x</a>.</p>
+<p>Performs an action on <a href="f.html#$f(kotlin.Int)/x">x</a>.</p>
<p>This is a long description.</p>
<h3>Parameters</h3>
<p><a name="x"></a>
diff --git a/core/testdata/format/overloadsWithDifferentDescriptions.html b/core/testdata/format/overloadsWithDifferentDescriptions.html
index 1f086039..4c4f7f74 100644
--- a/core/testdata/format/overloadsWithDifferentDescriptions.html
+++ b/core/testdata/format/overloadsWithDifferentDescriptions.html
@@ -4,7 +4,7 @@
<title>f - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/f">f</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./f.html">f</a><br/>
<br/>
<h1>f</h1>
<a name="$f(kotlin.Int)"></a>
diff --git a/core/testdata/format/overridingFunction.md b/core/testdata/format/overridingFunction.md
index dcc1c426..d0ec82fa 100644
--- a/core/testdata/format/overridingFunction.md
+++ b/core/testdata/format/overridingFunction.md
@@ -1,8 +1,8 @@
-[test](test/index) / [D](test/-d/index) / [f](test/-d/f)
+[test](../index.md) / [D](index.md) / [f](./f.md)
# f
`fun f(): Unit`
-Overrides [C.f](test/-c/f)
+Overrides [C.f](../-c/f.md)
diff --git a/core/testdata/format/paramTag.md b/core/testdata/format/paramTag.md
index d3e948ae..7cc33d21 100644
--- a/core/testdata/format/paramTag.md
+++ b/core/testdata/format/paramTag.md
@@ -1,4 +1,4 @@
-[test](test/index) / [f](test/f)
+[test](index.md) / [f](./f.md)
# f
diff --git a/core/testdata/format/parameterAnchor.html b/core/testdata/format/parameterAnchor.html
index 3ffcf595..a4ae0997 100644
--- a/core/testdata/format/parameterAnchor.html
+++ b/core/testdata/format/parameterAnchor.html
@@ -4,12 +4,12 @@
<title>processFiles - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/process-files">processFiles</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./process-files.html">processFiles</a><br/>
<br/>
<h1>processFiles</h1>
<a name="$processFiles(kotlin.Function0((processFiles.T)))"></a>
-<code><span class="keyword">fun </span><span class="symbol">&lt;</span><span class="identifier">T</span><span class="symbol">&gt;</span> <span class="identifier">processFiles</span><span class="symbol">(</span><span class="identifier" id="$processFiles(kotlin.Function0((processFiles.T)))/processor">processor</span><span class="symbol">:</span>&nbsp;<span class="symbol">(</span><span class="symbol">)</span>&nbsp;<span class="symbol">-&gt;</span>&nbsp;<a href="test/process-files#T"><span class="identifier">T</span></a><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">List</span><span class="symbol">&lt;</span><a href="test/process-files#T"><span class="identifier">T</span></a><span class="symbol">&gt;</span></code>
-<p>Runs <a href="test/process-files#$processFiles(kotlin.Function0((processFiles.T)))/processor">processor</a> for each file and collects its results into single list</p>
+<code><span class="keyword">fun </span><span class="symbol">&lt;</span><span class="identifier">T</span><span class="symbol">&gt;</span> <span class="identifier">processFiles</span><span class="symbol">(</span><span class="identifier" id="$processFiles(kotlin.Function0((processFiles.T)))/processor">processor</span><span class="symbol">:</span>&nbsp;<span class="symbol">(</span><span class="symbol">)</span>&nbsp;<span class="symbol">-&gt;</span>&nbsp;<a href="process-files.html#T"><span class="identifier">T</span></a><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">List</span><span class="symbol">&lt;</span><a href="process-files.html#T"><span class="identifier">T</span></a><span class="symbol">&gt;</span></code>
+<p>Runs <a href="process-files.html#$processFiles(kotlin.Function0((processFiles.T)))/processor">processor</a> for each file and collects its results into single list</p>
<h3>Parameters</h3>
<p><a name="processor"></a>
<code>processor</code> - function to receive context for symbol resolution and file for processing</p>
diff --git a/core/testdata/format/parenthesis.html b/core/testdata/format/parenthesis.html
index 6f3c1d6b..c63154c1 100644
--- a/core/testdata/format/parenthesis.html
+++ b/core/testdata/format/parenthesis.html
@@ -4,7 +4,7 @@
<title>foo - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/foo">foo</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./foo.html">foo</a><br/>
<br/>
<h1>foo</h1>
<a name="$foo()"></a>
diff --git a/core/testdata/format/propertyVar.md b/core/testdata/format/propertyVar.md
index 8232dff4..887d25a5 100644
--- a/core/testdata/format/propertyVar.md
+++ b/core/testdata/format/propertyVar.md
@@ -1,4 +1,4 @@
-[test](test/index) / [x](test/x)
+[test](index.md) / [x](./x.md)
# x
diff --git a/core/testdata/format/qualifiedNameLink.md b/core/testdata/format/qualifiedNameLink.md
index 590bb435..92fa8f7a 100644
--- a/core/testdata/format/qualifiedNameLink.md
+++ b/core/testdata/format/qualifiedNameLink.md
@@ -1,4 +1,4 @@
-[test](test/index) / [foo](test/foo)
+[test](index.md) / [foo](./foo.md)
# foo
diff --git a/core/testdata/format/receiverParameterTypeBound.md b/core/testdata/format/receiverParameterTypeBound.md
index 9c767449..978dc0f8 100644
--- a/core/testdata/format/receiverParameterTypeBound.md
+++ b/core/testdata/format/receiverParameterTypeBound.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Foo](test/-foo/index)
+[test](../index.md) / [Foo](./index.md)
# Foo
@@ -6,9 +6,9 @@
### Constructors
-| [&lt;init&gt;](test/-foo/-init-) | `Foo()` |
+| [&lt;init&gt;](-init-.md) | `Foo()` |
### Extension Functions
-| [xyzzy](test/xyzzy) | `fun <T : `[`Foo`](test/-foo/index)`> `[`T`](test/xyzzy#T)`.xyzzy(): Unit` |
+| [xyzzy](../xyzzy.md) | `fun <T : `[`Foo`](./index.md)`> `[`T`](../xyzzy.md#T)`.xyzzy(): Unit` |
diff --git a/core/testdata/format/receiverReference.md b/core/testdata/format/receiverReference.md
index 1584b2b1..bdcce322 100644
--- a/core/testdata/format/receiverReference.md
+++ b/core/testdata/format/receiverReference.md
@@ -1,6 +1,6 @@
-[test](test/index) / [kotlin.String](test/kotlin.-string/index)
+[test](../index.md) / [kotlin.String](./index.md)
### Extensions for kotlin.String
-| [some](test/kotlin.-string/some) | `fun String.some(): Unit`<br>Prints [this](test/kotlin.-string/some/-this-) |
+| [some](some.md) | `fun String.some(): Unit`<br>Prints [this](some/-this-.md) |
diff --git a/core/testdata/format/referenceLink.md b/core/testdata/format/referenceLink.md
index b3d89e0d..ee910cbf 100644
--- a/core/testdata/format/referenceLink.md
+++ b/core/testdata/format/referenceLink.md
@@ -1,14 +1,16 @@
-[test](test/index) / [example](test/example/index) / [a](test/example/a)
+<!-- File: test/example/a.md -->
+[test](../index.md) / [example](index.md) / [a](./a.md)
# a
`fun a(): Unit`
-It is link to [example other func](test/example/some-other-func)
+It is link to [example other func](some-other-func.md)
-Sure, it is [example](test/example/some-other-func)
+Sure, it is [example](some-other-func.md)
-[test](test/index) / [example](test/example/index) / [someOtherFunc](test/example/some-other-func)
+<!-- File: test/example/some-other-func.md -->
+[test](../index.md) / [example](index.md) / [someOtherFunc](./some-other-func.md)
# someOtherFunc
diff --git a/core/testdata/format/reifiedTypeParameter.md b/core/testdata/format/reifiedTypeParameter.md
index 253f2438..40dbed7b 100644
--- a/core/testdata/format/reifiedTypeParameter.md
+++ b/core/testdata/format/reifiedTypeParameter.md
@@ -1,4 +1,4 @@
-[test](test/index) / [f](test/f)
+[test](index.md) / [f](./f.md)
# f
diff --git a/core/testdata/format/renderFunctionalTypeInParenthesisWhenItIsReceiver.md b/core/testdata/format/renderFunctionalTypeInParenthesisWhenItIsReceiver.md
index c9856976..ad632fef 100644
--- a/core/testdata/format/renderFunctionalTypeInParenthesisWhenItIsReceiver.md
+++ b/core/testdata/format/renderFunctionalTypeInParenthesisWhenItIsReceiver.md
@@ -1,6 +1,6 @@
-[test](test/index) / [kotlin.SuspendFunction0](test/kotlin.-suspend-function0/index)
+[test](../index.md) / [kotlin.SuspendFunction0](./index.md)
### Extensions for kotlin.SuspendFunction0
-| [foo](test/kotlin.-suspend-function0/foo) | `fun (suspend () -> Unit).foo(): Unit` |
+| [foo](foo.md) | `fun (suspend () -> Unit).foo(): Unit` |
diff --git a/core/testdata/format/returnWithLink.html b/core/testdata/format/returnWithLink.html
index f6e918dd..fe1d031b 100644
--- a/core/testdata/format/returnWithLink.html
+++ b/core/testdata/format/returnWithLink.html
@@ -4,12 +4,12 @@
<title>foo - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/foo">foo</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./foo.html">foo</a><br/>
<br/>
<h1>foo</h1>
<a name="$foo(kotlin.String)"></a>
<code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="identifier" id="$foo(kotlin.String)/s1">s1</span><span class="symbol">:</span>&nbsp;<span class="identifier">String</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">String</span></code>
<p><strong>Return</strong><br/>
-Returns <a href="test/foo#$foo(kotlin.String)/s1">s1</a> and does nothing else.</p>
+Returns <a href="foo.html#$foo(kotlin.String)/s1">s1</a> and does nothing else.</p>
</BODY>
</HTML>
diff --git a/core/testdata/format/sampleByFQName.md b/core/testdata/format/sampleByFQName.md
index 06333e13..7093179d 100644
--- a/core/testdata/format/sampleByFQName.md
+++ b/core/testdata/format/sampleByFQName.md
@@ -1,8 +1,11 @@
-[test](test/index) / [test](test/test/index) / [sample](test/test/sample)
+<!-- File: test/test/sample.md -->
+[test](../index.md) / [test](index.md) / [sample](./sample.md)
# sample
-`fun sample(): Unit`[test](test/index) / [test](test/test/index) / [use](test/test/use)
+`fun sample(): Unit`
+<!-- File: test/test/use.md -->
+[test](../index.md) / [test](index.md) / [use](./use.md)
# use
diff --git a/core/testdata/format/sampleByShortName.md b/core/testdata/format/sampleByShortName.md
index 06333e13..7093179d 100644
--- a/core/testdata/format/sampleByShortName.md
+++ b/core/testdata/format/sampleByShortName.md
@@ -1,8 +1,11 @@
-[test](test/index) / [test](test/test/index) / [sample](test/test/sample)
+<!-- File: test/test/sample.md -->
+[test](../index.md) / [test](index.md) / [sample](./sample.md)
# sample
-`fun sample(): Unit`[test](test/index) / [test](test/test/index) / [use](test/test/use)
+`fun sample(): Unit`
+<!-- File: test/test/use.md -->
+[test](../index.md) / [test](index.md) / [use](./use.md)
# use
diff --git a/core/testdata/format/see.html b/core/testdata/format/see.html
index d350d6b7..74773951 100644
--- a/core/testdata/format/see.html
+++ b/core/testdata/format/see.html
@@ -1,22 +1,43 @@
+<!-- File: test/quux.html -->
<HTML>
<HEAD>
<meta charset="UTF-8">
+<title>quux - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/quux">quux</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./quux.html">quux</a><br/>
<br/>
<h1>quux</h1>
<a name="$quux()"></a>
<code><span class="keyword">fun </span><span class="identifier">quux</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code>
<p><strong>See Also</strong><br/>
-<p><a href="test/foo">foo</a></p>
-<p><a href="test/bar">bar</a></p>
+<p><a href="foo.html">foo</a></p>
+<p><a href="bar.html">bar</a></p>
</p>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/foo">foo</a><br/>
+</BODY>
+</HTML>
+<!-- File: test/foo.html -->
+<HTML>
+<HEAD>
+<meta charset="UTF-8">
+<title>foo - test</title>
+</HEAD>
+<BODY>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./foo.html">foo</a><br/>
<br/>
<h1>foo</h1>
<a name="$foo()"></a>
-<code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/bar">bar</a><br/>
+<code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code>
+</BODY>
+</HTML>
+<!-- File: test/bar.html -->
+<HTML>
+<HEAD>
+<meta charset="UTF-8">
+<title>bar - test</title>
+</HEAD>
+<BODY>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./bar.html">bar</a><br/>
<br/>
<h1>bar</h1>
<a name="$bar()"></a>
diff --git a/core/testdata/format/shadowedExtensionFunctions.md b/core/testdata/format/shadowedExtensionFunctions.md
index 3b0a9dc9..f900ecb2 100644
--- a/core/testdata/format/shadowedExtensionFunctions.md
+++ b/core/testdata/format/shadowedExtensionFunctions.md
@@ -1,15 +1,15 @@
-[test](test/index) / [Bar](test/-bar/index)
+[test](../index.md) / [Bar](./index.md)
# Bar
-`class Bar : `[`Foo`](test/-foo/index)
+`class Bar : `[`Foo`](../-foo/index.md)
### Constructors
-| [&lt;init&gt;](test/-bar/-init-) | `Bar()` |
+| [&lt;init&gt;](-init-.md) | `Bar()` |
### Extension Functions
-| [shazam](test/shazam) | `fun `[`Bar`](test/-bar/index)`.shazam(i: Int): Unit`<br>`fun `[`Foo`](test/-foo/index)`.shazam(): Unit` |
-| [xyzzy](test/xyzzy) | `fun `[`Bar`](test/-bar/index)`.xyzzy(): Unit` |
+| [shazam](../shazam.md) | `fun `[`Bar`](./index.md)`.shazam(i: Int): Unit`<br>`fun `[`Foo`](../-foo/index.md)`.shazam(): Unit` |
+| [xyzzy](../xyzzy.md) | `fun `[`Bar`](./index.md)`.xyzzy(): Unit` |
diff --git a/core/testdata/format/sinceKotlin.html b/core/testdata/format/sinceKotlin.html
index ab25a002..32988de2 100644
--- a/core/testdata/format/sinceKotlin.html
+++ b/core/testdata/format/sinceKotlin.html
@@ -4,7 +4,7 @@
<title>Since1.1 - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-since1.1/index">Since1.1</a><br/>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">Since1.1</a><br/>
<br/>
<h1>Since1.1</h1>
<code><span class="keyword">class </span><span class="identifier">Since1.1</span></code>
@@ -15,7 +15,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/-since1.1/-init-">&lt;init&gt;</a></p>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
</td>
<td>
<code><span class="identifier">Since1.1</span><span class="symbol">(</span><span class="symbol">)</span></code>
diff --git a/core/testdata/format/sinceKotlin.md b/core/testdata/format/sinceKotlin.md
index a1abe5fd..df96db0a 100644
--- a/core/testdata/format/sinceKotlin.md
+++ b/core/testdata/format/sinceKotlin.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Since1.1](test/-since1.1/index)
+[test](../index.md) / [Since1.1](./index.md)
# Since1.1
@@ -10,5 +10,5 @@ Useful
### Constructors
-| [&lt;init&gt;](test/-since1.1/-init-) | `Since1.1()`<br>Useful |
+| [&lt;init&gt;](-init-.md) | `Since1.1()`<br>Useful |
diff --git a/core/testdata/format/sinceKotlin.package.md b/core/testdata/format/sinceKotlin.package.md
index c811749c..eabf88d5 100644
--- a/core/testdata/format/sinceKotlin.package.md
+++ b/core/testdata/format/sinceKotlin.package.md
@@ -1,4 +1,4 @@
-[test](test/index)
+[test](./index.md)
## Package &lt;root&gt;
@@ -6,5 +6,5 @@
### Types
-| [Since1.1](test/-since1.1/index)<br>(Kotlin 1.1) | `class Since1.1`<br>Useful |
+| [Since1.1](-since1.1/index.md)<br>(Kotlin 1.1) | `class Since1.1`<br>Useful |
diff --git a/core/testdata/format/sinceKotlinWide.package.md b/core/testdata/format/sinceKotlinWide.package.md
index f683b178..58a5045e 100644
--- a/core/testdata/format/sinceKotlinWide.package.md
+++ b/core/testdata/format/sinceKotlinWide.package.md
@@ -1,4 +1,4 @@
-[test](test/index)
+[test](./index.md)
## Package &lt;root&gt;
@@ -6,6 +6,6 @@
### Types
-| [Since1.1](test/-since1.1/index)<br>(Kotlin 1.1) | `class Since1.1`<br>Useful |
-| [Since1.2](test/-since1.2/index)<br>(Kotlin 1.2) | `class Since1.2`<br>Useful also |
+| [Since1.1](-since1.1/index.md)<br>(Kotlin 1.1) | `class Since1.1`<br>Useful |
+| [Since1.2](-since1.2/index.md)<br>(Kotlin 1.2) | `class Since1.2`<br>Useful also |
diff --git a/core/testdata/format/starProjection.md b/core/testdata/format/starProjection.md
index 6f796e77..5a53e5b9 100644
--- a/core/testdata/format/starProjection.md
+++ b/core/testdata/format/starProjection.md
@@ -1,6 +1,6 @@
-[test](test/index) / [kotlin.collections.Iterable](test/kotlin.collections.-iterable/index)
+[test](../index.md) / [kotlin.collections.Iterable](./index.md)
### Extensions for kotlin.collections.Iterable
-| [containsFoo](test/kotlin.collections.-iterable/contains-foo) | `fun Iterable<*>.containsFoo(element: Any?): Boolean` |
+| [containsFoo](contains-foo.md) | `fun Iterable<*>.containsFoo(element: Any?): Boolean` |
diff --git a/core/testdata/format/summarizeSignatures.md b/core/testdata/format/summarizeSignatures.md
index c1830fb5..4f494166 100644
--- a/core/testdata/format/summarizeSignatures.md
+++ b/core/testdata/format/summarizeSignatures.md
@@ -1,14 +1,14 @@
-[test](test/index) / [kotlin](test/kotlin/index)
+[test](../index.md) / [kotlin](./index.md)
## Package kotlin
### Types
-| [Array](test/kotlin/-array/index) | `class Array<T>` |
-| [CharArray](test/kotlin/-char-array/index) | `class CharArray` |
-| [IntArray](test/kotlin/-int-array/index) | `class IntArray` |
+| [Array](-array/index.md) | `class Array<T>` |
+| [CharArray](-char-array/index.md) | `class CharArray` |
+| [IntArray](-int-array/index.md) | `class IntArray` |
### Functions
-| [foo](test/kotlin/foo) | `fun <T> any_array<T>.foo(predicate: (`[`T`](test/kotlin/foo#T)`) -> Boolean): Boolean`<br>Returns true if foo. |
+| [foo](foo.md) | `fun <T> any_array<T>.foo(predicate: (`[`T`](foo.md#T)`) -> Boolean): Boolean`<br>Returns true if foo. |
diff --git a/core/testdata/format/summarizeSignaturesProperty.md b/core/testdata/format/summarizeSignaturesProperty.md
index 712aebd4..507ad6a5 100644
--- a/core/testdata/format/summarizeSignaturesProperty.md
+++ b/core/testdata/format/summarizeSignaturesProperty.md
@@ -1,14 +1,14 @@
-[test](test/index) / [kotlin](test/kotlin/index)
+[test](../index.md) / [kotlin](./index.md)
## Package kotlin
### Types
-| [Array](test/kotlin/-array/index) | `class Array<T>` |
-| [CharArray](test/kotlin/-char-array/index) | `class CharArray` |
-| [IntArray](test/kotlin/-int-array/index) | `class IntArray` |
+| [Array](-array/index.md) | `class Array<T>` |
+| [CharArray](-char-array/index.md) | `class CharArray` |
+| [IntArray](-int-array/index.md) | `class IntArray` |
### Properties
-| [foo](test/kotlin/foo) | `val <T> any_array<T>.foo: Int`<br>Returns true if foo. |
+| [foo](foo.md) | `val <T> any_array<T>.foo: Int`<br>Returns true if foo. |
diff --git a/core/testdata/format/suspendParam.md b/core/testdata/format/suspendParam.md
index cf11f57b..ab116140 100644
--- a/core/testdata/format/suspendParam.md
+++ b/core/testdata/format/suspendParam.md
@@ -1,4 +1,4 @@
-[test](test/index) / [takesSuspendParam](test/takes-suspend-param)
+[test](index.md) / [takesSuspendParam](./takes-suspend-param.md)
# takesSuspendParam
diff --git a/core/testdata/format/suspendParam.package.md b/core/testdata/format/suspendParam.package.md
index 463ba356..92bd7ee7 100644
--- a/core/testdata/format/suspendParam.package.md
+++ b/core/testdata/format/suspendParam.package.md
@@ -1,8 +1,8 @@
-[test](test/index)
+[test](./index.md)
## Package &lt;root&gt;
### Functions
-| [takesSuspendParam](test/takes-suspend-param) | `fun takesSuspendParam(func: suspend () -> Unit): Unit` |
+| [takesSuspendParam](takes-suspend-param.md) | `fun takesSuspendParam(func: suspend () -> Unit): Unit` |
diff --git a/core/testdata/format/throwsTag.md b/core/testdata/format/throwsTag.md
index a476fa1b..70fba512 100644
--- a/core/testdata/format/throwsTag.md
+++ b/core/testdata/format/throwsTag.md
@@ -1,4 +1,4 @@
-[test](test/index) / [f](test/f)
+[test](index.md) / [f](./f.md)
# f
diff --git a/core/testdata/format/tokensInEmphasis.md b/core/testdata/format/tokensInEmphasis.md
index 79dde6f0..a68861de 100644
--- a/core/testdata/format/tokensInEmphasis.md
+++ b/core/testdata/format/tokensInEmphasis.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Bar](test/-bar/index)
+[test](../index.md) / [Bar](./index.md)
# Bar
@@ -6,15 +6,15 @@
Another emphasised class.
-*This class, [Bar](test/-bar/index) is just meh.*
+*This class, [Bar](./index.md) is just meh.*
-*For a semicolon; [Bar.foo](test/-bar/foo) is for you!.*
+*For a semicolon; [Bar.foo](foo.md) is for you!.*
### Constructors
-| [&lt;init&gt;](test/-bar/-init-) | `Bar()`<br>Another emphasised class. |
+| [&lt;init&gt;](-init-.md) | `Bar()`<br>Another emphasised class. |
### Functions
-| [foo](test/-bar/foo) | `fun foo(): String` |
+| [foo](foo.md) | `fun foo(): String` |
diff --git a/core/testdata/format/tokensInHeaders.md b/core/testdata/format/tokensInHeaders.md
index 46a1e9a5..bd25492e 100644
--- a/core/testdata/format/tokensInHeaders.md
+++ b/core/testdata/format/tokensInHeaders.md
@@ -1,4 +1,4 @@
-[test](test/index) / [The](test/-the/index)
+[test](../index.md) / [The](./index.md)
# The
@@ -6,32 +6,32 @@
Why did the token cross the road?
-# Because it was Beer o'clock @ [The.bar](test/-the/bar)
+# Because it was Beer o'clock @ [The.bar](bar.md)
## But **waz *\[sic\]* [it](isitbeeroclock.com)** really?
-### [The.bar](test/-the/bar) has? [The.foo](test/-the/foo)est drinks ever!
+### [The.bar](bar.md) has? [The.foo](foo.md)est drinks ever!
-#### *[The.kotlinz](test/-the/kotlinz) is [The.bestests](test/-the/bestests), [Bar.none](test/-the/-bar/none)*
+#### *[The.kotlinz](kotlinz.md) is [The.bestests](bestests.md), [Bar.none](-bar/none.md)*
-##### So many lame code "puns" (in) [The.house](test/-the/house)
+##### So many lame code "puns" (in) [The.house](house.md)
###### End of the?? [Bar.line](#)! - we need to go back!
### Types
-| [Bar](test/-the/-bar/index) | `object Bar` |
+| [Bar](-bar/index.md) | `object Bar` |
### Constructors
-| [&lt;init&gt;](test/-the/-init-) | `The()`<br>Why did the token cross the road? |
+| [&lt;init&gt;](-init-.md) | `The()`<br>Why did the token cross the road? |
### Functions
-| [bar](test/-the/bar) | `fun bar(): Unit` |
-| [bestests](test/-the/bestests) | `fun bestests(): Unit` |
-| [foo](test/-the/foo) | `fun foo(): Unit` |
-| [house](test/-the/house) | `fun house(): Unit` |
-| [kotlinz](test/-the/kotlinz) | `fun kotlinz(): Unit` |
-| [line](test/-the/line) | `fun line(): Unit` |
+| [bar](bar.md) | `fun bar(): Unit` |
+| [bestests](bestests.md) | `fun bestests(): Unit` |
+| [foo](foo.md) | `fun foo(): Unit` |
+| [house](house.md) | `fun house(): Unit` |
+| [kotlinz](kotlinz.md) | `fun kotlinz(): Unit` |
+| [line](line.md) | `fun line(): Unit` |
diff --git a/core/testdata/format/tokensInStrong.md b/core/testdata/format/tokensInStrong.md
index e1abe030..2781656c 100644
--- a/core/testdata/format/tokensInStrong.md
+++ b/core/testdata/format/tokensInStrong.md
@@ -1,20 +1,20 @@
-[test](test/index) / [Yasc](test/-yasc/index)
+[test](../index.md) / [Yasc](./index.md)
# Yasc
`class Yasc`
-**YASC: [Yasc](test/-yasc/index) Yet Another Strong Class**
+**YASC: [Yasc](./index.md) Yet Another Strong Class**
-**This class, [Yasc](test/-yasc/index) *is* just meh.**
+**This class, [Yasc](./index.md) *is* just meh.**
-**For a semicolon; [Yasc.foo](test/-yasc/foo) is for you!.**
+**For a semicolon; [Yasc.foo](foo.md) is for you!.**
### Constructors
-| [&lt;init&gt;](test/-yasc/-init-) | `Yasc()`<br>**YASC: [Yasc](test/-yasc/index) Yet Another Strong Class** |
+| [&lt;init&gt;](-init-.md) | `Yasc()`<br>**YASC: [Yasc](./index.md) Yet Another Strong Class** |
### Functions
-| [foo](test/-yasc/foo) | `fun foo(): String` |
+| [foo](foo.md) | `fun foo(): String` |
diff --git a/core/testdata/format/tripleBackticks.html b/core/testdata/format/tripleBackticks.html
index bac3385c..dacd0567 100644
--- a/core/testdata/format/tripleBackticks.html
+++ b/core/testdata/format/tripleBackticks.html
@@ -4,7 +4,7 @@
<title>f - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/f">f</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./f.html">f</a><br/>
<br/>
<h1>f</h1>
<a name="$f()"></a>
diff --git a/core/testdata/format/typeAliases.md b/core/testdata/format/typeAliases.md
index 2a813c32..218c4848 100644
--- a/core/testdata/format/typeAliases.md
+++ b/core/testdata/format/typeAliases.md
@@ -1,63 +1,104 @@
-[test](test/index) / [A](test/-a/index)
+<!-- File: test/-a/index.md -->
+[test](../index.md) / [A](./index.md)
# A
-`class A`[test](test/index) / [B](test/-b/index)
+`class A`
+
+### Constructors
+
+| [&lt;init&gt;](-init-.md) | `A()` |
+
+<!-- File: test/-b/index.md -->
+[test](../index.md) / [B](./index.md)
# B
-`class B`[test](test/index) / [C](test/-c/index)
+`class B`
+
+### Constructors
+
+| [&lt;init&gt;](-init-.md) | `B()` |
+
+<!-- File: test/-c/index.md -->
+[test](../index.md) / [C](./index.md)
# C
-`class C<T>`[test](test/index) / [D](test/-d)
+`class C<T>`
+
+### Constructors
+
+| [&lt;init&gt;](-init-.md) | `C()` |
+
+<!-- File: test/-d.md -->
+[test](index.md) / [D](./-d.md)
# D
-`typealias D = `[`A`](test/-a/index)[test](test/index) / [E](test/-e)
+`typealias D = `[`A`](-a/index.md)
+<!-- File: test/-e.md -->
+[test](index.md) / [E](./-e.md)
# E
-`typealias E = `[`D`](test/-d)[test](test/index) / [F](test/-f)
+`typealias E = `[`D`](-d.md)
+<!-- File: test/-f.md -->
+[test](index.md) / [F](./-f.md)
# F
-`typealias F = (`[`A`](test/-a/index)`) -> `[`B`](test/-b/index)[test](test/index) / [G](test/-g)
+`typealias F = (`[`A`](-a/index.md)`) -> `[`B`](-b/index.md)
+<!-- File: test/-g.md -->
+[test](index.md) / [G](./-g.md)
# G
-`typealias G = `[`C`](test/-c/index)`<`[`A`](test/-a/index)`>`[test](test/index) / [H](test/-h)
+`typealias G = `[`C`](-c/index.md)`<`[`A`](-a/index.md)`>`
+<!-- File: test/-h.md -->
+[test](index.md) / [H](./-h.md)
# H
-`typealias H<T> = `[`C`](test/-c/index)`<`[`T`](test/-h#T)`>`[test](test/index) / [I](test/-i)
+`typealias H<T> = `[`C`](-c/index.md)`<`[`T`](-h.md#T)`>`
+<!-- File: test/-i.md -->
+[test](index.md) / [I](./-i.md)
# I
-`typealias I<T> = `[`H`](test/-h)`<`[`T`](test/-i#T)`>`[test](test/index) / [J](test/-j)
+`typealias I<T> = `[`H`](-h.md)`<`[`T`](-i.md#T)`>`
+<!-- File: test/-j.md -->
+[test](index.md) / [J](./-j.md)
# J
-`typealias J = `[`H`](test/-h)`<`[`A`](test/-a/index)`>`[test](test/index) / [K](test/-k)
+`typealias J = `[`H`](-h.md)`<`[`A`](-a/index.md)`>`
+<!-- File: test/-k.md -->
+[test](index.md) / [K](./-k.md)
# K
-`typealias K = `[`H`](test/-h)`<`[`J`](test/-j)`>`[test](test/index) / [L](test/-l)
+`typealias K = `[`H`](-h.md)`<`[`J`](-j.md)`>`
+<!-- File: test/-l.md -->
+[test](index.md) / [L](./-l.md)
# L
-`typealias L = (`[`K`](test/-k)`, `[`B`](test/-b/index)`) -> `[`J`](test/-j)[test](test/index) / [M](test/-m)
+`typealias L = (`[`K`](-k.md)`, `[`B`](-b/index.md)`) -> `[`J`](-j.md)
+<!-- File: test/-m.md -->
+[test](index.md) / [M](./-m.md)
# M
-`typealias M = `[`A`](test/-a/index)
+`typealias M = `[`A`](-a/index.md)
Documented
-[test](test/index) / [N](test/-n)
+<!-- File: test/-n.md -->
+[test](index.md) / [N](./-n.md)
# N
-`typealias ~~N~~ = `[`A`](test/-a/index)
+`typealias ~~N~~ = `[`A`](-a/index.md)
**Deprecated:** !!!
diff --git a/core/testdata/format/typeAliases.package.md b/core/testdata/format/typeAliases.package.md
index 9407588b..199e91c2 100644
--- a/core/testdata/format/typeAliases.package.md
+++ b/core/testdata/format/typeAliases.package.md
@@ -1,24 +1,24 @@
-[test](test/index)
+[test](./index.md)
## Package &lt;root&gt;
### Types
-| [A](test/-a/index) | `class A` |
-| [B](test/-b/index) | `class B` |
-| [C](test/-c/index) | `class C<T>` |
+| [A](-a/index.md) | `class A` |
+| [B](-b/index.md) | `class B` |
+| [C](-c/index.md) | `class C<T>` |
### Type Aliases
-| [D](test/-d) | `typealias D = `[`A`](test/-a/index) |
-| [E](test/-e) | `typealias E = `[`D`](test/-d) |
-| [F](test/-f) | `typealias F = (`[`A`](test/-a/index)`) -> `[`B`](test/-b/index) |
-| [G](test/-g) | `typealias G = `[`C`](test/-c/index)`<`[`A`](test/-a/index)`>` |
-| [H](test/-h) | `typealias H<T> = `[`C`](test/-c/index)`<`[`T`](test/-h#T)`>` |
-| [I](test/-i) | `typealias I<T> = `[`H`](test/-h)`<`[`T`](test/-i#T)`>` |
-| [J](test/-j) | `typealias J = `[`H`](test/-h)`<`[`A`](test/-a/index)`>` |
-| [K](test/-k) | `typealias K = `[`H`](test/-h)`<`[`J`](test/-j)`>` |
-| [L](test/-l) | `typealias L = (`[`K`](test/-k)`, `[`B`](test/-b/index)`) -> `[`J`](test/-j) |
-| [M](test/-m) | `typealias M = `[`A`](test/-a/index)<br>Documented |
-| [N](test/-n) | `typealias ~~N~~ = `[`A`](test/-a/index) |
+| [D](-d.md) | `typealias D = `[`A`](-a/index.md) |
+| [E](-e.md) | `typealias E = `[`D`](-d.md) |
+| [F](-f.md) | `typealias F = (`[`A`](-a/index.md)`) -> `[`B`](-b/index.md) |
+| [G](-g.md) | `typealias G = `[`C`](-c/index.md)`<`[`A`](-a/index.md)`>` |
+| [H](-h.md) | `typealias H<T> = `[`C`](-c/index.md)`<`[`T`](-h.md#T)`>` |
+| [I](-i.md) | `typealias I<T> = `[`H`](-h.md)`<`[`T`](-i.md#T)`>` |
+| [J](-j.md) | `typealias J = `[`H`](-h.md)`<`[`A`](-a/index.md)`>` |
+| [K](-k.md) | `typealias K = `[`H`](-h.md)`<`[`J`](-j.md)`>` |
+| [L](-l.md) | `typealias L = (`[`K`](-k.md)`, `[`B`](-b/index.md)`) -> `[`J`](-j.md) |
+| [M](-m.md) | `typealias M = `[`A`](-a/index.md)<br>Documented |
+| [N](-n.md) | `typealias ~~N~~ = `[`A`](-a/index.md) |
diff --git a/core/testdata/format/typeLink.html b/core/testdata/format/typeLink.html
index 2e51863f..30af8a93 100644
--- a/core/testdata/format/typeLink.html
+++ b/core/testdata/format/typeLink.html
@@ -4,16 +4,16 @@
<title>Bar - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/-bar/index">Bar</a><br/>
+<a href="../index.html">test</a>&nbsp;/&nbsp;<a href="./index.html">Bar</a><br/>
<br/>
<h1>Bar</h1>
-<code><span class="keyword">class </span><span class="identifier">Bar</span>&nbsp;<span class="symbol">:</span>&nbsp;<a href="test/-foo/index"><span class="identifier">Foo</span></a></code>
+<code><span class="keyword">class </span><span class="identifier">Bar</span>&nbsp;<span class="symbol">:</span>&nbsp;<a href="../-foo/index.html"><span class="identifier">Foo</span></a></code>
<h3>Constructors</h3>
<table>
<tbody>
<tr>
<td>
-<p><a href="test/-bar/-init-">&lt;init&gt;</a></p>
+<p><a href="-init-.html">&lt;init&gt;</a></p>
</td>
<td>
<code><span class="identifier">Bar</span><span class="symbol">(</span><span class="symbol">)</span></code></td>
diff --git a/core/testdata/format/typeParameterBounds.md b/core/testdata/format/typeParameterBounds.md
index 8f369ed6..cf03b3a7 100644
--- a/core/testdata/format/typeParameterBounds.md
+++ b/core/testdata/format/typeParameterBounds.md
@@ -1,8 +1,8 @@
-[test](test/index) / [generic](test/generic)
+[test](index.md) / [generic](./generic.md)
# generic
-`fun <T : `[`R`](test/generic#R)`, R> generic(): Unit`
+`fun <T : `[`R`](generic.md#R)`, R> generic(): Unit`
generic function
diff --git a/core/testdata/format/typeParameterReference.md b/core/testdata/format/typeParameterReference.md
index ea49d48a..5001d321 100644
--- a/core/testdata/format/typeParameterReference.md
+++ b/core/testdata/format/typeParameterReference.md
@@ -1,8 +1,8 @@
-[test](test/index) / [tt](test/tt)
+[test](index.md) / [tt](./tt.md)
# tt
-`fun <T> `[`T`](test/tt#T)`.tt(): Unit`
+`fun <T> `[`T`](tt.md#T)`.tt(): Unit`
-Correct ref to [T](test/tt#T)
+Correct ref to [T](tt.md#T)
diff --git a/core/testdata/format/typeParameterVariance.md b/core/testdata/format/typeParameterVariance.md
index 01f5562c..b0615d43 100644
--- a/core/testdata/format/typeParameterVariance.md
+++ b/core/testdata/format/typeParameterVariance.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Foo](test/-foo/index)
+[test](../index.md) / [Foo](./index.md)
# Foo
@@ -10,5 +10,5 @@
### Constructors
-| [&lt;init&gt;](test/-foo/-init-) | `Foo()` |
+| [&lt;init&gt;](-init-.md) | `Foo()` |
diff --git a/core/testdata/format/typeProjectionVariance.md b/core/testdata/format/typeProjectionVariance.md
index 072b9fc7..d3a55c58 100644
--- a/core/testdata/format/typeProjectionVariance.md
+++ b/core/testdata/format/typeProjectionVariance.md
@@ -1,6 +1,6 @@
-[test](test/index) / [kotlin.Array](test/kotlin.-array/index)
+[test](../index.md) / [kotlin.Array](./index.md)
### Extensions for kotlin.Array
-| [foo](test/kotlin.-array/foo) | `fun <T> Array<out `[`T`](test/kotlin.-array/foo#T)`>.foo(): Unit` |
+| [foo](foo.md) | `fun <T> Array<out `[`T`](foo.md#T)`>.foo(): Unit` |
diff --git a/core/testdata/format/uninterpretedEmphasisCharacters.html b/core/testdata/format/uninterpretedEmphasisCharacters.html
index ced7d0a5..dd338f72 100644
--- a/core/testdata/format/uninterpretedEmphasisCharacters.html
+++ b/core/testdata/format/uninterpretedEmphasisCharacters.html
@@ -4,7 +4,7 @@
<title>foo - test</title>
</HEAD>
<BODY>
-<a href="test/index">test</a>&nbsp;/&nbsp;<a href="test/foo">foo</a><br/>
+<a href="index.html">test</a>&nbsp;/&nbsp;<a href="./foo.html">foo</a><br/>
<br/>
<h1>foo</h1>
<a name="$foo()"></a>
diff --git a/core/testdata/format/unorderedLists.md b/core/testdata/format/unorderedLists.md
index a6b00b34..52ad9a71 100644
--- a/core/testdata/format/unorderedLists.md
+++ b/core/testdata/format/unorderedLists.md
@@ -1,4 +1,4 @@
-[test](test/index) / [Bar](test/-bar/index)
+[test](../index.md) / [Bar](./index.md)
# Bar
@@ -11,9 +11,9 @@ Usage summary:
Usage instructions:
-* [Bar.rinse](test/-bar/rinse) to rinse
+* [Bar.rinse](rinse.md) to rinse
* Alter any rinse options *(optional)*
-* To repeat; [Bar.repeat](test/-bar/repeat)
+* To repeat; [Bar.repeat](repeat.md)
* Can reconfigure options:
* Soap
* Elbow Grease
@@ -21,27 +21,27 @@ Usage instructions:
Rinse options:
-* [Bar.useSoap](test/-bar/use-soap)
+* [Bar.useSoap](use-soap.md)
* *recommended*
-* [Bar.useElbowGrease](test/-bar/use-elbow-grease)
+* [Bar.useElbowGrease](use-elbow-grease.md)
* *warning: requires effort*
-* [Bar.useBleach](test/-bar/use-bleach)
+* [Bar.useBleach](use-bleach.md)
* **use with caution**
### Constructors
-| [&lt;init&gt;](test/-bar/-init-) | `Bar()`<br>Usage summary: |
+| [&lt;init&gt;](-init-.md) | `Bar()`<br>Usage summary: |
### Properties
-| [useBleach](test/-bar/use-bleach) | `var useBleach: Boolean` |
-| [useElbowGrease](test/-bar/use-elbow-grease) | `var useElbowGrease: Boolean` |
-| [useSoap](test/-bar/use-soap) | `var useSoap: Boolean` |
+| [useBleach](use-bleach.md) | `var useBleach: Boolean` |
+| [useElbowGrease](use-elbow-grease.md) | `var useElbowGrease: Boolean` |
+| [useSoap](use-soap.md) | `var useSoap: Boolean` |
### Functions
-| [repeat](test/-bar/repeat) | `fun repeat(): Unit` |
-| [rinse](test/-bar/rinse) | `fun rinse(): Unit` |
+| [repeat](repeat.md) | `fun repeat(): Unit` |
+| [rinse](rinse.md) | `fun rinse(): Unit` |
diff --git a/core/testdata/format/varargsFunction.md b/core/testdata/format/varargsFunction.md
index 85ac9c92..550202cc 100644
--- a/core/testdata/format/varargsFunction.md
+++ b/core/testdata/format/varargsFunction.md
@@ -1,4 +1,4 @@
-[test](test/index) / [f](test/f)
+[test](index.md) / [f](./f.md)
# f
diff --git a/core/testdata/format/website-html/dataTags/multiplatform.package.html b/core/testdata/format/website-html/dataTags/multiplatform.package.html
index 15e1fc12..35453ab1 100644
--- a/core/testdata/format/website-html/dataTags/multiplatform.package.html
+++ b/core/testdata/format/website-html/dataTags/multiplatform.package.html
@@ -1,10 +1,10 @@
-<div class='api-docs-breadcrumbs'><a href="test/index">test</a> / <a href="test/foo/index">foo</a></div>
+<div class='api-docs-breadcrumbs'><a href="../index.html">test</a> / <a href="./index.html">foo</a></div>
<h2>Package foo</h2>
<h3>Functions</h3>
<table class="api-docs-table">
<tbody>
<tr data-platform="JVM" data-jre-version="JRE7"><td>
-<p><a href="test/foo/jre7">jre7</a></p>
+<p><a href="jre7.html">jre7</a></p>
</td>
<td>
@@ -12,7 +12,7 @@
</td>
</tr><tr data-platform="JVM" data-kotlin-version="Kotlin 1.1" data-jre-version="JRE7"><td>
-<p><a href="test/foo/jre7-new">jre7New</a></p>
+<p><a href="jre7-new.html">jre7New</a></p>
</td>
<td>
@@ -20,7 +20,7 @@
</td>
</tr><tr data-platform="JS"><td>
-<p><a href="test/foo/js">js</a></p>
+<p><a href="js.html">js</a></p>
</td>
<td>
@@ -28,7 +28,7 @@
</td>
</tr><tr data-platform="JS" data-kotlin-version="Kotlin 1.1"><td>
-<p><a href="test/foo/js-new">jsNew</a></p>
+<p><a href="js-new.html">jsNew</a></p>
</td>
<td>
@@ -36,7 +36,7 @@
</td>
</tr><tr data-platform="JVM"><td>
-<p><a href="test/foo/jvm">jvm</a></p>
+<p><a href="jvm.html">jvm</a></p>
</td>
<td>
@@ -44,7 +44,7 @@
</td>
</tr><tr data-platform="JVM" data-kotlin-version="Kotlin 1.1"><td>
-<p><a href="test/foo/jvm-new">jvmNew</a></p>
+<p><a href="jvm-new.html">jvmNew</a></p>
</td>
<td>
@@ -52,7 +52,7 @@
</td>
</tr><tr data-platform="JVM, JS" data-jre-version="JRE7"><td>
-<p><a href="test/foo/shared">shared</a></p>
+<p><a href="shared.html">shared</a></p>
</td>
<td>
@@ -60,7 +60,7 @@
</td>
</tr><tr data-platform="JVM, JS" data-kotlin-version="Kotlin 1.1" data-jre-version="JRE7"><td>
-<p><a href="test/foo/shared-new">sharedNew</a></p>
+<p><a href="shared-new.html">sharedNew</a></p>
</td>
<td>
diff --git a/core/testdata/format/website-html/dataTagsInGroupNode/multiplatform.html b/core/testdata/format/website-html/dataTagsInGroupNode/multiplatform.html
index 35773561..3d34fc7e 100644
--- a/core/testdata/format/website-html/dataTagsInGroupNode/multiplatform.html
+++ b/core/testdata/format/website-html/dataTagsInGroupNode/multiplatform.html
@@ -1,4 +1,4 @@
-<div class='api-docs-breadcrumbs'><a href="test/index">test</a> / <a href="test/pack/index">pack</a> / <a href="test/pack/-some/index">Some</a></div>
+<div class='api-docs-breadcrumbs'><a href="../../index.html">test</a> / <a href="../index.html">pack</a> / <a href="./index.html">Some</a></div>
<h1>Some</h1>
<div class="overload-group" data-platform="JVM"><div class="signature"><code><span class="keyword">typealias </span><span class="identifier">Some</span>&nbsp;<span class="symbol">=</span>&nbsp;<span class="identifier">SomeCoolJvmClass</span></code></div>
<p><strong>Platform and version requirements:</strong> JVM</p>
@@ -10,7 +10,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/pack/-some/-some/-init-">&lt;init&gt;</a></p>
+<p><a href="-some/-init-.html">&lt;init&gt;</a></p>
</td>
<td>
@@ -25,7 +25,7 @@
<tbody>
<tr>
<td>
-<p><a href="test/pack/-some/-some/magic">magic</a></p>
+<p><a href="-some/magic.html">magic</a></p>
</td>
<td>
diff --git a/core/testdata/format/website-html/dataTagsInGroupNode/multiplatform.package.html b/core/testdata/format/website-html/dataTagsInGroupNode/multiplatform.package.html
index 15ae2a5b..c8926a28 100644
--- a/core/testdata/format/website-html/dataTagsInGroupNode/multiplatform.package.html
+++ b/core/testdata/format/website-html/dataTagsInGroupNode/multiplatform.package.html
@@ -1,10 +1,10 @@
-<div class='api-docs-breadcrumbs'><a href="test/index">test</a> / <a href="test/pack/index">pack</a></div>
+<div class='api-docs-breadcrumbs'><a href="../index.html">test</a> / <a href="./index.html">pack</a></div>
<h2>Package pack</h2>
<h3>Types</h3>
<table class="api-docs-table">
<tbody>
<tr data-platform="JS"><td>
-<p><a href="test/pack/-some/index">Some</a></p>
+<p><a href="-some/index.html">Some</a></p>
</td>
<td>
@@ -12,7 +12,7 @@
</td>
</tr><tr data-platform="JVM"><td>
-<p><a href="test/pack/-some-cool-jvm-class/index">SomeCoolJvmClass</a></p>
+<p><a href="-some-cool-jvm-class/index.html">SomeCoolJvmClass</a></p>
</td>
<td>
@@ -25,7 +25,7 @@
<table class="api-docs-table">
<tbody>
<tr data-platform="JVM"><td>
-<p><a href="test/pack/-some/index">Some</a></p>
+<p><a href="-some/index.html">Some</a></p>
</td>
<td>
diff --git a/core/testdata/format/website-html/dropImport.html b/core/testdata/format/website-html/dropImport.html
index 97ff4a68..e0fcb12b 100644
--- a/core/testdata/format/website-html/dropImport.html
+++ b/core/testdata/format/website-html/dropImport.html
@@ -1,4 +1,4 @@
-<div class='api-docs-breadcrumbs'><a href="test/index">test</a> / <a href="test/foo">foo</a></div>
+<div class='api-docs-breadcrumbs'><a href="index.html">test</a> / <a href="./foo.html">foo</a></div>
<h1>foo</h1>
<a name="$foo()"></a>
<div class="signature"><code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></div>
diff --git a/core/testdata/format/website-html/newLinesInImportList.html b/core/testdata/format/website-html/newLinesInImportList.html
index 334ed11c..b5a07325 100644
--- a/core/testdata/format/website-html/newLinesInImportList.html
+++ b/core/testdata/format/website-html/newLinesInImportList.html
@@ -1,4 +1,4 @@
-<div class='api-docs-breadcrumbs'><a href="test/index">test</a> / <a href="test/foo">foo</a></div>
+<div class='api-docs-breadcrumbs'><a href="index.html">test</a> / <a href="./foo.html">foo</a></div>
<h1>foo</h1>
<a name="$foo()"></a>
<div class="signature"><code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></div>
diff --git a/core/testdata/format/website-html/newLinesInSamples.html b/core/testdata/format/website-html/newLinesInSamples.html
index ab70140d..50f875da 100644
--- a/core/testdata/format/website-html/newLinesInSamples.html
+++ b/core/testdata/format/website-html/newLinesInSamples.html
@@ -1,4 +1,4 @@
-<div class='api-docs-breadcrumbs'><a href="test/index">test</a> / <a href="test/foo">foo</a></div>
+<div class='api-docs-breadcrumbs'><a href="index.html">test</a> / <a href="./foo.html">foo</a></div>
<h1>foo</h1>
<a name="$foo()"></a>
<div class="signature"><code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></div>
diff --git a/core/testdata/format/website-html/overloadGroup.html b/core/testdata/format/website-html/overloadGroup.html
index 3ea7de94..aaba9c96 100644
--- a/core/testdata/format/website-html/overloadGroup.html
+++ b/core/testdata/format/website-html/overloadGroup.html
@@ -1,4 +1,4 @@
-<div class='api-docs-breadcrumbs'><a href="test/index">test</a> / <a href="test/magic">magic</a></div>
+<div class='api-docs-breadcrumbs'><a href="index.html">test</a> / <a href="./magic.html">magic</a></div>
<h1>magic</h1>
<div class="overload-group"><a name="$magic(kotlin.String)"></a>
<div class="signature"><code><span class="keyword">fun </span><span class="identifier">magic</span><span class="symbol">(</span><span class="parameterName" id="$magic(kotlin.String)/spell">spell</span><span class="symbol">:</span>&nbsp;<span class="identifier">String</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Int</span></code></div>
diff --git a/core/testdata/format/website-html/returnTag.html b/core/testdata/format/website-html/returnTag.html
index d4190fa1..7724eaa7 100644
--- a/core/testdata/format/website-html/returnTag.html
+++ b/core/testdata/format/website-html/returnTag.html
@@ -1,9 +1,9 @@
-<div class='api-docs-breadcrumbs'><a href="test/index">test</a> / <a href="test/index-of">indexOf</a></div>
+<div class='api-docs-breadcrumbs'><a href="index.html">test</a> / <a href="./index-of.html">indexOf</a></div>
<h1>indexOf</h1>
<a name="$indexOf(Foo, kotlin.Char, kotlin.Int, kotlin.Boolean)"></a>
-<div class="signature"><code><span class="keyword">fun </span><a href="test/-foo/index"><span class="identifier">Foo</span></a><span class="symbol">.</span><span class="identifier">indexOf</span><span class="symbol">(</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span class="parameterName" id="$indexOf(Foo, kotlin.Char, kotlin.Int, kotlin.Boolean)/char">char</span><span class="symbol">:</span>&nbsp;<span class="identifier">Char</span><span class="symbol">, </span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span class="parameterName" id="$indexOf(Foo, kotlin.Char, kotlin.Int, kotlin.Boolean)/startIndex">startIndex</span><span class="symbol">:</span>&nbsp;<span class="identifier">Int</span>&nbsp;<span class="symbol">=</span>&nbsp;0<span class="symbol">, </span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span class="parameterName" id="$indexOf(Foo, kotlin.Char, kotlin.Int, kotlin.Boolean)/ignoreCase">ignoreCase</span><span class="symbol">:</span>&nbsp;<span class="identifier">Boolean</span>&nbsp;<span class="symbol">=</span>&nbsp;false<br/><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Int</span></code></div>
-<p>Returns the index within this string of the first occurrence of the specified character, starting from the specified <a href="test/index-of#$indexOf(Foo, kotlin.Char, kotlin.Int, kotlin.Boolean)/startIndex">startIndex</a>.</p>
+<div class="signature"><code><span class="keyword">fun </span><a href="-foo/index.html"><span class="identifier">Foo</span></a><span class="symbol">.</span><span class="identifier">indexOf</span><span class="symbol">(</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span class="parameterName" id="$indexOf(Foo, kotlin.Char, kotlin.Int, kotlin.Boolean)/char">char</span><span class="symbol">:</span>&nbsp;<span class="identifier">Char</span><span class="symbol">, </span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span class="parameterName" id="$indexOf(Foo, kotlin.Char, kotlin.Int, kotlin.Boolean)/startIndex">startIndex</span><span class="symbol">:</span>&nbsp;<span class="identifier">Int</span>&nbsp;<span class="symbol">=</span>&nbsp;0<span class="symbol">, </span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span class="parameterName" id="$indexOf(Foo, kotlin.Char, kotlin.Int, kotlin.Boolean)/ignoreCase">ignoreCase</span><span class="symbol">:</span>&nbsp;<span class="identifier">Boolean</span>&nbsp;<span class="symbol">=</span>&nbsp;false<br/><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Int</span></code></div>
+<p>Returns the index within this string of the first occurrence of the specified character, starting from the specified <a href="index-of.html#$indexOf(Foo, kotlin.Char, kotlin.Int, kotlin.Boolean)/startIndex">startIndex</a>.</p>
<h3>Parameters</h3>
<p><a name="ignoreCase"></a>
<code>ignoreCase</code> - <code>true</code> to ignore character case when matching a character. By default <code>false</code>.</p>
-<p><strong>Returns</strong> An index of the first occurrence of <a href="test/index-of#$indexOf(Foo, kotlin.Char, kotlin.Int, kotlin.Boolean)/char">char</a> or -1 if none is found.</p>
+<p><strong>Returns</strong> An index of the first occurrence of <a href="index-of.html#$indexOf(Foo, kotlin.Char, kotlin.Int, kotlin.Boolean)/char">char</a> or -1 if none is found.</p>
diff --git a/core/testdata/format/website-html/sample.html b/core/testdata/format/website-html/sample.html
index d709edc4..1fb26e41 100644
--- a/core/testdata/format/website-html/sample.html
+++ b/core/testdata/format/website-html/sample.html
@@ -1,4 +1,4 @@
-<div class='api-docs-breadcrumbs'><a href="test/index">test</a> / <a href="test/foo">foo</a></div>
+<div class='api-docs-breadcrumbs'><a href="index.html">test</a> / <a href="./foo.html">foo</a></div>
<h1>foo</h1>
<div class="overload-group"><a name="$foo()"></a>
<div class="signature"><code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Int</span></code></div>
diff --git a/core/testdata/format/website-html/sampleWithAsserts.html b/core/testdata/format/website-html/sampleWithAsserts.html
index 11a3a626..e91232f5 100644
--- a/core/testdata/format/website-html/sampleWithAsserts.html
+++ b/core/testdata/format/website-html/sampleWithAsserts.html
@@ -1,4 +1,4 @@
-<div class='api-docs-breadcrumbs'><a href="test/index">test</a> / <a href="test/a">a</a></div>
+<div class='api-docs-breadcrumbs'><a href="index.html">test</a> / <a href="./a.html">a</a></div>
<h1>a</h1>
<a name="$a()"></a>
<div class="signature"><code><span class="keyword">fun </span><span class="identifier">a</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">String</span></code></div>