package com.hundsun.ares.studio.ui.editor.text;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;
/**
* <p>
* CreatedDate: 2008-2-19
* </p>
*
* @author sundl
*/
public class TextUtil {
/**
* ȡ��ͨ���ʣ���ĸ�����»��߿�ͷ(������Java������ͬ)
* @param document
* @param offset
* @return
*/
public static IRegion findCommonWord(IDocument document, int offset) {
char c;
int pre_offset = offset;
int suf_offset = offset;
try {
c = document.getChar(offset);
if (Character.isWhitespace(c)) {
return null;
}
int length = document.getLength();
while (pre_offset > 0) {
pre_offset--;
char ch = document.getChar(pre_offset);
if (Character.isJavaIdentifierStart(ch)) {
continue;
} else {
break;
}
}
pre_offset++;
while (suf_offset < length - 1) {
suf_offset++;
char ch = document.getChar(suf_offset);
if (Character.isJavaIdentifierPart(ch)) {
continue;
} else {
break;
}
}
return new Region(pre_offset, suf_offset - pre_offset);
} catch (BadLocationException e) {
e.printStackTrace();
System.out.println(pre_offset);
System.out.println(suf_offset);
}
return null;
}
public static IRegion findWord(IDocument document, int offset) {
char c;
int pre_offset = offset;
int suf_offset = offset;
try {
c = document.getChar(offset);
if (Character.isWhitespace(c)) {
return null;
}
int length = document.getLength();
while (pre_offset > 0) {
pre_offset--;
char ch = document.getChar(pre_offset);
// if (Character.isJavaIdentifierPart(ch))
if (ch != '[' && ch != '\n' && ch != '\r')
continue;
else
break;
}
pre_offset++;
while (suf_offset < length - 1) {
suf_offset++;
char ch = document.getChar(suf_offset);
// if (Character.isJavaIdentifierPart(ch))
if (ch != ']' && ch != '\n' && ch != '\r')
continue;
else
break;
}
return new Region(pre_offset, suf_offset - pre_offset);
} catch (BadLocationException e) {
e.printStackTrace();
System.out.println(pre_offset);
System.out.println(suf_offset);
}
return null;
}
public static IRegion findHyperlink(IDocument document, int offset) {
IRegion region = findWord(document, offset);
if (region == null)
return null;
try {
char pre = document.getChar(region.getOffset() - 1);
char suf = document.getChar(region.getOffset() + region.getLength());
if (pre == '[' && suf == ']') {
return new Region(region.getOffset() - 1, region.getLength() + 2);
}
} catch (BadLocationException e) {
e.printStackTrace();
}
return null;
}
/**
* ���㵱ǰ�����ǰ֮�������,���ڱ��ֶ���ʾ
*
* @param document
* ��ǰ�ı�
* @param offset
* ���ƫ����
* @return IRegion �������
*/
public static IRegion getStdFieldPrefixRegion(IDocument document, int offset) {
try {
if (offset <= 1) // �ı���ͷ�������ı��а��ȼ��������ı������롰[����
return new Region(0, offset);
char c;
int pre_pointer = offset;
c = document.getChar(--pre_pointer);// ��ĸ���д�0��ʼ,��ƫ����-1Ϊ���ǰһ��ĸ�����
while (c != '@' ) {
pre_pointer--;
if (pre_pointer <= 0)
return new Region(0, 0);// �ı���ͷ����
if ((c == ' ') || (c == '\n'))// �ڡ�[��֮ǰ�����ָ��
{
pre_pointer = offset;
break;
}
c = document.getChar(pre_pointer);
}
return new Region(pre_pointer, offset - pre_pointer);
} catch (BadLocationException e) {
e.printStackTrace();
}
return null;
}
private static class IntegerString {
public IntegerString(int num, String val) {
this.num = num;
this.value = val;
};
public int num;
public String value;
}
/**
* ��ò����Ƴ̶ȣ�����ط���-1,����Խ��Խ������
*
* @param str1
* @param input
* @return
*/
private static int getSimilarityLevel(String str1, String input) {
int ret = 0;
char data[] = input.toCharArray();
int order = -1;
for (int i = 0; i < data.length; i++) {
int nowOrder = str1.indexOf(data[i],order + 1);
if (nowOrder == -1) {
return -1;
} else {
if (nowOrder == order + 1) {
// ֱ�����������ƣ������ƶȲ���������
} else {
ret += nowOrder;
}
order = nowOrder;
}
}
return ret;
}
public static List<String> filter(List<String> allStrings, String prefix) {
if (prefix == null || prefix.length() == 0) {
return allStrings;
}
prefix = prefix.toLowerCase();
List<IntegerString> temp = new ArrayList<IntegerString>();
for (String m : allStrings) {
String cm = m.toLowerCase();
// ������ƶ�
int x = getSimilarityLevel(cm, prefix);
int y = getSimilarityLevel( ChineseCharToEn.getAllFirstLetter(cm) , prefix);
if (x == -1) {
if (y == -1) {
continue;
} else {
temp.add(new IntegerString(y, m));
}
} else {
if (y == -1) {
temp.add(new IntegerString(x, m));
} else {
temp.add(new IntegerString(y > x ? x : y, m));
}
}
}
Collections.sort(temp, new Comparator<IntegerString>(){
@Override
public int compare(IntegerString o1, IntegerString o2) {
return o1.num - o2.num;
}});
List<String> ret = new ArrayList<String>();
for (IntegerString integerString : temp) {
ret.add(integerString.value);
}
return ret;
}
public static IRegion getGeneralPrefixRegion(IDocument document, int offset) {
if (offset == 0)
return new Region(0, offset);;
int preOffset = offset - 1;// ��ĸ���д�0��ʼ,��ƫ����-1Ϊ���ǰһ��ĸ�����
try {
while (preOffset > 0) {
char c = document.getChar(preOffset);
if (c == '@' || c == '[') break;
if(c == '>' && document.getChar(preOffset-1) == '-')
return new Region(preOffset + 1, offset - preOffset - 1);
if (c == '\r' || c == '\t' || c == ' ' || c == '\n')
//���ڳ���@��[�⣬��������������ʾ������������ʱ��IRegion��ȡ��ʽ by wangxh
return new Region(preOffset+1, offset - preOffset -1);
--preOffset;
}
if(preOffset == 0){
char c = document.getChar(0);
if (c == '\r' || c == '\t' || c == ' ' || c == '\n')
//��0���ַ������ϼ����ַ�ʱ���ӵ�1���ַ���ʼ��ȡ
return new Region(1, offset-1);
}
return new Region(preOffset, offset - preOffset);
} catch (BadLocationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new Region(offset, 0);
}
public static String getGeneralPrefix(IDocument document, int offset) {
if (offset == 0)
return "";
int preOffset = offset - 1;// ��ĸ���д�0��ʼ,��ƫ����-1Ϊ���ǰһ��ĸ�����
try {
while (preOffset > 0) {
char c = document.getChar(preOffset);
if (c == '@' || c == '[') break;
if(c == '>' && document.getChar(preOffset-1) == '-')
return document.get(preOffset + 1, offset - preOffset - 1);;
if (c == '\r' || c == '\t' || c == ' ' || c == '\n'){
//���ڳ���@��[�⣬��������������ʾ������������ʱҲ��Ҫ��ȡprefix�� by wangxh
return document.get(preOffset + 1, offset - preOffset - 1);
}
--preOffset;
}
if(preOffset == 0){
char c = document.getChar(0);
if (c == '\r' || c == '\t' || c == ' ' || c == '\n')
//��0���ַ������ϼ����ַ�ʱ���ӵ�1���ַ���ʼ��ȡ
return document.get(1, offset - 1);
}
return document.get(preOffset, offset - preOffset);
} catch (BadLocationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
/**
* ���������ֶε�ǰ�ı�
*
* @param document
* @param offset
* @return
*/
public static String getStdFieldPrefix(IDocument document, int offset) {
try {
if (offset == 0)// �ı���ͷ�������ı��а��ȼ���
return "";
if (offset == 1)// �ı���ͷ�������ı������롰@����
return document.get(0, 1);
offset--;// ��ĸ���д�0��ʼ,��ƫ����-1Ϊ���ǰһ��ĸ�����
char c;
int pre_pointer = offset;
c = document.getChar(pre_pointer);
while (c != '@' ) {
pre_pointer--;
if (pre_pointer < 0)
return "";// �ı���ͷ����
if (c == ' ' || c == '\n')// �ڡ�[��֮ǰ�����ָ��
return "";
c = document.getChar(pre_pointer);
}
String prefix = document.get(pre_pointer, offset - pre_pointer + 1);
return prefix;
} catch (BadLocationException e) {
e.printStackTrace();
}
return null;
}
/**
* ���ǰ�ַ���
*
* @param document
* ��ǰ�ı�
* @param offset
* ���ƫ����
* @return ǰ�ַ���(����"[")
*/
public static String getFunctionPrefix(IDocument document, int offset) {
try {
if (offset == 0)// �ı���ͷ�������ı��а��ȼ���
return "";
if (offset == 1)// �ı���ͷ�������ı������롰[����
return document.get(0, 1);
offset--;// ��ĸ���д�0��ʼ,��ƫ����-1Ϊ���ǰһ��ĸ�����
char c;
int pre_pointer = offset;
c = document.getChar(pre_pointer);
while (c != '[' ) {
pre_pointer--;
if (pre_pointer < 0)
return "";// �ı���ͷ����
if (c == ' ' || c == '\n')// �ڡ�[��֮ǰ�����ָ��
return "";
c = document.getChar(pre_pointer);
}
String prefix = document.get(pre_pointer, offset - pre_pointer + 1);
return prefix;
} catch (BadLocationException e) {
e.printStackTrace();
}
return null;
}
/**
* ��ú��ַ���
*
* @param document
* ��ǰ�ı�
* @param offset
* ���ƫ����
* @return ���ַ���(����"]")
*/
public static String getFunctionSuffix(IDocument document, int offset) {
try {
if (document.getLength() == offset)// �ı�ĩ����
return "";
char c;
int pre_pointer = offset;
c = document.getChar(pre_pointer);
while (c != ']') {
pre_pointer++;
if (pre_pointer >= document.getLength())
return "";// �ı�ĩ����
if (c == ' ' || c == '\n')// �ڡ�]��֮ǰ�����ָ��
return "";
c = document.getChar(pre_pointer);
}
String suffix = document.get(offset, pre_pointer - offset + 1);
return suffix;
} catch (BadLocationException e) {
e.printStackTrace();
}
return null;
}
/**
* ���㵱ǰ�����ǰ֮�������
*
* @param document
* ��ǰ�ı�
* @param offset
* ���ƫ����
* @return IRegion �������
*/
public static IRegion getFunctionPrefixRegion(IDocument document, int offset) {
try {
// System.out.println("document.getChar("+0+"):"+document.getChar(0));
// System.out.println("offset:" + offset);
// System.out.println("document length:" + document.getLength());
if (offset <= 1) // �ı���ͷ�������ı��а��ȼ��������ı������롰[����
return new Region(0, offset);
char c;
int pre_pointer = offset;
c = document.getChar(--pre_pointer);// ��ĸ���д�0��ʼ,��ƫ����-1Ϊ���ǰһ��ĸ�����
while (c != '[' ) {
pre_pointer--;
if (pre_pointer <= 0)
return new Region(0, 0);// �ı���ͷ����
if ((c == ' ') || (c == '\n'))// �ڡ�[��֮ǰ�����ָ��
{
pre_pointer = offset;
break;
}
c = document.getChar(pre_pointer);
}
return new Region(pre_pointer, offset - pre_pointer);
} catch (BadLocationException e) {
e.printStackTrace();
}
return null;
}
/**
* �жϵ�ǰ�Ƿ�����һ�����
*
* @param document
* ��ǰ�ı�
* @param offset
* ���ƫ����
* @return boolean(�Ǻ귵��true,��Ϊfalse)
*/
public static boolean isAfterMacro(IDocument document, int offset) {
try {
if (offset < 1)
return false;
offset--;
char c;
int pre_pointer = offset;
c = document.getChar(pre_pointer);
while (c != '\n') {
pre_pointer--;
if (pre_pointer < 0)
return false;
if (c == ']')
{
return true;
}
c = document.getChar(pre_pointer);
}
return false;
} catch (BadLocationException e) {
e.printStackTrace();
return false;
}
}
/**
* �жϵ�ǰ������Ӧ�ĺ���
*
* @param document
* ��ǰ�ı�
* @param offset
* ���ƫ����
* @return ����
*/
public static String getMacroName(IDocument document, int offset) {
try {
offset--;// ��ĸ���д�0��ʼ,��ƫ����-1Ϊ���ǰһ��ĸ�����
char c;
int pre_pointer = offset;
c = document.getChar(pre_pointer);
while (c != '[') {// �ҵ���һ����[��
pre_pointer--;
if (pre_pointer < 0)
return "";
if (c == ' ' || c == '\n')// �ڡ�[��֮ǰ�����ָ��
{
return "";
}
c = document.getChar(pre_pointer);
}
if (pre_pointer <= 1)// �ı���ͷ����
return "";
c = document.getChar(--pre_pointer);
int end = pre_pointer;
if (c != ']')
return "";
else {// �ҵ���[��֮ǰ�ġ�]��
c = document.getChar(--pre_pointer);
while (c != '[') {// �ҵ��ڶ�����[��
pre_pointer--;
if (pre_pointer < 0)
return "";
if (c == ' ' || c == '\n')// �ڡ�[��֮ǰ�����ָ��
{
return "";
}
c = document.getChar(pre_pointer);
}
return document.get(pre_pointer + 1, end - pre_pointer - 1);
}
} catch (BadLocationException e) {
e.printStackTrace();
return "";
}
}
}