textimpl.java

来自「JAVA 所有包」· Java 代码 · 共 663 行 · 第 1/2 页

JAVA
663
字号
            this.setData(content);            currentNode = this;        }        //check logically-adjacent text nodes        Node prev = currentNode.getPreviousSibling();        while (prev != null) {            //If the logically-adjacent next node can be removed            //remove it. A logically adjacent node can be removed if            //it is a Text or CDATASection node or an EntityReference with            //Text and CDATA only children.                        if ((prev.getNodeType() == Node.TEXT_NODE)                    || (prev.getNodeType() == Node.CDATA_SECTION_NODE)                    || (prev.getNodeType() == Node.ENTITY_REFERENCE_NODE && hasTextOnlyChildren(prev))) {                parent.removeChild(prev);                prev = currentNode;            } else {                break;            }            prev = prev.getPreviousSibling();        }        //check logically-adjacent text nodes        Node next = currentNode.getNextSibling();        while (next != null) {            //If the logically-adjacent next node can be removed            //remove it. A logically adjacent node can be removed if            //it is a Text or CDATASection node or an EntityReference with            //Text and CDATA only children.            if ((next.getNodeType() == Node.TEXT_NODE)                    || (next.getNodeType() == Node.CDATA_SECTION_NODE)                    || (next.getNodeType() == Node.ENTITY_REFERENCE_NODE && hasTextOnlyChildren(next))) {                parent.removeChild(next);                next = currentNode;            } else {                break;            }            next = next.getNextSibling();        }        return currentNode;    }    /**     * If any EntityReference to be removed has descendants that are not     * EntityReference, Text, or CDATASection nodes, the replaceWholeText method     * must fail before performing any modification of the document, raising a     * DOMException with the code NO_MODIFICATION_ALLOWED_ERR. Traverse previous     * siblings of the node to be replaced. If a previous sibling is an     * EntityReference node, get it's last child. If the last child was a Text     * or CDATASection node and its previous siblings are neither a replaceable     * EntityReference or Text or CDATASection nodes, return false. IF the last     * child was neither Text nor CDATASection nor a replaceable EntityReference     * Node, then return true. If the last child was a Text or CDATASection node     * any its previous sibling was not or was an EntityReference that did not     * contain only Text or CDATASection nodes, return false. Check this     * recursively for EntityReference nodes.     *      * @param node     * @return true - can replace text false - can't replace exception must be     *         raised     */    private boolean canModifyPrev(Node node) {        boolean textLastChild = false;        Node prev = node.getPreviousSibling();        while (prev != null) {            short type = prev.getNodeType();            if (type == Node.ENTITY_REFERENCE_NODE) {                //If the previous sibling was entityreference                //check if its content is replaceable                Node lastChild = prev.getLastChild();                //if the entity reference has no children                //return false                if (lastChild == null) {                    return false;                }                //The replacement text of the entity reference should                //be either only text,cadatsections or replaceable entity                //reference nodes or the last child should be neither of these                while (lastChild != null) {                    short lType = lastChild.getNodeType();                    if (lType == Node.TEXT_NODE                            || lType == Node.CDATA_SECTION_NODE) {                        textLastChild = true;                    } else if (lType == Node.ENTITY_REFERENCE_NODE) {                        if (!canModifyPrev(lastChild)) {                            return false;                        } else {                            //If the EntityReference child contains                            //only text, or non-text or ends with a                            //non-text node.                            textLastChild = true;                        }                    } else {                        //If the last child was replaceable and others are not                        //Text or CDataSection or replaceable EntityRef nodes                        //return false.                        if (textLastChild) {                            return false;                        } else {                            return true;                        }                    }                    lastChild = lastChild.getPreviousSibling();                }            } else if (type == Node.TEXT_NODE                    || type == Node.CDATA_SECTION_NODE) {                //If the previous sibling was text or cdatasection move to next            } else {                //If the previous sibling was anything but text or                //cdatasection or an entity reference, stop search and                //return true                return true;            }            prev = prev.getPreviousSibling();        }        return true;    }    /**     * If any EntityReference to be removed has descendants that are not     * EntityReference, Text, or CDATASection nodes, the replaceWholeText method     * must fail before performing any modification of the document, raising a     * DOMException with the code NO_MODIFICATION_ALLOWED_ERR. Traverse previous     * siblings of the node to be replaced. If a previous sibling is an     * EntityReference node, get it's last child. If the first child was a Text     * or CDATASection node and its next siblings are neither a replaceable     * EntityReference or Text or CDATASection nodes, return false. IF the first     * child was neither Text nor CDATASection nor a replaceable EntityReference     * Node, then return true. If the first child was a Text or CDATASection     * node any its next sibling was not or was an EntityReference that did not     * contain only Text or CDATASection nodes, return false. Check this     * recursively for EntityReference nodes.     *      * @param node     * @return true - can replace text false - can't replace exception must be     *         raised     */    private boolean canModifyNext(Node node) {        boolean textFirstChild = false;        Node next = node.getNextSibling();        while (next != null) {            short type = next.getNodeType();            if (type == Node.ENTITY_REFERENCE_NODE) {                //If the previous sibling was entityreference                //check if its content is replaceable                Node firstChild = next.getFirstChild();                //if the entity reference has no children                //return false                if (firstChild == null) {                    return false;                }                //The replacement text of the entity reference should                //be either only text,cadatsections or replaceable entity                //reference nodes or the last child should be neither of these                while (firstChild != null) {                    short lType = firstChild.getNodeType();                    if (lType == Node.TEXT_NODE                            || lType == Node.CDATA_SECTION_NODE) {                        textFirstChild = true;                    } else if (lType == Node.ENTITY_REFERENCE_NODE) {                        if (!canModifyNext(firstChild)) {                            return false;                        } else {                            //If the EntityReference child contains                            //only text, or non-text or ends with a                            //non-text node.                            textFirstChild = true;                        }                    } else {                        //If the first child was replaceable text and next                        //children are not, then return false                        if (textFirstChild) {                            return false;                        } else {                            return true;                        }                    }                    firstChild = firstChild.getNextSibling();                }            } else if (type == Node.TEXT_NODE                    || type == Node.CDATA_SECTION_NODE) {                //If the previous sibling was text or cdatasection move to next            } else {                //If the next sibling was anything but text or                //cdatasection or an entity reference, stop search and                //return true                return true;            }            next = next.getNextSibling();        }        return true;    }    /**     * Check if an EntityReference node has Text Only child nodes     *      * @param node     * @return true - Contains text only children     */    private boolean hasTextOnlyChildren(Node node) {        Node child = node;                if (child == null) {            return false;        }                child = child.getFirstChild();        while (child != null) {            int type = child.getNodeType();                        if (type == Node.ENTITY_REFERENCE_NODE) {                return hasTextOnlyChildren(child);            }             else if (type != Node.TEXT_NODE                    && type != Node.CDATA_SECTION_NODE                    && type != Node.ENTITY_REFERENCE_NODE) {                return false;            }            child = child.getNextSibling();        }        return true;    }            /**     * NON-DOM: Returns whether this Text is ignorable whitespace.     */    public boolean isIgnorableWhitespace() {        if (needsSyncData()) {            synchronizeData();        }        return internalIsIgnorableWhitespace();    } // isIgnorableWhitespace():boolean        //    // Text methods    //    /**     * Break a text node into two sibling nodes. (Note that if the current node     * has no parent, they won't wind up as "siblings" -- they'll both be     * orphans.)     *      * @param offset     *            The offset at which to split. If offset is at the end of the     *            available data, the second node will be empty.     *      * @return A reference to the new node (containing data after the offset     *         point). The original node will contain data up to that point.     *      * @throws DOMException(INDEX_SIZE_ERR)     *             if offset is <0 or >length.     *      * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR)     *             if node is read-only.     */    public Text splitText(int offset)         throws DOMException {        if (isReadOnly()) {            throw new DOMException(            DOMException.NO_MODIFICATION_ALLOWED_ERR,                 DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null));        }        if (needsSyncData()) {            synchronizeData();        }        if (offset < 0 || offset > data.length() ) {            throw new DOMException(DOMException.INDEX_SIZE_ERR,                 DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "INDEX_SIZE_ERR", null));        }                    // split text into two separate nodes        Text newText =            getOwnerDocument().createTextNode(data.substring(offset));        setNodeValue(data.substring(0, offset));        // insert new text node        Node parentNode = getParentNode();        if (parentNode != null) {            parentNode.insertBefore(newText, nextSibling);        }        return newText;    } // splitText(int):Text        /**     * NON-DOM (used by DOMParser): Reset data for the node.      */    public void replaceData (String value){        data = value;    }    /**     * NON-DOM (used by DOMParser: Sets data to empty string.      *  Returns the value the data was set to.     */    public String removeData (){        String olddata=data;        data = "";        return olddata;    }} // class TextImpl

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?