|
@@ -2,6 +2,8 @@ var debug = require('debug')('ylt:fontAnalyzer');
|
|
|
|
|
|
var Q = require('q');
|
|
|
var fontkit = require('fontkit');
|
|
|
+var woffTools = require('woff-tools');
|
|
|
+var ttf2woff2 = require('ttf2woff2');
|
|
|
|
|
|
var FontAnalyzer = function() {
|
|
|
|
|
@@ -19,25 +21,100 @@ var FontAnalyzer = function() {
|
|
|
if (entry.isWebFont) {
|
|
|
debug('File %s is a font. Let\'s have a look inside!', entry.url);
|
|
|
|
|
|
- getMetricsFromFont(entry, charsListOnPage)
|
|
|
+ convertToWoff2(entry)
|
|
|
+
|
|
|
+ .then(function(entry) {
|
|
|
+ return getMetricsFromFont(entry, charsListOnPage);
|
|
|
+ })
|
|
|
|
|
|
.then(function(fontMetrics) {
|
|
|
entry.fontMetrics = fontMetrics;
|
|
|
- deferred.resolve(entry);
|
|
|
})
|
|
|
|
|
|
.fail(function(error) {
|
|
|
debug('Could not open the font: %s', error);
|
|
|
- deferred.resolve(entry);
|
|
|
});
|
|
|
|
|
|
+ }
|
|
|
+
|
|
|
+ deferred.resolve(entry);
|
|
|
+
|
|
|
+ return deferred.promise;
|
|
|
+ }
|
|
|
+
|
|
|
+ function convertToWoff2(entry) {
|
|
|
+ var deferred = Q.defer();
|
|
|
+
|
|
|
+ debug('Entering font format converter...');
|
|
|
+
|
|
|
+ if (entry.isWoff2) {
|
|
|
+
|
|
|
+ debug('File is already a woff2.');
|
|
|
+ deferred.resolve(entry);
|
|
|
+
|
|
|
+ } else if (entry.isWoff) {
|
|
|
+
|
|
|
+ debug('File is a woff. Let\'s convert to woff2');
|
|
|
+
|
|
|
+ try {
|
|
|
+
|
|
|
+ var fileSize = entry.weightCheck.bodySize;
|
|
|
+ debug('Current file size is %d', fileSize);
|
|
|
+
|
|
|
+ var ttf = woffTools.toSfnt(entry.weightCheck.bodyBuffer);
|
|
|
+ var woff2 = ttf2woff2(ttf);
|
|
|
+
|
|
|
+ var newFileSize = woff2.length;
|
|
|
+
|
|
|
+ debug('New image size is %d', newFileSize);
|
|
|
+ debug('Filesize is %d bytes smaller (-%d%)', fileSize - newFileSize, Math.round((fileSize - newFileSize) * 100 / fileSize));
|
|
|
+ entry.weightCheck.sizeAsWoff2 = newFileSize;
|
|
|
+
|
|
|
+ deferred.resolve(entry);
|
|
|
+
|
|
|
+ } catch(error) {
|
|
|
+ deferred.reject(error);
|
|
|
+ }
|
|
|
+
|
|
|
+ } else if (entry.isTtf) {
|
|
|
+
|
|
|
+ debug('File is a TTF. Let\'s convert to woff2');
|
|
|
+
|
|
|
+ try {
|
|
|
+
|
|
|
+ var fileSize = entry.weightCheck.bodySize;
|
|
|
+ debug('Current file size is %d', fileSize);
|
|
|
+
|
|
|
+ var woff2 = ttf2woff2(entry.weightCheck.bodyBuffer);
|
|
|
+
|
|
|
+ var newFileSize = woff2.length;
|
|
|
+
|
|
|
+ debug('New image size is %d', newFileSize);
|
|
|
+ debug('Filesize is %d bytes smaller (-%d%)', fileSize - newFileSize, Math.round((fileSize - newFileSize) * 100 / fileSize));
|
|
|
+ entry.weightCheck.sizeAsWoff2 = newFileSize;
|
|
|
+
|
|
|
+ deferred.resolve(entry);
|
|
|
+
|
|
|
+ } catch(error) {
|
|
|
+ deferred.reject(error);
|
|
|
+ }
|
|
|
+
|
|
|
} else {
|
|
|
+ // Other font formats are not handled
|
|
|
deferred.resolve(entry);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return deferred.promise;
|
|
|
}
|
|
|
|
|
|
+ // The gain is estimated of enough value if it's over 1KB or over 20%,
|
|
|
+ // but it's ignored if is below 100 bytes
|
|
|
+ function gainIsEnough(oldWeight, newWeight) {
|
|
|
+ var gain = oldWeight - newWeight;
|
|
|
+ var ratio = gain / oldWeight;
|
|
|
+ return (gain > 2048 || (ratio > 0.2 && gain > 100));
|
|
|
+ }
|
|
|
+
|
|
|
function getMetricsFromFont(entry, charsListOnPage) {
|
|
|
var deferred = Q.defer();
|
|
|
|