| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- 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;
- });
|