material-icon-theme 4.17.0 → 4.18.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/.eslintrc.json +51 -51
- package/.github/FUNDING.yml +3 -3
- package/.github/ISSUE_TEMPLATE/bug_report.md +34 -34
- package/.github/ISSUE_TEMPLATE/icon_request.md +27 -27
- package/.github/workflows/build.yml +45 -45
- package/.github/workflows/color-check.yml +22 -22
- package/.github/workflows/release.yml +73 -73
- package/.prettierrc +7 -7
- package/.vscode/extensions.json +3 -3
- package/.vscode/launch.json +43 -43
- package/.vscode/settings.json +14 -14
- package/.vscode/tasks.json +32 -32
- package/.vscodeignore +20 -20
- package/CHANGELOG.md +1171 -1152
- package/CONTRIBUTING.md +62 -62
- package/LICENSE.md +8 -8
- package/README.md +208 -208
- package/build/web-extension.webpack.config.js +62 -62
- package/build/webpack.config.js +39 -39
- package/changelog.config.json +4 -4
- package/icons/architecture.svg +4 -4
- package/icons/astyle.svg +4 -4
- package/icons/azure.svg +9 -9
- package/icons/blitz.svg +4 -4
- package/icons/buildkite.svg +8 -8
- package/icons/cypress.svg +4 -4
- package/icons/dart_generated.svg +9 -9
- package/icons/dependabot.svg +4 -4
- package/icons/dinophp.svg +16 -16
- package/icons/figma.svg +10 -10
- package/icons/folder-angular-open.svg +2 -2
- package/icons/folder-angular.svg +2 -2
- package/icons/folder-buildkite-open.svg +8 -8
- package/icons/folder-buildkite.svg +7 -7
- package/icons/folder-cypress-open.svg +5 -5
- package/icons/folder-cypress.svg +5 -5
- package/icons/folder-java-open.svg +2 -2
- package/icons/folder-java.svg +2 -2
- package/icons/folder-lua-open.svg +1 -0
- package/icons/folder-lua.svg +1 -0
- package/icons/folder-next-open.svg +2 -2
- package/icons/folder-next.svg +2 -2
- package/icons/folder-nuxt-open.svg +2 -2
- package/icons/folder-nuxt.svg +2 -2
- package/icons/folder-queue-open.svg +2 -2
- package/icons/folder-queue.svg +2 -2
- package/icons/folder-resolver-open.svg +2 -2
- package/icons/folder-resolver.svg +2 -2
- package/icons/folder-serverless-open.svg +5 -5
- package/icons/folder-serverless.svg +5 -5
- package/icons/folder-shader-open.svg +7 -7
- package/icons/folder-shader.svg +6 -6
- package/icons/folder-target-open.svg +2 -2
- package/icons/folder-target.svg +2 -2
- package/icons/folder-unity-open.svg +2 -2
- package/icons/folder-unity.svg +2 -2
- package/icons/folder-vercel-open.svg +4 -4
- package/icons/folder-vercel.svg +4 -4
- package/icons/folder-verdaccio-open.svg +8 -8
- package/icons/folder-verdaccio.svg +8 -8
- package/icons/gleam.svg +4 -4
- package/icons/gridsome.svg +4 -4
- package/icons/hardhat.svg +3 -3
- package/icons/lighthouse.svg +2 -2
- package/icons/ndst.svg +7 -7
- package/icons/next.svg +3 -3
- package/icons/next_light.svg +2 -2
- package/icons/nuxt.svg +5 -5
- package/icons/odin.svg +6 -6
- package/icons/otne.svg +16 -16
- package/icons/parcel.svg +4 -4
- package/icons/playwright.svg +7 -7
- package/icons/plop.svg +4 -4
- package/icons/pnpm.svg +9 -9
- package/icons/pnpm_light.svg +7 -7
- package/icons/poetry.svg +1 -1
- package/icons/processing.svg +10 -10
- package/icons/remix.svg +4 -4
- package/icons/remix_light.svg +4 -4
- package/icons/rescript-interface.svg +5 -0
- package/icons/rome.svg +5 -5
- package/icons/serverless.svg +4 -4
- package/icons/shader.svg +4 -4
- package/icons/siyuan.svg +9 -9
- package/icons/steadybit.svg +1 -1
- package/icons/svgr.svg +4 -4
- package/icons/tauri.svg +9 -9
- package/icons/template.svg +4 -4
- package/icons/tobi.svg +4 -4
- package/icons/tobimake.svg +14 -14
- package/icons/turborepo.svg +12 -12
- package/icons/turborepo_light.svg +12 -12
- package/icons/verdaccio.svg +5 -5
- package/images/contributors.png +0 -0
- package/images/fileIcons.png +0 -0
- package/images/folderIcons.png +0 -0
- package/logo.svg +21 -21
- package/material-colors.yml +257 -257
- package/package.json +264 -264
- package/package.nls.de.json +35 -35
- package/package.nls.es.json +32 -32
- package/package.nls.fr.json +32 -32
- package/package.nls.ja.json +35 -35
- package/package.nls.json +35 -35
- package/package.nls.nl.json +35 -35
- package/package.nls.pl.json +35 -35
- package/package.nls.pt-BR.json +32 -32
- package/package.nls.pt-PT.json +32 -32
- package/package.nls.ru.json +32 -32
- package/package.nls.zh-CN.json +32 -32
- package/package.nls.zh-TW.json +32 -32
- package/src/commands/activate.ts +26 -26
- package/src/commands/explorerArrows.ts +55 -55
- package/src/commands/folderColor.ts +96 -96
- package/src/commands/folders.ts +55 -55
- package/src/commands/grayscale.ts +55 -55
- package/src/commands/iconPacks.ts +68 -68
- package/src/commands/index.ts +30 -30
- package/src/commands/opacity.ts +46 -46
- package/src/commands/restoreConfig.ts +14 -14
- package/src/commands/saturation.ts +46 -46
- package/src/extension.ts +42 -35
- package/src/helpers/changeDetection.ts +73 -68
- package/src/helpers/customIcons.ts +8 -8
- package/src/helpers/fileConfig.ts +37 -37
- package/src/helpers/index.ts +100 -100
- package/src/helpers/objects.ts +58 -58
- package/src/helpers/types.ts +7 -7
- package/src/helpers/versioning.ts +73 -73
- package/src/i18n/index.ts +78 -78
- package/src/i18n/lang-de.ts +54 -54
- package/src/i18n/lang-en.ts +53 -53
- package/src/i18n/lang-es.ts +53 -53
- package/src/i18n/lang-fr.ts +53 -53
- package/src/i18n/lang-ja.ts +54 -54
- package/src/i18n/lang-nl.ts +54 -54
- package/src/i18n/lang-pl.ts +52 -52
- package/src/i18n/lang-pt-br.ts +53 -53
- package/src/i18n/lang-pt-pt.ts +53 -53
- package/src/i18n/lang-ru.ts +52 -52
- package/src/i18n/lang-uk.ts +54 -54
- package/src/i18n/lang-zh-cn.ts +52 -52
- package/src/i18n/lang-zh-tw.ts +52 -52
- package/src/icons/fileIcons.ts +2046 -1909
- package/src/icons/folderIcons.ts +773 -769
- package/src/icons/generator/constants.ts +29 -29
- package/src/icons/generator/fileGenerator.ts +216 -216
- package/src/icons/generator/folderGenerator.ts +340 -340
- package/src/icons/generator/iconOpacity.ts +111 -111
- package/src/icons/generator/iconSaturation.ts +140 -140
- package/src/icons/generator/index.ts +7 -7
- package/src/icons/generator/jsonGenerator.ts +187 -187
- package/src/icons/generator/languageGenerator.ts +127 -127
- package/src/icons/index.ts +4 -4
- package/src/icons/languageIcons.ts +136 -136
- package/src/messages/outdated.ts +33 -33
- package/src/messages/reload.ts +32 -32
- package/src/messages/start.ts +12 -12
- package/src/messages/update.ts +48 -48
- package/src/messages/welcome.ts +47 -47
- package/src/models/helpers/index.ts +1 -1
- package/src/models/helpers/themeStatus.ts +5 -5
- package/src/models/i18n/index.ts +1 -1
- package/src/models/i18n/translation.ts +50 -50
- package/src/models/iconConfiguration.ts +37 -37
- package/src/models/icons/defaultIcon.ts +16 -16
- package/src/models/icons/files/fileIcon.ts +49 -49
- package/src/models/icons/files/fileTypes.ts +14 -14
- package/src/models/icons/files/index.ts +2 -2
- package/src/models/icons/folders/folderIcon.ts +34 -34
- package/src/models/icons/folders/folderTheme.ts +23 -23
- package/src/models/icons/folders/index.ts +2 -2
- package/src/models/icons/iconJsonOptions.ts +23 -23
- package/src/models/icons/iconPack.ts +12 -12
- package/src/models/icons/index.ts +6 -6
- package/src/models/icons/languages/index.ts +1 -1
- package/src/models/icons/languages/languageIdentifier.ts +26 -26
- package/src/models/index.ts +4 -4
- package/src/models/scripts/contributors/contributor.ts +22 -22
- package/src/models/scripts/contributors/contributorsConfig.ts +10 -10
- package/src/scripts/contributors/contributors.css +24 -24
- package/src/scripts/contributors/index.ts +138 -138
- package/src/scripts/helpers/painter.ts +5 -5
- package/src/scripts/helpers/screenshots.ts +32 -32
- package/src/scripts/helpers/similarity.ts +47 -47
- package/src/scripts/helpers/titleCase.ts +7 -7
- package/src/scripts/icons/checks/checkIconAvailability.ts +215 -215
- package/src/scripts/icons/checks/checkIconConflicts.ts +154 -154
- package/src/scripts/icons/checks/checkIconUsage.ts +141 -141
- package/src/scripts/icons/checks/index.ts +7 -7
- package/src/scripts/icons/generateJson.ts +11 -11
- package/src/scripts/preview/index.ts +40 -40
- package/src/scripts/preview/preview.ts +165 -165
- package/src/scripts/preview/style.css +48 -48
- package/src/test/runTest.ts +26 -26
- package/src/test/spec/i18n/i18n.spec.ts +61 -61
- package/src/test/spec/icons/fileIcons.spec.ts +250 -250
- package/src/test/spec/icons/folderIcons.spec.ts +418 -418
- package/src/test/spec/icons/languageIcons.spec.ts +184 -184
- package/src/test/spec/index.ts +36 -36
- package/src/web/extension.ts +10 -10
- package/svgo.config.js +11 -11
- package/tsconfig.json +23 -23
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import { fileIcons } from './../../icons/fileIcons';
|
|
2
|
-
import { folderIcons } from './../../icons/folderIcons';
|
|
3
|
-
import { languageIcons } from './../../icons/languageIcons';
|
|
4
|
-
import { generatePreview } from './preview';
|
|
5
|
-
|
|
6
|
-
const filterDuplicates = (icons: string[]) => {
|
|
7
|
-
return [...new Set(icons)];
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
const basicFileIcons = filterDuplicates(
|
|
11
|
-
fileIcons.icons
|
|
12
|
-
.map((i) => i.name)
|
|
13
|
-
// merge language icons
|
|
14
|
-
.concat(languageIcons.map((i) => i.icon.name))
|
|
15
|
-
).map((i) => ({ iconName: i, label: i }));
|
|
16
|
-
|
|
17
|
-
const folderThemes = filterDuplicates(
|
|
18
|
-
folderIcons
|
|
19
|
-
.map((theme) => {
|
|
20
|
-
const folders = [];
|
|
21
|
-
if (theme.icons && theme.icons.length > 0) {
|
|
22
|
-
folders.push(...theme.icons.map((i) => i.name));
|
|
23
|
-
}
|
|
24
|
-
return [...folders];
|
|
25
|
-
})
|
|
26
|
-
.reduce((a, b) => a.concat(b))
|
|
27
|
-
).map((i) => ({ iconName: i, label: i.replace('folder-', '') }));
|
|
28
|
-
|
|
29
|
-
generatePreview('fileIcons', basicFileIcons, 5, [
|
|
30
|
-
'virtual',
|
|
31
|
-
'powerpoint',
|
|
32
|
-
'word',
|
|
33
|
-
'credits',
|
|
34
|
-
]);
|
|
35
|
-
generatePreview('folderIcons', folderThemes, 5, [
|
|
36
|
-
'folder-aurelia',
|
|
37
|
-
'folder-phpmailer',
|
|
38
|
-
'folder-syntax',
|
|
39
|
-
'folder-ansible',
|
|
40
|
-
]);
|
|
1
|
+
import { fileIcons } from './../../icons/fileIcons';
|
|
2
|
+
import { folderIcons } from './../../icons/folderIcons';
|
|
3
|
+
import { languageIcons } from './../../icons/languageIcons';
|
|
4
|
+
import { generatePreview } from './preview';
|
|
5
|
+
|
|
6
|
+
const filterDuplicates = (icons: string[]) => {
|
|
7
|
+
return [...new Set(icons)];
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const basicFileIcons = filterDuplicates(
|
|
11
|
+
fileIcons.icons
|
|
12
|
+
.map((i) => i.name)
|
|
13
|
+
// merge language icons
|
|
14
|
+
.concat(languageIcons.map((i) => i.icon.name))
|
|
15
|
+
).map((i) => ({ iconName: i, label: i }));
|
|
16
|
+
|
|
17
|
+
const folderThemes = filterDuplicates(
|
|
18
|
+
folderIcons
|
|
19
|
+
.map((theme) => {
|
|
20
|
+
const folders = [];
|
|
21
|
+
if (theme.icons && theme.icons.length > 0) {
|
|
22
|
+
folders.push(...theme.icons.map((i) => i.name));
|
|
23
|
+
}
|
|
24
|
+
return [...folders];
|
|
25
|
+
})
|
|
26
|
+
.reduce((a, b) => a.concat(b))
|
|
27
|
+
).map((i) => ({ iconName: i, label: i.replace('folder-', '') }));
|
|
28
|
+
|
|
29
|
+
generatePreview('fileIcons', basicFileIcons, 5, [
|
|
30
|
+
'virtual',
|
|
31
|
+
'powerpoint',
|
|
32
|
+
'word',
|
|
33
|
+
'credits',
|
|
34
|
+
]);
|
|
35
|
+
generatePreview('folderIcons', folderThemes, 5, [
|
|
36
|
+
'folder-aurelia',
|
|
37
|
+
'folder-phpmailer',
|
|
38
|
+
'folder-syntax',
|
|
39
|
+
'folder-ansible',
|
|
40
|
+
]);
|
|
@@ -1,165 +1,165 @@
|
|
|
1
|
-
import * as fs from 'fs';
|
|
2
|
-
import * as path from 'path';
|
|
3
|
-
import { createScreenshot } from '../helpers/screenshots';
|
|
4
|
-
import * as painter from './../helpers/painter';
|
|
5
|
-
import { toTitleCase } from './../helpers/titleCase';
|
|
6
|
-
|
|
7
|
-
const htmlDoctype = '<!DOCTYPE html>';
|
|
8
|
-
const cssFilePath = path.join('style.css');
|
|
9
|
-
const styling = `<link rel="stylesheet" href="${cssFilePath}">`;
|
|
10
|
-
|
|
11
|
-
const createHTMLTableHeadRow = (amount: number) => {
|
|
12
|
-
const pair = `
|
|
13
|
-
<th class="icon">Icon</th>
|
|
14
|
-
<th class="iconName">Name</th>
|
|
15
|
-
`;
|
|
16
|
-
const columns = [...Array(amount)].map(() => pair).join('');
|
|
17
|
-
return `
|
|
18
|
-
<tr>
|
|
19
|
-
${columns}
|
|
20
|
-
</tr>
|
|
21
|
-
`;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const createHTMLTableBodyRows = (items: IconDefinition[][]) => {
|
|
25
|
-
let rows = '';
|
|
26
|
-
items.forEach((row) => {
|
|
27
|
-
const columns = row
|
|
28
|
-
.map(
|
|
29
|
-
(icon) => `
|
|
30
|
-
<td class="icon">
|
|
31
|
-
<img src="./../../../icons/${icon.iconName}.svg" alt="${
|
|
32
|
-
icon.label
|
|
33
|
-
}">
|
|
34
|
-
</td>
|
|
35
|
-
<td class="iconName">${toTitleCase(icon.label)}</td>
|
|
36
|
-
`
|
|
37
|
-
)
|
|
38
|
-
.join('');
|
|
39
|
-
const tableRow = `
|
|
40
|
-
<tr>
|
|
41
|
-
${columns}
|
|
42
|
-
</tr>
|
|
43
|
-
`;
|
|
44
|
-
rows = rows + tableRow;
|
|
45
|
-
});
|
|
46
|
-
return rows;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const createHTMLTable = (headRow: string, bodyRows: string) => `
|
|
50
|
-
<table>
|
|
51
|
-
${headRow}
|
|
52
|
-
${bodyRows}
|
|
53
|
-
</table>
|
|
54
|
-
`;
|
|
55
|
-
|
|
56
|
-
const createPreviewTable = (icons: IconDefinition[][], size: number) => {
|
|
57
|
-
const table =
|
|
58
|
-
htmlDoctype +
|
|
59
|
-
styling +
|
|
60
|
-
createHTMLTable(
|
|
61
|
-
createHTMLTableHeadRow(size),
|
|
62
|
-
createHTMLTableBodyRows(icons)
|
|
63
|
-
);
|
|
64
|
-
return table;
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
const savePreview = (
|
|
68
|
-
fileName: string,
|
|
69
|
-
size: number,
|
|
70
|
-
icons: IconDefinition[][]
|
|
71
|
-
) => {
|
|
72
|
-
const filePath = path.join(__dirname, fileName + '.html');
|
|
73
|
-
|
|
74
|
-
// write the html file with the icon table
|
|
75
|
-
fs.writeFileSync(filePath, createPreviewTable(icons, size));
|
|
76
|
-
|
|
77
|
-
// create the image
|
|
78
|
-
createScreenshot(filePath, fileName)
|
|
79
|
-
.then(() => {
|
|
80
|
-
console.log(
|
|
81
|
-
'> Material Icon Theme:',
|
|
82
|
-
painter.green(`Successfully created ${fileName} preview image!`)
|
|
83
|
-
);
|
|
84
|
-
})
|
|
85
|
-
.catch(() => {
|
|
86
|
-
throw Error(
|
|
87
|
-
painter.red(`Error while creating ${fileName} preview image`)
|
|
88
|
-
);
|
|
89
|
-
});
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
const getIconDefinitionsMatrix = (
|
|
93
|
-
icons: IconDefinition[],
|
|
94
|
-
size: number,
|
|
95
|
-
excluded: string[] = []
|
|
96
|
-
): IconDefinition[][] => {
|
|
97
|
-
const iconList = icons.sort((a, b) => a.label.localeCompare(b.label));
|
|
98
|
-
trimIconListToSize(iconList, size, excluded);
|
|
99
|
-
|
|
100
|
-
// list for the columns with the icons
|
|
101
|
-
const matrix: IconDefinition[][] = [];
|
|
102
|
-
|
|
103
|
-
// calculate the amount of icons per column
|
|
104
|
-
const itemsPerColumn = Math.floor(iconList.length / size);
|
|
105
|
-
|
|
106
|
-
// create the columns with the icons
|
|
107
|
-
let counter = 0;
|
|
108
|
-
for (let c = 0; c < itemsPerColumn; c++) {
|
|
109
|
-
matrix[c] = [];
|
|
110
|
-
}
|
|
111
|
-
for (let s = 0; s < size; s++) {
|
|
112
|
-
for (let i = 0; i < itemsPerColumn; i++) {
|
|
113
|
-
matrix[i][s] = iconList[counter];
|
|
114
|
-
counter++;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return matrix;
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Function that generates the preview image for specific icons.
|
|
123
|
-
* @param name name of the preview
|
|
124
|
-
* @param icons icons for the preview
|
|
125
|
-
* @param size amount of table columns
|
|
126
|
-
* @param trimmableIcons List of icons that can possibly be trimmed
|
|
127
|
-
*/
|
|
128
|
-
export const generatePreview = (
|
|
129
|
-
name: string,
|
|
130
|
-
icons: IconDefinition[],
|
|
131
|
-
size: number,
|
|
132
|
-
trimmableIcons: string[] = []
|
|
133
|
-
) => {
|
|
134
|
-
savePreview(
|
|
135
|
-
name,
|
|
136
|
-
size,
|
|
137
|
-
getIconDefinitionsMatrix(icons, size, trimmableIcons)
|
|
138
|
-
);
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
interface IconDefinition {
|
|
142
|
-
iconName: string;
|
|
143
|
-
label: string;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Trim the list of icons into the matrix
|
|
148
|
-
* @param iconList List of icons
|
|
149
|
-
* @param size Amount of columns
|
|
150
|
-
* @param trimmableIcons List of icons that can possibly be trimmed
|
|
151
|
-
*/
|
|
152
|
-
const trimIconListToSize = (
|
|
153
|
-
iconList: IconDefinition[],
|
|
154
|
-
size: number,
|
|
155
|
-
trimmableIcons: string[]
|
|
156
|
-
) => {
|
|
157
|
-
while (iconList.length % size !== 0) {
|
|
158
|
-
iconList.splice(
|
|
159
|
-
iconList.findIndex(
|
|
160
|
-
(i) => i.iconName === trimmableIcons[iconList.length % size]
|
|
161
|
-
),
|
|
162
|
-
1
|
|
163
|
-
);
|
|
164
|
-
}
|
|
165
|
-
};
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { createScreenshot } from '../helpers/screenshots';
|
|
4
|
+
import * as painter from './../helpers/painter';
|
|
5
|
+
import { toTitleCase } from './../helpers/titleCase';
|
|
6
|
+
|
|
7
|
+
const htmlDoctype = '<!DOCTYPE html>';
|
|
8
|
+
const cssFilePath = path.join('style.css');
|
|
9
|
+
const styling = `<link rel="stylesheet" href="${cssFilePath}">`;
|
|
10
|
+
|
|
11
|
+
const createHTMLTableHeadRow = (amount: number) => {
|
|
12
|
+
const pair = `
|
|
13
|
+
<th class="icon">Icon</th>
|
|
14
|
+
<th class="iconName">Name</th>
|
|
15
|
+
`;
|
|
16
|
+
const columns = [...Array(amount)].map(() => pair).join('');
|
|
17
|
+
return `
|
|
18
|
+
<tr>
|
|
19
|
+
${columns}
|
|
20
|
+
</tr>
|
|
21
|
+
`;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const createHTMLTableBodyRows = (items: IconDefinition[][]) => {
|
|
25
|
+
let rows = '';
|
|
26
|
+
items.forEach((row) => {
|
|
27
|
+
const columns = row
|
|
28
|
+
.map(
|
|
29
|
+
(icon) => `
|
|
30
|
+
<td class="icon">
|
|
31
|
+
<img src="./../../../icons/${icon.iconName}.svg" alt="${
|
|
32
|
+
icon.label
|
|
33
|
+
}">
|
|
34
|
+
</td>
|
|
35
|
+
<td class="iconName">${toTitleCase(icon.label)}</td>
|
|
36
|
+
`
|
|
37
|
+
)
|
|
38
|
+
.join('');
|
|
39
|
+
const tableRow = `
|
|
40
|
+
<tr>
|
|
41
|
+
${columns}
|
|
42
|
+
</tr>
|
|
43
|
+
`;
|
|
44
|
+
rows = rows + tableRow;
|
|
45
|
+
});
|
|
46
|
+
return rows;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const createHTMLTable = (headRow: string, bodyRows: string) => `
|
|
50
|
+
<table>
|
|
51
|
+
${headRow}
|
|
52
|
+
${bodyRows}
|
|
53
|
+
</table>
|
|
54
|
+
`;
|
|
55
|
+
|
|
56
|
+
const createPreviewTable = (icons: IconDefinition[][], size: number) => {
|
|
57
|
+
const table =
|
|
58
|
+
htmlDoctype +
|
|
59
|
+
styling +
|
|
60
|
+
createHTMLTable(
|
|
61
|
+
createHTMLTableHeadRow(size),
|
|
62
|
+
createHTMLTableBodyRows(icons)
|
|
63
|
+
);
|
|
64
|
+
return table;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const savePreview = (
|
|
68
|
+
fileName: string,
|
|
69
|
+
size: number,
|
|
70
|
+
icons: IconDefinition[][]
|
|
71
|
+
) => {
|
|
72
|
+
const filePath = path.join(__dirname, fileName + '.html');
|
|
73
|
+
|
|
74
|
+
// write the html file with the icon table
|
|
75
|
+
fs.writeFileSync(filePath, createPreviewTable(icons, size));
|
|
76
|
+
|
|
77
|
+
// create the image
|
|
78
|
+
createScreenshot(filePath, fileName)
|
|
79
|
+
.then(() => {
|
|
80
|
+
console.log(
|
|
81
|
+
'> Material Icon Theme:',
|
|
82
|
+
painter.green(`Successfully created ${fileName} preview image!`)
|
|
83
|
+
);
|
|
84
|
+
})
|
|
85
|
+
.catch(() => {
|
|
86
|
+
throw Error(
|
|
87
|
+
painter.red(`Error while creating ${fileName} preview image`)
|
|
88
|
+
);
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const getIconDefinitionsMatrix = (
|
|
93
|
+
icons: IconDefinition[],
|
|
94
|
+
size: number,
|
|
95
|
+
excluded: string[] = []
|
|
96
|
+
): IconDefinition[][] => {
|
|
97
|
+
const iconList = icons.sort((a, b) => a.label.localeCompare(b.label));
|
|
98
|
+
trimIconListToSize(iconList, size, excluded);
|
|
99
|
+
|
|
100
|
+
// list for the columns with the icons
|
|
101
|
+
const matrix: IconDefinition[][] = [];
|
|
102
|
+
|
|
103
|
+
// calculate the amount of icons per column
|
|
104
|
+
const itemsPerColumn = Math.floor(iconList.length / size);
|
|
105
|
+
|
|
106
|
+
// create the columns with the icons
|
|
107
|
+
let counter = 0;
|
|
108
|
+
for (let c = 0; c < itemsPerColumn; c++) {
|
|
109
|
+
matrix[c] = [];
|
|
110
|
+
}
|
|
111
|
+
for (let s = 0; s < size; s++) {
|
|
112
|
+
for (let i = 0; i < itemsPerColumn; i++) {
|
|
113
|
+
matrix[i][s] = iconList[counter];
|
|
114
|
+
counter++;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return matrix;
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Function that generates the preview image for specific icons.
|
|
123
|
+
* @param name name of the preview
|
|
124
|
+
* @param icons icons for the preview
|
|
125
|
+
* @param size amount of table columns
|
|
126
|
+
* @param trimmableIcons List of icons that can possibly be trimmed
|
|
127
|
+
*/
|
|
128
|
+
export const generatePreview = (
|
|
129
|
+
name: string,
|
|
130
|
+
icons: IconDefinition[],
|
|
131
|
+
size: number,
|
|
132
|
+
trimmableIcons: string[] = []
|
|
133
|
+
) => {
|
|
134
|
+
savePreview(
|
|
135
|
+
name,
|
|
136
|
+
size,
|
|
137
|
+
getIconDefinitionsMatrix(icons, size, trimmableIcons)
|
|
138
|
+
);
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
interface IconDefinition {
|
|
142
|
+
iconName: string;
|
|
143
|
+
label: string;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Trim the list of icons into the matrix
|
|
148
|
+
* @param iconList List of icons
|
|
149
|
+
* @param size Amount of columns
|
|
150
|
+
* @param trimmableIcons List of icons that can possibly be trimmed
|
|
151
|
+
*/
|
|
152
|
+
const trimIconListToSize = (
|
|
153
|
+
iconList: IconDefinition[],
|
|
154
|
+
size: number,
|
|
155
|
+
trimmableIcons: string[]
|
|
156
|
+
) => {
|
|
157
|
+
while (iconList.length % size !== 0) {
|
|
158
|
+
iconList.splice(
|
|
159
|
+
iconList.findIndex(
|
|
160
|
+
(i) => i.iconName === trimmableIcons[iconList.length % size]
|
|
161
|
+
),
|
|
162
|
+
1
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
:root {
|
|
2
|
-
--main-bg-color: #1e1e1e;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
body {
|
|
6
|
-
margin: 0;
|
|
7
|
-
padding: 0;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
table {
|
|
11
|
-
font-family: arial, sans-serif;
|
|
12
|
-
border-collapse: collapse;
|
|
13
|
-
width: 100%;
|
|
14
|
-
background: var(--main-bg-color);
|
|
15
|
-
color: rgb(250, 250, 250);
|
|
16
|
-
font-size: 1rem;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
td,
|
|
20
|
-
th {
|
|
21
|
-
border: 0px solid #dddddd;
|
|
22
|
-
text-align: left;
|
|
23
|
-
padding: 8px;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
tr:last-child {
|
|
27
|
-
border-bottom: 0.5rem solid var(--main-bg-color);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
tr:first-child {
|
|
31
|
-
border-top: 0.5rem solid var(--main-bg-color);
|
|
32
|
-
border-bottom: 0.5rem solid var(--main-bg-color);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
.icon {
|
|
36
|
-
width: 2rem;
|
|
37
|
-
text-align: center;
|
|
38
|
-
padding: 0.5rem 1rem 0.5rem 1rem;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
.iconName {
|
|
42
|
-
min-width: 9rem;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
img {
|
|
46
|
-
width: 30px;
|
|
47
|
-
height: auto;
|
|
48
|
-
}
|
|
1
|
+
:root {
|
|
2
|
+
--main-bg-color: #1e1e1e;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
body {
|
|
6
|
+
margin: 0;
|
|
7
|
+
padding: 0;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
table {
|
|
11
|
+
font-family: arial, sans-serif;
|
|
12
|
+
border-collapse: collapse;
|
|
13
|
+
width: 100%;
|
|
14
|
+
background: var(--main-bg-color);
|
|
15
|
+
color: rgb(250, 250, 250);
|
|
16
|
+
font-size: 1rem;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
td,
|
|
20
|
+
th {
|
|
21
|
+
border: 0px solid #dddddd;
|
|
22
|
+
text-align: left;
|
|
23
|
+
padding: 8px;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
tr:last-child {
|
|
27
|
+
border-bottom: 0.5rem solid var(--main-bg-color);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
tr:first-child {
|
|
31
|
+
border-top: 0.5rem solid var(--main-bg-color);
|
|
32
|
+
border-bottom: 0.5rem solid var(--main-bg-color);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.icon {
|
|
36
|
+
width: 2rem;
|
|
37
|
+
text-align: center;
|
|
38
|
+
padding: 0.5rem 1rem 0.5rem 1rem;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.iconName {
|
|
42
|
+
min-width: 9rem;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
img {
|
|
46
|
+
width: 30px;
|
|
47
|
+
height: auto;
|
|
48
|
+
}
|
package/src/test/runTest.ts
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import * as path from 'path';
|
|
2
|
-
import { runTests } from 'vscode-test';
|
|
3
|
-
|
|
4
|
-
const main = async () => {
|
|
5
|
-
try {
|
|
6
|
-
// The folder containing the Extension Manifest package.json
|
|
7
|
-
// Passed to `--extensionDevelopmentPath`
|
|
8
|
-
const extensionDevelopmentPath = path.resolve(__dirname, '../../');
|
|
9
|
-
|
|
10
|
-
// The path to the extension test script
|
|
11
|
-
// Passed to --extensionTestsPath
|
|
12
|
-
const extensionTestsPath = path.resolve(__dirname, './spec/index');
|
|
13
|
-
|
|
14
|
-
// Download VS Code, unzip it and run the integration test
|
|
15
|
-
await runTests({
|
|
16
|
-
extensionDevelopmentPath,
|
|
17
|
-
extensionTestsPath,
|
|
18
|
-
launchArgs: ['--disable-gpu', '--disable-workspace-trust'],
|
|
19
|
-
});
|
|
20
|
-
} catch (err) {
|
|
21
|
-
console.error('Failed to run tests');
|
|
22
|
-
process.exit(1);
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
main();
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { runTests } from 'vscode-test';
|
|
3
|
+
|
|
4
|
+
const main = async () => {
|
|
5
|
+
try {
|
|
6
|
+
// The folder containing the Extension Manifest package.json
|
|
7
|
+
// Passed to `--extensionDevelopmentPath`
|
|
8
|
+
const extensionDevelopmentPath = path.resolve(__dirname, '../../');
|
|
9
|
+
|
|
10
|
+
// The path to the extension test script
|
|
11
|
+
// Passed to --extensionTestsPath
|
|
12
|
+
const extensionTestsPath = path.resolve(__dirname, './spec/index');
|
|
13
|
+
|
|
14
|
+
// Download VS Code, unzip it and run the integration test
|
|
15
|
+
await runTests({
|
|
16
|
+
extensionDevelopmentPath,
|
|
17
|
+
extensionTestsPath,
|
|
18
|
+
launchArgs: ['--disable-gpu', '--disable-workspace-trust'],
|
|
19
|
+
});
|
|
20
|
+
} catch (err) {
|
|
21
|
+
console.error('Failed to run tests');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
main();
|
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
import * as assert from 'assert';
|
|
2
|
-
import { getObjectPropertyValue } from '../../../helpers/objects';
|
|
3
|
-
import * as i18n from '../../../i18n';
|
|
4
|
-
import { Translation } from '../../../models';
|
|
5
|
-
|
|
6
|
-
describe('i18n', () => {
|
|
7
|
-
it('should initialize translations', () => {
|
|
8
|
-
return i18n.initTranslations();
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
it('should translate key', () => {
|
|
12
|
-
assert.equal(
|
|
13
|
-
i18n.getTranslationValue('activate', { activate: 'b' } as Translation),
|
|
14
|
-
'b'
|
|
15
|
-
);
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
it('should return undefined if translation is not defined', () => {
|
|
19
|
-
assert.equal(
|
|
20
|
-
i18n.getTranslationValue(
|
|
21
|
-
'activate',
|
|
22
|
-
{} as Translation,
|
|
23
|
-
{} as Translation
|
|
24
|
-
),
|
|
25
|
-
undefined
|
|
26
|
-
);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('should use fallback if translation is not defined', () => {
|
|
30
|
-
assert.equal(
|
|
31
|
-
i18n.getTranslationValue(
|
|
32
|
-
'activate',
|
|
33
|
-
{} as Translation,
|
|
34
|
-
{ activate: 'fb' } as Translation
|
|
35
|
-
),
|
|
36
|
-
'fb'
|
|
37
|
-
);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('should get the correct translation value of the translation object', () => {
|
|
41
|
-
const translation = {
|
|
42
|
-
a: {
|
|
43
|
-
b: {
|
|
44
|
-
c: 'c',
|
|
45
|
-
},
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
assert.equal(getObjectPropertyValue(translation, 'a.b.c'), 'c');
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('should use placeholder in translation', () => {
|
|
52
|
-
assert.equal(
|
|
53
|
-
i18n.replace('%0 with placeholder', 'test'),
|
|
54
|
-
'test with placeholder'
|
|
55
|
-
);
|
|
56
|
-
assert.equal(
|
|
57
|
-
i18n.replace('%0 with %1', 'test', 'placeholder'),
|
|
58
|
-
'test with placeholder'
|
|
59
|
-
);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
1
|
+
import * as assert from 'assert';
|
|
2
|
+
import { getObjectPropertyValue } from '../../../helpers/objects';
|
|
3
|
+
import * as i18n from '../../../i18n';
|
|
4
|
+
import { Translation } from '../../../models';
|
|
5
|
+
|
|
6
|
+
describe('i18n', () => {
|
|
7
|
+
it('should initialize translations', () => {
|
|
8
|
+
return i18n.initTranslations();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('should translate key', () => {
|
|
12
|
+
assert.equal(
|
|
13
|
+
i18n.getTranslationValue('activate', { activate: 'b' } as Translation),
|
|
14
|
+
'b'
|
|
15
|
+
);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('should return undefined if translation is not defined', () => {
|
|
19
|
+
assert.equal(
|
|
20
|
+
i18n.getTranslationValue(
|
|
21
|
+
'activate',
|
|
22
|
+
{} as Translation,
|
|
23
|
+
{} as Translation
|
|
24
|
+
),
|
|
25
|
+
undefined
|
|
26
|
+
);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should use fallback if translation is not defined', () => {
|
|
30
|
+
assert.equal(
|
|
31
|
+
i18n.getTranslationValue(
|
|
32
|
+
'activate',
|
|
33
|
+
{} as Translation,
|
|
34
|
+
{ activate: 'fb' } as Translation
|
|
35
|
+
),
|
|
36
|
+
'fb'
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('should get the correct translation value of the translation object', () => {
|
|
41
|
+
const translation = {
|
|
42
|
+
a: {
|
|
43
|
+
b: {
|
|
44
|
+
c: 'c',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
assert.equal(getObjectPropertyValue(translation, 'a.b.c'), 'c');
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('should use placeholder in translation', () => {
|
|
52
|
+
assert.equal(
|
|
53
|
+
i18n.replace('%0 with placeholder', 'test'),
|
|
54
|
+
'test with placeholder'
|
|
55
|
+
);
|
|
56
|
+
assert.equal(
|
|
57
|
+
i18n.replace('%0 with %1', 'test', 'placeholder'),
|
|
58
|
+
'test with placeholder'
|
|
59
|
+
);
|
|
60
|
+
});
|
|
61
|
+
});
|