/** * Utility method for traversing a text node that we know * a-priori to be on a left or right boundary of the range. * This method does not properly handle text nodes that contain * both the start and end points of the range. * */ DOM_Node RangeImpl::traverseTextNode( DOM_Node n, bool isLeft, int how ) { DOMString txtValue = n.getNodeValue(); DOMString newNodeValue; DOMString oldNodeValue; if ( isLeft ) { int offset = getStartOffset(); newNodeValue = txtValue.substringData( offset , fStartContainer.getNodeValue().length()-offset); oldNodeValue = txtValue.substringData( 0, offset ); } else { int offset = getEndOffset(); newNodeValue = txtValue.substringData( 0, offset ); oldNodeValue = txtValue.substringData( offset , fEndContainer.getNodeValue().length()-offset ); } if ( how != CLONE_CONTENTS ) n.setNodeValue( oldNodeValue ); if ( how==DELETE_CONTENTS ) return null; DOM_Node newNode = n.cloneNode( false ); newNode.setNodeValue( newNodeValue ); return newNode; }
/** * Utility method for traversing a single node when * we know a-priori that the node if partially * selected and is not a text node. * */ DOM_Node RangeImpl::traversePartiallySelected( DOM_Node n, int how ) { switch( how ) { case DELETE_CONTENTS: return null; case CLONE_CONTENTS: case EXTRACT_CONTENTS: return n.cloneNode( false ); } return null; }
/** * Utility method for traversing a single node when * we know a-priori that the node if fully * selected. * */ DOM_Node RangeImpl::traverseFullySelected( DOM_Node n, int how ) { switch( how ) { case CLONE_CONTENTS: return n.cloneNode( true ); case EXTRACT_CONTENTS: if ( n.getNodeType()== DOM_Node::DOCUMENT_TYPE_NODE ) { throw DOM_DOMException( DOM_DOMException::HIERARCHY_REQUEST_ERR, null); } return n; case DELETE_CONTENTS: n.getParentNode().removeChild(n); return null; } return null; }