• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download

<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 }