76 lines
2.4 KiB
JavaScript
76 lines
2.4 KiB
JavaScript
var Class = require('../../core/class');
|
|
var Base = require('./base');
|
|
var Modulizer = require('./modulizer');
|
|
var fonts = {}, fontsInUse = null;
|
|
|
|
var artVar = Base.prototype.artVar, artFont = artVar.property('Font');
|
|
|
|
var parseFontString = function(font){
|
|
var regexp = /^\s*((?:(?:normal|bold|italic)\s+)*)(?:(\d+(?:\.\d+)?)[ptexm\%]*(?:\s*\/.*?)?\s+)?\s*\"?([^\"]*)/i,
|
|
match = regexp.exec(font);
|
|
return {
|
|
fontFamily: match[3],
|
|
fontSize: match[2],
|
|
fontStyle: (/italic/.exec(match[1]) || ''),
|
|
fontWeight: (/bold/.exec(match[1]) || '')
|
|
};
|
|
};
|
|
|
|
var Font = Class(Base, {
|
|
|
|
base_initialize: Base.prototype.initialize,
|
|
|
|
initialize: function(text, font, alignment){
|
|
this.base_initialize();
|
|
if (text != null && font != null) this.draw(text, font, alignment);
|
|
},
|
|
|
|
draw: function(text, fontArg, alignment){
|
|
var font = (typeof fontArg == 'string') ? parseFontString(fontArg) : fontArg;
|
|
if (font){
|
|
var family = font.fontFamily || font['font-family'],
|
|
weight = font.fontWeight || font['font-weight'] || 'normal',
|
|
style = font.fontStyle || font['font-style'] || 'normal',
|
|
size = parseFloat(font.fontSize || font['font-size'] || font.size);
|
|
|
|
this.font = font.glyphs ? null : weight + style + family;
|
|
}
|
|
this.args = Array.prototype.slice.call(arguments);
|
|
return this;
|
|
},
|
|
|
|
base_toExpression: Base.prototype.toExpression,
|
|
|
|
toExpression: function(expr){
|
|
if (this.font && fontsInUse) fontsInUse[this.font] = fonts[this.font];
|
|
if (!expr) expr = this.args ? artFont.construct.apply(artFont, this.args) : artFont.construct();
|
|
return this.base_toExpression(expr);
|
|
}
|
|
|
|
});
|
|
|
|
Font.register = function(font){
|
|
var face = font.face,
|
|
family = face['font-family'],
|
|
weight = (face['font-weight'] > 500 ? 'bold' : 'normal'),
|
|
style = (face['font-stretch'] == 'oblique' || face['font-style'] == 'oblique' || face['font-style'] == 'italic' ? 'italic' : 'normal');
|
|
fonts[weight + style + family] = font;
|
|
return this;
|
|
};
|
|
|
|
var _toModuleStatements = Modulizer._toModuleStatements;
|
|
|
|
Modulizer._toModuleStatements = function(){
|
|
fontsInUse = {};
|
|
var statements = _toModuleStatements.call(this);
|
|
for (var font in fontsInUse){
|
|
var registerStatement = artFont.property('register').call(fontsInUse[font]);
|
|
statements.push(registerStatement);
|
|
}
|
|
statements.push(statements[1]);
|
|
statements.splice(1, 1);
|
|
fontsInUse = null;
|
|
return statements;
|
|
};
|
|
|
|
module.exports = Font; |