trumbowyg.preformatted.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /* ===========================================================
  2. * trumbowyg.preformatted.js v1.0
  3. * Preformatted plugin for Trumbowyg
  4. * http://alex-d.github.com/Trumbowyg
  5. * ===========================================================
  6. * Author : Casella Edoardo (Civile)
  7. */
  8. (function ($) {
  9. 'use strict';
  10. $.extend(true, $.trumbowyg, {
  11. langs: {
  12. // jshint camelcase:false
  13. en: {
  14. preformatted: 'Code sample <pre>'
  15. },
  16. da: {
  17. preformatted: 'Præformateret <pre>'
  18. },
  19. fr: {
  20. preformatted: 'Exemple de code <pre>'
  21. },
  22. hu: {
  23. preformatted: 'Kód minta <pre>'
  24. },
  25. it: {
  26. preformatted: 'Codice <pre>'
  27. },
  28. ja: {
  29. preformatted: 'コードサンプル <pre>'
  30. },
  31. ko: {
  32. preformatted: '코드 예제 <pre>'
  33. },
  34. pt_br: {
  35. preformatted: 'Exemple de código <pre>'
  36. },
  37. ru: {
  38. preformatted: 'Пример кода <pre>'
  39. },
  40. tr: {
  41. preformatted: 'Kod örneği <pre>'
  42. },
  43. zh_cn: {
  44. preformatted: '代码示例 <pre>'
  45. },
  46. zh_tw: {
  47. preformatted: '代碼範例 <pre>'
  48. },
  49. },
  50. // jshint camelcase:true
  51. plugins: {
  52. preformatted: {
  53. init: function (trumbowyg) {
  54. var btnDef = {
  55. fn: function () {
  56. trumbowyg.saveRange();
  57. var text = trumbowyg.getRangeText();
  58. if (text.replace(/\s/g, '') !== '') {
  59. try {
  60. var curtag = getSelectionParentElement().tagName.toLowerCase();
  61. if (curtag === 'code' || curtag === 'pre') {
  62. return unwrapCode();
  63. }
  64. else {
  65. trumbowyg.execCmd('insertHTML', '<pre><code>' + strip(text) + '</code></pre>');
  66. }
  67. } catch (e) {
  68. }
  69. }
  70. },
  71. tag: 'pre'
  72. };
  73. trumbowyg.addBtnDef('preformatted', btnDef);
  74. }
  75. }
  76. }
  77. });
  78. /*
  79. * GetSelectionParentElement
  80. */
  81. function getSelectionParentElement() {
  82. var parentEl = null,
  83. selection;
  84. if (window.getSelection) {
  85. selection = window.getSelection();
  86. if (selection.rangeCount) {
  87. parentEl = selection.getRangeAt(0).commonAncestorContainer;
  88. if (parentEl.nodeType !== 1) {
  89. parentEl = parentEl.parentNode;
  90. }
  91. }
  92. } else if ((selection = document.selection) && selection.type !== 'Control') {
  93. parentEl = selection.createRange().parentElement();
  94. }
  95. return parentEl;
  96. }
  97. /*
  98. * Strip
  99. * returns a text without HTML tags
  100. */
  101. function strip(html) {
  102. var tmp = document.createElement('DIV');
  103. tmp.innerHTML = html;
  104. return tmp.textContent || tmp.innerText || '';
  105. }
  106. /*
  107. * UnwrapCode
  108. * ADD/FIX: to improve, works but can be better
  109. * "paranoic" solution
  110. */
  111. function unwrapCode() {
  112. var container = null;
  113. if (document.selection) { //for IE
  114. container = document.selection.createRange().parentElement();
  115. } else {
  116. var select = window.getSelection();
  117. if (select.rangeCount > 0) {
  118. container = select.getRangeAt(0).startContainer.parentNode;
  119. }
  120. }
  121. //'paranoic' unwrap
  122. var ispre = $(container).contents().closest('pre').length;
  123. var iscode = $(container).contents().closest('code').length;
  124. if (ispre && iscode) {
  125. $(container).contents().unwrap('code').unwrap('pre');
  126. } else if (ispre) {
  127. $(container).contents().unwrap('pre');
  128. } else if (iscode) {
  129. $(container).contents().unwrap('code');
  130. }
  131. }
  132. })(jQuery);