ueditor.parse.js 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015
  1. /*!
  2. * UEditor
  3. * version: 1.3.6
  4. * build: Wed Dec 25 2013 12:38:56 GMT+0800 (中国标准时间)
  5. */
  6. (function(){
  7. (function(){
  8. UE = window.UE || {};
  9. var isIE = !!window.ActiveXObject;
  10. //定义utils工具
  11. var utils = {
  12. removeLastbs : function(url){
  13. return url.replace(/\/$/,'')
  14. },
  15. extend : function(t,s){
  16. var a = arguments,
  17. notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false,
  18. len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length;
  19. for (var i = 1; i < len; i++) {
  20. var x = a[i];
  21. for (var k in x) {
  22. if (!notCover || !t.hasOwnProperty(k)) {
  23. t[k] = x[k];
  24. }
  25. }
  26. }
  27. return t;
  28. },
  29. isIE : isIE,
  30. cssRule : isIE ? function(key,style,doc){
  31. var indexList,index;
  32. doc = doc || document;
  33. if(doc.indexList){
  34. indexList = doc.indexList;
  35. }else{
  36. indexList = doc.indexList = {};
  37. }
  38. var sheetStyle;
  39. if(!indexList[key]){
  40. if(style === undefined){
  41. return ''
  42. }
  43. sheetStyle = doc.createStyleSheet('',index = doc.styleSheets.length);
  44. indexList[key] = index;
  45. }else{
  46. sheetStyle = doc.styleSheets[indexList[key]];
  47. }
  48. if(style === undefined){
  49. return sheetStyle.cssText
  50. }
  51. sheetStyle.cssText = sheetStyle.cssText + '\n' + (style || '')
  52. } : function(key,style,doc){
  53. doc = doc || document;
  54. var head = doc.getElementsByTagName('head')[0],node;
  55. if(!(node = doc.getElementById(key))){
  56. if(style === undefined){
  57. return ''
  58. }
  59. node = doc.createElement('style');
  60. node.id = key;
  61. head.appendChild(node)
  62. }
  63. if(style === undefined){
  64. return node.innerHTML
  65. }
  66. if(style !== ''){
  67. node.innerHTML = node.innerHTML + '\n' + style;
  68. }else{
  69. head.removeChild(node)
  70. }
  71. },
  72. domReady : function (onready) {
  73. var doc = window.document;
  74. if (doc.readyState === "complete") {
  75. onready();
  76. }else{
  77. if (isIE) {
  78. (function () {
  79. if (doc.isReady) return;
  80. try {
  81. doc.documentElement.doScroll("left");
  82. } catch (error) {
  83. setTimeout(arguments.callee, 0);
  84. return;
  85. }
  86. onready();
  87. })();
  88. window.attachEvent('onload', function(){
  89. onready()
  90. });
  91. } else {
  92. doc.addEventListener("DOMContentLoaded", function () {
  93. doc.removeEventListener("DOMContentLoaded", arguments.callee, false);
  94. onready();
  95. }, false);
  96. window.addEventListener('load', function(){onready()}, false);
  97. }
  98. }
  99. },
  100. each : function(obj, iterator, context) {
  101. if (obj == null) return;
  102. if (obj.length === +obj.length) {
  103. for (var i = 0, l = obj.length; i < l; i++) {
  104. if(iterator.call(context, obj[i], i, obj) === false)
  105. return false;
  106. }
  107. } else {
  108. for (var key in obj) {
  109. if (obj.hasOwnProperty(key)) {
  110. if(iterator.call(context, obj[key], key, obj) === false)
  111. return false;
  112. }
  113. }
  114. }
  115. },
  116. inArray : function(arr,item){
  117. var index = -1;
  118. this.each(arr,function(v,i){
  119. if(v === item){
  120. index = i;
  121. return false;
  122. }
  123. });
  124. return index;
  125. },
  126. pushItem : function(arr,item){
  127. if(this.inArray(arr,item)==-1){
  128. arr.push(item)
  129. }
  130. },
  131. trim: function (str) {
  132. return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, '');
  133. },
  134. indexOf: function (array, item, start) {
  135. var index = -1;
  136. start = this.isNumber(start) ? start : 0;
  137. this.each(array, function (v, i) {
  138. if (i >= start && v === item) {
  139. index = i;
  140. return false;
  141. }
  142. });
  143. return index;
  144. },
  145. hasClass: function (element, className) {
  146. className = className.replace(/(^[ ]+)|([ ]+$)/g, '').replace(/[ ]{2,}/g, ' ').split(' ');
  147. for (var i = 0, ci, cls = element.className; ci = className[i++];) {
  148. if (!new RegExp('\\b' + ci + '\\b', 'i').test(cls)) {
  149. return false;
  150. }
  151. }
  152. return i - 1 == className.length;
  153. },
  154. addClass:function (elm, classNames) {
  155. if(!elm)return;
  156. classNames = this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' ');
  157. for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){
  158. if(!new RegExp('\\b' + ci + '\\b').test(cls)){
  159. cls += ' ' + ci;
  160. }
  161. }
  162. elm.className = utils.trim(cls);
  163. },
  164. removeClass:function (elm, classNames) {
  165. classNames = this.isArray(classNames) ? classNames :
  166. this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' ');
  167. for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){
  168. cls = cls.replace(new RegExp('\\b' + ci + '\\b'),'')
  169. }
  170. cls = this.trim(cls).replace(/[ ]{2,}/g,' ');
  171. elm.className = cls;
  172. !cls && elm.removeAttribute('className');
  173. },
  174. on: function (element, type, handler) {
  175. var types = this.isArray(type) ? type : type.split(/\s+/),
  176. k = types.length;
  177. if (k) while (k--) {
  178. type = types[k];
  179. if (element.addEventListener) {
  180. element.addEventListener(type, handler, false);
  181. } else {
  182. if (!handler._d) {
  183. handler._d = {
  184. els : []
  185. };
  186. }
  187. var key = type + handler.toString(),index = utils.indexOf(handler._d.els,element);
  188. if (!handler._d[key] || index == -1) {
  189. if(index == -1){
  190. handler._d.els.push(element);
  191. }
  192. if(!handler._d[key]){
  193. handler._d[key] = function (evt) {
  194. return handler.call(evt.srcElement, evt || window.event);
  195. };
  196. }
  197. element.attachEvent('on' + type, handler._d[key]);
  198. }
  199. }
  200. }
  201. element = null;
  202. },
  203. off: function (element, type, handler) {
  204. var types = this.isArray(type) ? type : type.split(/\s+/),
  205. k = types.length;
  206. if (k) while (k--) {
  207. type = types[k];
  208. if (element.removeEventListener) {
  209. element.removeEventListener(type, handler, false);
  210. } else {
  211. var key = type + handler.toString();
  212. try{
  213. element.detachEvent('on' + type, handler._d ? handler._d[key] : handler);
  214. }catch(e){}
  215. if (handler._d && handler._d[key]) {
  216. var index = utils.indexOf(handler._d.els,element);
  217. if(index!=-1){
  218. handler._d.els.splice(index,1);
  219. }
  220. handler._d.els.length == 0 && delete handler._d[key];
  221. }
  222. }
  223. }
  224. },
  225. loadFile : function () {
  226. var tmpList = [];
  227. function getItem(doc,obj){
  228. try{
  229. for(var i= 0,ci;ci=tmpList[i++];){
  230. if(ci.doc === doc && ci.url == (obj.src || obj.href)){
  231. return ci;
  232. }
  233. }
  234. }catch(e){
  235. return null;
  236. }
  237. }
  238. return function (doc, obj, fn) {
  239. var item = getItem(doc,obj);
  240. if (item) {
  241. if(item.ready){
  242. fn && fn();
  243. }else{
  244. item.funs.push(fn)
  245. }
  246. return;
  247. }
  248. tmpList.push({
  249. doc:doc,
  250. url:obj.src||obj.href,
  251. funs:[fn]
  252. });
  253. if (!doc.body) {
  254. var html = [];
  255. for(var p in obj){
  256. if(p == 'tag')continue;
  257. html.push(p + '="' + obj[p] + '"')
  258. }
  259. doc.write('<' + obj.tag + ' ' + html.join(' ') + ' ></'+obj.tag+'>');
  260. return;
  261. }
  262. if (obj.id && doc.getElementById(obj.id)) {
  263. return;
  264. }
  265. var element = doc.createElement(obj.tag);
  266. delete obj.tag;
  267. for (var p in obj) {
  268. element.setAttribute(p, obj[p]);
  269. }
  270. element.onload = element.onreadystatechange = function () {
  271. if (!this.readyState || /loaded|complete/.test(this.readyState)) {
  272. item = getItem(doc,obj);
  273. if (item.funs.length > 0) {
  274. item.ready = 1;
  275. for (var fi; fi = item.funs.pop();) {
  276. fi();
  277. }
  278. }
  279. element.onload = element.onreadystatechange = null;
  280. }
  281. };
  282. element.onerror = function(){
  283. throw Error('The load '+(obj.href||obj.src)+' fails,check the url')
  284. };
  285. doc.getElementsByTagName("head")[0].appendChild(element);
  286. }
  287. }()
  288. };
  289. utils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object','Boolean'], function (v) {
  290. utils['is' + v] = function (obj) {
  291. return Object.prototype.toString.apply(obj) == '[object ' + v + ']';
  292. }
  293. });
  294. var parselist = {};
  295. UE.parse = {
  296. register : function(parseName,fn){
  297. parselist[parseName] = fn;
  298. },
  299. load : function(opt){
  300. utils.each(parselist,function(v){
  301. v.call(opt,utils);
  302. })
  303. }
  304. };
  305. uParse = function(selector,opt){
  306. utils.domReady(function(){
  307. var contents;
  308. if(document.querySelectorAll){
  309. contents = document.querySelectorAll(selector)
  310. }else{
  311. if(/^#/.test(selector)){
  312. contents = [document.getElementById(selector.replace(/^#/,''))]
  313. }else if(/^\./.test(selector)){
  314. var contents = [];
  315. utils.each(document.getElementsByTagName('*'),function(node){
  316. if(node.className && new RegExp('\\b' + selector.replace(/^\./,'') + '\\b','i').test(node.className)){
  317. contents.push(node)
  318. }
  319. })
  320. }else{
  321. contents = document.getElementsByTagName(selector)
  322. }
  323. }
  324. utils.each(contents,function(v){
  325. UE.parse.load(utils.extend({root:v,selector:selector},opt))
  326. })
  327. })
  328. }
  329. })();
  330. UE.parse.register('insertcode',function(utils){
  331. var pres = this.root.getElementsByTagName('pre');
  332. if(pres.length){
  333. if(typeof XRegExp == "undefined"){
  334. var jsurl,cssurl;
  335. if(this.rootPath !== undefined){
  336. jsurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCore.js';
  337. cssurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCoreDefault.css';
  338. }else{
  339. jsurl = this.highlightJsUrl;
  340. cssurl = this.highlightCssUrl;
  341. }
  342. utils.loadFile(document,{
  343. id : "syntaxhighlighter_css",
  344. tag : "link",
  345. rel : "stylesheet",
  346. type : "text/css",
  347. href : cssurl
  348. });
  349. utils.loadFile(document,{
  350. id : "syntaxhighlighter_js",
  351. src : jsurl,
  352. tag : "script",
  353. type : "text/javascript",
  354. defer : "defer"
  355. },function(){
  356. utils.each(pres,function(pi){
  357. if(pi && /brush/i.test(pi.className)){
  358. SyntaxHighlighter.highlight(pi);
  359. }
  360. });
  361. });
  362. }
  363. }
  364. });
  365. UE.parse.register('table', function (utils) {
  366. var me = this,
  367. root = this.root,
  368. tables = root.getElementsByTagName('table');
  369. if (tables.length) {
  370. var selector = this.selector;
  371. //追加默认的表格样式
  372. utils.cssRule('table',
  373. selector + ' table.noBorderTable td,' +
  374. selector + ' table.noBorderTable th,' +
  375. selector + ' table.noBorderTable caption{border:1px dashed #ddd !important}' +
  376. selector + ' table.sortEnabled tr.firstRow th,' + selector + ' table.sortEnabled tr.firstRow td{padding-right:20px; background-repeat: no-repeat;' +
  377. 'background-position: center right; background-image:url(' + this.rootPath + 'themes/default/images/sortable.png);}' +
  378. selector + ' table.sortEnabled tr.firstRow th:hover,' + selector + ' table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}' +
  379. selector + ' table{margin-bottom:10px;border-collapse:collapse;display:table;}' +
  380. selector + ' td,' + selector + ' th{ background:white; padding: 5px 10px;border: 1px solid #DDD;}' +
  381. selector + ' caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' +
  382. selector + ' th{border-top:1px solid #BBB;background:#F7F7F7;}' +
  383. selector + ' table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}' +
  384. selector + ' tr.ue-table-interlace-color-single td{ background: #fcfcfc; }' +
  385. selector + ' tr.ue-table-interlace-color-double td{ background: #f7faff; }' +
  386. selector + ' td p{margin:0;padding:0;}',
  387. document);
  388. //填充空的单元格
  389. utils.each('td th caption'.split(' '), function (tag) {
  390. var cells = root.getElementsByTagName(tag);
  391. cells.length && utils.each(cells, function (node) {
  392. if (!node.firstChild) {
  393. node.innerHTML = '&nbsp;';
  394. }
  395. })
  396. });
  397. //表格可排序
  398. var tables = root.getElementsByTagName('table');
  399. utils.each(tables, function (table) {
  400. if (/\bsortEnabled\b/.test(table.className)) {
  401. utils.on(table, 'click', function(e){
  402. var target = e.target || e.srcElement,
  403. cell = findParentByTagName(target, ['td', 'th']);
  404. var table = findParentByTagName(target, 'table'),
  405. colIndex = utils.indexOf(table.rows[0].cells, cell),
  406. sortType = table.getAttribute('data-sort-type');
  407. if(colIndex != -1) {
  408. sortTable(table, colIndex, me.tableSortCompareFn || sortType);
  409. updateTable(table);
  410. }
  411. });
  412. }
  413. });
  414. //按照标签名查找父节点
  415. function findParentByTagName(target, tagNames) {
  416. var i, current = target;
  417. tagNames = utils.isArray(tagNames) ? tagNames:[tagNames];
  418. while(current){
  419. for(i = 0;i < tagNames.length; i++) {
  420. if(current.tagName == tagNames[i].toUpperCase()) return current;
  421. }
  422. current = current.parentNode;
  423. }
  424. return null;
  425. }
  426. //表格排序
  427. function sortTable(table, sortByCellIndex, compareFn) {
  428. var rows = table.rows,
  429. trArray = [],
  430. flag = rows[0].cells[0].tagName === "TH",
  431. lastRowIndex = 0;
  432. for (var i = 0,len = rows.length; i < len; i++) {
  433. trArray[i] = rows[i];
  434. }
  435. var Fn = {
  436. 'reversecurrent': function(td1,td2){
  437. return 1;
  438. },
  439. 'orderbyasc': function(td1,td2){
  440. var value1 = td1.innerText||td1.textContent,
  441. value2 = td2.innerText||td2.textContent;
  442. return value1.localeCompare(value2);
  443. },
  444. 'reversebyasc': function(td1,td2){
  445. var value1 = td1.innerHTML,
  446. value2 = td2.innerHTML;
  447. return value2.localeCompare(value1);
  448. },
  449. 'orderbynum': function(td1,td2){
  450. var value1 = td1[utils.isIE ? 'innerText':'textContent'].match(/\d+/),
  451. value2 = td2[utils.isIE ? 'innerText':'textContent'].match(/\d+/);
  452. if(value1) value1 = +value1[0];
  453. if(value2) value2 = +value2[0];
  454. return (value1||0) - (value2||0);
  455. },
  456. 'reversebynum': function(td1,td2){
  457. var value1 = td1[utils.isIE ? 'innerText':'textContent'].match(/\d+/),
  458. value2 = td2[utils.isIE ? 'innerText':'textContent'].match(/\d+/);
  459. if(value1) value1 = +value1[0];
  460. if(value2) value2 = +value2[0];
  461. return (value2||0) - (value1||0);
  462. }
  463. };
  464. //对表格设置排序的标记data-sort-type
  465. table.setAttribute('data-sort-type', compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn:'');
  466. //th不参与排序
  467. flag && trArray.splice(0, 1);
  468. trArray = sort(trArray,function (tr1, tr2) {
  469. var result;
  470. if (compareFn && typeof compareFn === "function") {
  471. result = compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]);
  472. } else if (compareFn && typeof compareFn === "number") {
  473. result = 1;
  474. } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) {
  475. result = Fn[compareFn].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]);
  476. } else {
  477. result = Fn['orderbyasc'].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]);
  478. }
  479. return result;
  480. });
  481. var fragment = table.ownerDocument.createDocumentFragment();
  482. for (var j = 0, len = trArray.length; j < len; j++) {
  483. fragment.appendChild(trArray[j]);
  484. }
  485. var tbody = table.getElementsByTagName("tbody")[0];
  486. if(!lastRowIndex){
  487. tbody.appendChild(fragment);
  488. }else{
  489. tbody.insertBefore(fragment,rows[lastRowIndex- range.endRowIndex + range.beginRowIndex - 1])
  490. }
  491. }
  492. //冒泡排序
  493. function sort(array, compareFn){
  494. compareFn = compareFn || function(item1, item2){ return item1.localeCompare(item2);};
  495. for(var i= 0,len = array.length; i<len; i++){
  496. for(var j = i,length = array.length; j<length; j++){
  497. if(compareFn(array[i], array[j]) > 0){
  498. var t = array[i];
  499. array[i] = array[j];
  500. array[j] = t;
  501. }
  502. }
  503. }
  504. return array;
  505. }
  506. //更新表格
  507. function updateTable(table) {
  508. //给第一行设置firstRow的样式名称,在排序图标的样式上使用到
  509. if(!utils.hasClass(table.rows[0], "firstRow")) {
  510. for(var i = 1; i< table.rows.length; i++) {
  511. utils.removeClass(table.rows[i], "firstRow");
  512. }
  513. utils.addClass(table.rows[0], "firstRow");
  514. }
  515. }
  516. }
  517. });
  518. /*
  519. * 图表parse插件
  520. */
  521. UE.parse.register('charts',function( utils ){
  522. utils.cssRule('chartsContainerHeight','.edui-chart-container { height:'+(this.chartContainerHeight||300)+'px}');
  523. var resourceRoot = this.rootPath,
  524. containers = this.root,
  525. sources = null;
  526. //不存在指定的根路径, 则直接退出
  527. if ( !resourceRoot ) {
  528. return;
  529. }
  530. if ( sources = parseSources() ) {
  531. loadResources();
  532. }
  533. function parseSources () {
  534. if ( !containers ) {
  535. return null;
  536. }
  537. return extractChartData( containers );
  538. }
  539. /**
  540. * 提取数据
  541. */
  542. function extractChartData ( rootNode ) {
  543. var data = [],
  544. tables = rootNode.getElementsByTagName( "table" );
  545. for ( var i = 0, tableNode; tableNode = tables[ i ]; i++ ) {
  546. if ( tableNode.getAttribute( "data-chart" ) !== null ) {
  547. data.push( formatData( tableNode ) );
  548. }
  549. }
  550. return data.length ? data : null;
  551. }
  552. function formatData ( tableNode ) {
  553. var meta = tableNode.getAttribute( "data-chart" ),
  554. metaConfig = {},
  555. data = [];
  556. //提取table数据
  557. for ( var i = 0, row; row = tableNode.rows[ i ]; i++ ) {
  558. var rowData = [];
  559. for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {
  560. var value = ( cell.innerText || cell.textContent || '' );
  561. rowData.push( cell.tagName == 'TH' ? value:(value | 0) );
  562. }
  563. data.push( rowData );
  564. }
  565. //解析元信息
  566. meta = meta.split( ";" );
  567. for ( var i = 0, metaData; metaData = meta[ i ]; i++ ) {
  568. metaData = metaData.split( ":" );
  569. metaConfig[ metaData[ 0 ] ] = metaData[ 1 ];
  570. }
  571. return {
  572. table: tableNode,
  573. meta: metaConfig,
  574. data: data
  575. };
  576. }
  577. //加载资源
  578. function loadResources () {
  579. loadJQuery();
  580. }
  581. function loadJQuery () {
  582. //不存在jquery, 则加载jquery
  583. if ( !window.jQuery ) {
  584. utils.loadFile(document,{
  585. src : resourceRoot + "/third-party/jquery-1.10.2.min.js",
  586. tag : "script",
  587. type : "text/javascript",
  588. defer : "defer"
  589. },function(){
  590. loadHighcharts();
  591. });
  592. } else {
  593. loadHighcharts();
  594. }
  595. }
  596. function loadHighcharts () {
  597. //不存在Highcharts, 则加载Highcharts
  598. if ( !window.Highcharts ) {
  599. utils.loadFile(document,{
  600. src : resourceRoot + "/third-party/highcharts/highcharts.js",
  601. tag : "script",
  602. type : "text/javascript",
  603. defer : "defer"
  604. },function(){
  605. loadTypeConfig();
  606. });
  607. } else {
  608. loadTypeConfig();
  609. }
  610. }
  611. //加载图表差异化配置文件
  612. function loadTypeConfig () {
  613. utils.loadFile(document,{
  614. src : resourceRoot + "/dialogs/charts/chart.config.js",
  615. tag : "script",
  616. type : "text/javascript",
  617. defer : "defer"
  618. },function(){
  619. render();
  620. });
  621. }
  622. //渲染图表
  623. function render () {
  624. var config = null,
  625. chartConfig = null,
  626. container = null;
  627. for ( var i = 0, len = sources.length; i < len; i++ ) {
  628. config = sources[ i ];
  629. chartConfig = analysisConfig( config );
  630. container = createContainer( config.table );
  631. renderChart( container, typeConfig[ config.meta.chartType ], chartConfig );
  632. }
  633. }
  634. /*
  635. * 渲染图表
  636. * @param container 图表容器节点对象
  637. * @param typeConfig 图表类型配置
  638. * @param config 图表通用配置
  639. * */
  640. function renderChart ( container, typeConfig, config ) {
  641. $( container ).highcharts( $.extend( {}, typeConfig, {
  642. credits: {
  643. enabled: false
  644. },
  645. exporting: {
  646. enabled: false
  647. },
  648. title: {
  649. text: config.title,
  650. x: -20 //center
  651. },
  652. subtitle: {
  653. text: config.subTitle,
  654. x: -20
  655. },
  656. xAxis: {
  657. title: {
  658. text: config.xTitle
  659. },
  660. categories: config.categories
  661. },
  662. yAxis: {
  663. title: {
  664. text: config.yTitle
  665. },
  666. plotLines: [{
  667. value: 0,
  668. width: 1,
  669. color: '#808080'
  670. }]
  671. },
  672. tooltip: {
  673. enabled: true,
  674. valueSuffix: config.suffix
  675. },
  676. legend: {
  677. layout: 'vertical',
  678. align: 'right',
  679. verticalAlign: 'middle',
  680. borderWidth: 1
  681. },
  682. series: config.series
  683. } ));
  684. }
  685. /*
  686. * 创建图表的容器
  687. * 新创建的容器会替换掉对应的table对象
  688. * */
  689. function createContainer ( tableNode ) {
  690. var container = document.createElement( "div" );
  691. container.className = "edui-chart-container";
  692. tableNode.parentNode.replaceChild( container, tableNode );
  693. return container;
  694. }
  695. //根据config解析出正确的类别和图表数据信息
  696. function analysisConfig ( config ) {
  697. var series = [],
  698. //数据类别
  699. categories = [],
  700. result = [],
  701. data = config.data,
  702. meta = config.meta;
  703. //数据对齐方式为相反的方式, 需要反转数据
  704. if ( meta.dataFormat != "1" ) {
  705. for ( var i = 0, len = data.length; i < len ; i++ ) {
  706. for ( var j = 0, jlen = data[ i ].length; j < jlen; j++ ) {
  707. if ( !result[ j ] ) {
  708. result[ j ] = [];
  709. }
  710. result[ j ][ i ] = data[ i ][ j ];
  711. }
  712. }
  713. data = result;
  714. }
  715. result = {};
  716. //普通图表
  717. if ( meta.chartType != typeConfig.length - 1 ) {
  718. categories = data[ 0 ].slice( 1 );
  719. for ( var i = 1, curData; curData = data[ i ]; i++ ) {
  720. series.push( {
  721. name: curData[ 0 ],
  722. data: curData.slice( 1 )
  723. } );
  724. }
  725. result.series = series;
  726. result.categories = categories;
  727. result.title = meta.title;
  728. result.subTitle = meta.subTitle;
  729. result.xTitle = meta.xTitle;
  730. result.yTitle = meta.yTitle;
  731. result.suffix = meta.suffix;
  732. } else {
  733. var curData = [];
  734. for ( var i = 1, len = data[ 0 ].length; i < len; i++ ) {
  735. curData.push( [ data[ 0 ][ i ], data[ 1 ][ i ] | 0 ] );
  736. }
  737. //饼图
  738. series[ 0 ] = {
  739. type: 'pie',
  740. name: meta.tip,
  741. data: curData
  742. };
  743. result.series = series;
  744. result.title = meta.title;
  745. result.suffix = meta.suffix;
  746. }
  747. return result;
  748. }
  749. });
  750. UE.parse.register('background', function (utils) {
  751. var me = this,
  752. root = me.root,
  753. p = root.getElementsByTagName('p'),
  754. styles;
  755. for (var i = 0,ci; ci = p[i++];) {
  756. styles = ci.getAttribute('data-background');
  757. if (styles){
  758. ci.parentNode.removeChild(ci);
  759. }
  760. }
  761. //追加默认的表格样式
  762. styles && utils.cssRule('ueditor_background', me.selector + '{' + styles + '}', document);
  763. });
  764. UE.parse.register('list',function(utils){
  765. var customCss = [],
  766. customStyle = {
  767. 'cn' : 'cn-1-',
  768. 'cn1' : 'cn-2-',
  769. 'cn2' : 'cn-3-',
  770. 'num' : 'num-1-',
  771. 'num1' : 'num-2-',
  772. 'num2' : 'num-3-',
  773. 'dash' : 'dash',
  774. 'dot' : 'dot'
  775. };
  776. utils.extend(this,{
  777. liiconpath : 'http://bs.baidu.com/listicon/',
  778. listDefaultPaddingLeft : '20'
  779. });
  780. var root = this.root,
  781. ols = root.getElementsByTagName('ol'),
  782. uls = root.getElementsByTagName('ul'),
  783. selector = this.selector;
  784. if(ols.length){
  785. applyStyle.call(this,ols);
  786. }
  787. if(uls.length){
  788. applyStyle.call(this,uls);
  789. }
  790. if(ols.length || uls.length){
  791. customCss.push(selector +' .list-paddingleft-1{padding-left:0}');
  792. customCss.push(selector +' .list-paddingleft-2{padding-left:'+ this.listDefaultPaddingLeft+'px}');
  793. customCss.push(selector +' .list-paddingleft-3{padding-left:'+ this.listDefaultPaddingLeft*2+'px}');
  794. utils.cssRule('list', selector +' ol,'+selector +' ul{margin:0;padding:0;}li{clear:both;}'+customCss.join('\n'), document);
  795. }
  796. function applyStyle(nodes){
  797. var T = this;
  798. utils.each(nodes,function(list){
  799. if(list.className && /custom_/i.test(list.className)){
  800. var listStyle = list.className.match(/custom_(\w+)/)[1];
  801. if(listStyle == 'dash' || listStyle == 'dot'){
  802. utils.pushItem(customCss,selector +' li.list-' + customStyle[listStyle] + '{background-image:url(' + T.liiconpath +customStyle[listStyle]+'.gif)}');
  803. utils.pushItem(customCss,selector +' ul.custom_'+listStyle+'{list-style:none;} '+ selector +' ul.custom_'+listStyle+' li{background-position:0 3px;background-repeat:no-repeat}');
  804. }else{
  805. var index = 1;
  806. utils.each(list.childNodes,function(li){
  807. if(li.tagName == 'LI'){
  808. utils.pushItem(customCss,selector + ' li.list-' + customStyle[listStyle] + index + '{background-image:url(' + T.liiconpath + 'list-'+customStyle[listStyle] +index + '.gif)}');
  809. index++;
  810. }
  811. });
  812. utils.pushItem(customCss,selector + ' ol.custom_'+listStyle+'{list-style:none;}'+selector+' ol.custom_'+listStyle+' li{background-position:0 3px;background-repeat:no-repeat}');
  813. }
  814. switch(listStyle){
  815. case 'cn':
  816. utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:25px}');
  817. utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}');
  818. utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:55px}');
  819. break;
  820. case 'cn1':
  821. utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:30px}');
  822. utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}');
  823. utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:55px}');
  824. break;
  825. case 'cn2':
  826. utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:40px}');
  827. utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:55px}');
  828. utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:68px}');
  829. break;
  830. case 'num':
  831. case 'num1':
  832. utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:25px}');
  833. break;
  834. case 'num2':
  835. utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:35px}');
  836. utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}');
  837. break;
  838. case 'dash':
  839. utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft{padding-left:35px}');
  840. break;
  841. case 'dot':
  842. utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft{padding-left:20px}');
  843. }
  844. }
  845. });
  846. }
  847. });
  848. UE.parse.register('vedio',function(utils){
  849. var video = this.root.getElementsByTagName('video'),
  850. audio = this.root.getElementsByTagName('audio');
  851. document.createElement('video');document.createElement('audio');
  852. if(video.length || audio.length){
  853. var sourcePath = utils.removeLastbs(this.rootPath),
  854. jsurl = sourcePath + '/third-party/video-js/video.js',
  855. cssurl = sourcePath + '/third-party/video-js/video-js.min.css',
  856. swfUrl = sourcePath + '/third-party/video-js/video-js.swf';
  857. utils.loadFile(document,{
  858. id : "video_css",
  859. tag : "link",
  860. rel : "stylesheet",
  861. type : "text/css",
  862. href : cssurl
  863. });
  864. utils.loadFile(document,{
  865. id : "video_js",
  866. src : jsurl,
  867. tag : "script",
  868. type : "text/javascript"
  869. },function(){
  870. videojs.options.flash.swf = swfUrl;
  871. });
  872. }
  873. });
  874. })()