1+ package aws.sdk.kotlin.dokka
2+
3+ import org.gradle.api.DefaultTask
4+ import org.gradle.api.file.DirectoryProperty
5+ import org.gradle.api.logging.Logger
6+ import org.gradle.api.tasks.InputDirectory
7+ import org.gradle.api.tasks.TaskAction
8+ import org.gradle.workers.WorkAction
9+ import org.gradle.workers.WorkParameters
10+ import org.gradle.workers.WorkerExecutor
11+ import org.jsoup.Jsoup
12+ import java.io.File
13+ import javax.inject.Inject
14+
15+ abstract class TrimNavigation @Inject constructor(private val workerExecutor : WorkerExecutor ) : DefaultTask() {
16+ @get:InputDirectory
17+ abstract val sourceDirectory: DirectoryProperty
18+
19+ init {
20+ description = " Trims navigation.html files to remove unrelated projects' side menus"
21+ group = " documentation"
22+ }
23+
24+ @TaskAction
25+ fun trimNavigation () {
26+ val queue = workerExecutor.noIsolation()
27+
28+ sourceDirectory
29+ .asFileTree
30+ .filter { it.isDirectory() && it.resolve(" navigation.html" ).exists() }
31+ .forEach { dir ->
32+ queue.submit(TrimModule ::class .java) {
33+ moduleDirectory = dir
34+ logger = this @TrimNavigation.logger
35+ projectRoot = project.layout.projectDirectory.asFile
36+ }
37+ }
38+ }
39+ }
40+
41+ interface TrimModuleParameters : WorkParameters {
42+ var logger: Logger
43+ var moduleDirectory: File
44+ var projectRoot: File
45+ }
46+
47+ abstract class TrimModule : WorkAction <TrimModuleParameters > {
48+ override fun execute () {
49+ val moduleDirectory = parameters.moduleDirectory
50+ val moduleName = moduleDirectory.name
51+ val navigation = moduleDirectory.resolve(" navigation.html" )
52+
53+ val logger = parameters.logger
54+ val relativePath = navigation.toRelativeString(parameters.projectRoot)
55+ logger.info(" Trimming $relativePath ..." )
56+
57+ val doc = Jsoup .parse(navigation)
58+
59+ // Remove all parent directory elements from all navigation links
60+ doc.select(" a[href^=../]" ).forEach { anchor ->
61+ var href = anchor.attr(" href" )
62+
63+ while (href.startsWith(" ../" )) {
64+ href = href.removePrefix(" ../" )
65+ }
66+
67+ anchor.attr(" href" , href)
68+ }
69+
70+ // Trim side menus
71+ doc.select(" div.sideMenu > div.toc--part" )
72+ .filterNot { it.id().startsWith(" $moduleName -nav-submenu" ) }
73+ .forEach { moduleMenu ->
74+ val moduleRow = moduleMenu.select(" div.toc--row" ).first()!!
75+ val toggleButton = moduleRow.select(" button.toc--button" ).single()
76+ toggleButton.remove()
77+
78+ moduleMenu.children()
79+ .filterNot { it == moduleRow }
80+ .forEach { it.remove() }
81+ }
82+
83+ // Update navigation.html
84+ val trimmedSideMenuParts = doc.select(" div.sideMenu > div.toc--part" )
85+ navigation.writeText(" <div class=\" sideMenu\" >\n $trimmedSideMenuParts \n </div>" )
86+ }
87+ }
0 commit comments