1
+ package processing.app.api
2
+
3
+ import com.github.ajalt.clikt.command.SuspendingCliktCommand
4
+ import com.github.ajalt.clikt.core.Context
5
+ import com.github.ajalt.clikt.core.subcommands
6
+ import kotlinx.serialization.encodeToString
7
+ import kotlinx.serialization.json.Json
8
+ import processing.app.Platform
9
+ import processing.app.api.Sketch.Companion.getSketches
10
+ import java.io.File
11
+
12
+ class Contributions : SuspendingCliktCommand (){
13
+ override fun help (context : Context ) = " Manage Processing contributions"
14
+ override suspend fun run () {
15
+ System .setProperty(" java.awt.headless" , " true" )
16
+ }
17
+ init {
18
+ subcommands(Examples ())
19
+ }
20
+
21
+ class Examples : SuspendingCliktCommand (" examples" ) {
22
+ override fun help (context : Context ) = " Manage Processing examples"
23
+ override suspend fun run () {
24
+ }
25
+ init {
26
+ subcommands(ExamplesList ())
27
+ }
28
+ }
29
+
30
+ class ExamplesList : SuspendingCliktCommand (" list" ) {
31
+
32
+
33
+ val serializer = Json {
34
+ prettyPrint = true
35
+ }
36
+
37
+ override fun help (context : Context ) = " List all examples"
38
+ override suspend fun run () {
39
+ Platform .init ()
40
+ // TODO: Decouple modes listing from `Base` class, defaulting to Java mode for now
41
+ // TODO: Allow the user to change the sketchbook location
42
+ // TODO: Currently blocked since `Base.getSketchbookFolder()` is not available in headless mode
43
+ val sketchbookFolder = Platform .getDefaultSketchbookFolder()
44
+ val resourcesDir = System .getProperty(" compose.application.resources.dir" )
45
+
46
+ val javaMode = " $resourcesDir /modes/java"
47
+
48
+ val javaModeExamples = File (" $javaMode /examples" )
49
+ .listFiles()
50
+ ?.map { getSketches(it)}
51
+ ? : emptyList()
52
+
53
+ val javaModeLibrariesExamples = File (" $javaMode /libraries" )
54
+ .listFiles{ it.isDirectory }
55
+ ?.map { library ->
56
+ val properties = library.resolve(" library.properties" )
57
+ val name = findNameInProperties(properties) ? : library.name
58
+
59
+ val libraryExamples = getSketches(library.resolve(" examples" ))
60
+ Sketch .Companion .Folder (
61
+ type = " folder" ,
62
+ name = name,
63
+ path = library.absolutePath,
64
+ mode = " java" ,
65
+ children = libraryExamples?.children ? : emptyList(),
66
+ sketches = libraryExamples?.sketches ? : emptyList()
67
+ )
68
+ } ? : emptyList()
69
+ val javaModeLibraries = Sketch .Companion .Folder (
70
+ type = " folder" ,
71
+ name = " Libraries" ,
72
+ path = " $javaMode /libraries" ,
73
+ mode = " java" ,
74
+ children = javaModeLibrariesExamples,
75
+ sketches = emptyList()
76
+ )
77
+
78
+ val contributedLibraries = sketchbookFolder.resolve(" libraries" )
79
+ .listFiles{ it.isDirectory }
80
+ ?.map { library ->
81
+ val properties = library.resolve(" library.properties" )
82
+ val name = findNameInProperties(properties) ? : library.name
83
+ // Get library name from library.properties if it exists
84
+ val libraryExamples = getSketches(library.resolve(" examples" ))
85
+ Sketch .Companion .Folder (
86
+ type = " folder" ,
87
+ name = name,
88
+ path = library.absolutePath,
89
+ mode = " java" ,
90
+ children = libraryExamples?.children ? : emptyList(),
91
+ sketches = libraryExamples?.sketches ? : emptyList()
92
+ )
93
+ } ? : emptyList()
94
+
95
+ val contributedLibrariesFolder = Sketch .Companion .Folder (
96
+ type = " folder" ,
97
+ name = " Contributed Libraries" ,
98
+ path = sketchbookFolder.resolve(" libraries" ).absolutePath,
99
+ mode = " java" ,
100
+ children = contributedLibraries,
101
+ sketches = emptyList()
102
+ )
103
+
104
+ val contributedExamples = sketchbookFolder.resolve(" examples" )
105
+ .listFiles{ it.isDirectory }
106
+ ?.map {
107
+ val properties = it.resolve(" examples.properties" )
108
+ val name = findNameInProperties(properties) ? : it.name
109
+
110
+ val sketches = getSketches(it.resolve(" examples" ))
111
+ Sketch .Companion .Folder (
112
+ type = " folder" ,
113
+ name,
114
+ path = it.absolutePath,
115
+ mode = " java" ,
116
+ children = sketches?.children ? : emptyList(),
117
+ sketches = sketches?.sketches ? : emptyList(),
118
+ )
119
+ }
120
+ ? : emptyList()
121
+ val contributedExamplesFolder = Sketch .Companion .Folder (
122
+ type = " folder" ,
123
+ name = " Contributed Examples" ,
124
+ path = sketchbookFolder.resolve(" examples" ).absolutePath,
125
+ mode = " java" ,
126
+ children = contributedExamples,
127
+ sketches = emptyList()
128
+ )
129
+
130
+ val json = serializer.encodeToString(javaModeExamples + javaModeLibraries + contributedLibrariesFolder + contributedExamplesFolder)
131
+ println (json)
132
+ }
133
+
134
+ private fun findNameInProperties (properties : File ): String? {
135
+ if (! properties.exists()) return null
136
+
137
+ return properties.readLines().firstNotNullOfOrNull { line ->
138
+ line.split(" =" , limit = 2 )
139
+ .takeIf { it.size == 2 && it[0 ].trim() == " name" }
140
+ ?.let { it[1 ].trim() }
141
+ }
142
+ }
143
+ }
144
+ }
0 commit comments