trumbowyg.plugins.js 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039
  1. /* ===========================================================
  2. * trumbowyg.pasteimage.js v1.0
  3. * Basic base64 paste plugin for Trumbowyg
  4. * http://alex-d.github.com/Trumbowyg
  5. * ===========================================================
  6. * Author : Alexandre Demode (Alex-D)
  7. * Twitter : @AlexandreDemode
  8. * Website : alex-d.fr
  9. */
  10. (function ($) {
  11. 'use strict';
  12. $.extend(true, $.trumbowyg, {
  13. plugins: {
  14. pasteImage: {
  15. init: function (trumbowyg) {
  16. trumbowyg.pasteHandlers.push(function (pasteEvent) {
  17. try {
  18. var items = (pasteEvent.originalEvent || pasteEvent).clipboardData.items,
  19. mustPreventDefault = false,
  20. reader;
  21. for (var i = items.length - 1; i >= 0; i -= 1) {
  22. if (items[i].type.match(/^image\//)) {
  23. reader = new FileReader();
  24. /* jshint -W083 */
  25. reader.onloadend = function (event) {
  26. trumbowyg.execCmd('insertImage', event.target.result, false, true);
  27. };
  28. /* jshint +W083 */
  29. reader.readAsDataURL(items[i].getAsFile());
  30. mustPreventDefault = true;
  31. }
  32. }
  33. if (mustPreventDefault) {
  34. pasteEvent.stopPropagation();
  35. pasteEvent.preventDefault();
  36. }
  37. } catch (c) {
  38. }
  39. });
  40. }
  41. }
  42. }
  43. });
  44. })(jQuery);
  45. /* ===========================================================
  46. * trumbowyg.sys1.cleanpaste.js v1.0
  47. * Clean les balises word
  48. * ===========================================================
  49. * Authors : Valentin CARRUESCO
  50. */
  51. (function ($) {
  52. 'use strict';
  53. // clean editor
  54. // this will clean the inserted contents
  55. // it does a compare, before and after paste to determine the
  56. // pasted contents
  57. $.extend(true, $.trumbowyg, {
  58. plugins: {
  59. cleanPaste: {
  60. init: function (trumbowyg) {
  61. trumbowyg.pasteHandlers.push(function () {
  62. setTimeout(function () {
  63. try {
  64. trumbowyg.$ed.find("*").filter(function(){
  65. return /([^><]*):([^>]*)/i.test(this.nodeName);
  66. }).remove();
  67. } catch (c) {
  68. }
  69. }, 0);
  70. });
  71. }
  72. }
  73. }
  74. });
  75. })(jQuery);
  76. /* ===========================================================
  77. * trumbowyg.fontfamily.js v1.2
  78. */
  79. (function ($) {
  80. 'use strict';
  81. $.extend(true, $.trumbowyg, {
  82. langs: {
  83. // jshint camelcase:false
  84. en: {
  85. fontFamily: 'Font'
  86. },
  87. da: {
  88. fontFamily: 'Skrifttype'
  89. },
  90. fr: {
  91. fontFamily: 'Police'
  92. },
  93. de: {
  94. fontFamily: 'Schriftart'
  95. },
  96. nl: {
  97. fontFamily: 'Lettertype'
  98. },
  99. tr: {
  100. fontFamily: 'Yazı Tipi'
  101. },
  102. zh_tw: {
  103. fontFamily: '字體',
  104. },
  105. pt_br: {
  106. fontFamily: 'Fonte',
  107. },
  108. ko: {
  109. fontFamily: '글꼴'
  110. },
  111. }
  112. });
  113. // jshint camelcase:true
  114. var defaultOptions = {
  115. fontList: [
  116. {name: 'Arial', family: 'Arial, Helvetica, sans-serif'},
  117. {name: 'Arial Black', family: 'Arial Black, Gadget, sans-serif'},
  118. {name: 'Comic Sans', family: 'Comic Sans MS, Textile, cursive, sans-serif'},
  119. {name: 'Courier New', family: 'Courier New, Courier, monospace'},
  120. {name: 'Georgia', family: 'Georgia, serif'},
  121. {name: 'Impact', family: 'Impact, Charcoal, sans-serif'},
  122. {name: 'Lucida Console', family: 'Lucida Console, Monaco, monospace'},
  123. {name: 'Lucida Sans', family: 'Lucida Sans Uncide, Lucida Grande, sans-serif'},
  124. {name: 'Palatino', family: 'Palatino Linotype, Book Antiqua, Palatino, serif'},
  125. {name: 'Tahoma', family: 'Tahoma, Geneva, sans-serif'},
  126. {name: 'Times New Roman', family: 'Times New Roman, Times, serif'},
  127. {name: 'Trebuchet', family: 'Trebuchet MS, Helvetica, sans-serif'},
  128. {name: 'Verdana', family: 'Verdana, Geneva, sans-serif'}
  129. ]
  130. };
  131. // Add dropdown with web safe fonts
  132. $.extend(true, $.trumbowyg, {
  133. plugins: {
  134. fontfamily: {
  135. init: function (trumbowyg) {
  136. trumbowyg.o.plugins.fontfamily = $.extend({},
  137. defaultOptions,
  138. trumbowyg.o.plugins.fontfamily || {}
  139. );
  140. trumbowyg.addBtnDef('fontfamily', {
  141. dropdown: buildDropdown(trumbowyg),
  142. hasIcon: false,
  143. text: trumbowyg.lang.fontFamily
  144. });
  145. }
  146. }
  147. }
  148. });
  149. function buildDropdown(trumbowyg) {
  150. var dropdown = [];
  151. $.each(trumbowyg.o.plugins.fontfamily.fontList, function (index, font) {
  152. trumbowyg.addBtnDef('fontfamily_' + index, {
  153. title: '<span style="font-family: ' + font.family + ';">' + font.name + '</span>',
  154. hasIcon: false,
  155. fn: function () {
  156. trumbowyg.execCmd('fontName', font.family, true);
  157. }
  158. });
  159. dropdown.push('fontfamily_' + index);
  160. });
  161. return dropdown;
  162. }
  163. })(jQuery);
  164. /* ===========================================================
  165. * trumbowyg.mention.js v1.0
  166. * Allow mention with @,# or any key
  167. * http://sys1.fr
  168. * ===========================================================
  169. * Authors : Valentin CARRUESCO
  170. */
  171. (function ($) {
  172. 'use strict';
  173. var o = {
  174. //Supprime la totalité du mention si un backspace entame le mention
  175. autoDelete : true,
  176. //Ne déclenche la touche que si elle est précédée d'un espace, d'un saut de ligne ou d'une nouvelle balise
  177. triggerBreak : true
  178. };
  179. $.extend(true, $.trumbowyg, {
  180. plugins: {
  181. mention: {
  182. init: function (trumbowyg) {
  183. var object = this;
  184. object.altGrPressed = false;
  185. trumbowyg.o.plugins.mention = $.extend(true, {},o,trumbowyg.o.plugins.mention || {});
  186. var keyMap = {
  187. 48 : {
  188. label : '@',
  189. check : function(event){
  190. return object.altGrPressed;
  191. }
  192. },
  193. 51 : {
  194. label : '#',
  195. check : function(event){
  196. return object.altGrPressed;
  197. }
  198. }
  199. }
  200. $(trumbowyg.$ta).parent().on('keydown', function (e) {
  201. var code = e.which || e.keyCode ;
  202. //verifie si alt+gr est enfoncé
  203. if(code==18){
  204. object.altGrPressed = true;
  205. return;
  206. }
  207. //Supprime les mentions en totalité sur un backspace
  208. if(trumbowyg.o.plugins.mention.autoDelete && code==8){
  209. var editor = trumbowyg.$ed;
  210. var textarea = trumbowyg.$ta;
  211. textarea.trumbowyg('saveRange');
  212. var parent = $(textarea.trumbowyg('getRange').endContainer.parentElement);
  213. if(parent.attr('data-mention-type')!= null){
  214. parent.remove();
  215. editor.trigger('keyup');
  216. }
  217. }
  218. //if(Object.keys(trumbowyg.o.plugins.mention.keys).indexOf(""+code) == -1) return;
  219. if(keyMap[code] == null) return;
  220. var char = keyMap[code].label;
  221. if(Object.keys(trumbowyg.o.plugins.mention.keys).indexOf(char) == -1) return;
  222. if(keyMap[code].check && !keyMap[code].check(event)) return;
  223. var editor = trumbowyg.$ed;
  224. var textarea = trumbowyg.$ta;
  225. var range = trumbowyg.$ta.trumbowyg('getRange');
  226. var lastChar = !range || !range.startContainer || !range.startContainer.data ? '' : range.startContainer.data;
  227. lastChar = lastChar.length>0 ? lastChar.substring(lastChar.length-1) : '';
  228. //si le caractere trigger n'est pas lancé apres un espace ou un saut de ligne on ne fait rien
  229. if(trumbowyg.o.plugins.mention.triggerBreak && lastChar != '' && lastChar != ' ') return;
  230. var key = trumbowyg.o.plugins.mention.keys[char];
  231. if(!key.load) return;
  232. var data = {
  233. editor : editor,
  234. event : e,
  235. textarea : textarea,
  236. lastChar : lastChar
  237. }
  238. data.textarea.trumbowyg('saveRange');
  239. key.load(data);
  240. }).on('keyup', function (e) {
  241. var code = e.which || e.keyCode ;
  242. //désactive le altgr mode si relaché
  243. if(code==18){
  244. object.altGrPressed = false;
  245. return;
  246. }
  247. });
  248. }
  249. }
  250. }
  251. })
  252. })(jQuery);
  253. /**
  254. Font size sys1, ne pas upgrade !!
  255. */
  256. (function ($) {
  257. 'use strict';
  258. $.extend(true, $.trumbowyg, {
  259. langs: {
  260. fr: {
  261. fontsize: 'Taille de la police',
  262. fontsizes: {
  263. 'x-small': 'Très petit',
  264. 'small': 'Petit',
  265. 'medium': 'Normal',
  266. 'large': 'Grand',
  267. 'x-large': 'Très grand',
  268. 'custom': 'Taille personnalisée'
  269. },
  270. fontCustomSize: {
  271. title: 'Taille de police personnalisée',
  272. label: 'Taille de la police',
  273. value: '48px'
  274. }
  275. }
  276. }
  277. });
  278. // Add dropdown with font sizes
  279. $.extend(true, $.trumbowyg, {
  280. plugins: {
  281. fontsize: {
  282. init: function (trumbowyg) {
  283. trumbowyg.o.plugins.fontsize = $.extend({},
  284. {
  285. sizeList: [
  286. '8px',
  287. '9px',
  288. '10px',
  289. '11px',
  290. '12px',
  291. '14px',
  292. '16px',
  293. '18px',
  294. '20px',
  295. '22px',
  296. '24px',
  297. '26px',
  298. '28px',
  299. '36px',
  300. '48px',
  301. '72px'
  302. ],
  303. allowCustomSize: true
  304. },
  305. trumbowyg.o.plugins.fontsize || {}
  306. );
  307. trumbowyg.addBtnDef('fontsize', {
  308. dropdown: buildDropdown(trumbowyg)
  309. });
  310. }
  311. }
  312. }
  313. });
  314. function setFontSize(trumbowyg, size) {
  315. trumbowyg.$ed.focus();
  316. trumbowyg.saveRange();
  317. var text = trumbowyg.range.startContainer.parentElement;
  318. var selectedText = trumbowyg.getRangeText();
  319. if ($(text).html() === selectedText) {
  320. $(text).css('font-size', size);
  321. } else {
  322. trumbowyg.range.deleteContents();
  323. var html = '<span style="font-size:'+size+'">' + selectedText + '</span>';
  324. var node = $(html)[0];
  325. trumbowyg.range.insertNode(node);
  326. }
  327. trumbowyg.restoreRange();
  328. }
  329. function buildDropdown(trumbowyg) {
  330. var dropdown = [];
  331. if (trumbowyg.o.plugins.fontsize.allowCustomSize) {
  332. var customSizeButtonName = 'fontsize_custom';
  333. var customSizeBtnDef = {
  334. fn: function () {
  335. trumbowyg.openModalInsert(trumbowyg.lang.fontCustomSize.title,
  336. {
  337. size: {
  338. label: trumbowyg.lang.fontCustomSize.label,
  339. value: trumbowyg.lang.fontCustomSize.value
  340. }
  341. },
  342. function (form) {
  343. setFontSize(trumbowyg, form.size);
  344. return true;
  345. }
  346. );
  347. },
  348. text: '<span style="font-size: medium;">' + trumbowyg.lang.fontsizes.custom + '</span>',
  349. hasIcon: false
  350. };
  351. trumbowyg.addBtnDef(customSizeButtonName, customSizeBtnDef);
  352. dropdown.push(customSizeButtonName);
  353. $('.trumbowyg-dropdown-fontsize button').css({
  354. height : '17px',
  355. lineHeight : '17px',
  356. });
  357. }
  358. $.each(trumbowyg.o.plugins.fontsize.sizeList, function (index, size) {
  359. trumbowyg.addBtnDef('fontsize_' + size, {
  360. text: '<span style="">' + (trumbowyg.lang.fontsizes[size] || size) + '</span>',
  361. hasIcon: false,
  362. fn: function () {
  363. setFontSize(trumbowyg, size);
  364. }
  365. });
  366. dropdown.push('fontsize_' + size);
  367. });
  368. return dropdown;
  369. }
  370. })(jQuery);
  371. /* ===========================================================
  372. * trumbowyg.colors.js v1.2
  373. * Colors picker plugin for Trumbowyg
  374. * http://alex-d.github.com/Trumbowyg
  375. * ===========================================================
  376. * Author : Alexandre Demode (Alex-D)
  377. * Twitter : @AlexandreDemode
  378. * Website : alex-d.fr
  379. */
  380. (function ($) {
  381. 'use strict';
  382. $.extend(true, $.trumbowyg, {
  383. langs: {
  384. // jshint camelcase:false
  385. cs: {
  386. foreColor: 'Barva textu',
  387. backColor: 'Barva pozadí'
  388. },
  389. en: {
  390. foreColor: 'Text color',
  391. backColor: 'Background color'
  392. },
  393. fr: {
  394. foreColor: 'Couleur du texte',
  395. backColor: 'Couleur de fond'
  396. },
  397. nl: {
  398. foreColor: 'Tekstkleur',
  399. backColor: 'Achtergrondkleur'
  400. },
  401. sk: {
  402. foreColor: 'Farba textu',
  403. backColor: 'Farba pozadia'
  404. },
  405. zh_cn: {
  406. foreColor: '文字颜色',
  407. backColor: '背景颜色'
  408. },
  409. ru: {
  410. foreColor: 'Цвет текста',
  411. backColor: 'Цвет выделения текста'
  412. },
  413. ja: {
  414. foreColor: '文字色',
  415. backColor: '背景色'
  416. },
  417. tr: {
  418. foreColor: 'Yazı rengi',
  419. backColor: 'Arkaplan rengi'
  420. }
  421. }
  422. });
  423. // jshint camelcase:true
  424. function hex(x) {
  425. return ('0' + parseInt(x).toString(16)).slice(-2);
  426. }
  427. function colorToHex(rgb) {
  428. if (rgb.search('rgb') === -1) {
  429. return rgb.replace('#', '');
  430. } else if (rgb === 'rgba(0, 0, 0, 0)') {
  431. return 'transparent';
  432. } else {
  433. rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
  434. return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
  435. }
  436. }
  437. function colorTagHandler(element, trumbowyg) {
  438. var tags = [];
  439. if (!element.style) {
  440. return tags;
  441. }
  442. // background color
  443. if (element.style.backgroundColor !== '') {
  444. var backColor = colorToHex(element.style.backgroundColor);
  445. if (trumbowyg.o.plugins.colors.colorList.indexOf(backColor) >= 0) {
  446. tags.push('backColor' + backColor);
  447. } else {
  448. tags.push('backColorFree');
  449. }
  450. }
  451. // text color
  452. var foreColor;
  453. if (element.style.color !== '') {
  454. foreColor = colorToHex(element.style.color);
  455. } else if (element.hasAttribute('color')) {
  456. foreColor = colorToHex(element.getAttribute('color'));
  457. }
  458. if (foreColor) {
  459. if (trumbowyg.o.plugins.colors.colorList.indexOf(foreColor) >= 0) {
  460. tags.push('foreColor' + foreColor);
  461. } else {
  462. tags.push('foreColorFree');
  463. }
  464. }
  465. return tags;
  466. }
  467. var defaultOptions = {
  468. colorList: ['ffffff', '000000', 'eeece1', '1f497d', '4f81bd', 'c0504d', '9bbb59', '8064a2', '4bacc6', 'f79646', 'ffff00', 'f2f2f2', '7f7f7f', 'ddd9c3', 'c6d9f0', 'dbe5f1', 'f2dcdb', 'ebf1dd', 'e5e0ec', 'dbeef3', 'fdeada', 'fff2ca', 'd8d8d8', '595959', 'c4bd97', '8db3e2', 'b8cce4', 'e5b9b7', 'd7e3bc', 'ccc1d9', 'b7dde8', 'fbd5b5', 'ffe694', 'bfbfbf', '3f3f3f', '938953', '548dd4', '95b3d7', 'd99694', 'c3d69b', 'b2a2c7', 'b7dde8', 'fac08f', 'f2c314', 'a5a5a5', '262626', '494429', '17365d', '366092', '953734', '76923c', '5f497a', '92cddc', 'e36c09', 'c09100', '7f7f7f', '0c0c0c', '1d1b10', '0f243e', '244061', '632423', '4f6128', '3f3151', '31859b', '974806', '7f6000']
  469. };
  470. // Add all colors in two dropdowns
  471. $.extend(true, $.trumbowyg, {
  472. plugins: {
  473. color: {
  474. init: function (trumbowyg) {
  475. trumbowyg.o.plugins.colors = trumbowyg.o.plugins.colors || defaultOptions;
  476. var foreColorBtnDef = {
  477. dropdown: buildDropdown('foreColor', trumbowyg)
  478. },
  479. backColorBtnDef = {
  480. dropdown: buildDropdown('backColor', trumbowyg)
  481. };
  482. trumbowyg.addBtnDef('foreColor', foreColorBtnDef);
  483. trumbowyg.addBtnDef('backColor', backColorBtnDef);
  484. },
  485. tagHandler: colorTagHandler
  486. }
  487. }
  488. });
  489. function buildDropdown(fn, trumbowyg) {
  490. var dropdown = [];
  491. $.each(trumbowyg.o.plugins.colors.colorList, function (i, color) {
  492. var btn = fn + color,
  493. btnDef = {
  494. fn: fn,
  495. forceCss: true,
  496. param: '#' + color,
  497. style: 'background-color: #' + color + ';'
  498. };
  499. trumbowyg.addBtnDef(btn, btnDef);
  500. dropdown.push(btn);
  501. });
  502. var removeColorButtonName = fn + 'Remove',
  503. removeColorBtnDef = {
  504. fn: 'removeFormat',
  505. param: fn,
  506. style: 'background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQIW2NkQAAfEJMRmwBYhoGBYQtMBYoAADziAp0jtJTgAAAAAElFTkSuQmCC);'
  507. };
  508. trumbowyg.addBtnDef(removeColorButtonName, removeColorBtnDef);
  509. dropdown.push(removeColorButtonName);
  510. // add free color btn
  511. var freeColorButtonName = fn + 'Free',
  512. freeColorBtnDef = {
  513. fn: function () {
  514. trumbowyg.openModalInsert(trumbowyg.lang[fn],
  515. {
  516. color: {
  517. label: fn,
  518. value: '#FFFFFF'
  519. }
  520. },
  521. // callback
  522. function (values) {
  523. trumbowyg.execCmd(fn, values.color);
  524. return true;
  525. }
  526. );
  527. },
  528. text: '#',
  529. // style adjust for displaying the text
  530. style: 'text-indent: 0;line-height: 20px;padding: 0 5px;'
  531. };
  532. trumbowyg.addBtnDef(freeColorButtonName, freeColorBtnDef);
  533. dropdown.push(freeColorButtonName);
  534. return dropdown;
  535. }
  536. })(jQuery);
  537. /* ===========================================================
  538. * trumbowyg.table.custom.js v2.0
  539. * Table plugin for Trumbowyg
  540. * http://alex-d.github.com/Trumbowyg
  541. * ===========================================================
  542. * Author : Sven Dunemann [dunemann@forelabs.eu]
  543. */
  544. (function ($) {
  545. 'use strict';
  546. var defaultOptions = {
  547. rows: 8,
  548. columns: 8,
  549. styler: 'table'
  550. };
  551. $.extend(true, $.trumbowyg, {
  552. langs: {
  553. // jshint camelcase:false
  554. en: {
  555. table: 'Insert table',
  556. tableAddRow: 'Add row',
  557. tableAddRowAbove: 'Add row above',
  558. tableAddColumnLeft: 'Add column to the left',
  559. tableAddColumn: 'Add column to the right',
  560. tableDeleteRow: 'Delete row',
  561. tableDeleteColumn: 'Delete column',
  562. tableDestroy: 'Delete table',
  563. error: 'Error'
  564. },
  565. da: {
  566. table: 'Indsæt tabel',
  567. tableAddRow: 'Tilføj række',
  568. tableAddRowAbove: 'Tilføj række',
  569. tableAddColumnLeft: 'Tilføj kolonne',
  570. tableAddColumn: 'Tilføj kolonne',
  571. tableDeleteRow: 'Slet række',
  572. tableDeleteColumn: 'Slet kolonne',
  573. tableDestroy: 'Slet tabel',
  574. error: 'Fejl'
  575. },
  576. de: {
  577. table: 'Tabelle einfügen',
  578. tableAddRow: 'Zeile hinzufügen',
  579. tableAddRowAbove: 'Zeile hinzufügen',
  580. tableAddColumnLeft: 'Spalte hinzufügen',
  581. tableAddColumn: 'Spalte hinzufügen',
  582. tableDeleteRow: 'Zeile löschen',
  583. tableDeleteColumn: 'Spalte löschen',
  584. tableDestroy: 'Tabelle löschen',
  585. error: 'Error'
  586. },
  587. sk: {
  588. table: 'Vytvoriť tabuľky',
  589. tableAddRow: 'Pridať riadok',
  590. tableAddRowAbove: 'Pridať riadok',
  591. tableAddColumnLeft: 'Pridať stĺpec',
  592. tableAddColumn: 'Pridať stĺpec',
  593. error: 'Chyba'
  594. },
  595. fr: {
  596. table: 'Insérer un tableau',
  597. tableAddRow: 'Ajouter un ligne en dessous',
  598. tableAddRowAbove: 'Ajouter une ligne au dessus',
  599. tableAddColumnLeft: 'Ajouter une colonne à gauche',
  600. tableAddColumn: 'Ajouter une colonne à droite',
  601. tableDeleteRow: 'Effacer la ligne',
  602. tableDeleteColumn: 'Effacer la colonne',
  603. tableDestroy: 'Effacer le tableau',
  604. error: 'Erreur'
  605. },
  606. cs: {
  607. table: 'Vytvořit příkaz Table',
  608. tableAddRow: 'Přidat řádek',
  609. tableAddRowAbove: 'Přidat řádek',
  610. tableAddColumnLeft: 'Přidat sloupec',
  611. tableAddColumn: 'Přidat sloupec',
  612. error: 'Chyba'
  613. },
  614. ru: {
  615. table: 'Вставить таблицу',
  616. tableAddRow: 'Добавить строку',
  617. tableAddRowAbove: 'Добавить строку',
  618. tableAddColumnLeft: 'Добавить столбец',
  619. tableAddColumn: 'Добавить столбец',
  620. tableDeleteRow: 'Удалить строку',
  621. tableDeleteColumn: 'Удалить столбец',
  622. tableDestroy: 'Удалить таблицу',
  623. error: 'Ошибка'
  624. },
  625. ja: {
  626. table: '表の挿入',
  627. tableAddRow: '行の追加',
  628. tableAddRowAbove: '行の追加',
  629. tableAddColumnLeft: '列の追加',
  630. tableAddColumn: '列の追加',
  631. error: 'エラー'
  632. },
  633. tr: {
  634. table: 'Tablo ekle',
  635. tableAddRow: 'Satır ekle',
  636. tableAddRowAbove: 'Satır ekle',
  637. tableAddColumnLeft: 'Kolon ekle',
  638. tableAddColumn: 'Kolon ekle',
  639. error: 'Hata'
  640. },
  641. zh_tw: {
  642. table: '插入表格',
  643. tableAddRow: '加入行',
  644. tableAddRowAbove: '加入行',
  645. tableAddColumnLeft: '加入列',
  646. tableAddColumn: '加入列',
  647. tableDeleteRow: '刪除行',
  648. tableDeleteColumn: '刪除列',
  649. tableDestroy: '刪除表格',
  650. error: '錯誤'
  651. },
  652. id: {
  653. table: 'Sisipkan tabel',
  654. tableAddRow: 'Sisipkan baris',
  655. tableAddRowAbove: 'Sisipkan baris',
  656. tableAddColumnLeft: 'Sisipkan kolom',
  657. tableAddColumn: 'Sisipkan kolom',
  658. tableDeleteRow: 'Hapus baris',
  659. tableDeleteColumn: 'Hapus kolom',
  660. tableDestroy: 'Hapus tabel',
  661. error: 'Galat'
  662. },
  663. pt_br: {
  664. table: 'Inserir tabela',
  665. tableAddRow: 'Adicionar linha',
  666. tableAddRowAbove: 'Adicionar linha',
  667. tableAddColumnLeft: 'Adicionar coluna',
  668. tableAddColumn: 'Adicionar coluna',
  669. tableDeleteRow: 'Deletar linha',
  670. tableDeleteColumn: 'Deletar coluna',
  671. tableDestroy: 'Deletar tabela',
  672. error: 'Erro'
  673. },
  674. ko: {
  675. table: '표 넣기',
  676. tableAddRow: '줄 추가',
  677. tableAddRowAbove: '줄 추가',
  678. tableAddColumnLeft: '칸 추가',
  679. tableAddColumn: '칸 추가',
  680. tableDeleteRow: '줄 삭제',
  681. tableDeleteColumn: '칸 삭제',
  682. tableDestroy: '표 지우기',
  683. error: '에러'
  684. },
  685. // jshint camelcase:true
  686. },
  687. plugins: {
  688. table: {
  689. init: function (t) {
  690. t.o.plugins.table = $.extend(true, {}, defaultOptions, t.o.plugins.table || {});
  691. var buildButtonDef = {
  692. fn: function () {
  693. t.saveRange();
  694. var btnName = 'table';
  695. var dropdownPrefix = t.o.prefix + 'dropdown',
  696. dropdownOptions = { // the dropdown
  697. class: dropdownPrefix + '-' + btnName + ' ' + dropdownPrefix + ' ' + t.o.prefix + 'fixed-top'
  698. };
  699. dropdownOptions['data-' + dropdownPrefix] = btnName;
  700. var $dropdown = $('<div/>', dropdownOptions);
  701. if (t.$box.find('.' + dropdownPrefix + '-' + btnName).length === 0) {
  702. t.$box.append($dropdown.hide());
  703. } else {
  704. $dropdown = t.$box.find('.' + dropdownPrefix + '-' + btnName);
  705. }
  706. // clear dropdown
  707. $dropdown.html('');
  708. // when active table show AddRow / AddColumn
  709. if (t.$box.find('.' + t.o.prefix + 'table-button').hasClass(t.o.prefix + 'active-button')) {
  710. $dropdown.append(t.buildSubBtn('tableAddRowAbove'));
  711. $dropdown.append(t.buildSubBtn('tableAddRow'));
  712. $dropdown.append(t.buildSubBtn('tableAddColumnLeft'));
  713. $dropdown.append(t.buildSubBtn('tableAddColumn'));
  714. $dropdown.append(t.buildSubBtn('tableDeleteRow'));
  715. $dropdown.append(t.buildSubBtn('tableDeleteColumn'));
  716. $dropdown.append(t.buildSubBtn('tableDestroy'));
  717. } else {
  718. var tableSelect = $('<table/>');
  719. $('<tbody/>').appendTo(tableSelect);
  720. for (var i = 0; i < t.o.plugins.table.rows; i += 1) {
  721. var row = $('<tr/>').appendTo(tableSelect);
  722. for (var j = 0; j < t.o.plugins.table.columns; j += 1) {
  723. $('<td/>').appendTo(row);
  724. }
  725. }
  726. tableSelect.find('td').on('mouseover', tableAnimate);
  727. tableSelect.find('td').on('mousedown', tableBuild);
  728. $dropdown.append(tableSelect);
  729. $dropdown.append($('<div class="trumbowyg-table-size">1x1</div>'));
  730. }
  731. t.dropdown(btnName);
  732. }
  733. };
  734. var tableAnimate = function(columnEvent) {
  735. var column = $(columnEvent.target),
  736. table = column.closest('table'),
  737. colIndex = this.cellIndex,
  738. rowIndex = this.parentNode.rowIndex;
  739. // reset all columns
  740. table.find('td').removeClass('active');
  741. for (var i = 0; i <= rowIndex; i += 1) {
  742. for (var j = 0; j <= colIndex; j += 1) {
  743. table.find('tr:nth-of-type('+(i+1)+')').find('td:nth-of-type('+(j+1)+')').addClass('active');
  744. }
  745. }
  746. // set label
  747. table.next('.trumbowyg-table-size').html((colIndex+1) + 'x' + (rowIndex+1));
  748. };
  749. var tableBuild = function() {
  750. t.saveRange();
  751. var tabler = $('<table/>');
  752. $('<tbody/>').appendTo(tabler);
  753. if (t.o.plugins.table.styler) {
  754. tabler.attr('class', t.o.plugins.table.styler);
  755. }
  756. var colIndex = this.cellIndex,
  757. rowIndex = this.parentNode.rowIndex;
  758. for (var i = 0; i <= rowIndex; i += 1) {
  759. var row = $('<tr></tr>').appendTo(tabler);
  760. for (var j = 0; j <= colIndex; j += 1) {
  761. $('<td/>').appendTo(row);
  762. }
  763. }
  764. t.range.deleteContents();
  765. t.range.insertNode(tabler[0]);
  766. t.$c.trigger('tbwchange');
  767. };
  768. var addRow = {
  769. title: t.lang.tableAddRow,
  770. text: t.lang.tableAddRow,
  771. ico: 'row-below',
  772. fn: function () {
  773. t.saveRange();
  774. var node = t.doc.getSelection().focusNode;
  775. var focusedRow = $(node).closest('tr');
  776. var table = $(node).closest('table');
  777. if(table.length > 0) {
  778. var row = $('<tr/>');
  779. // add columns according to current columns count
  780. for (var i = 0; i < table.find('tr')[0].childElementCount; i += 1) {
  781. $('<td/>').appendTo(row);
  782. }
  783. // add row to table
  784. focusedRow.after(row);
  785. }
  786. t.syncCode();
  787. }
  788. };
  789. var addRowAbove = {
  790. title: t.lang.tableAddRowAbove,
  791. text: t.lang.tableAddRowAbove,
  792. ico: 'row-above',
  793. fn: function () {
  794. t.saveRange();
  795. var node = t.doc.getSelection().focusNode;
  796. var focusedRow = $(node).closest('tr');
  797. var table = $(node).closest('table');
  798. if(table.length > 0) {
  799. var row = $('<tr/>');
  800. // add columns according to current columns count
  801. for (var i = 0; i < table.find('tr')[0].childElementCount; i += 1) {
  802. $('<td/>').appendTo(row);
  803. }
  804. // add row to table
  805. focusedRow.before(row);
  806. }
  807. t.syncCode();
  808. }
  809. };
  810. var addColumn = {
  811. title: t.lang.tableAddColumn,
  812. text: t.lang.tableAddColumn,
  813. ico: 'col-right',
  814. fn: function () {
  815. t.saveRange();
  816. var node = t.doc.getSelection().focusNode;
  817. var focusedCol = $(node).closest('td');
  818. var table = $(node).closest('table');
  819. var focusedColIdx = focusedCol.index();
  820. if(table.length > 0) {
  821. $(table).find('tr').each(function() {
  822. $($(this).children()[focusedColIdx]).after('<td></td>');
  823. });
  824. }
  825. t.syncCode();
  826. }
  827. };
  828. var addColumnLeft = {
  829. title: t.lang.tableAddColumnLeft,
  830. text: t.lang.tableAddColumnLeft,
  831. ico: 'col-left',
  832. fn: function () {
  833. t.saveRange();
  834. var node = t.doc.getSelection().focusNode;
  835. var focusedCol = $(node).closest('td');
  836. var table = $(node).closest('table');
  837. var focusedColIdx = focusedCol.index();
  838. if(table.length > 0) {
  839. $(table).find('tr').each(function() {
  840. $($(this).children()[focusedColIdx]).before('<td></td>');
  841. });
  842. }
  843. t.syncCode();
  844. }
  845. };
  846. var destroy = {
  847. title: t.lang.tableDestroy,
  848. text: t.lang.tableDestroy,
  849. ico: 'table-delete',
  850. fn: function () {
  851. t.saveRange();
  852. var node = t.doc.getSelection().focusNode,
  853. table = $(node).closest('table');
  854. table.remove();
  855. t.syncCode();
  856. }
  857. };
  858. var deleteRow = {
  859. title: t.lang.tableDeleteRow,
  860. text: t.lang.tableDeleteRow,
  861. ico: 'row-delete',
  862. fn: function () {
  863. t.saveRange();
  864. var node = t.doc.getSelection().focusNode,
  865. row = $(node).closest('tr');
  866. row.remove();
  867. t.syncCode();
  868. }
  869. };
  870. var deleteColumn = {
  871. title: t.lang.tableDeleteColumn,
  872. text: t.lang.tableDeleteColumn,
  873. ico: 'col-delete',
  874. fn: function () {
  875. t.saveRange();
  876. var node = t.doc.getSelection().focusNode,
  877. table = $(node).closest('table'),
  878. td = $(node).closest('td'),
  879. cellIndex = td.index();
  880. $(table).find('tr').each(function() {
  881. $(this).find('td:eq(' + cellIndex + ')').remove();
  882. });
  883. t.syncCode();
  884. }
  885. };
  886. t.addBtnDef('table', buildButtonDef);
  887. t.addBtnDef('tableAddRowAbove', addRowAbove);
  888. t.addBtnDef('tableAddRow', addRow);
  889. t.addBtnDef('tableAddColumnLeft', addColumnLeft);
  890. t.addBtnDef('tableAddColumn', addColumn);
  891. t.addBtnDef('tableDeleteRow', deleteRow);
  892. t.addBtnDef('tableDeleteColumn', deleteColumn);
  893. t.addBtnDef('tableDestroy', destroy);
  894. }
  895. }
  896. }
  897. });
  898. })(jQuery);