131 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			131 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright © 2016-2024 The Thingsboard Authors
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Licensed under the Apache License, Version 2.0 (the "License");
							 | 
						||
| 
								 | 
							
								 * you may not use this file except in compliance with the License.
							 | 
						||
| 
								 | 
							
								 * You may obtain a copy of the License at
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *     http://www.apache.org/licenses/LICENSE-2.0
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Unless required by applicable law or agreed to in writing, software
							 | 
						||
| 
								 | 
							
								 * distributed under the License is distributed on an "AS IS" BASIS,
							 | 
						||
| 
								 | 
							
								 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
							 | 
						||
| 
								 | 
							
								 * See the License for the specific language governing permissions and
							 | 
						||
| 
								 | 
							
								 * limitations under the License.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const fs = require('fs');
							 | 
						||
| 
								 | 
							
								const path = require('path');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const materialIconDir = path.join('.', 'src', 'assets', 'metadata');
							 | 
						||
| 
								 | 
							
								const mdiMetadata = path.join('.', 'node_modules', '@mdi', 'svg', 'meta.json');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								async function init() {
							 | 
						||
| 
								 | 
							
								  const iconsBundle = JSON.parse(await fs.promises.readFile(path.join(materialIconDir, 'material-icons.json')));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  await getMaterialIconMetadataAndUpdated(iconsBundle);
							 | 
						||
| 
								 | 
							
								  await getMDIMetadataAndUpdated(iconsBundle);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  await fs.promises.writeFile(path.join(materialIconDir, 'material-icons.json'), JSON.stringify(iconsBundle), 'utf8')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								async function getMaterialIconMetadataAndUpdated(iconsBundle){
							 | 
						||
| 
								 | 
							
								  const iconsResponse = await fetch('https://fonts.google.com/metadata/icons?key=material_symbols&incomplete=true');
							 | 
						||
| 
								 | 
							
								  const iconsText = await iconsResponse.text();
							 | 
						||
| 
								 | 
							
								  const clearText = iconsText.substring(iconsText.indexOf("\n") + 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const icons = JSON.parse(clearText).icons;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let prevItem;
							 | 
						||
| 
								 | 
							
								  const filterIcons = icons.filter((item) => {
							 | 
						||
| 
								 | 
							
								    if (prevItem?.name !== item.name && !item.unsupported_families.includes('Material Icons')) {
							 | 
						||
| 
								 | 
							
								      prevItem = item;
							 | 
						||
| 
								 | 
							
								      return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return false;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  filterIcons.forEach((item, index) => {
							 | 
						||
| 
								 | 
							
								    const findItem = iconsBundle.find((el) => el.name === item.name);
							 | 
						||
| 
								 | 
							
								    if (!findItem) {
							 | 
						||
| 
								 | 
							
								      let prevIndexIcon = 0;
							 | 
						||
| 
								 | 
							
								      if (index === 0) {
							 | 
						||
| 
								 | 
							
								        prevIndexIcon = 45;
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        let iteration = 0;
							 | 
						||
| 
								 | 
							
								        while (prevIndexIcon < 45) {
							 | 
						||
| 
								 | 
							
								          iteration++;
							 | 
						||
| 
								 | 
							
								          const prevIconName = filterIcons[index - iteration].name;
							 | 
						||
| 
								 | 
							
								          prevIndexIcon = findPreviousIcon(iconsBundle, prevIconName);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (prevIndexIcon >= 0) {
							 | 
						||
| 
								 | 
							
								        iconsBundle.splice(prevIndexIcon + 1, 0, {name:item.name, tags:item.tags});
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      console.log('Not found icon:', item.name);
							 | 
						||
| 
								 | 
							
								      console.count('Not found material icon');
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (JSON.stringify(item.tags) !== JSON.stringify(findItem.tags)) {
							 | 
						||
| 
								 | 
							
								      findItem.tags = item.tags;
							 | 
						||
| 
								 | 
							
								      console.log('Difference tags in', item.name);
							 | 
						||
| 
								 | 
							
								      console.count('Difference tags in material icon');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								async function getMDIMetadataAndUpdated(iconsBundle){
							 | 
						||
| 
								 | 
							
								  const mdiBundle = JSON.parse(await fs.promises.readFile(mdiMetadata));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  iconsBundle
							 | 
						||
| 
								 | 
							
								    .filter(item => item.name.startsWith('mdi:'))
							 | 
						||
| 
								 | 
							
								    .forEach(item => {
							 | 
						||
| 
								 | 
							
								      const iconName = item.name.substring(item.name.indexOf(":") + 1);
							 | 
						||
| 
								 | 
							
								      const findItem = mdiBundle.find((el) => el.name === iconName);
							 | 
						||
| 
								 | 
							
								      if (!findItem) {
							 | 
						||
| 
								 | 
							
								        console.error('Delete icon:', item.name);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  mdiBundle.forEach((item, index) => {
							 | 
						||
| 
								 | 
							
								    const iconName = `mdi:${item.name}`
							 | 
						||
| 
								 | 
							
								    let iconTags = item.tags;
							 | 
						||
| 
								 | 
							
								    const iconAliases = item.aliases.map(item => item.replaceAll('-', ' '));
							 | 
						||
| 
								 | 
							
								    if (!iconTags.length && item.aliases.length)  {
							 | 
						||
| 
								 | 
							
								      iconTags = iconAliases;
							 | 
						||
| 
								 | 
							
								    } else if (item.aliases.length) {
							 | 
						||
| 
								 | 
							
								      iconTags = iconTags.concat(iconAliases);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    iconTags = iconTags.map(item => item.toLowerCase());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const findItem = iconsBundle.find((el) => el.name === iconName);
							 | 
						||
| 
								 | 
							
								    if (!findItem) {
							 | 
						||
| 
								 | 
							
								      let prevIndexIcon;
							 | 
						||
| 
								 | 
							
								      if (index === 0) {
							 | 
						||
| 
								 | 
							
								        prevIndexIcon = iconsBundle.findIndex(item => item.name.startsWith('mdi:'))
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        const prevIconName = `mdi:${mdiBundle[index - 1].name}`;
							 | 
						||
| 
								 | 
							
								        prevIndexIcon = findPreviousIcon(iconsBundle, prevIconName);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (prevIndexIcon >= 0) {
							 | 
						||
| 
								 | 
							
								        iconsBundle.splice(prevIndexIcon + 1, 0, {name:iconName, tags:iconTags});
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      console.log('Not found icon:', iconName);
							 | 
						||
| 
								 | 
							
								      console.count('Not found mdi icon');
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (JSON.stringify(iconTags) !== JSON.stringify(findItem.tags)) {
							 | 
						||
| 
								 | 
							
								      findItem.tags = iconTags;
							 | 
						||
| 
								 | 
							
								      console.log('Difference tags in', iconName);
							 | 
						||
| 
								 | 
							
								      console.count('Difference tags in mdi icon');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function findPreviousIcon(iconsBundle, findName) {
							 | 
						||
| 
								 | 
							
								  return iconsBundle.findIndex(item => item.name === findName);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								init();
							 |