优化 #5589
This commit is contained in:
@@ -20,13 +20,13 @@ object ContentHelp {
|
|||||||
var p = content1
|
var p = content1
|
||||||
.replace(""".toRegex(), "“")
|
.replace(""".toRegex(), "“")
|
||||||
.replace("[::]['\"‘”“]+".toRegex(), ":“")
|
.replace("[::]['\"‘”“]+".toRegex(), ":“")
|
||||||
.replace("[\"”“]+[\\s]*[\"”“][\\s\"”“]*".toRegex(), "”\n“")
|
.replace("[\"”“]+\\s*[\"”“][\\s\"”“]*".toRegex(), "”\n“")
|
||||||
.split("\n(\\s*)".toRegex()).toTypedArray()
|
.split("\n(\\s*)".toRegex()).toTypedArray()
|
||||||
|
|
||||||
//初始化StringBuilder的长度,在原content的长度基础上做冗余
|
//初始化StringBuilder的长度,在原content的长度基础上做冗余
|
||||||
var buffer = StringBuilder((content1.length * 1.15).toInt())
|
var buffer = StringBuilder((content1.length * 1.15).toInt())
|
||||||
// 章节的文本格式为章节标题-空行-首段,所以处理段落时需要略过第一行文本。
|
// 章节的文本格式为章节标题-空行-首段,所以处理段落时需要略过第一行文本。
|
||||||
buffer.append(" ")
|
buffer.append(" ")
|
||||||
if (chapterName.trim { it <= ' ' } != p[0].trim { it <= ' ' }) {
|
if (chapterName.trim { it <= ' ' } != p[0].trim { it <= ' ' }) {
|
||||||
// 去除段落内空格。unicode 3000 象形字间隔(中日韩符号和标点),不包含在\s内
|
// 去除段落内空格。unicode 3000 象形字间隔(中日韩符号和标点),不包含在\s内
|
||||||
buffer.append(p[0].replace("[\u3000\\s]+".toRegex(), ""))
|
buffer.append(p[0].replace("[\u3000\\s]+".toRegex(), ""))
|
||||||
@@ -34,7 +34,12 @@ object ContentHelp {
|
|||||||
|
|
||||||
//如果原文存在分段错误,需要把段落重新黏合
|
//如果原文存在分段错误,需要把段落重新黏合
|
||||||
for (i in 1 until p.size) {
|
for (i in 1 until p.size) {
|
||||||
if (match(MARK_SENTENCES_END, buffer[buffer.length - 1])) buffer.append("\n")
|
if (match(MARK_SENTENCES_END, buffer.last())
|
||||||
|
|| (match(MARK_QUOTATION_RIGHT, buffer.last())
|
||||||
|
&& match(MARK_SENTENCES_END, buffer[buffer.lastIndex - 1]))
|
||||||
|
) {
|
||||||
|
buffer.append("\n")
|
||||||
|
}
|
||||||
// 段落开头以外的地方不应该有空格
|
// 段落开头以外的地方不应该有空格
|
||||||
// 去除段落内空格。unicode 3000 象形字间隔(中日韩符号和标点),不包含在\s内
|
// 去除段落内空格。unicode 3000 象形字间隔(中日韩符号和标点),不包含在\s内
|
||||||
buffer.append(p[i].replace("[\u3000\\s]".toRegex(), ""))
|
buffer.append(p[i].replace("[\u3000\\s]".toRegex(), ""))
|
||||||
@@ -44,7 +49,7 @@ object ContentHelp {
|
|||||||
// ”。“处理为”。\n“。不考虑“?” “!”的情况。
|
// ”。“处理为”。\n“。不考虑“?” “!”的情况。
|
||||||
// ”。xxx处理为 ”。\n xxx
|
// ”。xxx处理为 ”。\n xxx
|
||||||
p = buffer.toString()
|
p = buffer.toString()
|
||||||
.replace("[\"”“]+[\\s]*[\"”“]+".toRegex(), "”\n“")
|
.replace("[\"”“]+\\s*[\"”“]+".toRegex(), "”\n“")
|
||||||
.replace("[\"”“]+(?。!?!~)[\"”“]+".toRegex(), "”$1\n“")
|
.replace("[\"”“]+(?。!?!~)[\"”“]+".toRegex(), "”$1\n“")
|
||||||
.replace("[\"”“]+(?。!?!~)([^\"”“])".toRegex(), "”$1\n$2")
|
.replace("[\"”“]+(?。!?!~)([^\"”“])".toRegex(), "”$1\n$2")
|
||||||
.replace(
|
.replace(
|
||||||
@@ -60,7 +65,7 @@ object ContentHelp {
|
|||||||
buffer = reduceLength(buffer)
|
buffer = reduceLength(buffer)
|
||||||
content1 = (buffer.toString() // 处理章节头部空格和换行
|
content1 = (buffer.toString() // 处理章节头部空格和换行
|
||||||
.replaceFirst("^\\s+".toRegex(), "")
|
.replaceFirst("^\\s+".toRegex(), "")
|
||||||
.replace("\\s*[\"”“]+[\\s]*[\"”“][\\s\"”“]*".toRegex(), "”\n“")
|
.replace("\\s*[\"”“]+\\s*[\"”“][\\s\"”“]*".toRegex(), "”\n“")
|
||||||
.replace("[::][”“\"\\s]+".toRegex(), ":“")
|
.replace("[::][”“\"\\s]+".toRegex(), ":“")
|
||||||
.replace("\n[\"“”]([^\n\"“”]+)([,:,:][\"”“])([^\n\"“”]+)".toRegex(), "\n$1:“$3")
|
.replace("\n[\"“”]([^\n\"“”]+)([,:,:][\"”“])([^\n\"“”]+)".toRegex(), "\n$1:“$3")
|
||||||
.replace("\n(\\s*)".toRegex(), "\n"))
|
.replace("\n(\\s*)".toRegex(), "\n"))
|
||||||
@@ -113,13 +118,13 @@ object ContentHelp {
|
|||||||
if (match(MARK_QUOTATION, str[0])) {
|
if (match(MARK_QUOTATION, str[0])) {
|
||||||
val i = seekIndex(str, MARK_QUOTATION, 1, length - 2, true) + 1
|
val i = seekIndex(str, MARK_QUOTATION, 1, length - 2, true) + 1
|
||||||
if (i > 1) if (!match(MARK_QUOTATION_BEFORE, str[i - 1])) {
|
if (i > 1) if (!match(MARK_QUOTATION_BEFORE, str[i - 1])) {
|
||||||
return "${str.substring(0, i)}\n${str.substring(i)}"
|
return "${str.take(i)}\n${str.substring(i)}"
|
||||||
}
|
}
|
||||||
} else if (match(MARK_QUOTATION, str[length - 1])) {
|
} else if (match(MARK_QUOTATION, str[length - 1])) {
|
||||||
val i = length - 1 - seekIndex(str, MARK_QUOTATION, 1, length - 2, false)
|
val i = length - 1 - seekIndex(str, MARK_QUOTATION, 1, length - 2, false)
|
||||||
if (i > 1) {
|
if (i > 1) {
|
||||||
if (!match(MARK_QUOTATION_BEFORE, str[i - 1])) {
|
if (!match(MARK_QUOTATION_BEFORE, str[i - 1])) {
|
||||||
return "${str.substring(0, i)}\n${str.substring(i)}"
|
return "${str.take(i)}\n${str.substring(i)}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -142,8 +147,8 @@ object ContentHelp {
|
|||||||
tigger: Int
|
tigger: Int
|
||||||
): ArrayList<Int> {
|
): ArrayList<Int> {
|
||||||
val result = ArrayList<Int>()
|
val result = ArrayList<Int>()
|
||||||
val arrayEnd = seekIndexs(str, MARK_SENTENCES_END_P, 0, str.length - 2, true)
|
val arrayEnd = seekIndexes(str, MARK_SENTENCES_END_P, 0, str.length - 2, true)
|
||||||
val arrayMid = seekIndexs(str, MARK_SENTENCES_MID, 0, str.length - 2, true)
|
val arrayMid = seekIndexes(str, MARK_SENTENCES_MID, 0, str.length - 2, true)
|
||||||
if (arrayEnd.size < tigger && arrayMid.size < tigger * 3) return result
|
if (arrayEnd.size < tigger && arrayMid.size < tigger * 3) return result
|
||||||
var j = 0
|
var j = 0
|
||||||
var i = min
|
var i = min
|
||||||
@@ -347,7 +352,7 @@ object ContentHelp {
|
|||||||
var j = 0
|
var j = 0
|
||||||
var progress = 0
|
var progress = 0
|
||||||
var nextLine = -1
|
var nextLine = -1
|
||||||
if (insN.size > 0) nextLine = insN[j]
|
if (insN.isNotEmpty()) nextLine = insN[j]
|
||||||
var gain = 3
|
var gain = 3
|
||||||
var min = 0
|
var min = 0
|
||||||
var trigger = 2
|
var trigger = 2
|
||||||
@@ -425,24 +430,24 @@ object ContentHelp {
|
|||||||
var j = 0
|
var j = 0
|
||||||
var progress = 0
|
var progress = 0
|
||||||
var nextLine = -1
|
var nextLine = -1
|
||||||
if (insN.size > 0) nextLine = insN[j]
|
if (insN.isNotEmpty()) nextLine = insN[j]
|
||||||
for (i in arrayQuote.indices) {
|
for (i in arrayQuote.indices) {
|
||||||
val qutoe = arrayQuote[i]
|
val quote = arrayQuote[i]
|
||||||
|
|
||||||
// 把引号前的换行符与内容相间插入
|
// 把引号前的换行符与内容相间插入
|
||||||
while (j < insN.size) {
|
while (j < insN.size) {
|
||||||
|
|
||||||
// 如果下一个换行符在当前引号前,那么需要此次处理.如果紧挨当前引号,需要考虑插入引号的情况
|
// 如果下一个换行符在当前引号前,那么需要此次处理.如果紧挨当前引号,需要考虑插入引号的情况
|
||||||
if (nextLine >= qutoe) break
|
if (nextLine >= quote) break
|
||||||
nextLine = insN[j]
|
nextLine = insN[j]
|
||||||
buffer.append(string, progress, nextLine + 1)
|
buffer.append(string, progress, nextLine + 1)
|
||||||
buffer.append('\n')
|
buffer.append('\n')
|
||||||
progress = nextLine + 1
|
progress = nextLine + 1
|
||||||
j++
|
j++
|
||||||
}
|
}
|
||||||
if (progress < qutoe) {
|
if (progress < quote) {
|
||||||
buffer.append(string, progress, qutoe + 1)
|
buffer.append(string, progress, quote + 1)
|
||||||
progress = qutoe + 1
|
progress = quote + 1
|
||||||
}
|
}
|
||||||
if (insQuote[i] && buffer.length > 2) {
|
if (insQuote[i] && buffer.length > 2) {
|
||||||
if (buffer[buffer.length - 1] == '\n') buffer.append('“') else buffer.insert(
|
if (buffer[buffer.length - 1] == '\n') buffer.append('“') else buffer.insert(
|
||||||
@@ -504,7 +509,7 @@ object ContentHelp {
|
|||||||
* @param inOrder 是否按照从前向后的顺序匹配
|
* @param inOrder 是否按照从前向后的顺序匹配
|
||||||
* @return 返回距离构成的ArrayList<Int>
|
* @return 返回距离构成的ArrayList<Int>
|
||||||
*/
|
*/
|
||||||
private fun seekIndexs(
|
private fun seekIndexes(
|
||||||
str: String,
|
str: String,
|
||||||
key: String,
|
key: String,
|
||||||
from: Int,
|
from: Int,
|
||||||
@@ -514,14 +519,18 @@ object ContentHelp {
|
|||||||
val list = ArrayList<Int>()
|
val list = ArrayList<Int>()
|
||||||
if (str.length - from < 1) return list
|
if (str.length - from < 1) return list
|
||||||
var i = 0
|
var i = 0
|
||||||
if (from > i) i = from
|
if (from > 0) i = from
|
||||||
var t = str.length
|
var t = str.length
|
||||||
if (to > 0) t = min(t, to)
|
if (to > 0) t = min(t, to)
|
||||||
var c: Char
|
var c: Char
|
||||||
while (i < t) {
|
while (i < t) {
|
||||||
c = if (inOrder) str[i] else str[str.length - i - 1]
|
c = if (inOrder) str[i] else str[str.length - i - 1]
|
||||||
if (key.indexOf(c) != -1) {
|
if (key.indexOf(c) != -1) {
|
||||||
list.add(i)
|
if (list.isNotEmpty() && i - list.last() == 1) {
|
||||||
|
list[list.lastIndex] = i
|
||||||
|
} else {
|
||||||
|
list.add(i)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
@@ -567,7 +576,7 @@ object ContentHelp {
|
|||||||
private fun seekIndex(str: String, key: String, from: Int, to: Int, inOrder: Boolean): Int {
|
private fun seekIndex(str: String, key: String, from: Int, to: Int, inOrder: Boolean): Int {
|
||||||
if (str.length - from < 1) return -1
|
if (str.length - from < 1) return -1
|
||||||
var i = 0
|
var i = 0
|
||||||
if (from > i) i = from
|
if (from > 0) i = from
|
||||||
var t = str.length
|
var t = str.length
|
||||||
if (to > 0) t = min(t, to)
|
if (to > 0) t = min(t, to)
|
||||||
var c: Char
|
var c: Char
|
||||||
@@ -609,6 +618,7 @@ object ContentHelp {
|
|||||||
|
|
||||||
// 引号
|
// 引号
|
||||||
private const val MARK_QUOTATION = "\"“”"
|
private const val MARK_QUOTATION = "\"“”"
|
||||||
|
private const val MARK_QUOTATION_RIGHT = "\"”"
|
||||||
private val PARAGRAPH_DIAGLOG = "^[\"”“][^\"”“]+[\"”“]$".toRegex()
|
private val PARAGRAPH_DIAGLOG = "^[\"”“][^\"”“]+[\"”“]$".toRegex()
|
||||||
|
|
||||||
// 限制字典的长度
|
// 限制字典的长度
|
||||||
|
|||||||
Reference in New Issue
Block a user