Skip to content

parseIconSet()

此函数属于 Iconify Utils 包

函数 parseIconSet()parseIconSetAsync() 用于解析图标集,并为每个图标调用自定义函数。

用法

该函数具有以下参数:

  • dataIconifyJSON。图标集数据。
  • callbackfunction。回调函数,为图标集中找到的每个图标调用。

函数以 string[] 形式返回已解析图标的名称。

回调

回调函数具有 2 个参数:

  • namestring。图标名称。
  • dataIconifyIcon|null。图标数据,如果图标无效则为 null

回调会为图标集中的每个条目调用:所有图标、别名以及 not_found 属性中的所有条目。

如果回调中的 data 参数为 null,则表示图标无效或缺失。

parseIconSetAsync

函数 parseIconSetAsync()parseIconSet() 完全相同,不同之处在于它是异步的,且回调函数也是异步函数:

jsawait parseIconSetAsync(iconSet, async (name, data) => {
   // 执行异步操作
});

示例

从图标集中导出所有图标:

usage.ts
tsimport { promises as fs } from 'fs';
import { icons } from '@iconify-json/codicon';
import { validateIconSet, parseIconSet, iconToSVG } from '@iconify/utils';

// Storage for all icons
const exportedSVG: Record<string, string> = Object.create(null);

// Validate icon set before parsing it. Will throw an exception on error
validateIconSet(icons);

// Parse all icons
parseIconSet(icons, (iconName, iconData) => {
   if (!iconData) {
       // Invalid icon
       console.error(`Error parsing icon ${iconName}`);
       return;
   }

   // Render icon
   const renderData = iconToSVG(iconData, {
       height: 'auto',
   });

   // Generate attributes for SVG element
   const svgAttributes: Record<string, string> = {
       'xmlns': 'http://www.w3.org/2000/svg',
       'xmlns:xlink': 'http://www.w3.org/1999/xlink',
       ...renderData.attributes,
   };
   const svgAttributesStr = Object.keys(svgAttributes)
       .map(
           (attr) =>
               // No need to check attributes for special characters, such as quotes,
               // they cannot contain anything that needs escaping.
               `${attr}="${svgAttributes[attr as keyof typeof svgAttributes]}"`
       )
       .join(' ');

   // Generate SVG
   const svg = `<svg ${svgAttributesStr}>${renderData.body}</svg>`;

   // Save SVG
   exportedSVG[iconName] = svg;
});

// Save all icons
(async () => {
   for (const name in exportedSVG) {
       const svg = exportedSVG[name];
       await fs.writeFile(`svg/${name}.svg`, svg, 'utf8');
   }
   console.log(`Saved ${Object.keys(exportedSVG).length} icons`);
})();

统计图标集中的图标数量:

count.ts
tsimport type { ExtendedIconifyIcon } from '@iconify/types';
import { icons } from '@iconify-json/codicon';
import { parseIconSet } from '@iconify/utils';

// Count icons by parsing them
let count = 0;
parseIconSet(icons, (iconName, iconData) => {
   if (iconData && !(iconData as ExtendedIconifyIcon).hidden) {
       // Check if it is an alias.
       // Aliases without modifications should not count as they are just another name for same icon.
       const isAlias = !icons.icons[iconName];
       if (isAlias && icons.aliases) {
           const aliasData = icons.aliases[iconName];
           if (Object.keys(aliasData).length > 1) {
               // Alias has more than just 'parent' property: assume it overrides something

               // This is a quick way, proper function that accounts for all possibilities
               // is in @iconify/tools package in IconSet class.
               return;
           }
       }

       // Valid icon, not hidden, not basic alias
       count++;
   }
});

console.log(`Found ${count} icons`);

在计算 IconifyInfo 数据的图标数量时,应使用上述示例中的代码来统计图标集中的图标。它会统计所有图标,但不包括隐藏的图标和基本别名。

验证

该函数不会检查图标集是否存在错误。在使用之前,请使用 validateIconSet()quicklyValidateIconSet() 验证图标集。

JSON 模块

在使用 ES 模块时,上述示例可能需要使用 "--experimental-json-modules" 标志运行 node。

在 Node.js 对 JSON 模块的支持稳定之前,你可以通过将 import 替换为 require() 来避免使用该标志,因为 require() 支持 JSON 文件:

jsconst { icons } = require('@iconify-json/codicon');