| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -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")//数据的创建者 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |