This reverts commit d59d04d6

pull/289/head
Celeter 5 years ago
parent d59d04d6cd
commit f8d3aa24ca
  1. 2
      .gitignore
  2. 27
      app/build.gradle
  3. 6
      app/src/main/AndroidManifest.xml
  4. 8
      app/src/main/assets/updateLog.md
  5. 7
      app/src/main/java/io/legado/app/constant/AppConst.kt
  6. 2
      app/src/main/java/io/legado/app/constant/AppPattern.kt
  7. 2
      app/src/main/java/io/legado/app/help/BookHelp.kt
  8. 10
      app/src/main/java/io/legado/app/help/JsExtensions.kt
  9. 32
      app/src/main/java/io/legado/app/help/SourceHelp.kt
  10. 4
      app/src/main/java/io/legado/app/help/http/AjaxWebView.kt
  11. 1
      app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeByJSoup.kt
  12. 4
      app/src/main/java/io/legado/app/model/rss/RssParser.kt
  13. 8
      app/src/main/java/io/legado/app/model/webBook/BookContent.kt
  14. 9
      app/src/main/java/io/legado/app/model/webBook/BookInfo.kt
  15. 10
      app/src/main/java/io/legado/app/model/webBook/BookList.kt
  16. 5
      app/src/main/java/io/legado/app/ui/book/download/DownloadViewModel.kt
  17. 6
      app/src/main/java/io/legado/app/ui/config/FileAssociationViewModel.kt
  18. 4
      app/src/main/java/io/legado/app/ui/main/MainActivity.kt
  19. 1
      app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt
  20. 6
      app/src/main/java/io/legado/app/utils/EncoderUtils.kt
  21. 6
      app/src/main/res/color/selector_image.xml
  22. 2
      app/src/main/res/values-zh-rHK/strings.xml
  23. 2
      app/src/main/res/values-zh-rTW/strings.xml
  24. 2
      app/src/main/res/values-zh/strings.xml
  25. 2
      app/src/main/res/values/strings.xml
  26. 12
      app/src/main/res/xml/about.xml
  27. 15
      build.gradle
  28. 2
      gradle/wrapper/gradle-wrapper.properties

2
.gitignore vendored

@ -10,6 +10,6 @@
/tmp
node_modules/
/app/app
/app/coolApk
/app/google
/app/gradle.properties
package-lock.json

