|
|
- const path = require('path');
- const fs = require("fs");
- const rootPath = process.cwd(); // 获取根目录
- const { importDirectory, blankIconSet } = require("@iconify/tools");
- const { locate } = require('@iconify/json');
- const { getIconData } = require('@iconify/utils');
- const { encodeSvg, saveFile, customOptions, deleteDirectory } = require('./index.js')
- async function fetchIconsData(icons) {
- const collections = {}
- for (const iconName of icons) {
- const [collectionName, iconNameWithoutPrefix] = iconName.split(':');
- const filename = locate(collectionName)
- if(!fs.existsSync(filename)) {
- continue
- }
- const icons = JSON.parse(fs.readFileSync(filename, 'utf8'))
- if(!icons) {
- continue
- }
- if(collectionName && iconNameWithoutPrefix) {
- const iconData = getIconData(icons, iconNameWithoutPrefix);
- if(iconData) {
- if(!collections[collectionName]) {
- collections[collectionName] = blankIconSet(collectionName);
- }
- collections[collectionName].setIcon(iconNameWithoutPrefix, iconData);
- } else {
- console.log(`Icon '${iconName}' not found in '${collectionName}' collection.`)
- }
- } else if(collectionName) {
- if(!collections[collectionName]) {
- collections[collectionName] = blankIconSet(collectionName)
- }
- Object.keys(icons.icons).forEach(iconName => {
- const iconData = getIconData(icons, iconName)
- if(iconData) {
- collections[collectionName].setIcon(iconName, iconData)
- } else {
- console.log(`Icon '${iconName}' not found in '${collectionName}' collection.`)
- }
- })
- }
- }
- return collections;
- }
-
- async function generate(config){
- try {
- if(!config) {
- // 从配置文件中读取选项
- const rootConfigPath = path.join(rootPath, 'lime-icons.config.js');
- let configPath = ''
- if(fs.existsSync(rootConfigPath)) {
- configPath = rootConfigPath
- } else {
- configPath = path.dirname(__filename) + '/lime-icons.config.js'; // 配置文件路径
- }
-
- const configFile = fs.readFileSync(configPath, 'utf8');
- config = eval(`(${configFile})`);
- }
-
- // 根据配置文件中的字段设置选项
- const options = {
- input: Object.assign({}, customOptions, config.input || {}), // 输入的文件目录
- output: {
- dir: config.output.dir || '/static', // 输出的文件目录
- file: config.output.file || 'icons.json', // 输出的文件的格式,默认为 JSON
- },
- icons: config.icons || [], // 图标名称列表
- };
-
- // 先删除原来的
- deleteDirectory(options.output.dir)
- // 处理输入目录的逻辑
- if (config.input.dir.startsWith('/')) {
- options.input.dir = path.join(rootPath, config.input.dir);
- } else if (config.input.dir.startsWith('./')) {
- options.input.dir = path.join(__dirname, config.input.dir.slice(2));
- }
- let iconCollections = {}
- // 异步地从目录中导入图标
- if(fs.existsSync(options.input.dir)) {
- const iconSet = await importDirectory(options.input.dir, options.input);
- // 导出为 JSON 文件
- iconCollections[options.input.prefix] = iconSet
- }
-
- // 获取指定图标的数据
- if(options.icons.length) {
- const iconCollection = await fetchIconsData(options.icons);
- Object.assign(iconCollections, iconCollection)
- }
-
- if(/\.json$/i.test(options.output.file)) {
- const collections = {}
- Object.values(iconCollections).forEach((iconSet) => {
-
- iconSet.forEach(iconName => {
- // 将 SVG 转换为 Data URL
- collections[iconSet.prefix + ':' + iconName] = `data:image/svg+xml;utf8,${encodeSvg(iconSet.toString(iconName))}`
- })
- })
- await saveFile(`${options.output.dir}/${options.output.file}`, JSON.stringify(collections))
- } else {
- Object.values(iconCollections).forEach((iconSet) => {
- iconSet.forEach(async iconName => {
- await saveFile(`${options.output.dir}/${iconSet.prefix}/${iconName}.svg`, iconSet.toString(iconName))
- })
- })
- }
- } catch (error) {
- console.error("导出图标集为 JSON 文件时出错:", error);
- }
- }
-
-
- module.exports = {
- generate
- }
|