This commit is contained in:
Horis
2025-12-03 21:27:57 +08:00
parent fb17a2c28c
commit 842e52bd6f
@@ -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()
// 限制字典的长度 // 限制字典的长度