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 + -
显示快捷键?