Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/format/SpaceConverter.java')
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/format/SpaceConverter.java233
1 files changed, 233 insertions, 0 deletions
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/format/SpaceConverter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/format/SpaceConverter.java
new file mode 100644
index 0000000000..08b3016bd1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/format/SpaceConverter.java
@@ -0,0 +1,233 @@
+/*******************************************************************************
+ * Copyright (c) 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.html.core.format;
+
+
+
+final class SpaceConverter {
+
+ private String source = null;
+ private int length = 0;
+ private int startOffset = 0;
+ private int endOffset = 0;
+ private int spaceCount = 0;
+ private int wordCount = 0;
+ private StringBuffer buffer = null;
+ private int lastOffset = 0;
+ private boolean keepBlankLines = false;
+
+ /**
+ */
+ public SpaceConverter(String source) {
+ super();
+
+ if (source == null) {
+ this.source = new String();
+ }
+ else {
+ this.source = source;
+ this.length = source.length();
+ }
+ }
+
+ /**
+ */
+ public SpaceConverter(String source, boolean keepBlankLines) {
+ super();
+
+ if (source == null) {
+ this.source = new String();
+ }
+ else {
+ this.source = source;
+ this.length = source.length();
+ }
+ this.keepBlankLines = keepBlankLines;
+ }
+
+ /**
+ */
+ public void compressSpaces() {
+ if (this.spaceCount == 0)
+ return;
+ if (this.spaceCount == 1 && this.source.charAt(this.startOffset) == ' ')
+ return;
+
+ if (this.buffer == null)
+ this.buffer = new StringBuffer();
+ if (this.startOffset > this.lastOffset) {
+ this.buffer.append(this.source.substring(this.lastOffset, this.startOffset));
+ }
+
+ this.buffer.append(' ');
+
+ this.lastOffset = this.startOffset + this.spaceCount;
+ }
+
+ /**
+ */
+ public String getSource() {
+ if (this.buffer == null)
+ this.buffer = new StringBuffer();
+ if (this.length > this.lastOffset) {
+ this.buffer.append(this.source.substring(this.lastOffset, this.length));
+ }
+ return this.buffer.toString();
+ }
+
+ /**
+ */
+ public int getSpaceCount() {
+ return this.spaceCount;
+ }
+
+ /**
+ */
+ public boolean hasSpaces() {
+ return (this.spaceCount > 0);
+ }
+
+ /**
+ */
+ public boolean isModified() {
+ return (this.buffer != null);
+ }
+
+ /**
+ * Add number of the old blank lines to new space string
+ */
+ private static String mergeBlankLines(String newSpaces, String oldSpaces) {
+ if (newSpaces == null || newSpaces.length() == 0)
+ return newSpaces;
+ if (oldSpaces == null)
+ return newSpaces;
+
+ // count old new lines
+ int newLineCount = 0;
+ int oldLength = oldSpaces.length();
+ for (int i = 0; i < oldLength; i++) {
+ char c = oldSpaces.charAt(i);
+ if (c == '\r') {
+ newLineCount++;
+ if (i + 1 < oldLength) {
+ c = oldSpaces.charAt(i + 1);
+ if (c == '\n')
+ i++;
+ }
+ }
+ else {
+ if (c == '\n')
+ newLineCount++;
+ }
+ }
+ if (newLineCount < 2)
+ return newSpaces; // no blank line
+
+ // here assuming newSpaces starts with a new line if any
+ String delim = null;
+ char d = newSpaces.charAt(0);
+ if (d == '\r') {
+ if (newSpaces.length() > 1 && newSpaces.charAt(1) == '\n')
+ delim = "\r\n";//$NON-NLS-1$
+ else
+ delim = "\r";//$NON-NLS-1$
+ }
+ else {
+ if (d == '\n')
+ delim = "\n";//$NON-NLS-1$
+ else
+ return newSpaces; // no new line
+ }
+
+ newLineCount--;
+ StringBuffer buffer = new StringBuffer(newSpaces.length() + newLineCount * 2);
+ while (newLineCount > 0) {
+ buffer.append(delim);
+ newLineCount--;
+ }
+ buffer.append(newSpaces);
+ return buffer.toString();
+ }
+
+ /**
+ */
+ public int nextWord() {
+ if (this.endOffset == this.length) {
+ this.startOffset = this.endOffset;
+ this.spaceCount = 0;
+ this.wordCount = 0;
+ return 0;
+ }
+
+ this.startOffset = this.endOffset;
+ int i = this.startOffset;
+ for (; i < this.length; i++) {
+ if (!Character.isWhitespace(this.source.charAt(i)))
+ break;
+ }
+ this.spaceCount = i - this.startOffset;
+
+ int wordOffset = i;
+ for (; i < this.length; i++) {
+ if (Character.isWhitespace(this.source.charAt(i)))
+ break;
+ }
+ this.wordCount = i - wordOffset;
+ this.endOffset = i;
+
+ return this.wordCount;
+ }
+
+ /**
+ */
+ public void replaceSpaces(String spaces) {
+ int spaceLength = (spaces != null ? spaces.length() : 0);
+ String oldSpaces = null;
+ if (spaceLength == this.spaceCount) {
+ if (spaceLength == 0)
+ return;
+ if (this.startOffset == 0) {
+ if (this.source.startsWith(spaces))
+ return;
+ }
+ else if (this.endOffset == this.length) {
+ if (this.source.endsWith(spaces))
+ return;
+ }
+ else {
+ int textOffset = this.startOffset + this.spaceCount;
+ oldSpaces = this.source.substring(this.startOffset, textOffset);
+ if (oldSpaces.equals(spaces))
+ return;
+ }
+ }
+ if (this.keepBlankLines && this.spaceCount > 0) {
+ if (oldSpaces == null) {
+ int textOffset = this.startOffset + this.spaceCount;
+ oldSpaces = this.source.substring(this.startOffset, textOffset);
+ }
+ if (oldSpaces != null) {
+ spaces = mergeBlankLines(spaces, oldSpaces);
+ }
+ }
+
+ if (this.buffer == null)
+ this.buffer = new StringBuffer();
+ if (this.startOffset > this.lastOffset) {
+ this.buffer.append(this.source.substring(this.lastOffset, this.startOffset));
+ }
+
+ if (spaceLength > 0)
+ this.buffer.append(spaces);
+
+ this.lastOffset = this.startOffset + this.spaceCount;
+ }
+} \ No newline at end of file

Back to the top