import { globSync } from 'glob' import { readFileSync, writeFileSync } from 'fs' import { join, basename } from 'path' import { optimizePath, ICONS_SRC_DIR, iconTemplate, types } from './helpers.mjs' types.forEach(type => { const files = globSync(join(ICONS_SRC_DIR, type, '*.svg')) files.forEach(function (file, i) { console.log(`Optimize ${basename(file)}`); // Read files let svgFile = readFileSync(file), svgFileContent = svgFile.toString() // Optimize SVG svgFileContent = svgFileContent.replace(/><\/(polyline|line|rect|circle|path|ellipse)>/g, '/>') .replace(/rx="([^"]+)"\s+ry="\1"/g, 'rx="$1"') .replace(/]+)?\/>/g, '') .replace(/]+d="M0 0h24v24h-24z"[^>]+\/>/g, '') .replace(/\s?\/>/g, ' />') .replace(/\n\s*<(line|circle|path|polyline|rect|ellipse)/g, '\n <$1') // .replace(/polyline points="([0-9.]+)\s([0-9.]+)\s([0-9.]+)\s([0-9.]+)"/g, 'line x1="$1" y1="$2" x2="$3" y2="$4"') .replace(//g, function (f, x1, y1, x2, y2) { return `` }) .replace(//g, function (f, cx, cy, r) { return `` }) .replace(//g, function (f, cx, cy, rx) { return `` }) .replace(//g, function (f, cx, cy, rx, ry) { return `` }) .replace(//g, function (f, width, height, x, y, rx) { return `` }) .replace(//g, function (f, x, y, rx, width, height) { return `` }) .replace(//g, function (f, x, y, width, height, rx) { return `` }) .replace(//g, function (f, x, y, width, height) { return `` }) .replace(//g, function (f, points) { const path = points.split(' ').reduce( (accumulator, currentValue, currentIndex) => `${accumulator}${currentIndex % 2 === 0 ? (currentIndex === 0 ? 'M' : 'L') : ''}${currentValue} `, '' ) return `` }) .replace(/ ``) .replace(/ 0\./g, ' .') .replace(/ -0\./g, ' -.') .replace(/([amcvhslAMCVHLS]) /g, '$1') return `]+>/, iconTemplate(type)) // Remove stroke and fill if (file.match(/\/filled\//)) { svgFileContent = svgFileContent .replace(/stroke-width="0" fill="currentColor"/gm, '') .replace('stroke-width="2"', '') .replace('stroke-linecap="round"', '') .replace('stroke-linejoin="round"', '') .replace('stroke="currentColor"', '') .replace('fill="none"', 'fill="currentColor"') .replace(/^\s*[\r\n]/gm, '') .replace(/\s{2,}\//g, ' /') } // Add comment if not exists if (!svgFileContent.includes('\n' + svgFileContent } svgFileContent = svgFileContent.replace(/tags: \[([^]+)\]/, (m, tags) => { tags = [...new Set(tags.split(',').map(t => t.trim()))].filter(t => t).join(', ') return `tags: [${tags}]` }) // Write files if (svgFile.toString() !== svgFileContent) { writeFileSync(file, svgFileContent) } }) })