html2canvas
Version:
Screenshots with JavaScript
87 lines (65 loc) • 3.26 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.FontMetrics = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Util = require('./Util');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var SAMPLE_TEXT = 'Hidden Text';
var FontMetrics = exports.FontMetrics = function () {
function FontMetrics(document) {
_classCallCheck(this, FontMetrics);
this._data = {};
this._document = document;
}
_createClass(FontMetrics, [{
key: '_parseMetrics',
value: function _parseMetrics(font) {
var container = this._document.createElement('div');
var img = this._document.createElement('img');
var span = this._document.createElement('span');
var body = this._document.body;
if (!body) {
throw new Error(process.env.NODE_ENV !== 'production' ? 'No document found for font metrics' : '');
}
container.style.visibility = 'hidden';
container.style.fontFamily = font.fontFamily;
container.style.fontSize = font.fontSize;
container.style.margin = '0';
container.style.padding = '0';
body.appendChild(container);
img.src = _Util.SMALL_IMAGE;
img.width = 1;
img.height = 1;
img.style.margin = '0';
img.style.padding = '0';
img.style.verticalAlign = 'baseline';
span.style.fontFamily = font.fontFamily;
span.style.fontSize = font.fontSize;
span.style.margin = '0';
span.style.padding = '0';
span.appendChild(this._document.createTextNode(SAMPLE_TEXT));
container.appendChild(span);
container.appendChild(img);
var baseline = img.offsetTop - span.offsetTop + 2;
container.removeChild(span);
container.appendChild(this._document.createTextNode(SAMPLE_TEXT));
container.style.lineHeight = 'normal';
img.style.verticalAlign = 'super';
var middle = img.offsetTop - container.offsetTop + 2;
body.removeChild(container);
return { baseline: baseline, middle: middle };
}
}, {
key: 'getMetrics',
value: function getMetrics(font) {
var key = font.fontFamily + ' ' + font.fontSize;
if (this._data[key] === undefined) {
this._data[key] = this._parseMetrics(font);
}
return this._data[key];
}
}]);
return FontMetrics;
}();
;