169 lines
4.7 KiB
JavaScript
169 lines
4.7 KiB
JavaScript
'use strict';
|
|
|
|
const fs = require('fs');
|
|
const iconSet_index = require('../icon-set/index.cjs');
|
|
const misc_keyword = require('../misc/keyword.cjs');
|
|
const misc_scan = require('../misc/scan.cjs');
|
|
const svg_index = require('../svg/index.cjs');
|
|
const svg_cleanup = require('../svg/cleanup.cjs');
|
|
require('@iconify/utils/lib/icon/defaults');
|
|
require('@iconify/utils/lib/svg/build');
|
|
require('@iconify/utils/lib/icon-set/minify');
|
|
require('@iconify/utils/lib/icon-set/convert-info');
|
|
require('../icon-set/props.cjs');
|
|
require('@iconify/utils/lib/misc/objects');
|
|
require('@iconify/utils');
|
|
require('cheerio');
|
|
require('../svg/cleanup/attribs.cjs');
|
|
require('../svg/data/attributes.cjs');
|
|
require('../svg/data/tags.cjs');
|
|
require('../svg/parse.cjs');
|
|
require('../svg/cleanup/bad-tags.cjs');
|
|
require('../svg/cleanup/inline-style.cjs');
|
|
require('../css/parse.cjs');
|
|
require('../css/parser/tokens.cjs');
|
|
require('../css/parser/error.cjs');
|
|
require('../css/parser/strings.cjs');
|
|
require('../css/parser/text.cjs');
|
|
require('../svg/cleanup/root-style.cjs');
|
|
require('../svg/parse-style.cjs');
|
|
require('../css/parser/export.cjs');
|
|
require('../css/parser/tree.cjs');
|
|
require('../svg/cleanup/root-svg.cjs');
|
|
require('../svg/cleanup/svgo-style.cjs');
|
|
require('../optimise/svgo.cjs');
|
|
require('svgo');
|
|
require('@iconify/utils/lib/svg/id');
|
|
|
|
function importDir(iconSet, options, getKeyword, files, readFile, done) {
|
|
let i = 0;
|
|
const next = () => {
|
|
if (i >= files.length) {
|
|
return done(iconSet);
|
|
}
|
|
const file = files[i];
|
|
i++;
|
|
const defaultKeyword = misc_keyword.cleanupIconKeyword(file.file);
|
|
getKeyword([file, defaultKeyword, iconSet], (keyword) => {
|
|
if (typeof keyword !== "string" || !keyword.length) {
|
|
return next();
|
|
}
|
|
readFile(
|
|
file.path + file.subdir + file.file + file.ext,
|
|
(content) => {
|
|
try {
|
|
const svg = new svg_index.SVG(content);
|
|
svg_cleanup.cleanupSVG(svg, options);
|
|
iconSet.fromSVG(keyword, svg);
|
|
} catch (err) {
|
|
const ignore = options.ignoreImportErrors ?? false;
|
|
if (ignore === false || ignore === "warn") {
|
|
let msg = `Failed to import "${keyword}"`;
|
|
if (err instanceof Error) {
|
|
msg += `: ${err.message}`;
|
|
}
|
|
if (ignore === false) {
|
|
throw new Error(msg);
|
|
} else {
|
|
console.warn(msg);
|
|
}
|
|
}
|
|
}
|
|
next();
|
|
}
|
|
);
|
|
});
|
|
};
|
|
next();
|
|
}
|
|
function isValidFile(item) {
|
|
return item.ext.toLowerCase() === ".svg";
|
|
}
|
|
function importDirectory(path, options = {}) {
|
|
return new Promise((fulfill, reject) => {
|
|
misc_scan.scanDirectory(
|
|
path,
|
|
(ext, file, subdir, path2) => {
|
|
const result = {
|
|
file,
|
|
ext,
|
|
subdir,
|
|
path: path2
|
|
};
|
|
return isValidFile(result) ? result : false;
|
|
},
|
|
options.includeSubDirs !== false
|
|
).then((files) => {
|
|
const iconSet = iconSet_index.blankIconSet(options.prefix || "");
|
|
try {
|
|
importDir(
|
|
iconSet,
|
|
options,
|
|
(params, done) => {
|
|
if (options.keyword) {
|
|
const result = options.keyword(...params);
|
|
if (result instanceof Promise) {
|
|
result.then(done).catch(reject);
|
|
} else {
|
|
done(result);
|
|
}
|
|
} else {
|
|
done(params[1]);
|
|
}
|
|
},
|
|
files,
|
|
(filename, done) => {
|
|
fs.promises.readFile(filename, "utf8").then(done).catch(reject);
|
|
},
|
|
fulfill
|
|
);
|
|
} catch (err) {
|
|
reject(err);
|
|
}
|
|
}).catch(reject);
|
|
});
|
|
}
|
|
function importDirectorySync(path, options = {}) {
|
|
const files = misc_scan.scanDirectorySync(
|
|
path,
|
|
(ext, file, subdir, path2) => {
|
|
const result = {
|
|
file,
|
|
ext,
|
|
subdir,
|
|
path: path2
|
|
};
|
|
return isValidFile(result) ? result : false;
|
|
},
|
|
options.includeSubDirs !== false
|
|
);
|
|
const iconSet = iconSet_index.blankIconSet(options.prefix || "");
|
|
let isSync = true;
|
|
importDir(
|
|
iconSet,
|
|
options,
|
|
(params, done) => {
|
|
if (options.keyword) {
|
|
done(options.keyword(...params));
|
|
} else {
|
|
done(params[1]);
|
|
}
|
|
},
|
|
files,
|
|
(filename, done) => {
|
|
done(fs.readFileSync(filename, "utf8"));
|
|
},
|
|
() => {
|
|
if (!isSync) {
|
|
throw new Error(
|
|
"importDirectorySync supposed to be synchronous"
|
|
);
|
|
}
|
|
}
|
|
);
|
|
isSync = false;
|
|
return iconSet;
|
|
}
|
|
|
|
exports.importDirectory = importDirectory;
|
|
exports.importDirectorySync = importDirectorySync;
|