@ -3,7 +3,7 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'de.timfreiheit.resourceplaceholders'
//apply plugin: 'io.fabric'
apply plugin: 'io.fabric'
androidExtensions {
experimental = true
@ -33,9 +33,8 @@ android {
}
}
defaultConfig {
applicationId "io.legado.application"
//minSdkVersion 21
minSdkVersion 28
applicationId "io.legado.app"
minSdkVersion 21
targetSdkVersion 29
versionCode gitCommits
versionName version
@ -57,7 +56,7 @@ android {
if (project.hasProperty("RELEASE_STORE_FILE")) {
signingConfig signingConfigs.myConfig
}
//applicationIdSuffix '.release'
applicationIdSuffix '.release'
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
@ -77,20 +76,15 @@ android {
}
}
productFlavors {
app { //
app {
dimension "version"
manifestPlaceholders = [APP_CHANNEL_VALUE: "app"]
}
google {
dimension "version"
applicationId "io.legado.celeter"
applicationId "io.legado.play"
manifestPlaceholders = [APP_CHANNEL_VALUE: "google"]
}
coolApk { //
dimension "version"
applicationId "io.legado.google"
manifestPlaceholders = [APP_CHANNEL_VALUE: "coolApk"]
}
}
compileOptions {
// Flag to enable support for the new language APIs
@ -116,7 +110,7 @@ kapt {
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test:runner:1.2.0'
@ -126,9 +120,8 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
//fireBase
//implementation 'com.google.firebase:firebase-core:17.4.4'
//implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
implementation 'androidx.documentfile:documentfile:1.0.1'
implementation 'com.google.firebase:firebase-core:17.4.4'
implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
//androidX
implementation 'androidx.core:core-ktx:1.3.1'
@ -214,4 +207,4 @@ dependencies {
//implementation 'fadeapp.widgets:scrollless-recyclerView:1.0.2'
}
//apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.gms.google-services'

@ -194,7 +194,7 @@
<data
android:host="booksource"
android:scheme="legado" />
android:scheme="yuedu" />
</intent-filter>
</activity>
<!--订阅源管理-->
@ -209,7 +209,7 @@
<data
android:host="rsssource"
android:scheme="legado" />
android:scheme="yuedu" />
</intent-filter>
</activity>
<!--替换规则界面-->
@ -224,7 +224,7 @@
<data
android:host="replace"
android:scheme="legado" />
android:scheme="yuedu" />
</intent-filter>
</activity>
<!--书籍管理-->

@ -1,4 +1,7 @@
## 更新日志
* 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。
* 请关注公众号[开源阅读]()支持我,同时关注合作公众号[小说拾遗](),阅读公众号小编。
* 新公众号[开源阅读]()已启用,[开源阅读软件]()备用
**2020/07/30**
* 所有版本都加上书源屏蔽列表,有其它想法的可以自己编译软件,反正是开源的
@ -209,15 +212,14 @@
**2020/04/13**
* 去除rss朗读时的引号
**2020/04/13**
* 修复调用webView返回结果多了引号的bug
**2020/04/12**
* 解决无法取消加粗的bug
* 修复换源自动加入书架的bug
**2020/04/11**
* 列表及预加载规则以外的地方使用`VS`可查看源码,例:`tag.div@VS`
**2020/04/09**
* 修复书架刷新闪烁

@ -20,7 +20,7 @@ object AppConst {
const val UA_NAME = "User-Agent"
val userAgent: String by lazy {
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.5167.89 Safari/537.36 Edg/86.0.522.88"
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}
val SCRIPT_ENGINE: ScriptEngine by lazy {
@ -41,8 +41,9 @@ object AppConst {
val keyboardToolChars: List<String> by lazy {
arrayListOf(
"", "@css:", "<js></js>", "&&", "||", "%%", "/", ":", "[]", "{}", "$.",
"VS", "all", "ownText", "href", "src", "textNodes"
"", "@", "&", "|", "%", "/", ":", "[", "]", "{", "}", "<", ">", "\\",
"$", "#", "!", ".", "href", "src", "textNodes", "xpath", "json", "css",
"id", "class", "tag"
)
}

@ -6,5 +6,5 @@ object AppPattern {
val JS_PATTERN: Pattern = Pattern.compile("(<js>[\\w\\W]*?</js>|@js:[\\w\\W]*$)", Pattern.CASE_INSENSITIVE)
val EXP_PATTERN: Pattern = Pattern.compile("\\{\\{([\\w\\W]*?)\\}\\}")
val authorRegex = "\\s*者\\s*[::]\\s*".toRegex()
val authorRegex = "\\s*者\\s*[::]".toRegex()
}

@ -112,7 +112,7 @@ object BookHelp {
fun formatAuthor(author: String?): String {
return author
?.replace("\\s*者\\s*[::]\\s*".toRegex(), "")
?.replace("\\s*者\\s*[::]\n*".toRegex(), "")
?.replace("\\s+".toRegex(), " ")
?.trim { it <= ' ' }
?: ""

@ -30,18 +30,14 @@ interface JsExtensions {
* js实现解码,不能删
*/
fun base64Decode(str: String): String {
return EncoderUtils.base64Decode(str, Base64.NO_WRAP)
}
fun base64Decode(str: String, flags: Int): String {
return EncoderUtils.base64Decode(str, flags)
return EncoderUtils.base64Decode(str)
}
fun base64Encode(str: String): String? {
return EncoderUtils.base64Encode(str, Base64.NO_WRAP)
return EncoderUtils.base64Encode(str)
}
fun base64Encode(str: String, flags: Int): String? {
fun base64Encode(str: String, flags: Int = Base64.NO_WRAP): String? {
return EncoderUtils.base64Encode(str, flags)
}

@ -5,8 +5,8 @@ import android.os.Looper
import io.legado.app.App
import io.legado.app.data.entities.BookSource
import io.legado.app.data.entities.RssSource
//import io.legado.app.utils.EncoderUtils
//import io.legado.app.utils.NetworkUtils
import io.legado.app.utils.EncoderUtils
import io.legado.app.utils.NetworkUtils
import io.legado.app.utils.splitNotBlank
import org.jetbrains.anko.toast
@ -47,20 +47,20 @@ object SourceHelp {
}
private fun is18Plus(url: String?): Boolean {
// url ?: return false
// val baseUrl = NetworkUtils.getBaseUrl(url)
// baseUrl ?: return false
// if (AppConfig.isGooglePlay) return false
// try {
// val host = baseUrl.split("//", ".")
// val base64Url = EncoderUtils.base64Encode("${host[host.lastIndex - 1]}.${host.last()}")
// list18Plus.forEach {
// if (base64Url == it) {
// return true
// }
// }
// } catch (e: Exception) {
// }
url ?: return false
val baseUrl = NetworkUtils.getBaseUrl(url)
baseUrl ?: return false
if (AppConfig.isGooglePlay) return false
try {
val host = baseUrl.split("//", ".")
val base64Url = EncoderUtils.base64Encode("${host[host.lastIndex - 1]}.${host.last()}")
list18Plus.forEach {
if (base64Url == it) {
return true
}
}
} catch (e: Exception) {
}
return false
}

@ -80,7 +80,7 @@ class AjaxWebView {
}
fun load(params: AjaxParams) {
if (!params.sourceRegex.isNullOrEmpty()) {
if (params.sourceRegex != "") {
mHandler.obtainMessage(MSG_SNIFF_START, params)
.sendToTarget()
} else {
@ -158,7 +158,7 @@ class AjaxWebView {
mWebView.get()?.evaluateJavascript(mJavaScript) {
if (it.isNotEmpty() && it != "null") {
val content = StringEscapeUtils.unescapeJson(it)
.replace("^\"|\"$".toRegex(), "") // 暂时先手动取掉引号
.replace("^\"|\"$".toRegex(), "")
handler.obtainMessage(MSG_SUCCESS, Res(url, content))
.sendToTarget()
handler.removeCallbacks(this)

@ -383,7 +383,6 @@ class AnalyzeByJSoup {
textS.add(html)
}
"all" -> textS.add(elements.outerHtml())
"VS" -> textS.add("view-source:\n" + elements.outerHtml())
else -> for (element in elements) {
val url = element.attr(lastRule)
if (!isEmpty(url) && !textS.contains(url)) {

@ -117,11 +117,11 @@ object RssParser {
private fun getImageUrl(input: String): String? {
var url: String? = null
val patternImg = "(<img [^>]*>)".toPattern()
val patternImg = "(<img .*?>)".toPattern()
val matcherImg = patternImg.matcher(input)
if (matcherImg.find()) {
val imgTag = matcherImg.group(1)
val patternLink = "src\\s*=\\s*\"([^\"]+)\"".toPattern()
val patternLink = "src\\s*=\\s*\"(.+?)\"".toPattern()
val matcherLink = patternLink.matcher(imgTag!!)
if (matcherLink.find()) {
url = matcherLink.group(1)!!.trim()

@ -132,13 +132,7 @@ object BookContent {
}
Debug.log(bookSource.bookSourceUrl, "" + nextUrlList.joinToString(""), printLog)
}
val content = analyzeRule.getString(contentRule.content).let {
if (it.startsWith("view-source:\n")) {
it
} else {
("\n" + it).htmlFormat()
}
}
val content = analyzeRule.getString(contentRule.content)
return ContentData(content, nextUrlList)
}
}

@ -61,14 +61,9 @@ object BookInfo {
Debug.log(bookSource.bookSourceUrl, "${book.latestChapterTitle}")
Debug.log(bookSource.bookSourceUrl, "┌获取简介")
analyzeRule.getString(infoRule.intro).let {
if (it.isNotEmpty())
book.intro = if (it.startsWith("view-source:\n")) {
it
} else {
("\n" + it).htmlFormat()
if (it.isNotEmpty()) book.intro = it.htmlFormat()
}
}
Debug.log(bookSource.bookSourceUrl, "${book.intro}")
Debug.log(bookSource.bookSourceUrl, "${book.intro}", isHtml = true)
Debug.log(bookSource.bookSourceUrl, "┌获取封面链接")
analyzeRule.getString(infoRule.coverUrl).let {

@ -145,9 +145,8 @@ object BookList {
Debug.log(bookSource.bookSourceUrl, "${searchBook.latestChapterTitle}")
if (!scope.isActive) throw CancellationException()
Debug.log(bookSource.bookSourceUrl, "┌获取简介")
val introStr = analyzeRule.getString(intro)
searchBook.intro = introStr
Debug.log(bookSource.bookSourceUrl, "${searchBook.intro}", isHtml = !introStr.startsWith("view-source:\n"))
searchBook.intro = analyzeRule.getString(intro)
Debug.log(bookSource.bookSourceUrl, "${searchBook.intro}", true)
if (!scope.isActive) throw CancellationException()
Debug.log(bookSource.bookSourceUrl, "┌获取封面链接")
searchBook.coverUrl = analyzeRule.getString(coverUrl, true)
@ -205,9 +204,8 @@ object BookList {
Debug.log(bookSource.bookSourceUrl, "${searchBook.latestChapterTitle}", log)
if (!scope.isActive) throw CancellationException()
Debug.log(bookSource.bookSourceUrl, "┌获取简介", log)
val introStr = analyzeRule.getString(ruleIntro)
searchBook.intro = introStr
Debug.log(bookSource.bookSourceUrl, "${searchBook.intro}", log, isHtml = !introStr.startsWith("view-source:\n"))
searchBook.intro = analyzeRule.getString(ruleIntro)
Debug.log(bookSource.bookSourceUrl, "${searchBook.intro}", log, true)
if (!scope.isActive) throw CancellationException()
Debug.log(bookSource.bookSourceUrl, "┌获取封面链接", log)
analyzeRule.getString(ruleCoverUrl).let {

@ -36,12 +36,12 @@ class DownloadViewModel(application: Application) : BaseViewModel(application) {
}
private fun export(doc: DocumentFile, book: Book) {
DocumentUtils.createFileIfNotExist(doc, "${book.name}_作者:${book.author}.txt")
DocumentUtils.createFileIfNotExist(doc, "${book.name}.txt")
?.writeText(context, getAllContents(book))
}
private fun export(file: File, book: Book) {
FileUtils.createFileIfNotExist(file, "${book.name}_作者:${book.author}.txt")
FileUtils.createFileIfNotExist(file, "${book.name}.txt")
.writeText(getAllContents(book))
}
@ -52,7 +52,6 @@ class DownloadViewModel(application: Application) : BaseViewModel(application) {
.append(context.getString(R.string.author_show, book.author))
App.db.bookChapterDao().getChapterList(book.bookUrl).forEach { chapter ->
BookHelp.getContent(book, chapter).let {
if (!it.isNullOrEmpty())
stringBuilder.append("\n\n")
.append(chapter.title)
.append("\n")

@ -62,15 +62,15 @@ class FileAssociationViewModel(application: Application) : BaseViewModel(applica
}
// content模式下,需要传递完整的路径,方便后续解析
url = if (uri.scheme == "content") {
"legado://${scheme}/importonline?src=$uri"
"yuedu://${scheme}/importonline?src=$uri"
} else {
"legado://${scheme}/importonline?src=${uri.path}"
"yuedu://${scheme}/importonline?src=${uri.path}"
}
} else if (uri.scheme == "yuedu") {
url = uri.toString()
} else {
url = "legado://booksource/importonline?src=${uri.path}"
url = "yuedu://booksource/importonline?src=${uri.path}"
}
val data = Uri.parse(url)
val newIndent = Intent(Intent.ACTION_VIEW)

@ -96,9 +96,7 @@ class MainActivity : VMBaseActivity<MainViewModel>(R.layout.activity_main),
putPrefInt(PreferKey.versionCode, App.INSTANCE.versionCode)
if (!BuildConfig.DEBUG) {
val log = String(assets.open("updateLog.md").readBytes())
// 5s后自动关闭日志
// TextDialog.show(supportFragmentManager, log, TextDialog.MD, 5000, true)
TextDialog.show(supportFragmentManager, log, TextDialog.MD, 0)
TextDialog.show(supportFragmentManager, log, TextDialog.MD, 5000, true)
}
}
}

@ -169,7 +169,6 @@ class ReadRssActivity : VMBaseActivity<ReadRssViewModel>(R.layout.activity_rss_r
url
)//不想用baseUrl进else
} else {
//webView.loadData(html, "text/html;charset=utf-8", "utf-8")//经测试可以解决中文乱码
web_view.loadDataWithBaseURL(
null,
html,

@ -25,8 +25,8 @@ object EncoderUtils {
return tmp.toString()
}
fun base64Decode(str: String, flags: Int): String {
val bytes = Base64.decode(str, flags)
fun base64Decode(str: String): String {
val bytes = Base64.decode(str, Base64.DEFAULT)
return try {
String(bytes, StandardCharsets.UTF_8)
} catch (e: Exception) {
@ -34,7 +34,7 @@ object EncoderUtils {
}
}
fun base64Encode(str: String, flags: Int): String? {
fun base64Encode(str: String, flags: Int = Base64.NO_WRAP): String? {
return Base64.encodeToString(str.toByteArray(), flags)
}
}

@ -4,10 +4,4 @@
<item android:state_pressed="true" android:color="@color/btn_bg_press" />
<item android:state_focused="true" android:color="@color/btn_bg_press_2" />
<item android:color="@color/tv_text_default" />
<!--
<item android:state_enabled="false" android:color="#1F000000" />
<item android:state_pressed="true" android:color="#DE000000" />
<item android:state_focused="true" android:color="#90000000" />
<item android:color="#90000000" />
-->
</selector>

@ -1,6 +1,6 @@
<resources>
<!--App-->
<string name="app_name">源書架</string>
<string name="app_name">閲讀</string>
<string name="receiving_shared_label">閲讀·搜尋</string>
<string name="tip_perm_request_storage">閲讀需要訪問存儲卡權限,請前往「設定」—「應用程式權限」—開啟所需要的權限</string>

@ -1,6 +1,6 @@
<resources>
<!--App-->
<string name="app_name">源書架</string>
<string name="app_name">閱讀</string>
<string name="receiving_shared_label">閱讀·搜尋</string>
<string name="tip_perm_request_storage">閱讀需要存取記憶卡權限,請前往“設定”—“應用權限”—打開所需權限</string>

@ -1,6 +1,6 @@
<resources>
<!--App-->
<string name="app_name">源书架</string>
<string name="app_name">阅读</string>
<string name="receiving_shared_label">阅读·搜索</string>
<string name="tip_perm_request_storage">阅读需要访问存储卡权限,请前往“设置”—“应用权限”—打开所需权限</string>

@ -1,6 +1,6 @@
<resources>
<!--App-->
<string name="app_name">BookSource</string>
<string name="app_name">Legado</string>
<string name="receiving_shared_label">Legado·search</string>
<string name="tip_perm_request_storage">Legado needs storage access to find and read books. please go "App Settings" to allow "Storage permission".</string>

@ -2,11 +2,11 @@
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!--io.legado.app.ui.widget.prefs.Preference
<io.legado.app.ui.widget.prefs.Preference
android:key="contributors"
android:title="@string/contributors"
android:summary="@string/contributors_summary"
app:iconSpaceReserved="false" /-->
app:iconSpaceReserved="false" />
<io.legado.app.ui.widget.prefs.Preference
android:key="check_update"
@ -27,7 +27,7 @@
app:iconSpaceReserved="false"
app:layout="@layout/view_preference_category">
<!--io.legado.app.ui.widget.prefs.Preference
<io.legado.app.ui.widget.prefs.Preference
android:key="gzGzh"
android:title="@string/follow_official_account"
android:summary="@string/official_account"
@ -37,7 +37,7 @@
android:key="qq"
android:title="@string/join_qq_group"
android:summary="@string/click_to_apply"
app:iconSpaceReserved="false" /-->
app:iconSpaceReserved="false" />
<io.legado.app.ui.widget.prefs.Preference
android:key="mail"
@ -45,11 +45,11 @@
android:summary="kunfei.ge@gmail.com"
app:iconSpaceReserved="false" />
<!--io.legado.app.ui.widget.prefs.Preference
<io.legado.app.ui.widget.prefs.Preference
android:key="git"
android:title="@string/git_hub"
android:summary="@string/this_github_url"
app:iconSpaceReserved="false" /-->
app:iconSpaceReserved="false" />
<io.legado.app.ui.widget.prefs.Preference
android:key="sourceRuleSummary"

@ -3,27 +3,28 @@
buildscript {
ext.kotlin_version = '1.3.72'
repositories {
maven { url 'https://maven.aliyun.com/repository/public' }
google()
//jcenter()
//maven { url 'https://maven.fabric.io/public' }
maven { url 'https://plugins.gradle.org/m2' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.fabric.io/public' }
maven { url 'https://plugins.gradle.org/m2/' }
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'de.timfreiheit.resourceplaceholders:placeholders:0.3'
//classpath 'com.google.gms:google-services:4.3.3'
//classpath 'io.fabric.tools:gradle:1.31.2'
classpath 'com.google.gms:google-services:4.3.3'
classpath 'io.fabric.tools:gradle:1.31.2'
}
}
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public' }
google()
//jcenter()
maven { url 'https://jitpack.io' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url "https://jitpack.io" }
maven { url 'https://maven.google.com/' }
maven { url 'https://github.com/psiegman/mvn-repo/raw/master/releases' }
}
}

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://downloads.gradle-dn.com/distributions/gradle-6.1.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip

Loading…
Cancel
Save