合同小程序前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
3.9 KiB

3 months ago
  1. const path = require('path');
  2. const fs = require("fs");
  3. const rootPath = process.cwd(); // 获取根目录
  4. const { importDirectory, blankIconSet } = require("@iconify/tools");
  5. const { locate } = require('@iconify/json');
  6. const { getIconData } = require('@iconify/utils');
  7. const { encodeSvg, saveFile, customOptions, deleteDirectory } = require('./index.js')
  8. async function fetchIconsData(icons) {
  9. const collections = {}
  10. for (const iconName of icons) {
  11. const [collectionName, iconNameWithoutPrefix] = iconName.split(':');
  12. const filename = locate(collectionName)
  13. if(!fs.existsSync(filename)) {
  14. continue
  15. }
  16. const icons = JSON.parse(fs.readFileSync(filename, 'utf8'))
  17. if(!icons) {
  18. continue
  19. }
  20. if(collectionName && iconNameWithoutPrefix) {
  21. const iconData = getIconData(icons, iconNameWithoutPrefix);
  22. if(iconData) {
  23. if(!collections[collectionName]) {
  24. collections[collectionName] = blankIconSet(collectionName);
  25. }
  26. collections[collectionName].setIcon(iconNameWithoutPrefix, iconData);
  27. } else {
  28. console.log(`Icon '${iconName}' not found in '${collectionName}' collection.`)
  29. }
  30. } else if(collectionName) {
  31. if(!collections[collectionName]) {
  32. collections[collectionName] = blankIconSet(collectionName)
  33. }
  34. Object.keys(icons.icons).forEach(iconName => {
  35. const iconData = getIconData(icons, iconName)
  36. if(iconData) {
  37. collections[collectionName].setIcon(iconName, iconData)
  38. } else {
  39. console.log(`Icon '${iconName}' not found in '${collectionName}' collection.`)
  40. }
  41. })
  42. }
  43. }
  44. return collections;
  45. }
  46. async function generate(config){
  47. try {
  48. if(!config) {
  49. // 从配置文件中读取选项
  50. const rootConfigPath = path.join(rootPath, 'lime-icons.config.js');
  51. let configPath = ''
  52. if(fs.existsSync(rootConfigPath)) {
  53. configPath = rootConfigPath
  54. } else {
  55. configPath = path.dirname(__filename) + '/lime-icons.config.js'; // 配置文件路径
  56. }
  57. const configFile = fs.readFileSync(configPath, 'utf8');
  58. config = eval(`(${configFile})`);
  59. }
  60. // 根据配置文件中的字段设置选项
  61. const options = {
  62. input: Object.assign({}, customOptions, config.input || {}), // 输入的文件目录
  63. output: {
  64. dir: config.output.dir || '/static', // 输出的文件目录
  65. file: config.output.file || 'icons.json', // 输出的文件的格式,默认为 JSON
  66. },
  67. icons: config.icons || [], // 图标名称列表
  68. };
  69. // 先删除原来的
  70. deleteDirectory(options.output.dir)
  71. // 处理输入目录的逻辑
  72. if (config.input.dir.startsWith('/')) {
  73. options.input.dir = path.join(rootPath, config.input.dir);
  74. } else if (config.input.dir.startsWith('./')) {
  75. options.input.dir = path.join(__dirname, config.input.dir.slice(2));
  76. }
  77. let iconCollections = {}
  78. // 异步地从目录中导入图标
  79. if(fs.existsSync(options.input.dir)) {
  80. const iconSet = await importDirectory(options.input.dir, options.input);
  81. // 导出为 JSON 文件
  82. iconCollections[options.input.prefix] = iconSet
  83. }
  84. // 获取指定图标的数据
  85. if(options.icons.length) {
  86. const iconCollection = await fetchIconsData(options.icons);
  87. Object.assign(iconCollections, iconCollection)
  88. }
  89. if(/\.json$/i.test(options.output.file)) {
  90. const collections = {}
  91. Object.values(iconCollections).forEach((iconSet) => {
  92. iconSet.forEach(iconName => {
  93. // 将 SVG 转换为 Data URL
  94. collections[iconSet.prefix + ':' + iconName] = `data:image/svg+xml;utf8,${encodeSvg(iconSet.toString(iconName))}`
  95. })
  96. })
  97. await saveFile(`${options.output.dir}/${options.output.file}`, JSON.stringify(collections))
  98. } else {
  99. Object.values(iconCollections).forEach((iconSet) => {
  100. iconSet.forEach(async iconName => {
  101. await saveFile(`${options.output.dir}/${iconSet.prefix}/${iconName}.svg`, iconSet.toString(iconName))
  102. })
  103. })
  104. }
  105. } catch (error) {
  106. console.error("导出图标集为 JSON 文件时出错:", error);
  107. }
  108. }
  109. module.exports = {
  110. generate
  111. }