parseIconSet()
此函数属于 Iconify Utils 包。
函数 parseIconSet() 和 parseIconSetAsync() 用于解析图标集,并为每个图标调用自定义函数。
用法
该函数具有以下参数:
- data,IconifyJSON。图标集数据。
- callback,function。回调函数,为图标集中找到的每个图标调用。
函数以 string[] 形式返回已解析图标的名称。
回调
回调函数具有 2 个参数:
- name,string。图标名称。
- data,IconifyIcon|null。图标数据,如果图标无效则为 null。
回调会为图标集中的每个条目调用:所有图标、别名以及 not_found 属性中的所有条目。
如果回调中的 data 参数为 null,则表示图标无效或缺失。
parseIconSetAsync
函数 parseIconSetAsync() 与 parseIconSet() 完全相同,不同之处在于它是异步的,且回调函数也是异步函数:
js
await parseIconSetAsync(iconSet, async (name, data) => {
// 执行异步操作
});示例
从图标集中导出所有图标:
usage.ts
ts
import { 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
ts
import 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 文件:
js
const { icons } = require('@iconify-json/codicon');