diff options
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.java | 233 |
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 |