@7polo/kityminder-core
Version:
KityMinder Core Implement
289 lines (254 loc) • 9.87 kB
JavaScript
define(function(require, exports, module) {
var kity = require('../core/kity');
var utils = require('../core/utils');
var Minder = require('../core/minder');
var MinderNode = require('../core/node');
var Command = require('../core/command');
var Module = require('../core/module');
var Renderer = require('../core/render');
/**
* 针对不同系统、不同浏览器、不同字体做居中兼容性处理
* 暂时未增加Linux的处理
*/
var FONT_ADJUST = {
'safari': {
'微软雅黑,Microsoft YaHei': -0.17,
'楷体,楷体_GB2312,SimKai': -0.1,
'隶书, SimLi': -0.1,
'comic sans ms': -0.23,
'impact,chicago': -0.15,
'times new roman': -0.1,
'arial black,avant garde': -0.17,
'default': 0
},
'ie': {
10: {
'微软雅黑,Microsoft YaHei': -0.17,
'comic sans ms': -0.17,
'impact,chicago': -0.08,
'times new roman': 0.04,
'arial black,avant garde': -0.17,
'default': -0.15
},
11: {
'微软雅黑,Microsoft YaHei': -0.17,
'arial,helvetica,sans-serif': -0.17,
'comic sans ms': -0.17,
'impact,chicago': -0.08,
'times new roman': 0.04,
'sans-serif': -0.16,
'arial black,avant garde': -0.17,
'default': -0.15
}
},
'edge': {
'微软雅黑,Microsoft YaHei': -0.15,
'arial,helvetica,sans-serif': -0.17,
'comic sans ms': -0.17,
'impact,chicago': -0.08,
'sans-serif': -0.16,
'arial black,avant garde': -0.17,
'default': -0.15
},
'sg': {
'微软雅黑,Microsoft YaHei': -0.15,
'arial,helvetica,sans-serif': -0.05,
'comic sans ms': -0.22,
'impact,chicago': -0.16,
'times new roman': -0.03,
'arial black,avant garde': -0.22,
'default': -0.15
},
'chrome': {
'Mac': {
'andale mono': -0.05,
'comic sans ms': -0.3,
'impact,chicago': -0.13,
'times new roman': -0.1,
'arial black,avant garde': -0.17,
'default': 0
},
'Win': {
'微软雅黑,Microsoft YaHei': -0.15,
'arial,helvetica,sans-serif': -0.02,
'arial black,avant garde': -0.2,
'comic sans ms': -0.2,
'impact,chicago': -0.12,
'times new roman': -0.02,
'default': -0.15
},
'Lux': {
'andale mono': -0.05,
'comic sans ms': -0.3,
'impact,chicago': -0.13,
'times new roman': -0.1,
'arial black,avant garde': -0.17,
'default': 0
}
},
'firefox': {
'Mac': {
'微软雅黑,Microsoft YaHei': -0.2,
'宋体,SimSun': 0.05,
'comic sans ms': -0.2,
'impact,chicago': -0.15,
'arial black,avant garde': -0.17,
'times new roman': -0.1,
'default': 0.05
},
'Win': {
'微软雅黑,Microsoft YaHei': -0.16,
'andale mono': -0.17,
'arial,helvetica,sans-serif': -0.17,
'comic sans ms': -0.22,
'impact,chicago': -0.23,
'times new roman': -0.22,
'sans-serif': -0.22,
'arial black,avant garde': -0.17,
'default': -0.16
},
'Lux': {
"宋体,SimSun": -0.2,
"微软雅黑,Microsoft YaHei": -0.2,
"黑体, SimHei": -0.2,
"隶书, SimLi": -0.2,
"楷体,楷体_GB2312,SimKai": -0.2,
"andale mono": -0.2,
"arial,helvetica,sans-serif": -0.2,
"comic sans ms": -0.2,
"impact,chicago": -0.2,
"times new roman": -0.2,
"sans-serif": -0.2,
"arial black,avant garde": -0.2,
"default": -0.16
}
},
};
var TextRenderer = kity.createClass('TextRenderer', {
base: Renderer,
create: function() {
return new kity.Group().setId(utils.uuid('node_text'));
},
update: function(textGroup, node) {
function getDataOrStyle(name) {
return node.getData(name) || node.getStyle(name);
}
var nodeText = node.getText();
var textArr = nodeText ? nodeText.split('\n') : [' '];
var lineHeight = node.getStyle('line-height');
var fontSize = getDataOrStyle('font-size');
var fontFamily = getDataOrStyle('font-family') || 'default';
var height = (lineHeight * fontSize) * textArr.length - (lineHeight - 1) * fontSize;
var yStart = -height / 2;
var Browser = kity.Browser;
var adjust;
if (Browser.chrome || Browser.opera || Browser.bd ||Browser.lb === "chrome") {
adjust = FONT_ADJUST['chrome'][Browser.platform][fontFamily];
} else if (Browser.gecko) {
adjust = FONT_ADJUST['firefox'][Browser.platform][fontFamily];
} else if (Browser.sg) {
adjust = FONT_ADJUST['sg'][fontFamily];
} else if (Browser.safari) {
adjust = FONT_ADJUST['safari'][fontFamily];
} else if (Browser.ie) {
adjust = FONT_ADJUST['ie'][Browser.version][fontFamily];
} else if (Browser.edge) {
adjust = FONT_ADJUST['edge'][fontFamily];
} else if (Browser.lb) {
// 猎豹浏览器的ie内核兼容性模式下
adjust = 0.9;
}
textGroup.setTranslate(0, (adjust || 0) * fontSize);
var rBox = new kity.Box(),
r = Math.round;
this.setTextStyle(node, textGroup);
var textLength = textArr.length;
var textGroupLength = textGroup.getItems().length;
var i, ci, textShape, text;
if (textLength < textGroupLength) {
for (i = textLength, ci; ci = textGroup.getItem(i);) {
textGroup.removeItem(i);
}
} else if (textLength > textGroupLength) {
var growth = textLength - textGroupLength;
while (growth--) {
textShape = new kity.Text()
.setAttr('text-rendering', 'inherit');
if (kity.Browser.ie || kity.Browser.edge) {
textShape.setVerticalAlign('top');
} else {
textShape.setAttr('dominant-baseline', 'text-before-edge');
}
textGroup.addItem(textShape);
}
}
for (i = 0, text, textShape;
(text = textArr[i], textShape = textGroup.getItem(i)); i++) {
textShape.setContent(text);
if (kity.Browser.ie || kity.Browser.edge) {
textShape.fixPosition();
}
}
this.setTextStyle(node, textGroup);
var textHash = node.getText() +
['font-size', 'font-name', 'font-weight', 'font-style'].map(getDataOrStyle).join('/');
if (node._currentTextHash == textHash && node._currentTextGroupBox) return node._currentTextGroupBox;
node._currentTextHash = textHash;
return function() {
textGroup.eachItem(function(i, textShape) {
var y = yStart + i * fontSize * lineHeight;
textShape.setY(y);
var bbox = textShape.getBoundaryBox();
rBox = rBox.merge(new kity.Box(0, y, bbox.height && bbox.width || 1, fontSize));
});
var nBox = new kity.Box(r(rBox.x), r(rBox.y), r(rBox.width), r(rBox.height));
node._currentTextGroupBox = nBox;
return nBox;
};
},
setTextStyle: function(node, text) {
var hooks = TextRenderer._styleHooks;
hooks.forEach(function(hook) {
hook(node, text);
});
}
});
var TextCommand = kity.createClass({
base: Command,
execute: function(minder, text) {
var node = minder.getSelectedNode();
if (node) {
node.setText(text);
node.render();
minder.layout();
}
},
queryState: function(minder) {
return minder.getSelectedNodes().length == 1 ? 0 : -1;
},
queryValue: function(minder) {
var node = minder.getSelectedNode();
return node ? node.getText() : null;
}
});
utils.extend(TextRenderer, {
_styleHooks: [],
registerStyleHook: function(fn) {
TextRenderer._styleHooks.push(fn);
}
});
kity.extendClass(MinderNode, {
getTextGroup: function() {
return this.getRenderer('TextRenderer').getRenderShape();
}
});
Module.register('text', {
'commands': {
'text': TextCommand
},
'renderers': {
center: TextRenderer
}
});
module.exports = TextRenderer;
});