package org.manalith.ircbot.plugin.keyseqconv;
import java.text.ParseException;
import org.apache.commons.lang3.CharUtils;
import org.apache.commons.lang3.StringUtils;
public abstract class SebeolAutomataEngine implements IAutomataEngine {
protected boolean enableParseExceptionSyntax;
protected LetterObject syl;
public SebeolAutomataEngine() {
}
public abstract String changeKeyValToInternalSymbol(final String str);
@Override
public abstract boolean isISingleConsonant(String tICon);
@Override
public abstract boolean isIDoubleConsonant(String tICon);
@Override
public abstract boolean isVowel(String tVow);
@Override
public abstract boolean isFConsonant(String tFCon);
public abstract boolean isSpecialChar(String tChar);
protected abstract String inputIConsonant(boolean isLastPosition,
String token);
protected abstract String inputVowel(boolean isLastPosition, String token);
protected abstract String inputFConsonant(boolean isLastPosition,
String token);
protected abstract String inputSpecialChar(String token);
protected abstract String inputOtherChar(String token);
// Example in body :
// return SebeolSymbol.SebeolSingleLetter.valueOf(keySymbol).value();
@Override
public abstract int getSingleCharVal(String keySymbol);
@Override
public final void setEnableParsingExceptionSyntax(boolean enable) {
enableParseExceptionSyntax = enable;
}
@Override
public final boolean isEnableParsingExceptionSyntax() {
return enableParseExceptionSyntax;
}
@Override
public final String parseKoreanStringToEngSpell(String korean) {
return "";
}
@Override
public final String parseKeySequenceToKorean(String keySequence)
throws ParseException, IllegalArgumentException {
String result = "";
String tToken = "";
String tTokenLookahead = "";
String tTokenLookaheadCombination = "";
// 기본값은 마지막 위치가 아닌걸로 태깅
boolean isLastPosition = false;
if (isEnableParsingExceptionSyntax()
&& StringUtils.countMatches(keySequence, "\\") % 2 == 1)
throw new ParseException("Back slashes do not match",
keySequence.lastIndexOf("\\", 0));
for (int i = 0; i < keySequence.length(); i++) {
if (!CharUtils.isAsciiAlpha(keySequence.charAt(i))) {
if (keySequence.charAt(i) == '\\'
&& isEnableParsingExceptionSyntax()) {
if (i < keySequence.length() - 1)
if (keySequence.charAt(i + 1) == '\\') {
result += "\\";
continue;
}
i++;
while (true) {
if (i + 1 <= keySequence.length() - 1) {
if (keySequence.charAt(i) == '\\') {
if (keySequence.charAt(i + 1) == '\\') {
i++;
result += '\\';
} else
break;
} else {
result += keySequence.charAt(i);
}
} else {
if (keySequence.charAt(i) == '\\') {
break;
} else {
result += keySequence.charAt(i);
}
}
i++;
}
continue;
}
}
tTokenLookahead = tTokenLookaheadCombination = "";
tToken = Character.toString(keySequence.charAt(i));
if (i < keySequence.length() - 1) {
tTokenLookahead = Character.toString(keySequence.charAt(i + 1));
tTokenLookaheadCombination = tToken + tTokenLookahead;
// 마지막 위치 여부 저장
isLastPosition = (i + 1 == keySequence.length() - 1);
// 쌍자음
if (isIDoubleConsonant(changeKeyValToInternalSymbol(tTokenLookaheadCombination))) {
result += inputIConsonant(isLastPosition,
tTokenLookaheadCombination);
if (isLastPosition) {
syl.initLetter();
break;
} else {
i++;
continue;
}
}
// 겹모음!
else if (isVowel(changeKeyValToInternalSymbol(tTokenLookaheadCombination))) {
result += inputVowel(isLastPosition,
tTokenLookaheadCombination);
if (isLastPosition) {
syl.initLetter();
break;
} else {
i++;
continue;
}
}
// 겹받침
else if (isFConsonant(changeKeyValToInternalSymbol(tTokenLookaheadCombination))) {
result += inputFConsonant(isLastPosition,
tTokenLookaheadCombination);
if (isLastPosition) {
syl.initLetter();
break;
} else {
i++;
continue;
}
}
}
// 쌍자음,겹모음 검사에서 통과하지 않았으므로 단자음 단모음 받침 검사
// 마지막 위치 여부 입력
isLastPosition = (i == keySequence.length() - 1);
// 단자음
if (isISingleConsonant(changeKeyValToInternalSymbol(tToken)))
result += inputIConsonant(isLastPosition, tToken);
// 단모음
else if (isVowel(changeKeyValToInternalSymbol(tToken)))
result += inputVowel(isLastPosition, tToken);
// 받침은 키 하나로만 입력
else if (isFConsonant(changeKeyValToInternalSymbol(tToken)))
result += inputFConsonant(isLastPosition, tToken);
else if (isSpecialChar(changeKeyValToInternalSymbol(tToken)))
result += inputSpecialChar(tToken);
else
result += inputOtherChar(tToken);
// 마지막이면 루프를 깨고 아니면 계속
if (isLastPosition) {
syl.initLetter();
break;
}
}
syl.initLetter();
return result;
}
@Override
public final String getSingleChar(int charVal) {
char[] ch = new char[1];
// single char value starts from 0x1100
ch[0] = (char) (charVal + 0x1100);
return new String(ch);
}
public final String getSpecialChar(int charVal) {
char[] ch = new char[1];
ch[0] = (char) (charVal + 32);
return new String(ch);
}
}