package org.manalith.ircbot.plugin.keyseqconv; import org.manalith.ircbot.plugin.keyseqconv.symboltable.Sebeol390Symbol; public class Sebeol390AutomataEngine extends SebeolAutomataEngine { public Sebeol390AutomataEngine() { try { syl = new LetterObject(KeyboardLayout.Sebeol390); } catch (IllegalArgumentException e) { // Do Nothing. // e.printStackTrace(); } } @Override public String changeKeyValToInternalSymbol(final String str) { String result = ""; String strbuf = ""; // do not change an order both 2nd and 3rd // 1st phase : change number 0 and 1 to _0 and _1 respectivelly strbuf = str.replaceAll("\\_", "_0¯").replaceAll("0", "_0") .replaceAll("1", "_1").replaceAll("¯", "0"); // 2nd phase : change alphanumeric char to // low line + alphanumeric character. strbuf = strbuf.replaceAll("2", "_2").replaceAll("3", "_3") .replaceAll("4", "_4").replaceAll("5", "_5") .replaceAll("6", "_6").replaceAll("7", "_7") // gd: ㅢ , b: ㅜ .replaceAll("8", "gd").replaceAll("9", "b"); // 3rd phase : change special char printed above number to // low line + double number. strbuf = strbuf.replaceAll("\\!", "_11").replaceAll("\\@", "_22") .replaceAll("\\#", "_33").replaceAll("\\$", "_44") .replaceAll("\\%", "_55").replaceAll("\\^", "_66") .replaceAll("\\&", "_77").replaceAll("\\*", "_88") .replaceAll("\\(", "_99").replaceAll("\\)", "_00"); // 4th phase : replaceable key sequence for Final Consonant combination strbuf = strbuf.replace("xq", "V").replaceAll("s\\_33", "E") .replaceAll("s\\_1", "S").replaceAll("wx", "_22") .replaceAll("wz", "F").replaceAll("w\\_3", "D") .replaceAll("wq", "T").replaceAll("wW", "_55") .replaceAll("w_1", "R").replaceAll("_3q", "X") .replaceAll("qq", "_2"); // final phase : ` ~ - = + [ ] { } ; ' : " , . / < > ? result = strbuf.replaceAll("\\`", "_1_").replaceAll("\\~", "_11_") .replaceAll("\\-", "__0").replaceAll("\\=", "___0") .replaceAll("\\+", "___00").replaceAll("\\\\", "____0") .replaceAll("\\|", "____00").replaceAll("\\[", "_p") .replaceAll("\\]", "__p").replaceAll("\\{", "_P") .replaceAll("\\}", "__P").replaceAll("\\;", "_l") .replaceAll("\\'", "__l").replaceAll("\\:", "_L") .replaceAll("\\\"", "__L").replaceAll("\\,", "_m") .replaceAll("\\<", "_M").replaceAll("\\.", "__m") .replaceAll("\\>", "__M").replaceAll("\\?", "___M") // "ㅗ" -> v .replaceAll("\\/", "v"); return result; } @Override public boolean isISingleConsonant(String tICon) { try { @SuppressWarnings("unused") Sebeol390Symbol.SebeolISingleConsonant check1 = Sebeol390Symbol.SebeolISingleConsonant .valueOf(tICon); return true; } catch (Exception e) { return false; } } @Override public boolean isIDoubleConsonant(String tICon) { try { @SuppressWarnings("unused") Sebeol390Symbol.SebeolIDoubleConsonant check1 = Sebeol390Symbol.SebeolIDoubleConsonant .valueOf(tICon); return true; } catch (Exception e) { return false; } } @Override public boolean isVowel(String tVow) { try { @SuppressWarnings("unused") Sebeol390Symbol.SebeolVowel check1 = Sebeol390Symbol.SebeolVowel .valueOf(tVow); return true; } catch (Exception e) { return false; } } @Override public boolean isFConsonant(String tFCon) { try { @SuppressWarnings("unused") Sebeol390Symbol.SebeolFConsonant check1 = Sebeol390Symbol.SebeolFConsonant .valueOf(tFCon); return true; } catch (Exception e) { return false; } } @Override public boolean isSpecialChar(String tChar) { try { @SuppressWarnings("unused") Sebeol390Symbol.SebeolSpecialChar check1 = Sebeol390Symbol.SebeolSpecialChar .valueOf(tChar); return true; } catch (Exception e) { return false; } } @Override protected String inputIConsonant(boolean isLastPosition, String token) { String result = ""; // 초성 유무 상태 저장 boolean beingIConsonant = (syl.getIConsonantValue() != Sebeol390Symbol.SebeolIConsonant.nul .value()); // 초성이 없으면 초성을 넣는다 if (!beingIConsonant) syl.setIConsonant(changeKeyValToInternalSymbol(token)); // 마지막 입력도 아니고 초성이 있는 상태도 아닌 상태의 나머지 경우에 실행 if (!(!isLastPosition && !beingIConsonant)) { // 중성 있는 완성 글자 (최소한 초성+중성) if (syl.isCompleteSyllable()) result += syl.getLetter(); // 초성은 있고 중성이 없다?! else { Sebeol390Symbol.SebeolIConsonant init = Sebeol390Symbol.SebeolIConsonant .valueOf(syl.getIConsonantKeySymbol()); Sebeol390Symbol.SebeolFConsonant fin = Sebeol390Symbol.SebeolFConsonant .valueOf(syl.getFConsonantKeySymbol()); // 받침이 있으면 if (syl.isAssignedFConstantFirst()) result += getSingleChar(getSingleCharVal(fin.toString())) + getSingleChar(getSingleCharVal(init.toString())); // 초성만 있다. else result += getSingleChar(getSingleCharVal(init.toString())); } } // 초성이 있으면 if (beingIConsonant) { // 마지막 입력이면 if (isLastPosition) // 출력 result += getSingleChar(getSingleCharVal(changeKeyValToInternalSymbol(token))); // 아니면 else { // 초기화 하고 슬롯에 넣는다. syl.initLetter(); syl.setIConsonant(changeKeyValToInternalSymbol(token)); } } return result; } @Override protected String inputVowel(boolean isLastPosition, String token) { String result = ""; // 중성 유무 상태 저장 boolean beingVowel = (syl.getVowelValue() != Sebeol390Symbol.SebeolVowel.nul .value()); // 중성이 없으면 중성을 넣는다 if (!beingVowel) syl.setVowel(changeKeyValToInternalSymbol(token)); // 마지막 입력도 아니고 중성이 있는 상태도 아닌 상태의 나머지 경우에 실행 if (!(!isLastPosition && !beingVowel)) { // 모음이 이미 있으면서 완성체인가? if (syl.isCompleteSyllable()) result += syl.getLetter(); // 자음이 없어서 완성체가 아닌 경우 else { Sebeol390Symbol.SebeolVowel vow = Sebeol390Symbol.SebeolVowel .valueOf(syl.getVowelKeySymbol()); Sebeol390Symbol.SebeolFConsonant fin = Sebeol390Symbol.SebeolFConsonant .valueOf(syl.getFConsonantKeySymbol()); // 받침이 있으면 if (syl.isAssignedFConstantFirst()) result += getSingleChar(getSingleCharVal(fin.toString())) + getSingleChar(getSingleCharVal(vow.toString())); // 받침이 없으면 else result += getSingleChar(getSingleCharVal(vow.toString())); } } // 모음 존재 if (beingVowel) { // 마지막 입력이면 if (isLastPosition) // 출력 result += getSingleChar(getSingleCharVal(changeKeyValToInternalSymbol(token))); // 아니면 else { // 초기화 하고 슬롯에 넣는다 syl.initLetter(); syl.setVowel(changeKeyValToInternalSymbol(token)); } } return result; } @Override protected String inputFConsonant(boolean isLastPosition, String token) { String result = ""; boolean beingFConsonant = (syl.getFConsonantValue() != Sebeol390Symbol.SebeolFConsonant.nul .value()); // 종성이 슬롯에 없으면 종성을 일단 넣는다. if (!beingFConsonant) syl.setFConsonant(changeKeyValToInternalSymbol(token)); if (!(!isLastPosition && !beingFConsonant)) { // 완성 글자 초+중+종 if (syl.isCompleteSyllable()) result += syl.getLetter(); // 초성 빠져 있고 종성 있으면 (초성이 있고 없고.) else { Sebeol390Symbol.SebeolIConsonant init = Sebeol390Symbol.SebeolIConsonant .valueOf(syl.getIConsonantKeySymbol()); Sebeol390Symbol.SebeolVowel vow = Sebeol390Symbol.SebeolVowel .valueOf(syl.getVowelKeySymbol()); Sebeol390Symbol.SebeolFConsonant fin = Sebeol390Symbol.SebeolFConsonant .valueOf(syl.getFConsonantKeySymbol()); // 초성이 있으면 (초성 -> 종성) if (init != Sebeol390Symbol.SebeolIConsonant.nul) result += getSingleChar(getSingleCharVal(init.toString())); // 중성이 있으면 (중성 -> 종성) if (vow != Sebeol390Symbol.SebeolVowel.nul) result += getSingleChar(getSingleCharVal(vow.toString())); result += getSingleChar(getSingleCharVal(fin.toString())); } } // 종성이 슬롯에 있을때 if (beingFConsonant) { // 마지막 잉여 종성 입력이면 if (isLastPosition) // 출력 result += getSingleChar(getSingleCharVal(changeKeyValToInternalSymbol(token))); // 아니면 else { // 종성이 이미 있으므로 슬롯을 초기화 하고 넣는다. syl.initLetter(); syl.setFConsonant(changeKeyValToInternalSymbol(token)); } } return result; } @Override protected String inputSpecialChar(String token) { String result = ""; String internalSymbol = changeKeyValToInternalSymbol(token); Sebeol390Symbol.SebeolSpecialChar spec = Sebeol390Symbol.SebeolSpecialChar .valueOf(internalSymbol); if (syl.isCompleteSyllable()) { result += syl.getLetter(); } // 자음이나 모음이 없다. else { Sebeol390Symbol.SebeolIConsonant init = Sebeol390Symbol.SebeolIConsonant .valueOf(syl.getIConsonantKeySymbol()); Sebeol390Symbol.SebeolVowel vow = Sebeol390Symbol.SebeolVowel .valueOf(syl.getVowelKeySymbol()); Sebeol390Symbol.SebeolFConsonant fin = Sebeol390Symbol.SebeolFConsonant .valueOf(syl.getFConsonantKeySymbol()); // 받침이 있으면 if (syl.isAssignedFConstantFirst()) { result += getSingleChar(getSingleCharVal(fin.toString())); // 초성이 있으면 if (init != Sebeol390Symbol.SebeolIConsonant.nul) result += getSingleChar(getSingleCharVal(init.toString())); if (vow != Sebeol390Symbol.SebeolVowel.nul) result += getSingleChar(getSingleCharVal(vow.toString())); } // 초성만 있거나 중성만 있거나 아무것도 없다? else { if (init != Sebeol390Symbol.SebeolIConsonant.nul) result += getSingleChar(getSingleCharVal(init.toString())); if (vow != Sebeol390Symbol.SebeolVowel.nul) result += getSingleChar(getSingleCharVal(vow.toString())); if (fin != Sebeol390Symbol.SebeolFConsonant.nul) result += getSingleChar(getSingleCharVal(fin.toString())); } } result += getSpecialChar(spec.value()); syl.initLetter(); return result; } @Override protected String inputOtherChar(String token) { String result = ""; if (syl.isCompleteSyllable()) { result += syl.getLetter(); } else { Sebeol390Symbol.SebeolIConsonant init = Sebeol390Symbol.SebeolIConsonant .valueOf(syl.getIConsonantKeySymbol()); Sebeol390Symbol.SebeolVowel vow = Sebeol390Symbol.SebeolVowel .valueOf(syl.getVowelKeySymbol()); Sebeol390Symbol.SebeolFConsonant fin = Sebeol390Symbol.SebeolFConsonant .valueOf(syl.getFConsonantKeySymbol()); // 받침이 있으면 if (syl.isAssignedFConstantFirst()) { result += getSingleChar(getSingleCharVal(fin.toString())); // 초성이 있으면 if (init != Sebeol390Symbol.SebeolIConsonant.nul) result += getSingleChar(getSingleCharVal(init.toString())); if (vow != Sebeol390Symbol.SebeolVowel.nul) result += getSingleChar(getSingleCharVal(vow.toString())); } // 초성만 있거나 아무것도 없다? else { if (init != Sebeol390Symbol.SebeolIConsonant.nul) result += getSingleChar(getSingleCharVal(init.toString())); if (vow != Sebeol390Symbol.SebeolVowel.nul) result += getSingleChar(getSingleCharVal(vow.toString())); if (fin != Sebeol390Symbol.SebeolFConsonant.nul) result += getSingleChar(getSingleCharVal(fin.toString())); } } result += token; syl.initLetter(); return result; } @Override public int getSingleCharVal(String keySymbol) { return Sebeol390Symbol.SebeolSingleLetter.valueOf(keySymbol).value(); } }