IJ-CR-151119 [dotenv] add missing commits

- migrate to Symbols API
- add new logo

Co-authored-by: adelf <adel.faiz@gmail.com>
(cherry picked from commit 38df2c3c89446bb5c3ff2901280245b718225fe9)

GitOrigin-RevId: e2ea805b4f88e9d791bb54f7570c51cf1029c67d
This commit is contained in:
Artemy Pestretsov
2024-11-25 10:47:30 +01:00
committed by intellij-monorepo-bot
parent 1d8ca26477
commit 36d3d826a1
23 changed files with 298 additions and 133 deletions

View File

@@ -8,4 +8,5 @@
/.gradle/
/*.iml
/*.ipr
/*.iws
/*.iws
/.intellijPlatform

View File

@@ -1,17 +1,21 @@
import org.jetbrains.intellij.platform.gradle.TestFrameworkType
plugins {
id("org.jetbrains.intellij") version "1.14.0"
id("org.jetbrains.intellij.platform") version "2.0.1"
}
group = "ru.adelf"
version = "2023.2"
version = "2024.2.1"
repositories {
mavenCentral()
intellijPlatform {
defaultRepositories()
}
}
apply {
plugin("idea")
plugin("org.jetbrains.intellij")
plugin("java")
}
@@ -31,38 +35,54 @@ sourceSets {
}
}
intellij {
version.set("IU-223.8617.56")
plugins.set(
listOf(
"com.jetbrains.php:223.8617.59",
"yaml",
"org.jetbrains.plugins.go:223.8617.56",
"Docker",
"pythonid:223.8617.56",
"org.jetbrains.plugins.ruby:223.8617.56",
"Kotlin",
"java-i18n",
"properties",
"java"
)
)
pluginName.set(".env files support")
dependencies {
intellijPlatform {
create("IU", "2023.2.4", useInstaller = true)
plugin("com.jetbrains.php", "232.8660.153")
plugin("org.jetbrains.plugins.go", "232.8660.48")
plugin("org.jetbrains.plugins.ruby", "232.8660.142")
plugin("PythonCore", "232.8660.142")
bundledPlugin("org.jetbrains.kotlin")
bundledPlugin("com.intellij.java")
bundledPlugin("Docker")
bundledPlugin("org.jetbrains.plugins.yaml")
pluginVerifier()
instrumentationTools()
testFramework(TestFrameworkType.Platform)
}
testImplementation("junit:junit:4.13.2")
testImplementation("org.opentest4j:opentest4j:1.3.0")
testRuntimeOnly("com.fasterxml.jackson.core:jackson-databind:2.14.1")
}
intellijPlatform {
pluginConfiguration {
name = ".env files support"
ideaVersion {
sinceBuild = "232"
untilBuild = "242.*"
}
}
pluginVerification {
ides {
ide("IU", "2023.2.4")
}
freeArgs = listOf("-mute", "TemplateWordInPluginName")
}
}
tasks {
patchPluginXml {
sinceBuild.set("223")
untilBuild.set("232.*")
}
buildSearchableOptions {
enabled = false
}
runPluginVerifier {
ideVersions.set(listOf("IU-223.4884.69"))
}
}
tasks.withType<ProcessResources> {

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -1,10 +1,8 @@
// This is a generated file. Not intended for manual editing.
package ru.adelf.idea.dotenv.psi;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.psi.PsiElement;
import com.intellij.model.psi.PsiExternalReferenceHost;
public interface DotEnvKey extends PsiElement {
public interface DotEnvKey extends PsiExternalReferenceHost {
}

View File

@@ -1,14 +1,15 @@
// This is a generated file. Not intended for manual editing.
package ru.adelf.idea.dotenv.psi;
import org.jetbrains.annotations.*;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.model.psi.PsiExternalReferenceHost;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import org.jetbrains.annotations.NotNull;
public class DotEnvVisitor extends PsiElementVisitor {
public void visitKey(@NotNull DotEnvKey o) {
visitPsiElement(o);
visitPsiExternalReferenceHost(o);
}
public void visitProperty(@NotNull DotEnvProperty o) {
@@ -19,6 +20,10 @@ public class DotEnvVisitor extends PsiElementVisitor {
visitPsiElement(o);
}
public void visitPsiExternalReferenceHost(@NotNull PsiExternalReferenceHost o) {
visitElement(o);
}
public void visitNamedElement(@NotNull DotEnvNamedElement o) {
visitPsiElement(o);
}

View File

@@ -0,0 +1,9 @@
package ru.adelf.idea.dotenv;
import com.intellij.openapi.util.IconLoader;
import javax.swing.*;
public class DotEnvIcons {
public static final Icon icon = IconLoader.getIcon("/icons/env.png", DotEnvIcons.class);
}

View File

@@ -87,7 +87,7 @@ public class EnvironmentVariablesApi {
return true;
}
for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) {
for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.getEnvVariablesProviders()) {
FileAcceptResult fileAcceptResult = provider.acceptFile(virtualFile);
if (!fileAcceptResult.isAccepted()) {
continue;
@@ -99,7 +99,7 @@ public class EnvironmentVariablesApi {
return true;
}, GlobalSearchScope.allScope(project));
return (targets.size() > 0 ? targets : secondaryTargets).toArray(PsiElement.EMPTY_ARRAY);
return (!targets.isEmpty() ? targets : secondaryTargets).toArray(PsiElement.EMPTY_ARRAY);
}
/**
@@ -114,7 +114,7 @@ public class EnvironmentVariablesApi {
PsiSearchHelper searchHelper = PsiSearchHelper.getInstance(project);
Processor<PsiFile> psiFileProcessor = psiFile -> {
for (EnvironmentVariablesUsagesProvider provider : EnvironmentVariablesProviderUtil.USAGES_PROVIDERS) {
for (EnvironmentVariablesUsagesProvider provider : EnvironmentVariablesProviderUtil.getEnvVariablesUsagesProviders()) {
targets.addAll(EnvironmentVariablesUtil.getUsagesElementsByKey(key, provider.getUsages(psiFile)));
}
@@ -129,7 +129,7 @@ public class EnvironmentVariablesApi {
}
private static FileAcceptResult getFileAcceptResult(VirtualFile virtualFile) {
for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) {
for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.getEnvVariablesProviders()) {
FileAcceptResult fileAcceptResult = provider.acceptFile(virtualFile);
if (!fileAcceptResult.isAccepted()) {
continue;

View File

@@ -6,7 +6,6 @@ import com.intellij.codeInsight.completion.PrioritizedLookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.codeInsight.navigation.actions.GotoDeclarationHandler;
import com.intellij.openapi.project.Project;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import ru.adelf.idea.dotenv.api.EnvironmentVariablesApi;
@@ -19,7 +18,7 @@ abstract public class BaseEnvCompletionProvider extends CompletionContributor im
LookupElementBuilder lockup = LookupElementBuilder.create(entry.getKey())
.withCaseSensitivity(false);
if (StringUtils.isNotEmpty(entry.getValue())) {
if (!entry.getValue().isEmpty()) {
lockup = lockup.withTailText(" = " + entry.getValue(), true);
}

View File

@@ -2,7 +2,6 @@ package ru.adelf.idea.dotenv.docker;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiRecursiveElementVisitor;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.yaml.psi.*;
import ru.adelf.idea.dotenv.models.EnvironmentKeyValue;
@@ -36,7 +35,7 @@ class DockerComposeYamlPsiElementsVisitor extends PsiRecursiveElementVisitor {
if (el instanceof YAMLScalar) {
EnvironmentKeyValue keyValue = EnvironmentVariablesUtil.getKeyValueFromString(((YAMLScalar) el).getTextValue());
if (StringUtils.isNotBlank(keyValue.getKey())) {
if (!keyValue.getKey().isBlank()) {
collectedItems.add(new KeyValuePsiElement(keyValue.getKey(), keyValue.getValue(), el));
}
}

View File

@@ -3,7 +3,6 @@ package ru.adelf.idea.dotenv.docker;
import com.intellij.docker.dockerFile.parser.psi.DockerFileEnvRegularDeclaration;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiRecursiveElementVisitor;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import ru.adelf.idea.dotenv.models.KeyValuePsiElement;
@@ -23,11 +22,11 @@ class DockerfilePsiElementsVisitor extends PsiRecursiveElementVisitor {
}
private void visitProperty(DockerFileEnvRegularDeclaration envRegularDeclaration) {
if (StringUtils.isNotBlank(envRegularDeclaration.getDeclaredName().getText()) && envRegularDeclaration.getRegularValue() != null) {
collectedItems.add(new KeyValuePsiElement(
envRegularDeclaration.getDeclaredName().getText(),
envRegularDeclaration.getRegularValue().getText(),
envRegularDeclaration));
var key = envRegularDeclaration.getDeclaredName().getText();
var valueElement = envRegularDeclaration.getRegularValue();
if (key != null && !key.isBlank() && valueElement != null) {
collectedItems.add(new KeyValuePsiElement(key, valueElement.getText(), envRegularDeclaration));
}
}

View File

@@ -1,35 +0,0 @@
package ru.adelf.idea.dotenv.extension;
import com.intellij.codeInsight.navigation.actions.GotoDeclarationHandler;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import ru.adelf.idea.dotenv.api.EnvironmentVariablesApi;
import ru.adelf.idea.dotenv.psi.DotEnvKey;
public class DotEnvKeyGotoHandler implements GotoDeclarationHandler {
@Nullable
@Override
public PsiElement[] getGotoDeclarationTargets(@Nullable PsiElement psiElement, int i, Editor editor) {
if(psiElement == null || psiElement.getParent() == null) {
return PsiElement.EMPTY_ARRAY;
}
psiElement = psiElement.getParent();
if(!(psiElement instanceof DotEnvKey)) {
return PsiElement.EMPTY_ARRAY;
}
return EnvironmentVariablesApi.getKeyUsages(psiElement.getProject(), psiElement.getText());
}
@Nullable
@Override
public String getActionText(@NotNull DataContext dataContext) {
return null;
}
}

View File

@@ -14,9 +14,7 @@ import ru.adelf.idea.dotenv.psi.DotEnvValue;
public class DotEnvValuesHiding extends FoldingBuilderEx implements DumbAware {
@Override
public FoldingDescriptor @NotNull [] buildFoldRegions(@NotNull PsiElement root,
@NotNull Document document,
boolean quick) {
public FoldingDescriptor [] buildFoldRegions(@NotNull PsiElement root, @NotNull Document document, boolean quick) {
if (!DotEnvSettings.getInstance().hideValuesInTheFile) return emptyResult;
return PsiTreeUtil.collectElementsOfType(root, DotEnvValue.class).stream().map(

View File

@@ -0,0 +1,38 @@
package ru.adelf.idea.dotenv.extension.symbols;
import com.intellij.model.Symbol;
import com.intellij.model.psi.PsiSymbolReference;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import ru.adelf.idea.dotenv.api.EnvironmentVariablesApi;
import ru.adelf.idea.dotenv.psi.DotEnvKey;
import java.util.Arrays;
import java.util.Collection;
@SuppressWarnings("UnstableApiUsage")
class DotEnvKeyUsageReference implements PsiSymbolReference {
private final DotEnvKey keyElement;
DotEnvKeyUsageReference(DotEnvKey keyElement) {
this.keyElement = keyElement;
}
@Override
public @NotNull PsiElement getElement() {
return keyElement;
}
@Override
public @NotNull TextRange getRangeInElement() {
return new TextRange(0, keyElement.getTextLength());
}
@Override
public @NotNull Collection<? extends Symbol> resolveReference() {
return Arrays.stream(EnvironmentVariablesApi.getKeyUsages(keyElement.getProject(), keyElement.getText()))
.map(DotEnvKeyUsageSymbol::new)
.toList();
}
}

View File

@@ -0,0 +1,104 @@
package ru.adelf.idea.dotenv.extension.symbols;
import com.intellij.model.Pointer;
import com.intellij.navigation.NavigatableSymbol;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Iconable;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.platform.backend.navigation.NavigationRequest;
import com.intellij.platform.backend.navigation.NavigationTarget;
import com.intellij.platform.backend.presentation.TargetPresentation;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import ru.adelf.idea.dotenv.DotEnvIcons;
import java.util.Collection;
import java.util.List;
@SuppressWarnings("UnstableApiUsage")
class DotEnvKeyUsageSymbol implements Pointer<DotEnvKeyUsageSymbol>, NavigatableSymbol, NavigationTarget {
private final PsiElement psiElement;
DotEnvKeyUsageSymbol(PsiElement psiElement) {
this.psiElement = psiElement;
}
@Override
public @Nullable DotEnvKeyUsageSymbol dereference() {
return this;
}
@Override
public @NotNull Collection<? extends NavigationTarget> getNavigationTargets(@NotNull Project project) {
return List.of();
}
@Override
public @NotNull Pointer<DotEnvKeyUsageSymbol> createPointer() {
return this;
}
@Override
public @NotNull TargetPresentation computePresentation() {
PsiFile psiFile = psiElement.getContainingFile();
if (psiFile == null) {
return TargetPresentation.builder(psiElement.getText())
.presentation();
}
int lineNumber = getLineNumber(psiElement, psiFile);
String filePath = getFilePath(psiFile);
if (filePath == null) {
filePath = psiFile.getName();
}
String locationString;
if (lineNumber == -1) {
locationString = filePath;
} else {
locationString = filePath + ":" + lineNumber;
}
return TargetPresentation.builder(psiElement.getText())
.locationText(locationString, psiFile.getIcon(Iconable.ICON_FLAG_VISIBILITY))
.icon(DotEnvIcons.icon)
.presentation();
}
@Override
public @Nullable NavigationRequest navigationRequest() {
return NavigationRequest.sourceNavigationRequest(psiElement.getContainingFile(), psiElement.getTextRange());
}
private int getLineNumber(@NotNull PsiElement psiElement, @NotNull PsiFile psiFile) {
Document document = psiFile.getViewProvider().getDocument();
if (document == null) return -1;
return document.getLineNumber(psiElement.getTextOffset()) + 1;
}
private @Nullable String getFilePath(@NotNull PsiFile psiFile) {
String basePath = psiFile.getProject().getBasePath();
if (basePath == null) return null;
VirtualFile virtualFile = psiFile.getVirtualFile();
if (virtualFile == null) return null;
String filePath = virtualFile.getPath();
if (filePath.startsWith(basePath)) {
return filePath.substring(basePath.length());
} else {
return null;
}
}
}

View File

@@ -0,0 +1,30 @@
package ru.adelf.idea.dotenv.extension.symbols;
import com.intellij.model.Symbol;
import com.intellij.model.psi.PsiExternalReferenceHost;
import com.intellij.model.psi.PsiSymbolReference;
import com.intellij.model.psi.PsiSymbolReferenceHints;
import com.intellij.model.psi.PsiSymbolReferenceProvider;
import com.intellij.model.search.SearchRequest;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import ru.adelf.idea.dotenv.psi.DotEnvKey;
import java.util.Collection;
import java.util.List;
@SuppressWarnings("UnstableApiUsage")
public class DotEnvSymbolReferenceProvider implements PsiSymbolReferenceProvider {
@Override
public @NotNull Collection<? extends PsiSymbolReference> getReferences(@NotNull PsiExternalReferenceHost keyElement,
@NotNull PsiSymbolReferenceHints psiSymbolReferenceHints) {
if (!(keyElement instanceof DotEnvKey)) return List.of();
return List.of(new DotEnvKeyUsageReference((DotEnvKey) keyElement));
}
@Override
public @NotNull Collection<? extends SearchRequest> getSearchRequests(@NotNull Project project, @NotNull Symbol symbol) {
return List.of();
}
}

View File

@@ -19,9 +19,9 @@ dotEnvFile ::= item_*
private item_ ::= (EXPORT? property|COMMENT|CRLF)
key ::= KEY_CHARS
key ::= KEY_CHARS {implements="com.intellij.model.psi.PsiExternalReferenceHost"}
value ::= VALUE_CHARS+ | QUOTE VALUE_CHARS* QUOTE?
property ::= (key SEPARATOR value? COMMENT?) | key COMMENT? {mixin="ru.adelf.idea.dotenv.psi.DotEnvNamedElementImpl"
implements="ru.adelf.idea.dotenv.psi.DotEnvNamedElement" methods=[getKeyText getValueText getName setName getNameIdentifier]}
implements="ru.adelf.idea.dotenv.psi.DotEnvNamedElement" methods=[getKeyText getValueText getName setName getNameIdentifier]}

View File

@@ -31,7 +31,7 @@ public class DotEnvKeyValuesIndex extends FileBasedIndexExtension<String, String
boolean storeValues = DotEnvSettings.getInstance().storeValues;
for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) {
for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.getEnvVariablesProviders()) {
for (KeyValuePsiElement keyValueElement : provider.getElements(fileContent.getPsiFile())) {
if (storeValues) {
map.put(keyValueElement.getKey(), keyValueElement.getShortValue());
@@ -61,7 +61,7 @@ public class DotEnvKeyValuesIndex extends FileBasedIndexExtension<String, String
@Override
public FileBasedIndex.InputFilter getInputFilter() {
return file -> {
for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) {
for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.getEnvVariablesProviders()) {
if (provider.acceptFile(file).isAccepted()) return true;
}

View File

@@ -1,3 +1,4 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package ru.adelf.idea.dotenv.php;
import com.intellij.psi.PsiElement;
@@ -39,7 +40,7 @@ class PhpEnvironmentCallsVisitor extends PsiRecursiveElementVisitor {
String key = ((StringLiteralExpression)parameters[0]).getContents();
collectedItems.add(new KeyUsagePsiElement(key, parameters[0]));
collectedItems.add(new KeyUsagePsiElement(key, expression));
}
private void visitArrayAccess(ArrayAccessExpression expression) {

View File

@@ -1,26 +1,21 @@
package ru.adelf.idea.dotenv.util;
import com.intellij.openapi.extensions.ExtensionPointName;
import org.jetbrains.annotations.NotNull;
import ru.adelf.idea.dotenv.api.EnvironmentVariablesProvider;
import ru.adelf.idea.dotenv.api.EnvironmentVariablesUsagesProvider;
public class EnvironmentVariablesProviderUtil {
public static final EnvironmentVariablesProvider[] PROVIDERS = getEnvVariablesProviders();
private static final ExtensionPointName<EnvironmentVariablesProvider> providersEP
= new ExtensionPointName<>("ru.adelf.idea.dotenv.environmentVariablesProvider");
public static final EnvironmentVariablesUsagesProvider[] USAGES_PROVIDERS = getEnvVariablesUsagesProviders();
private static final ExtensionPointName<EnvironmentVariablesUsagesProvider> usageProvidersEP
= new ExtensionPointName<>("ru.adelf.idea.dotenv.environmentVariablesUsagesProvider");
private static EnvironmentVariablesProvider[] getEnvVariablesProviders() {
return getExtensions("ru.adelf.idea.dotenv.environmentVariablesProvider");
public static EnvironmentVariablesProvider[] getEnvVariablesProviders() {
return providersEP.getExtensions();
}
private static EnvironmentVariablesUsagesProvider[] getEnvVariablesUsagesProviders() {
return getExtensions("ru.adelf.idea.dotenv.environmentVariablesUsagesProvider");
}
private static <T> T[] getExtensions(@NotNull String name) {
ExtensionPointName<T> pointName = new ExtensionPointName<>(name);
return pointName.getExtensions();
public static EnvironmentVariablesUsagesProvider[] getEnvVariablesUsagesProviders() {
return usageProvidersEP.getExtensions();
}
}

View File

@@ -26,9 +26,11 @@
<extensionPoints>
<extensionPoint interface="ru.adelf.idea.dotenv.api.EnvironmentVariablesProvider"
name="environmentVariablesProvider"/>
name="environmentVariablesProvider"
dynamic="true"/>
<extensionPoint interface="ru.adelf.idea.dotenv.api.EnvironmentVariablesUsagesProvider"
name="environmentVariablesUsagesProvider"/>
name="environmentVariablesUsagesProvider"
dynamic="true"/>
</extensionPoints>
<depends>com.intellij.modules.platform</depends>
@@ -46,7 +48,6 @@
<extensions defaultExtensionNs="com.intellij">
<applicationService serviceImplementation="ru.adelf.idea.dotenv.DotEnvSettings"/>
<gotoDeclarationHandler implementation="ru.adelf.idea.dotenv.extension.DotEnvKeyGotoHandler"/>
<fileBasedIndex implementation="ru.adelf.idea.dotenv.indexing.DotEnvKeyValuesIndex"/>
@@ -57,6 +58,11 @@
<lang.foldingBuilder language="DotEnv" implementationClass="ru.adelf.idea.dotenv.extension.DotEnvValuesHiding"/>
<psi.symbolReferenceProvider hostElementClass="ru.adelf.idea.dotenv.psi.DotEnvKey"
hostLanguage="DotEnv"
implementationClass="ru.adelf.idea.dotenv.extension.symbols.DotEnvSymbolReferenceProvider"
targetClass="ru.adelf.idea.dotenv.extension.symbols.DotEnvKeyUsageSymbol"/>
<localInspection language="DotEnv"
groupName="DotEnv"
shortName="DotEnvDuplicateKeyInspection"

View File

@@ -1,22 +1,20 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px"
width="40px" height="40px" viewBox="0 0 590.074 590.073" style="enable-background:new 0 0 590.074 590.073;"
xml:space="preserve">
<g>
<path d="M537.804,174.688c0-44.772-33.976-81.597-77.552-86.12c-12.23-32.981-43.882-56.534-81.128-56.534
c-16.304,0-31.499,4.59-44.514,12.422C319.808,17.949,291.513,0,258.991,0c-43.117,0-78.776,31.556-85.393,72.809
c-3.519-0.43-7.076-0.727-10.71-0.727c-47.822,0-86.598,38.767-86.598,86.598c0,2.343,0.172,4.638,0.354,6.933
c-24.25,15.348-40.392,42.333-40.392,73.153c0,27.244,12.604,51.513,32.273,67.387c-0.086,1.559-0.239,3.107-0.239,4.686
c0,47.822,38.767,86.598,86.598,86.598c14.334,0,27.817-3.538,39.723-9.696c16.495,11.848,40.115,26.67,51.551,23.715
c0,0,4.255,65.905,3.337,82.64c-1.75,31.843-11.303,67.291-18.025,95.979h104.117c0,0-15.348-63.954-16.018-85.307
c-0.669-21.354,6.675-60.675,6.675-60.675l36.118-37.36c13.903,9.505,30.695,14.908,48.807,14.908
c44.771,0,81.597-34.062,86.12-77.639c32.98-12.23,56.533-43.968,56.533-81.214c0-21.994-8.262-41.999-21.765-57.279
C535.71,195.926,537.804,185.561,537.804,174.688z M214.611,373.444c6.942-6.627,12.766-14.372,17.212-22.969l17.002,35.62
C248.816,386.096,239.569,390.179,214.611,373.444z M278.183,395.438c-8.798,1.597-23.782-25.494-34.416-47.517
c11.791,6.015,25.102,9.477,39.254,9.477c3.634,0,7.201-0.296,10.72-0.736C291.006,374.286,286.187,393.975,278.183,395.438z
M315.563,412.775c-20.35,5.651-8.167-36.501-2.334-60.904c4.218-1.568,8.301-3.413,12.183-5.604
c2.343,17.786,10.069,33.832,21.516,46.521C337.011,401.597,325.593,409.992,315.563,412.775z" fill="#00aa00"/>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 40 40">
<defs>
<style>
.cls-1 {
fill: #98d81d;
}
.cls-1, .cls-2 {
stroke-width: 0px;
}
.cls-2 {
fill: #5f8916;
}
</style>
</defs>
<path class="cls-1" d="M30.13,17.56c-2.6-7.12-10.13-14.38-10.13-14.38,0,0-7.53,7.26-10.13,14.38-.57,1.33-.89,2.8-.89,4.35,0,6.09,4.93,11.02,11.02,11.02s11.02-4.93,11.02-11.02c0-1.55-.32-3.01-.89-4.35Z"/>
<path class="cls-2" d="M31.87,21.91c0-1.61-.32-3.18-.95-4.66-2.64-7.21-10.01-14.38-10.33-14.68l-.59-.57-.59.57c-.31.3-7.7,7.48-10.32,14.66-.64,1.49-.96,3.06-.96,4.69,0,6.26,4.87,11.39,11.02,11.83v3.42c0,.47.38.85.85.85s.85-.38.85-.85v-3.42c6.15-.44,11.02-5.57,11.02-11.83ZM20.85,32.04v-2.99l6.44-6.51c.33-.33.33-.87,0-1.2-.33-.33-.87-.33-1.2,0l-5.24,5.29v-5.92l4.73-4.79c.33-.33.33-.87,0-1.2-.33-.33-.87-.33-1.2,0l-3.52,3.56v-5.5c0-.47-.38-.85-.85-.85s-.85.38-.85.85v5.32l-3.53-3.4c-.34-.33-.88-.31-1.2.02-.33.34-.31.88.02,1.2l4.71,4.53v5.88l-5.25-5.02c-.34-.32-.88-.31-1.2.03-.32.34-.31.88.03,1.2l6.43,6.14v3.34c-5.21-.43-9.32-4.81-9.32-10.13,0-1.39.28-2.74.84-4.06,2.08-5.7,7.52-11.61,9.33-13.47,1.8,1.86,7.25,7.76,9.33,13.47l.02.04c.55,1.27.83,2.62.83,4.01,0,5.32-4.11,9.69-9.32,10.13Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB