From 855f93515ad98dd4ba9dbea3efa66401c3b828fd Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Tue, 9 Oct 2018 21:52:30 +0200 Subject: [PATCH 1/5] [T3CMS] Re-add icon line marker provider --- .../idea/typo3/TYPO3CMSProjectSettings.java | 11 +- .../cedricziel/idea/typo3/TYPO3Patterns.java | 31 + .../codeInsight/IconLineMarkerProvider.java | 113 + .../configuration/TYPO3CMSSettingsForm.form | 32 +- .../configuration/TYPO3CMSSettingsForm.java | 8 + .../idea/typo3/icons/IconReference.java | 10 +- .../cedricziel/idea/typo3/icons/IconStub.java | 44 +- .../idea/typo3/index/IconIndex.java | 207 +- .../psi/visitor/CoreFlagParserVisitor.java | 18 +- .../psi/visitor/CoreIconParserVisitor.java | 19 +- .../src/main/resources/META-INF/plugin.xml | 2 + .../IconLineMarkerProviderTest.java | 69 + .../typo3/codeInsight/icon/IconRegistry7.php | 3082 +++++++++++++++ .../typo3/codeInsight/icon/IconRegistry8.php | 3479 +++++++++++++++++ .../typo3/codeInsight/icon/IconRegistry9.php | 861 ++++ .../general_utility_icon_provider_test.php | 29 + .../codeInsight/icon/icon_definition_test.php | 55 + .../codeInsight/icon/icon_provider_test.php | 4 + 18 files changed, 7919 insertions(+), 155 deletions(-) create mode 100644 typo3-cms/src/main/java/com/cedricziel/idea/typo3/codeInsight/IconLineMarkerProvider.java create mode 100644 typo3-cms/src/test/java/com/cedricziel/idea/typo3/codeInsight/IconLineMarkerProviderTest.java create mode 100644 typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/IconRegistry7.php create mode 100644 typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/IconRegistry8.php create mode 100644 typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/IconRegistry9.php create mode 100644 typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/general_utility_icon_provider_test.php create mode 100644 typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/icon_definition_test.php create mode 100644 typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/icon_provider_test.php diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/TYPO3CMSProjectSettings.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/TYPO3CMSProjectSettings.java index 67750468..2ffa4033 100644 --- a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/TYPO3CMSProjectSettings.java +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/TYPO3CMSProjectSettings.java @@ -25,6 +25,8 @@ public class TYPO3CMSProjectSettings implements PersistentStateComponent connectSignalMethodNameString return PlatformPatterns.psiElement(StringLiteralExpression.class) .withSuperParent(2, PlatformPatterns.psiElement(MethodReference.class)); } + + public static boolean iconAPIIconRetrieval(@NotNull PsiElement element) { + if (!PlatformPatterns + .and( + stringLeafElementPattern(), + PlatformPatterns.psiElement().withSuperParent( + 3, PlatformPatterns.psiElement(MethodReference.class) + ) + ) + .accepts(element)) { + + return false; + } + + + MethodReference methodReference = (MethodReference) PsiTreeUtil.findFirstParent(element, e -> e instanceof MethodReference); + + return methodReference.getName().equals("getIcon"); + } + + @NotNull + private static ElementPattern stringLeafElementPattern() { + + return PlatformPatterns.or( + PlatformPatterns.psiElement(PhpTokenTypes.STRING_LITERAL_SINGLE_QUOTE).withParent(StringLiteralExpression.class), + PlatformPatterns.psiElement(PhpTokenTypes.STRING_LITERAL).withParent(StringLiteralExpression.class) + ); + } } diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/codeInsight/IconLineMarkerProvider.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/codeInsight/IconLineMarkerProvider.java new file mode 100644 index 00000000..a922d9d5 --- /dev/null +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/codeInsight/IconLineMarkerProvider.java @@ -0,0 +1,113 @@ +package com.cedricziel.idea.typo3.codeInsight; + +import com.cedricziel.idea.typo3.TYPO3CMSIcons; +import com.cedricziel.idea.typo3.TYPO3CMSProjectComponent; +import com.cedricziel.idea.typo3.TYPO3CMSProjectSettings; +import com.cedricziel.idea.typo3.TYPO3Patterns; +import com.cedricziel.idea.typo3.icons.IconStub; +import com.cedricziel.idea.typo3.index.IconIndex; +import com.cedricziel.idea.typo3.util.IconUtil; +import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo; +import com.intellij.codeInsight.daemon.RelatedItemLineMarkerProvider; +import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; +import com.intellij.psi.impl.source.tree.LeafPsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import com.jetbrains.php.lang.psi.elements.PhpClass; +import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.io.IOException; +import java.util.Collection; + +import static com.cedricziel.idea.typo3.util.IconUtil.createIconFromFile; + +public class IconLineMarkerProvider extends RelatedItemLineMarkerProvider { + @Override + protected void collectNavigationMarkers(@NotNull PsiElement element, @NotNull Collection result) { + + if (!TYPO3CMSProjectSettings.isEnabled(element)) { + return; + } + + if (TYPO3CMSProjectSettings.getInstance(element).iconUsageGutterIconsEnabled) { + if (TYPO3Patterns.iconAPIIconRetrieval(element)) { + renderUsageMarker(element, result); + } + } + + if (TYPO3CMSProjectSettings.getInstance(element).iconDefinitionGutterIconsEnabled) { + renderDefinitionMarker(element, result); + } + } + + private void renderUsageMarker(PsiElement element, Collection result) { + StringLiteralExpression literalExpression = (StringLiteralExpression) element.getParent(); + String value = literalExpression.getContents(); + + if (value.isEmpty()) { + return; + } + + if (!IconIndex.hasIcon(element.getProject(), value)) { + return; + } + + IconIndex.getIcon(element.getProject(), value).forEach((s) -> markLineForIcon(element, result, s)); + } + + private void renderDefinitionMarker(PsiElement element, Collection result) { + PhpClass parentClass = PsiTreeUtil.getParentOfType(element, PhpClass.class); + if (parentClass == null) { + return; + } + + if (!parentClass.getPresentableFQN().equals(IconUtil.ICON_REGISTRY_CLASS)) { + return; + } + + for (IconStub icon : IconIndex.getAllIcons(element.getProject())) { + if (icon.getElement().equals(element)) { + if (!(element instanceof LeafPsiElement)) { + LeafPsiElement leafChild = PsiTreeUtil.findChildOfType(element, LeafPsiElement.class); + if (leafChild != null) { + markLineForIcon(leafChild, result, icon); + } + } else { + markLineForIcon(element, result, icon); + } + } + } + } + + private void markLineForIcon(PsiElement element, Collection result, IconStub iconForLine) { + NavigationGutterIconBuilder builder; + VirtualFile virtualFile = iconForLine.getElement().getContainingFile().getVirtualFile(); + if (virtualFile == null) { + builder = NavigationGutterIconBuilder + .create(TYPO3CMSIcons.ICON_NOT_RESOLVED) + .setTarget(iconForLine.getElement()) + .setTooltipText("Navigate to icon definition"); + } else { + try { + Icon icon = createIconFromFile(virtualFile); + if (icon == null) { + icon = TYPO3CMSIcons.ICON_NOT_RESOLVED; + } + + builder = NavigationGutterIconBuilder + .create(icon) + .setTarget(iconForLine.getElement()) + .setTooltipTitle("Navigate to icon definition"); + } catch (IOException e) { + // icon could not be loaded + TYPO3CMSProjectComponent.getLogger().error("Could not find image."); + return; + } + } + + result.add(builder.createLineMarkerInfo(element)); + } +} diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/configuration/TYPO3CMSSettingsForm.form b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/configuration/TYPO3CMSSettingsForm.form index 68d5824e..80403fe4 100644 --- a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/configuration/TYPO3CMSSettingsForm.form +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/configuration/TYPO3CMSSettingsForm.form @@ -1,6 +1,6 @@
- + @@ -10,7 +10,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -55,7 +55,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -71,7 +71,7 @@ - + @@ -79,7 +79,7 @@ - + @@ -87,12 +87,28 @@ - + + + + + + + + + + + + + + + + + diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/configuration/TYPO3CMSSettingsForm.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/configuration/TYPO3CMSSettingsForm.java index 69b1ff30..155f49b8 100644 --- a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/configuration/TYPO3CMSSettingsForm.java +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/configuration/TYPO3CMSSettingsForm.java @@ -19,6 +19,8 @@ public class TYPO3CMSSettingsForm implements Configurable { private JCheckBox routeAnnotatorEnabled; private JCheckBox translationEnableTextFolding; private JComboBox translationFavoriteLocale; + private JCheckBox iconUsageGutterIconsEnabled; + private JCheckBox iconDefinitionGutterIconsEnabled; public TYPO3CMSSettingsForm(@NotNull Project project) { this.project = project; @@ -54,6 +56,8 @@ public boolean isModified() { || routeAnnotatorEnabled.isSelected() != getSettings().routeAnnotatorEnabled || translationEnableTextFolding.isSelected() != getSettings().translationEnableTextFolding || translationFavoriteLocale.getSelectedItem() != getSettings().translationFavoriteLocale + || iconUsageGutterIconsEnabled.isSelected() != getSettings().iconUsageGutterIconsEnabled + || iconDefinitionGutterIconsEnabled.isSelected() != getSettings().iconDefinitionGutterIconsEnabled ; } @@ -62,6 +66,8 @@ public void apply() { getSettings().pluginEnabled = enablePlugin.isSelected(); getSettings().iconAnnotatorEnabled = iconAnnotatorEnabled.isSelected(); getSettings().routeAnnotatorEnabled = routeAnnotatorEnabled.isSelected(); + getSettings().iconUsageGutterIconsEnabled = iconUsageGutterIconsEnabled.isSelected(); + getSettings().iconDefinitionGutterIconsEnabled = iconDefinitionGutterIconsEnabled.isSelected(); getSettings().translationEnableTextFolding = translationEnableTextFolding.isSelected(); getSettings().translationFavoriteLocale = translationFavoriteLocale.getSelectedItem(); @@ -75,6 +81,8 @@ private void updateUIFromSettings() { enablePlugin.setSelected(getSettings().pluginEnabled); iconAnnotatorEnabled.setSelected(getSettings().iconAnnotatorEnabled); routeAnnotatorEnabled.setSelected(getSettings().routeAnnotatorEnabled); + iconUsageGutterIconsEnabled.setSelected(getSettings().iconUsageGutterIconsEnabled); + iconDefinitionGutterIconsEnabled.setSelected(getSettings().iconDefinitionGutterIconsEnabled); translationEnableTextFolding.setSelected(getSettings().translationEnableTextFolding); translationFavoriteLocale.setSelectedItem(getSettings().translationFavoriteLocale); diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/IconReference.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/IconReference.java index a2ea2e66..0798f3c6 100644 --- a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/IconReference.java +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/IconReference.java @@ -9,19 +9,23 @@ import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; import org.jetbrains.annotations.NotNull; +import java.util.stream.Collectors; + public class IconReference extends PsiPolyVariantReferenceBase { - private final String iconName; + private final String iconIdentifier; public IconReference(StringLiteralExpression psiElement) { super(psiElement); - iconName = psiElement.getContents(); + iconIdentifier = psiElement.getContents(); } @NotNull @Override public ResolveResult[] multiResolve(boolean incompleteCode) { - return PsiElementResolveResult.createResults(IconIndex.getIconDefinitionElements(myElement.getProject(), iconName)); + return PsiElementResolveResult.createResults( + IconIndex.getIcon(myElement.getProject(), iconIdentifier).stream().map(IconStub::getElement).collect(Collectors.toList()) + ); } @NotNull diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/IconStub.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/IconStub.java index 184bab5e..84749aba 100644 --- a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/IconStub.java +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/IconStub.java @@ -1,24 +1,20 @@ package com.cedricziel.idea.typo3.icons; -import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; +import com.intellij.psi.SmartPointerManager; +import com.intellij.psi.SmartPsiElementPointer; -import java.io.Serializable; - -public class IconStub implements IconInterface, Serializable { +public class IconStub implements IconInterface { + private final SmartPsiElementPointer element; private String identifier; - private String extension; private String filename; private String provider; private String source; - private TextRange textRange; - public IconStub(String identifier, PsiElement element) { this.identifier = identifier; - - this.textRange = new TextRange(element.getTextRange().getStartOffset(), element.getTextRange().getEndOffset()); + this.element = SmartPointerManager.createPointer(element); } public String getIdentifier() { @@ -41,10 +37,6 @@ public void setSource(String source) { this.source = source; } - public TextRange getTextRange() { - return textRange; - } - @Override public String getExtension() { return null; @@ -69,29 +61,7 @@ public void setProvider(String provider) { this.provider = provider; } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - IconStub iconStub = (IconStub) o; - - if (!identifier.equals(iconStub.identifier)) return false; - if (extension != null ? !extension.equals(iconStub.extension) : iconStub.extension != null) return false; - if (filename != null ? !filename.equals(iconStub.filename) : iconStub.filename != null) return false; - if (provider != null ? !provider.equals(iconStub.provider) : iconStub.provider != null) return false; - if (source != null ? !source.equals(iconStub.source) : iconStub.source != null) return false; - return textRange.equals(iconStub.textRange); - } - - @Override - public int hashCode() { - int result = identifier.hashCode(); - result = 31 * result + (extension != null ? extension.hashCode() : 0); - result = 31 * result + (filename != null ? filename.hashCode() : 0); - result = 31 * result + (provider != null ? provider.hashCode() : 0); - result = 31 * result + (source != null ? source.hashCode() : 0); - result = 31 * result + textRange.hashCode(); - return result; + public PsiElement getElement() { + return element.getElement(); } } diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/index/IconIndex.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/index/IconIndex.java index 589b5dcb..dcad2a17 100644 --- a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/index/IconIndex.java +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/index/IconIndex.java @@ -1,38 +1,42 @@ package com.cedricziel.idea.typo3.index; import com.cedricziel.idea.typo3.icons.IconStub; -import com.cedricziel.idea.typo3.index.externalizer.ObjectStreamDataExternalizer; import com.cedricziel.idea.typo3.psi.visitor.CoreFlagParserVisitor; import com.cedricziel.idea.typo3.psi.visitor.CoreIconParserVisitor; import com.intellij.openapi.file.exclude.EnforcedPlainTextFileTypeManager; -import com.intellij.openapi.file.exclude.ProjectPlainTextFileTypeManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.patterns.PlatformPatterns; -import com.intellij.psi.PsiElement; +import com.intellij.openapi.util.Key; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.CachedValue; +import com.intellij.psi.util.CachedValueProvider; +import com.intellij.psi.util.CachedValuesManager; +import com.intellij.psi.util.PsiModificationTracker; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.indexing.*; -import com.intellij.util.io.DataExternalizer; import com.intellij.util.io.EnumeratorStringDescriptor; import com.intellij.util.io.KeyDescriptor; -import com.jetbrains.php.lang.parser.PhpElementTypes; import com.jetbrains.php.lang.psi.PhpFile; import com.jetbrains.php.lang.psi.PhpPsiUtil; -import com.jetbrains.php.lang.psi.elements.Field; -import com.jetbrains.php.lang.psi.elements.Method; import com.jetbrains.php.lang.psi.elements.PhpClass; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import static com.cedricziel.idea.typo3.util.IconUtil.ICON_REGISTRY_CLASS; -public class IconIndex extends FileBasedIndexExtension { +public class IconIndex extends ScalarIndexExtension { - public static ID KEY = ID.create("com.cedricziel.idea.typo3.index.icon"); + private static final Key>> TYPO3_CMS_ICON_USAGES = new Key<>("TYPO3_CMS_ICON_USAGES"); + private static final Key> TYPO3_CMS_PROJECT_ICONS = new Key<>("TYPO3_CMS_PROJECT_ICONS"); + + public static ID KEY = ID.create("com.cedricziel.idea.typo3.index.icon"); @NotNull public static Collection getAllAvailableIcons(@NotNull Project project) { @@ -40,127 +44,140 @@ public static Collection getAllAvailableIcons(@NotNull Project project) return FileBasedIndex.getInstance().getAllKeys(KEY, project); } - public static Map getIconDefinitionByIdentifier(@NotNull Project project, String iconIdentifier) { - Set identifiers = new HashSet<>(); - identifiers.add(iconIdentifier); - - Map icons = new THashMap<>(); - - FileBasedIndex.getInstance().getFilesWithKey(KEY, identifiers, virtualFile -> { - FileBasedIndex.getInstance().processValues(KEY, iconIdentifier, virtualFile, (file, value) -> { - icons.put(file, value); - - return true; - }, GlobalSearchScope.allScope(project)); + public static Collection getIcon(@NotNull Project project, @NotNull String iconIdentifier) { + List icons = new ArrayList<>(); - return true; - }, GlobalSearchScope.allScope(project)); + for (IconStub icon : getAllIcons(project)) { + if (icon.getIdentifier().equals(iconIdentifier)) { + icons.add(icon); + } + } return icons; } @NotNull - public static PsiElement[] getIconDefinitionElements(@NotNull Project project, @NotNull String identifier) { - Map iconDefinitionByIdentifier = getIconDefinitionByIdentifier(project, identifier); - if (iconDefinitionByIdentifier.size() > 0) { - return iconDefinitionByIdentifier - .keySet() - .stream() - .map(virtualFile -> { - IconStub iconStub = iconDefinitionByIdentifier.get(virtualFile); - PsiFile file = PsiManager.getInstance(project).findFile(virtualFile); - return file != null ? file.findElementAt(iconStub.getTextRange().getStartOffset()) : null; - }) - .filter(Objects::nonNull) - .toArray(PsiElement[]::new); + public static IconStub[] getAllIcons(@NotNull Project project) { + + CachedValue value = project.getUserData(TYPO3_CMS_PROJECT_ICONS); + if (value != null && value.hasUpToDateValue()) { + return value.getValue(); } - return new PsiElement[0]; + CachedValue cachedValue = CachedValuesManager.getManager(project).createCachedValue(() -> { + return CachedValueProvider.Result.create(getAllIconsUncached(project), PsiModificationTracker.MODIFICATION_COUNT); + }, false); + + project.putUserData(TYPO3_CMS_PROJECT_ICONS, cachedValue); + + return cachedValue.getValue(); } @NotNull - public static IconStub[] getAllIcons(@NotNull Project project) { - List iconStubs = new ArrayList<>(); + private static IconStub[] getAllIconsUncached(@NotNull Project project) { + Map iconStubs = new THashMap<>(); + FileBasedIndex.getInstance().getAllKeys(IconIndex.KEY, project).forEach(k -> { - List values = FileBasedIndex.getInstance().getValues(IconIndex.KEY, k, GlobalSearchScope.allScope(project)); - iconStubs.addAll(values); + FileBasedIndex.getInstance().getFilesWithKey(IconIndex.KEY, ContainerUtil.set(k), v -> { + PsiFile psiFile = PsiManager.getInstance(project).findFile(v); + if (psiFile instanceof PhpFile) { + visitPhpFile(iconStubs, (PhpFile) psiFile); + } + + return true; + }, GlobalSearchScope.allScope(project)); }); - return iconStubs.toArray(new IconStub[iconStubs.size()]); + return iconStubs.values().toArray(new IconStub[0]); + } + + public static boolean hasIcon(@NotNull Project project, @NotNull String iconIdentifier) { + AtomicBoolean iconExists = new AtomicBoolean(false); + + FileBasedIndex.getInstance().processAllKeys(IconIndex.KEY, s -> { + if (s.equals(iconIdentifier)) { + iconExists.set(true); + + return false; + } + + return true; + }, project); + + return iconExists.get(); } @NotNull @Override - public ID getName() { + public ID getName() { return KEY; } @NotNull @Override - public DataIndexer getIndexer() { + public DataIndexer getIndexer() { return inputData -> { - Map map = new THashMap<>(); + Map iconIdentifiers = new THashMap<>(); // index the icon registry - if (inputData.getPsiFile() instanceof PhpFile) { - PhpClass iconRegistry = PhpPsiUtil.findClass((PhpFile) inputData.getPsiFile(), phpClass -> { - String presentableFQN = phpClass.getPresentableFQN(); - return presentableFQN.equals(ICON_REGISTRY_CLASS); - }); - - if (iconRegistry != null) { - for (PsiElement element : iconRegistry.getChildren()) { - if (PlatformPatterns.psiElement(PhpElementTypes.CLASS_FIELDS).accepts(element)) { - for (PsiElement fieldsInner : element.getChildren()) { - if (PlatformPatterns.psiElement(PhpElementTypes.CLASS_FIELD).accepts(fieldsInner)) { - - Field field = (Field) fieldsInner; - - // TYPO3 7 through 8 use icons, 9 uses dynamic icons and the "staticIcons" field - if (field.getName().equals("icons") || field.getName().equals("staticIcons")) { - CoreIconParserVisitor visitor = new CoreIconParserVisitor(); - visitor.visitElement(field.getDefaultValue()); - - Map map1 = visitor.getMap();map1.forEach(map::put); - } - } - } - } - - if (PlatformPatterns.psiElement(PhpElementTypes.CLASS_METHOD).accepts(element)) { - Method method = (Method) element; - if ("registerFlags".equals(method.getName())) { - CoreFlagParserVisitor visitor = new CoreFlagParserVisitor(); - method.accept(visitor); - visitor.visitElement(method); - - Map map1 = visitor.getMap(); - map1.forEach(map::put); - } - } - } - } + PsiFile psiFile = inputData.getPsiFile(); + if (psiFile instanceof PhpFile) { + visitPhpFile(iconIdentifiers, (PhpFile) psiFile); } - return map; + Map result = new THashMap<>(); + iconIdentifiers.forEach((k, v) -> result.put(k, null)); + + return result; }; } - @NotNull - @Override - public KeyDescriptor getKeyDescriptor() { - return EnumeratorStringDescriptor.INSTANCE; + private static void visitPhpFile(Map iconIdentifiers, PhpFile psiFile) { + CachedValue> userData = psiFile.getUserData(TYPO3_CMS_ICON_USAGES); + if (userData != null && userData.hasUpToDateValue()) { + iconIdentifiers.putAll(userData.getValue()); + + return; + } + + CachedValue> cachedValue = CachedValuesManager.getManager(psiFile.getProject()).createCachedValue(() -> { + Map cacher = new THashMap<>(); + + visitIconRegistry(cacher, psiFile); + + return CachedValueProvider.Result.create(cacher, PsiModificationTracker.MODIFICATION_COUNT); + }, false); + + psiFile.putUserData(TYPO3_CMS_ICON_USAGES, cachedValue); + iconIdentifiers.putAll(cachedValue.getValue()); + } + + private static void visitIconRegistry(Map iconIdentifiers, PhpFile phpFile) { + PhpClass iconRegistryClass = PhpPsiUtil.findClass(phpFile, phpClass -> phpClass.getPresentableFQN().equals(ICON_REGISTRY_CLASS)); + if (iconRegistryClass == null) { + return; + } + + CoreIconParserVisitor iconVisitor = new CoreIconParserVisitor(); + iconRegistryClass.accept(iconVisitor); + + iconVisitor.getMap().forEach(iconIdentifiers::put); + + CoreFlagParserVisitor flagVisitor = new CoreFlagParserVisitor(); + iconRegistryClass.accept(flagVisitor); + + flagVisitor.getMap().forEach(iconIdentifiers::put); } @NotNull @Override - public DataExternalizer getValueExternalizer() { - return new ObjectStreamDataExternalizer<>(); + public KeyDescriptor getKeyDescriptor() { + return EnumeratorStringDescriptor.INSTANCE; } @Override public int getVersion() { - return 0; + return 1; } @NotNull @@ -169,7 +186,7 @@ public FileBasedIndex.InputFilter getInputFilter() { return file -> { String extension = file.getExtension(); - Boolean isEnforcedPlaintext = EnforcedPlainTextFileTypeManager.getInstance().isMarkedAsPlainText(file); + boolean isEnforcedPlaintext = EnforcedPlainTextFileTypeManager.getInstance().isMarkedAsPlainText(file); return extension != null && extension.equalsIgnoreCase("php") && !isEnforcedPlaintext; }; diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/psi/visitor/CoreFlagParserVisitor.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/psi/visitor/CoreFlagParserVisitor.java index bb7774cc..919b48f0 100644 --- a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/psi/visitor/CoreFlagParserVisitor.java +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/psi/visitor/CoreFlagParserVisitor.java @@ -2,16 +2,18 @@ import com.cedricziel.idea.typo3.icons.IconStub; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.php.lang.psi.elements.*; +import com.jetbrains.php.lang.psi.visitors.PhpRecursiveElementVisitor; -import java.util.*; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; /** * @author Cedric Ziel */ -public class CoreFlagParserVisitor extends PsiElementVisitor { +public class CoreFlagParserVisitor extends PhpRecursiveElementVisitor { private final Map map; @@ -24,7 +26,15 @@ public Map getMap() { } @Override - public void visitElement(PsiElement element) { + public void visitPhpMethod(Method method) { + if ("registerFlags".equals(method.getName())) { + visitRegisterFlags(method); + } + + super.visitPhpMethod(method); + } + + private void visitRegisterFlags(Method element) { Variable iconFolder = PsiTreeUtil.findChildOfType(element, Variable.class); if (iconFolder == null || !iconFolder.getName().equals("iconFolder")) { // Something changed - dynamic parsing failed. diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/psi/visitor/CoreIconParserVisitor.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/psi/visitor/CoreIconParserVisitor.java index 364e15dd..08ab84f9 100644 --- a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/psi/visitor/CoreIconParserVisitor.java +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/psi/visitor/CoreIconParserVisitor.java @@ -1,9 +1,9 @@ package com.cedricziel.idea.typo3.psi.visitor; import com.cedricziel.idea.typo3.icons.IconStub; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiRecursiveElementVisitor; +import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.php.lang.psi.elements.*; +import com.jetbrains.php.lang.psi.visitors.PhpRecursiveElementVisitor; import org.jetbrains.annotations.NotNull; import java.util.HashMap; @@ -12,7 +12,7 @@ /** * Walks a psiFile recursively and parses the service definitions. */ -public class CoreIconParserVisitor extends PsiRecursiveElementVisitor { +public class CoreIconParserVisitor extends PhpRecursiveElementVisitor { private Map map; @@ -26,11 +26,16 @@ public Map getMap () { } @Override - public void visitElement(PsiElement element) { - if ((element instanceof ArrayCreationExpression)) { - visitIconDefinition((ArrayCreationExpression) element); + public void visitPhpField(Field field) { + // TYPO3 7 through 8 use icons, 9 uses dynamic icons and the "staticIcons" field + if (field.getName().equals("icons") || field.getName().equals("staticIcons")) { + ArrayCreationExpression arrayCreation = PsiTreeUtil.findChildOfType(field, ArrayCreationExpression.class); + if (arrayCreation != null) { + visitIconDefinition(arrayCreation); + } } - super.visitElement(element); + + super.visitPhpField(field); } private void visitIconDefinition(ArrayCreationExpression element) { diff --git a/typo3-cms/src/main/resources/META-INF/plugin.xml b/typo3-cms/src/main/resources/META-INF/plugin.xml index 20df58b2..40ce8d41 100644 --- a/typo3-cms/src/main/resources/META-INF/plugin.xml +++ b/typo3-cms/src/main/resources/META-INF/plugin.xml @@ -198,6 +198,8 @@ It is a great inspiration for possible solutions and parts of the code.

--> + diff --git a/typo3-cms/src/test/java/com/cedricziel/idea/typo3/codeInsight/IconLineMarkerProviderTest.java b/typo3-cms/src/test/java/com/cedricziel/idea/typo3/codeInsight/IconLineMarkerProviderTest.java new file mode 100644 index 00000000..4ac5b29c --- /dev/null +++ b/typo3-cms/src/test/java/com/cedricziel/idea/typo3/codeInsight/IconLineMarkerProviderTest.java @@ -0,0 +1,69 @@ +package com.cedricziel.idea.typo3.codeInsight; + +import com.cedricziel.idea.typo3.AbstractTestCase; +import com.cedricziel.idea.typo3.TYPO3CMSProjectSettings; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; + +public class IconLineMarkerProviderTest extends AbstractTestCase { + @Override + protected String getTestDataPath() { + return super.getTestDataPath() + "/codeInsight/icon"; + } + + public void testLineMarkerIsNotAddedIfPluginIsNotEnabled() { + disablePlugin(); + + myFixture.copyFileToProject("IconRegistry7.php"); + + PsiFile psiFile = myFixture.configureByFile("icon_provider_test.php"); + + PsiElement elementAt = psiFile.findElementAt(myFixture.getCaretOffset()); + assertLineMarkerIsEmpty(elementAt); + } + + public void testLineMarkerIsNotAddedIfPluginIsEnabledButFeatureTurnedOff() { + TYPO3CMSProjectSettings.getInstance(getProject()).iconUsageGutterIconsEnabled = false; + + myFixture.copyFileToProject("IconRegistry7.php"); + + PsiFile psiFile = myFixture.configureByFile("icon_provider_test.php"); + + PsiElement elementAt = psiFile.findElementAt(myFixture.getCaretOffset()); + assertLineMarkerIsEmpty(elementAt); + } + + public void testLineMarkerIsAddedIfPluginIsEnabled() { + myFixture.copyFileToProject("IconRegistry7.php"); + + PsiFile psiFile = myFixture.configureByFile("icon_provider_test.php"); + + PsiElement elementAt = psiFile.findElementAt(myFixture.getCaretOffset()); + assertLineMarker(elementAt, "Navigate to icon definition"); + } + + public void testDefinitionLineMarkerIsNotAddedIfPluginIsNotEnabled() { + disablePlugin(); + + PsiFile psiFile = myFixture.configureByFile("icon_definition_test.php"); + + PsiElement elementAt = psiFile.findElementAt(myFixture.getCaretOffset()); + assertLineMarkerIsEmpty(elementAt); + } + + public void testDefinitionLineMarkerIsNotAddedIfPluginIsEnabledButFeatureTurnedOff() { + TYPO3CMSProjectSettings.getInstance(getProject()).iconDefinitionGutterIconsEnabled = false; + + PsiFile psiFile = myFixture.configureByFile("icon_definition_test.php"); + + PsiElement elementAt = psiFile.findElementAt(myFixture.getCaretOffset()); + assertLineMarkerIsEmpty(elementAt); + } + + public void testDefinitionLineMarkerIsAddedIfPluginIsEnabled() { + PsiFile psiFile = myFixture.configureByFile("icon_definition_test.php"); + + PsiElement elementAt = psiFile.findElementAt(myFixture.getCaretOffset()); + assertLineMarker(elementAt, "Navigate to icon definition"); + } +} diff --git a/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/IconRegistry7.php b/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/IconRegistry7.php new file mode 100644 index 00000000..e0e4d67f --- /dev/null +++ b/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/IconRegistry7.php @@ -0,0 +1,3082 @@ + [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-add.svg' + ] + ], + 'actions-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-close.svg' + ] + ], + 'actions-database' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-database.svg' + ] + ], + 'actions-database-import' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-database-import.svg' + ] + ], + 'actions-database-reload' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-database-reload.svg' + ] + ], + 'actions-delete' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-delete.svg' + ] + ], + 'actions-document-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-close.svg' + ] + ], + 'actions-document-duplicates-select' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-duplicates-select.svg' + ] + ], + 'actions-document-edit-access' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-edit-access.svg' + ] + ], + 'actions-document-export-csv' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-export-csv.svg' + ] + ], + 'actions-document-export-t3d' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-export-t3d.svg' + ] + ], + 'actions-document-history-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-history-open.svg' + ] + ], + 'actions-document-import-t3d' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-import-t3d.svg' + ] + ], + 'actions-document-info' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-info.svg' + ] + ], + 'actions-document-localize' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-localize.svg' + ] + ], + 'actions-document-move' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-move.svg' + ] + ], + 'actions-document-new' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-new.svg' + ] + ], + 'actions-document-open-read-only' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-open-read-only.svg' + ] + ], + 'actions-document-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-open.svg' + ] + ], + 'actions-document-paste-after' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-paste-after.svg' + ] + ], + 'actions-document-paste-before' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-paste-before.svg' + ] + ], + 'actions-document-paste-into' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-paste-into.svg' + ] + ], + 'actions-document-paste' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-paste.svg' + ] + ], + 'actions-document-save-cleartranslationcache' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-save-cleartranslationcache.svg' + ] + ], + 'actions-document-save-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-save-close.svg' + ] + ], + 'actions-document-save-new' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-save-new.svg' + ] + ], + 'actions-document-save-translation' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-save-translation.svg' + ] + ], + 'actions-document-save-view' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-save-view.svg' + ] + ], + 'actions-document-save' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-save.svg' + ] + ], + 'actions-document-select' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-select.svg' + ] + ], + 'actions-document-synchronize' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-synchronize.svg' + ] + ], + 'actions-document-view' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-view.svg' + ] + ], + 'actions-document' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document.svg' + ] + ], + 'actions-download' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-download.svg' + ] + ], + 'actions-edit-add' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-add.svg' + ] + ], + 'actions-edit-copy-release' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-copy-release.svg' + ] + ], + 'actions-edit-copy' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-copy.svg' + ] + ], + 'actions-edit-cut-release' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-cut-release.svg' + ] + ], + 'actions-edit-cut' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-cut.svg' + ] + ], + 'actions-edit-delete' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-delete.svg' + ] + ], + 'actions-edit-download' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-download.svg' + ] + ], + 'actions-edit-hide' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-hide.svg' + ] + ], + 'actions-edit-insert-default' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-insert-default.svg' + ] + ], + 'actions-edit-localize-status-high' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-localize-status-high.svg' + ] + ], + 'actions-edit-localize-status-low' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-localize-status-low.svg' + ] + ], + 'actions-edit-merge-localization' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-merge-localization.svg' + ] + ], + 'actions-edit-pick-date' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-pick-date.svg' + ] + ], + 'actions-edit-rename' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-rename.svg' + ] + ], + 'actions-edit-replace' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-replace.svg' + ] + ], + 'actions-edit-restore' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-restore.svg' + ] + ], + 'actions-edit-undelete-edit' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-undelete-edit.svg' + ] + ], + 'actions-edit-undo' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-undo.svg' + ] + ], + 'actions-edit-unhide' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-unhide.svg' + ] + ], + 'actions-edit-upload' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-upload.svg' + ] + ], + 'actions-file-csv' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-file-csv.svg' + ] + ], + 'actions-file-html' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-file-html.svg' + ] + ], + 'actions-file-openoffice' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-file-openoffice.svg' + ] + ], + 'actions-file-pdf' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-file-pdf.svg' + ] + ], + 'actions-file' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-file.svg' + ] + ], + 'actions-filter' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-filter.svg' + ] + ], + 'actions-input-clear' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-input-clear.svg' + ] + ], + 'actions-insert-record' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-insert-record.svg' + ] + ], + 'actions-insert-reference' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-insert-reference.svg' + ] + ], + 'actions-localize' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-localize.svg' + ] + ], + 'actions-lock' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-lock.svg' + ] + ], + 'actions-logout' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-logout.svg' + ] + ], + 'actions-markstate' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-markstate.svg' + ] + ], + 'actions-merge' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-merge.svg' + ] + ], + 'actions-message-error-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-message-error-close.svg' + ] + ], + 'actions-message-information-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-message-information-close.svg' + ] + ], + 'actions-message-notice-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-message-notice-close.svg' + ] + ], + 'actions-message-ok-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-message-ok-close.svg' + ] + ], + 'actions-message-warning-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-message-warning-close.svg' + ] + ], + 'actions-move-down' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move-down.svg' + ] + ], + 'actions-move-left' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move-left.svg' + ] + ], + 'actions-move-move' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move-move.svg' + ] + ], + 'actions-move-right' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move-right.svg' + ] + ], + 'actions-move-to-bottom' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move-to-bottom.svg' + ] + ], + 'actions-move-to-top' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move-to-top.svg' + ] + ], + 'actions-move-up' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move-up.svg' + ] + ], + 'actions-move' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move.svg' + ] + ], + 'actions-online-media-add' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-online-media-add.svg' + ] + ], + 'actions-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-open.svg' + ] + ], + 'actions-page-move' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-page-move.svg' + ] + ], + 'actions-page-new' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-page-new.svg' + ] + ], + 'actions-page-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-page-open.svg' + ] + ], + 'actions-pagetree-collapse' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-pagetree-collapse.svg' + ] + ], + 'actions-pagetree-expand' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-pagetree-expand.svg' + ] + ], + 'actions-pagetree-mountroot' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-pagetree-mountroot.svg' + ] + ], + 'actions-preview' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-preview.svg' + ] + ], + 'actions-refresh' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-refresh.svg' + ] + ], + 'actions-remove' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-remove.svg' + ] + ], + 'actions-search' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-search.svg' + ] + ], + 'actions-selection-delete' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-selection-delete.svg' + ] + ], + 'actions-swap' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-swap.svg' + ] + ], + 'actions-synchronize' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-synchronize.svg' + ] + ], + 'actions-system-backend-user-emulate' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-backend-user-emulate.svg' + ] + ], + 'actions-system-backend-user-switch' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-backend-user-switch.svg' + ] + ], + 'actions-system-cache-clear-impact-high' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-cache-clear-impact-high.svg' + ] + ], + 'actions-system-cache-clear-impact-low' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-cache-clear-impact-low.svg' + ] + ], + 'actions-system-cache-clear-impact-medium' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-cache-clear-impact-medium.svg' + ] + ], + 'actions-system-cache-clear-rte' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-cache-clear-rte.svg' + ] + ], + 'actions-system-cache-clear' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-cache-clear.svg' + ] + ], + 'actions-system-extension-configure' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-configure.svg' + ] + ], + 'actions-system-extension-documentation' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-documentation.svg' + ] + ], + 'actions-system-extension-download' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-download.svg' + ] + ], + 'actions-system-extension-import' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-import.svg' + ] + ], + 'actions-system-extension-install' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-install.svg' + ] + ], + 'actions-system-extension-sqldump' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-sqldump.svg' + ] + ], + 'actions-system-extension-uninstall' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-uninstall.svg' + ] + ], + 'actions-system-extension-update-disable' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-update-disable.svg' + ] + ], + 'actions-system-extension-update' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-update.svg' + ] + ], + 'actions-system-help-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-help-open.svg' + ] + ], + 'actions-system-list-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-list-open.svg' + ] + ], + 'actions-system-options-view' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-options-view.svg' + ] + ], + 'actions-system-pagemodule-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-pagemodule-open.svg' + ] + ], + 'actions-system-refresh' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-refresh.svg' + ] + ], + 'actions-system-shortcut-active' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-shortcut-active.svg' + ] + ], + 'actions-system-shortcut-new' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-shortcut-new.svg' + ] + ], + 'actions-system-tree-search-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-tree-search-open.svg' + ] + ], + 'actions-system-typoscript-documentation-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-typoscript-documentation-open.svg' + ] + ], + 'actions-system-typoscript-documentation' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-typoscript-documentation.svg' + ] + ], + 'actions-template-new' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-template-new.svg' + ] + ], + 'actions-unlock' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-unlock.svg' + ] + ], + 'actions-unmarkstate' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-unmarkstate.svg' + ] + ], + 'actions-upload' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-upload.svg' + ] + ], + 'actions-version-document-remove' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-version-document-remove.svg' + ] + ], + 'actions-version-page-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-version-page-open.svg' + ] + ], + 'actions-version-swap-version' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-version-swap-version.svg' + ] + ], + 'actions-version-swap-workspace' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-version-swap-workspace.svg' + ] + ], + 'actions-version-workspace-preview' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-version-workspace-preview.svg' + ] + ], + 'actions-version-workspace-sendtostage' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-version-workspace-sendtostage.svg' + ] + ], + 'actions-view-go-back' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-go-back.svg' + ] + ], + 'actions-view-go-down' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-go-down.svg' + ] + ], + 'actions-view-go-forward' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-go-forward.svg' + ] + ], + 'actions-view-go-up' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-go-up.svg' + ] + ], + 'actions-view-list-collapse' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-list-collapse.svg' + ] + ], + 'actions-view-list-expand' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-list-expand.svg' + ] + ], + 'actions-view-paging-first-disabled' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-first-disabled.svg' + ] + ], + 'actions-view-paging-first' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-first.svg' + ] + ], + 'actions-view-paging-last-disabled' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-last-disabled.svg' + ] + ], + 'actions-view-paging-last' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-last.svg' + ] + ], + 'actions-view-paging-next-disabled' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-next-disabled.svg' + ] + ], + 'actions-view-paging-next' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-next.svg' + ] + ], + 'actions-view-paging-previous-disabled' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-previous-disabled.svg' + ] + ], + 'actions-view-paging-previous' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-previous.svg' + ] + ], + 'actions-view-table-collapse' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-table-collapse.svg' + ] + ], + 'actions-view-table-expand' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-table-expand.svg' + ] + ], + 'actions-view' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view.svg' + ] + ], + 'actions-window-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-window-open.svg' + ] + ], + 'actions-wizard-link' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'link' + ] + ], + 'actions-wizard-rte' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'arrows-alt' + ] + ], + // Apps + 'apps-clipboard-images' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-clipboard-images.svg' + ] + ], + 'apps-clipboard-list' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-clipboard-list.svg' + ] + ], + 'apps-filetree-folder-add' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-add.svg' + ] + ], + 'apps-filetree-folder-default' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-default.svg' + ] + ], + 'apps-filetree-folder-list' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-list.svg' + ] + ], + 'apps-filetree-folder-locked' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-locked.svg' + ] + ], + 'apps-filetree-folder-media' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-media.svg' + ] + ], + 'apps-filetree-folder-news' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-news.svg' + ] + ], + 'apps-filetree-folder-opened' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-opened.svg' + ] + ], + 'apps-filetree-folder-recycler' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-recycler.svg' + ] + ], + 'apps-filetree-folder-temp' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-temp.svg' + ] + ], + 'apps-filetree-folder-user' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-user.svg' + ] + ], + 'apps-filetree-folder' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder.svg' + ] + ], + 'apps-filetree-mount' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-mount.svg' + ] + ], + 'apps-filetree-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-root.svg' + ] + ], + 'apps-irre-collapsed' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-irre-collapsed.svg' + ] + ], + 'apps-irre-expanded' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-irre-expanded.svg' + ] + ], + 'apps-pagetree-backend-user-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-backend-user-hideinmenu.svg' + ] + ], + 'apps-pagetree-backend-user' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-backend-user.svg' + ] + ], + 'apps-pagetree-collapse' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-collapse.svg' + ] + ], + 'apps-pagetree-drag-copy-above' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-copy-above.svg' + ] + ], + 'apps-pagetree-drag-copy-below' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-copy-below.svg' + ] + ], + 'apps-pagetree-drag-move-above' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-move-above.svg' + ] + ], + 'apps-pagetree-drag-move-below' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-move-below.svg' + ] + ], + 'apps-pagetree-drag-move-between' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-move-between.svg' + ] + ], + 'apps-pagetree-drag-move-into' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-move-into.svg' + ] + ], + 'apps-pagetree-drag-new-between' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-new-between.svg' + ] + ], + 'apps-pagetree-drag-new-inside' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-new-inside.svg' + ] + ], + 'apps-pagetree-drag-place-denied' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-place-denied.svg' + ] + ], + 'apps-pagetree-expand' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-expand.svg' + ] + ], + 'apps-pagetree-folder-contains-approve' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-contains-approve.svg' + ] + ], + 'apps-pagetree-folder-contains-board' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-contains-board.svg' + ] + ], + 'apps-pagetree-folder-contains-fe_users' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-contains-fe_users.svg' + ] + ], + 'apps-pagetree-folder-contains-news' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-contains-news.svg' + ] + ], + 'apps-pagetree-folder-contains-shop' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-contains-shop.svg' + ] + ], + 'apps-pagetree-folder-contains' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-contains.svg' + ] + ], + 'apps-pagetree-folder-default' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-default.svg' + ] + ], + 'apps-pagetree-folder-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-hideinmenu.svg' + ] + ], + 'apps-pagetree-folder-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-root.svg' + ] + ], + 'apps-pagetree-page-advanced-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-advanced-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-advanced-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-advanced-root.svg' + ] + ], + 'apps-pagetree-page-advanced' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-advanced.svg' + ] + ], + 'apps-pagetree-page-backend-user-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-backend-user-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-backend-user-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-backend-user-root.svg' + ] + ], + 'apps-pagetree-page-backend-user' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-backend-user.svg' + ] + ], + 'apps-pagetree-page-backend-users-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-backend-users-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-backend-users-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-backend-users-root.svg' + ] + ], + 'apps-pagetree-page-backend-users' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-backend-users.svg' + ] + ], + 'apps-pagetree-page-content-from-page-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-content-from-page-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-content-from-page-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-content-from-page-root.svg' + ] + ], + 'apps-pagetree-page-content-from-page' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-content-from-page.svg' + ] + ], + 'apps-pagetree-page-default' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-default.svg' + ] + ], + 'apps-pagetree-page-domain' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-domain.svg' + ] + ], + 'apps-pagetree-page-frontend-user-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-frontend-user-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-frontend-user-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-frontend-user-root.svg' + ] + ], + 'apps-pagetree-page-frontend-user' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-frontend-user.svg' + ] + ], + 'apps-pagetree-page-frontend-users-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-frontend-users-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-frontend-users-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-frontend-users-root.svg' + ] + ], + 'apps-pagetree-page-frontend-users' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-frontend-users.svg' + ] + ], + 'apps-pagetree-page-mountpoint-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-mountpoint-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-mountpoint-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-mountpoint-root.svg' + ] + ], + 'apps-pagetree-page-mountpoint' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-mountpoint.svg' + ] + ], + 'apps-pagetree-page-not-in-menu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-not-in-menu.svg' + ] + ], + 'apps-pagetree-page-recycler-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-recycler-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-recycler' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-recycler.svg' + ] + ], + 'apps-pagetree-page-shortcut-external-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-shortcut-external-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-shortcut-external-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-shortcut-external-root.svg' + ] + ], + 'apps-pagetree-page-shortcut-external' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-shortcut-external.svg' + ] + ], + 'apps-pagetree-page-shortcut-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-shortcut-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-shortcut-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-shortcut-root.svg' + ] + ], + 'apps-pagetree-page-shortcut' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-shortcut.svg' + ] + ], + 'apps-pagetree-page' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page.svg' + ] + ], + 'apps-pagetree-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-root.svg' + ] + ], + 'apps-pagetree-spacer-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-spacer-hideinmenu.svg' + ] + ], + 'apps-pagetree-spacer-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-spacer-root.svg' + ] + ], + 'apps-pagetree-spacer' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-spacer.svg' + ] + ], + 'apps-toolbar-menu-actions' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-actions.svg' + ] + ], + 'apps-toolbar-menu-cache' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-cache.svg' + ] + ], + 'apps-toolbar-menu-help' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-help.svg' + ] + ], + 'apps-toolbar-menu-opendocs' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-opendocs.svg' + ] + ], + 'apps-toolbar-menu-search' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-search.svg' + ] + ], + 'apps-toolbar-menu-shortcut' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-shortcut.svg' + ] + ], + 'apps-toolbar-menu-systeminformation' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-systeminformation.svg' + ] + ], + 'apps-toolbar-menu-workspace' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-workspace.svg' + ] + ], + + // Avatar + 'avatar-default' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/avatar/avatar-default.svg' + ] + ], + + // Content + 'content-accordion' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-accordion.svg' + ] + ], + 'content-audio' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-audio.svg' + ] + ], + 'content-briefcase' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-briefcase.svg' + ] + ], + 'content-beside-text-img-above-center' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-above-center.svg' + ] + ], + 'content-beside-text-img-above-left' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-above-left.svg' + ] + ], + 'content-beside-text-img-above-right' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-above-right.svg' + ] + ], + 'content-beside-text-img-below-center' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-below-center.svg' + ] + ], + 'content-beside-text-img-below-left' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-below-left.svg' + ] + ], + 'content-beside-text-img-below-right' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-below-right.svg' + ] + ], + 'content-beside-text-img-left' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-left.svg' + ] + ], + 'content-beside-text-img-right' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-right.svg' + ] + ], + 'content-bullets' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-bullets.svg' + ] + ], + 'content-carousel-header' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-carousel-header.svg' + ] + ], + 'content-carousel-html' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-carousel-html.svg' + ] + ], + 'content-carousel-image' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-carousel-image.svg' + ] + ], + 'content-carousel' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-carousel.svg' + ] + ], + 'content-coffee' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-coffee.svg' + ] + ], + 'content-elements-login' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-elements-login.svg' + ] + ], + 'content-elements-mailform' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-elements-mailform.svg' + ] + ], + 'content-elements-searchform' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-elements-searchform.svg' + ] + ], + 'content-form' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-form.svg' + ] + ], + 'content-header' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-header.svg' + ] + ], + 'content-idea' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-idea.svg' + ] + ], + 'content-image' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-image.svg' + ] + ], + 'content-info' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-info.svg' + ] + ], + 'content-menu-thumbnail' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-menu-thumbnail.svg' + ] + ], + 'content-news' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-news.svg' + ] + ], + 'content-panel' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-panel.svg' + ] + ], + 'content-plugin' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-plugin.svg' + ] + ], + 'content-quote' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-quote.svg' + ] + ], + 'content-special-div' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-special-div.svg' + ] + ], + 'content-special-html' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-special-html.svg' + ] + ], + 'content-special-indexed_search' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-special-indexed_search.svg' + ] + ], + 'content-special-menu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-special-menu.svg' + ] + ], + 'content-special-shortcut' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-special-shortcut.svg' + ] + ], + 'content-special-uploads' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-special-uploads.svg' + ] + ], + 'content-tab-item' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-tab-item.svg' + ] + ], + 'content-tab' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-tab.svg' + ] + ], + 'content-table' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-table.svg' + ] + ], + 'content-text-columns' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-text-columns.svg' + ] + ], + 'content-text-teaser' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-text-teaser.svg' + ] + ], + 'content-text' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-text.svg' + ] + ], + 'content-textpic' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-textpic.svg' + ] + ], + 'content-special-media' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:frontend/Resources/Public/Icons/ContentElementWizard/multimedia.gif' + ] + ], + + // Default + 'default-not-found' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/default/default-not-found.svg' + ] + ], + + // Mimetypes + 'mimetypes-application' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-application.svg' + ] + ], + 'mimetypes-compressed' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-compressed.svg' + ] + ], + 'mimetypes-excel' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-excel.svg' + ] + ], + 'mimetypes-media-audio' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-media-audio.svg' + ] + ], + 'mimetypes-media-flash' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-media-flash.svg' + ] + ], + 'mimetypes-media-image' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-media-image.svg' + ] + ], + 'mimetypes-media-video-vimeo' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-media-video-vimeo.svg' + ] + ], + 'mimetypes-media-video-youtube' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-media-video-youtube.svg' + ] + ], + 'mimetypes-media-video' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-media-video.svg' + ] + ], + 'mimetypes-open-document-database' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-open-document-database.svg' + ] + ], + 'mimetypes-open-document-drawing' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-open-document-drawing.svg' + ] + ], + 'mimetypes-open-document-formula' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-open-document-formula.svg' + ] + ], + 'mimetypes-open-document-presentation' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-open-document-presentation.svg' + ] + ], + 'mimetypes-open-document-spreadsheet' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-open-document-spreadsheet.svg' + ] + ], + 'mimetypes-open-document-text' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-open-document-text.svg' + ] + ], + 'mimetypes-other-other' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-other-other.svg' + ] + ], + 'mimetypes-pdf' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-pdf.svg' + ] + ], + 'mimetypes-powerpoint' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-powerpoint.svg' + ] + ], + 'mimetypes-text-css' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-css.svg' + ] + ], + 'mimetypes-text-csv' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-csv.svg' + ] + ], + 'mimetypes-text-html' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-html.svg' + ] + ], + 'mimetypes-text-js' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-js.svg' + ] + ], + 'mimetypes-text-php' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-php.svg' + ] + ], + 'mimetypes-text-text' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-text.svg' + ] + ], + 'mimetypes-text-ts' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-ts.svg' + ] + ], + 'mimetypes-word' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-word.svg' + ] + ], + 'mimetypes-x-backend_layout' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-backend_layout.svg' + ] + ], + 'mimetypes-x-content-divider' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-divider.svg' + ] + ], + 'mimetypes-x-content-domain' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-domain.svg' + ] + ], + 'mimetypes-x-content-form-search' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-form-search.svg' + ] + ], + 'mimetypes-x-content-form' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-form.svg' + ] + ], + 'mimetypes-x-content-header' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-header.svg' + ] + ], + 'mimetypes-x-content-html' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-html.svg' + ] + ], + 'mimetypes-x-content-image' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-image.svg' + ] + ], + 'mimetypes-x-content-link' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-link.svg' + ] + ], + 'mimetypes-x-content-list-bullets' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-list-bullets.svg' + ] + ], + 'mimetypes-x-content-list-files' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-list-files.svg' + ] + ], + 'mimetypes-x-content-login' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-login.svg' + ] + ], + 'mimetypes-x-content-menu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-menu.svg' + ] + ], + 'mimetypes-x-content-multimedia' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-multimedia.svg' + ] + ], + 'mimetypes-x-content-page-language-overlay' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-page-language-overlay.svg' + ] + ], + 'mimetypes-x-content-plugin' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-plugin.svg' + ] + ], + 'mimetypes-x-content-script' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-script.svg' + ] + ], + 'mimetypes-x-content-table' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-table.svg' + ] + ], + 'mimetypes-x-content-template-extension' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-template-extension.svg' + ] + ], + 'mimetypes-x-content-template-static' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-template-static.svg' + ] + ], + 'mimetypes-x-content-template' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-template.svg' + ] + ], + 'mimetypes-x-content-text-picture' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-text-picture.svg' + ] + ], + 'mimetypes-x-content-text' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-text.svg' + ] + ], + 'mimetypes-x-index_config' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-index_config.svg' + ] + ], + 'mimetypes-x-sys_action' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_action.svg' + ] + ], + 'mimetypes-x-sys_category' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_category.svg' + ] + ], + 'mimetypes-x-sys_filemounts' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_filemounts.svg' + ] + ], + 'mimetypes-x-sys_language' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_language.svg' + ] + ], + 'mimetypes-x-sys_news' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_news.svg' + ] + ], + 'mimetypes-x-sys_note' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_note.svg' + ] + ], + 'mimetypes-x-sys_workspace' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_workspace.svg' + ] + ], + 'mimetypes-x-tx_rtehtmlarea_acronym' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-tx_rtehtmlarea_acronym.svg' + ] + ], + 'mimetypes-x-tx_scheduler_task_group' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-tx_scheduler_task_group.svg' + ] + ], + 'mimetypes-x-content-text-media' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-text-picture.svg' + ] + ], + 'mimetypes-x-sys_file_storage' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:t3skin/icons/gfx/i/_icon_ftp.gif' + ] + ], + + // Miscellaneous + 'miscellaneous-placeholder' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/miscellaneous/miscellaneous-placeholder.svg' + ] + ], + + // Module + 'module-web' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'file-o' + ] + ], + 'module-file' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'image' + ] + ], + 'module-tools' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'rocket' + ] + ], + 'module-system' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'plug' + ] + ], + 'module-help' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'question-circle' + ] + ], + + // Overlay + 'overlay-advanced' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-advanced.svg' + ] + ], + 'overlay-approved' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-approved.svg' + ] + ], + 'overlay-backenduser' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-backenduser.svg' + ] + ], + 'overlay-backendusers' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-backendusers.svg' + ] + ], + 'overlay-deleted' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-deleted.svg' + ] + ], + 'overlay-edit' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-edit.svg' + ] + ], + 'overlay-external-link' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-external-link.svg' + ] + ], + 'overlay-frontenduser' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-frontenduser.svg' + ] + ], + 'overlay-frontendusers' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-frontendusers.svg' + ] + ], + 'overlay-hidden' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-hidden.svg' + ] + ], + 'overlay-includes-subpages' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-includes-subpages.svg' + ] + ], + 'overlay-info' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-info.svg' + ] + ], + 'overlay-list' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-list.svg' + ] + ], + 'overlay-locked' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-locked.svg' + ] + ], + 'overlay-media' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-media.svg' + ] + ], + 'overlay-missing' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-missing.svg' + ] + ], + 'overlay-mountpoint' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-mountpoint.svg' + ] + ], + 'overlay-new' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-new.svg' + ] + ], + 'overlay-news' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-news.svg' + ] + ], + 'overlay-readonly' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-readonly.svg' + ] + ], + 'overlay-restricted' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-restricted.svg' + ] + ], + 'overlay-scheduled' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-scheduled.svg' + ] + ], + 'overlay-shop' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-shop.svg' + ] + ], + 'overlay-shortcut' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-shortcut.svg' + ] + ], + 'overlay-translated' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-translated.svg' + ] + ], + 'overlay-warning' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-warning.svg' + ] + ], + + // Spinner + 'spinner-circle-dark' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/spinner/spinner-circle-dark.svg', + 'spinning' => true + ] + ], + 'spinner-circle-light' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/spinner/spinner-circle-light.svg', + 'spinning' => true + ] + ], + 'spinner-circle' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/spinner/spinner-circle.svg', + 'spinning' => true + ] + ], + + // Status + 'status-user-admin' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/status/status-user-admin.svg' + ] + ], + 'status-user-backend' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/status/status-user-backend.svg' + ] + ], + 'status-user-frontend' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/status/status-user-frontend.svg' + ] + ], + 'status-user-group-backend' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/status/status-user-group-backend.svg' + ] + ], + 'status-user-group-frontend' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/status/status-user-group-frontend.svg' + ] + ], + 'status-dialog-information' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'exclamation-circle' + ] + ], + 'status-dialog-ok' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'check-circle', + ] + ], + 'status-dialog-notification' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'exclamation-circle' + ] + ], + 'status-dialog-warning' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'exclamation-triangle' + ] + ], + 'status-dialog-error' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'exclamation-circle' + ] + ], + 'status-warning-lock' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:t3skin/images/icons/status/warning-lock.png' + ] + ], + 'status-warning-in-use' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:t3skin/images/icons/status/warning-in-use.png' + ] + ], + 'status-status-checked' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'check', + ] + ], + 'status-status-current' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-right', + ] + ], + 'status-status-locked' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'lock', + ] + ], + 'status-status-reference-hard' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:t3skin/images/icons/status/status-reference-hard.png', + ] + ], + 'status-status-sorting-asc' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-up', + ] + ], + 'status-status-sorting-desc' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-down', + ] + ], + 'status-status-sorting-light-asc' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-up', + ] + ], + 'status-status-sorting-light-desc' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-down', + ] + ], + 'status-status-permission-granted' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'check', + ] + ], + 'status-status-permission-denied' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'times', + ] + ], + 'status-status-reference-soft' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:t3skin/images/icons/status/status-reference-soft.png', + ] + ], + 'status-status-edit-read-only' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:t3skin/images/icons/status/status-edit-read-only.png', + ] + ], + + // Extensions + 'extensions-extensionmanager-update-script' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'refresh', + ] + ], + 'extensions-scheduler-run-task' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'play-circle', + ] + ], + 'extensions-workspaces-generatepreviewlink' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:workspaces/Resources/Public/Images/generate-ws-preview-link.png' + ] + ], + + // Empty + 'empty-empty' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'empty-empty', + ] + ], + + // System Information + 'sysinfo-php-version' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'code' + ] + ], + 'sysinfo-database' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'database' + ] + ], + 'sysinfo-application-context' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'tasks' + ] + ], + 'sysinfo-composer-mode' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'music' + ] + ], + 'sysinfo-git' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'git' + ] + ], + 'sysinfo-webserver' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'server' + ] + ], + 'sysinfo-os-linux' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'linux' + ] + ], + 'sysinfo-os-apple' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'apple' + ] + ], + 'sysinfo-os-windows' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'windows' + ] + ], + + // Sysnote + 'sysnote-type-0' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'sticky-note-o' + ] + ], + 'sysnote-type-1' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'cog' + ] + ], + 'sysnote-type-2' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'code' + ] + ], + 'sysnote-type-3' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'thumb-tack' + ] + ], + 'sysnote-type-4' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'check-square' + ] + ], + + // Flags will be auto-registered after we have the SVG files + 'flags-multiple' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/multiple.png' + ] + ], + 'flags-an' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/an.png' + ] + ], + 'flags-catalonia' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/catalonia.png' + ] + ], + 'flags-cs' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/cs.png' + ] + ], + 'flags-en-us-gb' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/en_us-gb.png' + ] + ], + 'flags-fam' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/fam.png' + ] + ], + 'flags-qc' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/qc.png' + ] + ], + 'flags-scotland' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/scotland.png' + ] + ], + 'flags-wales' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/wales.png' + ] + ], + ]; + + /** + * Mapping of file extensions to mimetypes + * + * @var string[] + */ + protected $fileExtensionMapping = [ + 'htm' => 'mimetypes-text-html', + 'html' => 'mimetypes-text-html', + 'css' => 'mimetypes-text-css', + 'js' => 'mimetypes-text-js', + 'csv' => 'mimetypes-text-csv', + 'php' => 'mimetypes-text-php', + 'php6' => 'mimetypes-text-php', + 'php5' => 'mimetypes-text-php', + 'php4' => 'mimetypes-text-php', + 'php3' => 'mimetypes-text-php', + 'inc' => 'mimetypes-text-php', + 'ts' => 'mimetypes-text-ts', + 'txt' => 'mimetypes-text-text', + 'class' => 'mimetypes-text-text', + 'tmpl' => 'mimetypes-text-text', + 'jpg' => 'mimetypes-media-image', + 'jpeg' => 'mimetypes-media-image', + 'gif' => 'mimetypes-media-image', + 'png' => 'mimetypes-media-image', + 'bmp' => 'mimetypes-media-image', + 'tif' => 'mimetypes-media-image', + 'tiff' => 'mimetypes-media-image', + 'tga' => 'mimetypes-media-image', + 'psd' => 'mimetypes-media-image', + 'eps' => 'mimetypes-media-image', + 'ai' => 'mimetypes-media-image', + 'svg' => 'mimetypes-media-image', + 'pcx' => 'mimetypes-media-image', + 'avi' => 'mimetypes-media-video', + 'mpg' => 'mimetypes-media-video', + 'mpeg' => 'mimetypes-media-video', + 'mov' => 'mimetypes-media-video', + 'vimeo' => 'mimetypes-media-video-vimeo', + 'youtube' => 'mimetypes-media-video-youtube', + 'wav' => 'mimetypes-media-audio', + 'mp3' => 'mimetypes-media-audio', + 'mid' => 'mimetypes-media-audio', + 'swf' => 'mimetypes-media-flash', + 'swa' => 'mimetypes-media-flash', + 'exe' => 'mimetypes-application', + 'com' => 'mimetypes-application', + 't3x' => 'mimetypes-compressed', + 't3d' => 'mimetypes-compressed', + 'zip' => 'mimetypes-compressed', + 'tgz' => 'mimetypes-compressed', + 'gz' => 'mimetypes-compressed', + 'pdf' => 'mimetypes-pdf', + 'doc' => 'mimetypes-word', + 'dot' => 'mimetypes-word', + 'docm' => 'mimetypes-word', + 'docx' => 'mimetypes-word', + 'dotm' => 'mimetypes-word', + 'dotx' => 'mimetypes-word', + 'sxw' => 'mimetypes-word', + 'rtf' => 'mimetypes-word', + 'xls' => 'mimetypes-excel', + 'xlsm' => 'mimetypes-excel', + 'xlsx' => 'mimetypes-excel', + 'xltm' => 'mimetypes-excel', + 'xltx' => 'mimetypes-excel', + 'sxc' => 'mimetypes-excel', + 'pps' => 'mimetypes-powerpoint', + 'ppsx' => 'mimetypes-powerpoint', + 'ppt' => 'mimetypes-powerpoint', + 'pptm' => 'mimetypes-powerpoint', + 'pptx' => 'mimetypes-powerpoint', + 'potm' => 'mimetypes-powerpoint', + 'potx' => 'mimetypes-powerpoint', + 'mount' => 'apps-filetree-mount', + 'folder' => 'apps-filetree-folder-default', + 'default' => 'mimetypes-other-other', + ]; + + /** + * Mapping of mime types to icons + * + * @var string[] + */ + protected $mimeTypeMapping = [ + 'video/*' => 'mimetypes-media-video', + 'audio/*' => 'mimetypes-media-audio', + 'image/*' => 'mimetypes-media-image', + 'text/*' => 'mimetypes-text-text', + ]; + + /** + * Array of deprecated icons, add deprecated icons to this array and remove it from registry + * - Index of this array contains the deprecated icon + * - Value of each entry must contain the deprecation message and can contain an identifier which replaces the old identifier + * + * Example: + * array( + * 'deprecated-icon-identifier' => array( + * 'message' => '%s is deprecated since TYPO3 CMS 7, this icon will be removed in TYPO3 CMS 8', + * 'replacement' => 'alternative-icon-identifier' // must be registered + * ) + * ) + * + * @var array + */ + protected $deprecatedIcons = [ + 'actions-system-refresh' => [ + 'replacement' => 'actions-refresh', + 'message' => '%s is deprecated since TYPO3 CMS 7, this icon will be removed in TYPO3 CMS 8' + ], + 'actions-system-extension-update-disabled' => [ + 'replacement' => 'actions-system-extension-update', + 'message' => '%s is deprecated since TYPO3 CMS 7, this icon will be removed in TYPO3 CMS 8' + ] + ]; + + /** + * @var string + */ + protected $defaultIconIdentifier = 'default-not-found'; + + /** + * The constructor + */ + public function __construct() + { + $this->initialize(); + } + + /** + * Initialize the registry + * This method can be called multiple times, depending on initialization status. + * In some cases e.g. TCA is not available, the method must be called multiple times. + */ + protected function initialize() + { + if (!$this->tcaInitialized && !empty($GLOBALS['TCA'])) { + $this->registerTCAIcons(); + } + if (!$this->flagsInitialized) { + $this->registerFlags(); + } + if ($this->tcaInitialized && $this->flagsInitialized) { + $this->fullInitialized = true; + } + } + + /** + * @param string $identifier + * @return bool + */ + public function isRegistered($identifier) + { + if (!$this->fullInitialized) { + $this->initialize(); + } + return isset($this->icons[$identifier]); + } + + /** + * @param string $identifier + * @return bool + */ + public function isDeprecated($identifier) + { + return isset($this->deprecatedIcons[$identifier]); + } + + /** + * @return string + */ + public function getDefaultIconIdentifier() + { + return $this->defaultIconIdentifier; + } + + /** + * Registers an icon to be available inside the Icon Factory + * + * @param string $identifier + * @param string $iconProviderClassName + * @param array $options + * + * @throws \InvalidArgumentException + */ + public function registerIcon($identifier, $iconProviderClassName, array $options = []) + { + if (!in_array(IconProviderInterface::class, class_implements($iconProviderClassName), true)) { + throw new \InvalidArgumentException('An IconProvider must implement ' . IconProviderInterface::class, 1437425803); + } + $this->icons[$identifier] = [ + 'provider' => $iconProviderClassName, + 'options' => $options + ]; + } + + /** + * Register an icon for a file extension + * + * @param string $fileExtension + * @param string $iconIdentifier + */ + public function registerFileExtension($fileExtension, $iconIdentifier) + { + $this->fileExtensionMapping[$fileExtension] = $iconIdentifier; + } + + /** + * Register an icon for a mime-type + * + * @param string $mimeType + * @param string $iconIdentifier + */ + public function registerMimeTypeIcon($mimeType, $iconIdentifier) + { + $this->mimeTypeMapping[$mimeType] = $iconIdentifier; + } + + /** + * Fetches the configuration provided by registerIcon() + * + * @param string $identifier the icon identifier + * @return mixed + * @throws Exception + */ + public function getIconConfigurationByIdentifier($identifier) + { + if (!$this->fullInitialized) { + $this->initialize(); + } + if (!$this->isRegistered($identifier)) { + throw new Exception('Icon with identifier "' . $identifier . '" is not registered"', 1437425804); + } + if ($this->isDeprecated($identifier)) { + $deprecationSettings = $this->getDeprecationSettings($identifier); + GeneralUtility::deprecationLog(sprintf($deprecationSettings['message'], $identifier)); + if (!empty($deprecationSettings['replacement'])) { + $identifier = $deprecationSettings['replacement']; + } + } + return $this->icons[$identifier]; + } + + /** + * @param string $identifier + * + * @return array + * @throws Exception + */ + public function getDeprecationSettings($identifier) + { + if (!$this->isDeprecated($identifier)) { + throw new Exception('Icon with identifier "' . $identifier . '" is not deprecated"', 1437425804); + } + return $this->deprecatedIcons[$identifier]; + } + + /** + * @return array + */ + public function getAllRegisteredIconIdentifiers() + { + if (!$this->fullInitialized) { + $this->initialize(); + } + return array_keys($this->icons); + } + + /** + * @param string $fileExtension + * @return string + */ + public function getIconIdentifierForFileExtension($fileExtension) + { + // If the file extension is not valid use the default one + if (!isset($this->fileExtensionMapping[$fileExtension])) { + $fileExtension = 'default'; + } + return $this->fileExtensionMapping[$fileExtension]; + } + + /** + * Get iconIdentifier for given mimeType + * + * @param string $mimeType + * @return string|null Returns null if no icon is registered for the mimeType + */ + public function getIconIdentifierForMimeType($mimeType) + { + if (!isset($this->mimeTypeMapping[$mimeType])) { + return null; + } + return $this->mimeTypeMapping[$mimeType]; + } + + /** + * Load icons from TCA for each table and add them as "tcarecords-XX" to $this->icons + */ + protected function registerTCAIcons() + { + $resultArray = []; + + $tcaTables = array_keys($GLOBALS['TCA']); + // check every table in the TCA, if an icon is needed + foreach ($tcaTables as $tableName) { + // This method is only needed for TCA tables where typeicon_classes are not configured + if (is_array($GLOBALS['TCA'][$tableName])) { + $tcaCtrl = $GLOBALS['TCA'][$tableName]['ctrl']; + $icon = null; + $iconIdentifier = 'tcarecords-' . $tableName . '-default'; + if (isset($this->icons[$iconIdentifier])) { + continue; + } + if (isset($tcaCtrl['iconfile'])) { + if (StringUtility::beginsWith($tcaCtrl['iconfile'], 'EXT:')) { + $icon = $tcaCtrl['iconfile']; + } elseif (strpos($tcaCtrl['iconfile'], '/') !== false) { + $icon = TYPO3_mainDir . GeneralUtility::resolveBackPath($tcaCtrl['iconfile']); + } + if ($icon !== null) { + $resultArray[$iconIdentifier] = $icon; + } + } + } + } + if (!empty($GLOBALS['TBE_STYLES']['spritemanager']['singleIcons'])) { + foreach ($GLOBALS['TBE_STYLES']['spritemanager']['singleIcons'] as $iconIdentifier => $iconFile) { + if (StringUtility::beginsWith($iconFile, '../typo3conf/ext/')) { + $iconFile = str_replace('../typo3conf/ext/', 'EXT:', $iconFile); + } + if (StringUtility::beginsWith($iconFile, 'sysext/')) { + $iconFile = str_replace('sysext/', 'EXT:', $iconFile); + } + $resultArray[$iconIdentifier] = $iconFile; + } + } + + foreach ($resultArray as $iconIdentifier => $iconFilePath) { + if (StringUtility::endsWith(strtolower($iconFilePath), 'svg')) { + $iconProviderClass = SvgIconProvider::class; + } else { + $iconProviderClass = BitmapIconProvider::class; + } + $this->icons[$iconIdentifier] = [ + 'provider' => $iconProviderClass, + 'options' => [ + 'source' => $iconFilePath + ] + ]; + } + $this->tcaInitialized = true; + } + + /** + * register flags + */ + protected function registerFlags() + { + $iconFolder = 'EXT:core/Resources/Public/Icons/Flags/SVG/'; + $files = [ + 'AC', 'AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', + 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', + 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CP', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', + 'DE', 'DG', 'DJ', 'DK', 'DM', 'DO', 'DZ', + 'EA', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'EU', + 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', + 'GA', 'GB-ENG', 'GB-NIR', 'GB-SCT', 'GB-WLS', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', + 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', + 'IC', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', + 'JE', 'JM', 'JO', 'JP', + 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', + 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', + 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', + 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', + 'OM', + 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', + 'QA', + 'RE', 'RO', 'RS', 'RU', 'RW', + 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', + 'TA', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', + 'UA', 'UG', 'UM', 'US-AK', 'US-AL', 'US-AR', 'US-AZ', 'US-CA', 'US-CO', 'US-CT', 'US-DE', 'US-FL', 'US-GA', 'US-HI', 'US-IA', 'US-ID', 'US-IL', 'US-IN', 'US-KS', 'US-KY', 'US-LA', 'US-MA', 'US-MD', 'US-ME', 'US-MI', 'US-MN', 'US-MO', 'US-MS', 'US-MT', 'US-NC', 'US-ND', 'US-NE', 'US-NH', 'US-NJ', 'US-NM', 'US-NV', 'US-NY', 'US-OH', 'US-OK', 'US-OR', 'US-PA', 'US-RI', 'US-SC', 'US-SD', 'US-TN', 'US-TX', 'US-UT', 'US-VA', 'US-VT', 'US-WA', 'US-WI', 'US-WV', 'US-WY', 'US', 'UY', 'UZ', + 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', + 'WF', 'WS', + 'XK', + 'YE', 'YT', + 'ZA', 'ZM', 'ZW' + ]; + foreach ($files as $file) { + $identifier = strtolower($file); + $this->icons['flags-' . $identifier] = [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => $iconFolder . $file . '.svg' + ] + ]; + } + $this->flagsInitialized = true; + } + + /** + * Detect the IconProvider of an icon + * + * @param string $iconReference + * @return string + */ + public function detectIconProvider($iconReference) + { + if (StringUtility::endsWith(strtolower($iconReference), 'svg')) { + return SvgIconProvider::class; + } else { + return BitmapIconProvider::class; + } + } +} diff --git a/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/IconRegistry8.php b/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/IconRegistry8.php new file mode 100644 index 00000000..aff1f81e --- /dev/null +++ b/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/IconRegistry8.php @@ -0,0 +1,3479 @@ + [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-add.svg' + ] + ], + 'actions-check' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-check.svg' + ] + ], + 'actions-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-close.svg' + ] + ], + 'actions-cloud' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-cloud.svg' + ] + ], + 'actions-database-export' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-database-export.svg' + ] + ], + 'actions-database-import' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-database-import.svg' + ] + ], + 'actions-database-reload' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-database-reload.svg' + ] + ], + 'actions-database' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-database.svg' + ] + ], + 'actions-delete' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-delete.svg' + ] + ], + 'actions-document-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-close.svg' + ] + ], + 'actions-document-duplicates-select' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-duplicates-select.svg' + ] + ], + 'actions-document-edit-access' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-edit-access.svg' + ] + ], + 'actions-document-export-csv' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-export-csv.svg' + ] + ], + 'actions-document-export-t3d' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-export-t3d.svg' + ] + ], + 'actions-document-history-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-history-open.svg' + ] + ], + 'actions-document-import-t3d' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-import-t3d.svg' + ] + ], + 'actions-document-info' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-info.svg' + ] + ], + 'actions-document-localize' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-localize.svg' + ] + ], + 'actions-document-move' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-move.svg' + ] + ], + 'actions-document-new' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-new.svg' + ] + ], + 'actions-document-open-read-only' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-open-read-only.svg' + ] + ], + 'actions-document-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-open.svg' + ] + ], + 'actions-document-paste-after' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-paste-after.svg' + ] + ], + 'actions-document-paste-before' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-paste-before.svg' + ] + ], + 'actions-document-paste-into' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-paste-into.svg' + ] + ], + 'actions-document-paste' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-paste.svg' + ] + ], + 'actions-document-save-cleartranslationcache' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-save-cleartranslationcache.svg' + ] + ], + 'actions-document-save-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-save-close.svg' + ] + ], + 'actions-document-save-new' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-save-new.svg' + ] + ], + 'actions-document-save-translation' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-save-translation.svg' + ] + ], + 'actions-document-save-view' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-save-view.svg' + ] + ], + 'actions-document-save' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-save.svg' + ] + ], + 'actions-document-select' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-select.svg' + ] + ], + 'actions-document-synchronize' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-synchronize.svg' + ] + ], + 'actions-document-view' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document-view.svg' + ] + ], + 'actions-document' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-document.svg' + ] + ], + 'actions-download' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-download.svg' + ] + ], + 'actions-duplicates' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-duplicates.svg' + ] + ], + 'actions-edit-add' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-add.svg' + ] + ], + 'actions-edit-copy-release' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-copy-release.svg' + ] + ], + 'actions-edit-copy' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-copy.svg' + ] + ], + 'actions-edit-cut-release' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-cut-release.svg' + ] + ], + 'actions-edit-cut' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-cut.svg' + ] + ], + 'actions-edit-delete' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-delete.svg' + ] + ], + 'actions-edit-download' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-download.svg' + ] + ], + 'actions-edit-hide' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-hide.svg' + ] + ], + 'actions-edit-insert-default' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-insert-default.svg' + ] + ], + 'actions-edit-localize-status-high' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-localize-status-high.svg' + ] + ], + 'actions-edit-localize-status-low' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-localize-status-low.svg' + ] + ], + 'actions-edit-merge-localization' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-merge-localization.svg' + ] + ], + 'actions-edit-pick-date' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-pick-date.svg' + ] + ], + 'actions-edit-rename' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-rename.svg' + ] + ], + 'actions-edit-replace' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-replace.svg' + ] + ], + 'actions-edit-restore' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-restore.svg' + ] + ], + 'actions-edit-undelete-edit' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-undelete-edit.svg' + ] + ], + 'actions-edit-undo' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-undo.svg' + ] + ], + 'actions-edit-unhide' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-unhide.svg' + ] + ], + 'actions-edit-upload' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-edit-upload.svg' + ] + ], + 'actions-file-csv' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-file-csv.svg' + ] + ], + 'actions-file-html' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-file-html.svg' + ] + ], + 'actions-file-openoffice' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-file-openoffice.svg' + ] + ], + 'actions-file-pdf' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-file-pdf.svg' + ] + ], + 'actions-file' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-file.svg' + ] + ], + 'actions-filter' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-filter.svg' + ] + ], + 'actions-folder' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-folder.svg' + ] + ], + 'actions-input-clear' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-input-clear.svg' + ] + ], + 'actions-insert-record' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-insert-record.svg' + ] + ], + 'actions-insert-reference' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-insert-reference.svg' + ] + ], + 'actions-localize' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-localize.svg' + ] + ], + 'actions-lock' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-lock.svg' + ] + ], + 'actions-logout' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-logout.svg' + ] + ], + 'actions-markstate' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-markstate.svg' + ] + ], + 'actions-menu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-menu.svg' + ] + ], + 'actions-merge' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-merge.svg' + ] + ], + 'actions-message-error-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-message-error-close.svg' + ] + ], + 'actions-message-information-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-message-information-close.svg' + ] + ], + 'actions-message-notice-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-message-notice-close.svg' + ] + ], + 'actions-message-ok-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-message-ok-close.svg' + ] + ], + 'actions-message-warning-close' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-message-warning-close.svg' + ] + ], + 'actions-move-down' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move-down.svg' + ] + ], + 'actions-move-left' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move-left.svg' + ] + ], + 'actions-move-move' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move-move.svg' + ] + ], + 'actions-move-right' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move-right.svg' + ] + ], + 'actions-move-to-bottom' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move-to-bottom.svg' + ] + ], + 'actions-move-to-top' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move-to-top.svg' + ] + ], + 'actions-move-up' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move-up.svg' + ] + ], + 'actions-move' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-move.svg' + ] + ], + 'actions-online-media-add' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-online-media-add.svg' + ] + ], + 'actions-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-open.svg' + ] + ], + 'actions-page-move' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-page-move.svg' + ] + ], + 'actions-page-new' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-page-new.svg' + ] + ], + 'actions-page-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-page-open.svg' + ] + ], + 'actions-pagetree-collapse' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-pagetree-collapse.svg' + ] + ], + 'actions-pagetree-expand' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-pagetree-expand.svg' + ] + ], + 'actions-pagetree-mountroot' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-pagetree-mountroot.svg' + ] + ], + 'actions-pagetree' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-pagetree.svg' + ] + ], + 'actions-preview' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-preview.svg' + ] + ], + 'actions-refresh' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-refresh.svg' + ] + ], + 'actions-remove' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-remove.svg' + ] + ], + 'actions-rename' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-rename.svg' + ] + ], + 'actions-replace' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-replace.svg' + ] + ], + 'actions-save' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-save.svg' + ] + ], + 'actions-search' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-search.svg' + ] + ], + 'actions-selection-delete' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-selection-delete.svg' + ] + ], + 'actions-swap' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-swap.svg' + ] + ], + 'actions-synchronize' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-synchronize.svg' + ] + ], + 'actions-system-backend-user-emulate' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-backend-user-emulate.svg' + ] + ], + 'actions-system-backend-user-switch' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-backend-user-switch.svg' + ] + ], + 'actions-system-cache-clear-impact-high' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-cache-clear-impact-high.svg' + ] + ], + 'actions-system-cache-clear-impact-low' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-cache-clear-impact-low.svg' + ] + ], + 'actions-system-cache-clear-impact-medium' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-cache-clear-impact-medium.svg' + ] + ], + 'actions-system-cache-clear-rte' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-cache-clear-rte.svg' + ] + ], + 'actions-system-cache-clear' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-cache-clear.svg' + ] + ], + 'actions-system-extension-configure' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-configure.svg' + ] + ], + 'actions-system-extension-documentation' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-documentation.svg' + ] + ], + 'actions-system-extension-download' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-download.svg' + ] + ], + 'actions-system-extension-import' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-import.svg' + ] + ], + 'actions-system-extension-install' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-install.svg' + ] + ], + 'actions-system-extension-sqldump' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-sqldump.svg' + ] + ], + 'actions-system-extension-uninstall' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-uninstall.svg' + ] + ], + 'actions-system-extension-update-disable' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-update-disable.svg' + ] + ], + 'actions-system-extension-update' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-extension-update.svg' + ] + ], + 'actions-system-help-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-help-open.svg' + ] + ], + 'actions-system-list-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-list-open.svg' + ] + ], + 'actions-system-options-view' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-options-view.svg' + ] + ], + 'actions-system-pagemodule-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-pagemodule-open.svg' + ] + ], + 'actions-system-refresh' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-refresh.svg' + ] + ], + 'actions-system-shortcut-active' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-shortcut-active.svg' + ] + ], + 'actions-system-shortcut-new' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-shortcut-new.svg' + ] + ], + 'actions-system-tree-search-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-tree-search-open.svg' + ] + ], + 'actions-system-typoscript-documentation-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-typoscript-documentation-open.svg' + ] + ], + 'actions-system-typoscript-documentation' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-system-typoscript-documentation.svg' + ] + ], + 'actions-template-new' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-template-new.svg' + ] + ], + 'actions-unlock' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-unlock.svg' + ] + ], + 'actions-unmarkstate' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-unmarkstate.svg' + ] + ], + 'actions-upload' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-upload.svg' + ] + ], + 'actions-version-document-remove' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-version-document-remove.svg' + ] + ], + 'actions-version-page-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-version-page-open.svg' + ] + ], + 'actions-version-swap-version' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-version-swap-version.svg' + ] + ], + 'actions-version-swap-workspace' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-version-swap-workspace.svg' + ] + ], + 'actions-version-workspace-preview' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-version-workspace-preview.svg' + ] + ], + 'actions-version-workspace-sendtoprevstage' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-version-workspace-sendtoprevstage.svg' + ] + ], + 'actions-version-workspace-sendtostage' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-version-workspace-sendtostage.svg' + ] + ], + 'actions-version-workspaces-preview-link' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-version-workspaces-preview-link.svg' + ] + ], + 'actions-view-go-back' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-go-back.svg' + ] + ], + 'actions-view-go-down' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-go-down.svg' + ] + ], + 'actions-view-go-forward' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-go-forward.svg' + ] + ], + 'actions-view-go-up' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-go-up.svg' + ] + ], + 'actions-view-list-collapse' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-list-collapse.svg' + ] + ], + 'actions-view-list-expand' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-list-expand.svg' + ] + ], + 'actions-view-paging-first-disabled' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-first-disabled.svg' + ] + ], + 'actions-view-paging-first' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-first.svg' + ] + ], + 'actions-view-paging-last-disabled' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-last-disabled.svg' + ] + ], + 'actions-view-paging-last' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-last.svg' + ] + ], + 'actions-view-paging-next-disabled' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-next-disabled.svg' + ] + ], + 'actions-view-paging-next' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-next.svg' + ] + ], + 'actions-view-paging-previous-disabled' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-previous-disabled.svg' + ] + ], + 'actions-view-paging-previous' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-paging-previous.svg' + ] + ], + 'actions-view-table-collapse' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-table-collapse.svg' + ] + ], + 'actions-view-table-expand' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-table-expand.svg' + ] + ], + 'actions-view' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view.svg' + ] + ], + 'actions-window-open' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-window-open.svg' + ] + ], + 'actions-wizard-link' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'link' + ] + ], + 'actions-wizard-rte' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'arrows-alt' + ] + ], + 'actions-add-placeholder' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-add-placeholder.svg' + ] + ], + 'actions-view-page' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/actions/actions-view-page.svg' + ] + ], + // Apps + 'apps-clipboard-images' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-clipboard-images.svg' + ] + ], + 'apps-clipboard-list' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-clipboard-list.svg' + ] + ], + 'apps-filetree-folder-add' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-add.svg' + ] + ], + 'apps-filetree-folder-default' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-default.svg' + ] + ], + 'apps-filetree-folder-list' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-list.svg' + ] + ], + 'apps-filetree-folder-locked' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-locked.svg' + ] + ], + 'apps-filetree-folder-media' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-media.svg' + ] + ], + 'apps-filetree-folder-news' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-news.svg' + ] + ], + 'apps-filetree-folder-opened' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-opened.svg' + ] + ], + 'apps-filetree-folder-recycler' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-recycler.svg' + ] + ], + 'apps-filetree-folder-temp' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-temp.svg' + ] + ], + 'apps-filetree-folder-user' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder-user.svg' + ] + ], + 'apps-filetree-folder' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-folder.svg' + ] + ], + 'apps-filetree-mount' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-mount.svg' + ] + ], + 'apps-filetree-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-filetree-root.svg' + ] + ], + 'apps-irre-collapsed' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-irre-collapsed.svg' + ] + ], + 'apps-irre-expanded' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-irre-expanded.svg' + ] + ], + 'apps-pagetree-backend-user-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-backend-user-hideinmenu.svg' + ] + ], + 'apps-pagetree-backend-user' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-backend-user.svg' + ] + ], + 'apps-pagetree-category-collapse-all' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-category-collapse-all.svg' + ] + ], + 'apps-pagetree-category-expand-all' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-category-expand-all.svg' + ] + ], + 'apps-pagetree-collapse' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-collapse.svg' + ] + ], + 'apps-pagetree-drag-copy-above' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-copy-above.svg' + ] + ], + 'apps-pagetree-drag-copy-below' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-copy-below.svg' + ] + ], + 'apps-pagetree-drag-move-above' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-move-above.svg' + ] + ], + 'apps-pagetree-drag-move-below' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-move-below.svg' + ] + ], + 'apps-pagetree-drag-move-between' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-move-between.svg' + ] + ], + 'apps-pagetree-drag-move-into' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-move-into.svg' + ] + ], + 'apps-pagetree-drag-new-between' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-new-between.svg' + ] + ], + 'apps-pagetree-drag-new-inside' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-new-inside.svg' + ] + ], + 'apps-pagetree-drag-place-denied' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-drag-place-denied.svg' + ] + ], + 'apps-pagetree-expand' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-expand.svg' + ] + ], + 'apps-pagetree-folder-contains-approve' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-contains-approve.svg' + ] + ], + 'apps-pagetree-folder-contains-board' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-contains-board.svg' + ] + ], + 'apps-pagetree-folder-contains-fe_users' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-contains-fe_users.svg' + ] + ], + 'apps-pagetree-folder-contains-news' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-contains-news.svg' + ] + ], + 'apps-pagetree-folder-contains-shop' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-contains-shop.svg' + ] + ], + 'apps-pagetree-folder-contains' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-contains.svg' + ] + ], + 'apps-pagetree-folder-default' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-default.svg' + ] + ], + 'apps-pagetree-folder-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-hideinmenu.svg' + ] + ], + 'apps-pagetree-folder-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-folder-root.svg' + ] + ], + 'apps-pagetree-page-advanced-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-advanced-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-advanced-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-advanced-root.svg' + ] + ], + 'apps-pagetree-page-advanced' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-advanced.svg' + ] + ], + 'apps-pagetree-page-backend-user-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-backend-user-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-backend-user-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-backend-user-root.svg' + ] + ], + 'apps-pagetree-page-backend-user' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-backend-user.svg' + ] + ], + 'apps-pagetree-page-backend-users-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-backend-users-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-backend-users-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-backend-users-root.svg' + ] + ], + 'apps-pagetree-page-backend-users' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-backend-users.svg' + ] + ], + 'apps-pagetree-page-content-from-page-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-content-from-page-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-content-from-page-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-content-from-page-root.svg' + ] + ], + 'apps-pagetree-page-content-from-page' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-content-from-page.svg' + ] + ], + 'apps-pagetree-page-default' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-default.svg' + ] + ], + 'apps-pagetree-page-domain' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-domain.svg' + ] + ], + 'apps-pagetree-page-frontend-user-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-frontend-user-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-frontend-user-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-frontend-user-root.svg' + ] + ], + 'apps-pagetree-page-frontend-user' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-frontend-user.svg' + ] + ], + 'apps-pagetree-page-frontend-users-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-frontend-users-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-frontend-users-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-frontend-users-root.svg' + ] + ], + 'apps-pagetree-page-frontend-users' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-frontend-users.svg' + ] + ], + 'apps-pagetree-page-mountpoint-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-mountpoint-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-mountpoint-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-mountpoint-root.svg' + ] + ], + 'apps-pagetree-page-mountpoint' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-mountpoint.svg' + ] + ], + 'apps-pagetree-page-not-in-menu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-not-in-menu.svg' + ] + ], + 'apps-pagetree-page-recycler-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-recycler-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-recycler' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-recycler.svg' + ] + ], + 'apps-pagetree-page-shortcut-external-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-shortcut-external-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-shortcut-external-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-shortcut-external-root.svg' + ] + ], + 'apps-pagetree-page-shortcut-external' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-shortcut-external.svg' + ] + ], + 'apps-pagetree-page-shortcut-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-shortcut-hideinmenu.svg' + ] + ], + 'apps-pagetree-page-shortcut-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-shortcut-root.svg' + ] + ], + 'apps-pagetree-page-shortcut' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page-shortcut.svg' + ] + ], + 'apps-pagetree-page' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-page.svg' + ] + ], + 'apps-pagetree-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-root.svg' + ] + ], + 'apps-pagetree-spacer-hideinmenu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-spacer-hideinmenu.svg' + ] + ], + 'apps-pagetree-spacer-root' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-spacer-root.svg' + ] + ], + 'apps-pagetree-spacer' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-pagetree-spacer.svg' + ] + ], + 'apps-toolbar-menu-actions' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-actions.svg' + ] + ], + 'apps-toolbar-menu-cache' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-cache.svg' + ] + ], + 'apps-toolbar-menu-help' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-help.svg' + ] + ], + 'apps-toolbar-menu-opendocs' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-opendocs.svg' + ] + ], + 'apps-toolbar-menu-search' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-search.svg' + ] + ], + 'apps-toolbar-menu-shortcut' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-shortcut.svg' + ] + ], + 'apps-toolbar-menu-systeminformation' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-systeminformation.svg' + ] + ], + 'apps-toolbar-menu-workspace' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/apps/apps-toolbar-menu-workspace.svg' + ] + ], + 'apps-pagetree-category-toggle-hide-checked' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'check-square' + ] + ], + + // Avatar + 'avatar-default' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/avatar/avatar-default.svg' + ] + ], + + // Content + 'content-accordion' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-accordion.svg' + ] + ], + 'content-audio' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-audio.svg' + ] + ], + 'content-beside-text-img-above-center' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-above-center.svg' + ] + ], + 'content-beside-text-img-above-left' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-above-left.svg' + ] + ], + 'content-beside-text-img-above-right' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-above-right.svg' + ] + ], + 'content-beside-text-img-below-center' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-below-center.svg' + ] + ], + 'content-beside-text-img-below-left' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-below-left.svg' + ] + ], + 'content-beside-text-img-below-right' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-below-right.svg' + ] + ], + 'content-beside-text-img-left' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-left.svg' + ] + ], + 'content-beside-text-img-right' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-beside-text-img-right.svg' + ] + ], + 'content-briefcase' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-briefcase.svg' + ] + ], + 'content-bullets' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-bullets.svg' + ] + ], + 'content-carousel-header' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-carousel-header.svg' + ] + ], + 'content-carousel-html' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-carousel-html.svg' + ] + ], + 'content-carousel-image' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-carousel-image.svg' + ] + ], + 'content-carousel' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-carousel.svg' + ] + ], + 'content-coffee' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-coffee.svg' + ] + ], + 'content-elements-login' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-elements-login.svg' + ] + ], + 'content-elements-mailform' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-elements-mailform.svg' + ] + ], + 'content-elements-searchform' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-elements-searchform.svg' + ] + ], + 'content-form' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-form.svg' + ] + ], + 'content-header' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-header.svg' + ] + ], + 'content-idea' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-idea.svg' + ] + ], + 'content-image' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-image.svg' + ] + ], + 'content-info' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-info.svg' + ] + ], + 'content-inside-text-img-left' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-inside-text-img-left.svg' + ] + ], + 'content-inside-text-img-right' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-inside-text-img-right.svg' + ] + ], + 'content-media' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-media.svg' + ] + ], + 'content-menu-abstract' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-menu-abstract.svg' + ] + ], + 'content-menu-categorized' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-menu-categorized.svg' + ] + ], + 'content-menu-pages' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-menu-pages.svg' + ] + ], + 'content-menu-recently-updated' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-menu-recently-updated.svg' + ] + ], + 'content-menu-related' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-menu-related.svg' + ] + ], + 'content-menu-section' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-menu-section.svg' + ] + ], + 'content-menu-sitemap-pages' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-menu-sitemap-pages.svg' + ] + ], + 'content-menu-sitemap' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-menu-sitemap.svg' + ] + ], + 'content-menu-thumbnail' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-menu-thumbnail.svg' + ] + ], + 'content-news' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-news.svg' + ] + ], + 'content-panel' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-panel.svg' + ] + ], + 'content-plugin' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-plugin.svg' + ] + ], + 'content-quote' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-quote.svg' + ] + ], + 'content-special-div' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-special-div.svg' + ] + ], + 'content-special-html' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-special-html.svg' + ] + ], + 'content-special-indexed_search' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-special-indexed_search.svg' + ] + ], + 'content-special-menu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-special-menu.svg' + ] + ], + 'content-special-shortcut' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-special-shortcut.svg' + ] + ], + 'content-special-uploads' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-special-uploads.svg' + ] + ], + 'content-tab-item' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-tab-item.svg' + ] + ], + 'content-tab' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-tab.svg' + ] + ], + 'content-table' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-table.svg' + ] + ], + 'content-text-columns' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-text-columns.svg' + ] + ], + 'content-text-teaser' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-text-teaser.svg' + ] + ], + 'content-text' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-text.svg' + ] + ], + 'content-textmedia' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-textmedia.svg' + ] + ], + 'content-textpic' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/content/content-textpic.svg' + ] + ], + + // Default + 'default-not-found' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/default/default-not-found.svg' + ] + ], + + // Mimetypes + 'mimetypes-application' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-application.svg' + ] + ], + 'mimetypes-compressed' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-compressed.svg' + ] + ], + 'mimetypes-excel' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-excel.svg' + ] + ], + 'mimetypes-media-audio' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-media-audio.svg' + ] + ], + 'mimetypes-media-flash' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-media-flash.svg' + ] + ], + 'mimetypes-media-image' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-media-image.svg' + ] + ], + 'mimetypes-media-video-vimeo' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-media-video-vimeo.svg' + ] + ], + 'mimetypes-media-video-youtube' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-media-video-youtube.svg' + ] + ], + 'mimetypes-media-video' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-media-video.svg' + ] + ], + 'mimetypes-open-document-database' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-open-document-database.svg' + ] + ], + 'mimetypes-open-document-drawing' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-open-document-drawing.svg' + ] + ], + 'mimetypes-open-document-formula' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-open-document-formula.svg' + ] + ], + 'mimetypes-open-document-presentation' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-open-document-presentation.svg' + ] + ], + 'mimetypes-open-document-spreadsheet' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-open-document-spreadsheet.svg' + ] + ], + 'mimetypes-open-document-text' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-open-document-text.svg' + ] + ], + 'mimetypes-other-other' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-other-other.svg' + ] + ], + 'mimetypes-pdf' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-pdf.svg' + ] + ], + 'mimetypes-powerpoint' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-powerpoint.svg' + ] + ], + 'mimetypes-text-css' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-css.svg' + ] + ], + 'mimetypes-text-csv' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-csv.svg' + ] + ], + 'mimetypes-text-html' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-html.svg' + ] + ], + 'mimetypes-text-js' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-js.svg' + ] + ], + 'mimetypes-text-php' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-php.svg' + ] + ], + 'mimetypes-text-text' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-text.svg' + ] + ], + 'mimetypes-text-ts' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-ts.svg' + ] + ], + 'mimetypes-text-typoscript' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-text-typoscript.svg' + ] + ], + 'mimetypes-word' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-word.svg' + ] + ], + 'mimetypes-x-backend_layout' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-backend_layout.svg' + ] + ], + 'mimetypes-x-content-divider' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-divider.svg' + ] + ], + 'mimetypes-x-content-domain' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-domain.svg' + ] + ], + 'mimetypes-x-content-form-search' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-form-search.svg' + ] + ], + 'mimetypes-x-content-form' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-form.svg' + ] + ], + 'mimetypes-x-content-header' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-header.svg' + ] + ], + 'mimetypes-x-content-html' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-html.svg' + ] + ], + 'mimetypes-x-content-image' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-image.svg' + ] + ], + 'mimetypes-x-content-link' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-link.svg' + ] + ], + 'mimetypes-x-content-list-bullets' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-list-bullets.svg' + ] + ], + 'mimetypes-x-content-list-files' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-list-files.svg' + ] + ], + 'mimetypes-x-content-login' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-login.svg' + ] + ], + 'mimetypes-x-content-menu' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-menu.svg' + ] + ], + 'mimetypes-x-content-multimedia' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-multimedia.svg' + ] + ], + 'mimetypes-x-content-page-language-overlay' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-page-language-overlay.svg' + ] + ], + 'mimetypes-x-content-plugin' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-plugin.svg' + ] + ], + 'mimetypes-x-content-script' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-script.svg' + ] + ], + 'mimetypes-x-content-table' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-table.svg' + ] + ], + 'mimetypes-x-content-template-extension' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-template-extension.svg' + ] + ], + 'mimetypes-x-content-template-static' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-template-static.svg' + ] + ], + 'mimetypes-x-content-template' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-template.svg' + ] + ], + 'mimetypes-x-content-text-media' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-text-media.svg' + ] + ], + 'mimetypes-x-content-text-picture' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-text-picture.svg' + ] + ], + 'mimetypes-x-content-text' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-content-text.svg' + ] + ], + 'mimetypes-x-index_config' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-index_config.svg' + ] + ], + 'mimetypes-x-sys_action' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_action.svg' + ] + ], + 'mimetypes-x-sys_category' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_category.svg' + ] + ], + 'mimetypes-x-sys_filemounts' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_filemounts.svg' + ] + ], + 'mimetypes-x-sys_file_storage' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_file_storage.svg' + ] + ], + 'mimetypes-x-sys_language' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_language.svg' + ] + ], + 'mimetypes-x-sys_news' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_news.svg' + ] + ], + 'mimetypes-x-sys_note' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_note.svg' + ] + ], + 'mimetypes-x-sys_workspace' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-sys_workspace.svg' + ] + ], + 'mimetypes-x-tx_rtehtmlarea_acronym' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-tx_rtehtmlarea_acronym.svg' + ] + ], + 'mimetypes-x-tx_scheduler_task_group' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/mimetypes/mimetypes-x-tx_scheduler_task_group.svg' + ] + ], + + // Miscellaneous + 'miscellaneous-placeholder' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/miscellaneous/miscellaneous-placeholder.svg' + ] + ], + + // Module + 'module-web' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'file-o' + ] + ], + 'module-file' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'image' + ] + ], + 'module-tools' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'rocket' + ] + ], + 'module-system' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'plug' + ] + ], + 'module-help' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'question-circle' + ] + ], + 'module-about' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-about.svg' + ] + ], + 'module-aboutmodules' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-aboutmodules.svg' + ] + ], + 'module-belog' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-belog.svg' + ] + ], + 'module-beuser' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-beuser.svg' + ] + ], + 'module-config' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-config.svg' + ] + ], + 'module-cshmanual' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-cshmanual.svg' + ] + ], + 'module-dbal' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-dbal.svg' + ] + ], + 'module-dbint' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-dbint.svg' + ] + ], + 'module-documentation' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-documentation.svg' + ] + ], + 'module-extensionmanager' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-extensionmanager.svg' + ] + ], + 'module-filelist' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-filelist.svg' + ] + ], + 'module-form' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-form.svg' + ] + ], + 'module-func' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-func.svg' + ] + ], + 'module-help' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-help.svg' + ] + ], + 'module-indexed_search' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-indexed_search.svg' + ] + ], + 'module-info' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-info.svg' + ] + ], + 'module-install-environment' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-install-environment.svg' + ] + ], + 'module-install-maintenance' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-install-maintenance.svg' + ] + ], + 'module-install-settings' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-install-settings.svg' + ] + ], + 'module-install-upgrade' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-install-upgrade.svg' + ] + ], + 'module-install' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-install.svg' + ] + ], + 'module-lang' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-lang.svg' + ] + ], + 'module-list' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-list.svg' + ] + ], + 'module-page' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-page.svg' + ] + ], + 'module-permission' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-permission.svg' + ] + ], + 'module-recycler' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-recycler.svg' + ] + ], + 'module-reports' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-reports.svg' + ] + ], + 'module-scheduler' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-scheduler.svg' + ] + ], + 'module-setup' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-setup.svg' + ] + ], + 'module-taskcenter' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-taskcenter.svg' + ] + ], + 'module-tstemplate' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-tstemplate.svg' + ] + ], + 'module-version' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-version.svg' + ] + ], + 'module-viewpage' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-viewpage.svg' + ] + ], + 'module-workspaces' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/module/module-workspaces.svg' + ] + ], + + // Overlay + 'overlay-advanced' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-advanced.svg' + ] + ], + 'overlay-approved' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-approved.svg' + ] + ], + 'overlay-backenduser' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-backenduser.svg' + ] + ], + 'overlay-backendusers' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-backendusers.svg' + ] + ], + 'overlay-deleted' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-deleted.svg' + ] + ], + 'overlay-edit' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-edit.svg' + ] + ], + 'overlay-external-link' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-external-link.svg' + ] + ], + 'overlay-frontenduser' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-frontenduser.svg' + ] + ], + 'overlay-frontendusers' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-frontendusers.svg' + ] + ], + 'overlay-hidden' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-hidden.svg' + ] + ], + 'overlay-endtime' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-endtime.svg' + ] + ], + 'overlay-includes-subpages' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-includes-subpages.svg' + ] + ], + 'overlay-info' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-info.svg' + ] + ], + 'overlay-list' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-list.svg' + ] + ], + 'overlay-locked' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-locked.svg' + ] + ], + 'overlay-media' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-media.svg' + ] + ], + 'overlay-missing' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-missing.svg' + ] + ], + 'overlay-mountpoint' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-mountpoint.svg' + ] + ], + 'overlay-new' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-new.svg' + ] + ], + 'overlay-news' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-news.svg' + ] + ], + 'overlay-readonly' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-readonly.svg' + ] + ], + 'overlay-restricted' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-restricted.svg' + ] + ], + 'overlay-scheduled' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-scheduled.svg' + ] + ], + 'overlay-endtime' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-endtime.svg' + ] + ], + 'overlay-shop' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-shop.svg' + ] + ], + 'overlay-shortcut' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-shortcut.svg' + ] + ], + 'overlay-translated' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-translated.svg' + ] + ], + 'overlay-warning' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/overlay/overlay-warning.svg' + ] + ], + + // Spinner + 'spinner-circle-dark' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/spinner/spinner-circle-dark.svg', + 'spinning' => true + ] + ], + 'spinner-circle-light' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/spinner/spinner-circle-light.svg', + 'spinning' => true + ] + ], + 'spinner-circle' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/spinner/spinner-circle.svg', + 'spinning' => true + ] + ], + + // Status + 'status-user-admin' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/status/status-user-admin.svg' + ] + ], + 'status-user-backend' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/status/status-user-backend.svg' + ] + ], + 'status-user-frontend' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/status/status-user-frontend.svg' + ] + ], + 'status-user-group-backend' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/status/status-user-group-backend.svg' + ] + ], + 'status-user-group-frontend' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/status/status-user-group-frontend.svg' + ] + ], + 'status-dialog-information' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'exclamation-circle' + ] + ], + 'status-dialog-ok' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'check-circle', + ] + ], + 'status-dialog-notification' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'exclamation-circle' + ] + ], + 'status-dialog-warning' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'exclamation-triangle' + ] + ], + 'status-dialog-error' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'exclamation-circle' + ] + ], + 'status-warning-lock' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:backend/Resources/Public/Icons/warning-lock.png' + ] + ], + 'status-warning-in-use' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:backend/Resources/Public/Icons/warning-in-use.png' + ] + ], + 'status-status-checked' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'check', + ] + ], + 'status-status-current' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-right', + ] + ], + 'status-status-reference-hard' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:impexp/Resources/Public/Icons/status-reference-hard.png', + ] + ], + 'status-status-sorting-asc' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-up', + ] + ], + 'status-status-sorting-desc' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-down', + ] + ], + 'status-status-sorting-light-asc' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-up', + ] + ], + 'status-status-sorting-light-desc' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-down', + ] + ], + 'status-status-permission-granted' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'check', + ] + ], + 'status-status-permission-denied' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'times', + ] + ], + 'status-status-reference-soft' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:impexp/Resources/Public/Icons/status-reference-soft.png', + ] + ], + 'status-status-edit-read-only' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:backend/Resources/Public/Icons/status-edit-read-only.png', + ] + ], + + // Extensions + 'extensions-extensionmanager-update-script' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'refresh', + ] + ], + 'extensions-scheduler-run-task' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'play-circle', + ] + ], + 'extensions-scheduler-run-task-cron' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'clock-o', + ] + ], + 'extensions-workspaces-generatepreviewlink' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:workspaces/Resources/Public/Images/generate-ws-preview-link.png' + ] + ], + + // Empty + 'empty-empty' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'empty-empty', + ] + ], + + // System Information + 'sysinfo-php-version' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'code' + ] + ], + 'sysinfo-database' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'database' + ] + ], + 'sysinfo-application-context' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'tasks' + ] + ], + 'sysinfo-composer-mode' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'music' + ] + ], + 'sysinfo-git' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'git' + ] + ], + 'sysinfo-webserver' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'server' + ] + ], + 'sysinfo-os-linux' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'linux' + ] + ], + 'sysinfo-os-apple' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'apple' + ] + ], + 'sysinfo-os-windows' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'windows' + ] + ], + 'sysinfo-typo3-version' => [ + 'provider' => SvgIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/T3Icons/sysinfo/sysinfo-typo3-version.svg' + ] + ], + + // Sysnote + 'sysnote-type-0' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'sticky-note-o' + ] + ], + 'sysnote-type-1' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'cog' + ] + ], + 'sysnote-type-2' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'code' + ] + ], + 'sysnote-type-3' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'thumb-tack' + ] + ], + 'sysnote-type-4' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'check-square' + ] + ], + + // Flags will be auto-registered after we have the SVG files + 'flags-multiple' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/multiple.png' + ] + ], + 'flags-catalonia' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/catalonia.png' + ] + ], + 'flags-en-us-gb' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/en_us-gb.png' + ] + ], + 'flags-scotland' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/scotland.png' + ] + ], + 'flags-wales' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/wales.png' + ] + ], + ]; + + /** + * Mapping of file extensions to mimetypes + * + * @var string[] + */ + protected $fileExtensionMapping = [ + 'htm' => 'mimetypes-text-html', + 'html' => 'mimetypes-text-html', + 'css' => 'mimetypes-text-css', + 'js' => 'mimetypes-text-js', + 'csv' => 'mimetypes-text-csv', + 'php' => 'mimetypes-text-php', + 'php6' => 'mimetypes-text-php', + 'php5' => 'mimetypes-text-php', + 'php4' => 'mimetypes-text-php', + 'php3' => 'mimetypes-text-php', + 'inc' => 'mimetypes-text-php', + 'ts' => 'mimetypes-text-ts', + 'typoscript' => 'mimetypes-text-typoscript', + 'txt' => 'mimetypes-text-text', + 'class' => 'mimetypes-text-text', + 'tmpl' => 'mimetypes-text-text', + 'jpg' => 'mimetypes-media-image', + 'jpeg' => 'mimetypes-media-image', + 'gif' => 'mimetypes-media-image', + 'png' => 'mimetypes-media-image', + 'bmp' => 'mimetypes-media-image', + 'tif' => 'mimetypes-media-image', + 'tiff' => 'mimetypes-media-image', + 'tga' => 'mimetypes-media-image', + 'psd' => 'mimetypes-media-image', + 'eps' => 'mimetypes-media-image', + 'ai' => 'mimetypes-media-image', + 'svg' => 'mimetypes-media-image', + 'pcx' => 'mimetypes-media-image', + 'avi' => 'mimetypes-media-video', + 'mpg' => 'mimetypes-media-video', + 'mpeg' => 'mimetypes-media-video', + 'mov' => 'mimetypes-media-video', + 'vimeo' => 'mimetypes-media-video-vimeo', + 'youtube' => 'mimetypes-media-video-youtube', + 'wav' => 'mimetypes-media-audio', + 'mp3' => 'mimetypes-media-audio', + 'ogg' => 'mimetypes-media-audio', + 'flac' => 'mimetypes-media-audio', + 'opus' => 'mimetypes-media-audio', + 'mid' => 'mimetypes-media-audio', + 'swf' => 'mimetypes-media-flash', + 'swa' => 'mimetypes-media-flash', + 'exe' => 'mimetypes-application', + 'com' => 'mimetypes-application', + 't3x' => 'mimetypes-compressed', + 't3d' => 'mimetypes-compressed', + 'zip' => 'mimetypes-compressed', + 'tgz' => 'mimetypes-compressed', + 'gz' => 'mimetypes-compressed', + 'pdf' => 'mimetypes-pdf', + 'doc' => 'mimetypes-word', + 'dot' => 'mimetypes-word', + 'docm' => 'mimetypes-word', + 'docx' => 'mimetypes-word', + 'dotm' => 'mimetypes-word', + 'dotx' => 'mimetypes-word', + 'sxw' => 'mimetypes-word', + 'rtf' => 'mimetypes-word', + 'xls' => 'mimetypes-excel', + 'xlsm' => 'mimetypes-excel', + 'xlsx' => 'mimetypes-excel', + 'xltm' => 'mimetypes-excel', + 'xltx' => 'mimetypes-excel', + 'sxc' => 'mimetypes-excel', + 'pps' => 'mimetypes-powerpoint', + 'ppsx' => 'mimetypes-powerpoint', + 'ppt' => 'mimetypes-powerpoint', + 'pptm' => 'mimetypes-powerpoint', + 'pptx' => 'mimetypes-powerpoint', + 'potm' => 'mimetypes-powerpoint', + 'potx' => 'mimetypes-powerpoint', + 'mount' => 'apps-filetree-mount', + 'folder' => 'apps-filetree-folder-default', + 'default' => 'mimetypes-other-other', + ]; + + /** + * Mapping of mime types to icons + * + * @var string[] + */ + protected $mimeTypeMapping = [ + 'video/*' => 'mimetypes-media-video', + 'audio/*' => 'mimetypes-media-audio', + 'image/*' => 'mimetypes-media-image', + 'text/*' => 'mimetypes-text-text', + ]; + + /** + * Array of deprecated icons, add deprecated icons to this array and remove it from registry + * - Index of this array contains the deprecated icon + * - Value of each entry must contain the deprecation message and can contain an identifier + * which replaces the old identifier + * + * Example: + * array( + * 'deprecated-icon-identifier' => array( + * 'message' => '%s is deprecated since TYPO3 CMS 7, this icon will be removed in TYPO3 CMS 8', + * 'replacement' => 'alternative-icon-identifier' // must be registered + * ) + * ) + * + * @var array + */ + protected $deprecatedIcons = [ + 'actions-document-close' => [ + 'message' => '%s is deprecated since TYPO3 CMS 8, this icon will be removed in TYPO3 CMS 9', + 'replacement' => 'actions-close' + ], + 'actions-edit-add' => [ + 'message' => '%s is deprecated since TYPO3 CMS 8, this icon will be removed in TYPO3 CMS 9', + 'replacement' => 'actions-add' + ] + ]; + + /** + * @var string + */ + protected $defaultIconIdentifier = 'default-not-found'; + + /** + * The constructor + */ + public function __construct() + { + $this->initialize(); + } + + /** + * Initialize the registry + * This method can be called multiple times, depending on initialization status. + * In some cases e.g. TCA is not available, the method must be called multiple times. + */ + protected function initialize() + { + if (!$this->tcaInitialized && !empty($GLOBALS['TCA'])) { + $this->registerTCAIcons(); + } + if (!$this->moduleIconsInitialized && !empty($GLOBALS['TBE_MODULES'])) { + $this->registerModuleIcons(); + } + if (!$this->flagsInitialized) { + $this->registerFlags(); + } + if ($this->tcaInitialized && $this->moduleIconsInitialized && $this->flagsInitialized) { + $this->fullInitialized = true; + } + } + + /** + * @param string $identifier + * @return bool + */ + public function isRegistered($identifier) + { + if (!$this->fullInitialized) { + $this->initialize(); + } + return isset($this->icons[$identifier]); + } + + /** + * @param string $identifier + * @return bool + */ + public function isDeprecated($identifier) + { + return isset($this->deprecatedIcons[$identifier]); + } + + /** + * @return string + */ + public function getDefaultIconIdentifier() + { + return $this->defaultIconIdentifier; + } + + /** + * Registers an icon to be available inside the Icon Factory + * + * @param string $identifier + * @param string $iconProviderClassName + * @param array $options + * + * @throws \InvalidArgumentException + */ + public function registerIcon($identifier, $iconProviderClassName, array $options = []) + { + if (!in_array(IconProviderInterface::class, class_implements($iconProviderClassName), true)) { + throw new \InvalidArgumentException('An IconProvider must implement ' + . IconProviderInterface::class, 1437425803); + } + $this->icons[$identifier] = [ + 'provider' => $iconProviderClassName, + 'options' => $options + ]; + } + + /** + * Register an icon for a file extension + * + * @param string $fileExtension + * @param string $iconIdentifier + */ + public function registerFileExtension($fileExtension, $iconIdentifier) + { + $this->fileExtensionMapping[$fileExtension] = $iconIdentifier; + } + + /** + * Register an icon for a mime-type + * + * @param string $mimeType + * @param string $iconIdentifier + */ + public function registerMimeTypeIcon($mimeType, $iconIdentifier) + { + $this->mimeTypeMapping[$mimeType] = $iconIdentifier; + } + + /** + * Fetches the configuration provided by registerIcon() + * + * @param string $identifier the icon identifier + * @return mixed + * @throws Exception + */ + public function getIconConfigurationByIdentifier($identifier) + { + if (!$this->fullInitialized) { + $this->initialize(); + } + if (!$this->isRegistered($identifier)) { + throw new Exception('Icon with identifier "' . $identifier . '" is not registered"', 1437425804); + } + if ($this->isDeprecated($identifier)) { + $deprecationSettings = $this->deprecatedIcons[$identifier]; + GeneralUtility::deprecationLog(sprintf($deprecationSettings['message'], $identifier)); + if (!empty($deprecationSettings['replacement'])) { + $identifier = $deprecationSettings['replacement']; + } + } + return $this->icons[$identifier]; + } + + /** + * @param string $identifier + * + * @return array + * @throws Exception + * @deprecated since TYPO3 v8, will be removed in TYPO3 v9 + */ + public function getDeprecationSettings($identifier) + { + GeneralUtility::logDeprecatedFunction(); + if (!$this->isDeprecated($identifier)) { + throw new Exception('Icon with identifier "' . $identifier . '" is not deprecated"', 1460976527); + } + return $this->deprecatedIcons[$identifier]; + } + + /** + * @return array + */ + public function getAllRegisteredIconIdentifiers() + { + if (!$this->fullInitialized) { + $this->initialize(); + } + return array_keys($this->icons); + } + + /** + * @param string $fileExtension + * @return string + */ + public function getIconIdentifierForFileExtension($fileExtension) + { + // If the file extension is not valid use the default one + if (!isset($this->fileExtensionMapping[$fileExtension])) { + $fileExtension = 'default'; + } + return $this->fileExtensionMapping[$fileExtension]; + } + + /** + * Get iconIdentifier for given mimeType + * + * @param string $mimeType + * @return string|null Returns null if no icon is registered for the mimeType + */ + public function getIconIdentifierForMimeType($mimeType) + { + if (!isset($this->mimeTypeMapping[$mimeType])) { + return null; + } + return $this->mimeTypeMapping[$mimeType]; + } + + /** + * Load icons from TCA for each table and add them as "tcarecords-XX" to $this->icons + */ + protected function registerTCAIcons() + { + $resultArray = []; + + $tcaTables = array_keys($GLOBALS['TCA']); + // check every table in the TCA, if an icon is needed + foreach ($tcaTables as $tableName) { + // This method is only needed for TCA tables where typeicon_classes are not configured + if (is_array($GLOBALS['TCA'][$tableName])) { + $tcaCtrl = $GLOBALS['TCA'][$tableName]['ctrl']; + $iconIdentifier = 'tcarecords-' . $tableName . '-default'; + if (isset($this->icons[$iconIdentifier])) { + continue; + } + if (isset($tcaCtrl['iconfile'])) { + $resultArray[$iconIdentifier] = $tcaCtrl['iconfile']; + } + } + } + + foreach ($resultArray as $iconIdentifier => $iconFilePath) { + $iconProviderClass = $this->detectIconProvider($iconFilePath); + $this->icons[$iconIdentifier] = [ + 'provider' => $iconProviderClass, + 'options' => [ + 'source' => $iconFilePath + ] + ]; + } + $this->tcaInitialized = true; + } + + /** + * Register module icons + */ + protected function registerModuleIcons() + { + $moduleConfiguration = $GLOBALS['TBE_MODULES']['_configuration']; + foreach ($moduleConfiguration as $moduleKey => $singleModuleConfiguration) { + $iconIdentifier = !empty($singleModuleConfiguration['iconIdentifier']) + ? $singleModuleConfiguration['iconIdentifier'] + : null; + + if ($iconIdentifier !== null) { + // iconIdentifier found, icon is registered, continue + continue; + } + + $iconPath = !empty($singleModuleConfiguration['icon']) + ? $singleModuleConfiguration['icon'] + : null; + $iconProviderClass = $this->detectIconProvider($iconPath); + $iconIdentifier = 'module-icon-' . $moduleKey; + + $this->icons[$iconIdentifier] = [ + 'provider' => $iconProviderClass, + 'options' => [ + 'source' => $iconPath + ] + ]; + } + $this->moduleIconsInitialized = true; + } + + /** + * Register flags + */ + protected function registerFlags() + { + $iconFolder = 'EXT:core/Resources/Public/Icons/Flags/PNG/'; + $files = [ + 'AC', 'AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AN', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', + 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', + 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CP', 'CR', 'CS', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', + 'DE', 'DG', 'DJ', 'DK', 'DM', 'DO', 'DZ', + 'EA', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'EU', + 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', + 'GA', 'GB-ENG', 'GB-NIR', 'GB-SCT', 'GB-WLS', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', + 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', + 'IC', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', + 'JE', 'JM', 'JO', 'JP', + 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', + 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', + 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', + 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', + 'OM', + 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', + 'QA', 'QC', + 'RE', 'RO', 'RS', 'RU', 'RW', + 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', + 'TA', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', + 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', + 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', + 'WF', 'WS', + 'XK', + 'YE', 'YT', + 'ZA', 'ZM', 'ZW' + ]; + foreach ($files as $file) { + $identifier = strtolower($file); + $this->icons['flags-' . $identifier] = [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => $iconFolder . $file . '.png' + ] + ]; + } + $this->flagsInitialized = true; + } + + /** + * Detect the IconProvider of an icon + * + * @param string $iconReference + * @return string + */ + public function detectIconProvider($iconReference) + { + if (StringUtility::endsWith(strtolower($iconReference), 'svg')) { + return SvgIconProvider::class; + } + return BitmapIconProvider::class; + } +} diff --git a/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/IconRegistry9.php b/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/IconRegistry9.php new file mode 100644 index 00000000..de3a582b --- /dev/null +++ b/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/IconRegistry9.php @@ -0,0 +1,861 @@ + BitmapIconProvider::class, + 'svg' => SvgIconProvider::class + ]; + + /** + * manually registered icons + * hopefully obsolete one day + * + * @var array + */ + protected $staticIcons = [ + + /** + * Important Information: + * + * Icons are maintained in an external repository, if new icons are needed + * please request them at: https://github.com/wmdbsystems/T3.Icons/issues + */ + + // Actions + 'actions-wizard-link' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'link' + ] + ], + 'actions-wizard-rte' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'arrows-alt' + ] + ], + + // Apps + 'apps-pagetree-category-toggle-hide-checked' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'check-square' + ] + ], + + // Module + 'module-web' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'file-o' + ] + ], + 'module-file' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'image' + ] + ], + 'module-tools' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'rocket' + ] + ], + 'module-system' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'plug' + ] + ], + 'module-help' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'question-circle' + ] + ], + + // Status + 'status-dialog-information' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'exclamation-circle' + ] + ], + 'status-dialog-ok' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'check-circle', + ] + ], + 'status-dialog-notification' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'exclamation-circle' + ] + ], + 'status-dialog-warning' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'exclamation-triangle' + ] + ], + 'status-dialog-error' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'exclamation-circle' + ] + ], + 'status-status-checked' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'check', + ] + ], + 'status-status-current' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-right', + ] + ], + 'status-status-sorting-asc' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-up', + ] + ], + 'status-status-sorting-desc' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-down', + ] + ], + 'status-status-sorting-light-asc' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-up', + ] + ], + 'status-status-sorting-light-desc' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'caret-down', + ] + ], + 'status-status-permission-granted' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'check', + ] + ], + 'status-status-permission-denied' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'times', + ] + ], + + // Extensions + 'extensions-extensionmanager-update-script' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'refresh', + ] + ], + 'extensions-scheduler-run-task' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'play-circle', + ] + ], + 'extensions-scheduler-run-task-cron' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'clock-o', + ] + ], + 'generate-ws-preview-link' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:workspaces/Resources/Public/Images/generate-ws-preview-link.png' + ] + ], + + // Empty + 'empty-empty' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'empty-empty', + ] + ], + + // System Information + 'sysinfo-php-version' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'code' + ] + ], + 'sysinfo-database' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'database' + ] + ], + 'sysinfo-application-context' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'tasks' + ] + ], + 'sysinfo-composer-mode' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'music' + ] + ], + 'sysinfo-git' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'git' + ] + ], + 'sysinfo-webserver' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'server' + ] + ], + 'sysinfo-os-linux' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'linux' + ] + ], + 'sysinfo-os-apple' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'apple' + ] + ], + 'sysinfo-os-windows' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'windows' + ] + ], + + // Sysnote + 'sysnote-type-0' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'sticky-note-o' + ] + ], + 'sysnote-type-1' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'cog' + ] + ], + 'sysnote-type-2' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'code' + ] + ], + 'sysnote-type-3' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'thumb-tack' + ] + ], + 'sysnote-type-4' => [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'check-square' + ] + ], + + // Flags will be auto-registered after we have the SVG files + 'flags-multiple' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/multiple.png' + ] + ], + 'flags-catalonia' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/catalonia.png' + ] + ], + 'flags-en-us-gb' => [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => 'EXT:core/Resources/Public/Icons/Flags/en_us-gb.png' + ] + ], + ]; + + /** + * Mapping of file extensions to mimetypes + * + * @var string[] + */ + protected $fileExtensionMapping = [ + 'htm' => 'mimetypes-text-html', + 'html' => 'mimetypes-text-html', + 'css' => 'mimetypes-text-css', + 'js' => 'mimetypes-text-js', + 'csv' => 'mimetypes-text-csv', + 'php' => 'mimetypes-text-php', + 'php6' => 'mimetypes-text-php', + 'php5' => 'mimetypes-text-php', + 'php4' => 'mimetypes-text-php', + 'php3' => 'mimetypes-text-php', + 'inc' => 'mimetypes-text-php', + 'ts' => 'mimetypes-text-ts', + 'typoscript' => 'mimetypes-text-typoscript', + 'txt' => 'mimetypes-text-text', + 'class' => 'mimetypes-text-text', + 'tmpl' => 'mimetypes-text-text', + 'jpg' => 'mimetypes-media-image', + 'jpeg' => 'mimetypes-media-image', + 'gif' => 'mimetypes-media-image', + 'png' => 'mimetypes-media-image', + 'bmp' => 'mimetypes-media-image', + 'tif' => 'mimetypes-media-image', + 'tiff' => 'mimetypes-media-image', + 'tga' => 'mimetypes-media-image', + 'psd' => 'mimetypes-media-image', + 'eps' => 'mimetypes-media-image', + 'ai' => 'mimetypes-media-image', + 'svg' => 'mimetypes-media-image', + 'pcx' => 'mimetypes-media-image', + 'avi' => 'mimetypes-media-video', + 'mpg' => 'mimetypes-media-video', + 'mpeg' => 'mimetypes-media-video', + 'mov' => 'mimetypes-media-video', + 'vimeo' => 'mimetypes-media-video-vimeo', + 'youtube' => 'mimetypes-media-video-youtube', + 'wav' => 'mimetypes-media-audio', + 'mp3' => 'mimetypes-media-audio', + 'ogg' => 'mimetypes-media-audio', + 'flac' => 'mimetypes-media-audio', + 'opus' => 'mimetypes-media-audio', + 'mid' => 'mimetypes-media-audio', + 'swf' => 'mimetypes-media-flash', + 'swa' => 'mimetypes-media-flash', + 'exe' => 'mimetypes-application', + 'com' => 'mimetypes-application', + 't3x' => 'mimetypes-compressed', + 't3d' => 'mimetypes-compressed', + 'zip' => 'mimetypes-compressed', + 'tgz' => 'mimetypes-compressed', + 'gz' => 'mimetypes-compressed', + 'pdf' => 'mimetypes-pdf', + 'doc' => 'mimetypes-word', + 'dot' => 'mimetypes-word', + 'docm' => 'mimetypes-word', + 'docx' => 'mimetypes-word', + 'dotm' => 'mimetypes-word', + 'dotx' => 'mimetypes-word', + 'sxw' => 'mimetypes-word', + 'rtf' => 'mimetypes-word', + 'xls' => 'mimetypes-excel', + 'xlsm' => 'mimetypes-excel', + 'xlsx' => 'mimetypes-excel', + 'xltm' => 'mimetypes-excel', + 'xltx' => 'mimetypes-excel', + 'sxc' => 'mimetypes-excel', + 'pps' => 'mimetypes-powerpoint', + 'ppsx' => 'mimetypes-powerpoint', + 'ppt' => 'mimetypes-powerpoint', + 'pptm' => 'mimetypes-powerpoint', + 'pptx' => 'mimetypes-powerpoint', + 'potm' => 'mimetypes-powerpoint', + 'potx' => 'mimetypes-powerpoint', + 'mount' => 'apps-filetree-mount', + 'folder' => 'apps-filetree-folder-default', + 'default' => 'mimetypes-other-other', + ]; + + /** + * Mapping of mime types to icons + * + * @var string[] + */ + protected $mimeTypeMapping = [ + 'video/*' => 'mimetypes-media-video', + 'audio/*' => 'mimetypes-media-audio', + 'image/*' => 'mimetypes-media-image', + 'text/*' => 'mimetypes-text-text', + ]; + + /** + * Array of deprecated icons, add deprecated icons to this array and remove it from registry + * - Index of this array contains the deprecated icon + * - Value of each entry may contain a possible new identifier + * + * Example: + * [ + * 'deprecated-icon-identifier' => 'new-icon-identifier', + * 'another-deprecated-identifier' => null, + * ] + * + * @var array + */ + protected $deprecatedIcons = [ + 'status-warning-lock' => 'warning-lock', + 'status-warning-in-use' => 'warning-in-use', + 'status-status-reference-hard' => 'status-reference-hard', + 'status-status-reference-soft' => 'status-reference-soft', + 'status-status-edit-read-only' => 'status-edit-read-only', + 'extensions-workspaces-generatepreviewlink' => 'generate-ws-preview-link', + ]; + + /** + * @var string + */ + protected $defaultIconIdentifier = 'default-not-found'; + + /** + * The constructor + */ + public function __construct() + { + $this->initialize(); + } + + /** + * Initialize the registry + * This method can be called multiple times, depending on initialization status. + * In some cases e.g. TCA is not available, the method must be called multiple times. + */ + protected function initialize() + { + if (!$this->backendIconsInitialized) { + $this->getCachedBackendIcons(); + } + if (!$this->tcaInitialized && !empty($GLOBALS['TCA'])) { + $this->registerTCAIcons(); + } + if (!$this->moduleIconsInitialized && !empty($GLOBALS['TBE_MODULES'])) { + $this->registerModuleIcons(); + } + if (!$this->flagsInitialized) { + $this->registerFlags(); + } + if ($this->backendIconsInitialized + && $this->tcaInitialized + && $this->moduleIconsInitialized + && $this->flagsInitialized) { + $this->fullInitialized = true; + } + } + + /** + * Retrieve the icons from cache render them when not cached yet + */ + protected function getCachedBackendIcons() + { + $cacheIdentifier = 'BackendIcons_' . sha1((TYPO3_version . PATH_site . 'BackendIcons')); + /** @var \TYPO3\CMS\Core\Cache\Frontend\VariableFrontend $assetsCache */ + $assetsCache = GeneralUtility::makeInstance(CacheManager::class)->getCache('assets'); + $cacheEntry = $assetsCache->get($cacheIdentifier); + + if ($cacheEntry !== false) { + $this->icons = $cacheEntry; + } else { + $this->registerBackendIcons(); + // all found icons should now be present, for historic reasons now merge w/ the statically declared icons + $this->icons = array_merge($this->icons, $this->staticIcons); + $assetsCache->set($cacheIdentifier, $this->icons); + } + // if there's now at least one icon registered, consider it successful + if (is_array($this->icons) && (count($this->icons) >= count($this->staticIcons))) { + $this->backendIconsInitialized = true; + } + } + + /** + * Automatically find and register the core backend icons + */ + protected function registerBackendIcons() + { + foreach ($this->backendIconPaths as $iconPath) { + $absoluteIconFolderPath = GeneralUtility::getFileAbsFileName($iconPath); + if ($absoluteIconFolderPath === '' || !is_readable($absoluteIconFolderPath)) { + // maybe EXT:path could not be resolved, then ignore + continue; + } + + $finder = new Finder(); + $finder + ->files() + ->in($absoluteIconFolderPath) + ->name('/\.(' . implode('|', array_keys($this->backendIconAllowedExtensionsWithProvider)) . ')$/'); + + foreach ($finder as $iconFile) { + $iconOptions = [ + 'source' => $iconPath . GeneralUtility::fixWindowsFilePath($iconFile->getRelativePathname()) + ]; + // kind of hotfix for now, needs a nicer concept later + if (strpos($iconFile->getFilename(), 'spinner') === 0) { + $iconOptions['spinning'] = true; + } + + $this->registerIcon( + $iconFile->getBasename('.' . $iconFile->getExtension()), + $this->backendIconAllowedExtensionsWithProvider[$iconFile->getExtension()], + $iconOptions + ); + } + } + } + + /** + * @param string $identifier + * @return bool + */ + public function isRegistered($identifier) + { + if (!$this->fullInitialized) { + $this->initialize(); + } + return isset($this->icons[$identifier]); + } + + /** + * @param string $identifier + * @return bool + */ + public function isDeprecated($identifier) + { + return isset($this->deprecatedIcons[$identifier]); + } + + /** + * @return string + */ + public function getDefaultIconIdentifier() + { + return $this->defaultIconIdentifier; + } + + /** + * Registers an icon to be available inside the Icon Factory + * + * @param string $identifier + * @param string $iconProviderClassName + * @param array $options + * + * @throws \InvalidArgumentException + */ + public function registerIcon($identifier, $iconProviderClassName, array $options = []) + { + if (!in_array(IconProviderInterface::class, class_implements($iconProviderClassName), true)) { + throw new \InvalidArgumentException('An IconProvider must implement ' + . IconProviderInterface::class, 1437425803); + } + $this->icons[$identifier] = [ + 'provider' => $iconProviderClassName, + 'options' => $options + ]; + } + + /** + * Register an icon for a file extension + * + * @param string $fileExtension + * @param string $iconIdentifier + */ + public function registerFileExtension($fileExtension, $iconIdentifier) + { + $this->fileExtensionMapping[$fileExtension] = $iconIdentifier; + } + + /** + * Register an icon for a mime-type + * + * @param string $mimeType + * @param string $iconIdentifier + */ + public function registerMimeTypeIcon($mimeType, $iconIdentifier) + { + $this->mimeTypeMapping[$mimeType] = $iconIdentifier; + } + + /** + * Fetches the configuration provided by registerIcon() + * + * @param string $identifier the icon identifier + * @return mixed + * @throws Exception + */ + public function getIconConfigurationByIdentifier($identifier) + { + if (!$this->fullInitialized) { + $this->initialize(); + } + if (!$this->isRegistered($identifier)) { + throw new Exception('Icon with identifier "' . $identifier . '" is not registered"', 1437425804); + } + if ($this->isDeprecated($identifier)) { + $replacement = $this->deprecatedIcons[$identifier]; + if (!empty($replacement)) { + $message = 'The icon "%s" is deprecated since TYPO3 v9 and will be removed in TYPO3 v10. Please use "%s" instead.'; + $arguments = [$replacement]; + } else { + $message = 'The icon "%s" is deprecated since TYPO3 v9 and will be removed in TYPO3 v10.'; + $arguments = []; + } + trigger_error(vsprintf($message, $arguments), E_USER_DEPRECATED); + } + return $this->icons[$identifier]; + } + + /** + * @return array + */ + public function getAllRegisteredIconIdentifiers() + { + if (!$this->fullInitialized) { + $this->initialize(); + } + return array_keys($this->icons); + } + + /** + * @param string $fileExtension + * @return string + */ + public function getIconIdentifierForFileExtension($fileExtension) + { + // If the file extension is not valid use the default one + if (!isset($this->fileExtensionMapping[$fileExtension])) { + $fileExtension = 'default'; + } + return $this->fileExtensionMapping[$fileExtension]; + } + + /** + * Get iconIdentifier for given mimeType + * + * @param string $mimeType + * @return string|null Returns null if no icon is registered for the mimeType + */ + public function getIconIdentifierForMimeType($mimeType) + { + if (!isset($this->mimeTypeMapping[$mimeType])) { + return null; + } + return $this->mimeTypeMapping[$mimeType]; + } + + /** + * Load icons from TCA for each table and add them as "tcarecords-XX" to $this->icons + */ + protected function registerTCAIcons() + { + $resultArray = []; + + $tcaTables = array_keys($GLOBALS['TCA']); + // check every table in the TCA, if an icon is needed + foreach ($tcaTables as $tableName) { + // This method is only needed for TCA tables where typeicon_classes are not configured + if (is_array($GLOBALS['TCA'][$tableName])) { + $tcaCtrl = $GLOBALS['TCA'][$tableName]['ctrl']; + $iconIdentifier = 'tcarecords-' . $tableName . '-default'; + if (isset($this->icons[$iconIdentifier])) { + continue; + } + if (isset($tcaCtrl['iconfile'])) { + $resultArray[$iconIdentifier] = $tcaCtrl['iconfile']; + } + } + } + + foreach ($resultArray as $iconIdentifier => $iconFilePath) { + $iconProviderClass = $this->detectIconProvider($iconFilePath); + $this->icons[$iconIdentifier] = [ + 'provider' => $iconProviderClass, + 'options' => [ + 'source' => $iconFilePath + ] + ]; + } + $this->tcaInitialized = true; + } + + /** + * Register module icons + */ + protected function registerModuleIcons() + { + $moduleConfiguration = $GLOBALS['TBE_MODULES']['_configuration']; + foreach ($moduleConfiguration as $moduleKey => $singleModuleConfiguration) { + $iconIdentifier = !empty($singleModuleConfiguration['iconIdentifier']) + ? $singleModuleConfiguration['iconIdentifier'] + : null; + + if ($iconIdentifier !== null) { + // iconIdentifier found, icon is registered, continue + continue; + } + + $iconPath = !empty($singleModuleConfiguration['icon']) + ? $singleModuleConfiguration['icon'] + : null; + $iconProviderClass = $this->detectIconProvider($iconPath); + $iconIdentifier = 'module-icon-' . $moduleKey; + + $this->icons[$iconIdentifier] = [ + 'provider' => $iconProviderClass, + 'options' => [ + 'source' => $iconPath + ] + ]; + } + $this->moduleIconsInitialized = true; + } + + /** + * Register flags + */ + protected function registerFlags() + { + $iconFolder = 'EXT:core/Resources/Public/Icons/Flags/PNG/'; + $files = [ + 'AC', 'AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AN', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', + 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', + 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CP', 'CR', 'CS', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', + 'DE', 'DG', 'DJ', 'DK', 'DM', 'DO', 'DZ', + 'EA', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'EU', + 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', + 'GA', 'GB-ENG', 'GB-NIR', 'GB-SCT', 'GB-WLS', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', + 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', + 'IC', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', + 'JE', 'JM', 'JO', 'JP', + 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', + 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', + 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', + 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', + 'OM', + 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', + 'QA', 'QC', + 'RE', 'RO', 'RS', 'RU', 'RW', + 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', + 'TA', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', + 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', + 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', + 'WF', 'WS', + 'XK', + 'YE', 'YT', + 'ZA', 'ZM', 'ZW' + ]; + foreach ($files as $file) { + $identifier = strtolower($file); + $this->icons['flags-' . $identifier] = [ + 'provider' => BitmapIconProvider::class, + 'options' => [ + 'source' => $iconFolder . $file . '.png' + ] + ]; + } + $this->flagsInitialized = true; + } + + /** + * Detect the IconProvider of an icon + * + * @param string $iconReference + * @return string + */ + public function detectIconProvider($iconReference) + { + if (StringUtility::endsWith(strtolower($iconReference), 'svg')) { + return SvgIconProvider::class; + } + return BitmapIconProvider::class; + } +} diff --git a/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/general_utility_icon_provider_test.php b/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/general_utility_icon_provider_test.php new file mode 100644 index 00000000..aa16a82d --- /dev/null +++ b/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/general_utility_icon_provider_test.php @@ -0,0 +1,29 @@ +getIcon('module-file'); +} + + diff --git a/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/icon_definition_test.php b/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/icon_definition_test.php new file mode 100644 index 00000000..f9ac50e5 --- /dev/null +++ b/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/icon_definition_test.php @@ -0,0 +1,55 @@ + [ + 'provider' => FontawesomeIconProvider::class, + 'options' => [ + 'name' => 'link' + ] + ], + ]; +} diff --git a/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/icon_provider_test.php b/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/icon_provider_test.php new file mode 100644 index 00000000..100b7b09 --- /dev/null +++ b/typo3-cms/testData/com/cedricziel/idea/typo3/codeInsight/icon/icon_provider_test.php @@ -0,0 +1,4 @@ +getIcon('module-file'); From 331cb372356ca355c3b8b945ddcc3e205d38dafb Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Tue, 9 Oct 2018 22:03:48 +0200 Subject: [PATCH 2/5] [T3CMS] Re-order methods in IconIndex --- .../idea/typo3/index/IconIndex.java | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/index/IconIndex.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/index/IconIndex.java index dcad2a17..786d1349 100644 --- a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/index/IconIndex.java +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/index/IconIndex.java @@ -107,31 +107,6 @@ public static boolean hasIcon(@NotNull Project project, @NotNull String iconIden return iconExists.get(); } - @NotNull - @Override - public ID getName() { - return KEY; - } - - @NotNull - @Override - public DataIndexer getIndexer() { - return inputData -> { - Map iconIdentifiers = new THashMap<>(); - - // index the icon registry - PsiFile psiFile = inputData.getPsiFile(); - if (psiFile instanceof PhpFile) { - visitPhpFile(iconIdentifiers, (PhpFile) psiFile); - } - - Map result = new THashMap<>(); - iconIdentifiers.forEach((k, v) -> result.put(k, null)); - - return result; - }; - } - private static void visitPhpFile(Map iconIdentifiers, PhpFile psiFile) { CachedValue> userData = psiFile.getUserData(TYPO3_CMS_ICON_USAGES); if (userData != null && userData.hasUpToDateValue()) { @@ -169,6 +144,31 @@ private static void visitIconRegistry(Map iconIdentifiers, Php flagVisitor.getMap().forEach(iconIdentifiers::put); } + @NotNull + @Override + public ID getName() { + return KEY; + } + + @NotNull + @Override + public DataIndexer getIndexer() { + return inputData -> { + Map iconIdentifiers = new THashMap<>(); + + // index the icon registry + PsiFile psiFile = inputData.getPsiFile(); + if (psiFile instanceof PhpFile) { + visitPhpFile(iconIdentifiers, (PhpFile) psiFile); + } + + Map result = new THashMap<>(); + iconIdentifiers.forEach((k, v) -> result.put(k, null)); + + return result; + }; + } + @NotNull @Override public KeyDescriptor getKeyDescriptor() { From f2ca1c4b22835614ac5acd1e8cfc584b504b39a7 Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Wed, 10 Oct 2018 19:27:03 +0200 Subject: [PATCH 3/5] [T3CMS] Allow fetching deprecated icons in project with IconIndex in v9 --- .../DeprecatedIconsFromRegistryVisitor.java | 44 +++++++++++++++++++ .../idea/typo3/index/IconIndex.java | 37 ++++++++++++++-- .../idea/typo3/index/IconIndexTest.java | 19 +++++--- 3 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/DeprecatedIconsFromRegistryVisitor.java diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/DeprecatedIconsFromRegistryVisitor.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/DeprecatedIconsFromRegistryVisitor.java new file mode 100644 index 00000000..9ae1ba72 --- /dev/null +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/DeprecatedIconsFromRegistryVisitor.java @@ -0,0 +1,44 @@ +package com.cedricziel.idea.typo3.icons; + +import com.intellij.patterns.PlatformPatterns; +import com.intellij.patterns.PsiElementPattern; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import com.jetbrains.php.lang.parser.PhpElementTypes; +import com.jetbrains.php.lang.psi.elements.Field; +import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; +import com.jetbrains.php.lang.psi.visitors.PhpRecursiveElementVisitor; + +import java.util.HashMap; +import java.util.Map; + +public class DeprecatedIconsFromRegistryVisitor extends PhpRecursiveElementVisitor { + public Map result; + + public DeprecatedIconsFromRegistryVisitor() { + this.result = new HashMap<>(); + } + + @Override + public void visitElement(PsiElement element) { + if (deprecatedIconArrayKeyPattern().accepts(element)) { + Field field = (Field) PsiTreeUtil.findFirstParent(element, e -> e instanceof Field); + if (field != null && field.getName().equals("deprecatedIcons")) { + String iconIdentifier = ""; + StringLiteralExpression literalExpression = (StringLiteralExpression) element; + iconIdentifier = literalExpression.getContents(); + + + result.putIfAbsent(iconIdentifier, ""); + } + } + + super.visitElement(element); + } + + private PsiElementPattern.Capture deprecatedIconArrayKeyPattern() { + return PlatformPatterns.psiElement(StringLiteralExpression.class).withParent( + PlatformPatterns.psiElement(PhpElementTypes.ARRAY_KEY).withSuperParent(3, Field.class) + ); + } +} diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/index/IconIndex.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/index/IconIndex.java index 786d1349..76743104 100644 --- a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/index/IconIndex.java +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/index/IconIndex.java @@ -1,5 +1,6 @@ package com.cedricziel.idea.typo3.index; +import com.cedricziel.idea.typo3.icons.DeprecatedIconsFromRegistryVisitor; import com.cedricziel.idea.typo3.icons.IconStub; import com.cedricziel.idea.typo3.psi.visitor.CoreFlagParserVisitor; import com.cedricziel.idea.typo3.psi.visitor.CoreIconParserVisitor; @@ -17,16 +18,14 @@ import com.intellij.util.indexing.*; import com.intellij.util.io.EnumeratorStringDescriptor; import com.intellij.util.io.KeyDescriptor; +import com.jetbrains.php.PhpIndex; import com.jetbrains.php.lang.psi.PhpFile; import com.jetbrains.php.lang.psi.PhpPsiUtil; import com.jetbrains.php.lang.psi.elements.PhpClass; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import static com.cedricziel.idea.typo3.util.IconUtil.ICON_REGISTRY_CLASS; @@ -35,6 +34,7 @@ public class IconIndex extends ScalarIndexExtension { private static final Key>> TYPO3_CMS_ICON_USAGES = new Key<>("TYPO3_CMS_ICON_USAGES"); private static final Key> TYPO3_CMS_PROJECT_ICONS = new Key<>("TYPO3_CMS_PROJECT_ICONS"); + private static final Key>> TYPO3_CMS_PROJECT_DEPRECATED_ICONS = new Key<>("TYPO3_CMS_PROJECT_DEPRECATED_ICONS"); public static ID KEY = ID.create("com.cedricziel.idea.typo3.index.icon"); @@ -107,6 +107,35 @@ public static boolean hasIcon(@NotNull Project project, @NotNull String iconIden return iconExists.get(); } + public static Map getDeprecatedIconIdentifiers(@NotNull Project project) { + CachedValue> value = project.getUserData(TYPO3_CMS_PROJECT_DEPRECATED_ICONS); + if (value != null && value.hasUpToDateValue()) { + return value.getValue(); + } + + CachedValue> cachedValue = CachedValuesManager.getManager(project).createCachedValue(() -> { + return CachedValueProvider.Result.create(getDeprecatedIconsUncached(project), PsiModificationTracker.MODIFICATION_COUNT); + }, false); + + project.putUserData(TYPO3_CMS_PROJECT_DEPRECATED_ICONS, cachedValue); + + return cachedValue.getValue(); + } + + @NotNull + private static Map getDeprecatedIconsUncached(@NotNull Project project) { + Map result = new HashMap<>(); + for (PhpClass phpClass : PhpIndex.getInstance(project).getClassesByFQN(ICON_REGISTRY_CLASS)) { + DeprecatedIconsFromRegistryVisitor visitor = new DeprecatedIconsFromRegistryVisitor(); + + phpClass.accept(visitor); + + visitor.result.forEach(result::putIfAbsent); + } + + return result; + } + private static void visitPhpFile(Map iconIdentifiers, PhpFile psiFile) { CachedValue> userData = psiFile.getUserData(TYPO3_CMS_ICON_USAGES); if (userData != null && userData.hasUpToDateValue()) { diff --git a/typo3-cms/src/test/java/com/cedricziel/idea/typo3/index/IconIndexTest.java b/typo3-cms/src/test/java/com/cedricziel/idea/typo3/index/IconIndexTest.java index 26acb670..a3d51935 100644 --- a/typo3-cms/src/test/java/com/cedricziel/idea/typo3/index/IconIndexTest.java +++ b/typo3-cms/src/test/java/com/cedricziel/idea/typo3/index/IconIndexTest.java @@ -12,23 +12,30 @@ public void testIconsAreDetectedForv7() { myFixture.addFileToProject("foo/ext_emconf.php", ""); myFixture.configureByFile("IconRegistry7.php"); - IconIndex.getAllAvailableIcons(myFixture.getProject()).contains("actions-edit-cut-release"); - IconIndex.getAllAvailableIcons(myFixture.getProject()).contains("flags-pg"); + assertTrue(IconIndex.getAllAvailableIcons(myFixture.getProject()).contains("actions-edit-cut-release")); + assertTrue(IconIndex.getAllAvailableIcons(myFixture.getProject()).contains("flags-pg")); } public void testIconsAreDetectedForv8() { myFixture.addFileToProject("foo/ext_emconf.php", ""); myFixture.configureByFile("IconRegistry8.php"); - IconIndex.getAllAvailableIcons(myFixture.getProject()).contains("actions-edit-cut-release"); - IconIndex.getAllAvailableIcons(myFixture.getProject()).contains("flags-pg"); + assertTrue(IconIndex.getAllAvailableIcons(myFixture.getProject()).contains("actions-edit-cut-release")); + assertTrue(IconIndex.getAllAvailableIcons(myFixture.getProject()).contains("flags-pg")); } public void testIconsAreDetectedForv9() { myFixture.addFileToProject("foo/ext_emconf.php", ""); myFixture.configureByFile("IconRegistry9.php"); - IconIndex.getAllAvailableIcons(myFixture.getProject()).contains("actions-wizard-link"); - IconIndex.getAllAvailableIcons(myFixture.getProject()).contains("flags-pg"); + assertTrue(IconIndex.getAllAvailableIcons(myFixture.getProject()).contains("actions-wizard-link")); + assertTrue(IconIndex.getAllAvailableIcons(myFixture.getProject()).contains("flags-pg")); + } + + public void testDeprecatedIconsAreDetectedForv9() { + myFixture.addFileToProject("foo/ext_emconf.php", ""); + myFixture.configureByFile("IconRegistry9.php"); + + assertTrue(IconIndex.getDeprecatedIconIdentifiers(myFixture.getProject()).containsKey("status-status-edit-read-only")); } } From 4f15effac244f866e74236bbc61df02f486e6a54 Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Wed, 10 Oct 2018 19:46:20 +0200 Subject: [PATCH 4/5] [T3CMS] Highlight deprecated icons --- .../idea/typo3/annotation/IconAnnotator.java | 4 ++ .../DeprecatedIconUsageInspection.java | 56 +++++++++++++++++++ .../src/main/resources/META-INF/plugin.xml | 6 ++ .../DeprecatedIconUsageInspection.html | 7 +++ .../DeprecatedIconUsageInspectionTest.java | 34 +++++++++++ .../cedricziel/idea/typo3/icons/classes.php | 8 +++ .../idea/typo3/icons/deprecated_icon.php | 4 ++ .../idea/typo3/icons/deprecated_icon_off.php | 4 ++ 8 files changed, 123 insertions(+) create mode 100644 typo3-cms/src/main/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspection.java create mode 100644 typo3-cms/src/main/resources/inspectionDescriptions/DeprecatedIconUsageInspection.html create mode 100644 typo3-cms/src/test/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspectionTest.java create mode 100644 typo3-cms/testData/com/cedricziel/idea/typo3/icons/classes.php create mode 100644 typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon.php create mode 100644 typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon_off.php diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/annotation/IconAnnotator.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/annotation/IconAnnotator.java index f85b1275..28d27972 100644 --- a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/annotation/IconAnnotator.java +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/annotation/IconAnnotator.java @@ -52,6 +52,10 @@ private void annotateIconUsage(PsiElement psiElement, AnnotationHolder annotatio return; } + if (IconIndex.getDeprecatedIconIdentifiers(psiElement.getProject()).containsKey(value)) { + return; + } + annotationHolder.createWarningAnnotation(new TextRange(psiElement.getTextRange().getStartOffset() + 1, psiElement.getTextRange().getEndOffset() - 1), "Unresolved icon - this may also occur if the icon is defined in your extension, but not in the global icon registry."); } } diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspection.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspection.java new file mode 100644 index 00000000..a9089ca0 --- /dev/null +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspection.java @@ -0,0 +1,56 @@ +package com.cedricziel.idea.typo3.codeInspection; + +import com.cedricziel.idea.typo3.TYPO3CMSProjectSettings; +import com.cedricziel.idea.typo3.index.IconIndex; +import com.cedricziel.idea.typo3.psi.PhpElementsUtil; +import com.intellij.codeInspection.ProblemsHolder; +import com.intellij.patterns.PlatformPatterns; +import com.intellij.patterns.PsiElementPattern; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.util.PsiTreeUtil; +import com.jetbrains.php.lang.inspections.PhpInspection; +import com.jetbrains.php.lang.psi.elements.MethodReference; +import com.jetbrains.php.lang.psi.elements.ParameterList; +import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; +import org.jetbrains.annotations.NotNull; + +public class DeprecatedIconUsageInspection extends PhpInspection { + @NotNull + @Override + public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder problemsHolder, boolean b) { + if (!TYPO3CMSProjectSettings.getInstance(problemsHolder.getProject()).pluginEnabled) { + return new PsiElementVisitor() { + }; + } + + return new PsiElementVisitor() { + @Override + public void visitElement(PsiElement element) { + if (!stringParameterInMethodReference().accepts(element)) { + return; + } + + StringLiteralExpression literalExpression = (StringLiteralExpression) element; + String value = literalExpression.getContents(); + + if (value.isEmpty()) { + return; + } + + PsiElement methodReference = PsiTreeUtil.getParentOfType(element, MethodReference.class); + if (PhpElementsUtil.isMethodWithFirstStringOrFieldReference(methodReference, "getIcon")) { + if (IconIndex.getDeprecatedIconIdentifiers(problemsHolder.getProject()).containsKey(value)) { + problemsHolder.registerProblem(element, "Deprecated icon usage"); + } + } + + super.visitElement(element); + } + }; + } + + private PsiElementPattern.Capture stringParameterInMethodReference() { + return PlatformPatterns.psiElement(StringLiteralExpression.class).withParent(ParameterList.class); + } +} diff --git a/typo3-cms/src/main/resources/META-INF/plugin.xml b/typo3-cms/src/main/resources/META-INF/plugin.xml index 40ce8d41..1c2d98f7 100644 --- a/typo3-cms/src/main/resources/META-INF/plugin.xml +++ b/typo3-cms/src/main/resources/META-INF/plugin.xml @@ -251,6 +251,12 @@ It is a great inspiration for possible solutions and parts of the code.

