blob: f631aa12923a393855a02ec36533e92a70fa01bc [file] [log] [blame]
/*
* Copyright (c) 2011, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.tools.ui.omni.util;
import java.util.ArrayList;
import java.util.List;
/**
* Utility methods for camel case style matching.
*/
public class CamelUtil {
/**
* Returns a lowercase string consisting of all initials of the words in the given String. Words
* are separated by whitespace and other special characters, or by uppercase letters in a word
* like CamelCase.
*
* @param s the string
* @return a lowercase string containing the first character of every word in the given string.
*/
public static String getCamelCase(String s) {
StringBuffer result = new StringBuffer();
if (s.length() > 0) {
int index = 0;
while (index != -1) {
result.append(s.charAt(index));
index = getNextCamelIndex(s, index + 1);
}
}
return result.toString().toLowerCase();
}
/**
* Return an array with start/end indices for the characters used for camel case matching,
* ignoring the first (start) many camel case characters. For example,
* getCamelCaseIndices("some CamelCase", 1, 2) will return {{5,5},{10,10}}.
*
* @param s the source string
* @param start how many characters of getCamelCase(s) should be ignored
* @param length for how many characters should indices be returned
* @return an array of length start
*/
public static int[][] getCamelCaseIndices(String s, int start, int length) {
List<int[]> result = new ArrayList<int[]>();
int index = 0;
while (start > 0) {
index = getNextCamelIndex(s, index + 1);
start--;
}
while (length > 0) {
result.add(new int[] {index, index});
index = getNextCamelIndex(s, index + 1);
length--;
}
return result.toArray(new int[result.size()][]);
}
/**
* Return a regular expression for the given camel-case string.
*
* <pre>
* AnaSer => Ana[a-z]*?Ser[a-z]*?
* AngCEI => Ang[a-z]*?C[a-z]*?E[a-z]*?I[a-z]*?
* arP => ar[a-z]*?P[a-z]*?
* </pre>
*/
public static String getCamelCaseRegExp(String s) {
StringBuilder buf = new StringBuilder();
int index = 0;
while (index < s.length()) {
char c = s.charAt(index++);
buf.append("(");
buf.append(c);
while (index < s.length()) {
char next = s.charAt(index);
if (Character.isDigit(next) || Character.isLowerCase(next)) {
buf.append(next);
index++;
} else {
break;
}
}
buf.append(")");
buf.append("[a-z]*?");
}
return buf.toString();
}
/**
* Returns the next index to be used for camel case matching.
*
* @param s the string
* @param index the index
* @return the next index, or -1 if not found
*/
public static int getNextCamelIndex(String s, int index) {
char c;
while (index < s.length() && !(isSeparatorForCamelCase(c = s.charAt(index)))
&& Character.isLowerCase(c)) {
index++;
}
while (index < s.length() && isSeparatorForCamelCase(c = s.charAt(index))) {
index++;
}
if (index >= s.length()) {
index = -1;
}
return index;
}
/**
* Returns true if the given character is to be considered a separator for camel case matching
* purposes.
*
* @param c the character
* @return true if the character is a separator
*/
public static boolean isSeparatorForCamelCase(char c) {
return !Character.isLetterOrDigit(c);
}
}