<lambda>null1 package org.jetbrains.dokka
2
3 import com.google.inject.Inject
4 import com.google.inject.name.Named
5 import org.jetbrains.kotlin.utils.fileUtils.withReplacedExtensionOrNull
6 import java.io.File
7 import java.io.FileOutputStream
8 import java.io.IOException
9 import java.io.OutputStreamWriter
10
11 class FileGenerator @Inject constructor(@Named("outputDir") override val root: File) : NodeLocationAwareGenerator {
12
13 @set:Inject(optional = true) var outlineService: OutlineFormatService? = null
14 @set:Inject(optional = true) lateinit var formatService: FormatService
15 @set:Inject(optional = true) lateinit var options: DocumentationOptions
16 @set:Inject(optional = true) var packageListService: PackageListService? = null
17
18 override fun location(node: DocumentationNode): FileLocation {
19 return FileLocation(fileForNode(node, formatService.linkExtension))
20 }
21
22 private fun fileForNode(node: DocumentationNode, extension: String = ""): File {
23 return File(root, relativePathToNode(node)).appendExtension(extension)
24 }
25
26 fun locationWithoutExtension(node: DocumentationNode): FileLocation {
27 return FileLocation(fileForNode(node))
28 }
29
30 override fun buildPages(nodes: Iterable<DocumentationNode>) {
31
32 for ((file, items) in nodes.groupBy { fileForNode(it, formatService.extension) }) {
33
34 file.parentFile?.mkdirsOrFail()
35 try {
36 FileOutputStream(file).use {
37 OutputStreamWriter(it, Charsets.UTF_8).use {
38 it.write(formatService.format(location(items.first()), items))
39 }
40 }
41 } catch (e: Throwable) {
42 println(e)
43 }
44 buildPages(items.flatMap { it.members })
45 }
46 }
47
48 override fun buildOutlines(nodes: Iterable<DocumentationNode>) {
49 val outlineService = this.outlineService ?: return
50 for ((location, items) in nodes.groupBy { locationWithoutExtension(it) }) {
51 val file = outlineService.getOutlineFileName(location)
52 file.parentFile?.mkdirsOrFail()
53 FileOutputStream(file).use {
54 OutputStreamWriter(it, Charsets.UTF_8).use {
55 it.write(outlineService.formatOutline(location, items))
56 }
57 }
58 }
59 }
60
61 override fun buildSupportFiles() {
62 formatService.enumerateSupportFiles { resource, targetPath ->
63 FileOutputStream(File(root, relativePathToNode(listOf(targetPath), false))).use {
64 javaClass.getResourceAsStream(resource).copyTo(it)
65 }
66 }
67 }
68
69 override fun buildPackageList(nodes: Iterable<DocumentationNode>) {
70 if (packageListService == null) return
71
72 for (module in nodes) {
73
74 val moduleRoot = location(module).file.parentFile
75 val packageListFile = File(moduleRoot, "package-list")
76
77 packageListFile.writeText("\$dokka.format:${options.outputFormat}\n" +
78 packageListService!!.formatPackageList(module as DocumentationModule))
79 }
80
81 }
82
83 }
84
mkdirsOrFailnull85 fun File.mkdirsOrFail() {
86 if (!mkdirs() && !exists()) {
87 throw IOException("Failed to create directory $this")
88 }
89 }