From 4ba841da7b994f7b452894b39dfe82d59f8fb5fd Mon Sep 17 00:00:00 2001 From: Milan Doslic Date: Tue, 1 Apr 2025 13:23:33 +0200 Subject: [PATCH] [markdown] IJPL-177111 fix IJPL-167949 by adding `ProcessImagesExtension` Introduced `ProcessImagesExtension` to handle image resources in the Markdown browser preview. Added a new remote API (`ProjectStructureRemoteApi`) to retrieve project-specific resources. GitOrigin-RevId: 9a3e8f02e167c23e4954e9ebdaa58a9bfd2330fd --- .../resources/intellij.markdown.backend.xml | 2 + .../providers/ProjectStructureProvider.kt | 14 +++++ .../services/ProjectStructureRemoteApiImpl.kt | 38 +++++++++++++ .../core/resources/META-INF/plugin.xml | 1 + .../extensions/jcef/ProcessImagesExtension.kt | 56 +++++++++++++++++++ .../service/ProjectStructureRemoteApi.kt | 23 ++++++++ 6 files changed, 134 insertions(+) create mode 100644 plugins/markdown/core/backend/src/org/intellij/plugins/markdown/backend/providers/ProjectStructureProvider.kt create mode 100644 plugins/markdown/core/backend/src/org/intellij/plugins/markdown/backend/services/ProjectStructureRemoteApiImpl.kt create mode 100644 plugins/markdown/core/src/org/intellij/plugins/markdown/extensions/jcef/ProcessImagesExtension.kt create mode 100644 plugins/markdown/core/src/org/intellij/plugins/markdown/service/ProjectStructureRemoteApi.kt diff --git a/plugins/markdown/core/backend/resources/intellij.markdown.backend.xml b/plugins/markdown/core/backend/resources/intellij.markdown.backend.xml index 084ed35c13f4..960c80349259 100644 --- a/plugins/markdown/core/backend/resources/intellij.markdown.backend.xml +++ b/plugins/markdown/core/backend/resources/intellij.markdown.backend.xml @@ -6,5 +6,7 @@ + \ No newline at end of file diff --git a/plugins/markdown/core/backend/src/org/intellij/plugins/markdown/backend/providers/ProjectStructureProvider.kt b/plugins/markdown/core/backend/src/org/intellij/plugins/markdown/backend/providers/ProjectStructureProvider.kt new file mode 100644 index 000000000000..9d330056ca8b --- /dev/null +++ b/plugins/markdown/core/backend/src/org/intellij/plugins/markdown/backend/providers/ProjectStructureProvider.kt @@ -0,0 +1,14 @@ +package org.intellij.plugins.markdown.backend.providers + +import com.intellij.platform.rpc.backend.RemoteApiProvider +import fleet.rpc.remoteApiDescriptor +import org.intellij.plugins.markdown.backend.services.ProjectStructureRemoteApiImpl +import org.intellij.plugins.markdown.service.ProjectStructureRemoteApi + +private class ProjectStructureProvider : RemoteApiProvider { + override fun RemoteApiProvider.Sink.remoteApis() { + remoteApi(remoteApiDescriptor()) { + ProjectStructureRemoteApiImpl() + } + } +} \ No newline at end of file diff --git a/plugins/markdown/core/backend/src/org/intellij/plugins/markdown/backend/services/ProjectStructureRemoteApiImpl.kt b/plugins/markdown/core/backend/src/org/intellij/plugins/markdown/backend/services/ProjectStructureRemoteApiImpl.kt new file mode 100644 index 000000000000..2147918b6d63 --- /dev/null +++ b/plugins/markdown/core/backend/src/org/intellij/plugins/markdown/backend/services/ProjectStructureRemoteApiImpl.kt @@ -0,0 +1,38 @@ +package org.intellij.plugins.markdown.backend.services + +import com.intellij.ide.vfs.VirtualFileId +import com.intellij.ide.vfs.rpcId +import com.intellij.ide.vfs.virtualFile +import com.intellij.openapi.diagnostic.Logger +import com.intellij.openapi.project.BaseProjectDirectories +import com.intellij.openapi.vfs.VfsUtil +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.platform.project.ProjectId +import com.intellij.platform.project.findProject +import org.intellij.plugins.markdown.service.ProjectStructureRemoteApi +import java.io.File +import java.net.URL + +class ProjectStructureRemoteApiImpl : ProjectStructureRemoteApi { + private fun getBaseDirectory(projectId: ProjectId, virtualFileId: VirtualFileId) : VirtualFile?{ + val project = projectId.findProject() + val virtualFile = virtualFileId.virtualFile() ?: return null + val baseDirectory = BaseProjectDirectories.getInstance(project).getBaseDirectoryFor(virtualFile) + return baseDirectory + } + + override suspend fun getFileByResourceName(resourceName: String, virtualFileId: VirtualFileId?, projectId: ProjectId?): VirtualFileId? { + if (projectId == null || virtualFileId == null) return null + val projectRoot = getBaseDirectory(projectId, virtualFileId) + val resource = if (resourceName.startsWith("file:/")) { + VfsUtil.findFileByIoFile(File(URL(resourceName).path), true) + } else { + projectRoot?.findFileByRelativePath(resourceName) + } ?: return null + return resource.rpcId() + } + + companion object { + private val logger: Logger = Logger.getInstance(ProjectStructureRemoteApiImpl::class.java) + } +} \ No newline at end of file diff --git a/plugins/markdown/core/resources/META-INF/plugin.xml b/plugins/markdown/core/resources/META-INF/plugin.xml index 376dcec1855d..395de9aa3672 100644 --- a/plugins/markdown/core/resources/META-INF/plugin.xml +++ b/plugins/markdown/core/resources/META-INF/plugin.xml @@ -398,6 +398,7 @@ + { + suspend fun getFileByResourceName(resourceName: String, virtualFileId: VirtualFileId?, projectId: ProjectId?): VirtualFileId? + + companion object { + @JvmStatic + suspend fun getInstance(): ProjectStructureRemoteApi { + return RemoteApiProviderService.resolve(remoteApiDescriptor()) + } + } +} \ No newline at end of file