diff --git a/app/src/main/java/io/legado/app/data/AppDatabase.kt b/app/src/main/java/io/legado/app/data/AppDatabase.kt index 2da9d066a..9500f41af 100644 --- a/app/src/main/java/io/legado/app/data/AppDatabase.kt +++ b/app/src/main/java/io/legado/app/data/AppDatabase.kt @@ -17,7 +17,7 @@ val appDb by lazy { } @Database( - version = 44, + version = 45, exportSchema = true, entities = [Book::class, BookGroup::class, BookSource::class, BookChapter::class, ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class, diff --git a/app/src/main/java/io/legado/app/data/dao/ReplaceRuleDao.kt b/app/src/main/java/io/legado/app/data/dao/ReplaceRuleDao.kt index bd4f4a549..fff599e94 100644 --- a/app/src/main/java/io/legado/app/data/dao/ReplaceRuleDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/ReplaceRuleDao.kt @@ -55,6 +55,13 @@ interface ReplaceRuleDao { ) fun findEnabledByTitleScope(name: String, origin: String): List + @Query( + """SELECT * FROM replace_rules WHERE isEnabled = 1 and scopeMultilineTitle = 1 + AND (scope LIKE '%' || :name || '%' or scope LIKE '%' || :origin || '%' or scope is null or scope = '') + order by sortOrder""" + ) + fun findEnabledByMultilineTitleScope(name: String, origin: String): List + @Query("select * from replace_rules where `group` like '%' || :group || '%'") fun getByGroup(group: String): List diff --git a/app/src/main/java/io/legado/app/data/entities/ReplaceRule.kt b/app/src/main/java/io/legado/app/data/entities/ReplaceRule.kt index a81e165af..2ec427e88 100644 --- a/app/src/main/java/io/legado/app/data/entities/ReplaceRule.kt +++ b/app/src/main/java/io/legado/app/data/entities/ReplaceRule.kt @@ -34,6 +34,9 @@ data class ReplaceRule( //作用于标题 @ColumnInfo(defaultValue = "0") var scopeTitle: Boolean = false, + //作用于多行标题 + @ColumnInfo(defaultValue = "0") + var scopeMultilineTitle: Boolean = false, //作用于正文 @ColumnInfo(defaultValue = "1") var scopeContent: Boolean = true, diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt index 9abe851d1..677317a9d 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt @@ -8,6 +8,7 @@ import android.text.StaticLayout import android.text.TextPaint import io.legado.app.constant.AppPattern import io.legado.app.constant.EventBus +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.help.AppConfig @@ -133,6 +134,7 @@ object ChapterProvider { matcher.appendTail(sb) text = sb.toString() if (!(isTitle && ReadBookConfig.titleMode == 2)) { + if (isTitle) text = replaceMultilineTitle(text, book) setTypeText( absStartX, durY, text, textPages, stringBuilder, isTitle, isTitleWithNoContent, isVolumeTitle, textPaint, srcList @@ -145,9 +147,10 @@ object ChapterProvider { val matcher = AppPattern.imgPattern.matcher(content) var start = 0 while (matcher.find()) { - val text = content.substring(start, matcher.start()) + var text = content.substring(start, matcher.start()) if (text.isNotBlank()) { if (!(isTitle && ReadBookConfig.titleMode == 2)) { + if (isTitle) text = replaceMultilineTitle(text, book) setTypeText( absStartX, durY, text, textPages, stringBuilder, isTitle, isTitleWithNoContent, isVolumeTitle, textPaint @@ -164,9 +167,10 @@ object ChapterProvider { start = matcher.end() } if (start < content.length) { - val text = content.substring(start, content.length) + var text = content.substring(start, content.length) if (text.isNotBlank()) { if (!(isTitle && ReadBookConfig.titleMode == 2)) { + if (isTitle) text = replaceMultilineTitle(text, book) setTypeText( absStartX, durY, text, textPages, stringBuilder, isTitle, isTitleWithNoContent, isVolumeTitle, textPaint @@ -621,4 +625,25 @@ object ChapterProvider { } } + /** + * 单独替换正文的标题,可用于多行标题 + */ + private fun replaceMultilineTitle(title: String, book: Book): String { + var mTitle = title + appDb.replaceRuleDao.findEnabledByMultilineTitleScope(book.name, book.origin).forEach { item -> + if (item.pattern.isNotEmpty()) { + try { + mTitle = if (item.isRegex) { + mTitle.replace(item.pattern.toRegex(), item.replacement) + } else { + mTitle.replace(item.pattern, item.replacement) + } + } catch (e: Exception) { + appCtx.toastOnUi("${item.name}替换出错") + } + } + } + return mTitle + } + } diff --git a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt index 122a178f6..2a79f3e8b 100644 --- a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt @@ -98,6 +98,7 @@ class ReplaceEditActivity : cbUseRegex.isChecked = replaceRule.isRegex etReplaceTo.setText(replaceRule.replacement) cbScopeTitle.isChecked = replaceRule.scopeTitle + cbScopeMultilineTitle.isChecked = replaceRule.scopeMultilineTitle cbScopeContent.isChecked = replaceRule.scopeContent etScope.setText(replaceRule.scope) } @@ -110,6 +111,7 @@ class ReplaceEditActivity : replaceRule.isRegex = cbUseRegex.isChecked replaceRule.replacement = etReplaceTo.text.toString() replaceRule.scopeTitle = cbScopeTitle.isChecked + replaceRule.scopeMultilineTitle = cbScopeMultilineTitle.isChecked replaceRule.scopeContent = cbScopeContent.isChecked replaceRule.scope = etScope.text.toString() return replaceRule diff --git a/app/src/main/res/layout/activity_replace_edit.xml b/app/src/main/res/layout/activity_replace_edit.xml index b8f2a3c39..ded071f3b 100644 --- a/app/src/main/res/layout/activity_replace_edit.xml +++ b/app/src/main/res/layout/activity_replace_edit.xml @@ -114,6 +114,13 @@ android:text="@string/scope_title" android:checked="false" /> + + 选择保存书籍的文件夹 用户代理 背景透明度 - - 校验设置 校验项目 单个书源校验超时(秒) @@ -932,5 +930,5 @@ 使用替换 作用于标题 作用于正文 - + Multiline title diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 31f5ed606..04bb114eb 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -920,8 +920,6 @@ 选择保存书籍的文件夹 用户代理 背景透明度 - - 校验设置 校验项目 单个书源校验超时(秒) @@ -935,5 +933,5 @@ 使用替换 作用于标题 作用于正文 - + Multiline title diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 3da96d479..7fd47e143 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -917,8 +917,6 @@ 选择保存书籍的文件夹 用户代理 背景透明度 - - 校验设置 校验项目 单个书源校验超时(秒) @@ -932,5 +930,5 @@ 使用替换 作用于标题 作用于正文 - + 多行标题 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 5b7720fdf..d793b8c95 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -919,8 +919,6 @@ 选择保存书籍的文件夹 用户代理 背景透明度 - - 校验设置 校验项目 单个书源校验超时(秒) @@ -934,5 +932,5 @@ 使用替换 作用于标题 作用于正文 - + 多行标题 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 4c95196e7..7a25f76ad 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -919,8 +919,6 @@ 选择保存书籍的文件夹 用户代理 背景透明度 - - 校验设置 校验项目 单个书源校验超时(秒) @@ -934,5 +932,5 @@ 使用替换 作用于标题 作用于正文 - + 多行标题 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 54cd5aa56..9882f0b3e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -920,8 +920,6 @@ 选择保存书籍的文件夹 User agent Background alpha - - 校验设置 校验项目 单个书源校验超时(秒) @@ -935,5 +933,5 @@ Use replace 作用于标题 作用于正文 - + Multiline title