|
|
@ -13,6 +13,7 @@ import io.legado.app.base.BaseViewModel |
|
|
|
import io.legado.app.constant.AppPattern |
|
|
|
import io.legado.app.constant.AppPattern |
|
|
|
import io.legado.app.data.appDb |
|
|
|
import io.legado.app.data.appDb |
|
|
|
import io.legado.app.data.entities.Book |
|
|
|
import io.legado.app.data.entities.Book |
|
|
|
|
|
|
|
import io.legado.app.data.entities.BookChapter |
|
|
|
import io.legado.app.help.AppConfig |
|
|
|
import io.legado.app.help.AppConfig |
|
|
|
import io.legado.app.help.BookHelp |
|
|
|
import io.legado.app.help.BookHelp |
|
|
|
import io.legado.app.help.ContentProcessor |
|
|
|
import io.legado.app.help.ContentProcessor |
|
|
@ -23,6 +24,7 @@ import me.ag2s.epublib.epub.EpubWriter |
|
|
|
import me.ag2s.epublib.util.ResourceUtil |
|
|
|
import me.ag2s.epublib.util.ResourceUtil |
|
|
|
import java.io.ByteArrayOutputStream |
|
|
|
import java.io.ByteArrayOutputStream |
|
|
|
import java.io.File |
|
|
|
import java.io.File |
|
|
|
|
|
|
|
import java.io.FileInputStream |
|
|
|
import java.io.FileOutputStream |
|
|
|
import java.io.FileOutputStream |
|
|
|
import java.nio.charset.Charset |
|
|
|
import java.nio.charset.Charset |
|
|
|
|
|
|
|
|
|
|
@ -125,10 +127,10 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { |
|
|
|
appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter -> |
|
|
|
appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter -> |
|
|
|
BookHelp.getContent(book, chapter)?.let { content -> |
|
|
|
BookHelp.getContent(book, chapter)?.let { content -> |
|
|
|
content.split("\n").forEachIndexed { index, text -> |
|
|
|
content.split("\n").forEachIndexed { index, text -> |
|
|
|
val matcher = AppPattern.imgPattern.matcher(text) |
|
|
|
val matches = AppPattern.imgPattern.toRegex().findAll(input = text) |
|
|
|
if (matcher.find()) { |
|
|
|
matches.forEach { matchResult -> |
|
|
|
matcher.group(1)?.let { |
|
|
|
matchResult.groupValues[1].let { |
|
|
|
val src = NetworkUtils.getAbsoluteURL(chapter.url, it) |
|
|
|
val src=NetworkUtils.getAbsoluteURL(chapter.url, it) |
|
|
|
srcList.add(Triple(chapter.title, index, src)) |
|
|
|
srcList.add(Triple(chapter.title, index, src)) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -205,7 +207,7 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { |
|
|
|
//set css |
|
|
|
//set css |
|
|
|
epubBook.resources.add( |
|
|
|
epubBook.resources.add( |
|
|
|
Resource( |
|
|
|
Resource( |
|
|
|
"body{background:white;margin:0;}h2{color:#005a9c;text-align:left;}p{text-indent:2em;text-align:justify;}".encodeToByteArray(), |
|
|
|
"body,div{background:white;margin:0 auto;padding:0;outline:none;width:100%;}h2{color:#005a9c;text-align:left;}p{text-indent:2em;text-align:justify;}img{display:inline-block;width:100%;height:100%;max-width: 100%;max-height:100%;}".encodeToByteArray(), |
|
|
|
"css/style.css" |
|
|
|
"css/style.css" |
|
|
|
) |
|
|
|
) |
|
|
|
) |
|
|
|
) |
|
|
@ -215,13 +217,14 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { |
|
|
|
|
|
|
|
|
|
|
|
Glide.with(context) |
|
|
|
Glide.with(context) |
|
|
|
.asBitmap() |
|
|
|
.asBitmap() |
|
|
|
.load(book.coverUrl) |
|
|
|
.load(book.getDisplayCover()) |
|
|
|
.into(object : CustomTarget<Bitmap>() { |
|
|
|
.into(object : CustomTarget<Bitmap>() { |
|
|
|
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) { |
|
|
|
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) { |
|
|
|
val stream = ByteArrayOutputStream() |
|
|
|
val stream = ByteArrayOutputStream() |
|
|
|
resource.compress(Bitmap.CompressFormat.JPEG, 100, stream) |
|
|
|
resource.compress(Bitmap.CompressFormat.JPEG, 100, stream) |
|
|
|
val byteArray: ByteArray = stream.toByteArray() |
|
|
|
val byteArray: ByteArray = stream.toByteArray() |
|
|
|
resource.recycle() |
|
|
|
resource.recycle() |
|
|
|
|
|
|
|
stream.close() |
|
|
|
epubBook.coverImage = Resource(byteArray, "cover.jpg") |
|
|
|
epubBook.coverImage = Resource(byteArray, "cover.jpg") |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -232,13 +235,15 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { |
|
|
|
}) |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun setEpubContent(book: Book, epubBook: EpubBook) { |
|
|
|
private fun setEpubContent(book: Book, epubBook: EpubBook) { |
|
|
|
val useReplace = AppConfig.exportUseReplace |
|
|
|
val useReplace = AppConfig.exportUseReplace |
|
|
|
val contentProcessor = ContentProcessor(book.name, book.origin) |
|
|
|
val contentProcessor = ContentProcessor(book.name, book.origin) |
|
|
|
appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter -> |
|
|
|
appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter -> |
|
|
|
BookHelp.getContent(book, chapter).let { content -> |
|
|
|
BookHelp.getContent(book, chapter).let { content -> |
|
|
|
val content1 = contentProcessor |
|
|
|
var content1 = fixPic(epubBook, book, content ?: "null", chapter) |
|
|
|
.getContent(book, chapter.title, content ?: "null", false, useReplace) |
|
|
|
content1 = contentProcessor |
|
|
|
|
|
|
|
.getContent(book, chapter.title, content1, false, useReplace) |
|
|
|
.joinToString("\n") |
|
|
|
.joinToString("\n") |
|
|
|
.replace(chapter.title, "") |
|
|
|
.replace(chapter.title, "") |
|
|
|
|
|
|
|
|
|
|
@ -250,10 +255,42 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun setPic(src: String, book: Book, epubBook: EpubBook) { |
|
|
|
|
|
|
|
val vFile = BookHelp.getImage(book, src) |
|
|
|
|
|
|
|
if (vFile.exists()) { |
|
|
|
|
|
|
|
val img = Resource(FileInputStream(vFile), MD5Utils.md5Encode16(src) + ".jpg") |
|
|
|
|
|
|
|
epubBook.resources.add(img) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun fixPic( |
|
|
|
|
|
|
|
epubBook: EpubBook, |
|
|
|
|
|
|
|
book: Book, |
|
|
|
|
|
|
|
content: String, |
|
|
|
|
|
|
|
chapter: BookChapter |
|
|
|
|
|
|
|
): String { |
|
|
|
|
|
|
|
val data = StringBuilder("") |
|
|
|
|
|
|
|
content.split("\n").forEach { text -> |
|
|
|
|
|
|
|
var text1 = text |
|
|
|
|
|
|
|
val matches = AppPattern.imgPattern.toRegex().findAll(input = text) |
|
|
|
|
|
|
|
matches.forEach { matchResult -> |
|
|
|
|
|
|
|
matchResult.groupValues[1].let { |
|
|
|
|
|
|
|
val src=NetworkUtils.getAbsoluteURL(chapter.url, it) |
|
|
|
|
|
|
|
setPic(src, book, epubBook) |
|
|
|
|
|
|
|
text1 = text1.replace(src, MD5Utils.md5Encode16(src) + ".jpg") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data.append(text1).append("\n") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return data.toString() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private fun setEpubMetadata(book: Book, epubBook: EpubBook) { |
|
|
|
private fun setEpubMetadata(book: Book, epubBook: EpubBook) { |
|
|
|
val metadata = Metadata() |
|
|
|
val metadata = Metadata() |
|
|
|
metadata.titles.add(book.name)//书籍的名称 |
|
|
|
metadata.titles.add(book.name)//书籍的名称 |
|
|
|
metadata.authors.add(Author(book.author))//书籍的作者 |
|
|
|
metadata.authors.add(Author(book.getRealAuthor()))//书籍的作者 |
|
|
|
metadata.language = "zh"//数据的语言 |
|
|
|
metadata.language = "zh"//数据的语言 |
|
|
|
metadata.dates.add(Date())//数据的创建日期 |
|
|
|
metadata.dates.add(Date())//数据的创建日期 |
|
|
|
metadata.publishers.add("Legado APP")//数据的创建者 |
|
|
|
metadata.publishers.add("Legado APP")//数据的创建者 |
|
|
|