refactor(i18n): 코드포인트 기반 문자열 분할을 공통화한다
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
package kr.co.vividnext.sodalive.i18n.translation
|
||||
|
||||
internal fun splitTextByCodePoint(text: String, maxSize: Int, codePointSize: (Int) -> Int): List<String> {
|
||||
val chunks = mutableListOf<String>()
|
||||
var start = 0
|
||||
do {
|
||||
val end = findChunkEnd(text, start, maxSize, codePointSize)
|
||||
chunks.add(text.substring(start, end))
|
||||
start = end
|
||||
} while (start < text.length)
|
||||
return chunks
|
||||
}
|
||||
|
||||
internal fun takeTextPrefixByCodePoint(text: String, maxSize: Int, codePointSize: (Int) -> Int): String {
|
||||
return text.substring(0, findChunkEnd(text, 0, maxSize, codePointSize))
|
||||
}
|
||||
|
||||
internal fun utf8CodePointSize(codePoint: Int): Int {
|
||||
return when {
|
||||
codePoint <= 0x7F -> 1
|
||||
codePoint <= 0x7FF -> 2
|
||||
codePoint in 0xD800..0xDFFF -> 1
|
||||
codePoint <= 0xFFFF -> 3
|
||||
else -> 4
|
||||
}
|
||||
}
|
||||
|
||||
private fun findChunkEnd(text: String, start: Int, maxSize: Int, codePointSize: (Int) -> Int): Int {
|
||||
var end = start
|
||||
var size = 0
|
||||
while (end < text.length) {
|
||||
val codePoint = text.codePointAt(end)
|
||||
val nextSize = codePointSize(codePoint)
|
||||
if (size + nextSize > maxSize) {
|
||||
break
|
||||
}
|
||||
size += nextSize
|
||||
end += Character.charCount(codePoint)
|
||||
}
|
||||
return end
|
||||
}
|
||||
+1
-11
@@ -78,17 +78,7 @@ class PapagoTranslationService(
|
||||
}
|
||||
|
||||
private fun splitText(text: String): List<String> {
|
||||
val chunks = mutableListOf<String>()
|
||||
var start = 0
|
||||
do {
|
||||
var end = minOf(start + MAX_REQUEST_TEXT_LENGTH, text.length)
|
||||
if (end < text.length && text[end - 1].isHighSurrogate() && text[end].isLowSurrogate()) {
|
||||
end -= 1
|
||||
}
|
||||
chunks.add(text.substring(start, end))
|
||||
start = end
|
||||
} while (start < text.length)
|
||||
return chunks
|
||||
return splitTextByCodePoint(text, MAX_REQUEST_TEXT_LENGTH, Character::charCount)
|
||||
}
|
||||
|
||||
private fun validateLanguages(sourceLanguage: String, targetLanguage: String): Boolean {
|
||||
|
||||
Reference in New Issue
Block a user