material-icon-theme 4.25.0 → 4.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -4
- package/dist/material-icons.json +5704 -0
- package/icons/c.svg +4 -1
- package/icons/cpp.svg +4 -1
- package/icons/csharp.svg +4 -1
- package/icons/deno.svg +1 -0
- package/icons/deno_light.svg +1 -0
- package/icons/file.svg +1 -1
- package/icons/folder-godot-open.svg +2 -0
- package/icons/folder-godot.svg +8 -0
- package/icons/folder-mercurial-open.svg +5 -0
- package/icons/folder-mercurial.svg +2 -0
- package/icons/folder-netlify-open.svg +5 -1
- package/icons/folder-netlify.svg +2 -1
- package/icons/folder-open.svg +1 -0
- package/icons/folder-plastic-open.svg +8 -0
- package/icons/folder-plastic.svg +2 -0
- package/icons/folder-root-open.svg +1 -0
- package/icons/folder-root.svg +1 -0
- package/icons/folder.svg +1 -0
- package/icons/godot-assets.svg +7 -1
- package/icons/godot.svg +7 -1
- package/icons/ifanr-cloud.svg +10 -0
- package/icons/mercurial.svg +6 -0
- package/icons/mermaid.svg +4 -0
- package/icons/netlify.svg +7 -1
- package/icons/netlify_light.svg +7 -0
- package/icons/objective-c.svg +4 -1
- package/icons/plastic.svg +7 -0
- package/icons/qwik.svg +2 -0
- package/icons/rc.svg +2 -0
- package/icons/typst.svg +2 -0
- package/package.json +18 -1
- package/.eslintignore +0 -1
- package/.eslintrc.json +0 -51
- package/.github/FUNDING.yml +0 -3
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -34
- package/.github/ISSUE_TEMPLATE/icon_request.md +0 -27
- package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -7
- package/.github/workflows/build.yml +0 -45
- package/.github/workflows/color-check.yml +0 -22
- package/.github/workflows/release.yml +0 -73
- package/.prettierrc +0 -7
- package/.vscode/extensions.json +0 -3
- package/.vscode/launch.json +0 -43
- package/.vscode/settings.json +0 -14
- package/.vscode/tasks.json +0 -32
- package/.vscodeignore +0 -22
- package/CHANGELOG.md +0 -1325
- package/CONTRIBUTING.md +0 -232
- package/build/web-extension.webpack.config.js +0 -62
- package/build/webpack.config.js +0 -39
- package/changelog.config.json +0 -4
- package/images/commandPalette.png +0 -0
- package/images/contributors.png +0 -0
- package/images/fileIcons.png +0 -0
- package/images/folderIcons.png +0 -0
- package/images/how-tos/folder-icon-parts.png +0 -0
- package/images/how-tos/pick-folder-colors.png +0 -0
- package/images/how-tos/pick-folder-colors.svg +0 -301
- package/images/how-tos/svg-folder-icon-with-correct-colors.png +0 -0
- package/images/how-tos/svg-folder-icon-with-wrong-colors.png +0 -0
- package/images/how-tos/svg-with-light-color.png +0 -0
- package/images/how-tos/svg-with-spacing.png +0 -0
- package/images/how-tos/svg-with-too-dark-color.png +0 -0
- package/images/how-tos/svg-with-wrong-color.png +0 -0
- package/images/how-tos/svg-without-spacing.png +0 -0
- package/images/set-folder-color.gif +0 -0
- package/images/set-folder-theme.gif +0 -0
- package/images/stepsize.png +0 -0
- package/logo.png +0 -0
- package/logo.svg +0 -21
- package/material-colors.yml +0 -257
- package/package.nls.de.json +0 -32
- package/package.nls.es.json +0 -29
- package/package.nls.fr.json +0 -29
- package/package.nls.ja.json +0 -32
- package/package.nls.json +0 -32
- package/package.nls.nl.json +0 -32
- package/package.nls.pl.json +0 -32
- package/package.nls.pt-BR.json +0 -29
- package/package.nls.pt-PT.json +0 -29
- package/package.nls.ru.json +0 -29
- package/package.nls.zh-CN.json +0 -29
- package/package.nls.zh-TW.json +0 -29
- package/src/commands/activate.ts +0 -28
- package/src/commands/explorerArrows.ts +0 -55
- package/src/commands/folderColor.ts +0 -96
- package/src/commands/folders.ts +0 -55
- package/src/commands/grayscale.ts +0 -55
- package/src/commands/iconPacks.ts +0 -64
- package/src/commands/index.ts +0 -30
- package/src/commands/opacity.ts +0 -46
- package/src/commands/restoreConfig.ts +0 -14
- package/src/commands/saturation.ts +0 -46
- package/src/extension.ts +0 -37
- package/src/helpers/changeDetection.ts +0 -109
- package/src/helpers/customIcons.ts +0 -8
- package/src/helpers/fileConfig.ts +0 -37
- package/src/helpers/index.ts +0 -88
- package/src/helpers/objects.ts +0 -58
- package/src/helpers/types.ts +0 -7
- package/src/i18n/index.ts +0 -78
- package/src/i18n/lang-de.ts +0 -43
- package/src/i18n/lang-en.ts +0 -43
- package/src/i18n/lang-es.ts +0 -43
- package/src/i18n/lang-fr.ts +0 -43
- package/src/i18n/lang-ja.ts +0 -43
- package/src/i18n/lang-nl.ts +0 -43
- package/src/i18n/lang-pl.ts +0 -43
- package/src/i18n/lang-pt-br.ts +0 -43
- package/src/i18n/lang-pt-pt.ts +0 -43
- package/src/i18n/lang-ru.ts +0 -43
- package/src/i18n/lang-uk.ts +0 -43
- package/src/i18n/lang-zh-cn.ts +0 -43
- package/src/i18n/lang-zh-tw.ts +0 -43
- package/src/icons/fileIcons.ts +0 -2240
- package/src/icons/folderIcons.ts +0 -823
- package/src/icons/generator/constants.ts +0 -29
- package/src/icons/generator/fileGenerator.ts +0 -216
- package/src/icons/generator/folderGenerator.ts +0 -340
- package/src/icons/generator/iconOpacity.ts +0 -111
- package/src/icons/generator/iconSaturation.ts +0 -140
- package/src/icons/generator/index.ts +0 -7
- package/src/icons/generator/jsonGenerator.ts +0 -191
- package/src/icons/generator/languageGenerator.ts +0 -127
- package/src/icons/index.ts +0 -4
- package/src/icons/languageIcons.ts +0 -144
- package/src/models/i18n/index.ts +0 -1
- package/src/models/i18n/translation.ts +0 -41
- package/src/models/iconConfiguration.ts +0 -37
- package/src/models/icons/defaultIcon.ts +0 -16
- package/src/models/icons/files/fileIcon.ts +0 -49
- package/src/models/icons/files/fileTypes.ts +0 -14
- package/src/models/icons/files/index.ts +0 -2
- package/src/models/icons/folders/folderIcon.ts +0 -34
- package/src/models/icons/folders/folderTheme.ts +0 -23
- package/src/models/icons/folders/index.ts +0 -2
- package/src/models/icons/iconJsonOptions.ts +0 -21
- package/src/models/icons/iconPack.ts +0 -12
- package/src/models/icons/index.ts +0 -6
- package/src/models/icons/languages/index.ts +0 -1
- package/src/models/icons/languages/languageIdentifier.ts +0 -26
- package/src/models/index.ts +0 -3
- package/src/models/scripts/contributors/contributor.ts +0 -22
- package/src/models/scripts/contributors/contributorsConfig.ts +0 -10
- package/src/scripts/contributors/contributors.css +0 -24
- package/src/scripts/contributors/index.ts +0 -138
- package/src/scripts/helpers/painter.ts +0 -5
- package/src/scripts/helpers/screenshots.ts +0 -32
- package/src/scripts/helpers/similarity.ts +0 -47
- package/src/scripts/helpers/titleCase.ts +0 -7
- package/src/scripts/icons/checks/checkIconAvailability.ts +0 -215
- package/src/scripts/icons/checks/checkIconConflicts.ts +0 -152
- package/src/scripts/icons/checks/checkIconUsage.ts +0 -137
- package/src/scripts/icons/checks/index.ts +0 -7
- package/src/scripts/icons/generateJson.ts +0 -11
- package/src/scripts/preview/index.ts +0 -40
- package/src/scripts/preview/preview.ts +0 -163
- package/src/scripts/preview/style.css +0 -48
- package/src/test/runTest.ts +0 -26
- package/src/test/spec/i18n/i18n.spec.ts +0 -54
- package/src/test/spec/icons/fileIcons.spec.ts +0 -250
- package/src/test/spec/icons/folderIcons.spec.ts +0 -418
- package/src/test/spec/icons/languageIcons.spec.ts +0 -184
- package/src/test/spec/index.ts +0 -36
- package/src/web/extension.ts +0 -10
- package/svgo.config.js +0 -12
- package/tsconfig.json +0 -23
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Path where the icons are located.
|
|
3
|
-
*/
|
|
4
|
-
export const iconFolderPath: string = './../icons/';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* File name of the JSON file that will be generated to the out folder.
|
|
8
|
-
*/
|
|
9
|
-
export const iconJsonName: string = 'material-icons.json';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* File ending for opened folders.
|
|
13
|
-
*/
|
|
14
|
-
export const openedFolder: string = '-open';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* File ending for light icons.
|
|
18
|
-
*/
|
|
19
|
-
export const lightColorFileEnding: string = '_light';
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* File ending for high contrast icons.
|
|
23
|
-
*/
|
|
24
|
-
export const highContrastColorFileEnding: string = '_highContrast';
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Pattern to match wildcards for custom file icon mappings.
|
|
28
|
-
*/
|
|
29
|
-
export const wildcardPattern = new RegExp(/^\*{1,2}\./);
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import merge from 'lodash.merge';
|
|
2
|
-
import { getFileConfigHash } from '../../helpers/fileConfig';
|
|
3
|
-
import {
|
|
4
|
-
FileIcon,
|
|
5
|
-
FileIcons,
|
|
6
|
-
IconAssociations,
|
|
7
|
-
IconConfiguration,
|
|
8
|
-
IconJsonOptions,
|
|
9
|
-
} from '../../models/index';
|
|
10
|
-
import {
|
|
11
|
-
highContrastColorFileEnding,
|
|
12
|
-
iconFolderPath,
|
|
13
|
-
lightColorFileEnding,
|
|
14
|
-
wildcardPattern,
|
|
15
|
-
} from './constants';
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Get all file icons that can be used in this theme.
|
|
19
|
-
*/
|
|
20
|
-
export const loadFileIconDefinitions = (
|
|
21
|
-
fileIcons: FileIcons,
|
|
22
|
-
config: IconConfiguration,
|
|
23
|
-
options: IconJsonOptions
|
|
24
|
-
): IconConfiguration => {
|
|
25
|
-
config = merge({}, config);
|
|
26
|
-
const enabledIcons = disableIconsByPack(
|
|
27
|
-
fileIcons,
|
|
28
|
-
options.activeIconPack ?? ''
|
|
29
|
-
);
|
|
30
|
-
const customIcons = getCustomIcons(options.files?.associations);
|
|
31
|
-
const allFileIcons = [...enabledIcons, ...customIcons];
|
|
32
|
-
|
|
33
|
-
allFileIcons.forEach((icon) => {
|
|
34
|
-
if (icon.disabled) return;
|
|
35
|
-
config = merge({}, config, setIconDefinition(config, icon.name));
|
|
36
|
-
|
|
37
|
-
if (icon.light) {
|
|
38
|
-
config = merge(
|
|
39
|
-
{},
|
|
40
|
-
config,
|
|
41
|
-
setIconDefinition(config, icon.name, lightColorFileEnding)
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
if (icon.highContrast) {
|
|
45
|
-
config = merge(
|
|
46
|
-
{},
|
|
47
|
-
config,
|
|
48
|
-
setIconDefinition(config, icon.name, highContrastColorFileEnding)
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (icon.fileExtensions) {
|
|
53
|
-
config = merge(
|
|
54
|
-
{},
|
|
55
|
-
config,
|
|
56
|
-
mapSpecificFileIcons(icon, FileMappingType.FileExtensions)
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
if (icon.fileNames) {
|
|
60
|
-
config = merge(
|
|
61
|
-
{},
|
|
62
|
-
config,
|
|
63
|
-
mapSpecificFileIcons(
|
|
64
|
-
icon,
|
|
65
|
-
FileMappingType.FileNames,
|
|
66
|
-
options.files?.associations
|
|
67
|
-
)
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
// set default file icon
|
|
73
|
-
config = merge(
|
|
74
|
-
{},
|
|
75
|
-
config,
|
|
76
|
-
setIconDefinition(config, fileIcons.defaultIcon.name)
|
|
77
|
-
);
|
|
78
|
-
config.file = fileIcons.defaultIcon.name;
|
|
79
|
-
|
|
80
|
-
if (fileIcons.defaultIcon.light && config.light) {
|
|
81
|
-
config = merge(
|
|
82
|
-
{},
|
|
83
|
-
config,
|
|
84
|
-
setIconDefinition(
|
|
85
|
-
config,
|
|
86
|
-
fileIcons.defaultIcon.name,
|
|
87
|
-
lightColorFileEnding
|
|
88
|
-
)
|
|
89
|
-
);
|
|
90
|
-
if (config.light) {
|
|
91
|
-
config.light.file = fileIcons.defaultIcon.name + lightColorFileEnding;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
if (fileIcons.defaultIcon.highContrast) {
|
|
96
|
-
config = merge(
|
|
97
|
-
{},
|
|
98
|
-
config,
|
|
99
|
-
setIconDefinition(
|
|
100
|
-
config,
|
|
101
|
-
fileIcons.defaultIcon.name,
|
|
102
|
-
highContrastColorFileEnding
|
|
103
|
-
)
|
|
104
|
-
);
|
|
105
|
-
if (config.highContrast) {
|
|
106
|
-
config.highContrast.file =
|
|
107
|
-
fileIcons.defaultIcon.name + highContrastColorFileEnding;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return config;
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Map the file extensions and the filenames to the related icons.
|
|
116
|
-
*/
|
|
117
|
-
const mapSpecificFileIcons = (
|
|
118
|
-
icon: FileIcon,
|
|
119
|
-
mappingType: FileMappingType,
|
|
120
|
-
customFileAssociation: IconAssociations = {}
|
|
121
|
-
) => {
|
|
122
|
-
const config = new IconConfiguration();
|
|
123
|
-
const iconMappingType = icon[mappingType as keyof FileIcon] as string[];
|
|
124
|
-
if (iconMappingType === undefined) {
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
iconMappingType.forEach((name) => {
|
|
128
|
-
// if the custom file extension should also overwrite the file names
|
|
129
|
-
const shouldOverwriteFileNames = Object.keys(customFileAssociation).some(
|
|
130
|
-
(key) => {
|
|
131
|
-
// overwrite is enabled if there are two asterisks in the wildcard
|
|
132
|
-
if (!/^\*{2}\./.test(key)) return false;
|
|
133
|
-
const fileExtension = key.replace(wildcardPattern, '.');
|
|
134
|
-
|
|
135
|
-
// check if the file name contains the particular file extension
|
|
136
|
-
// (e.g. extension ".md" in "Readme.md" -> then overwrite it with the *.md icon)
|
|
137
|
-
return name.toLowerCase().indexOf(fileExtension.toLowerCase()) !== -1;
|
|
138
|
-
}
|
|
139
|
-
);
|
|
140
|
-
|
|
141
|
-
// if overwrite is enabled then do not continue to set the icons for file names containing the file extension
|
|
142
|
-
const configMappingType = config[mappingType];
|
|
143
|
-
const configLightMappingType = config.light?.[mappingType];
|
|
144
|
-
const configHighContrastMappingType = config.highContrast?.[mappingType];
|
|
145
|
-
|
|
146
|
-
if (
|
|
147
|
-
shouldOverwriteFileNames ||
|
|
148
|
-
!configMappingType ||
|
|
149
|
-
!configLightMappingType ||
|
|
150
|
-
!configHighContrastMappingType
|
|
151
|
-
)
|
|
152
|
-
return;
|
|
153
|
-
|
|
154
|
-
configMappingType[name] = icon.name;
|
|
155
|
-
if (icon.light) {
|
|
156
|
-
configLightMappingType[name] = `${icon.name}${lightColorFileEnding}`;
|
|
157
|
-
}
|
|
158
|
-
if (icon.highContrast) {
|
|
159
|
-
configHighContrastMappingType[
|
|
160
|
-
name
|
|
161
|
-
] = `${icon.name}${highContrastColorFileEnding}`;
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
return config;
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Disable all file icons that are in a pack which is disabled.
|
|
169
|
-
*/
|
|
170
|
-
const disableIconsByPack = (
|
|
171
|
-
fileIcons: FileIcons,
|
|
172
|
-
activatedIconPack: string
|
|
173
|
-
): FileIcon[] => {
|
|
174
|
-
return fileIcons.icons.filter((icon) => {
|
|
175
|
-
return !icon.enabledFor
|
|
176
|
-
? true
|
|
177
|
-
: icon.enabledFor.some((p) => p === activatedIconPack);
|
|
178
|
-
});
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
const setIconDefinition = (
|
|
182
|
-
config: IconConfiguration,
|
|
183
|
-
iconName: string,
|
|
184
|
-
appendix: string = ''
|
|
185
|
-
) => {
|
|
186
|
-
const obj: Partial<IconConfiguration> = { iconDefinitions: {} };
|
|
187
|
-
if (config.options) {
|
|
188
|
-
const fileConfigHash = getFileConfigHash(config.options);
|
|
189
|
-
obj.iconDefinitions![`${iconName}${appendix}`] = {
|
|
190
|
-
iconPath: `${iconFolderPath}${iconName}${appendix}${fileConfigHash}.svg`,
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
return obj;
|
|
194
|
-
};
|
|
195
|
-
|
|
196
|
-
const getCustomIcons = (fileAssociations: IconAssociations | undefined) => {
|
|
197
|
-
if (!fileAssociations) return [];
|
|
198
|
-
|
|
199
|
-
const icons: FileIcon[] = Object.keys(fileAssociations).map((fa) => {
|
|
200
|
-
const icon: Partial<FileIcon> = {
|
|
201
|
-
name: fileAssociations[fa].toLowerCase(),
|
|
202
|
-
};
|
|
203
|
-
if (wildcardPattern.test(fa)) {
|
|
204
|
-
icon.fileExtensions = [fa.toLowerCase().replace(wildcardPattern, '')];
|
|
205
|
-
} else {
|
|
206
|
-
icon.fileNames = [fa.toLowerCase()];
|
|
207
|
-
}
|
|
208
|
-
return icon as FileIcon;
|
|
209
|
-
});
|
|
210
|
-
return icons;
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
const enum FileMappingType {
|
|
214
|
-
FileExtensions = 'fileExtensions',
|
|
215
|
-
FileNames = 'fileNames',
|
|
216
|
-
}
|
|
@@ -1,340 +0,0 @@
|
|
|
1
|
-
import { writeFileSync } from 'fs';
|
|
2
|
-
import merge from 'lodash.merge';
|
|
3
|
-
import { basename, join } from 'path';
|
|
4
|
-
import { getFileConfigHash } from '../../helpers/fileConfig';
|
|
5
|
-
import {
|
|
6
|
-
DefaultIcon,
|
|
7
|
-
FolderIcon,
|
|
8
|
-
FolderTheme,
|
|
9
|
-
IconAssociations,
|
|
10
|
-
IconConfiguration,
|
|
11
|
-
IconJsonOptions,
|
|
12
|
-
} from '../../models/index';
|
|
13
|
-
import {
|
|
14
|
-
highContrastColorFileEnding,
|
|
15
|
-
iconFolderPath,
|
|
16
|
-
lightColorFileEnding,
|
|
17
|
-
openedFolder,
|
|
18
|
-
} from './constants';
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Get the folder icon definitions as object.
|
|
22
|
-
*/
|
|
23
|
-
export const loadFolderIconDefinitions = (
|
|
24
|
-
folderThemes: FolderTheme[],
|
|
25
|
-
config: IconConfiguration,
|
|
26
|
-
options: IconJsonOptions
|
|
27
|
-
): IconConfiguration => {
|
|
28
|
-
config = merge({}, config);
|
|
29
|
-
config.hidesExplorerArrows = options.hidesExplorerArrows;
|
|
30
|
-
const activeTheme = getEnabledFolderTheme(
|
|
31
|
-
folderThemes,
|
|
32
|
-
options.folders?.theme
|
|
33
|
-
);
|
|
34
|
-
if (!activeTheme) {
|
|
35
|
-
return {};
|
|
36
|
-
}
|
|
37
|
-
const enabledIcons = disableIconsByPack(activeTheme, options.activeIconPack);
|
|
38
|
-
const customIcons = getCustomIcons(options.folders?.associations);
|
|
39
|
-
const allIcons = [...enabledIcons, ...customIcons];
|
|
40
|
-
|
|
41
|
-
if (options.folders?.theme === 'none') {
|
|
42
|
-
return config;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
allIcons.forEach((icon) => {
|
|
46
|
-
if (icon.disabled) return;
|
|
47
|
-
config = setIconDefinitions(config, icon);
|
|
48
|
-
config = merge({}, config, setFolderNames(icon.name, icon.folderNames));
|
|
49
|
-
config.light = icon.light
|
|
50
|
-
? merge(
|
|
51
|
-
{},
|
|
52
|
-
config.light,
|
|
53
|
-
setFolderNames(icon.name, icon.folderNames, lightColorFileEnding)
|
|
54
|
-
)
|
|
55
|
-
: config.light;
|
|
56
|
-
config.highContrast = icon.highContrast
|
|
57
|
-
? merge(
|
|
58
|
-
{},
|
|
59
|
-
config.highContrast,
|
|
60
|
-
setFolderNames(
|
|
61
|
-
icon.name,
|
|
62
|
-
icon.folderNames,
|
|
63
|
-
highContrastColorFileEnding
|
|
64
|
-
)
|
|
65
|
-
)
|
|
66
|
-
: config.highContrast;
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
config = setDefaultFolderIcons(activeTheme, config);
|
|
70
|
-
return config;
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Set the default folder icons for the theme.
|
|
75
|
-
*/
|
|
76
|
-
const setDefaultFolderIcons = (
|
|
77
|
-
theme: FolderTheme,
|
|
78
|
-
config: IconConfiguration
|
|
79
|
-
): IconConfiguration => {
|
|
80
|
-
config = merge({}, config);
|
|
81
|
-
const hasFolderIcons =
|
|
82
|
-
!!theme.defaultIcon.name && theme.defaultIcon.name.length > 0;
|
|
83
|
-
if (hasFolderIcons) {
|
|
84
|
-
config = setIconDefinitions(config, theme.defaultIcon);
|
|
85
|
-
}
|
|
86
|
-
config = merge(
|
|
87
|
-
{},
|
|
88
|
-
config,
|
|
89
|
-
createDefaultIconConfigObject(hasFolderIcons, theme, '')
|
|
90
|
-
);
|
|
91
|
-
config.light = theme.defaultIcon.light
|
|
92
|
-
? merge(
|
|
93
|
-
{},
|
|
94
|
-
config.light,
|
|
95
|
-
createDefaultIconConfigObject(
|
|
96
|
-
hasFolderIcons,
|
|
97
|
-
theme,
|
|
98
|
-
lightColorFileEnding
|
|
99
|
-
)
|
|
100
|
-
)
|
|
101
|
-
: config.light;
|
|
102
|
-
config.highContrast = theme.defaultIcon.highContrast
|
|
103
|
-
? merge(
|
|
104
|
-
{},
|
|
105
|
-
config.highContrast,
|
|
106
|
-
createDefaultIconConfigObject(
|
|
107
|
-
hasFolderIcons,
|
|
108
|
-
theme,
|
|
109
|
-
highContrastColorFileEnding
|
|
110
|
-
)
|
|
111
|
-
)
|
|
112
|
-
: config.highContrast;
|
|
113
|
-
|
|
114
|
-
config = merge(
|
|
115
|
-
{},
|
|
116
|
-
config,
|
|
117
|
-
createRootIconConfigObject(hasFolderIcons, theme, '')
|
|
118
|
-
);
|
|
119
|
-
if (theme.rootFolder) {
|
|
120
|
-
config = setIconDefinitions(config, theme.rootFolder);
|
|
121
|
-
config.light = theme.rootFolder.light
|
|
122
|
-
? merge(
|
|
123
|
-
{},
|
|
124
|
-
config.light,
|
|
125
|
-
createRootIconConfigObject(
|
|
126
|
-
hasFolderIcons,
|
|
127
|
-
theme,
|
|
128
|
-
lightColorFileEnding
|
|
129
|
-
)
|
|
130
|
-
)
|
|
131
|
-
: config.light;
|
|
132
|
-
config.highContrast = theme.rootFolder.highContrast
|
|
133
|
-
? merge(
|
|
134
|
-
{},
|
|
135
|
-
config.highContrast,
|
|
136
|
-
createRootIconConfigObject(
|
|
137
|
-
hasFolderIcons,
|
|
138
|
-
theme,
|
|
139
|
-
highContrastColorFileEnding
|
|
140
|
-
)
|
|
141
|
-
)
|
|
142
|
-
: config.highContrast;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return config;
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Get the object of the current enabled theme.
|
|
150
|
-
*/
|
|
151
|
-
const getEnabledFolderTheme = (
|
|
152
|
-
themes: FolderTheme[],
|
|
153
|
-
enabledTheme: string | undefined
|
|
154
|
-
): FolderTheme | undefined => {
|
|
155
|
-
return themes.find((theme) => theme.name === enabledTheme);
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Disable all file icons that are in a pack which is disabled.
|
|
160
|
-
*/
|
|
161
|
-
const disableIconsByPack = (
|
|
162
|
-
folderIcons: FolderTheme | undefined,
|
|
163
|
-
activatedIconPack: string | undefined
|
|
164
|
-
): FolderIcon[] => {
|
|
165
|
-
if (!folderIcons?.icons || folderIcons.icons.length === 0) {
|
|
166
|
-
return [];
|
|
167
|
-
}
|
|
168
|
-
return folderIcons.icons.filter((icon) => {
|
|
169
|
-
return !icon.enabledFor
|
|
170
|
-
? true
|
|
171
|
-
: icon.enabledFor.some((p) => p === activatedIconPack);
|
|
172
|
-
});
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
const setIconDefinitions = (
|
|
176
|
-
config: IconConfiguration,
|
|
177
|
-
icon: FolderIcon | DefaultIcon
|
|
178
|
-
) => {
|
|
179
|
-
config = merge({}, config);
|
|
180
|
-
config = createIconDefinitions(config, icon.name);
|
|
181
|
-
if (icon.light) {
|
|
182
|
-
config = merge(
|
|
183
|
-
{},
|
|
184
|
-
config,
|
|
185
|
-
createIconDefinitions(config, icon.name, lightColorFileEnding)
|
|
186
|
-
);
|
|
187
|
-
}
|
|
188
|
-
if (icon.highContrast) {
|
|
189
|
-
config = merge(
|
|
190
|
-
{},
|
|
191
|
-
config,
|
|
192
|
-
createIconDefinitions(config, icon.name, highContrastColorFileEnding)
|
|
193
|
-
);
|
|
194
|
-
}
|
|
195
|
-
return config;
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
const createIconDefinitions = (
|
|
199
|
-
config: IconConfiguration,
|
|
200
|
-
iconName: string,
|
|
201
|
-
appendix: string = ''
|
|
202
|
-
) => {
|
|
203
|
-
config = merge({}, config);
|
|
204
|
-
const fileConfigHash = getFileConfigHash(config.options ?? {});
|
|
205
|
-
const configIconDefinitions = config.iconDefinitions;
|
|
206
|
-
if (configIconDefinitions) {
|
|
207
|
-
configIconDefinitions[iconName + appendix] = {
|
|
208
|
-
iconPath: `${iconFolderPath}${iconName}${appendix}${fileConfigHash}.svg`,
|
|
209
|
-
};
|
|
210
|
-
configIconDefinitions[`${iconName}${openedFolder}${appendix}`] = {
|
|
211
|
-
iconPath: `${iconFolderPath}${iconName}${openedFolder}${appendix}${fileConfigHash}.svg`,
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
return config;
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
const setFolderNames = (
|
|
218
|
-
iconName: string,
|
|
219
|
-
folderNames: string[],
|
|
220
|
-
appendix: string = ''
|
|
221
|
-
) => {
|
|
222
|
-
const obj: Partial<IconConfiguration> = {
|
|
223
|
-
folderNames: {},
|
|
224
|
-
folderNamesExpanded: {},
|
|
225
|
-
};
|
|
226
|
-
folderNames.forEach((name) => {
|
|
227
|
-
if (obj.folderNames) {
|
|
228
|
-
obj.folderNames[name as keyof IconConfiguration] = iconName + appendix;
|
|
229
|
-
}
|
|
230
|
-
if (obj.folderNamesExpanded) {
|
|
231
|
-
obj.folderNamesExpanded[
|
|
232
|
-
name as keyof IconConfiguration
|
|
233
|
-
] = `${iconName}${openedFolder}${appendix}`;
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
|
-
return obj;
|
|
237
|
-
};
|
|
238
|
-
|
|
239
|
-
const createDefaultIconConfigObject = (
|
|
240
|
-
hasFolderIcons: boolean,
|
|
241
|
-
theme: FolderTheme,
|
|
242
|
-
appendix: string = ''
|
|
243
|
-
) => {
|
|
244
|
-
const obj = {
|
|
245
|
-
folder: '',
|
|
246
|
-
folderExpanded: '',
|
|
247
|
-
};
|
|
248
|
-
obj.folder = hasFolderIcons ? theme.defaultIcon.name + appendix : '';
|
|
249
|
-
obj.folderExpanded = hasFolderIcons
|
|
250
|
-
? `${theme.defaultIcon.name}${openedFolder}${appendix}`
|
|
251
|
-
: '';
|
|
252
|
-
return obj;
|
|
253
|
-
};
|
|
254
|
-
|
|
255
|
-
const createRootIconConfigObject = (
|
|
256
|
-
hasFolderIcons: boolean,
|
|
257
|
-
theme: FolderTheme,
|
|
258
|
-
appendix: string = ''
|
|
259
|
-
) => {
|
|
260
|
-
const obj = {
|
|
261
|
-
rootFolder: '',
|
|
262
|
-
rootFolderExpanded: '',
|
|
263
|
-
};
|
|
264
|
-
obj.rootFolder = hasFolderIcons
|
|
265
|
-
? theme.rootFolder
|
|
266
|
-
? theme.rootFolder.name + appendix
|
|
267
|
-
: theme.defaultIcon.name + appendix
|
|
268
|
-
: '';
|
|
269
|
-
obj.rootFolderExpanded = hasFolderIcons
|
|
270
|
-
? theme.rootFolder
|
|
271
|
-
? `${theme.rootFolder.name}${openedFolder}${appendix}`
|
|
272
|
-
: `${theme.defaultIcon.name}${openedFolder}${appendix}`
|
|
273
|
-
: '';
|
|
274
|
-
return obj;
|
|
275
|
-
};
|
|
276
|
-
|
|
277
|
-
const getCustomIcons = (folderAssociations: IconAssociations | undefined) => {
|
|
278
|
-
if (!folderAssociations) return [];
|
|
279
|
-
|
|
280
|
-
const icons: FolderIcon[] = Object.keys(folderAssociations).map((fa) => ({
|
|
281
|
-
// use default folder if icon name is empty
|
|
282
|
-
name:
|
|
283
|
-
folderAssociations[fa].length > 0
|
|
284
|
-
? 'folder-' + folderAssociations[fa].toLowerCase()
|
|
285
|
-
: 'folder',
|
|
286
|
-
folderNames: [fa.toLowerCase()],
|
|
287
|
-
}));
|
|
288
|
-
|
|
289
|
-
return icons;
|
|
290
|
-
};
|
|
291
|
-
|
|
292
|
-
export const generateFolderIcons = (color: string | undefined) => {
|
|
293
|
-
if (!color || !validateHEXColorCode(color)) {
|
|
294
|
-
return console.error('Invalid color code for folder icons');
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
const folderIcon =
|
|
298
|
-
'M10 4H4c-1.11 0-2 .89-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V8c0-1.11-.9-2-2-2h-8l-2-2z';
|
|
299
|
-
const folderIconOpen =
|
|
300
|
-
'M19 20H4c-1.11 0-2-.9-2-2V6c0-1.11.89-2 2-2h6l2 2h7a2 2 0 0 1 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z';
|
|
301
|
-
const rootFolderIcon =
|
|
302
|
-
'M12 20a8 8 0 0 1-8-8 8 8 0 0 1 8-8 8 8 0 0 1 8 8 8 8 0 0 1-8 8m0-18A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 5a5 5 0 0 0-5 5 5 5 0 0 0 5 5 5 5 0 0 0 5-5 5 5 0 0 0-5-5z';
|
|
303
|
-
const rootFolderIconOpen =
|
|
304
|
-
'M12 20a8 8 0 0 1-8-8 8 8 0 0 1 8-8 8 8 0 0 1 8 8 8 8 0 0 1-8 8m0-18A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2z';
|
|
305
|
-
|
|
306
|
-
writeSVGFiles('folder', getSVG(getPath(folderIcon, color)));
|
|
307
|
-
writeSVGFiles('folder-open', getSVG(getPath(folderIconOpen, color)));
|
|
308
|
-
writeSVGFiles('folder-root', getSVG(getPath(rootFolderIcon, color)));
|
|
309
|
-
writeSVGFiles('folder-root-open', getSVG(getPath(rootFolderIconOpen, color)));
|
|
310
|
-
};
|
|
311
|
-
|
|
312
|
-
const getPath = (d: string, color: string) =>
|
|
313
|
-
`<path d="${d}" fill="${color}" />`;
|
|
314
|
-
const getSVG = (path: string) =>
|
|
315
|
-
`<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">${path}</svg>`;
|
|
316
|
-
|
|
317
|
-
const writeSVGFiles = (iconName: string, svg: string) => {
|
|
318
|
-
let iconsPath;
|
|
319
|
-
if (basename(__dirname) === 'dist') {
|
|
320
|
-
iconsPath = join(__dirname, '..', 'icons');
|
|
321
|
-
} else {
|
|
322
|
-
// executed via script
|
|
323
|
-
iconsPath = join(__dirname, '..', '..', '..', 'icons');
|
|
324
|
-
}
|
|
325
|
-
const iconsFolderPath = join(iconsPath, `${iconName}.svg`);
|
|
326
|
-
try {
|
|
327
|
-
writeFileSync(iconsFolderPath, svg);
|
|
328
|
-
} catch (error) {
|
|
329
|
-
console.error(error);
|
|
330
|
-
}
|
|
331
|
-
};
|
|
332
|
-
|
|
333
|
-
/**
|
|
334
|
-
* Validate the HEX color code
|
|
335
|
-
* @param color HEX code
|
|
336
|
-
*/
|
|
337
|
-
export const validateHEXColorCode = (color: string = '') => {
|
|
338
|
-
const hexPattern = new RegExp(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/);
|
|
339
|
-
return color.length > 0 && hexPattern.test(color);
|
|
340
|
-
};
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { readdirSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
-
import { basename, join } from 'path';
|
|
3
|
-
import { getCustomIconPaths } from '../../helpers/customIcons';
|
|
4
|
-
import { IconJsonOptions } from '../../models';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Changes the opacity of all icons in the set.
|
|
8
|
-
* @param options Icon JSON options which include the opacity value.
|
|
9
|
-
* @param fileNames Only change the opacity of certain file names.
|
|
10
|
-
*/
|
|
11
|
-
export const setIconOpacity = (
|
|
12
|
-
options: IconJsonOptions,
|
|
13
|
-
fileNames?: string[]
|
|
14
|
-
) => {
|
|
15
|
-
if (!validateOpacityValue(options.opacity)) {
|
|
16
|
-
return console.error(
|
|
17
|
-
'Invalid opacity value! Opacity must be a decimal number between 0 and 1!'
|
|
18
|
-
);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
let iconsPath = '';
|
|
22
|
-
if (basename(__dirname) === 'dist') {
|
|
23
|
-
iconsPath = join(__dirname, '..', 'icons');
|
|
24
|
-
} else {
|
|
25
|
-
// executed via script
|
|
26
|
-
iconsPath = join(__dirname, '..', '..', '..', 'icons');
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const customIconPaths = getCustomIconPaths(options);
|
|
30
|
-
const iconFiles = readdirSync(iconsPath);
|
|
31
|
-
|
|
32
|
-
try {
|
|
33
|
-
// read all icon files from the icons folder
|
|
34
|
-
(fileNames || iconFiles).forEach(adjustOpacity(iconsPath, options));
|
|
35
|
-
|
|
36
|
-
customIconPaths.forEach((iconPath) => {
|
|
37
|
-
const customIcons = readdirSync(iconPath);
|
|
38
|
-
customIcons.forEach(adjustOpacity(iconPath, options));
|
|
39
|
-
});
|
|
40
|
-
} catch (error) {
|
|
41
|
-
console.error(error);
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Validate the opacity value.
|
|
47
|
-
* @param opacity Opacity value
|
|
48
|
-
*/
|
|
49
|
-
export const validateOpacityValue = (opacity: number | undefined) => {
|
|
50
|
-
return opacity !== undefined && opacity <= 1 && opacity >= 0;
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Get the SVG root element.
|
|
55
|
-
* @param svg SVG file as string.
|
|
56
|
-
*/
|
|
57
|
-
const getSVGRootElement = (svg: string) => {
|
|
58
|
-
const result = new RegExp(/<svg[^>]*>/).exec(svg);
|
|
59
|
-
return result?.[0];
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Add an opacity attribute to the SVG icon to control the opacity of the icon.
|
|
64
|
-
* @param svgRoot Root element of the SVG icon.
|
|
65
|
-
* @param opacity Opacity value.
|
|
66
|
-
*/
|
|
67
|
-
const addOpacityAttribute = (svgRoot: string, opacity: number) => {
|
|
68
|
-
const pattern = new RegExp(/\sopacity="[\d.]+"/);
|
|
69
|
-
// if the opacity attribute already exists
|
|
70
|
-
if (pattern.test(svgRoot)) {
|
|
71
|
-
return svgRoot.replace(pattern, ` opacity="${opacity}"`);
|
|
72
|
-
} else {
|
|
73
|
-
return svgRoot.replace(/^<svg/, `<svg opacity="${opacity}"`);
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Remove the opacity attribute of the SVG icon.
|
|
79
|
-
* @param svgRoot Root element of the SVG icon.
|
|
80
|
-
*/
|
|
81
|
-
const removeOpacityAttribute = (svgRoot: string) => {
|
|
82
|
-
const pattern = new RegExp(/\sopacity="[\d.]+"/);
|
|
83
|
-
return svgRoot.replace(pattern, '');
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
const adjustOpacity = (
|
|
87
|
-
iconPath: string,
|
|
88
|
-
options: IconJsonOptions
|
|
89
|
-
): ((value: string, index: number, array: string[]) => void) => {
|
|
90
|
-
return (iconFileName) => {
|
|
91
|
-
const svgFilePath = join(iconPath, iconFileName);
|
|
92
|
-
|
|
93
|
-
// Read SVG file
|
|
94
|
-
const svg = readFileSync(svgFilePath, 'utf-8');
|
|
95
|
-
|
|
96
|
-
// Get the root element of the SVG file
|
|
97
|
-
const svgRootElement = getSVGRootElement(svg);
|
|
98
|
-
if (!svgRootElement) return;
|
|
99
|
-
|
|
100
|
-
let updatedRootElement: string;
|
|
101
|
-
|
|
102
|
-
if (options.opacity !== undefined && options.opacity < 1) {
|
|
103
|
-
updatedRootElement = addOpacityAttribute(svgRootElement, options.opacity);
|
|
104
|
-
} else {
|
|
105
|
-
updatedRootElement = removeOpacityAttribute(svgRootElement);
|
|
106
|
-
}
|
|
107
|
-
const updatedSVG = svg.replace(/<svg[^>]*>/, updatedRootElement);
|
|
108
|
-
|
|
109
|
-
writeFileSync(svgFilePath, updatedSVG);
|
|
110
|
-
};
|
|
111
|
-
};
|