Files
NapCatQQ/.pnpm-store/v3/files/17/28f41cc6aeb278e1c0d382b9aed5b62bcecd3854aac468206b9019e3986ca1141743960f34b5932402907f760dc26b16ad96884351069689e43cb1521631a6
TanTan e311ca3275
Build NapCat Artifacts / Windows Loader Test (push) Canceled after 0s
Build NapCat Artifacts / Type Check & Test (push) Canceled after 0s
Build NapCat Artifacts / Build NapCat.Framework (push) Canceled after 0s
Build NapCat Artifacts / Build NapCat.Shell (push) Canceled after 0s
docs: 仓库链接指向本镜像仓库
2026-11-13 09:25:58 +08:00

171 lines
3.3 KiB
Plaintext

/**
* @file glyph
* @author junmer
*/
/* eslint-env node */
var _ = require('lodash');
var isTtf = require('is-ttf');
var through = require('through2');
var TTF = require('fonteditor-core').TTF;
var TTFReader = require('fonteditor-core').TTFReader;
var TTFWriter = require('fonteditor-core').TTFWriter;
var b2ab = require('b3b').b2ab;
var ab2b = require('b3b').ab2b;
var util = require('../lib/util');
/**
* getSubsetGlyfs
*
* @param {ttfObject} ttf ttfobj
* @param {Array} subset subset unicode
* @return {Array} glyfs array
*/
function getSubsetGlyfs(ttf, subset) {
var glyphs = [];
var indexList = ttf.findGlyf({
unicode: subset || []
});
if (indexList.length) {
glyphs = ttf.getGlyf(indexList);
}
glyphs.unshift(ttf.get().glyf[0]);
return glyphs;
}
/**
* minifyFontObject
*
* @param {Object} ttfObject ttfObject
* @param {Array} subset subset
* @param {Function=} plugin use plugin
* @return {Object} ttfObject
*/
function minifyFontObject(ttfObject, subset, plugin) {
// check null
if (subset.length === 0) {
return ttfObject;
}
// new TTF Object
var ttf = new TTF(ttfObject);
// get target glyfs then set
ttf.setGlyf(getSubsetGlyfs(ttf, subset));
// use plugin
if (_.isFunction(plugin)) {
plugin(ttf);
}
return ttf.get();
}
/**
* minifyTtf
*
* @param {Buffer|Object} contents contents
* @param {Object} opts opts
* @return {Buffer} buffer
*/
function minifyTtf(contents, opts) {
opts = opts || {};
var ttfobj = contents;
if (Buffer.isBuffer(contents)) {
ttfobj = new TTFReader(opts).read(b2ab(contents));
}
var miniObj = minifyFontObject(
ttfobj,
opts.subset,
opts.use
);
var ttfBuffer = ab2b(
new TTFWriter(opts).write(miniObj)
);
return {
object: miniObj,
buffer: ttfBuffer
};
}
/**
* glyph fontmin plugin
*
* @param {Object} opts opts
* @param {string=} opts.text text
* @param {boolean=} opts.basicText useBasicText
* @param {boolean=} opts.hinting hint
* @param {Function=} opts.use plugin
* @return {Object} stream.Transform instance
* @api public
*/
module.exports = function (opts) {
opts = _.extend({hinting: true, trim: true}, opts);
// prepare subset
var subsetText = util.getSubsetText(opts);
opts.subset = util.string2unicodes(subsetText);
return through.ctor({
objectMode: true
}, function (file, enc, cb) {
// check null
if (file.isNull()) {
cb(null, file);
return;
}
// check stream
if (file.isStream()) {
cb(new Error('Streaming is not supported'));
return;
}
// check ttf
if (!isTtf(file.contents)) {
cb(null, file);
return;
}
try {
// write file buffer
var miniTtf = minifyTtf(
file.ttfObject || file.contents,
opts
);
file.contents = miniTtf.buffer;
file.ttfObject = miniTtf.object;
cb(null, file);
}
catch (err) {
cb(err);
}
});
};