'use strict'; var path = require('path'); var fs = require('fs'); require('string.fromcodepoint'); require('string.prototype.codepointat'); function getMetadataService(options) { var usedUnicodes = []; // Default options options = options || {}; options.prependUnicode = !!options.prependUnicode; options.startUnicode = 'number' === typeof options.startUnicode ? options.startUnicode : 0xEA01; options.log = options.log || console.log; // eslint-disable-line options.err = options.err || console.err; // eslint-disable-line // Throw on old options usage if('undefined' !== typeof options.appendUnicode) { throw new Error( 'The "appendUnicode" option were renamed "prependUnicode".' + ' See https://github.com/nfroidure/gulp-svgicons2svgfont/issues/33' ); } return function getMetadataFromFile(file, cb) { var basename = path.basename(file); var metadata = { path: file, name: '', unicode: [], renamed: false, }; var matches = basename.match(/^(?:((?:u[0-9a-f]{4,6},?)+)\-)?(.+)\.svg$/i); metadata.name = matches && matches[2] ? matches[2] : 'icon' + options.startUnicode; if(matches && matches[1]) { metadata.unicode = matches[1].split(',').map(function(match) { match = match.substr(1); return match.split('u').map(function(code) { return String.fromCodePoint(parseInt(code, 16)); }).join(''); }); if(-1 !== usedUnicodes.indexOf(metadata.unicode[0])) { return cb(new Error('The unicode codepoint of the glyph ' + metadata.name + ' seems to be already used by another glyph.')); } usedUnicodes = usedUnicodes.concat(metadata.unicode); } else { do { metadata.unicode[0] = String.fromCodePoint(options.startUnicode++); } while(-1 !== usedUnicodes.indexOf(metadata.unicode[0])); usedUnicodes.push(metadata.unicode[0]); if(options.prependUnicode) { metadata.renamed = true; metadata.path = path.dirname(file) + '/' + 'u' + metadata.unicode[0].codePointAt(0).toString(16).toUpperCase() + '-' + basename; fs.rename(file, metadata.path, function(err) { if(err) { return cb(new Error('Could not save codepoint: ' + 'u' + metadata.unicode[0].codePointAt(0).toString(16).toUpperCase() + ' for ' + basename)); } cb(null, metadata); } ); } } if(!metadata.renamed) { setImmediate(function() { cb(null, metadata); }); } }; } module.exports = getMetadataService;