trumbowyg.preformatted.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. it: {
  23. preformatted: 'Codice <pre>'
  24. },
  25. zh_cn: {
  26. preformatted: '代码示例 <pre>'
  27. },
  28. ru: {
  29. preformatted: 'Пример кода <pre>'
  30. },
  31. ja: {
  32. preformatted: 'コードサンプル <pre>'
  33. },
  34. tr: {
  35. preformatted: 'Kod örneği <pre>'
  36. },
  37. zh_tw: {
  38. preformatted: '代碼範例 <pre>'
  39. },
  40. },
  41. // jshint camelcase:true
  42. plugins: {
  43. preformatted: {
  44. init: function (trumbowyg) {
  45. var btnDef = {
  46. fn: function () {
  47. trumbowyg.saveRange();
  48. var text = trumbowyg.getRangeText();
  49. if (text.replace(/\s/g, '') !== '') {
  50. try {
  51. var curtag = getSelectionParentElement().tagName.toLowerCase();
  52. if (curtag === 'code' || curtag === 'pre') {
  53. return unwrapCode();
  54. }
  55. else {
  56. trumbowyg.execCmd('insertHTML', '<pre><code>' + strip(text) + '</code></pre>');
  57. }
  58. } catch (e) {
  59. }
  60. }
  61. },
  62. tag: 'pre'
  63. };
  64. trumbowyg.addBtnDef('preformatted', btnDef);
  65. }
  66. }
  67. }
  68. });
  69. /*
  70. * GetSelectionParentElement
  71. */
  72. function getSelectionParentElement() {
  73. var parentEl = null,
  74. selection;
  75. if (window.getSelection) {
  76. selection = window.getSelection();
  77. if (selection.rangeCount) {
  78. parentEl = selection.getRangeAt(0).commonAncestorContainer;
  79. if (parentEl.nodeType !== 1) {
  80. parentEl = parentEl.parentNode;
  81. }
  82. }
  83. } else if ((selection = document.selection) && selection.type !== 'Control') {
  84. parentEl = selection.createRange().parentElement();
  85. }
  86. return parentEl;
  87. }
  88. /*
  89. * Strip
  90. * returns a text without HTML tags
  91. */
  92. function strip(html) {
  93. var tmp = document.createElement('DIV');
  94. tmp.innerHTML = html;
  95. return tmp.textContent || tmp.innerText || '';
  96. }
  97. /*
  98. * UnwrapCode
  99. * ADD/FIX: to improve, works but can be better
  100. * "paranoic" solution
  101. */
  102. function unwrapCode() {
  103. var container = null;
  104. if (document.selection) { //for IE
  105. container = document.selection.createRange().parentElement();
  106. } else {
  107. var select = window.getSelection();
  108. if (select.rangeCount > 0) {
  109. container = select.getRangeAt(0).startContainer.parentNode;
  110. }
  111. }
  112. //'paranoic' unwrap
  113. var ispre = $(container).contents().closest('pre').length;
  114. var iscode = $(container).contents().closest('code').length;
  115. if (ispre && iscode) {
  116. $(container).contents().unwrap('code').unwrap('pre');
  117. } else if (ispre) {
  118. $(container).contents().unwrap('pre');
  119. } else if (iscode) {
  120. $(container).contents().unwrap('code');
  121. }
  122. }
  123. })(jQuery);