Beispiel #1
0
    def __validateBoundary(self, node, offset):
        """Make sure the node is a legal boundary"""

        if not hasattr(node, 'nodeType'):
            raise InvalidNodeTypeErr()

        #Check for proper node type
        curNode = node
        while curNode:
            if curNode.nodeType in [
                    Node.ENTITY_NODE,
                    Node.NOTATION_NODE,
                    Node.DOCUMENT_TYPE_NODE,
            ]:
                raise InvalidNodeTypeErr()
            curNode = curNode.parentNode

        #Check number of cild units
        if offset < 0:
            raise IndexSizeErr()

        if node.nodeType in [
                Node.TEXT_NODE, Node.COMMENT_NODE,
                Node.PROCESSING_INSTRUCTION_NODE
        ]:
            #Child units are characters
            if offset > len(node.data):
                raise IndexSizeErr()
        else:
            if offset > len(node.childNodes):
                raise IndexSizeErr()
Beispiel #2
0
    def insertNode(self, newNode):
        """Insert a node at the starting point"""

        if self.detached:
            raise InvalidStateErr()

        if newNode.nodeType in [
                Node.ATTRIBUTE_NODE,
                Node.ENTITY_NODE,
                Node.NOTATION_NODE,
                Node.DOCUMENT_NODE,
        ]:
            raise InvalidNodeTypeErr()

        if self.startContainer.nodeType == Node.TEXT_NODE:
            #Split the text at the boundary.  Insert the node after this
            otherText = self.startContainer.substringData(
                self.startOffset, len(self.startContainer.data))
            self.startContainer.deleteData(self.startOffset,
                                           len(self.startContainer.data))
            newText = self._ownerDocument.createTextNode(otherText)
            self.startContainer.parentNode.insertBefore(
                newText, self.startContainer.nextSibling)

            newText.parentNode.insertBefore(newNode, newText)
        elif self.startContainer.nodeType in [
                Node.COMMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE
        ]:
            raise HierarchyRequestErr()
        else:
            curNode = self.startContainer.childNodes[self.startOffset]
            self.startContainer.insertBefore(newNode, curNode.nextSibling)
Beispiel #3
0
    def __validateRefNode(self,node):

        if not hasattr(node,'nodeType'):
            raise InvalidNodeTypeErr()

        cur = node
        while cur.parentNode:
            cur = cur.parentNode
        if cur.nodeType not in [Node.ATTRIBUTE_NODE,
                                Node.DOCUMENT_NODE,
                                Node.DOCUMENT_FRAGMENT_NODE,
                                ]:
            raise InvalidNodeTypeErr()

        if node.nodeType in [Node.DOCUMENT_NODE,
                             Node.DOCUMENT_FRAGMENT_NODE,
                             Node.ATTRIBUTE_NODE,
                             Node.ENTITY_NODE,
                             Node.NOTATION_NODE,
                             ]:

            raise InvalidNodeTypeErr()
Beispiel #4
0
    def surrondContents(self, newParent):
        """Surrond the range with this node"""
        if self.detached:
            raise InvalidStateErr()

        if newParent.nodeType in [
                Node.ATTRIBUTE_NODE, Node.ENTITY_NODE, Node.DOCUMENT_TYPE_NODE,
                Node.NOTATION_NODE, Node.DOCUMENT_NODE,
                Node.DOCUMENT_FRAGMENT_NODE
        ]:
            raise InvalidNodeTypeErr()

        #See is we have element nodes that are partially selected
        if self.startContainer.nodeType not in [
                Node.TEXT_NODE, Node.COMMENT_NODE,
                Node.PROCESSING_INSTRUCTION_NODE
        ]:
            if self.commonAncestorContainer not in [
                    self.startContainer, self.startContainer.parentNode
            ]:
                #This is partially selected because our parent is not the common ancestor
                raise BadBoundaryPointsErr()
        if self.endContainer.nodeType not in [
                Node.TEXT_NODE, Node.COMMENT_NODE,
                Node.PROCESSING_INSTRUCTION_NODE
        ]:
            if self.commonAncestorContainer not in [
                    self.endContainer, self.endContainer.parentNode
            ]:
                #This is partially selected because our parent is not the common ancestor
                raise BadBoundaryPointsErr()

        #All good, do the insert
        #Remove children from newPArent
        for c in newParent.childNodes:
            newParent.removeChild(c)

        df = self.extractContents()

        self.insertNode(newParent)

        newParent.appendChild(df)

        self.selectNode(newParent)