UNPKG

kityminder

Version:
125 lines (93 loc) 3.62 kB
/* global Renderer: true */ var FONT_ADJUST = { '微软雅黑,Microsoft YaHei': -0.15, 'arial black,avant garde': -0.17, 'default': -0.15 }; var TextRenderer = KityMinder.TextRenderer = kity.createClass('TextRenderer', { base: Renderer, create: function() { return new kity.Group().setId(KityMinder.uuid('node_text')); }, update: function(textGroup, node) { function s(name) { return node.getData(name) || node.getStyle(name); } var textArr = node.getText(true); var lineHeight = node.getStyle('line-height'); var fontSize = s('font-size'); var fontFamily = s('font-family') || 'default'; var height = (lineHeight * fontSize) * textArr.length - (lineHeight - 1) * fontSize; var yStart = -height / 2; var adjust = FONT_ADJUST[fontFamily] || 0; textGroup.setTranslate(0, adjust * fontSize); var rBox = new kity.Box(), r = Math.round; this.setTextStyle(node, textGroup); var textLength = textArr.length; var textGroupLength = textGroup.getItems().length; if(textLength < textGroupLength){ for( var i = textLength,ci;ci = textGroup.getItem(i);){ textGroup.removeItem(i); } }else if(textLength > textGroupLength){ var length = textLength - textGroupLength; for(var i = 0;i < length;i++){ var textShape = new kity.Text() .setAttr('text-rendering', 'inherit'); if (kity.Browser.ie) { textShape.setVerticalAlign('top'); } else { textShape.setAttr('dominant-baseline', 'text-before-edge'); } textGroup.addItem(textShape); } } for (var i = 0, text, textShape; (text = textArr[i], textShape = textGroup.getItem(i)); i++) { textShape.setContent(text); } this.setTextStyle(node, textGroup); var textHash = node.getText() + [s('font-size'), s('font-name'), s('font-weight'), s('font-style')].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); rBox = rBox.merge(new kity.Box(0, y, textShape.getBoundaryBox().width || 1, fontSize)); }); //为了让文字在圆中垂直居中 var w = 0; var shape = node.getStyle('shape'); if(shape && shape=='circle'){ w = Math.max(rBox.width,rBox.height)/2-rBox.height/2; } var nBox = new kity.Box(r(rBox.x), r(rBox.y-w), 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); }); } }); utils.extend(TextRenderer, { _styleHooks: [], registerStyleHook: function(fn) { TextRenderer._styleHooks.push(fn); } }); kity.extendClass(MinderNode, { getTextGroup: function() { return this.getRenderer('TextRenderer').getRenderShape(); } }); KityMinder.registerModule('text', { 'renderers': { center: TextRenderer } });