text: 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 TextRenderer = require('./text');
  
      function getNodeDataOrStyle(node, name) {
          return node.getData(name) || node.getStyle(name);
      }
  
      TextRenderer.registerStyleHook(function(node, textGroup) {
          var dataColor = node.getData('color');
          var selectedColor = node.getStyle('selected-color');
          var styleColor = node.getStyle('color');
  
          var foreColor = dataColor || (node.isSelected() && selectedColor ? selectedColor : styleColor);
          var fontFamily = getNodeDataOrStyle(node, 'font-family');
          var fontSize = getNodeDataOrStyle(node, 'font-size');
  
          textGroup.fill(foreColor);
  
          textGroup.eachItem(function(index, item) {
              item.setFont({
                  'family': fontFamily,
                  'size': fontSize
              });
          });
      });
  
  
      Module.register('fontmodule', {
          'commands': {
              /**
               * @command ForeColor
               * @description 设置选中节点的字体颜色
               * @param {string} color 表示颜色的字符串
               * @state
               *   0: 当前有选中的节点
               *  -1: 当前没有选中的节点
               * @return 如果只有一个节点选中，返回已选中节点的字体颜色；否则返回 'mixed'。
               */
              'forecolor': kity.createClass('fontcolorCommand', {
                  base: Command,
                  execute: function(km, color) {
                      var nodes = km.getSelectedNodes();
                      nodes.forEach(function(n) {
                          n.setData('color', color);
                          n.render();
                      });
                  },
                  queryState: function(km) {
                      return km.getSelectedNodes().length === 0 ? -1 : 0;
                  },
                  queryValue: function(km) {
                      if (km.getSelectedNodes().length == 1) {
                          return km.getSelectedNodes()[0].getData('color');
                      }
                      return 'mixed';
                  }
              }),
  
              /**
               * @command Background
               * @description 设置选中节点的背景颜色
               * @param {string} color 表示颜色的字符串
               * @state
               *   0: 当前有选中的节点
               *  -1: 当前没有选中的节点
               * @return 如果只有一个节点选中，返回已选中节点的背景颜色；否则返回 'mixed'。
               */
              'background': kity.createClass('backgroudCommand', {
                  base: Command,
  
                  execute: function(km, color) {
                      var nodes = km.getSelectedNodes();
                      nodes.forEach(function(n) {
                          n.setData('background', color);
                          n.render();
                      });
                  },
                  queryState: function(km) {
                      return km.getSelectedNodes().length === 0 ? -1 : 0;
                  },
                  queryValue: function(km) {
                      if (km.getSelectedNodes().length == 1) {
                          return km.getSelectedNodes()[0].getData('background');
                      }
                      return 'mixed';
                  }
              }),
  
  
              /**
               * @command FontFamily
               * @description 设置选中节点的字体
               * @param {string} family 表示字体的字符串
               * @state
               *   0: 当前有选中的节点
               *  -1: 当前没有选中的节点
               * @return 返回首个选中节点的字体
               */
              'fontfamily': kity.createClass('fontfamilyCommand', {
                  base: Command,
  
                  execute: function(km, family) {
                      var nodes = km.getSelectedNodes();
                      nodes.forEach(function(n) {
                          n.setData('font-family', family);
                          n.render();
                          km.layout();
                      });
                  },
                  queryState: function(km) {
                      return km.getSelectedNodes().length === 0 ? -1 : 0;
                  },
                  queryValue: function(km) {
                      var node = km.getSelectedNode();
                      if (node) return node.getData('font-family');
                      return null;
                  }
              }),
  
               /**
               * @command FontSize
               * @description 设置选中节点的字体大小
               * @param {number} size 字体大小（px）
               * @state
               *   0: 当前有选中的节点
               *  -1: 当前没有选中的节点
               * @return 返回首个选中节点的字体大小
               */
              'fontsize': kity.createClass('fontsizeCommand', {
                  base: Command,
  
                  execute: function(km, size) {
                      var nodes = km.getSelectedNodes();
                      nodes.forEach(function(n) {
                          n.setData('font-size', size);
                          n.render();
                          km.layout(300);
                      });
                  },
                  queryState: function(km) {
                      return km.getSelectedNodes().length === 0 ? -1 : 0;
                  },
                  queryValue: function(km) {
                      var node = km.getSelectedNode();
                      if (node) return node.getData('font-size');
                      return null;
                  }
              })
          }
      });
  });