diff --git a/src/game/lib/util/string_util.js b/src/game/lib/util/string_util.js
index 6816f7a..ab4bfb7 100644
--- a/src/game/lib/util/string_util.js
+++ b/src/game/lib/util/string_util.js
@@ -177,6 +177,54 @@ StringUtil.isSameKoreanAlphabet = function(firstAlphabet, secondAlphabet) {
return false;
};
+StringUtil.isKoreanAlphabet = function(char) {
+ c = char.charCodeAt(0);
+ if(0x1100 <= c && c <= 0x11FF)
+ return true;
+ if(0x3130 <= c && c <= 0x318F)
+ return true;
+ if(0xAC00 <= c && c <= 0xD7A3)
+ return true;
+
+ return false;
+};
+
+StringUtil.getUnicodeAlphabetCount = function(text) {
+ var count = 0;
+ var textLen = text.length
+ for(var i = 0; i < textLen; i++) {
+ if(StringUtil.isKoreanAlphabet(text[i]))
+ count += 2;
+ else
+ count++
+ }
+
+ return count;
+};
+
+StringUtil.getMultibyteIndex = function(multibyteText, unicodeCharIndex) {
+ var multibyteTextIndex = 0;
+ var index = 0;
+ while(index < unicodeCharIndex) {
+ var unicodeChar = multibyteText[multibyteTextIndex];
+ if(typeof unicodeChar == "undefined")
+ break;
+
+ if(StringUtil.isKoreanAlphabet(unicodeChar)) {
+ if(index + 2 <= unicodeCharIndex)
+ index += 2;
+ else
+ break;
+ } else
+ index += 1;
+
+ multibyteTextIndex++;
+ }
+
+ return multibyteTextIndex;
+};
+
+
StringUtil.getScoreUnit = function(playingAppID) {
if(playingAppID == 104)
return " 초";
diff --git a/src/game/typing/lib/typing_text_manager.js b/src/game/typing/lib/typing_text_manager.js
index 614f7ea..856a3bf 100644
--- a/src/game/typing/lib/typing_text_manager.js
+++ b/src/game/typing/lib/typing_text_manager.js
@@ -108,43 +108,73 @@ TypingTextManager.prototype.makeExaminationContents = function(arr) {
if(sentence.length == 0)
continue;
if(sentence.length > TypingTextManager.SENTENCE_MAX_CHARACTER)
- this.add(this.makeShortSentences(sentence));
+ this.add(this.getSplitedSentences(sentence));
else
this.add(sentence);
}
}
-TypingTextManager.prototype.makeShortSentences = function(sentence) {
+TypingTextManager.prototype.isWordTooLong = function(word) {
+ var uniCharCount = StringUtil.getUnicodeAlphabetCount(word);
+ // console.log("word : " + word + "*");
+ // console.log("uniCharCount : " + uniCharCount);
+ if(uniCharCount > TypingTextManager.SENTENCE_MAX_CHARACTER)
+ return true;
+
+ return false;
+}
+
+TypingTextManager.prototype.isNotEmptySentence = function(sentence) {
+ if(sentence.legnth > 0)
+ return true;
+
+ return false;
+}
+
+/*
+TypingTextManager.prototype.getSplitedWord = function(word, splitIndex) {
+ var startIndex = splitIndex * TypingTextManager.SENTENCE_MAX_CHARACTER;
+ var endIndex = (splitIndex + 1) * TypingTextManager.SENTENCE_MAX_CHARACTER;
+ return word.substring(startIndex, endIndex);
+}
+*/
+
+TypingTextManager.prototype.getSplitedSentences = function(sentence) {
var words = sentence.split(" ");
var wordCount = words.length;
- var shortSentences = [];
+ var splitedSentences = [];
var sentenceIndex = 0;
- shortSentences[sentenceIndex] = "";
+ splitedSentences[sentenceIndex] = "";
// console.log(sentence);
// console.log(words);
for(var i = 0; i < wordCount; i++) {
// console.log(words[i]);
- // console.log(shortSentences[sentenceIndex].length);
+ // console.log(splitedSentences[sentenceIndex].length);
+ var wordUniCharCount = StringUtil.getUnicodeAlphabetCount(words[i]);
+ // if a word is longer than SENTENCE_MAX_CHARACTER
+ // then split the word with SENTENCE_MAX_CHARACTER length
+ if(this.isWordTooLong(words[i])) {
+ console.log(words[i]);
+ if(this.isNotEmptySentence(splitedSentences[sentenceIndex]))
+ sentenceIndex++; // start with new empty sentence
- var wordLength = words[i].length;
- if(wordLength > TypingTextManager.SENTENCE_MAX_CHARACTER) {
- // console.log(words[i]);
- if(shortSentences[sentenceIndex].legnth > 0)
- sentenceIndex++;
+ var tooLongWord = words[i];
+ while(typeof tooLongWord != "undefined" && tooLongWord.length > 0) {
+ // console.log("tooLongWord before : " + tooLongWord);
- var loopCount = Math.ceil(wordLength / TypingTextManager.SENTENCE_MAX_CHARACTER);
+ var multibyteIndex = StringUtil.getMultibyteIndex(tooLongWord, TypingTextManager.SENTENCE_MAX_CHARACTER);
+ // console.log("multibyteIndex : " + multibyteIndex);
+ var splitedSentence = tooLongWord.substring(0, multibyteIndex);
+ // console.log("splitedSentence : " + splitedSentence);
+ tooLongWord = tooLongWord.substring(multibyteIndex);
+ // console.log("tooLongWord : after " + tooLongWord);
- for(var j = 0; j < loopCount; j++) {
- var startIndex = j * TypingTextManager.SENTENCE_MAX_CHARACTER;
- var endIndex = (j + 1) * TypingTextManager.SENTENCE_MAX_CHARACTER;
- var partialText = words[i].substring(startIndex, endIndex);
- // console.log(partialText);
- shortSentences[sentenceIndex] = partialText;
+ splitedSentences[sentenceIndex] = splitedSentence;
sentenceIndex++;
}
@@ -152,22 +182,23 @@ TypingTextManager.prototype.makeShortSentences = function(sentence) {
}
-
- if(shortSentences[sentenceIndex].length + words[i].length < TypingTextManager.SENTENCE_MAX_CHARACTER)
+ // console.log("splitedSentences[" + sentenceIndex + "] : " + splitedSentences[sentenceIndex]);
+ var shortSentenceUniCharCount = StringUtil.getUnicodeAlphabetCount(splitedSentences[sentenceIndex]);
+ if(shortSentenceUniCharCount + wordUniCharCount < TypingTextManager.SENTENCE_MAX_CHARACTER)
if(i < wordCount - 1)
- shortSentences[sentenceIndex] = shortSentences[sentenceIndex].concat(words[i], " ");
+ splitedSentences[sentenceIndex] = splitedSentences[sentenceIndex].concat(words[i], " ");
else // last word
- shortSentences[sentenceIndex] = shortSentences[sentenceIndex].concat(words[i]);
+ splitedSentences[sentenceIndex] = splitedSentences[sentenceIndex].concat(words[i]);
else {
sentenceIndex++;
if(i < wordCount - 1)
- shortSentences[sentenceIndex] = words[i] + " ";
+ splitedSentences[sentenceIndex] = words[i] + " ";
else // last word
- shortSentences[sentenceIndex] = words[i];
+ splitedSentences[sentenceIndex] = words[i];
}
}
- return shortSentences;
+ return splitedSentences;
}
@@ -205,4 +236,4 @@ TypingTextManager.ENGLISH_LETTER_RIGHT = [
];
-TypingTextManager.SENTENCE_MAX_CHARACTER = 28;
\ No newline at end of file
+TypingTextManager.SENTENCE_MAX_CHARACTER = 40;
\ No newline at end of file
diff --git a/src/web/client/typing_examination.html b/src/web/client/typing_examination.html
index a38fefc..348be4d 100644
--- a/src/web/client/typing_examination.html
+++ b/src/web/client/typing_examination.html
@@ -45,7 +45,7 @@
-
+
diff --git a/test/tdd.js b/test/tdd.js
index 1966ccb..98c0c0b 100644
--- a/test/tdd.js
+++ b/test/tdd.js
@@ -1,3 +1,36 @@
+//////////////////////////////////////////////////
+// StringUtil
+
+QUnit.test( "StringUtil", function( assert ) {
+ var englishText = "Is hangle character?";
+ var koreanText = "한글 단어 입니까?";
+ var englishKoreanText = "Is 한글 character 입니까?";
+
+ assert.equal(StringUtil.isKoreanAlphabet(englishText[0]), false, "StringUtil - isKoreanAlphabet");
+ assert.equal(StringUtil.isKoreanAlphabet(koreanText[0]), true, "StringUtil - isKoreanAlphabet");
+
+ assert.equal(StringUtil.getUnicodeAlphabetCount(englishText), 20, "StringUtil - getUnicodeAlphabetCount");
+ assert.equal(StringUtil.getUnicodeAlphabetCount(koreanText), 17, "StringUtil - getUnicodeAlphabetCount");
+
+ assert.equal(StringUtil.getMultibyteIndex(englishText, 0), 0, "StringUtil - getMultibyteIndex, eng");
+ assert.equal(StringUtil.getMultibyteIndex(englishText, 1), 1, "StringUtil - getMultibyteIndex, eng");
+ assert.equal(StringUtil.getMultibyteIndex(englishText, 3), 3, "StringUtil - getMultibyteIndex, eng");
+ assert.equal(StringUtil.getMultibyteIndex(koreanText, 0), 0, "StringUtil - getMultibyteIndex, kor1");
+ assert.equal(StringUtil.getMultibyteIndex(koreanText, 1), 0, "StringUtil - getMultibyteIndex, kor2");
+ assert.equal(StringUtil.getMultibyteIndex(koreanText, 2), 1, "StringUtil - getMultibyteIndex, kor3");
+ assert.equal(StringUtil.getMultibyteIndex(koreanText, 3), 1, "StringUtil - getMultibyteIndex, kor4");
+ assert.equal(StringUtil.getMultibyteIndex(koreanText, 4), 2, "StringUtil - getMultibyteIndex, kor5");
+ assert.equal(StringUtil.getMultibyteIndex(koreanText, 5), 3, "StringUtil - getMultibyteIndex, kor6");
+ assert.equal(StringUtil.getMultibyteIndex(koreanText, 6), 3, "StringUtil - getMultibyteIndex, kor7");
+ assert.equal(StringUtil.getMultibyteIndex(englishKoreanText, 0), 0, "StringUtil - getMultibyteIndex, engKor1");
+ assert.equal(StringUtil.getMultibyteIndex(englishKoreanText, 1), 1, "StringUtil - getMultibyteIndex, engKor1");
+ assert.equal(StringUtil.getMultibyteIndex(englishKoreanText, 2), 2, "StringUtil - getMultibyteIndex, engKor1");
+ assert.equal(StringUtil.getMultibyteIndex(englishKoreanText, 3), 3, "StringUtil - getMultibyteIndex, engKor2");
+ assert.equal(StringUtil.getMultibyteIndex(englishKoreanText, 4), 3, "StringUtil - getMultibyteIndex, engKor3");
+ assert.equal(StringUtil.getMultibyteIndex(englishKoreanText, 5), 4, "StringUtil - getMultibyteIndex, engKor4");
+});
+
+
//////////////////////////////////////////////////
// DateUtil
@@ -317,17 +350,12 @@ QUnit.test( "TypingTextManager - makeExaminationContents", function( assert ) {
typingTextMan.makeExaminationContents(sentences);
let contents = typingTextMan.getContents();
- assert.equal(contents[0], "냉면 / 김남천", "addTextArray - line #1");
- assert.equal(contents[1], "'냉면'이라는 말에 '평양'이 붙어서 ", "addTextArray - line #2");
- assert.equal(contents[2], "'평양냉면'이라야 비로소 어울리는 격에 맞는 말이 ", "addTextArray - line #3");
- assert.equal(contents[3], "되듯이 냉면은 평양에 있어 대표적인 음식이다. ", "addTextArray - line #4");
- assert.equal(contents[4], "언제부터 이 냉면이 평양에 들어왔으며 언제부터 ", "addTextArray - line #5");
- assert.equal(contents[5], "냉면이 평안도 사람의 입에 가장 많이 기호에 맞는 ", "addTextArray - line #6");
- assert.equal(contents[6], "음식물이 되었는지는 나 같은 무식쟁이에게는 알 ", "addTextArray - line #7");
- assert.equal(contents[7], "수도 없고 또 알려고도 아니한다.", "addTextArray - line #8");
- assert.equal(contents[8], "가나다라마바사아자차카타파하가나다라마바사아자차카타파하", "addTextArray - line #9");
- assert.equal(contents[9], "가나다라마바사아자차카타파하가나다라마바사아자차카타파하", "addTextArray - line #10");
- assert.equal(contents[10], "가나다라마바사아자차카타파하가나다라마바사아자차카타파하", "addTextArray - line #11");
+ assert.equal(contents[0], "냉면 / 김남천", "addTextArray - line 1");
+ assert.equal(contents[1], "'냉면'이라는 말에 '평양'이 붙어서 ", "addTextArray - line 2");
+ assert.equal(contents[2], "'평양냉면'이라야 비로소 어울리는 격에 ", "addTextArray - line 3");
+ assert.equal(contents[3], "맞는 말이 되듯이 냉면은 평양에 있어 ", "addTextArray - line 4");
+ assert.equal(contents[10], "가나다라마바사아자차카타파하가나다라마바", "addTextArray - line 5");
+ assert.equal(contents[11], "사아자차카타파하가나다라마바사아자차카타", "addTextArray - line 6");
});
QUnit.test( "TypingTextManager - add", function( assert ) {