fix(CustomExport): 修复导出章节列表越界的问题,优化导出逻辑
This commit is contained in:
@@ -243,4 +243,25 @@ fun Book.getExportFileName(suffix: String): String {
|
|||||||
}.onFailure {
|
}.onFailure {
|
||||||
AppLog.put("导出书名规则错误,使用默认规则\n${it.localizedMessage}", it)
|
AppLog.put("导出书名规则错误,使用默认规则\n${it.localizedMessage}", it)
|
||||||
}.getOrDefault("${name} 作者:${getRealAuthor()}.$suffix")
|
}.getOrDefault("${name} 作者:${getRealAuthor()}.$suffix")
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取分割文件后的文件名
|
||||||
|
*/
|
||||||
|
fun Book.getExportFileName(suffix: String, epubIndex: Int): String {
|
||||||
|
val jsStr = AppConfig.bookExportFileName
|
||||||
|
// 默认规则
|
||||||
|
val default = "$name 作者:${getRealAuthor()} [${epubIndex}].$suffix"
|
||||||
|
if (jsStr.isNullOrBlank()) {
|
||||||
|
return default
|
||||||
|
}
|
||||||
|
val bindings = SimpleBindings()
|
||||||
|
bindings["name"] = name
|
||||||
|
bindings["author"] = getRealAuthor()
|
||||||
|
bindings["epubIndex"] = epubIndex
|
||||||
|
return kotlin.runCatching {
|
||||||
|
RhinoScriptEngine.eval(jsStr, bindings).toString() + "." + suffix
|
||||||
|
}.onFailure {
|
||||||
|
AppLog.put("导出书名规则错误,使用默认规则\n${it.localizedMessage}", it)
|
||||||
|
}.getOrDefault(default)
|
||||||
}
|
}
|
||||||
@@ -689,10 +689,11 @@ class CacheViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
*/
|
*/
|
||||||
private suspend fun exportEpub(doc: DocumentFile, book: Book) {
|
private suspend fun exportEpub(doc: DocumentFile, book: Book) {
|
||||||
val (contentModel, epubList) = createEpubs(doc, book)
|
val (contentModel, epubList) = createEpubs(doc, book)
|
||||||
epubList.forEachIndexed { index, epubBook ->
|
epubList.forEachIndexed { index, ep ->
|
||||||
|
val (filename, epubBook) = ep
|
||||||
//设置正文
|
//设置正文
|
||||||
this.setEpubContent(contentModel, book, epubBook, index)
|
this.setEpubContent(contentModel, book, epubBook, index)
|
||||||
save2Drive(book.name + index + ".epub", epubBook, doc)
|
save2Drive(filename, epubBook, doc)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -717,13 +718,17 @@ class CacheViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
if (scope.indexOf(index) >= 0) {
|
if (scope.indexOf(index) >= 0) {
|
||||||
chapterList.add(chapter)
|
chapterList.add(chapter)
|
||||||
}
|
}
|
||||||
|
if (scope.size == chapterList.size) {
|
||||||
|
return@forEachIndexed
|
||||||
|
}
|
||||||
}
|
}
|
||||||
val totalChapterNum = book.totalChapterNum / scope.size
|
val totalChapterNum = book.totalChapterNum / scope.size
|
||||||
chapterList = chapterList.subList(epubBookIndex * size, (epubBookIndex + 1) * size)
|
chapterList = chapterList.subList(epubBookIndex * size, if((epubBookIndex + 1) * size > scope.size) scope.size else (epubBookIndex + 1) * size)
|
||||||
chapterList.forEachIndexed { index, chapter ->
|
chapterList.forEachIndexed { index, chapter ->
|
||||||
coroutineContext.ensureActive()
|
coroutineContext.ensureActive()
|
||||||
context.upAdapterLiveData.postValue(book.bookUrl)
|
context.upAdapterLiveData.postValue(book.bookUrl)
|
||||||
context.exportProgress[book.bookUrl] = totalChapterNum * (epubBookIndex * size + index)
|
context.exportProgress[book.bookUrl] =
|
||||||
|
totalChapterNum * (epubBookIndex * size + index)
|
||||||
BookHelp.getContent(book, chapter).let { content ->
|
BookHelp.getContent(book, chapter).let { content ->
|
||||||
var content1 = context.fixPic(
|
var content1 = context.fixPic(
|
||||||
epubBook,
|
epubBook,
|
||||||
@@ -764,13 +769,21 @@ class CacheViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建多个epub 对象
|
* 创建多个epub 对象
|
||||||
|
*
|
||||||
|
* @param doc 导出文档
|
||||||
|
* @param book 书籍
|
||||||
|
*
|
||||||
|
* @return <内容模板字符串, <epub文件名, epub对象>>
|
||||||
*/
|
*/
|
||||||
private fun createEpubs(doc: DocumentFile, book: Book): Pair<String, List<EpubBook>> {
|
private fun createEpubs(
|
||||||
|
doc: DocumentFile,
|
||||||
|
book: Book
|
||||||
|
): Pair<String, List<Pair<String, EpubBook>>> {
|
||||||
val paresNumOfEpub = paresNumOfEpub(scope.size, size)
|
val paresNumOfEpub = paresNumOfEpub(scope.size, size)
|
||||||
val result: MutableList<EpubBook> = ArrayList(paresNumOfEpub)
|
val result: MutableList<Pair<String, EpubBook>> = ArrayList(paresNumOfEpub)
|
||||||
var contentModel = ""
|
var contentModel = ""
|
||||||
for (i in 1..paresNumOfEpub) {
|
for (i in 1..paresNumOfEpub) {
|
||||||
val filename = book.getExportFileName("epub")
|
val filename = book.getExportFileName("epub", i)
|
||||||
DocumentUtils.delete(doc, filename)
|
DocumentUtils.delete(doc, filename)
|
||||||
val epubBook = EpubBook()
|
val epubBook = EpubBook()
|
||||||
epubBook.version = "2.0"
|
epubBook.version = "2.0"
|
||||||
@@ -782,7 +795,7 @@ class CacheViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
contentModel = context.setAssets(doc, book, epubBook)
|
contentModel = context.setAssets(doc, book, epubBook)
|
||||||
|
|
||||||
// add epubBook
|
// add epubBook
|
||||||
result.add(epubBook)
|
result.add(Pair(filename, epubBook))
|
||||||
}
|
}
|
||||||
return Pair(contentModel, result)
|
return Pair(contentModel, result)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user