001 /*
002 * Copyright 2009 - 2010 JEuclid, http://jeuclid.sf.net
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 /* $Id $ */
018
019 package net.sourceforge.jeuclid.biparser;
020
021 import org.w3c.dom.Document;
022 import org.w3c.dom.Node;
023 import org.w3c.dom.Text;
024
025 /**
026 * this class is used to store specific information about a text node. the
027 * node cannot have a child nor a sibling
028 *
029 * @version $Revision: cbff5bfffc35 $
030 */
031 public final class TextNode extends AbstractBiNode {
032
033 /** DOM-info: text of node. */
034 private String text;
035
036 /** new line. */
037 private final String nl = System.getProperty("line.separator");
038
039 /** ladder #. */
040 private final String ladder = "#";
041
042 /**
043 * creates a new TextNode, constructor does not create a DOM-node.
044 *
045 * @param length
046 * length of child
047 * @param t
048 * DOM-info
049 */
050 public TextNode(final int length, final String t) {
051 this.setLength(length);
052 this.text = t;
053 }
054
055 /**
056 * get the type of node.
057 *
058 * @return TEXT
059 */
060 public BiType getType() {
061 return BiType.TEXT;
062 }
063
064 /**
065 * insert characters in TextNode, always reparse parent node.
066 * {@inheritDoc}
067 */
068 public void insert(final BiTree biTree, final int offset,
069 final int length, final int totalOffset) throws ReparseException {
070 throw new ReparseException();
071 }
072
073 /**
074 * remove characters in TextNode, always reparse parent node.
075 * {@inheritDoc}
076 */
077 public void remove(final BiTree biTree, final int offset,
078 final int length, final int totalOffset) throws ReparseException {
079 throw new ReparseException();
080 }
081
082 /**
083 * forward insert/remove to sibling not allowed at a TextNode.
084 * {@inheritDoc}
085 */
086 @Override
087 public void forwardToSibling(final boolean insert, final BiTree biTree,
088 final int offset, final int length, final int totalOffset)
089 throws ReparseException {
090 throw new UnsupportedOperationException("forwardToSibling "
091 + "at textnode not allowed");
092 }
093
094 /**
095 * get the text of TextNode.
096 *
097 * @return text of TextNode
098 */
099 public String getText() {
100 final String ret;
101
102 if (this.text == null) {
103 if (this.getNode() == null) {
104 ret = null;
105 } else {
106 ret = this.getNode().getTextContent();
107 }
108 } else {
109 ret = this.text;
110 }
111
112 return ret;
113 }
114
115 /**
116 * create a DOM-textnode.
117 *
118 * @param doc
119 * Document to create DOM-tree
120 * @return DOM-textnode
121 */
122 public Node createDOMSubtree(final Document doc) {
123 Text textNode;
124
125 textNode = doc.createTextNode(this.text);
126 this.text = null;
127
128 this.setNode(textNode);
129 return textNode;
130 }
131
132 /** {@inheritDoc} */
133 @Override
134 public TextPosition searchNode(final Node node, final int totalOffset) {
135 return super.searchNode(node, totalOffset);
136 }
137
138 @Override
139 public String toString() {
140 final StringBuffer sb = new StringBuffer(32);
141
142 sb.append("[TEXT length:");
143 sb.append(this.getLength());
144 sb.append(" '");
145 sb.append(this.getText().replaceAll(this.nl, this.ladder));
146 sb.append("']");
147
148 return sb.toString();
149 }
150
151 /** {@inheritDoc} */
152 public String toString(final int level) {
153 final StringBuffer sb = new StringBuffer();
154
155 sb.append(this.formatLength());
156 sb.append(':');
157 for (int i = 0; i <= level; i++) {
158 sb.append(' ');
159 }
160
161 sb.append('\'');
162 sb.append(this.getText().replaceAll(this.nl, this.ladder));
163 sb.append('\'');
164
165 return sb.toString();
166 }
167 }