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.
181 lines
9.6 KiB
181 lines
9.6 KiB
"use strict"; |
|
/// <reference types="./types" /> |
|
var __importDefault = (this && this.__importDefault) || function (mod) { |
|
return (mod && mod.__esModule) ? mod : { "default": mod }; |
|
}; |
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
const path_1 = __importDefault(require("path")); |
|
const fs_extra_1 = __importDefault(require("fs-extra")); |
|
const image2uri_1 = __importDefault(require("image2uri")); |
|
const colors_cli_1 = __importDefault(require("colors-cli")); |
|
const log_1 = require("./log"); |
|
const generate_1 = require("./generate"); |
|
const utils_1 = require("./utils"); |
|
exports.default = async (options = {}) => { |
|
const confPath = path_1.default.join(process.cwd(), '.svgtofontrc'); |
|
if (fs_extra_1.default.pathExistsSync(confPath)) { |
|
const conf = await fs_extra_1.default.readJson(confPath); |
|
options = Object.assign(Object.assign({}, options), conf); |
|
} |
|
const pkgPath = path_1.default.join(process.cwd(), 'package.json'); |
|
if (fs_extra_1.default.pathExistsSync(pkgPath)) { |
|
const pkg = require(pkgPath); |
|
if (pkg.svgtofont) { |
|
options = Object.assign(Object.assign({}, options), pkg.svgtofont); |
|
} |
|
if (options.website && pkg.version) { |
|
options.website.version = pkg.version; |
|
} |
|
} |
|
if (options.log === undefined) |
|
options.log = true; |
|
log_1.log.disabled = !options.log; |
|
if (options.logger && typeof options.logger === 'function') |
|
log_1.log.logger = options.logger; |
|
options.dist = options.dist || path_1.default.resolve(process.cwd(), 'fonts'); |
|
options.src = options.src || path_1.default.resolve(process.cwd(), 'svg'); |
|
options.startUnicode = options.startUnicode || 0xea01; |
|
options.svg2ttf = options.svg2ttf || {}; |
|
options.emptyDist = options.emptyDist; |
|
options.fontName = options.fontName || 'iconfont'; |
|
options.svgicons2svgfont = options.svgicons2svgfont || {}; |
|
options.svgicons2svgfont.fontName = options.fontName; |
|
options.symbolNameDelimiter = options.symbolNameDelimiter || '-'; |
|
options.classNamePrefix = options.classNamePrefix || options.fontName; |
|
const fontSize = options.css && typeof options.css !== 'boolean' && options.css.fontSize ? options.css.fontSize : '16px'; |
|
// If you generate a font you need to generate a style. |
|
if (options.website && !options.css) |
|
options.css = true; |
|
const infoDataPath = path_1.default.resolve(options.dist, 'info.json'); |
|
try { |
|
if (options.emptyDist) { |
|
await fs_extra_1.default.emptyDir(options.dist); |
|
} |
|
// Ensures that the directory exists. |
|
await fs_extra_1.default.ensureDir(options.dist); |
|
const unicodeObject = await (0, utils_1.createSVG)(options); |
|
let cssString = []; |
|
let cssToVars = []; |
|
let cssIconHtml = []; |
|
let unicodeHtml = []; |
|
let symbolHtml = []; |
|
const prefix = options.classNamePrefix || options.fontName; |
|
const infoData = {}; |
|
Object.keys(unicodeObject).forEach(name => { |
|
if (!infoData[name]) |
|
infoData[name] = {}; |
|
const _code = unicodeObject[name]; |
|
let symbolName = options.classNamePrefix + options.symbolNameDelimiter + name; |
|
let iconPart = symbolName + '">'; |
|
let encodedCodes = _code.charCodeAt(0); |
|
if (options.useNameAsUnicode) { |
|
symbolName = name; |
|
iconPart = prefix + '">' + name; |
|
encodedCodes = _code.split('').map(x => x.charCodeAt(0)).join(';&#'); |
|
} |
|
else { |
|
cssString.push(`.${symbolName}:before { content: "\\${encodedCodes.toString(16)}"; }\n`); |
|
cssToVars.push(`$${symbolName}: "\\${encodedCodes.toString(16)}";\n`); |
|
} |
|
infoData[name].encodedCode = `\\${encodedCodes.toString(16)}`; |
|
infoData[name].prefix = prefix; |
|
infoData[name].className = symbolName; |
|
infoData[name].unicode = `&#${encodedCodes};`; |
|
cssIconHtml.push(`<li class="class-icon"><i class="${iconPart}</i><p class="name">${name}</p></li>`); |
|
unicodeHtml.push(`<li class="unicode-icon"><span class="iconfont">${_code}</span><h4>${name}</h4><span class="unicode">&#${encodedCodes};</span></li>`); |
|
symbolHtml.push(` |
|
<li class="symbol"> |
|
<svg class="icon" aria-hidden="true"> |
|
<use xlink:href="${options.fontName}.symbol.svg#${symbolName}"></use> |
|
</svg> |
|
<h4>${symbolName}</h4> |
|
</li> |
|
`); |
|
}); |
|
if (options.generateInfoData) { |
|
await fs_extra_1.default.writeJSON(infoDataPath, infoData, { spaces: 2 }); |
|
log_1.log.log(`${colors_cli_1.default.green('SUCCESS')} Created ${infoDataPath} `); |
|
} |
|
const ttf = await (0, utils_1.createTTF)(options); |
|
await (0, utils_1.createEOT)(options, ttf); |
|
await (0, utils_1.createWOFF)(options, ttf); |
|
await (0, utils_1.createWOFF2)(options, ttf); |
|
await (0, utils_1.createSvgSymbol)(options); |
|
if (options.css) { |
|
const styleTemplatePath = options.styleTemplates || (!options.useNameAsUnicode ? path_1.default.resolve(__dirname, 'styles') : path_1.default.resolve(__dirname, 'ligature-styles')); |
|
await (0, utils_1.copyTemplate)(styleTemplatePath, options.dist, { |
|
fontname: options.fontName, |
|
cssString: cssString.join(''), |
|
cssToVars: cssToVars.join(''), |
|
fontSize: fontSize, |
|
timestamp: new Date().getTime(), |
|
prefix, |
|
_opts: typeof options.css === 'boolean' ? {} : Object.assign({}, options.css) |
|
}); |
|
} |
|
if (options.typescript) { |
|
await (0, utils_1.createTypescript)(Object.assign(Object.assign({}, options), { typescript: options.typescript })); |
|
} |
|
if (options.website) { |
|
const pageName = ['font-class', 'unicode', 'symbol']; |
|
let fontClassPath = path_1.default.join(options.dist, 'index.html'); |
|
let unicodePath = path_1.default.join(options.dist, 'unicode.html'); |
|
let symbolPath = path_1.default.join(options.dist, 'symbol.html'); |
|
// setting default home page. |
|
const indexName = pageName.includes(options.website.index) ? pageName.indexOf(options.website.index) : 0; |
|
pageName.forEach((name, index) => { |
|
const _path = path_1.default.join(options.dist, indexName === index ? 'index.html' : `${name}.html`); |
|
if (name === 'font-class') |
|
fontClassPath = _path; |
|
if (name === 'unicode') |
|
unicodePath = _path; |
|
if (name === 'symbol') |
|
symbolPath = _path; |
|
}); |
|
// default template |
|
options.website.template = options.website.template || path_1.default.join(__dirname, 'website', 'index.ejs'); |
|
// template data |
|
const tempData = Object.assign(Object.assign({ meta: null, links: null, corners: null, description: null, footerInfo: null }, options.website), { fontname: options.fontName, classNamePrefix: options.classNamePrefix, _type: 'font-class', _link: `${(options.css && typeof options.css !== 'boolean' && options.css.fileName) || options.fontName}.css`, _IconHtml: cssIconHtml.join(''), _title: options.website.title || options.fontName }); |
|
// website logo |
|
if (options.website.logo && fs_extra_1.default.pathExistsSync(options.website.logo) && path_1.default.extname(options.website.logo) === '.svg') { |
|
tempData.logo = fs_extra_1.default.readFileSync(options.website.logo).toString(); |
|
} |
|
// website favicon |
|
if (options.website.favicon && fs_extra_1.default.pathExistsSync(options.website.favicon)) { |
|
tempData.favicon = (0, image2uri_1.default)(options.website.favicon); |
|
} |
|
else { |
|
tempData.favicon = ''; |
|
} |
|
const classHtmlStr = await (0, utils_1.createHTML)(options.website.template, tempData); |
|
fs_extra_1.default.outputFileSync(fontClassPath, classHtmlStr); |
|
log_1.log.log(`${colors_cli_1.default.green('SUCCESS')} Created ${fontClassPath} `); |
|
tempData._IconHtml = unicodeHtml.join(''); |
|
tempData._type = 'unicode'; |
|
const unicodeHtmlStr = await (0, utils_1.createHTML)(options.website.template, tempData); |
|
fs_extra_1.default.outputFileSync(unicodePath, unicodeHtmlStr); |
|
log_1.log.log(`${colors_cli_1.default.green('SUCCESS')} Created ${unicodePath} `); |
|
tempData._IconHtml = symbolHtml.join(''); |
|
tempData._type = 'symbol'; |
|
const symbolHtmlStr = await (0, utils_1.createHTML)(options.website.template, tempData); |
|
fs_extra_1.default.outputFileSync(symbolPath, symbolHtmlStr); |
|
log_1.log.log(`${colors_cli_1.default.green('SUCCESS')} Created ${unicodePath} `); |
|
} |
|
if (options.outSVGPath) { |
|
const outPath = await (0, generate_1.generateIconsSource)(options); |
|
log_1.log.log(`${colors_cli_1.default.green('SUCCESS')} Created ${outPath} `); |
|
} |
|
if (options.outSVGReact) { |
|
const outPath = await (0, generate_1.generateReactIcons)(options); |
|
log_1.log.log(`${colors_cli_1.default.green('SUCCESS')} Created React Components. `); |
|
} |
|
} |
|
catch (error) { |
|
log_1.log.log('SvgToFont:CLI:ERR:', error); |
|
} |
|
}; |
|
/** |
|
* https://github.com/Microsoft/TypeScript/issues/5565#issuecomment-155226290 |
|
*/ |
|
module.exports = exports["default"]; |
|
//# sourceMappingURL=index.js.map
|