text.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. define(function(require, exports, module) {
  2. var kity = require('../core/kity');
  3. var utils = require('../core/utils');
  4. var Minder = require('../core/minder');
  5. var MinderNode = require('../core/node');
  6. var Command = require('../core/command');
  7. var Module = require('../core/module');
  8. var Renderer = require('../core/render');
  9. /**
  10. * 针对不同系统、不同浏览器、不同字体做居中兼容性处理
  11. * 暂时未增加Linux的处理
  12. */
  13. var FONT_ADJUST = {
  14. 'safari': {
  15. '微软雅黑,Microsoft YaHei': -0.17,
  16. '楷体,楷体_GB2312,SimKai': -0.1,
  17. '隶书, SimLi': -0.1,
  18. 'comic sans ms': -0.23,
  19. 'impact,chicago': -0.15,
  20. 'times new roman': -0.1,
  21. 'arial black,avant garde': -0.17,
  22. 'default': 0
  23. },
  24. 'ie': {
  25. 10: {
  26. '微软雅黑,Microsoft YaHei': -0.17,
  27. 'comic sans ms': -0.17,
  28. 'impact,chicago': -0.08,
  29. 'times new roman': 0.04,
  30. 'arial black,avant garde': -0.17,
  31. 'default': -0.15
  32. },
  33. 11: {
  34. '微软雅黑,Microsoft YaHei': -0.17,
  35. 'arial,helvetica,sans-serif': -0.17,
  36. 'comic sans ms': -0.17,
  37. 'impact,chicago': -0.08,
  38. 'times new roman': 0.04,
  39. 'sans-serif': -0.16,
  40. 'arial black,avant garde': -0.17,
  41. 'default': -0.15
  42. }
  43. },
  44. 'edge': {
  45. '微软雅黑,Microsoft YaHei': -0.15,
  46. 'arial,helvetica,sans-serif': -0.17,
  47. 'comic sans ms': -0.17,
  48. 'impact,chicago': -0.08,
  49. 'sans-serif': -0.16,
  50. 'arial black,avant garde': -0.17,
  51. 'default': -0.15
  52. },
  53. 'sg': {
  54. '微软雅黑,Microsoft YaHei': -0.15,
  55. 'arial,helvetica,sans-serif': -0.05,
  56. 'comic sans ms': -0.22,
  57. 'impact,chicago': -0.16,
  58. 'times new roman': -0.03,
  59. 'arial black,avant garde': -0.22,
  60. 'default': -0.15
  61. },
  62. 'chrome': {
  63. 'Mac': {
  64. 'andale mono': -0.05,
  65. 'comic sans ms': -0.3,
  66. 'impact,chicago': -0.13,
  67. 'times new roman': -0.1,
  68. 'arial black,avant garde': -0.17,
  69. 'default': 0
  70. },
  71. 'Win': {
  72. '微软雅黑,Microsoft YaHei': -0.15,
  73. 'arial,helvetica,sans-serif': -0.02,
  74. 'arial black,avant garde': -0.2,
  75. 'comic sans ms': -0.2,
  76. 'impact,chicago': -0.12,
  77. 'times new roman': -0.02,
  78. 'default': -0.15
  79. },
  80. 'Lux': {
  81. 'andale mono': -0.05,
  82. 'comic sans ms': -0.3,
  83. 'impact,chicago': -0.13,
  84. 'times new roman': -0.1,
  85. 'arial black,avant garde': -0.17,
  86. 'default': 0
  87. }
  88. },
  89. 'firefox': {
  90. 'Mac': {
  91. '微软雅黑,Microsoft YaHei': -0.2,
  92. '宋体,SimSun': 0.05,
  93. 'comic sans ms': -0.2,
  94. 'impact,chicago': -0.15,
  95. 'arial black,avant garde': -0.17,
  96. 'times new roman': -0.1,
  97. 'default': 0.05
  98. },
  99. 'Win': {
  100. '微软雅黑,Microsoft YaHei': -0.16,
  101. 'andale mono': -0.17,
  102. 'arial,helvetica,sans-serif': -0.17,
  103. 'comic sans ms': -0.22,
  104. 'impact,chicago': -0.23,
  105. 'times new roman': -0.22,
  106. 'sans-serif': -0.22,
  107. 'arial black,avant garde': -0.17,
  108. 'default': -0.16
  109. },
  110. 'Lux': {
  111. "宋体,SimSun": -0.2,
  112. "微软雅黑,Microsoft YaHei": -0.2,
  113. "黑体, SimHei": -0.2,
  114. "隶书, SimLi": -0.2,
  115. "楷体,楷体_GB2312,SimKai": -0.2,
  116. "andale mono": -0.2,
  117. "arial,helvetica,sans-serif": -0.2,
  118. "comic sans ms": -0.2,
  119. "impact,chicago": -0.2,
  120. "times new roman": -0.2,
  121. "sans-serif": -0.2,
  122. "arial black,avant garde": -0.2,
  123. "default": -0.16
  124. }
  125. },
  126. };
  127. var TextRenderer = kity.createClass('TextRenderer', {
  128. base: Renderer,
  129. create: function() {
  130. return new kity.Group().setId(utils.uuid('node_text'));
  131. },
  132. update: function(textGroup, node) {
  133. function getDataOrStyle(name) {
  134. return node.getData(name) || node.getStyle(name);
  135. }
  136. var nodeText = node.getText();
  137. var textArr = nodeText ? nodeText.split('\n') : [' '];
  138. var lineHeight = node.getStyle('line-height');
  139. var fontSize = getDataOrStyle('font-size');
  140. var fontFamily = getDataOrStyle('font-family') || 'default';
  141. var height = (lineHeight * fontSize) * textArr.length - (lineHeight - 1) * fontSize;
  142. var yStart = -height / 2;
  143. var Browser = kity.Browser;
  144. var adjust;
  145. if (Browser.chrome || Browser.opera || Browser.bd ||Browser.lb === "chrome") {
  146. adjust = FONT_ADJUST['chrome'][Browser.platform][fontFamily];
  147. } else if (Browser.gecko) {
  148. adjust = FONT_ADJUST['firefox'][Browser.platform][fontFamily];
  149. } else if (Browser.sg) {
  150. adjust = FONT_ADJUST['sg'][fontFamily];
  151. } else if (Browser.safari) {
  152. adjust = FONT_ADJUST['safari'][fontFamily];
  153. } else if (Browser.ie) {
  154. adjust = FONT_ADJUST['ie'][Browser.version][fontFamily];
  155. } else if (Browser.edge) {
  156. adjust = FONT_ADJUST['edge'][fontFamily];
  157. } else if (Browser.lb) {
  158. // 猎豹浏览器的ie内核兼容性模式下
  159. adjust = 0.9;
  160. }
  161. textGroup.setTranslate(0, (adjust || 0) * fontSize);
  162. var rBox = new kity.Box(),
  163. r = Math.round;
  164. this.setTextStyle(node, textGroup);
  165. var textLength = textArr.length;
  166. var textGroupLength = textGroup.getItems().length;
  167. var i, ci, textShape, text;
  168. if (textLength < textGroupLength) {
  169. for (i = textLength, ci; ci = textGroup.getItem(i);) {
  170. textGroup.removeItem(i);
  171. }
  172. } else if (textLength > textGroupLength) {
  173. var growth = textLength - textGroupLength;
  174. while (growth--) {
  175. textShape = new kity.Text()
  176. .setAttr('text-rendering', 'inherit');
  177. if (kity.Browser.ie || kity.Browser.edge) {
  178. textShape.setVerticalAlign('top');
  179. } else {
  180. textShape.setAttr('dominant-baseline', 'text-before-edge');
  181. }
  182. textGroup.addItem(textShape);
  183. }
  184. }
  185. for (i = 0, text, textShape;
  186. (text = textArr[i], textShape = textGroup.getItem(i)); i++) {
  187. textShape.setContent(text);
  188. if (kity.Browser.ie || kity.Browser.edge) {
  189. textShape.fixPosition();
  190. }
  191. }
  192. this.setTextStyle(node, textGroup);
  193. var textHash = node.getText() +
  194. ['font-size', 'font-name', 'font-weight', 'font-style'].map(getDataOrStyle).join('/');
  195. if (node._currentTextHash == textHash && node._currentTextGroupBox) return node._currentTextGroupBox;
  196. node._currentTextHash = textHash;
  197. return function() {
  198. textGroup.eachItem(function(i, textShape) {
  199. var y = yStart + i * fontSize * lineHeight;
  200. textShape.setY(y);
  201. var bbox = textShape.getBoundaryBox();
  202. rBox = rBox.merge(new kity.Box(0, y, bbox.height && bbox.width || 1, fontSize));
  203. });
  204. var nBox = new kity.Box(r(rBox.x), r(rBox.y), r(rBox.width), r(rBox.height));
  205. node._currentTextGroupBox = nBox;
  206. return nBox;
  207. };
  208. },
  209. setTextStyle: function(node, text) {
  210. var hooks = TextRenderer._styleHooks;
  211. hooks.forEach(function(hook) {
  212. hook(node, text);
  213. });
  214. }
  215. });
  216. var TextCommand = kity.createClass({
  217. base: Command,
  218. execute: function(minder, text) {
  219. var node = minder.getSelectedNode();
  220. if (node) {
  221. node.setText(text);
  222. node.render();
  223. minder.layout();
  224. }
  225. },
  226. queryState: function(minder) {
  227. return minder.getSelectedNodes().length == 1 ? 0 : -1;
  228. },
  229. queryValue: function(minder) {
  230. var node = minder.getSelectedNode();
  231. return node ? node.getText() : null;
  232. }
  233. });
  234. utils.extend(TextRenderer, {
  235. _styleHooks: [],
  236. registerStyleHook: function(fn) {
  237. TextRenderer._styleHooks.push(fn);
  238. }
  239. });
  240. kity.extendClass(MinderNode, {
  241. getTextGroup: function() {
  242. return this.getRenderer('TextRenderer').getRenderShape();
  243. }
  244. });
  245. Module.register('text', {
  246. 'commands': {
  247. 'text': TextCommand
  248. },
  249. 'renderers': {
  250. center: TextRenderer
  251. }
  252. });
  253. module.exports = TextRenderer;
  254. });