src/cm/media/js/client/c_selection.js
author gibus
Wed, 11 Sep 2013 23:13:01 +0200
changeset 532 0bad3613f59d
parent 525 89ef5ed3c48b
child 556 69503659fe8f
permissions -rw-r--r--
Reverse to YUI 3.0.0 since with YUI.3.10.3, comment content including words 'paragraph' or 'section' do not show up on Firefox, this is weird and has to be investigated.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
getWrapperAncestor = function(elt) {
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
     2
  var parent = elt ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
     3
  while (parent != null) {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
     4
      if (CY.DOM.hasClass(parent, 'c-s')) 
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
     5
        return parent ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
     6
      parent = parent.parentNode ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
     7
  }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
     8
  return null ; 
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
hasWrapperAncestor = function(elt) {
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    12
  return (getWrapperAncestor(elt) != null) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    13
/*  var parent = elt ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    14
  while (parent != null) {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    15
      if (CY.DOM.hasClass(parent, 'c-s')) 
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    16
        return true ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    17
      parent = parent.parentNode ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    18
  }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    19
  return false ;*/ 
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
// returns null or :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
// {'text' : textcontent, 'start': {'elt':startNode, 'nbChar':startOffset(==number of characters to selection start in the start node},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
// 'end': ....}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
// the text attribute is informational having it empty doesn't mean selection is empty !!
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
// when selection starts/ends in/on a non textual element (<hr/> for example) we very often have anchorNode/focusNode == body elt
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
// TODO adapt this body case by considering offset ( cf. http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
getSelectionInfo  = function () {
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    30
  var startNode = null, endNode = null, startOffset = 0, endOffset = 0, text = '' ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    31
  
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    32
  if (window.getSelection) { // everything else than IE
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    33
    var userSelection = window.getSelection();
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    35
    if (userSelection.rangeCount > 0) {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    36
      var range = userSelection.getRangeAt(0) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    37
      text = range.toString() ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    38
      if (text != "")  {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    39
        
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    40
        // selection occured from right to left ? :
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    41
        var r1 = document.createRange() ;r1.setStart(userSelection.anchorNode, userSelection.anchorOffset) ;r1.collapse(true) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    42
        var r2 = document.createRange() ;r2.setEnd(userSelection.focusNode, userSelection.focusOffset) ;r2.collapse(false) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    43
        var leftToRight = (r2.compareBoundaryPoints(2, r1) == 1) ; // 2 is for END_TO_END
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    44
//        CY.log("leftToRight : " + leftToRight) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    45
        startNode = (leftToRight) ? userSelection.anchorNode.parentNode : userSelection.focusNode.parentNode ;  
397
eba2e55eb437 Fix selection of amath elements
gibus
parents: 341
diff changeset
    46
        // GIB: when selecting amath, we should go up in the dom to find the accurate start/end Nodes
eba2e55eb437 Fix selection of amath elements
gibus
parents: 341
diff changeset
    47
        if (startNode.nodeName == 'mi' || startNode.nodeName == 'mo') {
eba2e55eb437 Fix selection of amath elements
gibus
parents: 341
diff changeset
    48
          startNode = startNode.parentElement.parentElement.parentElement.parentElement;
eba2e55eb437 Fix selection of amath elements
gibus
parents: 341
diff changeset
    49
        }
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    50
        innerStartNode = (leftToRight) ? userSelection.anchorNode : userSelection.focusNode ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    51
        endNode = (leftToRight) ? userSelection.focusNode.parentNode : userSelection.anchorNode.parentNode;
397
eba2e55eb437 Fix selection of amath elements
gibus
parents: 341
diff changeset
    52
        // GIB: when selecting amath, we should go up in the dom to find the accurate start/end Nodes
eba2e55eb437 Fix selection of amath elements
gibus
parents: 341
diff changeset
    53
        if (endNode.nodeName == 'mi' || endNode.nodeName == 'mo') {
eba2e55eb437 Fix selection of amath elements
gibus
parents: 341
diff changeset
    54
          endNode = endNode.parentElement.parentElement.parentElement.parentElement;
eba2e55eb437 Fix selection of amath elements
gibus
parents: 341
diff changeset
    55
        }
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    56
        innerEndNode = (leftToRight) ? userSelection.focusNode : userSelection.anchorNode;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    57
          
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    58
        startOffset = (leftToRight) ? userSelection.anchorOffset : userSelection.focusOffset;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    59
        endOffset = (leftToRight) ? userSelection.focusOffset : userSelection.anchorOffset ;
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    61
        if (!hasWrapperAncestor(endNode) && hasWrapperAncestor(startNode)){
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    62
          var r3 = document.createRange() ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    63
          r3.setStart(innerStartNode, startOffset) ;
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    65
          var csStartAncestor = getWrapperAncestor(startNode) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    66
          var next = csStartAncestor ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    67
          r3.setEndAfter(next) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    68
          
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    69
          var ind = parseInt(csStartAncestor.id.substring('sv_'.length)) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    70
          while(r3.toString().length < range.toString().length) {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    71
              ind++ ;
532
0bad3613f59d Reverse to YUI 3.0.0 since with YUI.3.10.3, comment content including words 'paragraph' or 'section' do not show up on Firefox, this is weird and has to be investigated.
gibus
parents: 525
diff changeset
    72
              var node = CY.get("#sv_"+ind) ;
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    73
              if (node) {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    74
                next = CY.Node.getDOMNode(node) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    75
                r3.setEndAfter(next) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    76
              }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    77
              else 
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    78
                break ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    79
          }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    80
          endNode = next.lastChild ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    81
          endOffset = CY.DOM.getText(endNode).length ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    82
        }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    83
        else if (!hasWrapperAncestor(startNode) && hasWrapperAncestor(endNode)){
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    84
          var r3 = document.createRange() ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    85
          r3.setEnd(innerEndNode, endOffset) ;
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    87
          var csEndAncestor = getWrapperAncestor(endNode) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    88
          var prev = csEndAncestor ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    89
          r3.setStartBefore(prev) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    90
          
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    91
          var ind = parseInt(csEndAncestor.id.substring('sv_'.length)) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    92
          while(r3.toString().length < range.toString().length) {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    93
              ind-- ;
532
0bad3613f59d Reverse to YUI 3.0.0 since with YUI.3.10.3, comment content including words 'paragraph' or 'section' do not show up on Firefox, this is weird and has to be investigated.
gibus
parents: 525
diff changeset
    94
              var node = CY.get("#sv_"+ind) ;
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    95
              if (node) {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    96
                prev = CY.Node.getDOMNode(node) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    97
                r3.setStartBefore(prev) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    98
              }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
    99
              else 
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   100
                break ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   101
          }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   102
          startNode = prev.firstChild ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   103
          startOffset = 0 ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   104
        }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   105
        else if (!hasWrapperAncestor(startNode) && !hasWrapperAncestor(endNode)){
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   106
          var textLength = text.length ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   107
          
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   108
          // gather nodes with id sv_xxxx as candidates for start ancestor
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   109
          var startNodeInds = [] ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   110
          for (var ind = 0 ;  ; ind++) {
532
0bad3613f59d Reverse to YUI 3.0.0 since with YUI.3.10.3, comment content including words 'paragraph' or 'section' do not show up on Firefox, this is weird and has to be investigated.
gibus
parents: 525
diff changeset
   111
            var svNode = CY.get("#sv_"+ind) ;
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   112
            if (svNode == null) {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   113
              break;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   114
            }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   115
            else {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   116
              var svText = svNode.get("text") ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   117
              if (text.indexOf(svText) == 0) {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   118
                startNodeInds.push(ind) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   119
              }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   120
            }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   121
          }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   122
          
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   123
          // gather nodes with id sv_xxxx as candidates for end ancestor
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   124
          var endNodeInds = [] ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   125
          for (var ind = 0 ;  ; ind++) {
532
0bad3613f59d Reverse to YUI 3.0.0 since with YUI.3.10.3, comment content including words 'paragraph' or 'section' do not show up on Firefox, this is weird and has to be investigated.
gibus
parents: 525
diff changeset
   126
            var svNode = CY.get("#sv_"+ind) ;
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   127
            if (svNode == null) {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   128
              break;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   129
            }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   130
            else {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   131
              var svText = svNode.get("text") ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   132
              if (text.indexOf(svText) == (textLength - svText.length)) { // i.e. the selection exactly ends with svText
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   133
                endNodeInds.push(ind) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   134
              }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   135
            }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   136
          }
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   138
          var stop = false ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   139
          for (var i = 0 ; i < startNodeInds.length ; i++) {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   140
            for (var j = 0 ; j < endNodeInds.length ; j++) {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   141
              var r4 = document.createRange() ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   142
              
532
0bad3613f59d Reverse to YUI 3.0.0 since with YUI.3.10.3, comment content including words 'paragraph' or 'section' do not show up on Firefox, this is weird and has to be investigated.
gibus
parents: 525
diff changeset
   143
              var s = CY.Node.getDOMNode(CY.get("#sv_"+startNodeInds[i])) ; var e = CY.Node.getDOMNode(CY.get("#sv_"+endNodeInds[j])) ;
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   144
              
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   145
              r4.setStartBefore(s) ; r4.setEndAfter(CY.Node.getDOMNode(e)) ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   146
              
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   147
              // does r4 starts after range start and r4 ends before range end ? 
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   148
              if ((-1 < r4.compareBoundaryPoints(0, range)) && (1 > r4.compareBoundaryPoints(2, range))) { 
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   149
                startNode = s.firstChild ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   150
                startOffset = 0 ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   151
                endNode = e.lastChild ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   152
                endOffset = CY.DOM.getText(e).length ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   153
                
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   154
                stop = true ; 
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   155
                break ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   156
              }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   157
            }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   158
            if (stop)
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   159
              break ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   160
          }             
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   161
        }       
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   162
        
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   163
        r1.detach() ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   164
        r2.detach() ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   165
      }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   166
      else 
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   167
        return null ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   168
    }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   169
    else 
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   170
      return null ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   171
    
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   172
  }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   173
  else if (document.selection) { // IE case
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   174
    var rng = document.selection.createRange();
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   175
    if (rng.text.length == 0) 
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   176
      return null ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   177
    var el = rng.parentElement();
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   179
    // duplicate the range and collapse it to its start, to ask IE the parent element of the start textNode.    
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   180
    var rngStart = rng.duplicate();
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   181
    var rngEnd = rng.duplicate();
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   182
341
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   183
    rngStart.collapse(true); // collapse to start
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   184
    rngEnd.collapse(false);  // collapse to end
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   185
    
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   186
    startNode = rngStart.parentElement() ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   187
    while(rngStart.moveStart('character', -1) != 0) {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   188
      if (rngStart.parentElement() != startNode)
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   189
        break ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   190
      startOffset++ ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   191
    }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   192
    endNode = rngEnd.parentElement() ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   193
    while(rngEnd.moveEnd('character', -1) != 0) {
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   194
      if (rngEnd.parentElement() != endNode)
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   195
        break ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   196
      endOffset++ ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   197
    }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   198
    
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   199
    text = rng.text ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   200
  }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   201
  
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   202
  if (!hasWrapperAncestor(startNode) || !hasWrapperAncestor(endNode)){
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   203
    // CY.log('no wrapper on one end') ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   204
    return null ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   205
  }
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   206
  return {'text' : text, 'start' : {'elt':startNode, 'offset':startOffset}, 'end' : {'elt':endNode, 'offset':endOffset}} ;
053551f213fb Coding style for js: expand tabs
gibus
parents: 0
diff changeset
   207
}