marker.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /**
  2. * @fileOverview
  3. * Wysiwyg 영역의 DOM 조작을 하기전에 선택된 영역의 시작과 끝에 marker를 삽입하여
  4. * DOM 조작을 보다 용이하게 하는 객체로 Processor#execWithMarker 에서 사용된다.
  5. */
  6. Trex.I.Marker = {};
  7. Trex.I.Marker.Standard = /** @lends Trex.Canvas.Marker.prototype */{
  8. /**
  9. * 선택된 영역의 시작과 끝에 marker를 삽입한다.
  10. * @example
  11. * marker.paste();
  12. */
  13. paste: function() {
  14. var _rng = this.processor.getRange();
  15. var _endContainer = _rng.endContainer;
  16. var _startContainer = _rng.startContainer;
  17. if (_endContainer.nodeType == 9) { //NOTE: #FTDUEDTR-919
  18. _endContainer = this.processor.doc.body;
  19. _startContainer = this.processor.doc.body;
  20. }
  21. var _endMarker = this.endMarker = this.processor.create('span', { id: "tx_end_marker" });
  22. var _endOffset = _rng.endOffset;
  23. if (_endContainer.nodeType == 3) {
  24. _endContainer.splitText(_endOffset);
  25. _endContainer.parentNode.insertBefore(_endMarker, _endContainer.nextSibling);
  26. } else {
  27. _endContainer.insertBefore(_endMarker, _endContainer.childNodes[_endOffset]);
  28. }
  29. var _startMarker = this.startMarker = this.processor.create('span', { id: "tx_start_marker" });
  30. var _startOffset = _rng.startOffset;
  31. if(_startContainer.nodeType == 3) {
  32. _startContainer.splitText(_startOffset);
  33. _startContainer.parentNode.insertBefore(_startMarker, _startContainer.nextSibling);
  34. } else {
  35. _startContainer.insertBefore(_startMarker, _startContainer.childNodes[_startOffset]);
  36. }
  37. },
  38. /**
  39. * 삽입된 마커를 제거한다.
  40. * @example
  41. * marker.remove();
  42. */
  43. remove: function() {
  44. $tom.remove(this.startMarker);
  45. $tom.remove(this.endMarker);
  46. }
  47. };
  48. Trex.I.Marker.Trident = /** @lends Trex.Canvas.Marker.prototype */{
  49. /**
  50. * 선택된 영역의 시작과 끝에 marker를 삽입한다.
  51. * @example
  52. * marker.paste();
  53. */
  54. paste: function() {
  55. this.clear();
  56. var _rng = this.processor.getRange();
  57. var _cnxt = this.processor.doc.body;
  58. var _rng1 = _rng.duplicate();
  59. _rng1.collapse(_TRUE);
  60. _rng1.pasteHTML('<span id="tx_start_marker"></span>');
  61. this.startMarker = $tom.collect(_cnxt, '#tx_start_marker');
  62. var _rng2 = _rng.duplicate();
  63. _rng2.collapse(_FALSE);
  64. _rng2.pasteHTML('<span id="tx_end_marker"></span>');
  65. this.endMarker = $tom.collect(_cnxt, '#tx_end_marker');
  66. },
  67. /**
  68. * @private
  69. * 기존에 삽입된 마커를 모두 제거한다.
  70. * @example
  71. * marker.remove();
  72. */
  73. clear: function() {
  74. var _cnxt = this.processor.doc.body;
  75. $tom.remove($tom.collect(_cnxt, '#tx_start_marker'));
  76. $tom.remove($tom.collect(_cnxt, '#tx_end_marker'));
  77. },
  78. /**
  79. * 삽입된 마커를 제거한다.
  80. * @example
  81. * marker.remove();
  82. */
  83. remove: function() {
  84. $tom.remove(this.startMarker);
  85. $tom.remove(this.endMarker);
  86. }
  87. };
  88. /**
  89. * Wysiwyg 영역의 DOM 조작을 하기전에 선택된 영역의 시작과 끝에 marker를 삽입하여 <br/>
  90. * DOM 조작을 보다 용이하게 하는 객체로 <br/>
  91. * browser에 따라 필요한 함수들을 mixin한다. <br/>
  92. * Processor#execWithMarker 에서만 사용된다.<br/>
  93. *
  94. * @example
  95. * var _marker = new Trex.Canvas.Marker(processor);
  96. * processor.bookmarkTo();
  97. * try {
  98. * _marker.paste();
  99. * _marker.backup();
  100. * handler(_marker);
  101. * } catch(e) {
  102. * } finally {
  103. * _marker.remove();
  104. * }
  105. * @class
  106. * @param {Object} processor - Processor 객체
  107. */
  108. Trex.Canvas.Marker = Trex.Class.create(/** @lends Trex.Canvas.Marker.prototype */{
  109. /** @ignore */
  110. $mixins: [
  111. (($tx.msie_nonstd)? Trex.I.Marker.Trident: Trex.I.Marker.Standard)
  112. ],
  113. initialize: function(processor) {
  114. this.processor = processor;
  115. },
  116. /**
  117. * 마커를 삽입한 후 북마크를 수정한다.
  118. * @example
  119. * marker.backup();
  120. */
  121. backup: function() {
  122. this.processor.bookmarkWithMarker(this);
  123. },
  124. /**
  125. * @private
  126. * 선택된 영역이 collapse인지 여부를 리턴한다.
  127. * @returns {Boolean} - 선택된 영역이 collapse인지 여부
  128. * @example
  129. * marker.checkCollapsed();
  130. */
  131. checkCollapsed: function() {
  132. return ($tom.next(this.startMarker) == this.endMarker); //collapsed
  133. }
  134. });