@@ -5,24 +5,33 @@ import cc.unitmesh.devti.command.InsCommand
5
5
import cc.unitmesh.devti.command.dataprovider.BuiltinCommand
6
6
import cc.unitmesh.devti.language.utils.lookupFile
7
7
import cc.unitmesh.devti.util.relativePath
8
+ import com.intellij.ide.scratch.ScratchRootType
9
+ import com.intellij.lang.html.HTMLLanguage
8
10
import com.intellij.openapi.application.ApplicationManager
9
11
import com.intellij.openapi.application.runReadAction
10
12
import com.intellij.openapi.diagnostic.logger
11
13
import com.intellij.openapi.project.Project
12
- import com.intellij.openapi.project.guessProjectDir
13
14
import com.intellij.openapi.vfs.VirtualFile
14
15
import com.intellij.psi.PsiFile
15
16
import com.intellij.psi.PsiManager
16
17
import kotlinx.coroutines.Dispatchers
17
18
import kotlinx.coroutines.withContext
19
+ import org.jsoup.Jsoup
20
+ import java.net.MalformedURLException
21
+ import java.net.URL
18
22
19
23
20
24
class StructureInCommand (val myProject : Project , val prop : String ) : InsCommand {
21
25
override val commandName: BuiltinCommand = BuiltinCommand .STRUCTURE
22
26
23
27
private val logger = logger<StructureInCommand >()
24
28
override suspend fun execute (): String? {
25
- val virtualFile = file(myProject, prop)
29
+ val virtualFile = if (isUrl(prop)) {
30
+ fetchHtmlFromUrl(myProject, prop)
31
+ } else {
32
+ file(myProject, prop)
33
+ }
34
+
26
35
if (virtualFile == null ) {
27
36
logger.warn(" File not found: $prop " )
28
37
return null
@@ -37,13 +46,41 @@ class StructureInCommand(val myProject: Project, val prop: String) : InsCommand
37
46
} ? : return null
38
47
39
48
val structure = StructureCommandUtil .getFileStructure(myProject, virtualFile, psiFile)
40
- val filepath = virtualFile.relativePath(myProject)
41
- return " // $filepath \n ```\n $structure \n ```"
49
+ val filepath = if (isUrl(prop)) {
50
+ prop
51
+ } else {
52
+ virtualFile.relativePath(myProject)
53
+ }
54
+
55
+ return " # structure: $filepath \n ```\n $structure \n ```"
42
56
}
43
57
44
58
fun file (project : Project , path : String ): VirtualFile ? {
45
59
val filename = path.split(" #" )[0 ]
46
60
val virtualFile = project.lookupFile(filename)
47
61
return virtualFile
48
62
}
49
- }
63
+
64
+ private fun isUrl (str : String ): Boolean {
65
+ return try {
66
+ val url = URL (str)
67
+ url.protocol == " http" || url.protocol == " https"
68
+ } catch (e: MalformedURLException ) {
69
+ false
70
+ }
71
+ }
72
+
73
+ private suspend fun fetchHtmlFromUrl (project : Project , url : String ): VirtualFile ? {
74
+ return try {
75
+ val htmlContent = withContext(Dispatchers .IO ) {
76
+ Jsoup .connect(url).get().outerHtml()
77
+ }
78
+
79
+ ScratchRootType .getInstance()
80
+ .createScratchFile(project, " autodev-structure.html" , HTMLLanguage .INSTANCE , htmlContent)
81
+ } catch (e: Exception ) {
82
+ logger.warn(" Failed to fetch HTML from URL: $url " , e)
83
+ null
84
+ }
85
+ }
86
+ }
0 commit comments