enabledByDefault="true" level="WARNING" implementationClass="com.cedricziel.idea.typo3.codeInspection.LegacyClassesForIDEInspection"/> + + diff --git a/typo3-cms/src/main/resources/inspectionDescriptions/DeprecatedIconUsageInspection.html b/typo3-cms/src/main/resources/inspectionDescriptions/DeprecatedIconUsageInspection.html new file mode 100644 index 00000000..fbc5907a --- /dev/null +++ b/typo3-cms/src/main/resources/inspectionDescriptions/DeprecatedIconUsageInspection.html @@ -0,0 +1,7 @@ + + +

Usage of a deprecated icon identifier.

+ +

Can detect deprecated icons

+ + diff --git a/typo3-cms/src/test/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspectionTest.java b/typo3-cms/src/test/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspectionTest.java new file mode 100644 index 00000000..bcde7c68 --- /dev/null +++ b/typo3-cms/src/test/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspectionTest.java @@ -0,0 +1,34 @@ +package com.cedricziel.idea.typo3.codeInspection; + +import com.cedricziel.idea.typo3.AbstractTestCase; + +public class DeprecatedIconUsageInspectionTest extends AbstractTestCase { + @Override + protected String getTestDataPath() { + return super.getTestDataPath() + "/icons"; + } + + public void testInspectionIsDisabledWhenPluginIsDisabled() { + disablePlugin(); + + myFixture.copyFileToProject("classes.php"); + myFixture.copyFileToProject("IconRegistry9.php"); + + myFixture.enableInspections(DeprecatedIconUsageInspection.class); + + myFixture.configureByFile("deprecated_icon_off.php"); + + myFixture.testHighlighting(); + } + + public void testInspectionHighlightsDeprecatedIconUsage() { + myFixture.copyFileToProject("classes.php"); + myFixture.copyFileToProject("IconRegistry9.php"); + + myFixture.enableInspections(DeprecatedIconUsageInspection.class); + + myFixture.configureByFile("deprecated_icon.php"); + + myFixture.testHighlighting(); + } +} diff --git a/typo3-cms/testData/com/cedricziel/idea/typo3/icons/classes.php b/typo3-cms/testData/com/cedricziel/idea/typo3/icons/classes.php new file mode 100644 index 00000000..916d7146 --- /dev/null +++ b/typo3-cms/testData/com/cedricziel/idea/typo3/icons/classes.php @@ -0,0 +1,8 @@ +getIcon('status-warning-lock'); diff --git a/typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon_off.php b/typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon_off.php new file mode 100644 index 00000000..b3e99be1 --- /dev/null +++ b/typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon_off.php @@ -0,0 +1,4 @@ +getIcon('status-warning-lock'); From daae71239d497e79cda5629d030c89dab4e398c3 Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Wed, 10 Oct 2018 21:51:06 +0200 Subject: [PATCH 5/5] [T3CMS] Allow QuickFix'in deprecated icons --- .../DeprecatedIconUsageInspection.java | 42 +++++++++++++++++-- .../DeprecatedIconsFromRegistryVisitor.java | 30 ++++++++++--- .../DeprecatedIconUsageInspectionTest.java | 17 ++++++++ .../idea/typo3/index/IconIndexTest.java | 1 + .../idea/typo3/icons/deprecated_icon.php | 2 +- .../idea/typo3/icons/deprecated_icon_qf.php | 4 ++ .../typo3/icons/deprecated_icon_qf_after.php | 4 ++ 7 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon_qf.php create mode 100644 typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon_qf_after.php diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspection.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspection.java index a9089ca0..120e1ce4 100644 --- a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspection.java +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspection.java @@ -3,16 +3,22 @@ import com.cedricziel.idea.typo3.TYPO3CMSProjectSettings; import com.cedricziel.idea.typo3.index.IconIndex; import com.cedricziel.idea.typo3.psi.PhpElementsUtil; +import com.intellij.codeInspection.LocalQuickFix; +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ProblemsHolder; +import com.intellij.openapi.project.Project; import com.intellij.patterns.PlatformPatterns; import com.intellij.patterns.PsiElementPattern; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.php.lang.inspections.PhpInspection; +import com.jetbrains.php.lang.psi.PhpPsiElementFactory; import com.jetbrains.php.lang.psi.elements.MethodReference; import com.jetbrains.php.lang.psi.elements.ParameterList; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; +import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; public class DeprecatedIconUsageInspection extends PhpInspection { @@ -32,16 +38,21 @@ public void visitElement(PsiElement element) { } StringLiteralExpression literalExpression = (StringLiteralExpression) element; - String value = literalExpression.getContents(); + String iconIdentifier = literalExpression.getContents(); - if (value.isEmpty()) { + if (iconIdentifier.isEmpty()) { return; } PsiElement methodReference = PsiTreeUtil.getParentOfType(element, MethodReference.class); if (PhpElementsUtil.isMethodWithFirstStringOrFieldReference(methodReference, "getIcon")) { - if (IconIndex.getDeprecatedIconIdentifiers(problemsHolder.getProject()).containsKey(value)) { - problemsHolder.registerProblem(element, "Deprecated icon usage"); + if (IconIndex.getDeprecatedIconIdentifiers(problemsHolder.getProject()).containsKey(iconIdentifier)) { + String alternative = IconIndex.getDeprecatedIconIdentifiers(problemsHolder.getProject()).get(iconIdentifier); + if (alternative == null || alternative.isEmpty()) { + problemsHolder.registerProblem(element, "Deprecated icon usage", ProblemHighlightType.LIKE_DEPRECATED); + } else { + problemsHolder.registerProblem(element, String.format("Deprecated icon usage - replace with %s", alternative), ProblemHighlightType.LIKE_DEPRECATED, new ReplaceIconIdentifierQuickFix(alternative)); + } } } @@ -53,4 +64,27 @@ public void visitElement(PsiElement element) { private PsiElementPattern.Capture stringParameterInMethodReference() { return PlatformPatterns.psiElement(StringLiteralExpression.class).withParent(ParameterList.class); } + + private static class ReplaceIconIdentifierQuickFix implements LocalQuickFix { + private final String alternative; + + public ReplaceIconIdentifierQuickFix(String alternative) { + this.alternative = alternative; + } + + @Nls(capitalization = Nls.Capitalization.Sentence) + @NotNull + @Override + public String getFamilyName() { + return "Migrate deprecated icon usage"; + } + + @Override + public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { + PsiElement psiElement = descriptor.getPsiElement(); + if (psiElement instanceof StringLiteralExpression) { + psiElement.replace(PhpPsiElementFactory.createFromText(project, StringLiteralExpression.class, String.format("'%s'", alternative))); + } + } + } } diff --git a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/DeprecatedIconsFromRegistryVisitor.java b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/DeprecatedIconsFromRegistryVisitor.java index 9ae1ba72..57437743 100644 --- a/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/DeprecatedIconsFromRegistryVisitor.java +++ b/typo3-cms/src/main/java/com/cedricziel/idea/typo3/icons/DeprecatedIconsFromRegistryVisitor.java @@ -5,6 +5,8 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.php.lang.parser.PhpElementTypes; +import com.jetbrains.php.lang.psi.elements.ArrayCreationExpression; +import com.jetbrains.php.lang.psi.elements.ArrayHashElement; import com.jetbrains.php.lang.psi.elements.Field; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; import com.jetbrains.php.lang.psi.visitors.PhpRecursiveElementVisitor; @@ -23,13 +25,31 @@ public DeprecatedIconsFromRegistryVisitor() { public void visitElement(PsiElement element) { if (deprecatedIconArrayKeyPattern().accepts(element)) { Field field = (Field) PsiTreeUtil.findFirstParent(element, e -> e instanceof Field); - if (field != null && field.getName().equals("deprecatedIcons")) { - String iconIdentifier = ""; - StringLiteralExpression literalExpression = (StringLiteralExpression) element; - iconIdentifier = literalExpression.getContents(); + if (field == null || !field.getName().equals("deprecatedIcons")) { + super.visitElement(element); + return; + } + String iconIdentifier = ""; + String iconReplacement= ""; + StringLiteralExpression literalExpression = (StringLiteralExpression) element; + iconIdentifier = literalExpression.getContents(); - result.putIfAbsent(iconIdentifier, ""); + // pre-9, the the deprecatedIcons field was a multi-dimensional array + ArrayHashElement hashElement = (ArrayHashElement) PsiTreeUtil.findFirstParent(element, e -> e instanceof ArrayHashElement); + if (hashElement != null && hashElement.getValue() instanceof ArrayCreationExpression) { + Iterable hashElements = ((ArrayCreationExpression) hashElement.getValue()).getHashElements(); + for (ArrayHashElement arrayHashElement : hashElements) { + if (arrayHashElement.getKey() instanceof StringLiteralExpression && ((StringLiteralExpression) arrayHashElement.getKey()).getContents().equals("replacement")) { + if (arrayHashElement.getValue() instanceof StringLiteralExpression) { + result.putIfAbsent(iconIdentifier, ((StringLiteralExpression) arrayHashElement.getValue()).getContents()); + } + } + } + } else if (hashElement != null && hashElement.getValue() instanceof StringLiteralExpression) { + result.putIfAbsent(iconIdentifier, ((StringLiteralExpression) hashElement.getValue()).getContents()); + } else { + result.putIfAbsent(iconIdentifier, iconReplacement); } } diff --git a/typo3-cms/src/test/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspectionTest.java b/typo3-cms/src/test/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspectionTest.java index bcde7c68..d2978ed7 100644 --- a/typo3-cms/src/test/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspectionTest.java +++ b/typo3-cms/src/test/java/com/cedricziel/idea/typo3/codeInspection/DeprecatedIconUsageInspectionTest.java @@ -1,6 +1,9 @@ package com.cedricziel.idea.typo3.codeInspection; import com.cedricziel.idea.typo3.AbstractTestCase; +import com.intellij.codeInsight.intention.IntentionAction; + +import java.util.List; public class DeprecatedIconUsageInspectionTest extends AbstractTestCase { @Override @@ -31,4 +34,18 @@ public void testInspectionHighlightsDeprecatedIconUsage() { myFixture.testHighlighting(); } + + public void testInspectionAllowsQuickFixes() { + myFixture.copyFileToProject("classes.php"); + myFixture.copyFileToProject("IconRegistry9.php"); + + myFixture.enableInspections(DeprecatedIconUsageInspection.class); + + List allQuickFixes = myFixture.getAllQuickFixes("deprecated_icon_qf.php"); + for (IntentionAction fix : allQuickFixes) { + myFixture.launchAction(fix); + } + + myFixture.checkResultByFile("deprecated_icon_qf_after.php", true); + } } diff --git a/typo3-cms/src/test/java/com/cedricziel/idea/typo3/index/IconIndexTest.java b/typo3-cms/src/test/java/com/cedricziel/idea/typo3/index/IconIndexTest.java index a3d51935..bac0368a 100644 --- a/typo3-cms/src/test/java/com/cedricziel/idea/typo3/index/IconIndexTest.java +++ b/typo3-cms/src/test/java/com/cedricziel/idea/typo3/index/IconIndexTest.java @@ -37,5 +37,6 @@ public void testDeprecatedIconsAreDetectedForv9() { myFixture.configureByFile("IconRegistry9.php"); assertTrue(IconIndex.getDeprecatedIconIdentifiers(myFixture.getProject()).containsKey("status-status-edit-read-only")); + assertEquals(IconIndex.getDeprecatedIconIdentifiers(myFixture.getProject()).get("status-status-edit-read-only"), "status-edit-read-only"); } } diff --git a/typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon.php b/typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon.php index a14cabc4..d1a60ab5 100644 --- a/typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon.php +++ b/typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon.php @@ -1,4 +1,4 @@ getIcon('status-warning-lock'); +$iconFactory->getIcon('status-warning-lock'); diff --git a/typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon_qf.php b/typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon_qf.php new file mode 100644 index 00000000..b3e99be1 --- /dev/null +++ b/typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon_qf.php @@ -0,0 +1,4 @@ +getIcon('status-warning-lock'); diff --git a/typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon_qf_after.php b/typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon_qf_after.php new file mode 100644 index 00000000..16d051c3 --- /dev/null +++ b/typo3-cms/testData/com/cedricziel/idea/typo3/icons/deprecated_icon_qf_after.php @@ -0,0 +1,4 @@ +getIcon('warning-lock');