diff --git a/.github/scripts/lzy.sh b/.github/scripts/lzy.sh new file mode 100644 index 000000000..037e0610a --- /dev/null +++ b/.github/scripts/lzy.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +# -------------------------------------------------------------- +# 系统: ALL +# 项目: 蓝奏云上传文件 +# 版本: 1.0.3 +# 作者: XIU2 +# 官网: https://shell.xiu2.xyz +# 项目: https://github.com/XIU2/Shell +# -------------------------------------------------------------- + +USERNAME="admin" # 蓝奏云用户名 +COOKIE_PHPDISK_INFO="$LANZOU_PSD" # Cookie 中 phpdisk_info 的值 +COOKIE_YLOGIN="$LANZOU_ID" # Cookie 中 ylogin 的值 + +UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.7.3670.199 Safari/537.36" +HEADER_CHECK_LOGIN="User-Agent: ${UA} +Referer: https://up.woozooo.com/mydisk.php?item=files&action=index&u=${USERNAME} +Accept-Language: zh-CN,zh;q=0.9" + +URL_ACCOUNT="https://pc.woozooo.com/account.php" +URL_UPLOAD="https://up.woozooo.com/fileup.php" + +INFO="[信息]" && ERROR="[错误]" && TIP="[注意]" + +# 检查是否已登录 +_CHECK_LOGIN() { + if [[ "${COOKIE_PHPDISK_INFO}" = "" || "${COOKIE_PHPDISK_INFO}" = "XXX" ]]; then + _NOTICE "ERROR" "请指定 Cookie 中 phpdisk_info 的值!" + fi + if [[ "${COOKIE_YLOGIN}" = "" || "${COOKIE_YLOGIN}" = "XXX" ]]; then + _NOTICE "ERROR" "请指定 Cookie 中 ylogin 的值!" + fi + + HTML_CHECK_LOGIN=$(curl -s --http1.1 -b "ylogin=${COOKIE_YLOGIN};phpdisk_info=${COOKIE_PHPDISK_INFO}" -H "${HEADER_CHECK_LOGIN}" "${URL_ACCOUNT}"|grep "登录") + [[ ! -z "${HTML_CHECK_LOGIN}" ]] && _NOTICE "ERROR" "Cookie 已失效,请更新!" +} + +# 上传文件 +_UPLOAD() { + [[ $(du "${NAME_FILE}"|awk '{print $1}') -gt 100000000 ]] && _NOTICE "ERROR" "${NAME}文件大于 100MB!" + HTML_UPLOAD=$(curl --connect-timeout 120 -m 5000 --retry 2 -s -b "ylogin=${COOKIE_YLOGIN};phpdisk_info=${COOKIE_PHPDISK_INFO}" -H "${URL_UPLOAD}" -F "task=1" -F "id=WU_FILE_0" -F "folder_id=${FOLDER_ID}" -F "name=${NAME}" -F "upload_file=@${NAME_FILE}" "${URL_UPLOAD}"|grep '\\u4e0a\\u4f20\\u6210\\u529f') + [[ -z "${HTML_UPLOAD}" ]] && _NOTICE "ERROR" "${NAME}文件上传失败!" + echo -e "${INFO} 文件上传成功![$(date -u -d '+8 hour' '+%Y-%m-%d %H:%M:%S')]" +} + + +NAME="$1" # 文件名 +NAME_FILE="$2" # 文件路径 +FOLDER_ID="$3" # 上传文件夹ID +if [[ -z "${NAME}" ]]; then + echo -e "${ERROR} 未指定文件名!" && exit 1 +elif [[ -z "${NAME_FILE}" ]]; then + echo -e "${ERROR} 未指定文件路径!" && exit 1 +elif [[ -z "${FOLDER_ID}" ]]; then + echo -e "${ERROR} 未指定上传文件夹ID!" && exit 1 +fi +_CHECK_LOGIN +_UPLOAD diff --git a/.github/workflows/legado.yml b/.github/workflows/legado.yml index 787d81e48..c5de90a93 100644 --- a/.github/workflows/legado.yml +++ b/.github/workflows/legado.yml @@ -6,11 +6,6 @@ on: push: branches: - master -# tags: -# - '3.*' -# pull_request: -# branches: -# - master # watch: # types: [started] # schedule: @@ -25,16 +20,21 @@ jobs: # LANZOU_PSD : pc.woozooo.com -> Cookie -> phpdisk_info LANZOU_ID: ${{ secrets.LANZOU_ID }} LANZOU_PSD: ${{ secrets.LANZOU_PSD }} - # 蓝奏云里的文件夹名(需手动在蓝奏云创建) - LANZOU_FOLDER: '阅读3测试版' + # 蓝奏云里的文件夹ID(阅读3测试版:2670621) + LANZOU_FOLDER_ID: '2670621' # 是否上传到artifact UPLOAD_ARTIFACT: 'true' steps: - uses: actions/checkout@v2 - - name: Set Up JDK - uses: actions/setup-java@v1 + - uses: actions/cache@v2 with: - java-version: 14 + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-legado-${{ hashFiles('**/updateLog.md') }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-legado-${{ hashFiles('**/updateLog.md') }}- + - name: Clear 18PlusList.txt run: | echo "清空18PlusList.txt" @@ -56,35 +56,31 @@ jobs: run: | echo "开始进行release构建" chmod +x gradlew - ./gradlew assembleAppRelease + ./gradlew assembleAppRelease --build-cache --parallel - name: Upload App To Artifact if: ${{ env.UPLOAD_ARTIFACT != 'false' }} uses: actions/upload-artifact@v2 with: name: legado apk path: ${{ github.workspace }}/app/build/outputs/apk/app/release/*.apk - - name: Set Up Python 3 - if: ${{ env.LANZOU_PSD }} - uses: actions/setup-python@v2 - with: - python-version: 3.x - - name: Dependence Install - if: ${{ env.LANZOU_PSD }} - run: | - pip install requests - pip install lanzou-api - - name: Download Script - if: ${{ env.LANZOU_PSD }} - shell: python - run: | - import requests,os - res = requests.get('https://raw.githubusercontent.com/Celeter/build/master/.github/scripts/API_lanzou.py') - with open(os.environ["FILE_PATH"], 'wb') as f: - f.write(res.content) - env: - FILE_PATH: ${{ github.workspace }}/.github/lzy.py - name: Upload App To Lanzou if: ${{ env.LANZOU_PSD }} - run: python $GITHUB_WORKSPACE/.github/lzy.py + run: | + path="$GITHUB_WORKSPACE/app/build/outputs/apk/app/release/" + files=$(ls $path) + for f in $files + do + if [[ $f == *"apk" ]]; then + file=$f + echo "文件:$file" + break + fi + done + + bash $GITHUB_WORKSPACE/.github/scripts/lzy.sh "$file" \ + "$GITHUB_WORKSPACE/app/build/outputs/apk/app/release/$file" "${{ env.LANZOU_FOLDER_ID }}" + echo "分享链接: https://kunfei.lanzous.com/b0f810h4b" env: - UPLOAD_FOLDER: ${{ github.workspace }}/app/build/outputs/apk/app/release/ + LANZOU_ID: ${{ env.LANZOU_ID }} + LANZOU_PSD: ${{ env.LANZOU_PSD }} + diff --git a/app/build.gradle b/app/build.gradle index 51a57aef2..b4a071e38 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -125,10 +125,12 @@ dependencies { implementation 'com.google.firebase:firebase-crashlytics-ktx:17.3.0' //androidX - implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'androidx.media:media:1.2.1' + implementation 'androidx.core:core-ktx:1.3.2' + implementation "androidx.activity:activity-ktx:1.1.0" + implementation "androidx.fragment:fragment-ktx:1.2.5" implementation 'androidx.preference:preference-ktx:1.1.1' + implementation "androidx.collection:collection-ktx:1.1.0" implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'androidx.viewpager2:viewpager2:1.0.0' @@ -136,6 +138,18 @@ dependencies { implementation 'com.google.android:flexbox:1.1.0' implementation 'com.google.code.gson:gson:2.8.6' + //media + def media2_version = "1.1.2" + implementation "androidx.media2:media2-session:$media2_version" + //implementation "androidx.media2:media2-player:$media2_version" + //implementation 'com.google.android.exoplayer:exoplayer:2.13.0' + + //Splitties + def splitties_version = '2.1.1' + implementation("com.louiscad.splitties:splitties-appctx:$splitties_version") + implementation("com.louiscad.splitties:splitties-systemservices:$splitties_version") + implementation("com.louiscad.splitties:splitties-views:$splitties_version") + //lifecycle def lifecycle_version = '2.2.0' implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" @@ -150,11 +164,6 @@ dependencies { //paging implementation 'androidx.paging:paging-runtime-ktx:2.1.2' - //anko - def anko_version = '0.10.8' - implementation "org.jetbrains.anko:anko-sdk27:$anko_version" - implementation "org.jetbrains.anko:anko-sdk27-listeners:$anko_version" - //liveEventBus implementation 'com.jeremyliao:live-event-bus-x:1.5.7' @@ -185,7 +194,7 @@ dependencies { implementation 'org.nanohttpd:nanohttpd-websocket:2.3.1' //二维码 - implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.3.7' + implementation 'com.king.zxing:zxing-lite:2.0.2' //颜色选择 implementation 'com.jaredrummler:colorpicker:1.1.0' diff --git a/app/google-services.json b/app/google-services.json index e60f39470..fcbc11f0d 100644 --- a/app/google-services.json +++ b/app/google-services.json @@ -108,6 +108,43 @@ ] } } + }, + { + "client_info": { + "mobilesdk_app_id": "1:453392274790:android:b891abd2331577dff624a7", + "android_client_info": { + "package_name": "io.legado.play.debug" + } + }, + "oauth_client": [ + { + "client_id": "453392274790-f8sjn6ohs72rg1dvp0pdvk42nkq54p0k.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.legado.play.debug", + "certificate_hash": "00819ace9891386e535967cbafd6a88f3797bd5b" + } + }, + { + "client_id": "453392274790-hnbpatpce9hbjiggj76hgo7queu86atq.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyD90mfNLhA7cAzzI9SonpSz5mrF5BnmyJA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "453392274790-hnbpatpce9hbjiggj76hgo7queu86atq.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } } ], "configuration_version": "1" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4fe52b196..85914dd9d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -297,7 +297,8 @@ + android:label="@string/receiving_shared_label" + android:theme="@style/AppTheme.Transparent"> @@ -418,6 +419,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/assets/18PlusList.txt b/app/src/main/assets/18PlusList.txt index 52a5bb3cc..3451937dc 100644 --- a/app/src/main/assets/18PlusList.txt +++ b/app/src/main/assets/18PlusList.txt @@ -80,3 +80,205 @@ cm5neHM= OTl3ZW5rdQ== bGFvc2lqaXhz ZnVzaHV6aGFpMQ== +cG8xOA== +czUyMTc= +c2FuaGFveHM= +NTJrc2h1 +NDhyeA== +ZWNub3ZlbA== +bGllaHVvenc= +eGlhb3FpYW5nd3g= +NTJrc2h1 +NDh3eA== +NTJrc2h1 +MDB1aQ== +MDFieg== +c2h1YmFvMQ== +ZG54aWFvc2h1b2E= +am5zaHViYQ== +MThzaHV3dQ== +bGV4cw== +MzM1eHM= +dXB1 +ZnVndW9kdQ== +ODB0eHQ= +YWFyZWFk +eWlkdWR1MQ== +YmFuemh1d2FuZw== +cWloYW9xaWhhbw== +OHhpYW54cw== +amluamlzaHV3dQ== +d21wOA== +ZXl1c2h1d3U= +NTB4c2Y= +aGF4d3g1 +cG93YW5qdWFu +d2luMTBjaXR5 +eWV5ZXhzdw== +bXlzaHVnZQ== +eGlhbmd0eHN3 +Y3Vpd2VpanV4 +MzY2eHN3 +aHVheXVld2Vua3U= +eW91ZGlhbmxlbg== +c291Nzg= +bGFucm91Mg== +cXFib29r +eW91d3V4cw== +cnVpbGlzYWxl +MzY1bXd3 +ZnV3ZW5o +bGVzYmw= +YXd1Ym9vaw== +bGl5dXhpYW5nMjAyMA== +OTJwb3Bv +ZnVzaHV0dWFu +ODhkYW5tZWk= +ZG14cw== +eXVsaW56aGFueWU= +M2hlYmFv +eGd1YWd1YXhz +ZGl5aWJhbnpodTY= +aXJlYWR4cw== +c2h1YmFvOTY= +ZGl5aWJhbnpodTU1NQ== +c2Fuaml1enc= +N3Fpbmc3 +NjZsZXdlbg== +a3l4czU= +MjIyMjJ4cw== +c2hhb3NodWdl +amlsaW41NQ== +bWt4czY= +amluc2h1bG91 +eGlhbndhbmdz +eWlkdWR1 +cWR0eHQ= +MTZib29rMQ== +am1zaHV3dQ== +MzY2eHN3 +ZHliejk= +c2hvdWRhOA== +ZnlxMTg= +eWlzaHVn +eXV6aGFpd3VsYQ== +MTFiYW56aHU= +MTIzeGlhb3FpYW5n +ZGl5aWJhbnpodTk= +ZGl5aWJhbnpodQ== +MzY2eHN3 +ODdzaHV3dQ== +NnF3eA== +emhlbmh1bnhpYW9zaHVv +bG9uZ3Rlbmc1Mg== +eGlueGluZ3hpYW5nemhpZmE= +ZHliejk= +ZHVvemhla2Fu +MTIzeGlhb3FpYW5n +MzM1eHM= +am1zaHV3dQ== +c2hhb3NodWdl +bGF3ZW54cw== +cnVzaHV3dQ== +MzY2eHN3 +NTB4c2Y= +bGV3ZW41NQ== +aGFpdGFuZzEyMw== +aGViYW81MjA= +bHVvcWl1enc= +c3NzeHN3 +c2h1c2h1d3V4cw== +cm5neHM= +cWR4aWFvc2h1bw== +dHl1ZQ== +Y2hlNDM= +bG9uZ3Rlbmcy +amZ5eHNo +aGV0dTI= +bGFvc2lqaXhz +bG9uZ3Rlbmd4cw== +bGllaHVvenc= +c2h1YmFvYW4= +eHNodW9zaHVv +NTIxZGFubWVp +YmFuemh1MjI= +cWtzaHU= +eWZ4aWFvc2h1b2U= +a3lnc28= +c2h1bG91YmE= +NXRucw== +N3Fpbmc3 +bWlhb2R1NQ== +eXVzaHV3ZW4= +YWFyZWFk +cXRzaHU= +MTdzaHV3dQ== +c2h1YmFvMnM= +YnowMDE= +ZGFtb2dl +MTMxdGI= +aXhpYW9z +bXlzaHVnZQ== +OXhpYW53ZW4= +ZHVvemhla2Fu +MTIwdw== +c2h1c2h1d3U1MjA= +c2h1YmFvMnM= +YWd4c3c= +OTR4c3c= +cG8xOA== +eWFvY2hpeHM= +eGlhb3FpYW5neHM= +Ym9va2Js +c2Fuaml1eHM= +d29kZXNodWJhbw== +em9uZ2NhaXhpYW9zaHVvMg== +OWI4OTEzOTRkZjVi +MThub3ZlbA== +YWFib29r +YjF0eHQ= +eXVjYWl6dw== +Yzl0eHQ= +ZGl5aWJhbnpodTU1NQ== +MzBtYw== +eGlueXVzaHV3dQ== +c2h1YmFvd2FuZzEyMw== +YWd4cw== +YmlxdWdlbmw= +c2hpcWlzaHV3dQ== +c2lsdWtl +ZGl5aWJhbnpodTg= +ZGl5aWJhbnpodTk= +aGV0dW54cw== +OTl3ZW5rdQ== +aGFpdGFuZ3NodXd1 +OTd5ZA== +eXV6aGFpd3UxMQ== +Y3Vpd2VpanV4cw== +Y2JpcXU= +NTIxZGFubWVp +c2h1YmFvMzM= +c2FuaGFvMQ== +dGlhbm1lbmd3ZW5rdQ== +eXVzaHV3dTUyMA== +c2h1YmFvMjIy +c2h1YmFvd2FuZzEyMw== +eXVib29r +Y2JpcXU= +MWxld2Vu +MTV4c3c= +eG5jd3h3 +c2h1YmFvd2FuZzEyMw== +c2FuaGFveHM= +eXV3YW5nc2hl +YmlxdXRz +bGFtZWl4cw== +eGJhbnpodQ== +cWR4aWFvc2h1bw== +bWh0bGE= +OTl3ZW5rdQ== +eGlhb3FpYW5nNTIw +dGlhbm1lbmd3ZW5rdQ== +YWlmdXNodQ== +bWlhb2R1NQ== +bWlmZW5neHM= diff --git a/app/src/main/assets/defaultData/rssSources.json b/app/src/main/assets/defaultData/rssSources.json index b4b2a70e0..bc1754b59 100644 --- a/app/src/main/assets/defaultData/rssSources.json +++ b/app/src/main/assets/defaultData/rssSources.json @@ -17,5 +17,14 @@ "sourceName": "阅读下载", "sourceUrl": "https:\/\/github.com\/gedoor\/legado\/releases", "style": "" + }, + { + "customOrder": 1, + "enableJs": true, + "enabled": true, + "singleUrl": true, + "sourceIcon": "http:\/\/mmbiz.qpic.cn\/mmbiz_png\/hpfMV8hEuL2eS6vnCxvTzoOiaCAibV6exBzJWq9xMic9xDg3YXAick87tsfafic0icRwkQ5ibV0bJ84JtSuxhPuEDVquA\/0?wx_fmt=png", + "sourceName": "小说拾遗", + "sourceUrl": "snssdk1128:\/\/user\/profile\/562564899806367" } ] \ No newline at end of file diff --git a/app/src/main/assets/help/appHelp.md b/app/src/main/assets/help/appHelp.md index ae3261409..9b44508c5 100644 --- a/app/src/main/assets/help/appHelp.md +++ b/app/src/main/assets/help/appHelp.md @@ -13,6 +13,9 @@ 3. “勐”、“收十”、“猫腻”、“发动机”、“沃尔沃”等词无法替换净化,如何解决? * 请在 界面 - 简/繁 中关闭简繁互转功能. +4. 漫画源看书显示乱码,如何解决? +* 异次元和阅读是两个不同的软件,**两个软件的源并不通用**,请导入阅读的支持的漫画源! + ## 书源相关 1. 如何导入本地书源文件? @@ -121,6 +124,16 @@ 11. 看书时如遇到“目录为空”、“加载失败”和长串英文等情况怎么办? * 在线书籍一般是书源问题,切换或更新书源即可。本地书籍请尝试手动更换目录规则。 +12. 为什么每一章的最后一页,阅读的文字和横线背景总是对不齐? +* 请在 设置-文字底部对齐 选项中关闭底部对齐,再调整排版。 + +13. 漫画源或图片章节只能看到第一页,如何解决? +* 请先查看原网页是否正常,若正常,请在书籍阅读界面点击右上角的 **⁝** 按钮,在弹出的菜单中,选择 **翻页动画(本书)**,将翻页动画更改为 **滚动**。 + +14. 阅读图片章节、漫画或epub插图时,图片被缩放到一页中,以至无法看清,如何处理? +* 临时处理方案:长按图片可以进行双指缩放。图片章节请先参考Q13中的方案将翻页动画更改为**滚动**,再点击书籍界面的章节标题进入 编辑书源 界面,在 正文-图片样式 中填入 *full*,保存更改,刷新当前章节即可。 + + ## 替换净化相关 1. 替换净化是什么? * 替换净化可以去除书籍内容里的广告、错别字、屏蔽词等。 diff --git a/app/src/main/assets/help/replaceRuleHelp.md b/app/src/main/assets/help/replaceRuleHelp.md new file mode 100644 index 000000000..063c8d3a3 --- /dev/null +++ b/app/src/main/assets/help/replaceRuleHelp.md @@ -0,0 +1,6 @@ +# 替换管理界面帮助 + +* 替换规则是用来替换正文内容的一种规则 + * 菜单可以新建和导入规则 + * 可以拖动排序 + * 可以选择操作 \ No newline at end of file diff --git a/app/src/main/assets/help/ruleHelp.md b/app/src/main/assets/help/ruleHelp.md index 23072a407..4d50dde6c 100644 --- a/app/src/main/assets/help/ruleHelp.md +++ b/app/src/main/assets/help/ruleHelp.md @@ -45,7 +45,7 @@ src 内容,源码 上述js变量与函数中,一些js的对象属性用的频率较高,在此列举。方便写源的时候快速翻阅。 ### book对象的可用属性 -> 使用方法: 在js中或{{}}中使用book.属性的方式即可获取.如在正文内容后加上 ##{{book.name+"正文卷"+title}} 可以净化 书名+正文卷+章节名称(如 我是大明星正问卷第二章我爸是豪门总裁) 这一类的字符. +> 使用方法: 在js中或{{}}中使用book.属性的方式即可获取.如在正文内容后加上 ##{{book.name+"正文卷"+title}} 可以净化 书名+正文卷+章节名称(如 我是大明星正文卷第二章我爸是豪门总裁) 这一类的字符. ``` bookUrl // 详情页Url(本地书源存储完整文件路径) tocUrl // 目录页Url (toc=table of Contents) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 9447fa317..b83d0ac2d 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,8 +3,57 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 +**2021/03/08** +* 阅读页面停留10分钟之后自动备份进度 +* 添加了针对中文的断行排版处理-by hoodie13, 需要再阅读界面设置里手动开启 +* 添加朗读快捷方式 +* 优化Epub解析 by hoodie13 +* epub书籍增加cache by hoodie13 +* 修复切换书籍或者章节时的断言崩溃问题。看漫画容易复现。 by hoodie13 +* 修正增加书签alert的正文内容较多时,确定键溢出屏幕问题 by hoodie13 +* 图片样式添加TEXT, 阅读界面菜单里可以选择图片样式 + +**2021/02/26** +* 添加反转内容功能 +* 更新章节时若无目录url将自动加载详情页 +* 添加变量nextChapterUrl +* 订阅跳转外部应用时提示 +* 修复恢复bug +* 详情页拼接url改为重定向后的地址 +* 不重复解析详情页 + +**2021/02/21** +* 下一页规则改为在内容规则之后执行 +* 书籍导出增加编码设置和导出文件夹设置,使用替换设置 +* 导入源添加等待框 +* 修复一些崩溃bug + +**2021/02/16** +* 修复分享内容不对的bug +* 优化主题颜色,添加透明度 +* rss分类url支持js +* 打开阅读时同步阅读进度 + +**2021/02/09** +* 修复分组内书籍数目少于搜索线程数目,会导致搜索线程数目变低 +* 修复保存书源时不更新书源时间的bug +* 订阅添加夜间模式,需启用js,还不是很完善 +* 优化源导入界面 + +**2021/02/03** +* 排版导出文件名修改为配置名称 +* 取消在线朗读下载文件检测,会导致朗读中断 +* 修复其它一些bug + +**2021/01/30** +* 优化阅读记录界面 +* 自定义分组可以隐藏,删除按钮移到编辑对话框 +* 修复其它一些bug + **2021/01/23** * 优化书源校验,从搜索到正文全部校验 +* play版可以设置背景图片 +* 添加几个js方法,见io.legado.app.help.JsExtensions **2021/01/20** * 更新在线朗读 @@ -262,27 +311,4 @@ getTxtInFolder(unzipPath: String): String **2020/09/10** * 修复自动换源的bug * 修复保存主题的bug -* 书源排序,分享,注释优化 by [h11128](https://github.com/h11128) - -**2020/09/09** -* 修复主题导入导出bug -* 优化分屏模式状态栏 -* 书源基本属性增加“书源注释” -* 页眉页脚跟随背景 -* 主题导入导出 -* 订阅源和替换规则添加滑动选择 -* 修复排版配置导入导出 -* 订阅界面添加下载文件功能 -* 优化翻页 -* EInk模式独立背景 -* 阅读排版配置导入导出,包括背景和字体,支持网络导入 -* 修复替换中的回车消失的bug -* 所有内容恢复htmlFormat, 在想其它办法解决丢失一些内容的问题 -* 图片(漫画)支持导出 -* 搜索url支持put,get,js里使用java.put,java.get -* 正文合并后替换规则支持所有规则写法,包括js -* 导入书源列表添加全不选 -* 详情页菜单添加清理缓存,清理当前书籍缓存 -* 修复滑动选择,选择数量不更新的bug -* 字体跟随背景,每个背景对应一个字体 -* 优化图片下载 \ No newline at end of file +* 书源排序,分享,注释优化 by [h11128](https://github.com/h11128) \ No newline at end of file diff --git a/app/src/main/assets/web/index.html b/app/src/main/assets/web/index.html index 45edf04e6..ecb09e654 100644 --- a/app/src/main/assets/web/index.html +++ b/app/src/main/assets/web/index.html @@ -290,10 +290,10 @@ -
+
更新时间:
+ placeholder="毫秒级时间戳 (自动生成) | 请勿手动填写">
@@ -386,4 +386,4 @@ - \ No newline at end of file + diff --git a/app/src/main/assets/web/index.js b/app/src/main/assets/web/index.js index ba67e7801..86f19a138 100644 --- a/app/src/main/assets/web/index.js +++ b/app/src/main/assets/web/index.js @@ -36,27 +36,22 @@ function Container() { // 搜索规则 $$('.rules .ruleSearch').forEach(item => searchJson[item.title] = ''); - //ruleJson.ruleSearch = JSON.stringify(searchJson); ruleJson.ruleSearch = searchJson; // 发现规则 $$('.rules .ruleExplore').forEach(item => exploreJson[item.title] = ''); - //ruleJson.ruleExplore = JSON.stringify(exploreJson); ruleJson.ruleExplore = exploreJson; // 详情页规则 $$('.rules .ruleBookInfo').forEach(item => bookInfoJson[item.title] = ''); - //ruleJson.ruleBookInfo = JSON.stringify(bookInfoJson); ruleJson.ruleBookInfo = bookInfoJson; // 目录规则 $$('.rules .ruleToc').forEach(item => tocJson[item.title] = ''); - //ruleJson.ruleToc = JSON.stringify(tocJson); ruleJson.ruleToc = tocJson; // 正文规则 $$('.rules .ruleContent').forEach(item => contentJson[item.title] = ''); - //ruleJson.ruleContent = JSON.stringify(contentJson); ruleJson.ruleContent = contentJson; return ruleJson; @@ -116,55 +111,45 @@ function rule2json() { // 转换搜索规则 let searchJson = {}; - //Object.keys(JSON.parse(RuleJSON.ruleSearch)).forEach(key => { Object.keys(RuleJSON.ruleSearch).forEach(key => { if ($('#' + 'ruleSearch_' + key).value) searchJson[key] = $('#' + 'ruleSearch_' + key).value; }); - //RuleJSON.ruleSearch = JSON.stringify(searchJson); RuleJSON.ruleSearch = searchJson; // 转换发现规则 let exploreJson = {}; - //Object.keys(JSON.parse(RuleJSON.ruleExplore)).forEach(key => { Object.keys(RuleJSON.ruleExplore).forEach(key => { if ($('#' + 'ruleExplore_' + key).value) exploreJson[key] = $('#' + 'ruleExplore_' + key).value; }); - //RuleJSON.ruleExplore = JSON.stringify(exploreJson); RuleJSON.ruleExplore = exploreJson; // 转换详情页规则 let bookInfoJson = {}; - //Object.keys(JSON.parse(RuleJSON.ruleBookInfo)).forEach(key => { Object.keys(RuleJSON.ruleBookInfo).forEach(key => { if ($('#' + 'ruleBookInfo_' + key).value) bookInfoJson[key] = $('#' + 'ruleBookInfo_' + key).value; }); - //RuleJSON.ruleBookInfo = JSON.stringify(bookInfoJson); RuleJSON.ruleBookInfo = bookInfoJson; // 转换目录规则 let tocJson = {}; - //Object.keys(JSON.parse(RuleJSON.ruleToc)).forEach(key => { Object.keys(RuleJSON.ruleToc).forEach(key => { if ($('#' + 'ruleToc_' + key).value) tocJson[key] = $('#' + 'ruleToc_' + key).value; }); - //RuleJSON.ruleToc = JSON.stringify(tocJson); RuleJSON.ruleToc = tocJson; // 转换正文规则 let contentJson = {}; - //Object.keys(JSON.parse(RuleJSON.ruleContent)).forEach(key => { Object.keys(RuleJSON.ruleContent).forEach(key => { if ($('#' + 'ruleContent_' + key).value) contentJson[key] = $('#' + 'ruleContent_' + key).value; }); - //RuleJSON.ruleContent = JSON.stringify(contentJson); RuleJSON.ruleContent = contentJson; - RuleJSON.lastUpdateTime = RuleJSON.lastUpdateTime == '' ? 0 : parseInt(RuleJSON.lastUpdateTime); + RuleJSON.lastUpdateTime = new Date().getTime(); RuleJSON.customOrder = RuleJSON.customOrder == '' ? 0 : parseInt(RuleJSON.customOrder); RuleJSON.weight = RuleJSON.weight == '' ? 0 : parseInt(RuleJSON.weight); RuleJSON.bookSourceType == RuleJSON.bookSourceType == '' ? 0 : parseInt(RuleJSON.weight); @@ -193,9 +178,7 @@ function json2rule(RuleEditor) { // 转换搜索规则 if (RuleEditor.ruleSearch) { - //let searchJson = JSON.parse(RuleEditor.ruleSearch); let searchJson = RuleEditor.ruleSearch; - //Object.keys(JSON.parse(RuleJSON.ruleSearch)).forEach(key => { Object.keys(RuleJSON.ruleSearch).forEach(key => { $('#' + 'ruleSearch_' + key).value = searchJson[key] ? searchJson[key] : ''; }); @@ -203,8 +186,6 @@ function json2rule(RuleEditor) { // 转换发现规则 if (RuleEditor.ruleExplore) { - //let exploreJson = JSON.parse(RuleEditor.ruleExplore); - //Object.keys(JSON.parse(RuleJSON.ruleExplore)).forEach(key => { let exploreJson = RuleEditor.ruleExplore; Object.keys(RuleJSON.ruleExplore).forEach(key => { $('#' + 'ruleExplore_' + key).value = exploreJson[key] ? exploreJson[key] : ''; @@ -213,8 +194,6 @@ function json2rule(RuleEditor) { // 转换详情页规则 if (RuleEditor.ruleBookInfo) { - //let bookInfoJson = JSON.parse(RuleEditor.ruleBookInfo); - //Object.keys(JSON.parse(RuleJSON.ruleBookInfo)).forEach(key => { let bookInfoJson = RuleEditor.ruleBookInfo; Object.keys(RuleJSON.ruleBookInfo).forEach(key => { $('#' + 'ruleBookInfo_' + key).value = bookInfoJson[key] ? bookInfoJson[key] : ''; @@ -223,8 +202,6 @@ function json2rule(RuleEditor) { // 转换目录规则 if (RuleEditor.ruleToc) { - //let tocJson = JSON.parse(RuleEditor.ruleToc); - //Object.keys(JSON.parse(RuleJSON.ruleToc)).forEach(key => { let tocJson = RuleEditor.ruleToc; Object.keys(RuleJSON.ruleToc).forEach(key => { $('#' + 'ruleToc_' + key).value = tocJson[key] ? tocJson[key] : ''; @@ -233,8 +210,6 @@ function json2rule(RuleEditor) { // 转换正文规则 if (RuleEditor.ruleContent) { - //let contentJson = JSON.parse(RuleEditor.ruleContent); - //Object.keys(JSON.parse(RuleJSON.ruleContent)).forEach(key => { let contentJson = RuleEditor.ruleContent; Object.keys(RuleJSON.ruleContent).forEach(key => { $('#' + 'ruleContent_' + key).value = contentJson[key] ? contentJson[key] : ''; @@ -538,4 +513,4 @@ $('.tab3>.titlebar').addEventListener('click', e => { break; default: } -}); \ No newline at end of file +}); diff --git a/app/src/main/assets/web/new/index.html b/app/src/main/assets/web/new/index.html index 9eae61cc3..c933e0607 100755 --- a/app/src/main/assets/web/new/index.html +++ b/app/src/main/assets/web/new/index.html @@ -1,3 +1,3 @@ -Legado Bookshelf
\ No newline at end of file + }
\ No newline at end of file diff --git a/app/src/main/assets/web/new/js/about.d8b0dc91.js b/app/src/main/assets/web/new/js/about.4300b5ad.js similarity index 100% rename from app/src/main/assets/web/new/js/about.d8b0dc91.js rename to app/src/main/assets/web/new/js/about.4300b5ad.js diff --git a/app/src/main/assets/web/new/js/about~detail.1caf6ef5.js b/app/src/main/assets/web/new/js/about~detail.1caf6ef5.js deleted file mode 100755 index 174656bbe..000000000 --- a/app/src/main/assets/web/new/js/about~detail.1caf6ef5.js +++ /dev/null @@ -1 +0,0 @@ -(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["about~detail"],{"0a06":function(e,t,r){"use strict";var n=r("c532"),o=r("30b5"),i=r("f6b4"),s=r("5270"),a=r("4a7b");function u(e){this.defaults=e,this.interceptors={request:new i,response:new i}}u.prototype.request=function(e){"string"===typeof e?(e=arguments[1]||{},e.url=arguments[0]):e=e||{},e=a(this.defaults,e),e.method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var t=[s,void 0],r=Promise.resolve(e);this.interceptors.request.forEach((function(e){t.unshift(e.fulfilled,e.rejected)})),this.interceptors.response.forEach((function(e){t.push(e.fulfilled,e.rejected)}));while(t.length)r=r.then(t.shift(),t.shift());return r},u.prototype.getUri=function(e){return e=a(this.defaults,e),o(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},n.forEach(["delete","get","head","options"],(function(e){u.prototype[e]=function(t,r){return this.request(n.merge(r||{},{method:e,url:t}))}})),n.forEach(["post","put","patch"],(function(e){u.prototype[e]=function(t,r,o){return this.request(n.merge(o||{},{method:e,url:t,data:r}))}})),e.exports=u},"0df6":function(e,t,r){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},"1d2b":function(e,t,r){"use strict";e.exports=function(e,t){return function(){for(var r=new Array(arguments.length),n=0;n=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};n.forEach(["delete","get","head"],(function(e){u.headers[e]={}})),n.forEach(["post","put","patch"],(function(e){u.headers[e]=n.merge(i)})),e.exports=u}).call(this,r("4362"))},"2d83":function(e,t,r){"use strict";var n=r("387f");e.exports=function(e,t,r,o,i){var s=new Error(e);return n(s,t,r,o,i)}},"2e67":function(e,t,r){"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},"30b5":function(e,t,r){"use strict";var n=r("c532");function o(e){return encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,r){if(!t)return e;var i;if(r)i=r(t);else if(n.isURLSearchParams(t))i=t.toString();else{var s=[];n.forEach(t,(function(e,t){null!==e&&"undefined"!==typeof e&&(n.isArray(e)?t+="[]":e=[e],n.forEach(e,(function(e){n.isDate(e)?e=e.toISOString():n.isObject(e)&&(e=JSON.stringify(e)),s.push(o(t)+"="+o(e))})))})),i=s.join("&")}if(i){var a=e.indexOf("#");-1!==a&&(e=e.slice(0,a)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e}},"387f":function(e,t,r){"use strict";e.exports=function(e,t,r,n,o){return e.config=t,r&&(e.code=r),e.request=n,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},3934:function(e,t,r){"use strict";var n=r("c532");e.exports=n.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),r=document.createElement("a");function o(e){var n=e;return t&&(r.setAttribute("href",n),n=r.href),r.setAttribute("href",n),{href:r.href,protocol:r.protocol?r.protocol.replace(/:$/,""):"",host:r.host,search:r.search?r.search.replace(/^\?/,""):"",hash:r.hash?r.hash.replace(/^#/,""):"",hostname:r.hostname,port:r.port,pathname:"/"===r.pathname.charAt(0)?r.pathname:"/"+r.pathname}}return e=o(window.location.href),function(t){var r=n.isString(t)?o(t):t;return r.protocol===e.protocol&&r.host===e.host}}():function(){return function(){return!0}}()},4362:function(e,t,r){t.nextTick=function(e){var t=Array.prototype.slice.call(arguments);t.shift(),setTimeout((function(){e.apply(null,t)}),0)},t.platform=t.arch=t.execPath=t.title="browser",t.pid=1,t.browser=!0,t.env={},t.argv=[],t.binding=function(e){throw new Error("No such module. (Possibly not yet loaded)")},function(){var e,n="/";t.cwd=function(){return n},t.chdir=function(t){e||(e=r("df7c")),n=e.resolve(t,n)}}(),t.exit=t.kill=t.umask=t.dlopen=t.uptime=t.memoryUsage=t.uvCounters=function(){},t.features={}},"467f":function(e,t,r){"use strict";var n=r("2d83");e.exports=function(e,t,r){var o=r.config.validateStatus;!o||o(r.status)?e(r):t(n("Request failed with status code "+r.status,r.config,null,r.request,r))}},"4a7b":function(e,t,r){"use strict";var n=r("c532");e.exports=function(e,t){t=t||{};var r={},o=["url","method","params","data"],i=["headers","auth","proxy"],s=["baseURL","url","transformRequest","transformResponse","paramsSerializer","timeout","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","maxContentLength","validateStatus","maxRedirects","httpAgent","httpsAgent","cancelToken","socketPath"];n.forEach(o,(function(e){"undefined"!==typeof t[e]&&(r[e]=t[e])})),n.forEach(i,(function(o){n.isObject(t[o])?r[o]=n.deepMerge(e[o],t[o]):"undefined"!==typeof t[o]?r[o]=t[o]:n.isObject(e[o])?r[o]=n.deepMerge(e[o]):"undefined"!==typeof e[o]&&(r[o]=e[o])})),n.forEach(s,(function(n){"undefined"!==typeof t[n]?r[n]=t[n]:"undefined"!==typeof e[n]&&(r[n]=e[n])}));var a=o.concat(i).concat(s),u=Object.keys(t).filter((function(e){return-1===a.indexOf(e)}));return n.forEach(u,(function(n){"undefined"!==typeof t[n]?r[n]=t[n]:"undefined"!==typeof e[n]&&(r[n]=e[n])})),r}},5270:function(e,t,r){"use strict";var n=r("c532"),o=r("c401"),i=r("2e67"),s=r("2444");function a(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(e){a(e),e.headers=e.headers||{},e.data=o(e.data,e.headers,e.transformRequest),e.headers=n.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),n.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]}));var t=e.adapter||s.adapter;return t(e).then((function(t){return a(e),t.data=o(t.data,t.headers,e.transformResponse),t}),(function(t){return i(t)||(a(e),t&&t.response&&(t.response.data=o(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},"7a77":function(e,t,r){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},"7aac":function(e,t,r){"use strict";var n=r("c532");e.exports=n.isStandardBrowserEnv()?function(){return{write:function(e,t,r,o,i,s){var a=[];a.push(e+"="+encodeURIComponent(t)),n.isNumber(r)&&a.push("expires="+new Date(r).toGMTString()),n.isString(o)&&a.push("path="+o),n.isString(i)&&a.push("domain="+i),!0===s&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},"83b9":function(e,t,r){"use strict";var n=r("d925"),o=r("e683");e.exports=function(e,t){return e&&!n(t)?o(e,t):t}},"8df4":function(e,t,r){"use strict";var n=r("7a77");function o(e){if("function"!==typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var r=this;e((function(e){r.reason||(r.reason=new n(e),t(r.reason))}))}o.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},o.source=function(){var e,t=new o((function(t){e=t}));return{token:t,cancel:e}},e.exports=o},b50d:function(e,t,r){"use strict";var n=r("c532"),o=r("467f"),i=r("30b5"),s=r("83b9"),a=r("c345"),u=r("3934"),c=r("2d83");e.exports=function(e){return new Promise((function(t,f){var p=e.data,l=e.headers;n.isFormData(p)&&delete l["Content-Type"];var d=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=e.auth.password||"";l.Authorization="Basic "+btoa(h+":"+m)}var g=s(e.baseURL,e.url);if(d.open(e.method.toUpperCase(),i(g,e.params,e.paramsSerializer),!0),d.timeout=e.timeout,d.onreadystatechange=function(){if(d&&4===d.readyState&&(0!==d.status||d.responseURL&&0===d.responseURL.indexOf("file:"))){var r="getAllResponseHeaders"in d?a(d.getAllResponseHeaders()):null,n=e.responseType&&"text"!==e.responseType?d.response:d.responseText,i={data:n,status:d.status,statusText:d.statusText,headers:r,config:e,request:d};o(t,f,i),d=null}},d.onabort=function(){d&&(f(c("Request aborted",e,"ECONNABORTED",d)),d=null)},d.onerror=function(){f(c("Network Error",e,null,d)),d=null},d.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),f(c(t,e,"ECONNABORTED",d)),d=null},n.isStandardBrowserEnv()){var y=r("7aac"),v=(e.withCredentials||u(g))&&e.xsrfCookieName?y.read(e.xsrfCookieName):void 0;v&&(l[e.xsrfHeaderName]=v)}if("setRequestHeader"in d&&n.forEach(l,(function(e,t){"undefined"===typeof p&&"content-type"===t.toLowerCase()?delete l[t]:d.setRequestHeader(t,e)})),n.isUndefined(e.withCredentials)||(d.withCredentials=!!e.withCredentials),e.responseType)try{d.responseType=e.responseType}catch(b){if("json"!==e.responseType)throw b}"function"===typeof e.onDownloadProgress&&d.addEventListener("progress",e.onDownloadProgress),"function"===typeof e.onUploadProgress&&d.upload&&d.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then((function(e){d&&(d.abort(),f(e),d=null)})),void 0===p&&(p=null),d.send(p)}))}},bc3a:function(e,t,r){e.exports=r("cee4")},c345:function(e,t,r){"use strict";var n=r("c532"),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,r,i,s={};return e?(n.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=n.trim(e.substr(0,i)).toLowerCase(),r=n.trim(e.substr(i+1)),t){if(s[t]&&o.indexOf(t)>=0)return;s[t]="set-cookie"===t?(s[t]?s[t]:[]).concat([r]):s[t]?s[t]+", "+r:r}})),s):s}},c401:function(e,t,r){"use strict";var n=r("c532");e.exports=function(e,t,r){return n.forEach(r,(function(r){e=r(e,t)})),e}},c532:function(e,t,r){"use strict";var n=r("1d2b"),o=Object.prototype.toString;function i(e){return"[object Array]"===o.call(e)}function s(e){return"undefined"===typeof e}function a(e){return null!==e&&!s(e)&&null!==e.constructor&&!s(e.constructor)&&"function"===typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function u(e){return"[object ArrayBuffer]"===o.call(e)}function c(e){return"undefined"!==typeof FormData&&e instanceof FormData}function f(e){var t;return t="undefined"!==typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer,t}function p(e){return"string"===typeof e}function l(e){return"number"===typeof e}function d(e){return null!==e&&"object"===typeof e}function h(e){return"[object Date]"===o.call(e)}function m(e){return"[object File]"===o.call(e)}function g(e){return"[object Blob]"===o.call(e)}function y(e){return"[object Function]"===o.call(e)}function v(e){return d(e)&&y(e.pipe)}function b(e){return"undefined"!==typeof URLSearchParams&&e instanceof URLSearchParams}function w(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function x(){return("undefined"===typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!==typeof window&&"undefined"!==typeof document)}function E(e,t){if(null!==e&&"undefined"!==typeof e)if("object"!==typeof e&&(e=[e]),i(e))for(var r=0,n=e.length;r=0;n--){var o=e[n];"."===o?e.splice(n,1):".."===o?(e.splice(n,1),r++):r&&(e.splice(n,1),r--)}if(t)for(;r--;r)e.unshift("..");return e}function n(e){"string"!==typeof e&&(e+="");var t,r=0,n=-1,o=!0;for(t=e.length-1;t>=0;--t)if(47===e.charCodeAt(t)){if(!o){r=t+1;break}}else-1===n&&(o=!1,n=t+1);return-1===n?"":e.slice(r,n)}function o(e,t){if(e.filter)return e.filter(t);for(var r=[],n=0;n=-1&&!n;i--){var s=i>=0?arguments[i]:e.cwd();if("string"!==typeof s)throw new TypeError("Arguments to path.resolve must be strings");s&&(t=s+"/"+t,n="/"===s.charAt(0))}return t=r(o(t.split("/"),(function(e){return!!e})),!n).join("/"),(n?"/":"")+t||"."},t.normalize=function(e){var n=t.isAbsolute(e),s="/"===i(e,-1);return e=r(o(e.split("/"),(function(e){return!!e})),!n).join("/"),e||n||(e="."),e&&s&&(e+="/"),(n?"/":"")+e},t.isAbsolute=function(e){return"/"===e.charAt(0)},t.join=function(){var e=Array.prototype.slice.call(arguments,0);return t.normalize(o(e,(function(e,t){if("string"!==typeof e)throw new TypeError("Arguments to path.join must be strings");return e})).join("/"))},t.relative=function(e,r){function n(e){for(var t=0;t=0;r--)if(""!==e[r])break;return t>r?[]:e.slice(t,r-t+1)}e=t.resolve(e).substr(1),r=t.resolve(r).substr(1);for(var o=n(e.split("/")),i=n(r.split("/")),s=Math.min(o.length,i.length),a=s,u=0;u=1;--i)if(t=e.charCodeAt(i),47===t){if(!o){n=i;break}}else o=!1;return-1===n?r?"/":".":r&&1===n?"/":e.slice(0,n)},t.basename=function(e,t){var r=n(e);return t&&r.substr(-1*t.length)===t&&(r=r.substr(0,r.length-t.length)),r},t.extname=function(e){"string"!==typeof e&&(e+="");for(var t=-1,r=0,n=-1,o=!0,i=0,s=e.length-1;s>=0;--s){var a=e.charCodeAt(s);if(47!==a)-1===n&&(o=!1,n=s+1),46===a?-1===t?t=s:1!==i&&(i=1):-1!==t&&(i=-1);else if(!o){r=s+1;break}}return-1===t||-1===n||0===i||1===i&&t===n-1&&t===r+1?"":e.slice(t,n)};var i="b"==="ab".substr(-1)?function(e,t,r){return e.substr(t,r)}:function(e,t,r){return t<0&&(t=e.length+t),e.substr(t,r)}}).call(this,r("4362"))},e683:function(e,t,r){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},f6b4:function(e,t,r){"use strict";var n=r("c532");function o(){this.handlers=[]}o.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},o.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},o.prototype.forEach=function(e){n.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=o}}]); \ No newline at end of file diff --git a/app/src/main/assets/web/new/js/about~detail.c1b29cbc.js b/app/src/main/assets/web/new/js/about~detail.c1b29cbc.js new file mode 100644 index 000000000..1de390135 --- /dev/null +++ b/app/src/main/assets/web/new/js/about~detail.c1b29cbc.js @@ -0,0 +1 @@ +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["about~detail"],{"0a06":function(e,t,r){"use strict";var n=r("c532"),o=r("30b5"),i=r("f6b4"),s=r("5270"),a=r("4a7b");function u(e){this.defaults=e,this.interceptors={request:new i,response:new i}}u.prototype.request=function(e){"string"===typeof e?(e=arguments[1]||{},e.url=arguments[0]):e=e||{},e=a(this.defaults,e),e.method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var t=[s,void 0],r=Promise.resolve(e);this.interceptors.request.forEach((function(e){t.unshift(e.fulfilled,e.rejected)})),this.interceptors.response.forEach((function(e){t.push(e.fulfilled,e.rejected)}));while(t.length)r=r.then(t.shift(),t.shift());return r},u.prototype.getUri=function(e){return e=a(this.defaults,e),o(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},n.forEach(["delete","get","head","options"],(function(e){u.prototype[e]=function(t,r){return this.request(a(r||{},{method:e,url:t,data:(r||{}).data}))}})),n.forEach(["post","put","patch"],(function(e){u.prototype[e]=function(t,r,n){return this.request(a(n||{},{method:e,url:t,data:r}))}})),e.exports=u},"0df6":function(e,t,r){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},"1d2b":function(e,t,r){"use strict";e.exports=function(e,t){return function(){for(var r=new Array(arguments.length),n=0;n=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};n.forEach(["delete","get","head"],(function(e){u.headers[e]={}})),n.forEach(["post","put","patch"],(function(e){u.headers[e]=n.merge(i)})),e.exports=u}).call(this,r("4362"))},"2d83":function(e,t,r){"use strict";var n=r("387f");e.exports=function(e,t,r,o,i){var s=new Error(e);return n(s,t,r,o,i)}},"2e67":function(e,t,r){"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},"30b5":function(e,t,r){"use strict";var n=r("c532");function o(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,r){if(!t)return e;var i;if(r)i=r(t);else if(n.isURLSearchParams(t))i=t.toString();else{var s=[];n.forEach(t,(function(e,t){null!==e&&"undefined"!==typeof e&&(n.isArray(e)?t+="[]":e=[e],n.forEach(e,(function(e){n.isDate(e)?e=e.toISOString():n.isObject(e)&&(e=JSON.stringify(e)),s.push(o(t)+"="+o(e))})))})),i=s.join("&")}if(i){var a=e.indexOf("#");-1!==a&&(e=e.slice(0,a)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e}},"387f":function(e,t,r){"use strict";e.exports=function(e,t,r,n,o){return e.config=t,r&&(e.code=r),e.request=n,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},3934:function(e,t,r){"use strict";var n=r("c532");e.exports=n.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),r=document.createElement("a");function o(e){var n=e;return t&&(r.setAttribute("href",n),n=r.href),r.setAttribute("href",n),{href:r.href,protocol:r.protocol?r.protocol.replace(/:$/,""):"",host:r.host,search:r.search?r.search.replace(/^\?/,""):"",hash:r.hash?r.hash.replace(/^#/,""):"",hostname:r.hostname,port:r.port,pathname:"/"===r.pathname.charAt(0)?r.pathname:"/"+r.pathname}}return e=o(window.location.href),function(t){var r=n.isString(t)?o(t):t;return r.protocol===e.protocol&&r.host===e.host}}():function(){return function(){return!0}}()},4362:function(e,t,r){t.nextTick=function(e){var t=Array.prototype.slice.call(arguments);t.shift(),setTimeout((function(){e.apply(null,t)}),0)},t.platform=t.arch=t.execPath=t.title="browser",t.pid=1,t.browser=!0,t.env={},t.argv=[],t.binding=function(e){throw new Error("No such module. (Possibly not yet loaded)")},function(){var e,n="/";t.cwd=function(){return n},t.chdir=function(t){e||(e=r("df7c")),n=e.resolve(t,n)}}(),t.exit=t.kill=t.umask=t.dlopen=t.uptime=t.memoryUsage=t.uvCounters=function(){},t.features={}},"467f":function(e,t,r){"use strict";var n=r("2d83");e.exports=function(e,t,r){var o=r.config.validateStatus;r.status&&o&&!o(r.status)?t(n("Request failed with status code "+r.status,r.config,null,r.request,r)):e(r)}},"4a7b":function(e,t,r){"use strict";var n=r("c532");e.exports=function(e,t){t=t||{};var r={},o=["url","method","data"],i=["headers","auth","proxy","params"],s=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],a=["validateStatus"];function u(e,t){return n.isPlainObject(e)&&n.isPlainObject(t)?n.merge(e,t):n.isPlainObject(t)?n.merge({},t):n.isArray(t)?t.slice():t}function c(o){n.isUndefined(t[o])?n.isUndefined(e[o])||(r[o]=u(void 0,e[o])):r[o]=u(e[o],t[o])}n.forEach(o,(function(e){n.isUndefined(t[e])||(r[e]=u(void 0,t[e]))})),n.forEach(i,c),n.forEach(s,(function(o){n.isUndefined(t[o])?n.isUndefined(e[o])||(r[o]=u(void 0,e[o])):r[o]=u(void 0,t[o])})),n.forEach(a,(function(n){n in t?r[n]=u(e[n],t[n]):n in e&&(r[n]=u(void 0,e[n]))}));var f=o.concat(i).concat(s).concat(a),p=Object.keys(e).concat(Object.keys(t)).filter((function(e){return-1===f.indexOf(e)}));return n.forEach(p,c),r}},5270:function(e,t,r){"use strict";var n=r("c532"),o=r("c401"),i=r("2e67"),s=r("2444");function a(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(e){a(e),e.headers=e.headers||{},e.data=o(e.data,e.headers,e.transformRequest),e.headers=n.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),n.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]}));var t=e.adapter||s.adapter;return t(e).then((function(t){return a(e),t.data=o(t.data,t.headers,e.transformResponse),t}),(function(t){return i(t)||(a(e),t&&t.response&&(t.response.data=o(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},"5f02":function(e,t,r){"use strict";e.exports=function(e){return"object"===typeof e&&!0===e.isAxiosError}},"7a77":function(e,t,r){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},"7aac":function(e,t,r){"use strict";var n=r("c532");e.exports=n.isStandardBrowserEnv()?function(){return{write:function(e,t,r,o,i,s){var a=[];a.push(e+"="+encodeURIComponent(t)),n.isNumber(r)&&a.push("expires="+new Date(r).toGMTString()),n.isString(o)&&a.push("path="+o),n.isString(i)&&a.push("domain="+i),!0===s&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},"83b9":function(e,t,r){"use strict";var n=r("d925"),o=r("e683");e.exports=function(e,t){return e&&!n(t)?o(e,t):t}},"8df4":function(e,t,r){"use strict";var n=r("7a77");function o(e){if("function"!==typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var r=this;e((function(e){r.reason||(r.reason=new n(e),t(r.reason))}))}o.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},o.source=function(){var e,t=new o((function(t){e=t}));return{token:t,cancel:e}},e.exports=o},b50d:function(e,t,r){"use strict";var n=r("c532"),o=r("467f"),i=r("7aac"),s=r("30b5"),a=r("83b9"),u=r("c345"),c=r("3934"),f=r("2d83");e.exports=function(e){return new Promise((function(t,r){var p=e.data,l=e.headers;n.isFormData(p)&&delete l["Content-Type"];var d=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";l.Authorization="Basic "+btoa(h+":"+m)}var g=a(e.baseURL,e.url);if(d.open(e.method.toUpperCase(),s(g,e.params,e.paramsSerializer),!0),d.timeout=e.timeout,d.onreadystatechange=function(){if(d&&4===d.readyState&&(0!==d.status||d.responseURL&&0===d.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in d?u(d.getAllResponseHeaders()):null,i=e.responseType&&"text"!==e.responseType?d.response:d.responseText,s={data:i,status:d.status,statusText:d.statusText,headers:n,config:e,request:d};o(t,r,s),d=null}},d.onabort=function(){d&&(r(f("Request aborted",e,"ECONNABORTED",d)),d=null)},d.onerror=function(){r(f("Network Error",e,null,d)),d=null},d.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),r(f(t,e,"ECONNABORTED",d)),d=null},n.isStandardBrowserEnv()){var v=(e.withCredentials||c(g))&&e.xsrfCookieName?i.read(e.xsrfCookieName):void 0;v&&(l[e.xsrfHeaderName]=v)}if("setRequestHeader"in d&&n.forEach(l,(function(e,t){"undefined"===typeof p&&"content-type"===t.toLowerCase()?delete l[t]:d.setRequestHeader(t,e)})),n.isUndefined(e.withCredentials)||(d.withCredentials=!!e.withCredentials),e.responseType)try{d.responseType=e.responseType}catch(y){if("json"!==e.responseType)throw y}"function"===typeof e.onDownloadProgress&&d.addEventListener("progress",e.onDownloadProgress),"function"===typeof e.onUploadProgress&&d.upload&&d.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then((function(e){d&&(d.abort(),r(e),d=null)})),p||(p=null),d.send(p)}))}},bc3a:function(e,t,r){e.exports=r("cee4")},c345:function(e,t,r){"use strict";var n=r("c532"),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,r,i,s={};return e?(n.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=n.trim(e.substr(0,i)).toLowerCase(),r=n.trim(e.substr(i+1)),t){if(s[t]&&o.indexOf(t)>=0)return;s[t]="set-cookie"===t?(s[t]?s[t]:[]).concat([r]):s[t]?s[t]+", "+r:r}})),s):s}},c401:function(e,t,r){"use strict";var n=r("c532");e.exports=function(e,t,r){return n.forEach(r,(function(r){e=r(e,t)})),e}},c532:function(e,t,r){"use strict";var n=r("1d2b"),o=Object.prototype.toString;function i(e){return"[object Array]"===o.call(e)}function s(e){return"undefined"===typeof e}function a(e){return null!==e&&!s(e)&&null!==e.constructor&&!s(e.constructor)&&"function"===typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function u(e){return"[object ArrayBuffer]"===o.call(e)}function c(e){return"undefined"!==typeof FormData&&e instanceof FormData}function f(e){var t;return t="undefined"!==typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer,t}function p(e){return"string"===typeof e}function l(e){return"number"===typeof e}function d(e){return null!==e&&"object"===typeof e}function h(e){if("[object Object]"!==o.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function m(e){return"[object Date]"===o.call(e)}function g(e){return"[object File]"===o.call(e)}function v(e){return"[object Blob]"===o.call(e)}function y(e){return"[object Function]"===o.call(e)}function b(e){return d(e)&&y(e.pipe)}function w(e){return"undefined"!==typeof URLSearchParams&&e instanceof URLSearchParams}function x(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function E(){return("undefined"===typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!==typeof window&&"undefined"!==typeof document)}function A(e,t){if(null!==e&&"undefined"!==typeof e)if("object"!==typeof e&&(e=[e]),i(e))for(var r=0,n=e.length;r=0;n--){var o=e[n];"."===o?e.splice(n,1):".."===o?(e.splice(n,1),r++):r&&(e.splice(n,1),r--)}if(t)for(;r--;r)e.unshift("..");return e}function n(e){"string"!==typeof e&&(e+="");var t,r=0,n=-1,o=!0;for(t=e.length-1;t>=0;--t)if(47===e.charCodeAt(t)){if(!o){r=t+1;break}}else-1===n&&(o=!1,n=t+1);return-1===n?"":e.slice(r,n)}function o(e,t){if(e.filter)return e.filter(t);for(var r=[],n=0;n=-1&&!n;i--){var s=i>=0?arguments[i]:e.cwd();if("string"!==typeof s)throw new TypeError("Arguments to path.resolve must be strings");s&&(t=s+"/"+t,n="/"===s.charAt(0))}return t=r(o(t.split("/"),(function(e){return!!e})),!n).join("/"),(n?"/":"")+t||"."},t.normalize=function(e){var n=t.isAbsolute(e),s="/"===i(e,-1);return e=r(o(e.split("/"),(function(e){return!!e})),!n).join("/"),e||n||(e="."),e&&s&&(e+="/"),(n?"/":"")+e},t.isAbsolute=function(e){return"/"===e.charAt(0)},t.join=function(){var e=Array.prototype.slice.call(arguments,0);return t.normalize(o(e,(function(e,t){if("string"!==typeof e)throw new TypeError("Arguments to path.join must be strings");return e})).join("/"))},t.relative=function(e,r){function n(e){for(var t=0;t=0;r--)if(""!==e[r])break;return t>r?[]:e.slice(t,r-t+1)}e=t.resolve(e).substr(1),r=t.resolve(r).substr(1);for(var o=n(e.split("/")),i=n(r.split("/")),s=Math.min(o.length,i.length),a=s,u=0;u=1;--i)if(t=e.charCodeAt(i),47===t){if(!o){n=i;break}}else o=!1;return-1===n?r?"/":".":r&&1===n?"/":e.slice(0,n)},t.basename=function(e,t){var r=n(e);return t&&r.substr(-1*t.length)===t&&(r=r.substr(0,r.length-t.length)),r},t.extname=function(e){"string"!==typeof e&&(e+="");for(var t=-1,r=0,n=-1,o=!0,i=0,s=e.length-1;s>=0;--s){var a=e.charCodeAt(s);if(47!==a)-1===n&&(o=!1,n=s+1),46===a?-1===t?t=s:1!==i&&(i=1):-1!==t&&(i=-1);else if(!o){r=s+1;break}}return-1===t||-1===n||0===i||1===i&&t===n-1&&t===r+1?"":e.slice(t,n)};var i="b"==="ab".substr(-1)?function(e,t,r){return e.substr(t,r)}:function(e,t,r){return t<0&&(t=e.length+t),e.substr(t,r)}}).call(this,r("4362"))},e683:function(e,t,r){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},f6b4:function(e,t,r){"use strict";var n=r("c532");function o(){this.handlers=[]}o.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},o.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},o.prototype.forEach=function(e){n.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=o}}]); \ No newline at end of file diff --git a/app/src/main/assets/web/new/js/app.acf50eba.js b/app/src/main/assets/web/new/js/app.acf50eba.js new file mode 100644 index 000000000..0d0d7867e --- /dev/null +++ b/app/src/main/assets/web/new/js/app.acf50eba.js @@ -0,0 +1 @@ +(function(e){function t(t){for(var o,r,i=t[0],c=t[1],l=t[2],f=0,d=[];f>>32-t}function o(e,t){var n,o,r,a,u;return r=2147483648&e,a=2147483648&t,n=1073741824&e,o=1073741824&t,u=(1073741823&e)+(1073741823&t),n&o?2147483648^u^r^a:n|o?1073741824&u?3221225472^u^r^a:1073741824^u^r^a:u^r^a}function r(e,t,n){return e&t|~e&n}function a(e,t,n){return e&n|t&~n}function u(e,t,n){return e^t^n}function i(e,t,n){return t^(e|~n)}function c(e,t,a,u,i,c,l){return e=o(e,o(o(r(t,a,u),i),l)),o(n(e,c),t)}function l(e,t,r,u,i,c,l){return e=o(e,o(o(a(t,r,u),i),l)),o(n(e,c),t)}function f(e,t,r,a,i,c,l){return e=o(e,o(o(u(t,r,a),i),l)),o(n(e,c),t)}function d(e,t,r,a,u,c,l){return e=o(e,o(o(i(t,r,a),u),l)),o(n(e,c),t)}function s(e){var t,n=e.length,o=n+8,r=(o-o%64)/64,a=16*(r+1),u=Array(a-1),i=0,c=0;while(c>>29,u}function p(e){var t,n,o="",r="";for(n=0;n<=3;n++)t=e>>>8*n&255,r="0"+t.toString(16),o+=r.substr(r.length-2,2);return o}var b,h,g,m,v,y,w,C,S,P=Array(),O=7,j=12,k=17,T=22,_=5,x=9,E=14,A=20,L=4,$=11,B=16,N=23,V=6,M=10,D=15,q=21;for(P=s(t),y=1732584193,w=4023233417,C=2562383102,S=271733878,b=0;b>>32-t}function o(e,t){var n,o,r,a,u;return r=2147483648&e,a=2147483648&t,n=1073741824&e,o=1073741824&t,u=(1073741823&e)+(1073741823&t),n&o?2147483648^u^r^a:n|o?1073741824&u?3221225472^u^r^a:1073741824^u^r^a:u^r^a}function r(e,t,n){return e&t|~e&n}function a(e,t,n){return e&n|t&~n}function u(e,t,n){return e^t^n}function i(e,t,n){return t^(e|~n)}function c(e,t,a,u,i,c,l){return e=o(e,o(o(r(t,a,u),i),l)),o(n(e,c),t)}function l(e,t,r,u,i,c,l){return e=o(e,o(o(a(t,r,u),i),l)),o(n(e,c),t)}function f(e,t,r,a,i,c,l){return e=o(e,o(o(u(t,r,a),i),l)),o(n(e,c),t)}function d(e,t,r,a,u,c,l){return e=o(e,o(o(i(t,r,a),u),l)),o(n(e,c),t)}function s(e){var t,n=e.length,o=n+8,r=(o-o%64)/64,a=16*(r+1),u=Array(a-1),i=0,c=0;while(c>>29,u}function p(e){var t,n,o="",r="";for(n=0;n<=3;n++)t=e>>>8*n&255,r="0"+t.toString(16),o+=r.substr(r.length-2,2);return o}var b,h,g,m,v,y,w,C,S,P=Array(),O=7,j=12,k=17,T=22,_=5,x=9,E=14,A=20,L=4,$=11,B=16,N=23,V=6,M=10,D=15,q=21;for(P=s(t),y=1732584193,w=4023233417,C=2562383102,S=271733878,b=0;bh;h++)if(m=c?b(r(g=e[h])[0],g[1]):b(e[h]),m&&m instanceof u)return m;return new u(!1)}d=p.call(e)}y=d.next;while(!(g=y.call(d)).done)if(m=l(d,b,g.value,c),"object"==typeof m&&m&&m instanceof u)return m;return new u(!1)};c.stop=function(e){return new u(!0,e)}},"23cb":function(e,t,n){var r=n("a691"),o=Math.max,i=Math.min;e.exports=function(e,t){var n=r(e);return n<0?o(n+t,0):i(n,t)}},"23e7":function(e,t,n){var r=n("da84"),o=n("06cf").f,i=n("9112"),a=n("6eeb"),s=n("ce4e"),l=n("e893"),u=n("94ca");e.exports=function(e,t){var n,c,f,d,p,h,v=e.target,m=e.global,y=e.stat;if(c=m?r:y?r[v]||s(v,{}):(r[v]||{}).prototype,c)for(f in t){if(p=t[f],e.noTargetGet?(h=o(c,f),d=h&&h.value):d=c[f],n=u(m?f:v+(y?".":"#")+f,e.forced),!n&&void 0!==d){if(typeof p===typeof d)continue;l(p,d)}(e.sham||d&&d.sham)&&i(p,"sham",!0),a(c,f,p,e)}}},"241c":function(e,t,n){var r=n("ca84"),o=n("7839"),i=o.concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},"25f0":function(e,t,n){"use strict";var r=n("6eeb"),o=n("825a"),i=n("d039"),a=n("ad6d"),s="toString",l=RegExp.prototype,u=l[s],c=i((function(){return"/a/b"!=u.call({source:"a",flags:"b"})})),f=u.name!=s;(c||f)&&r(RegExp.prototype,s,(function(){var e=o(this),t=String(e.source),n=e.flags,r=String(void 0===n&&e instanceof RegExp&&!("flags"in l)?a.call(e):n);return"/"+t+"/"+r}),{unsafe:!0})},2626:function(e,t,n){"use strict";var r=n("d066"),o=n("9bf2"),i=n("b622"),a=n("83ab"),s=i("species");e.exports=function(e){var t=r(e),n=o.f;a&&t&&!t[s]&&n(t,s,{configurable:!0,get:function(){return this}})}},2877:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,(u.functional?this.parent:this).$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},"299c":function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=131)}({131:function(e,t,n){"use strict";n.r(t);var r=n(5),o=n.n(r),i=n(17),a=n.n(i),s=n(2),l=n(3),u=n(7),c=n.n(u),f={name:"ElTooltip",mixins:[o.a],props:{openDelay:{type:Number,default:0},disabled:Boolean,manual:Boolean,effect:{type:String,default:"dark"},arrowOffset:{type:Number,default:0},popperClass:String,content:String,visibleArrow:{default:!0},transition:{type:String,default:"el-fade-in-linear"},popperOptions:{default:function(){return{boundariesPadding:10,gpuAcceleration:!1}}},enterable:{type:Boolean,default:!0},hideAfter:{type:Number,default:0},tabindex:{type:Number,default:0}},data:function(){return{tooltipId:"el-tooltip-"+Object(l["generateId"])(),timeoutPending:null,focusing:!1}},beforeCreate:function(){var e=this;this.$isServer||(this.popperVM=new c.a({data:{node:""},render:function(e){return this.node}}).$mount(),this.debounceClose=a()(200,(function(){return e.handleClosePopper()})))},render:function(e){var t=this;this.popperVM&&(this.popperVM.node=e("transition",{attrs:{name:this.transition},on:{afterLeave:this.doDestroy}},[e("div",{on:{mouseleave:function(){t.setExpectedState(!1),t.debounceClose()},mouseenter:function(){t.setExpectedState(!0)}},ref:"popper",attrs:{role:"tooltip",id:this.tooltipId,"aria-hidden":this.disabled||!this.showPopper?"true":"false"},directives:[{name:"show",value:!this.disabled&&this.showPopper}],class:["el-tooltip__popper","is-"+this.effect,this.popperClass]},[this.$slots.content||this.content])]));var n=this.getFirstElement();if(!n)return null;var r=n.data=n.data||{};return r.staticClass=this.addTooltipClass(r.staticClass),n},mounted:function(){var e=this;this.referenceElm=this.$el,1===this.$el.nodeType&&(this.$el.setAttribute("aria-describedby",this.tooltipId),this.$el.setAttribute("tabindex",this.tabindex),Object(s["on"])(this.referenceElm,"mouseenter",this.show),Object(s["on"])(this.referenceElm,"mouseleave",this.hide),Object(s["on"])(this.referenceElm,"focus",(function(){if(e.$slots.default&&e.$slots.default.length){var t=e.$slots.default[0].componentInstance;t&&t.focus?t.focus():e.handleFocus()}else e.handleFocus()})),Object(s["on"])(this.referenceElm,"blur",this.handleBlur),Object(s["on"])(this.referenceElm,"click",this.removeFocusing)),this.value&&this.popperVM&&this.popperVM.$nextTick((function(){e.value&&e.updatePopper()}))},watch:{focusing:function(e){e?Object(s["addClass"])(this.referenceElm,"focusing"):Object(s["removeClass"])(this.referenceElm,"focusing")}},methods:{show:function(){this.setExpectedState(!0),this.handleShowPopper()},hide:function(){this.setExpectedState(!1),this.debounceClose()},handleFocus:function(){this.focusing=!0,this.show()},handleBlur:function(){this.focusing=!1,this.hide()},removeFocusing:function(){this.focusing=!1},addTooltipClass:function(e){return e?"el-tooltip "+e.replace("el-tooltip",""):"el-tooltip"},handleShowPopper:function(){var e=this;this.expectedState&&!this.manual&&(clearTimeout(this.timeout),this.timeout=setTimeout((function(){e.showPopper=!0}),this.openDelay),this.hideAfter>0&&(this.timeoutPending=setTimeout((function(){e.showPopper=!1}),this.hideAfter)))},handleClosePopper:function(){this.enterable&&this.expectedState||this.manual||(clearTimeout(this.timeout),this.timeoutPending&&clearTimeout(this.timeoutPending),this.showPopper=!1,this.disabled&&this.doDestroy())},setExpectedState:function(e){!1===e&&clearTimeout(this.timeoutPending),this.expectedState=e},getFirstElement:function(){var e=this.$slots.default;if(!Array.isArray(e))return null;for(var t=null,n=0;n=0&&Math.floor(t)===t&&isFinite(e)}function p(e){return o(e)&&"function"===typeof e.then&&"function"===typeof e.catch}function h(e){return null==e?"":Array.isArray(e)||c(e)&&e.toString===u?JSON.stringify(e,null,2):String(e)}function v(e){var t=parseFloat(e);return isNaN(t)?e:t}function m(e,t){for(var n=Object.create(null),r=e.split(","),o=0;o-1)return e.splice(n,1)}}var b=Object.prototype.hasOwnProperty;function _(e,t){return b.call(e,t)}function x(e){var t=Object.create(null);return function(n){var r=t[n];return r||(t[n]=e(n))}}var w=/-(\w)/g,C=x((function(e){return e.replace(w,(function(e,t){return t?t.toUpperCase():""}))})),S=x((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),O=/\B([A-Z])/g,E=x((function(e){return e.replace(O,"-$1").toLowerCase()}));function k(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n}function $(e,t){return e.bind(t)}var j=Function.prototype.bind?$:k;function A(e,t){t=t||0;var n=e.length-t,r=new Array(n);while(n--)r[n]=e[n+t];return r}function T(e,t){for(var n in t)e[n]=t[n];return e}function M(e){for(var t={},n=0;n0,ne=Q&&Q.indexOf("edge/")>0,re=(Q&&Q.indexOf("android"),Q&&/iphone|ipad|ipod|ios/.test(Q)||"ios"===Z),oe=(Q&&/chrome\/\d+/.test(Q),Q&&/phantomjs/.test(Q),Q&&Q.match(/firefox\/(\d+)/)),ie={}.watch,ae=!1;if(Y)try{var se={};Object.defineProperty(se,"passive",{get:function(){ae=!0}}),window.addEventListener("test-passive",null,se)}catch(Ca){}var le=function(){return void 0===G&&(G=!Y&&!J&&"undefined"!==typeof e&&(e["process"]&&"server"===e["process"].env.VUE_ENV)),G},ue=Y&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ce(e){return"function"===typeof e&&/native code/.test(e.toString())}var fe,de="undefined"!==typeof Symbol&&ce(Symbol)&&"undefined"!==typeof Reflect&&ce(Reflect.ownKeys);fe="undefined"!==typeof Set&&ce(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var pe=P,he=0,ve=function(){this.id=he++,this.subs=[]};ve.prototype.addSub=function(e){this.subs.push(e)},ve.prototype.removeSub=function(e){g(this.subs,e)},ve.prototype.depend=function(){ve.target&&ve.target.addDep(this)},ve.prototype.notify=function(){var e=this.subs.slice();for(var t=0,n=e.length;t-1)if(i&&!_(o,"default"))a=!1;else if(""===a||a===E(e)){var l=et(String,o.type);(l<0||s0&&(a=kt(a,(t||"")+"_"+n),Et(a[0])&&Et(u)&&(c[l]=we(u.text+a[0].text),a.shift()),c.push.apply(c,a)):s(a)?Et(u)?c[l]=we(u.text+a):""!==a&&c.push(we(a)):Et(a)&&Et(u)?c[l]=we(u.text+a.text):(i(e._isVList)&&o(a.tag)&&r(a.key)&&o(t)&&(a.key="__vlist"+t+"_"+n+"__"),c.push(a)));return c}function $t(e){var t=e.$options.provide;t&&(e._provided="function"===typeof t?t.call(e):t)}function jt(e){var t=At(e.$options.inject,e);t&&(je(!1),Object.keys(t).forEach((function(n){Le(e,n,t[n])})),je(!0))}function At(e,t){if(e){for(var n=Object.create(null),r=de?Reflect.ownKeys(e):Object.keys(e),o=0;o0,a=e?!!e.$stable:!i,s=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(a&&r&&r!==n&&s===r.$key&&!i&&!r.$hasNormal)return r;for(var l in o={},e)e[l]&&"$"!==l[0]&&(o[l]=Lt(t,l,e[l]))}else o={};for(var u in t)u in o||(o[u]=Nt(t,u));return e&&Object.isExtensible(e)&&(e._normalized=o),U(o,"$stable",a),U(o,"$key",s),U(o,"$hasNormal",i),o}function Lt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({});return e=e&&"object"===typeof e&&!Array.isArray(e)?[e]:Ot(e),e&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function Nt(e,t){return function(){return e[t]}}function Rt(e,t){var n,r,i,a,s;if(Array.isArray(e)||"string"===typeof e)for(n=new Array(e.length),r=0,i=e.length;r1?A(n):n;for(var r=A(arguments,1),o='event handler for "'+e+'"',i=0,a=n.length;idocument.createEvent("Event").timeStamp&&(Gn=function(){return Xn.now()})}function Yn(){var e,t;for(Kn=Gn(),Vn=!0,zn.sort((function(e,t){return e.id-t.id})),Un=0;UnUn&&zn[n].id>e.id)n--;zn.splice(n+1,0,e)}else zn.push(e);Wn||(Wn=!0,ht(Yn))}}var tr=0,nr=function(e,t,n,r,o){this.vm=e,o&&(e._watcher=this),e._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync,this.before=r.before):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++tr,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new fe,this.newDepIds=new fe,this.expression="","function"===typeof t?this.getter=t:(this.getter=K(t),this.getter||(this.getter=P)),this.value=this.lazy?void 0:this.get()};nr.prototype.get=function(){var e;ye(this);var t=this.vm;try{e=this.getter.call(t,t)}catch(Ca){if(!this.user)throw Ca;tt(Ca,t,'getter for watcher "'+this.expression+'"')}finally{this.deep&&mt(e),ge(),this.cleanupDeps()}return e},nr.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},nr.prototype.cleanupDeps=function(){var e=this.deps.length;while(e--){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},nr.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():er(this)},nr.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||l(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(Ca){tt(Ca,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},nr.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},nr.prototype.depend=function(){var e=this.deps.length;while(e--)this.deps[e].depend()},nr.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||g(this.vm._watchers,this);var e=this.deps.length;while(e--)this.deps[e].removeSub(this);this.active=!1}};var rr={enumerable:!0,configurable:!0,get:P,set:P};function or(e,t,n){rr.get=function(){return this[t][n]},rr.set=function(e){this[t][n]=e},Object.defineProperty(e,n,rr)}function ir(e){e._watchers=[];var t=e.$options;t.props&&ar(e,t.props),t.methods&&hr(e,t.methods),t.data?sr(e):Pe(e._data={},!0),t.computed&&cr(e,t.computed),t.watch&&t.watch!==ie&&vr(e,t.watch)}function ar(e,t){var n=e.$options.propsData||{},r=e._props={},o=e.$options._propKeys=[],i=!e.$parent;i||je(!1);var a=function(i){o.push(i);var a=Ye(i,t,n,e);Le(r,i,a),i in e||or(e,"_props",i)};for(var s in t)a(s);je(!0)}function sr(e){var t=e.$options.data;t=e._data="function"===typeof t?lr(t,e):t||{},c(t)||(t={});var n=Object.keys(t),r=e.$options.props,o=(e.$options.methods,n.length);while(o--){var i=n[o];0,r&&_(r,i)||V(i)||or(e,"_data",i)}Pe(t,!0)}function lr(e,t){ye();try{return e.call(t,t)}catch(Ca){return tt(Ca,t,"data()"),{}}finally{ge()}}var ur={lazy:!0};function cr(e,t){var n=e._computedWatchers=Object.create(null),r=le();for(var o in t){var i=t[o],a="function"===typeof i?i:i.get;0,r||(n[o]=new nr(e,a||P,P,ur)),o in e||fr(e,o,i)}}function fr(e,t,n){var r=!le();"function"===typeof n?(rr.get=r?dr(t):pr(n),rr.set=P):(rr.get=n.get?r&&!1!==n.cache?dr(t):pr(n.get):P,rr.set=n.set||P),Object.defineProperty(e,t,rr)}function dr(e){return function(){var t=this._computedWatchers&&this._computedWatchers[e];if(t)return t.dirty&&t.evaluate(),ve.target&&t.depend(),t.value}}function pr(e){return function(){return e.call(this,this)}}function hr(e,t){e.$options.props;for(var n in t)e[n]="function"!==typeof t[n]?P:j(t[n],e)}function vr(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var o=0;o-1)return this;var n=A(arguments,1);return n.unshift(this),"function"===typeof e.install?e.install.apply(e,n):"function"===typeof e&&e.apply(null,n),t.push(e),this}}function Or(e){e.mixin=function(e){return this.options=Ge(this.options,e),this}}function Er(e){e.cid=0;var t=1;e.extend=function(e){e=e||{};var n=this,r=n.cid,o=e._Ctor||(e._Ctor={});if(o[r])return o[r];var i=e.name||n.options.name;var a=function(e){this._init(e)};return a.prototype=Object.create(n.prototype),a.prototype.constructor=a,a.cid=t++,a.options=Ge(n.options,e),a["super"]=n,a.options.props&&kr(a),a.options.computed&&$r(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,z.forEach((function(e){a[e]=n[e]})),i&&(a.options.components[i]=a),a.superOptions=n.options,a.extendOptions=e,a.sealedOptions=T({},a.options),o[r]=a,a}}function kr(e){var t=e.options.props;for(var n in t)or(e.prototype,"_props",n)}function $r(e){var t=e.options.computed;for(var n in t)fr(e.prototype,n,t[n])}function jr(e){z.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&c(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"===typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}function Ar(e){return e&&(e.Ctor.options.name||e.tag)}function Tr(e,t){return Array.isArray(e)?e.indexOf(t)>-1:"string"===typeof e?e.split(",").indexOf(t)>-1:!!f(e)&&e.test(t)}function Mr(e,t){var n=e.cache,r=e.keys,o=e._vnode;for(var i in n){var a=n[i];if(a){var s=Ar(a.componentOptions);s&&!t(s)&&Pr(n,i,r,o)}}}function Pr(e,t,n,r){var o=e[t];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),e[t]=null,g(n,t)}br(Cr),yr(Cr),jn(Cr),Pn(Cr),gn(Cr);var Lr=[String,RegExp,Array],Nr={name:"keep-alive",abstract:!0,props:{include:Lr,exclude:Lr,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Pr(this.cache,e,this.keys)},mounted:function(){var e=this;this.$watch("include",(function(t){Mr(e,(function(e){return Tr(t,e)}))})),this.$watch("exclude",(function(t){Mr(e,(function(e){return!Tr(t,e)}))}))},render:function(){var e=this.$slots.default,t=Cn(e),n=t&&t.componentOptions;if(n){var r=Ar(n),o=this,i=o.include,a=o.exclude;if(i&&(!r||!Tr(i,r))||a&&r&&Tr(a,r))return t;var s=this,l=s.cache,u=s.keys,c=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;l[c]?(t.componentInstance=l[c].componentInstance,g(u,c),u.push(c)):(l[c]=t,u.push(c),this.max&&u.length>parseInt(this.max)&&Pr(l,u[0],u,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}},Rr={KeepAlive:Nr};function Fr(e){var t={get:function(){return D}};Object.defineProperty(e,"config",t),e.util={warn:pe,extend:T,mergeOptions:Ge,defineReactive:Le},e.set=Ne,e.delete=Re,e.nextTick=ht,e.observable=function(e){return Pe(e),e},e.options=Object.create(null),z.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,T(e.options.components,Rr),Sr(e),Or(e),Er(e),jr(e)}Fr(Cr),Object.defineProperty(Cr.prototype,"$isServer",{get:le}),Object.defineProperty(Cr.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Cr,"FunctionalRenderContext",{value:Jt}),Cr.version="2.6.12";var Ir=m("style,class"),Hr=m("input,textarea,option,select,progress"),zr=function(e,t,n){return"value"===n&&Hr(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Br=m("contenteditable,draggable,spellcheck"),Dr=m("events,caret,typing,plaintext-only"),Wr=function(e,t){return Gr(t)||"false"===t?"false":"contenteditable"===e&&Dr(t)?t:"true"},Vr=m("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),Ur="http://www.w3.org/1999/xlink",qr=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Kr=function(e){return qr(e)?e.slice(6,e.length):""},Gr=function(e){return null==e||!1===e};function Xr(e){var t=e.data,n=e,r=e;while(o(r.componentInstance))r=r.componentInstance._vnode,r&&r.data&&(t=Yr(r.data,t));while(o(n=n.parent))n&&n.data&&(t=Yr(t,n.data));return Jr(t.staticClass,t.class)}function Yr(e,t){return{staticClass:Zr(e.staticClass,t.staticClass),class:o(e.class)?[e.class,t.class]:t.class}}function Jr(e,t){return o(e)||o(t)?Zr(e,Qr(t)):""}function Zr(e,t){return e?t?e+" "+t:e:t||""}function Qr(e){return Array.isArray(e)?eo(e):l(e)?to(e):"string"===typeof e?e:""}function eo(e){for(var t,n="",r=0,i=e.length;r-1?so[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:so[e]=/HTMLUnknownElement/.test(t.toString())}var uo=m("text,number,password,search,email,tel,url");function co(e){if("string"===typeof e){var t=document.querySelector(e);return t||document.createElement("div")}return e}function fo(e,t){var n=document.createElement(e);return"select"!==e||t.data&&t.data.attrs&&void 0!==t.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n}function po(e,t){return document.createElementNS(no[e],t)}function ho(e){return document.createTextNode(e)}function vo(e){return document.createComment(e)}function mo(e,t,n){e.insertBefore(t,n)}function yo(e,t){e.removeChild(t)}function go(e,t){e.appendChild(t)}function bo(e){return e.parentNode}function _o(e){return e.nextSibling}function xo(e){return e.tagName}function wo(e,t){e.textContent=t}function Co(e,t){e.setAttribute(t,"")}var So=Object.freeze({createElement:fo,createElementNS:po,createTextNode:ho,createComment:vo,insertBefore:mo,removeChild:yo,appendChild:go,parentNode:bo,nextSibling:_o,tagName:xo,setTextContent:wo,setStyleScope:Co}),Oo={create:function(e,t){Eo(t)},update:function(e,t){e.data.ref!==t.data.ref&&(Eo(e,!0),Eo(t))},destroy:function(e){Eo(e,!0)}};function Eo(e,t){var n=e.data.ref;if(o(n)){var r=e.context,i=e.componentInstance||e.elm,a=r.$refs;t?Array.isArray(a[n])?g(a[n],i):a[n]===i&&(a[n]=void 0):e.data.refInFor?Array.isArray(a[n])?a[n].indexOf(i)<0&&a[n].push(i):a[n]=[i]:a[n]=i}}var ko=new be("",{},[]),$o=["create","activate","update","remove","destroy"];function jo(e,t){return e.key===t.key&&(e.tag===t.tag&&e.isComment===t.isComment&&o(e.data)===o(t.data)&&Ao(e,t)||i(e.isAsyncPlaceholder)&&e.asyncFactory===t.asyncFactory&&r(t.asyncFactory.error))}function Ao(e,t){if("input"!==e.tag)return!0;var n,r=o(n=e.data)&&o(n=n.attrs)&&n.type,i=o(n=t.data)&&o(n=n.attrs)&&n.type;return r===i||uo(r)&&uo(i)}function To(e,t,n){var r,i,a={};for(r=t;r<=n;++r)i=e[r].key,o(i)&&(a[i]=r);return a}function Mo(e){var t,n,a={},l=e.modules,u=e.nodeOps;for(t=0;t<$o.length;++t)for(a[$o[t]]=[],n=0;nv?(f=r(n[g+1])?null:n[g+1].elm,C(e,f,n,h,g,i)):h>g&&O(t,d,v)}function $(e,t,n,r){for(var i=n;i-1?Wo(e,t,n):Vr(t)?Gr(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Br(t)?e.setAttribute(t,Wr(t,n)):qr(t)?Gr(n)?e.removeAttributeNS(Ur,Kr(t)):e.setAttributeNS(Ur,t,n):Wo(e,t,n)}function Wo(e,t,n){if(Gr(n))e.removeAttribute(t);else{if(ee&&!te&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var Vo={create:Bo,update:Bo};function Uo(e,t){var n=t.elm,i=t.data,a=e.data;if(!(r(i.staticClass)&&r(i.class)&&(r(a)||r(a.staticClass)&&r(a.class)))){var s=Xr(t),l=n._transitionClasses;o(l)&&(s=Zr(s,Qr(l))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var qo,Ko={create:Uo,update:Uo},Go="__r",Xo="__c";function Yo(e){if(o(e[Go])){var t=ee?"change":"input";e[t]=[].concat(e[Go],e[t]||[]),delete e[Go]}o(e[Xo])&&(e.change=[].concat(e[Xo],e.change||[]),delete e[Xo])}function Jo(e,t,n){var r=qo;return function o(){var i=t.apply(null,arguments);null!==i&&ei(e,o,n,r)}}var Zo=at&&!(oe&&Number(oe[1])<=53);function Qo(e,t,n,r){if(Zo){var o=Kn,i=t;t=i._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=o||e.timeStamp<=0||e.target.ownerDocument!==document)return i.apply(this,arguments)}}qo.addEventListener(e,t,ae?{capture:n,passive:r}:n)}function ei(e,t,n,r){(r||qo).removeEventListener(e,t._wrapper||t,n)}function ti(e,t){if(!r(e.data.on)||!r(t.data.on)){var n=t.data.on||{},o=e.data.on||{};qo=t.elm,Yo(n),_t(n,o,Qo,ei,Jo,t.context),qo=void 0}}var ni,ri={create:ti,update:ti};function oi(e,t){if(!r(e.data.domProps)||!r(t.data.domProps)){var n,i,a=t.elm,s=e.data.domProps||{},l=t.data.domProps||{};for(n in o(l.__ob__)&&(l=t.data.domProps=T({},l)),s)n in l||(a[n]="");for(n in l){if(i=l[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),i===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=i;var u=r(i)?"":String(i);ii(a,u)&&(a.value=u)}else if("innerHTML"===n&&oo(a.tagName)&&r(a.innerHTML)){ni=ni||document.createElement("div"),ni.innerHTML=""+i+"";var c=ni.firstChild;while(a.firstChild)a.removeChild(a.firstChild);while(c.firstChild)a.appendChild(c.firstChild)}else if(i!==s[n])try{a[n]=i}catch(Ca){}}}}function ii(e,t){return!e.composing&&("OPTION"===e.tagName||ai(e,t)||si(e,t))}function ai(e,t){var n=!0;try{n=document.activeElement!==e}catch(Ca){}return n&&e.value!==t}function si(e,t){var n=e.value,r=e._vModifiers;if(o(r)){if(r.number)return v(n)!==v(t);if(r.trim)return n.trim()!==t.trim()}return n!==t}var li={create:oi,update:oi},ui=x((function(e){var t={},n=/;(?![^(]*\))/g,r=/:(.+)/;return e.split(n).forEach((function(e){if(e){var n=e.split(r);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}));function ci(e){var t=fi(e.style);return e.staticStyle?T(e.staticStyle,t):t}function fi(e){return Array.isArray(e)?M(e):"string"===typeof e?ui(e):e}function di(e,t){var n,r={};if(t){var o=e;while(o.componentInstance)o=o.componentInstance._vnode,o&&o.data&&(n=ci(o.data))&&T(r,n)}(n=ci(e.data))&&T(r,n);var i=e;while(i=i.parent)i.data&&(n=ci(i.data))&&T(r,n);return r}var pi,hi=/^--/,vi=/\s*!important$/,mi=function(e,t,n){if(hi.test(t))e.style.setProperty(t,n);else if(vi.test(n))e.style.setProperty(E(t),n.replace(vi,""),"important");else{var r=gi(t);if(Array.isArray(n))for(var o=0,i=n.length;o-1?t.split(xi).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function Ci(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(xi).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";while(n.indexOf(r)>=0)n=n.replace(r," ");n=n.trim(),n?e.setAttribute("class",n):e.removeAttribute("class")}}function Si(e){if(e){if("object"===typeof e){var t={};return!1!==e.css&&T(t,Oi(e.name||"v")),T(t,e),t}return"string"===typeof e?Oi(e):void 0}}var Oi=x((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),Ei=Y&&!te,ki="transition",$i="animation",ji="transition",Ai="transitionend",Ti="animation",Mi="animationend";Ei&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(ji="WebkitTransition",Ai="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Ti="WebkitAnimation",Mi="webkitAnimationEnd"));var Pi=Y?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Li(e){Pi((function(){Pi(e)}))}function Ni(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),wi(e,t))}function Ri(e,t){e._transitionClasses&&g(e._transitionClasses,t),Ci(e,t)}function Fi(e,t,n){var r=Hi(e,t),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s=o===ki?Ai:Mi,l=0,u=function(){e.removeEventListener(s,c),n()},c=function(t){t.target===e&&++l>=a&&u()};setTimeout((function(){l0&&(n=ki,c=a,f=i.length):t===$i?u>0&&(n=$i,c=u,f=l.length):(c=Math.max(a,u),n=c>0?a>u?ki:$i:null,f=n?n===ki?i.length:l.length:0);var d=n===ki&&Ii.test(r[ji+"Property"]);return{type:n,timeout:c,propCount:f,hasTransform:d}}function zi(e,t){while(e.length1}function qi(e,t){!0!==t.data.show&&Di(t)}var Ki=Y?{create:qi,activate:qi,remove:function(e,t){!0!==e.data.show?Wi(e,t):t()}}:{},Gi=[Vo,Ko,ri,li,_i,Ki],Xi=Gi.concat(zo),Yi=Mo({nodeOps:So,modules:Xi});te&&document.addEventListener("selectionchange",(function(){var e=document.activeElement;e&&e.vmodel&&oa(e,"input")}));var Ji={inserted:function(e,t,n,r){"select"===n.tag?(r.elm&&!r.elm._vOptions?xt(n,"postpatch",(function(){Ji.componentUpdated(e,t,n)})):Zi(e,t,n.context),e._vOptions=[].map.call(e.options,ta)):("textarea"===n.tag||uo(e.type))&&(e._vModifiers=t.modifiers,t.modifiers.lazy||(e.addEventListener("compositionstart",na),e.addEventListener("compositionend",ra),e.addEventListener("change",ra),te&&(e.vmodel=!0)))},componentUpdated:function(e,t,n){if("select"===n.tag){Zi(e,t,n.context);var r=e._vOptions,o=e._vOptions=[].map.call(e.options,ta);if(o.some((function(e,t){return!R(e,r[t])}))){var i=e.multiple?t.value.some((function(e){return ea(e,o)})):t.value!==t.oldValue&&ea(t.value,o);i&&oa(e,"change")}}}};function Zi(e,t,n){Qi(e,t,n),(ee||ne)&&setTimeout((function(){Qi(e,t,n)}),0)}function Qi(e,t,n){var r=t.value,o=e.multiple;if(!o||Array.isArray(r)){for(var i,a,s=0,l=e.options.length;s-1,a.selected!==i&&(a.selected=i);else if(R(ta(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));o||(e.selectedIndex=-1)}}function ea(e,t){return t.every((function(t){return!R(t,e)}))}function ta(e){return"_value"in e?e._value:e.value}function na(e){e.target.composing=!0}function ra(e){e.target.composing&&(e.target.composing=!1,oa(e.target,"input"))}function oa(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function ia(e){return!e.componentInstance||e.data&&e.data.transition?e:ia(e.componentInstance._vnode)}var aa={bind:function(e,t,n){var r=t.value;n=ia(n);var o=n.data&&n.data.transition,i=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&o?(n.data.show=!0,Di(n,(function(){e.style.display=i}))):e.style.display=r?i:"none"},update:function(e,t,n){var r=t.value,o=t.oldValue;if(!r!==!o){n=ia(n);var i=n.data&&n.data.transition;i?(n.data.show=!0,r?Di(n,(function(){e.style.display=e.__vOriginalDisplay})):Wi(n,(function(){e.style.display="none"}))):e.style.display=r?e.__vOriginalDisplay:"none"}},unbind:function(e,t,n,r,o){o||(e.style.display=e.__vOriginalDisplay)}},sa={model:Ji,show:aa},la={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function ua(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?ua(Cn(t.children)):e}function ca(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var o=n._parentListeners;for(var i in o)t[C(i)]=o[i];return t}function fa(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}function da(e){while(e=e.parent)if(e.data.transition)return!0}function pa(e,t){return t.key===e.key&&t.tag===e.tag}var ha=function(e){return e.tag||wn(e)},va=function(e){return"show"===e.name},ma={name:"transition",props:la,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(ha),n.length)){0;var r=this.mode;0;var o=n[0];if(da(this.$vnode))return o;var i=ua(o);if(!i)return o;if(this._leaving)return fa(e,o);var a="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?a+"comment":a+i.tag:s(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var l=(i.data||(i.data={})).transition=ca(this),u=this._vnode,c=ua(u);if(i.data.directives&&i.data.directives.some(va)&&(i.data.show=!0),c&&c.data&&!pa(i,c)&&!wn(c)&&(!c.componentInstance||!c.componentInstance._vnode.isComment)){var f=c.data.transition=T({},l);if("out-in"===r)return this._leaving=!0,xt(f,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),fa(e,o);if("in-out"===r){if(wn(i))return u;var d,p=function(){d()};xt(l,"afterEnter",p),xt(l,"enterCancelled",p),xt(f,"delayLeave",(function(e){d=e}))}}return o}}},ya=T({tag:String,moveClass:String},la);delete ya.mode;var ga={props:ya,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var o=Tn(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,o(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=ca(this),s=0;sn)t.push(arguments[n++]);return _[++b]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},r(b),b},v=function(e){delete _[e]},"process"==l(m)?r=function(e){m.nextTick(C(e))}:g&&g.now?r=function(e){g.now(C(e))}:y&&!d?(o=new y,i=o.port2,o.port1.onmessage=S,r=u(i.postMessage,i,1)):!a.addEventListener||"function"!=typeof postMessage||a.importScripts||s(O)||"file:"===p.protocol?r=x in f("script")?function(e){c.appendChild(f("script"))[x]=function(){c.removeChild(this),w(e)}}:function(e){setTimeout(C(e),0)}:(r=O,a.addEventListener("message",S,!1))),e.exports={set:h,clear:v}},"2d00":function(e,t,n){var r,o,i=n("da84"),a=n("342f"),s=i.process,l=s&&s.versions,u=l&&l.v8;u?(r=u.split("."),o=r[0]+r[1]):a&&(r=a.match(/Edge\/(\d+)/),(!r||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/),r&&(o=r[1]))),e.exports=o&&+o},"2f62":function(e,t,n){"use strict";(function(e){ -/*! - * vuex v3.5.1 - * (c) 2020 Evan You - * @license MIT - */ -function n(e){var t=Number(e.version.split(".")[0]);if(t>=2)e.mixin({beforeCreate:r});else{var n=e.prototype._init;e.prototype._init=function(e){void 0===e&&(e={}),e.init=e.init?[r].concat(e.init):r,n.call(this,e)}}function r(){var e=this.$options;e.store?this.$store="function"===typeof e.store?e.store():e.store:e.parent&&e.parent.$store&&(this.$store=e.parent.$store)}}var r="undefined"!==typeof window?window:"undefined"!==typeof e?e:{},o=r.__VUE_DEVTOOLS_GLOBAL_HOOK__;function i(e){o&&(e._devtoolHook=o,o.emit("vuex:init",e),o.on("vuex:travel-to-state",(function(t){e.replaceState(t)})),e.subscribe((function(e,t){o.emit("vuex:mutation",e,t)}),{prepend:!0}),e.subscribeAction((function(e,t){o.emit("vuex:action",e,t)}),{prepend:!0}))}function a(e,t){return e.filter(t)[0]}function s(e,t){if(void 0===t&&(t=[]),null===e||"object"!==typeof e)return e;var n=a(t,(function(t){return t.original===e}));if(n)return n.copy;var r=Array.isArray(e)?[]:{};return t.push({original:e,copy:r}),Object.keys(e).forEach((function(n){r[n]=s(e[n],t)})),r}function l(e,t){Object.keys(e).forEach((function(n){return t(e[n],n)}))}function u(e){return null!==e&&"object"===typeof e}function c(e){return e&&"function"===typeof e.then}function f(e,t){return function(){return e(t)}}var d=function(e,t){this.runtime=t,this._children=Object.create(null),this._rawModule=e;var n=e.state;this.state=("function"===typeof n?n():n)||{}},p={namespaced:{configurable:!0}};p.namespaced.get=function(){return!!this._rawModule.namespaced},d.prototype.addChild=function(e,t){this._children[e]=t},d.prototype.removeChild=function(e){delete this._children[e]},d.prototype.getChild=function(e){return this._children[e]},d.prototype.hasChild=function(e){return e in this._children},d.prototype.update=function(e){this._rawModule.namespaced=e.namespaced,e.actions&&(this._rawModule.actions=e.actions),e.mutations&&(this._rawModule.mutations=e.mutations),e.getters&&(this._rawModule.getters=e.getters)},d.prototype.forEachChild=function(e){l(this._children,e)},d.prototype.forEachGetter=function(e){this._rawModule.getters&&l(this._rawModule.getters,e)},d.prototype.forEachAction=function(e){this._rawModule.actions&&l(this._rawModule.actions,e)},d.prototype.forEachMutation=function(e){this._rawModule.mutations&&l(this._rawModule.mutations,e)},Object.defineProperties(d.prototype,p);var h=function(e){this.register([],e,!1)};function v(e,t,n){if(t.update(n),n.modules)for(var r in n.modules){if(!t.getChild(r))return void 0;v(e.concat(r),t.getChild(r),n.modules[r])}}h.prototype.get=function(e){return e.reduce((function(e,t){return e.getChild(t)}),this.root)},h.prototype.getNamespace=function(e){var t=this.root;return e.reduce((function(e,n){return t=t.getChild(n),e+(t.namespaced?n+"/":"")}),"")},h.prototype.update=function(e){v([],this.root,e)},h.prototype.register=function(e,t,n){var r=this;void 0===n&&(n=!0);var o=new d(t,n);if(0===e.length)this.root=o;else{var i=this.get(e.slice(0,-1));i.addChild(e[e.length-1],o)}t.modules&&l(t.modules,(function(t,o){r.register(e.concat(o),t,n)}))},h.prototype.unregister=function(e){var t=this.get(e.slice(0,-1)),n=e[e.length-1],r=t.getChild(n);r&&r.runtime&&t.removeChild(n)},h.prototype.isRegistered=function(e){var t=this.get(e.slice(0,-1)),n=e[e.length-1];return t.hasChild(n)};var m;var y=function(e){var t=this;void 0===e&&(e={}),!m&&"undefined"!==typeof window&&window.Vue&&T(window.Vue);var n=e.plugins;void 0===n&&(n=[]);var r=e.strict;void 0===r&&(r=!1),this._committing=!1,this._actions=Object.create(null),this._actionSubscribers=[],this._mutations=Object.create(null),this._wrappedGetters=Object.create(null),this._modules=new h(e),this._modulesNamespaceMap=Object.create(null),this._subscribers=[],this._watcherVM=new m,this._makeLocalGettersCache=Object.create(null);var o=this,a=this,s=a.dispatch,l=a.commit;this.dispatch=function(e,t){return s.call(o,e,t)},this.commit=function(e,t,n){return l.call(o,e,t,n)},this.strict=r;var u=this._modules.root.state;w(this,u,[],this._modules.root),x(this,u),n.forEach((function(e){return e(t)}));var c=void 0!==e.devtools?e.devtools:m.config.devtools;c&&i(this)},g={state:{configurable:!0}};function b(e,t,n){return t.indexOf(e)<0&&(n&&n.prepend?t.unshift(e):t.push(e)),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}function _(e,t){e._actions=Object.create(null),e._mutations=Object.create(null),e._wrappedGetters=Object.create(null),e._modulesNamespaceMap=Object.create(null);var n=e.state;w(e,n,[],e._modules.root,!0),x(e,n,t)}function x(e,t,n){var r=e._vm;e.getters={},e._makeLocalGettersCache=Object.create(null);var o=e._wrappedGetters,i={};l(o,(function(t,n){i[n]=f(t,e),Object.defineProperty(e.getters,n,{get:function(){return e._vm[n]},enumerable:!0})}));var a=m.config.silent;m.config.silent=!0,e._vm=new m({data:{$$state:t},computed:i}),m.config.silent=a,e.strict&&$(e),r&&(n&&e._withCommit((function(){r._data.$$state=null})),m.nextTick((function(){return r.$destroy()})))}function w(e,t,n,r,o){var i=!n.length,a=e._modules.getNamespace(n);if(r.namespaced&&(e._modulesNamespaceMap[a],e._modulesNamespaceMap[a]=r),!i&&!o){var s=j(t,n.slice(0,-1)),l=n[n.length-1];e._withCommit((function(){m.set(s,l,r.state)}))}var u=r.context=C(e,a,n);r.forEachMutation((function(t,n){var r=a+n;O(e,r,t,u)})),r.forEachAction((function(t,n){var r=t.root?n:a+n,o=t.handler||t;E(e,r,o,u)})),r.forEachGetter((function(t,n){var r=a+n;k(e,r,t,u)})),r.forEachChild((function(r,i){w(e,t,n.concat(i),r,o)}))}function C(e,t,n){var r=""===t,o={dispatch:r?e.dispatch:function(n,r,o){var i=A(n,r,o),a=i.payload,s=i.options,l=i.type;return s&&s.root||(l=t+l),e.dispatch(l,a)},commit:r?e.commit:function(n,r,o){var i=A(n,r,o),a=i.payload,s=i.options,l=i.type;s&&s.root||(l=t+l),e.commit(l,a,s)}};return Object.defineProperties(o,{getters:{get:r?function(){return e.getters}:function(){return S(e,t)}},state:{get:function(){return j(e.state,n)}}}),o}function S(e,t){if(!e._makeLocalGettersCache[t]){var n={},r=t.length;Object.keys(e.getters).forEach((function(o){if(o.slice(0,r)===t){var i=o.slice(r);Object.defineProperty(n,i,{get:function(){return e.getters[o]},enumerable:!0})}})),e._makeLocalGettersCache[t]=n}return e._makeLocalGettersCache[t]}function O(e,t,n,r){var o=e._mutations[t]||(e._mutations[t]=[]);o.push((function(t){n.call(e,r.state,t)}))}function E(e,t,n,r){var o=e._actions[t]||(e._actions[t]=[]);o.push((function(t){var o=n.call(e,{dispatch:r.dispatch,commit:r.commit,getters:r.getters,state:r.state,rootGetters:e.getters,rootState:e.state},t);return c(o)||(o=Promise.resolve(o)),e._devtoolHook?o.catch((function(t){throw e._devtoolHook.emit("vuex:error",t),t})):o}))}function k(e,t,n,r){e._wrappedGetters[t]||(e._wrappedGetters[t]=function(e){return n(r.state,r.getters,e.state,e.getters)})}function $(e){e._vm.$watch((function(){return this._data.$$state}),(function(){0}),{deep:!0,sync:!0})}function j(e,t){return t.reduce((function(e,t){return e[t]}),e)}function A(e,t,n){return u(e)&&e.type&&(n=t,t=e,e=e.type),{type:e,payload:t,options:n}}function T(e){m&&e===m||(m=e,n(m))}g.state.get=function(){return this._vm._data.$$state},g.state.set=function(e){0},y.prototype.commit=function(e,t,n){var r=this,o=A(e,t,n),i=o.type,a=o.payload,s=(o.options,{type:i,payload:a}),l=this._mutations[i];l&&(this._withCommit((function(){l.forEach((function(e){e(a)}))})),this._subscribers.slice().forEach((function(e){return e(s,r.state)})))},y.prototype.dispatch=function(e,t){var n=this,r=A(e,t),o=r.type,i=r.payload,a={type:o,payload:i},s=this._actions[o];if(s){try{this._actionSubscribers.slice().filter((function(e){return e.before})).forEach((function(e){return e.before(a,n.state)}))}catch(u){0}var l=s.length>1?Promise.all(s.map((function(e){return e(i)}))):s[0](i);return new Promise((function(e,t){l.then((function(t){try{n._actionSubscribers.filter((function(e){return e.after})).forEach((function(e){return e.after(a,n.state)}))}catch(u){0}e(t)}),(function(e){try{n._actionSubscribers.filter((function(e){return e.error})).forEach((function(t){return t.error(a,n.state,e)}))}catch(u){0}t(e)}))}))}},y.prototype.subscribe=function(e,t){return b(e,this._subscribers,t)},y.prototype.subscribeAction=function(e,t){var n="function"===typeof e?{before:e}:e;return b(n,this._actionSubscribers,t)},y.prototype.watch=function(e,t,n){var r=this;return this._watcherVM.$watch((function(){return e(r.state,r.getters)}),t,n)},y.prototype.replaceState=function(e){var t=this;this._withCommit((function(){t._vm._data.$$state=e}))},y.prototype.registerModule=function(e,t,n){void 0===n&&(n={}),"string"===typeof e&&(e=[e]),this._modules.register(e,t),w(this,this.state,e,this._modules.get(e),n.preserveState),x(this,this.state)},y.prototype.unregisterModule=function(e){var t=this;"string"===typeof e&&(e=[e]),this._modules.unregister(e),this._withCommit((function(){var n=j(t.state,e.slice(0,-1));m.delete(n,e[e.length-1])})),_(this)},y.prototype.hasModule=function(e){return"string"===typeof e&&(e=[e]),this._modules.isRegistered(e)},y.prototype.hotUpdate=function(e){this._modules.update(e),_(this,!0)},y.prototype._withCommit=function(e){var t=this._committing;this._committing=!0,e(),this._committing=t},Object.defineProperties(y.prototype,g);var M=H((function(e,t){var n={};return F(t).forEach((function(t){var r=t.key,o=t.val;n[r]=function(){var t=this.$store.state,n=this.$store.getters;if(e){var r=z(this.$store,"mapState",e);if(!r)return;t=r.context.state,n=r.context.getters}return"function"===typeof o?o.call(this,t,n):t[o]},n[r].vuex=!0})),n})),P=H((function(e,t){var n={};return F(t).forEach((function(t){var r=t.key,o=t.val;n[r]=function(){var t=[],n=arguments.length;while(n--)t[n]=arguments[n];var r=this.$store.commit;if(e){var i=z(this.$store,"mapMutations",e);if(!i)return;r=i.context.commit}return"function"===typeof o?o.apply(this,[r].concat(t)):r.apply(this.$store,[o].concat(t))}})),n})),L=H((function(e,t){var n={};return F(t).forEach((function(t){var r=t.key,o=t.val;o=e+o,n[r]=function(){if(!e||z(this.$store,"mapGetters",e))return this.$store.getters[o]},n[r].vuex=!0})),n})),N=H((function(e,t){var n={};return F(t).forEach((function(t){var r=t.key,o=t.val;n[r]=function(){var t=[],n=arguments.length;while(n--)t[n]=arguments[n];var r=this.$store.dispatch;if(e){var i=z(this.$store,"mapActions",e);if(!i)return;r=i.context.dispatch}return"function"===typeof o?o.apply(this,[r].concat(t)):r.apply(this.$store,[o].concat(t))}})),n})),R=function(e){return{mapState:M.bind(null,e),mapGetters:L.bind(null,e),mapMutations:P.bind(null,e),mapActions:N.bind(null,e)}};function F(e){return I(e)?Array.isArray(e)?e.map((function(e){return{key:e,val:e}})):Object.keys(e).map((function(t){return{key:t,val:e[t]}})):[]}function I(e){return Array.isArray(e)||u(e)}function H(e){return function(t,n){return"string"!==typeof t?(n=t,t=""):"/"!==t.charAt(t.length-1)&&(t+="/"),e(t,n)}}function z(e,t,n){var r=e._modulesNamespaceMap[n];return r}function B(e){void 0===e&&(e={});var t=e.collapsed;void 0===t&&(t=!0);var n=e.filter;void 0===n&&(n=function(e,t,n){return!0});var r=e.transformer;void 0===r&&(r=function(e){return e});var o=e.mutationTransformer;void 0===o&&(o=function(e){return e});var i=e.actionFilter;void 0===i&&(i=function(e,t){return!0});var a=e.actionTransformer;void 0===a&&(a=function(e){return e});var l=e.logMutations;void 0===l&&(l=!0);var u=e.logActions;void 0===u&&(u=!0);var c=e.logger;return void 0===c&&(c=console),function(e){var f=s(e.state);"undefined"!==typeof c&&(l&&e.subscribe((function(e,i){var a=s(i);if(n(e,f,a)){var l=V(),u=o(e),d="mutation "+e.type+l;D(c,d,t),c.log("%c prev state","color: #9E9E9E; font-weight: bold",r(f)),c.log("%c mutation","color: #03A9F4; font-weight: bold",u),c.log("%c next state","color: #4CAF50; font-weight: bold",r(a)),W(c)}f=a})),u&&e.subscribeAction((function(e,n){if(i(e,n)){var r=V(),o=a(e),s="action "+e.type+r;D(c,s,t),c.log("%c action","color: #03A9F4; font-weight: bold",o),W(c)}})))}}function D(e,t,n){var r=n?e.groupCollapsed:e.group;try{r.call(e,t)}catch(o){e.log(t)}}function W(e){try{e.groupEnd()}catch(t){e.log("—— log end ——")}}function V(){var e=new Date;return" @ "+q(e.getHours(),2)+":"+q(e.getMinutes(),2)+":"+q(e.getSeconds(),2)+"."+q(e.getMilliseconds(),3)}function U(e,t){return new Array(t+1).join(e)}function q(e,t){return U("0",t-e.toString().length)+e}var K={Store:y,install:T,version:"3.5.1",mapState:M,mapMutations:P,mapGetters:L,mapActions:N,createNamespacedHelpers:R,createLogger:B};t["a"]=K}).call(this,n("c8ba"))},"342f":function(e,t,n){var r=n("d066");e.exports=r("navigator","userAgent")||""},"35a1":function(e,t,n){var r=n("f5df"),o=n("3f8c"),i=n("b622"),a=i("iterator");e.exports=function(e){if(void 0!=e)return e[a]||e["@@iterator"]||o[r(e)]}},"37e8":function(e,t,n){var r=n("83ab"),o=n("9bf2"),i=n("825a"),a=n("df75");e.exports=r?Object.defineProperties:function(e,t){i(e);var n,r=a(t),s=r.length,l=0;while(s>l)o.f(e,n=r[l++],t[n]);return e}},"38a0":function(e,t,n){},"3bbe":function(e,t,n){var r=n("861d");e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},"3c4e":function(e,t,n){"use strict";var r=function(e){return o(e)&&!i(e)};function o(e){return!!e&&"object"===typeof e}function i(e){var t=Object.prototype.toString.call(e);return"[object RegExp]"===t||"[object Date]"===t||l(e)}var a="function"===typeof Symbol&&Symbol.for,s=a?Symbol.for("react.element"):60103;function l(e){return e.$$typeof===s}function u(e){return Array.isArray(e)?[]:{}}function c(e,t){var n=t&&!0===t.clone;return n&&r(e)?p(u(e),e,t):e}function f(e,t,n){var o=e.slice();return t.forEach((function(t,i){"undefined"===typeof o[i]?o[i]=c(t,n):r(t)?o[i]=p(e[i],t,n):-1===e.indexOf(t)&&o.push(c(t,n))})),o}function d(e,t,n){var o={};return r(e)&&Object.keys(e).forEach((function(t){o[t]=c(e[t],n)})),Object.keys(t).forEach((function(i){r(t[i])&&e[i]?o[i]=p(e[i],t[i],n):o[i]=c(t[i],n)})),o}function p(e,t,n){var r=Array.isArray(t),o=Array.isArray(e),i=n||{arrayMerge:f},a=r===o;if(a){if(r){var s=i.arrayMerge||f;return s(e,t,n)}return d(e,t,n)}return c(t,n)}p.all=function(e,t){if(!Array.isArray(e)||e.length<2)throw new Error("first argument should be an array with at least two elements");return e.reduce((function(e,n){return p(e,n,t)}))};var h=p;e.exports=h},"3f8c":function(e,t){e.exports={}},4010:function(e,t,n){"use strict";t.__esModule=!0,t.removeResizeListener=t.addResizeListener=void 0;var r=n("6dd8"),o=i(r);function i(e){return e&&e.__esModule?e:{default:e}}var a="undefined"===typeof window,s=function(e){var t=e,n=Array.isArray(t),r=0;for(t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var i=o,a=i.target.__resizeListeners__||[];a.length&&a.forEach((function(e){e()}))}};t.addResizeListener=function(e,t){a||(e.__resizeListeners__||(e.__resizeListeners__=[],e.__ro__=new o.default(s),e.__ro__.observe(e)),e.__resizeListeners__.push(t))},t.removeResizeListener=function(e,t){e&&e.__resizeListeners__&&(e.__resizeListeners__.splice(e.__resizeListeners__.indexOf(t),1),e.__resizeListeners__.length||e.__ro__.disconnect())}},"417f":function(e,t,n){"use strict";t.__esModule=!0;var r=n("2b0e"),o=a(r),i=n("5924");function a(e){return e&&e.__esModule?e:{default:e}}var s=[],l="@@clickoutsideContext",u=void 0,c=0;function f(e,t,n){return function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};!(n&&n.context&&r.target&&o.target)||e.contains(r.target)||e.contains(o.target)||e===r.target||n.context.popperElm&&(n.context.popperElm.contains(r.target)||n.context.popperElm.contains(o.target))||(t.expression&&e[l].methodName&&n.context[e[l].methodName]?n.context[e[l].methodName]():e[l].bindingFn&&e[l].bindingFn())}}!o.default.prototype.$isServer&&(0,i.on)(document,"mousedown",(function(e){return u=e})),!o.default.prototype.$isServer&&(0,i.on)(document,"mouseup",(function(e){s.forEach((function(t){return t[l].documentHandler(e,u)}))})),t.default={bind:function(e,t,n){s.push(e);var r=c++;e[l]={id:r,documentHandler:f(e,t,n),methodName:t.expression,bindingFn:t.value}},update:function(e,t,n){e[l].documentHandler=f(e,t,n),e[l].methodName=t.expression,e[l].bindingFn=t.value},unbind:function(e){for(var t=s.length,n=0;n0){var r=t[t.length-1];if(r.id===e){if(r.modalClass){var o=r.modalClass.trim().split(/\s+/);o.forEach((function(e){return(0,i.removeClass)(n,e)}))}t.pop(),t.length>0&&(n.style.zIndex=t[t.length-1].zIndex)}else for(var a=t.length-1;a>=0;a--)if(t[a].id===e){t.splice(a,1);break}}0===t.length&&(this.modalFade&&(0,i.addClass)(n,"v-modal-leave"),setTimeout((function(){0===t.length&&(n.parentNode&&n.parentNode.removeChild(n),n.style.display="none",d.modalDom=void 0),(0,i.removeClass)(n,"v-modal-leave")}),200))}};Object.defineProperty(d,"zIndex",{configurable:!0,get:function(){return l||(u=u||(o.default.prototype.$ELEMENT||{}).zIndex||2e3,l=!0),u},set:function(e){u=e}});var p=function(){if(!o.default.prototype.$isServer&&d.modalStack.length>0){var e=d.modalStack[d.modalStack.length-1];if(!e)return;var t=d.getInstance(e.id);return t}};o.default.prototype.$isServer||window.addEventListener("keydown",(function(e){if(27===e.keyCode){var t=p();t&&t.closeOnPressEscape&&(t.handleClose?t.handleClose():t.handleAction?t.handleAction("cancel"):t.close())}})),t.default=d},"4d64":function(e,t,n){var r=n("fc6a"),o=n("50c4"),i=n("23cb"),a=function(e){return function(t,n,a){var s,l=r(t),u=o(l.length),c=i(a,u);if(e&&n!=n){while(u>c)if(s=l[c++],s!=s)return!0}else for(;u>c;c++)if((e||c in l)&&l[c]===n)return e||c||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},"50c4":function(e,t,n){var r=n("a691"),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},5128:function(e,t,n){"use strict";t.__esModule=!0,t.PopupManager=void 0;var r=n("2b0e"),o=d(r),i=n("7f4d"),a=d(i),s=n("4b26"),l=d(s),u=n("e62d"),c=d(u),f=n("5924");function d(e){return e&&e.__esModule?e:{default:e}}var p=1,h=void 0;t.default={props:{visible:{type:Boolean,default:!1},openDelay:{},closeDelay:{},zIndex:{},modal:{type:Boolean,default:!1},modalFade:{type:Boolean,default:!0},modalClass:{},modalAppendToBody:{type:Boolean,default:!1},lockScroll:{type:Boolean,default:!0},closeOnPressEscape:{type:Boolean,default:!1},closeOnClickModal:{type:Boolean,default:!1}},beforeMount:function(){this._popupId="popup-"+p++,l.default.register(this._popupId,this)},beforeDestroy:function(){l.default.deregister(this._popupId),l.default.closeModal(this._popupId),this.restoreBodyStyle()},data:function(){return{opened:!1,bodyPaddingRight:null,computedBodyPaddingRight:0,withoutHiddenClass:!0,rendered:!1}},watch:{visible:function(e){var t=this;if(e){if(this._opening)return;this.rendered?this.open():(this.rendered=!0,o.default.nextTick((function(){t.open()})))}else this.close()}},methods:{open:function(e){var t=this;this.rendered||(this.rendered=!0);var n=(0,a.default)({},this.$props||this,e);this._closeTimer&&(clearTimeout(this._closeTimer),this._closeTimer=null),clearTimeout(this._openTimer);var r=Number(n.openDelay);r>0?this._openTimer=setTimeout((function(){t._openTimer=null,t.doOpen(n)}),r):this.doOpen(n)},doOpen:function(e){if(!this.$isServer&&(!this.willOpen||this.willOpen())&&!this.opened){this._opening=!0;var t=this.$el,n=e.modal,r=e.zIndex;if(r&&(l.default.zIndex=r),n&&(this._closing&&(l.default.closeModal(this._popupId),this._closing=!1),l.default.openModal(this._popupId,l.default.nextZIndex(),this.modalAppendToBody?void 0:t,e.modalClass,e.modalFade),e.lockScroll)){this.withoutHiddenClass=!(0,f.hasClass)(document.body,"el-popup-parent--hidden"),this.withoutHiddenClass&&(this.bodyPaddingRight=document.body.style.paddingRight,this.computedBodyPaddingRight=parseInt((0,f.getStyle)(document.body,"paddingRight"),10)),h=(0,c.default)();var o=document.documentElement.clientHeight0&&(o||"scroll"===i)&&this.withoutHiddenClass&&(document.body.style.paddingRight=this.computedBodyPaddingRight+h+"px"),(0,f.addClass)(document.body,"el-popup-parent--hidden")}"static"===getComputedStyle(t).position&&(t.style.position="absolute"),t.style.zIndex=l.default.nextZIndex(),this.opened=!0,this.onOpen&&this.onOpen(),this.doAfterOpen()}},doAfterOpen:function(){this._opening=!1},close:function(){var e=this;if(!this.willClose||this.willClose()){null!==this._openTimer&&(clearTimeout(this._openTimer),this._openTimer=null),clearTimeout(this._closeTimer);var t=Number(this.closeDelay);t>0?this._closeTimer=setTimeout((function(){e._closeTimer=null,e.doClose()}),t):this.doClose()}},doClose:function(){this._closing=!0,this.onClose&&this.onClose(),this.lockScroll&&setTimeout(this.restoreBodyStyle,200),this.opened=!1,this.doAfterClose()},doAfterClose:function(){l.default.closeModal(this._popupId),this._closing=!1},restoreBodyStyle:function(){this.modal&&this.withoutHiddenClass&&(document.body.style.paddingRight=this.bodyPaddingRight,(0,f.removeClass)(document.body,"el-popup-parent--hidden")),this.withoutHiddenClass=!0}}},t.PopupManager=l.default},5135:function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},5466:function(e,t,n){},5692:function(e,t,n){var r=n("c430"),o=n("c6cd");(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.6.5",mode:r?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},"56ef":function(e,t,n){var r=n("d066"),o=n("241c"),i=n("7418"),a=n("825a");e.exports=r("Reflect","ownKeys")||function(e){var t=o.f(a(e)),n=i.f;return n?t.concat(n(e)):t}},5924:function(e,t,n){"use strict";t.__esModule=!0,t.isInContainer=t.getScrollContainer=t.isScroll=t.getStyle=t.once=t.off=t.on=void 0;var r="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.hasClass=v,t.addClass=m,t.removeClass=y,t.setStyle=b;var o=n("2b0e"),i=a(o);function a(e){return e&&e.__esModule?e:{default:e}}var s=i.default.prototype.$isServer,l=/([\:\-\_]+(.))/g,u=/^moz([A-Z])/,c=s?0:Number(document.documentMode),f=function(e){return(e||"").replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g,"")},d=function(e){return e.replace(l,(function(e,t,n,r){return r?n.toUpperCase():n})).replace(u,"Moz$1")},p=t.on=function(){return!s&&document.addEventListener?function(e,t,n){e&&t&&n&&e.addEventListener(t,n,!1)}:function(e,t,n){e&&t&&n&&e.attachEvent("on"+t,n)}}(),h=t.off=function(){return!s&&document.removeEventListener?function(e,t,n){e&&t&&e.removeEventListener(t,n,!1)}:function(e,t,n){e&&t&&e.detachEvent("on"+t,n)}}();t.once=function(e,t,n){var r=function r(){n&&n.apply(this,arguments),h(e,t,r)};p(e,t,r)};function v(e,t){if(!e||!t)return!1;if(-1!==t.indexOf(" "))throw new Error("className should not contain space.");return e.classList?e.classList.contains(t):(" "+e.className+" ").indexOf(" "+t+" ")>-1}function m(e,t){if(e){for(var n=e.className,r=(t||"").split(" "),o=0,i=r.length;or.top&&n.right>r.left&&n.lefte?u():!0!==t&&(o=setTimeout(r?c:u,void 0===r?e-s:e))}return"boolean"!==typeof t&&(r=n,n=t,t=void 0),a}},"5c6c":function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},"60da":function(e,t,n){"use strict";var r=n("83ab"),o=n("d039"),i=n("df75"),a=n("7418"),s=n("d1e7"),l=n("7b0b"),u=n("44ad"),c=Object.assign,f=Object.defineProperty;e.exports=!c||o((function(){if(r&&1!==c({b:1},c(f({},"a",{enumerable:!0,get:function(){f(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),o="abcdefghijklmnopqrst";return e[n]=7,o.split("").forEach((function(e){t[e]=e})),7!=c({},e)[n]||i(c({},t)).join("")!=o}))?function(e,t){var n=l(e),o=arguments.length,c=1,f=a.f,d=s.f;while(o>c){var p,h=u(arguments[c++]),v=f?i(h).concat(f(h)):i(h),m=v.length,y=0;while(m>y)p=v[y++],r&&!d.call(h,p)||(n[p]=h[p])}return n}:c},6167:function(e,t,n){"use strict";var r,o;"function"===typeof Symbol&&Symbol.iterator;(function(i,a){r=a,o="function"===typeof r?r.call(t,n,t,e):r,void 0===o||(e.exports=o)})(0,(function(){var e=window,t={placement:"bottom",gpuAcceleration:!0,offset:0,boundariesElement:"viewport",boundariesPadding:5,preventOverflowOrder:["left","right","top","bottom"],flipBehavior:"flip",arrowElement:"[x-arrow]",arrowOffset:0,modifiers:["shift","offset","preventOverflow","keepTogether","arrow","flip","applyStyle"],modifiersIgnored:[],forceAbsolute:!1};function n(e,n,r){this._reference=e.jquery?e[0]:e,this.state={};var o="undefined"===typeof n||null===n,i=n&&"[object Object]"===Object.prototype.toString.call(n);return this._popper=o||i?this.parse(i?n:{}):n.jquery?n[0]:n,this._options=Object.assign({},t,r),this._options.modifiers=this._options.modifiers.map(function(e){if(-1===this._options.modifiersIgnored.indexOf(e))return"applyStyle"===e&&this._popper.setAttribute("x-placement",this._options.placement),this.modifiers[e]||e}.bind(this)),this.state.position=this._getPosition(this._popper,this._reference),f(this._popper,{position:this.state.position,top:0}),this.update(),this._setupEventListeners(),this}function r(t){var n=t.style.display,r=t.style.visibility;t.style.display="block",t.style.visibility="hidden";t.offsetWidth;var o=e.getComputedStyle(t),i=parseFloat(o.marginTop)+parseFloat(o.marginBottom),a=parseFloat(o.marginLeft)+parseFloat(o.marginRight),s={width:t.offsetWidth+a,height:t.offsetHeight+i};return t.style.display=n,t.style.visibility=r,s}function o(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"};return e.replace(/left|right|bottom|top/g,(function(e){return t[e]}))}function i(e){var t=Object.assign({},e);return t.right=t.left+t.width,t.bottom=t.top+t.height,t}function a(e,t){var n,r=0;for(n in e){if(e[n]===t)return r;r++}return null}function s(t,n){var r=e.getComputedStyle(t,null);return r[n]}function l(t){var n=t.offsetParent;return n!==e.document.body&&n?n:e.document.documentElement}function u(t){var n=t.parentNode;return n?n===e.document?e.document.body.scrollTop||e.document.body.scrollLeft?e.document.body:e.document.documentElement:-1!==["scroll","auto"].indexOf(s(n,"overflow"))||-1!==["scroll","auto"].indexOf(s(n,"overflow-x"))||-1!==["scroll","auto"].indexOf(s(n,"overflow-y"))?n:u(t.parentNode):t}function c(t){return t!==e.document.body&&("fixed"===s(t,"position")||(t.parentNode?c(t.parentNode):t))}function f(e,t){function n(e){return""!==e&&!isNaN(parseFloat(e))&&isFinite(e)}Object.keys(t).forEach((function(r){var o="";-1!==["width","height","top","right","bottom","left"].indexOf(r)&&n(t[r])&&(o="px"),e.style[r]=t[r]+o}))}function d(e){var t={};return e&&"[object Function]"===t.toString.call(e)}function p(e){var t={width:e.offsetWidth,height:e.offsetHeight,left:e.offsetLeft,top:e.offsetTop};return t.right=t.left+t.width,t.bottom=t.top+t.height,t}function h(e){var t=e.getBoundingClientRect(),n=-1!=navigator.userAgent.indexOf("MSIE"),r=n&&"HTML"===e.tagName?-e.scrollTop:t.top;return{left:t.left,top:r,right:t.right,bottom:t.bottom,width:t.right-t.left,height:t.bottom-r}}function v(e,t,n){var r=h(e),o=h(t);if(n){var i=u(t);o.top+=i.scrollTop,o.bottom+=i.scrollTop,o.left+=i.scrollLeft,o.right+=i.scrollLeft}var a={top:r.top-o.top,left:r.left-o.left,bottom:r.top-o.top+r.height,right:r.left-o.left+r.width,width:r.width,height:r.height};return a}function m(t){for(var n=["","ms","webkit","moz","o"],r=0;r1&&console.warn("WARNING: the given `parent` query("+t.parent+") matched more than one element, the first one will be used"),0===a.length)throw"ERROR: the given `parent` doesn't exists!";a=a[0]}return a.length>1&&a instanceof Element===!1&&(console.warn("WARNING: you have passed as parent a list of elements, the first one will be used"),a=a[0]),a.appendChild(o),o;function s(e,t){t.forEach((function(t){e.classList.add(t)}))}function l(e,t){t.forEach((function(t){e.setAttribute(t.split(":")[0],t.split(":")[1]||"")}))}},n.prototype._getPosition=function(e,t){var n=l(t);if(this._options.forceAbsolute)return"absolute";var r=c(t,n);return r?"fixed":"absolute"},n.prototype._getOffsets=function(e,t,n){n=n.split("-")[0];var o={};o.position=this.state.position;var i="fixed"===o.position,a=v(t,l(e),i),s=r(e);return-1!==["right","left"].indexOf(n)?(o.top=a.top+a.height/2-s.height/2,o.left="left"===n?a.left-s.width:a.right):(o.left=a.left+a.width/2-s.width/2,o.top="top"===n?a.top-s.height:a.bottom),o.width=s.width,o.height=s.height,{popper:o,reference:a}},n.prototype._setupEventListeners=function(){if(this.state.updateBound=this.update.bind(this),e.addEventListener("resize",this.state.updateBound),"window"!==this._options.boundariesElement){var t=u(this._reference);t!==e.document.body&&t!==e.document.documentElement||(t=e),t.addEventListener("scroll",this.state.updateBound),this.state.scrollTarget=t}},n.prototype._removeEventListeners=function(){e.removeEventListener("resize",this.state.updateBound),"window"!==this._options.boundariesElement&&this.state.scrollTarget&&(this.state.scrollTarget.removeEventListener("scroll",this.state.updateBound),this.state.scrollTarget=null),this.state.updateBound=null},n.prototype._getBoundaries=function(t,n,r){var o,i,a={};if("window"===r){var s=e.document.body,c=e.document.documentElement;i=Math.max(s.scrollHeight,s.offsetHeight,c.clientHeight,c.scrollHeight,c.offsetHeight),o=Math.max(s.scrollWidth,s.offsetWidth,c.clientWidth,c.scrollWidth,c.offsetWidth),a={top:0,right:o,bottom:i,left:0}}else if("viewport"===r){var f=l(this._popper),d=u(this._popper),h=p(f),v=function(e){return e==document.body?Math.max(document.documentElement.scrollTop,document.body.scrollTop):e.scrollTop},m=function(e){return e==document.body?Math.max(document.documentElement.scrollLeft,document.body.scrollLeft):e.scrollLeft},y="fixed"===t.offsets.popper.position?0:v(d),g="fixed"===t.offsets.popper.position?0:m(d);a={top:0-(h.top-y),right:e.document.documentElement.clientWidth-(h.left-g),bottom:e.document.documentElement.clientHeight-(h.top-y),left:0-(h.left-g)}}else a=l(this._popper)===r?{top:0,left:0,right:r.clientWidth,bottom:r.clientHeight}:p(r);return a.left+=n,a.right-=n,a.top=a.top+n,a.bottom=a.bottom-n,a},n.prototype.runModifiers=function(e,t,n){var r=t.slice();return void 0!==n&&(r=this._options.modifiers.slice(0,a(this._options.modifiers,n))),r.forEach(function(t){d(t)&&(e=t.call(this,e))}.bind(this)),e},n.prototype.isModifierRequired=function(e,t){var n=a(this._options.modifiers,e);return!!this._options.modifiers.slice(0,n).filter((function(e){return e===t})).length},n.prototype.modifiers={},n.prototype.modifiers.applyStyle=function(e){var t,n={position:e.offsets.popper.position},r=Math.round(e.offsets.popper.left),o=Math.round(e.offsets.popper.top);return this._options.gpuAcceleration&&(t=m("transform"))?(n[t]="translate3d("+r+"px, "+o+"px, 0)",n.top=0,n.left=0):(n.left=r,n.top=o),Object.assign(n,e.styles),f(this._popper,n),this._popper.setAttribute("x-placement",e.placement),this.isModifierRequired(this.modifiers.applyStyle,this.modifiers.arrow)&&e.offsets.arrow&&f(e.arrowElement,e.offsets.arrow),e},n.prototype.modifiers.shift=function(e){var t=e.placement,n=t.split("-")[0],r=t.split("-")[1];if(r){var o=e.offsets.reference,a=i(e.offsets.popper),s={y:{start:{top:o.top},end:{top:o.top+o.height-a.height}},x:{start:{left:o.left},end:{left:o.left+o.width-a.width}}},l=-1!==["bottom","top"].indexOf(n)?"x":"y";e.offsets.popper=Object.assign(a,s[l][r])}return e},n.prototype.modifiers.preventOverflow=function(e){var t=this._options.preventOverflowOrder,n=i(e.offsets.popper),r={left:function(){var t=n.left;return n.lefte.boundaries.right&&(t=Math.min(n.left,e.boundaries.right-n.width)),{left:t}},top:function(){var t=n.top;return n.tope.boundaries.bottom&&(t=Math.min(n.top,e.boundaries.bottom-n.height)),{top:t}}};return t.forEach((function(t){e.offsets.popper=Object.assign(n,r[t]())})),e},n.prototype.modifiers.keepTogether=function(e){var t=i(e.offsets.popper),n=e.offsets.reference,r=Math.floor;return t.rightr(n.right)&&(e.offsets.popper.left=r(n.right)),t.bottomr(n.bottom)&&(e.offsets.popper.top=r(n.bottom)),e},n.prototype.modifiers.flip=function(e){if(!this.isModifierRequired(this.modifiers.flip,this.modifiers.preventOverflow))return console.warn("WARNING: preventOverflow modifier is required by flip modifier in order to work, be sure to include it before flip!"),e;if(e.flipped&&e.placement===e._originalPlacement)return e;var t=e.placement.split("-")[0],n=o(t),r=e.placement.split("-")[1]||"",a=[];return a="flip"===this._options.flipBehavior?[t,n]:this._options.flipBehavior,a.forEach(function(s,l){if(t===s&&a.length!==l+1){t=e.placement.split("-")[0],n=o(t);var u=i(e.offsets.popper),c=-1!==["right","bottom"].indexOf(t);(c&&Math.floor(e.offsets.reference[t])>Math.floor(u[n])||!c&&Math.floor(e.offsets.reference[t])s[p]&&(e.offsets.popper[f]+=l[f]+h-s[p]);var v=l[f]+(n||l[c]/2-h/2),m=v-s[f];return m=Math.max(Math.min(s[c]-h-8,m),8),o[f]=m,o[d]="",e.offsets.arrow=o,e.arrowElement=t,e},Object.assign||Object.defineProperty(Object,"assign",{enumerable:!1,configurable:!0,writable:!0,value:function(e){if(void 0===e||null===e)throw new TypeError("Cannot convert first argument to object");for(var t=Object(e),n=1;n-1}},openDelay:{type:Number,default:0},closeDelay:{type:Number,default:200},title:String,disabled:Boolean,content:String,reference:{},popperClass:String,width:{},visibleArrow:{default:!0},arrowOffset:{type:Number,default:0},transition:{type:String,default:"fade-in-linear"},tabindex:{type:Number,default:0}},computed:{tooltipId:function(){return"el-popover-"+Object(l["generateId"])()}},watch:{showPopper:function(e){this.disabled||(e?this.$emit("show"):this.$emit("hide"))}},mounted:function(){var e=this,t=this.referenceElm=this.reference||this.$refs.reference,n=this.popper||this.$refs.popper;!t&&this.$slots.reference&&this.$slots.reference[0]&&(t=this.referenceElm=this.$slots.reference[0].elm),t&&(Object(s["addClass"])(t,"el-popover__reference"),t.setAttribute("aria-describedby",this.tooltipId),t.setAttribute("tabindex",this.tabindex),n.setAttribute("tabindex",0),"click"!==this.trigger&&(Object(s["on"])(t,"focusin",(function(){e.handleFocus();var n=t.__vue__;n&&"function"===typeof n.focus&&n.focus()})),Object(s["on"])(n,"focusin",this.handleFocus),Object(s["on"])(t,"focusout",this.handleBlur),Object(s["on"])(n,"focusout",this.handleBlur)),Object(s["on"])(t,"keydown",this.handleKeydown),Object(s["on"])(t,"click",this.handleClick)),"click"===this.trigger?(Object(s["on"])(t,"click",this.doToggle),Object(s["on"])(document,"click",this.handleDocumentClick)):"hover"===this.trigger?(Object(s["on"])(t,"mouseenter",this.handleMouseEnter),Object(s["on"])(n,"mouseenter",this.handleMouseEnter),Object(s["on"])(t,"mouseleave",this.handleMouseLeave),Object(s["on"])(n,"mouseleave",this.handleMouseLeave)):"focus"===this.trigger&&(this.tabindex<0&&console.warn("[Element Warn][Popover]a negative taindex means that the element cannot be focused by tab key"),t.querySelector("input, textarea")?(Object(s["on"])(t,"focusin",this.doShow),Object(s["on"])(t,"focusout",this.doClose)):(Object(s["on"])(t,"mousedown",this.doShow),Object(s["on"])(t,"mouseup",this.doClose)))},beforeDestroy:function(){this.cleanup()},deactivated:function(){this.cleanup()},methods:{doToggle:function(){this.showPopper=!this.showPopper},doShow:function(){this.showPopper=!0},doClose:function(){this.showPopper=!1},handleFocus:function(){Object(s["addClass"])(this.referenceElm,"focusing"),"click"!==this.trigger&&"focus"!==this.trigger||(this.showPopper=!0)},handleClick:function(){Object(s["removeClass"])(this.referenceElm,"focusing")},handleBlur:function(){Object(s["removeClass"])(this.referenceElm,"focusing"),"click"!==this.trigger&&"focus"!==this.trigger||(this.showPopper=!1)},handleMouseEnter:function(){var e=this;clearTimeout(this._timer),this.openDelay?this._timer=setTimeout((function(){e.showPopper=!0}),this.openDelay):this.showPopper=!0},handleKeydown:function(e){27===e.keyCode&&"manual"!==this.trigger&&this.doClose()},handleMouseLeave:function(){var e=this;clearTimeout(this._timer),this.closeDelay?this._timer=setTimeout((function(){e.showPopper=!1}),this.closeDelay):this.showPopper=!1},handleDocumentClick:function(e){var t=this.reference||this.$refs.reference,n=this.popper||this.$refs.popper;!t&&this.$slots.reference&&this.$slots.reference[0]&&(t=this.referenceElm=this.$slots.reference[0].elm),this.$el&&t&&!this.$el.contains(e.target)&&!t.contains(e.target)&&n&&!n.contains(e.target)&&(this.showPopper=!1)},handleAfterEnter:function(){this.$emit("after-enter")},handleAfterLeave:function(){this.$emit("after-leave"),this.doDestroy()},cleanup:function(){(this.openDelay||this.closeDelay)&&clearTimeout(this._timer)}},destroyed:function(){var e=this.reference;Object(s["off"])(e,"click",this.doToggle),Object(s["off"])(e,"mouseup",this.doClose),Object(s["off"])(e,"mousedown",this.doShow),Object(s["off"])(e,"focusin",this.doShow),Object(s["off"])(e,"focusout",this.doClose),Object(s["off"])(e,"mousedown",this.doShow),Object(s["off"])(e,"mouseup",this.doClose),Object(s["off"])(e,"mouseleave",this.handleMouseLeave),Object(s["off"])(e,"mouseenter",this.handleMouseEnter),Object(s["off"])(document,"click",this.handleDocumentClick)}},c=u,f=n(0),d=Object(f["a"])(c,r,o,!1,null,null,null);d.options.__file="packages/popover/src/main.vue";var p=d.exports,h=function(e,t,n){var r=t.expression?t.value:t.arg,o=n.context.$refs[r];o&&(Array.isArray(o)?o[0].$refs.reference=e:o.$refs.reference=e)},v={bind:function(e,t,n){h(e,t,n)},inserted:function(e,t,n){h(e,t,n)}},m=n(7),y=n.n(m);y.a.directive("popover",v),p.install=function(e){e.directive("popover",v),e.component(p.name,p)},p.directive=v;t["default"]=p}})},"6b7c":function(e,t,n){"use strict";t.__esModule=!0;var r=n("4897");t.default={methods:{t:function(){for(var e=arguments.length,t=Array(e),n=0;n0},e.prototype.connect_=function(){r&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),c?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){r&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(e){var t=e.propertyName,n=void 0===t?"":t,r=u.some((function(e){return!!~n.indexOf(e)}));r&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),d=function(e,t){for(var n=0,r=Object.keys(t);n0},e}(),$="undefined"!==typeof WeakMap?new WeakMap:new n,j=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=f.getInstance(),r=new k(t,n,this);$.set(this,r)}return e}();["observe","unobserve","disconnect"].forEach((function(e){j.prototype[e]=function(){var t;return(t=$.get(this))[e].apply(t,arguments)}}));var A=function(){return"undefined"!==typeof o.ResizeObserver?o.ResizeObserver:j}();t["default"]=A}.call(this,n("c8ba"))},"6ed5":function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=77)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},10:function(e,t){e.exports=n("f3ad")},13:function(e,t){e.exports=n("eedf")},15:function(e,t){e.exports=n("5128")},19:function(e,t){e.exports=n("4897")},2:function(e,t){e.exports=n("5924")},23:function(e,t){e.exports=n("41f8")},47:function(e,t){e.exports=n("722f")},6:function(e,t){e.exports=n("6b7c")},7:function(e,t){e.exports=n("2b0e")},77:function(e,t,n){"use strict";n.r(t);var r=n(7),o=n.n(r),i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("transition",{attrs:{name:"msgbox-fade"}},[n("div",{directives:[{name:"show",rawName:"v-show",value:e.visible,expression:"visible"}],staticClass:"el-message-box__wrapper",attrs:{tabindex:"-1",role:"dialog","aria-modal":"true","aria-label":e.title||"dialog"},on:{click:function(t){return t.target!==t.currentTarget?null:e.handleWrapperClick(t)}}},[n("div",{staticClass:"el-message-box",class:[e.customClass,e.center&&"el-message-box--center"]},[null!==e.title?n("div",{staticClass:"el-message-box__header"},[n("div",{staticClass:"el-message-box__title"},[e.icon&&e.center?n("div",{class:["el-message-box__status",e.icon]}):e._e(),n("span",[e._v(e._s(e.title))])]),e.showClose?n("button",{staticClass:"el-message-box__headerbtn",attrs:{type:"button","aria-label":"Close"},on:{click:function(t){e.handleAction(e.distinguishCancelAndClose?"close":"cancel")},keydown:function(t){if(!("button"in t)&&e._k(t.keyCode,"enter",13,t.key,"Enter"))return null;e.handleAction(e.distinguishCancelAndClose?"close":"cancel")}}},[n("i",{staticClass:"el-message-box__close el-icon-close"})]):e._e()]):e._e(),n("div",{staticClass:"el-message-box__content"},[n("div",{staticClass:"el-message-box__container"},[e.icon&&!e.center&&""!==e.message?n("div",{class:["el-message-box__status",e.icon]}):e._e(),""!==e.message?n("div",{staticClass:"el-message-box__message"},[e._t("default",[e.dangerouslyUseHTMLString?n("p",{domProps:{innerHTML:e._s(e.message)}}):n("p",[e._v(e._s(e.message))])])],2):e._e()]),n("div",{directives:[{name:"show",rawName:"v-show",value:e.showInput,expression:"showInput"}],staticClass:"el-message-box__input"},[n("el-input",{ref:"input",attrs:{type:e.inputType,placeholder:e.inputPlaceholder},nativeOn:{keydown:function(t){return!("button"in t)&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.handleInputEnter(t)}},model:{value:e.inputValue,callback:function(t){e.inputValue=t},expression:"inputValue"}}),n("div",{staticClass:"el-message-box__errormsg",style:{visibility:e.editorErrorMessage?"visible":"hidden"}},[e._v(e._s(e.editorErrorMessage))])],1)]),n("div",{staticClass:"el-message-box__btns"},[e.showCancelButton?n("el-button",{class:[e.cancelButtonClasses],attrs:{loading:e.cancelButtonLoading,round:e.roundButton,size:"small"},on:{keydown:function(t){if(!("button"in t)&&e._k(t.keyCode,"enter",13,t.key,"Enter"))return null;e.handleAction("cancel")}},nativeOn:{click:function(t){e.handleAction("cancel")}}},[e._v("\n "+e._s(e.cancelButtonText||e.t("el.messagebox.cancel"))+"\n ")]):e._e(),n("el-button",{directives:[{name:"show",rawName:"v-show",value:e.showConfirmButton,expression:"showConfirmButton"}],ref:"confirm",class:[e.confirmButtonClasses],attrs:{loading:e.confirmButtonLoading,round:e.roundButton,size:"small"},on:{keydown:function(t){if(!("button"in t)&&e._k(t.keyCode,"enter",13,t.key,"Enter"))return null;e.handleAction("confirm")}},nativeOn:{click:function(t){e.handleAction("confirm")}}},[e._v("\n "+e._s(e.confirmButtonText||e.t("el.messagebox.confirm"))+"\n ")])],1)])])])},a=[];i._withStripped=!0;var s=n(15),l=n.n(s),u=n(6),c=n.n(u),f=n(10),d=n.n(f),p=n(13),h=n.n(p),v=n(2),m=n(19),y=n(47),g=n.n(y),b=void 0,_={success:"success",info:"info",warning:"warning",error:"error"},x={mixins:[l.a,c.a],props:{modal:{default:!0},lockScroll:{default:!0},showClose:{type:Boolean,default:!0},closeOnClickModal:{default:!0},closeOnPressEscape:{default:!0},closeOnHashChange:{default:!0},center:{default:!1,type:Boolean},roundButton:{default:!1,type:Boolean}},components:{ElInput:d.a,ElButton:h.a},computed:{icon:function(){var e=this.type,t=this.iconClass;return t||(e&&_[e]?"el-icon-"+_[e]:"")},confirmButtonClasses:function(){return"el-button--primary "+this.confirmButtonClass},cancelButtonClasses:function(){return""+this.cancelButtonClass}},methods:{getSafeClose:function(){var e=this,t=this.uid;return function(){e.$nextTick((function(){t===e.uid&&e.doClose()}))}},doClose:function(){var e=this;this.visible&&(this.visible=!1,this._closing=!0,this.onClose&&this.onClose(),b.closeDialog(),this.lockScroll&&setTimeout(this.restoreBodyStyle,200),this.opened=!1,this.doAfterClose(),setTimeout((function(){e.action&&e.callback(e.action,e)})))},handleWrapperClick:function(){this.closeOnClickModal&&this.handleAction(this.distinguishCancelAndClose?"close":"cancel")},handleInputEnter:function(){if("textarea"!==this.inputType)return this.handleAction("confirm")},handleAction:function(e){("prompt"!==this.$type||"confirm"!==e||this.validate())&&(this.action=e,"function"===typeof this.beforeClose?(this.close=this.getSafeClose(),this.beforeClose(e,this,this.close)):this.doClose())},validate:function(){if("prompt"===this.$type){var e=this.inputPattern;if(e&&!e.test(this.inputValue||""))return this.editorErrorMessage=this.inputErrorMessage||Object(m["t"])("el.messagebox.error"),Object(v["addClass"])(this.getInputElement(),"invalid"),!1;var t=this.inputValidator;if("function"===typeof t){var n=t(this.inputValue);if(!1===n)return this.editorErrorMessage=this.inputErrorMessage||Object(m["t"])("el.messagebox.error"),Object(v["addClass"])(this.getInputElement(),"invalid"),!1;if("string"===typeof n)return this.editorErrorMessage=n,Object(v["addClass"])(this.getInputElement(),"invalid"),!1}}return this.editorErrorMessage="",Object(v["removeClass"])(this.getInputElement(),"invalid"),!0},getFirstFocus:function(){var e=this.$el.querySelector(".el-message-box__btns .el-button"),t=this.$el.querySelector(".el-message-box__btns .el-message-box__title");return e||t},getInputElement:function(){var e=this.$refs.input.$refs;return e.input||e.textarea},handleClose:function(){this.handleAction("close")}},watch:{inputValue:{immediate:!0,handler:function(e){var t=this;this.$nextTick((function(n){"prompt"===t.$type&&null!==e&&t.validate()}))}},visible:function(e){var t=this;e&&(this.uid++,"alert"!==this.$type&&"confirm"!==this.$type||this.$nextTick((function(){t.$refs.confirm.$el.focus()})),this.focusAfterClosed=document.activeElement,b=new g.a(this.$el,this.focusAfterClosed,this.getFirstFocus())),"prompt"===this.$type&&(e?setTimeout((function(){t.$refs.input&&t.$refs.input.$el&&t.getInputElement().focus()}),500):(this.editorErrorMessage="",Object(v["removeClass"])(this.getInputElement(),"invalid")))}},mounted:function(){var e=this;this.$nextTick((function(){e.closeOnHashChange&&window.addEventListener("hashchange",e.close)}))},beforeDestroy:function(){this.closeOnHashChange&&window.removeEventListener("hashchange",this.close),setTimeout((function(){b.closeDialog()}))},data:function(){return{uid:1,title:void 0,message:"",type:"",iconClass:"",customClass:"",showInput:!1,inputValue:null,inputPlaceholder:"",inputType:"text",inputPattern:null,inputValidator:null,inputErrorMessage:"",showConfirmButton:!0,showCancelButton:!1,action:"",confirmButtonText:"",cancelButtonText:"",confirmButtonLoading:!1,cancelButtonLoading:!1,confirmButtonClass:"",confirmButtonDisabled:!1,cancelButtonClass:"",editorErrorMessage:null,callback:null,dangerouslyUseHTMLString:!1,focusAfterClosed:null,isOnComposition:!1,distinguishCancelAndClose:!1}}},w=x,C=n(0),S=Object(C["a"])(w,i,a,!1,null,null,null);S.options.__file="packages/message-box/src/main.vue";var O=S.exports,E=n(9),k=n.n(E),$=n(23),j="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},A={title:null,message:"",type:"",iconClass:"",showInput:!1,showClose:!0,modalFade:!0,lockScroll:!0,closeOnClickModal:!0,closeOnPressEscape:!0,closeOnHashChange:!0,inputValue:null,inputPlaceholder:"",inputType:"text",inputPattern:null,inputValidator:null,inputErrorMessage:"",showConfirmButton:!0,showCancelButton:!1,confirmButtonPosition:"right",confirmButtonHighlight:!1,cancelButtonHighlight:!1,confirmButtonText:"",cancelButtonText:"",confirmButtonClass:"",cancelButtonClass:"",customClass:"",beforeClose:null,dangerouslyUseHTMLString:!1,center:!1,roundButton:!1,distinguishCancelAndClose:!1},T=o.a.extend(O),M=void 0,P=void 0,L=[],N=function(e){if(M){var t=M.callback;"function"===typeof t&&(P.showInput?t(P.inputValue,e):t(e)),M.resolve&&("confirm"===e?P.showInput?M.resolve({value:P.inputValue,action:e}):M.resolve(e):!M.reject||"cancel"!==e&&"close"!==e||M.reject(e))}},R=function(){P=new T({el:document.createElement("div")}),P.callback=N},F=function e(){if(P||R(),P.action="",(!P.visible||P.closeTimer)&&L.length>0){M=L.shift();var t=M.options;for(var n in t)t.hasOwnProperty(n)&&(P[n]=t[n]);void 0===t.callback&&(P.callback=N);var r=P.callback;P.callback=function(t,n){r(t,n),e()},Object($["isVNode"])(P.message)?(P.$slots.default=[P.message],P.message=null):delete P.$slots.default,["modal","showClose","closeOnClickModal","closeOnPressEscape","closeOnHashChange"].forEach((function(e){void 0===P[e]&&(P[e]=!0)})),document.body.appendChild(P.$el),o.a.nextTick((function(){P.visible=!0}))}},I=function e(t,n){if(!o.a.prototype.$isServer){if("string"===typeof t||Object($["isVNode"])(t)?(t={message:t},"string"===typeof arguments[1]&&(t.title=arguments[1])):t.callback&&!n&&(n=t.callback),"undefined"!==typeof Promise)return new Promise((function(r,o){L.push({options:k()({},A,e.defaults,t),callback:n,resolve:r,reject:o}),F()}));L.push({options:k()({},A,e.defaults,t),callback:n}),F()}};I.setDefaults=function(e){I.defaults=e},I.alert=function(e,t,n){return"object"===("undefined"===typeof t?"undefined":j(t))?(n=t,t=""):void 0===t&&(t=""),I(k()({title:t,message:e,$type:"alert",closeOnPressEscape:!1,closeOnClickModal:!1},n))},I.confirm=function(e,t,n){return"object"===("undefined"===typeof t?"undefined":j(t))?(n=t,t=""):void 0===t&&(t=""),I(k()({title:t,message:e,$type:"confirm",showCancelButton:!0},n))},I.prompt=function(e,t,n){return"object"===("undefined"===typeof t?"undefined":j(t))?(n=t,t=""):void 0===t&&(t=""),I(k()({title:t,message:e,showCancelButton:!0,showInput:!0,$type:"prompt"},n))},I.close=function(){P.doClose(),P.visible=!1,L=[],M=null};var H=I;t["default"]=H},9:function(e,t){e.exports=n("7f4d")}})},"6eeb":function(e,t,n){var r=n("da84"),o=n("9112"),i=n("5135"),a=n("ce4e"),s=n("8925"),l=n("69f3"),u=l.get,c=l.enforce,f=String(String).split("String");(e.exports=function(e,t,n,s){var l=!!s&&!!s.unsafe,u=!!s&&!!s.enumerable,d=!!s&&!!s.noTargetGet;"function"==typeof n&&("string"!=typeof t||i(n,"name")||o(n,"name",t),c(n).source=f.join("string"==typeof t?t:"")),e!==r?(l?!d&&e[t]&&(u=!0):delete e[t],u?e[t]=n:o(e,t,n)):u?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&u(this).source||s(this)}))},"722f":function(e,t,n){"use strict";t.__esModule=!0;var r="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=n("e452"),i=a(o);function a(e){return e&&e.__esModule?e:{default:e}}var s,l=l||{};l.Dialog=function(e,t,n){var o=this;if(this.dialogNode=e,null===this.dialogNode||"dialog"!==this.dialogNode.getAttribute("role"))throw new Error("Dialog() requires a DOM element with ARIA role of dialog.");"string"===typeof t?this.focusAfterClosed=document.getElementById(t):"object"===("undefined"===typeof t?"undefined":r(t))?this.focusAfterClosed=t:this.focusAfterClosed=null,"string"===typeof n?this.focusFirst=document.getElementById(n):"object"===("undefined"===typeof n?"undefined":r(n))?this.focusFirst=n:this.focusFirst=null,this.focusFirst?this.focusFirst.focus():i.default.focusFirstDescendant(this.dialogNode),this.lastFocus=document.activeElement,s=function(e){o.trapFocus(e)},this.addListeners()},l.Dialog.prototype.addListeners=function(){document.addEventListener("focus",s,!0)},l.Dialog.prototype.removeListeners=function(){document.removeEventListener("focus",s,!0)},l.Dialog.prototype.closeDialog=function(){var e=this;this.removeListeners(),this.focusAfterClosed&&setTimeout((function(){e.focusAfterClosed.focus()}))},l.Dialog.prototype.trapFocus=function(e){i.default.IgnoreUtilFocusChanges||(this.dialogNode.contains(e.target)?this.lastFocus=e.target:(i.default.focusFirstDescendant(this.dialogNode),this.lastFocus===document.activeElement&&i.default.focusLastDescendant(this.dialogNode),this.lastFocus=document.activeElement))},t.default=l.Dialog},7418:function(e,t){t.f=Object.getOwnPropertySymbols},"76b9":function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=110)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},110:function(e,t,n){"use strict";n.r(t);var r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"el-breadcrumb",attrs:{"aria-label":"Breadcrumb",role:"navigation"}},[e._t("default")],2)},o=[];r._withStripped=!0;var i={name:"ElBreadcrumb",props:{separator:{type:String,default:"/"},separatorClass:{type:String,default:""}},provide:function(){return{elBreadcrumb:this}},mounted:function(){var e=this.$el.querySelectorAll(".el-breadcrumb__item");e.length&&e[e.length-1].setAttribute("aria-current","page")}},a=i,s=n(0),l=Object(s["a"])(a,r,o,!1,null,null,null);l.options.__file="packages/breadcrumb/src/breadcrumb.vue";var u=l.exports;u.install=function(e){e.component(u.name,u)};t["default"]=u}})},7839:function(e,t){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},"7b0b":function(e,t,n){var r=n("1d80");e.exports=function(e){return Object(r(e))}},"7b3e":function(e,t,n){"use strict";var r,o=n("a3de"); -/** - * Checks if an event is supported in the current execution environment. - * - * NOTE: This will not work correctly for non-generic events such as `change`, - * `reset`, `load`, `error`, and `select`. - * - * Borrows from Modernizr. - * - * @param {string} eventNameSuffix Event name, e.g. "click". - * @param {?boolean} capture Check if the capture phase is supported. - * @return {boolean} True if the event is supported. - * @internal - * @license Modernizr 3.0.0pre (Custom Build) | MIT - */ -function i(e,t){if(!o.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,i=n in document;if(!i){var a=document.createElement("div");a.setAttribute(n,"return;"),i="function"===typeof a[n]}return!i&&r&&"wheel"===e&&(i=document.implementation.hasFeature("Events.wheel","3.0")),i}o.canUseDOM&&(r=document.implementation&&document.implementation.hasFeature&&!0!==document.implementation.hasFeature("","")),e.exports=i},"7bc3":function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=118)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},118:function(e,t,n){"use strict";n.r(t);var r=function(e,t){var n=t._c;return n("div",t._g(t._b({class:[t.data.staticClass,"el-divider","el-divider--"+t.props.direction]},"div",t.data.attrs,!1),t.listeners),[t.slots().default&&"vertical"!==t.props.direction?n("div",{class:["el-divider__text","is-"+t.props.contentPosition]},[t._t("default")],2):t._e()])},o=[];r._withStripped=!0;var i={name:"ElDivider",props:{direction:{type:String,default:"horizontal",validator:function(e){return-1!==["horizontal","vertical"].indexOf(e)}},contentPosition:{type:String,default:"center",validator:function(e){return-1!==["left","center","right"].indexOf(e)}}}},a=i,s=n(0),l=Object(s["a"])(a,r,o,!0,null,null,null);l.options.__file="packages/divider/src/main.vue";var u=l.exports;u.install=function(e){e.component(u.name,u)};t["default"]=u}})},"7c73":function(e,t,n){var r,o=n("825a"),i=n("37e8"),a=n("7839"),s=n("d012"),l=n("1be4"),u=n("cc12"),c=n("f772"),f=">",d="<",p="prototype",h="script",v=c("IE_PROTO"),m=function(){},y=function(e){return d+h+f+e+d+"/"+h+f},g=function(e){e.write(y("")),e.close();var t=e.parentWindow.Object;return e=null,t},b=function(){var e,t=u("iframe"),n="java"+h+":";return t.style.display="none",l.appendChild(t),t.src=String(n),e=t.contentWindow.document,e.open(),e.write(y("document.F=Object")),e.close(),e.F},_=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(t){}_=r?g(r):b();var e=a.length;while(e--)delete _[p][a[e]];return _()};s[v]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(m[p]=o(e),n=new m,m[p]=null,n[v]=e):n=_(),void 0===t?n:i(n,t)}},"7dd0":function(e,t,n){"use strict";var r=n("23e7"),o=n("9ed3"),i=n("e163"),a=n("d2bb"),s=n("d44e"),l=n("9112"),u=n("6eeb"),c=n("b622"),f=n("c430"),d=n("3f8c"),p=n("ae93"),h=p.IteratorPrototype,v=p.BUGGY_SAFARI_ITERATORS,m=c("iterator"),y="keys",g="values",b="entries",_=function(){return this};e.exports=function(e,t,n,c,p,x,w){o(n,t,c);var C,S,O,E=function(e){if(e===p&&T)return T;if(!v&&e in j)return j[e];switch(e){case y:return function(){return new n(this,e)};case g:return function(){return new n(this,e)};case b:return function(){return new n(this,e)}}return function(){return new n(this)}},k=t+" Iterator",$=!1,j=e.prototype,A=j[m]||j["@@iterator"]||p&&j[p],T=!v&&A||E(p),M="Array"==t&&j.entries||A;if(M&&(C=i(M.call(new e)),h!==Object.prototype&&C.next&&(f||i(C)===h||(a?a(C,h):"function"!=typeof C[m]&&l(C,m,_)),s(C,k,!0,!0),f&&(d[k]=_))),p==g&&A&&A.name!==g&&($=!0,T=function(){return A.call(this)}),f&&!w||j[m]===T||l(j,m,T),d[t]=T,p)if(S={values:E(g),keys:x?T:E(y),entries:E(b)},w)for(O in S)(v||$||!(O in j))&&u(j,O,S[O]);else r({target:t,proto:!0,forced:v||$},S);return S}},"7f4d":function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e){for(var t=1,n=arguments.length;t0&&void 0!==arguments[0]?arguments[0]:"";return String(e).replace(/[|\\{}()[\]^$+*?.]/g,"\\$&")};var h=t.arrayFindIndex=function(e,t){for(var n=0;n!==e.length;++n)if(t(e[n]))return n;return-1},v=(t.arrayFind=function(e,t){var n=h(e,t);return-1!==n?e[n]:void 0},t.coerceTruthyValueToArray=function(e){return Array.isArray(e)?e:e?[e]:[]},t.isIE=function(){return!i.default.prototype.$isServer&&!isNaN(Number(document.documentMode))},t.isEdge=function(){return!i.default.prototype.$isServer&&navigator.userAgent.indexOf("Edge")>-1},t.isFirefox=function(){return!i.default.prototype.$isServer&&!!window.navigator.userAgent.match(/firefox/i)},t.autoprefixer=function(e){if("object"!==("undefined"===typeof e?"undefined":r(e)))return e;var t=["transform","transition","animation"],n=["ms-","webkit-"];return t.forEach((function(t){var r=e[t];t&&r&&n.forEach((function(n){e[n+t]=r}))})),e},t.kebabCase=function(e){var t=/([^-])([A-Z])/g;return e.replace(t,"$1-$2").replace(t,"$1-$2").toLowerCase()},t.capitalize=function(e){return(0,a.isString)(e)?e.charAt(0).toUpperCase()+e.slice(1):e},t.looseEqual=function(e,t){var n=(0,a.isObject)(e),r=(0,a.isObject)(t);return n&&r?JSON.stringify(e)===JSON.stringify(t):!n&&!r&&String(e)===String(t)}),m=t.arrayEquals=function(e,t){if(e=e||[],t=t||[],e.length!==t.length)return!1;for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};if(!o.a.prototype.$isServer){if(e=_()({},w,e),"string"===typeof e.target&&(e.target=document.querySelector(e.target)),e.target=e.target||document.body,e.target!==document.body?e.fullscreen=!1:e.body=!0,e.fullscreen&&C)return C;var t=e.body?document.body:e.target,n=new x({el:document.createElement("div"),data:e});return S(e,t,n),"absolute"!==n.originalPosition&&"fixed"!==n.originalPosition&&Object(d["addClass"])(t,"el-loading-parent--relative"),e.fullscreen&&e.lock&&Object(d["addClass"])(t,"el-loading-parent--hidden"),t.appendChild(n.$el),o.a.nextTick((function(){n.visible=!0})),e.fullscreen&&(C=n),n}},E=O;t["default"]={install:function(e){e.use(g),e.prototype.$loading=E},directive:g,service:E}},7:function(e,t){e.exports=n("2b0e")},9:function(e,t){e.exports=n("7f4d")}})},"8bbc":function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=124)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},124:function(e,t,n){"use strict";n.r(t);var r,o,i={name:"ElTag",props:{text:String,closable:Boolean,type:String,hit:Boolean,disableTransitions:Boolean,color:String,size:String,effect:{type:String,default:"light",validator:function(e){return-1!==["dark","light","plain"].indexOf(e)}}},methods:{handleClose:function(e){e.stopPropagation(),this.$emit("close",e)},handleClick:function(e){this.$emit("click",e)}},computed:{tagSize:function(){return this.size||(this.$ELEMENT||{}).size}},render:function(e){var t=this.type,n=this.tagSize,r=this.hit,o=this.effect,i=["el-tag",t?"el-tag--"+t:"",n?"el-tag--"+n:"",o?"el-tag--"+o:"",r&&"is-hit"],a=e("span",{class:i,style:{backgroundColor:this.color},on:{click:this.handleClick}},[this.$slots.default,this.closable&&e("i",{class:"el-tag__close el-icon-close",on:{click:this.handleClose}})]);return this.disableTransitions?a:e("transition",{attrs:{name:"el-zoom-in-center"}},[a])}},a=i,s=n(0),l=Object(s["a"])(a,r,o,!1,null,null,null);l.options.__file="packages/tag/src/tag.vue";var u=l.exports;u.install=function(e){e.component(u.name,u)};t["default"]=u}})},"8c4f":function(e,t,n){"use strict"; -/*! - * vue-router v3.4.9 - * (c) 2020 Evan You - * @license MIT - */function r(e,t){0}function o(e,t){for(var n in t)e[n]=t[n];return e}var i=/[!'()*]/g,a=function(e){return"%"+e.charCodeAt(0).toString(16)},s=/%2C/g,l=function(e){return encodeURIComponent(e).replace(i,a).replace(s,",")};function u(e){try{return decodeURIComponent(e)}catch(t){0}return e}function c(e,t,n){void 0===t&&(t={});var r,o=n||d;try{r=o(e||"")}catch(s){r={}}for(var i in t){var a=t[i];r[i]=Array.isArray(a)?a.map(f):f(a)}return r}var f=function(e){return null==e||"object"===typeof e?e:String(e)};function d(e){var t={};return e=e.trim().replace(/^(\?|#|&)/,""),e?(e.split("&").forEach((function(e){var n=e.replace(/\+/g," ").split("="),r=u(n.shift()),o=n.length>0?u(n.join("=")):null;void 0===t[r]?t[r]=o:Array.isArray(t[r])?t[r].push(o):t[r]=[t[r],o]})),t):t}function p(e){var t=e?Object.keys(e).map((function(t){var n=e[t];if(void 0===n)return"";if(null===n)return l(t);if(Array.isArray(n)){var r=[];return n.forEach((function(e){void 0!==e&&(null===e?r.push(l(t)):r.push(l(t)+"="+l(e)))})),r.join("&")}return l(t)+"="+l(n)})).filter((function(e){return e.length>0})).join("&"):null;return t?"?"+t:""}var h=/\/?$/;function v(e,t,n,r){var o=r&&r.options.stringifyQuery,i=t.query||{};try{i=m(i)}catch(s){}var a={name:t.name||e&&e.name,meta:e&&e.meta||{},path:t.path||"/",hash:t.hash||"",query:i,params:t.params||{},fullPath:b(t,o),matched:e?g(e):[]};return n&&(a.redirectedFrom=b(n,o)),Object.freeze(a)}function m(e){if(Array.isArray(e))return e.map(m);if(e&&"object"===typeof e){var t={};for(var n in e)t[n]=m(e[n]);return t}return e}var y=v(null,{path:"/"});function g(e){var t=[];while(e)t.unshift(e),e=e.parent;return t}function b(e,t){var n=e.path,r=e.query;void 0===r&&(r={});var o=e.hash;void 0===o&&(o="");var i=t||p;return(n||"/")+i(r)+o}function _(e,t){return t===y?e===t:!!t&&(e.path&&t.path?e.path.replace(h,"")===t.path.replace(h,"")&&e.hash===t.hash&&x(e.query,t.query):!(!e.name||!t.name)&&(e.name===t.name&&e.hash===t.hash&&x(e.query,t.query)&&x(e.params,t.params)))}function x(e,t){if(void 0===e&&(e={}),void 0===t&&(t={}),!e||!t)return e===t;var n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((function(n,o){var i=e[n],a=r[o];if(a!==n)return!1;var s=t[n];return null==i||null==s?i===s:"object"===typeof i&&"object"===typeof s?x(i,s):String(i)===String(s)}))}function w(e,t){return 0===e.path.replace(h,"/").indexOf(t.path.replace(h,"/"))&&(!t.hash||e.hash===t.hash)&&C(e.query,t.query)}function C(e,t){for(var n in t)if(!(n in e))return!1;return!0}function S(e){for(var t=0;t=0&&(t=e.slice(r),e=e.slice(0,r));var o=e.indexOf("?");return o>=0&&(n=e.slice(o+1),e=e.slice(0,o)),{path:e,query:n,hash:t}}function A(e){return e.replace(/\/\//g,"/")}var T=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)},M=J,P=I,L=H,N=D,R=Y,F=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function I(e,t){var n,r=[],o=0,i=0,a="",s=t&&t.delimiter||"/";while(null!=(n=F.exec(e))){var l=n[0],u=n[1],c=n.index;if(a+=e.slice(i,c),i=c+l.length,u)a+=u[1];else{var f=e[i],d=n[2],p=n[3],h=n[4],v=n[5],m=n[6],y=n[7];a&&(r.push(a),a="");var g=null!=d&&null!=f&&f!==d,b="+"===m||"*"===m,_="?"===m||"*"===m,x=n[2]||s,w=h||v;r.push({name:p||o++,prefix:d||"",delimiter:x,optional:_,repeat:b,partial:g,asterisk:!!y,pattern:w?V(w):y?".*":"[^"+W(x)+"]+?"})}}return i1||!S.length)return 0===S.length?e():e("span",{},S)}if("a"===this.tag)C.on=x,C.attrs={href:l,"aria-current":g};else{var O=se(this.$slots.default);if(O){O.isStatic=!1;var E=O.data=o({},O.data);for(var k in E.on=E.on||{},E.on){var $=E.on[k];k in x&&(E.on[k]=Array.isArray($)?$:[$])}for(var j in x)j in E.on?E.on[j].push(x[j]):E.on[j]=b;var A=O.data.attrs=o({},O.data.attrs);A.href=l,A["aria-current"]=g}else C.on=x}return e(this.tag,C,this.$slots.default)}};function ae(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&(void 0===e.button||0===e.button)){if(e.currentTarget&&e.currentTarget.getAttribute){var t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function se(e){if(e)for(var t,n=0;n-1&&(s.params[d]=n.params[d]);return s.path=Q(u.path,s.params,'named route "'+l+'"'),c(u,s,a)}if(s.path){s.params={};for(var p=0;p=e.length?n():e[o]?t(e[o],(function(){r(o+1)})):r(o+1)};r(0)}var He={redirected:2,aborted:4,cancelled:8,duplicated:16};function ze(e,t){return Ve(e,t,He.redirected,'Redirected when going from "'+e.fullPath+'" to "'+qe(t)+'" via a navigation guard.')}function Be(e,t){var n=Ve(e,t,He.duplicated,'Avoided redundant navigation to current location: "'+e.fullPath+'".');return n.name="NavigationDuplicated",n}function De(e,t){return Ve(e,t,He.cancelled,'Navigation cancelled from "'+e.fullPath+'" to "'+t.fullPath+'" with a new navigation.')}function We(e,t){return Ve(e,t,He.aborted,'Navigation aborted from "'+e.fullPath+'" to "'+t.fullPath+'" via a navigation guard.')}function Ve(e,t,n,r){var o=new Error(r);return o._isRouter=!0,o.from=e,o.to=t,o.type=n,o}var Ue=["params","query","hash"];function qe(e){if("string"===typeof e)return e;if("path"in e)return e.path;var t={};return Ue.forEach((function(n){n in e&&(t[n]=e[n])})),JSON.stringify(t,null,2)}function Ke(e){return Object.prototype.toString.call(e).indexOf("Error")>-1}function Ge(e,t){return Ke(e)&&e._isRouter&&(null==t||e.type===t)}function Xe(e){return function(t,n,r){var o=!1,i=0,a=null;Ye(e,(function(e,t,n,s){if("function"===typeof e&&void 0===e.cid){o=!0,i++;var l,u=et((function(t){Qe(t)&&(t=t.default),e.resolved="function"===typeof t?t:te.extend(t),n.components[s]=t,i--,i<=0&&r()})),c=et((function(e){var t="Failed to resolve async component "+s+": "+e;a||(a=Ke(e)?e:new Error(t),r(a))}));try{l=e(u,c)}catch(d){c(d)}if(l)if("function"===typeof l.then)l.then(u,c);else{var f=l.component;f&&"function"===typeof f.then&&f.then(u,c)}}})),o||r()}}function Ye(e,t){return Je(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function Je(e){return Array.prototype.concat.apply([],e)}var Ze="function"===typeof Symbol&&"symbol"===typeof Symbol.toStringTag;function Qe(e){return e.__esModule||Ze&&"Module"===e[Symbol.toStringTag]}function et(e){var t=!1;return function(){var n=[],r=arguments.length;while(r--)n[r]=arguments[r];if(!t)return t=!0,e.apply(this,n)}}var tt=function(e,t){this.router=e,this.base=nt(t),this.current=y,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function nt(e){if(!e)if(ue){var t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^https?:\/\/[^\/]+/,"")}else e="/";return"/"!==e.charAt(0)&&(e="/"+e),e.replace(/\/$/,"")}function rt(e,t){var n,r=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,r=Ne&&n;r&&this.listeners.push(Ce());var o=function(){var n=e.current,o=dt(e.base);e.current===y&&o===e._startLocation||e.transitionTo(o,(function(e){r&&Se(t,e,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var r=this,o=this,i=o.current;this.transitionTo(e,(function(e){Re(A(r.base+e.fullPath)),Se(r.router,e,i,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this,i=o.current;this.transitionTo(e,(function(e){Fe(A(r.base+e.fullPath)),Se(r.router,e,i,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(dt(this.base)!==this.current.fullPath){var t=A(this.base+this.current.fullPath);e?Re(t):Fe(t)}},t.prototype.getCurrentLocation=function(){return dt(this.base)},t}(tt);function dt(e){var t=window.location.pathname;return e&&0===t.toLowerCase().indexOf(e.toLowerCase())&&(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var pt=function(e){function t(t,n,r){e.call(this,t,n),r&&ht(this.base)||vt()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router,n=t.options.scrollBehavior,r=Ne&&n;r&&this.listeners.push(Ce());var o=function(){var t=e.current;vt()&&e.transitionTo(mt(),(function(n){r&&Se(e.router,n,t,!0),Ne||bt(n.fullPath)}))},i=Ne?"popstate":"hashchange";window.addEventListener(i,o),this.listeners.push((function(){window.removeEventListener(i,o)}))}},t.prototype.push=function(e,t,n){var r=this,o=this,i=o.current;this.transitionTo(e,(function(e){gt(e.fullPath),Se(r.router,e,i,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this,i=o.current;this.transitionTo(e,(function(e){bt(e.fullPath),Se(r.router,e,i,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;mt()!==t&&(e?gt(t):bt(t))},t.prototype.getCurrentLocation=function(){return mt()},t}(tt);function ht(e){var t=dt(e);if(!/^\/#/.test(t))return window.location.replace(A(e+"/#"+t)),!0}function vt(){var e=mt();return"/"===e.charAt(0)||(bt("/"+e),!1)}function mt(){var e=window.location.href,t=e.indexOf("#");return t<0?"":(e=e.slice(t+1),e)}function yt(e){var t=window.location.href,n=t.indexOf("#"),r=n>=0?t.slice(0,n):t;return r+"#"+e}function gt(e){Ne?Re(yt(e)):window.location.hash=e}function bt(e){Ne?Fe(yt(e)):window.location.replace(yt(e))}var _t=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index+1).concat(e),r.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var e=t.current;t.index=n,t.updateRoute(r),t.router.afterHooks.forEach((function(t){t&&t(r,e)}))}),(function(e){Ge(e,He.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(tt),xt=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=he(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!Ne&&!1!==e.fallback,this.fallback&&(t="hash"),ue||(t="abstract"),this.mode=t,t){case"history":this.history=new ft(this,e.base);break;case"hash":this.history=new pt(this,e.base,this.fallback);break;case"abstract":this.history=new _t(this,e.base);break;default:0}},wt={currentRoute:{configurable:!0}};function Ct(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}function St(e,t,n){var r="hash"===n?"#"+t:t;return e?A(e+"/"+r):r}xt.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},wt.currentRoute.get=function(){return this.history&&this.history.current},xt.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof ft||n instanceof pt){var r=function(e){var r=n.current,o=t.options.scrollBehavior,i=Ne&&o;i&&"fullPath"in e&&Se(t,e,r,!1)},o=function(e){n.setupListeners(),r(e)};n.transitionTo(n.getCurrentLocation(),o,o)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},xt.prototype.beforeEach=function(e){return Ct(this.beforeHooks,e)},xt.prototype.beforeResolve=function(e){return Ct(this.resolveHooks,e)},xt.prototype.afterEach=function(e){return Ct(this.afterHooks,e)},xt.prototype.onReady=function(e,t){this.history.onReady(e,t)},xt.prototype.onError=function(e){this.history.onError(e)},xt.prototype.push=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!==typeof Promise)return new Promise((function(t,n){r.history.push(e,t,n)}));this.history.push(e,t,n)},xt.prototype.replace=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!==typeof Promise)return new Promise((function(t,n){r.history.replace(e,t,n)}));this.history.replace(e,t,n)},xt.prototype.go=function(e){this.history.go(e)},xt.prototype.back=function(){this.go(-1)},xt.prototype.forward=function(){this.go(1)},xt.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},xt.prototype.resolve=function(e,t,n){t=t||this.history.current;var r=ee(e,t,n,this),o=this.match(r,t),i=o.redirectedFrom||o.fullPath,a=this.history.base,s=St(a,i,this.mode);return{location:r,route:o,href:s,normalizedTo:r,resolved:o}},xt.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==y&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(xt.prototype,wt),xt.install=le,xt.version="3.4.9",xt.isNavigationFailure=Ge,xt.NavigationFailureType=He,ue&&window.Vue&&window.Vue.use(xt),t["a"]=xt},"8eb7":function(e,t){var n,r,o,i,a,s,l,u,c,f,d,p,h,v,m,y=!1;function g(){if(!y){y=!0;var e=navigator.userAgent,t=/(?:MSIE.(\d+\.\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\d+\.\d+))|(?:Opera(?:.+Version.|.)(\d+\.\d+))|(?:AppleWebKit.(\d+(?:\.\d+)?))|(?:Trident\/\d+\.\d+.*rv:(\d+\.\d+))/.exec(e),g=/(Mac OS X)|(Windows)|(Linux)/.exec(e);if(p=/\b(iPhone|iP[ao]d)/.exec(e),h=/\b(iP[ao]d)/.exec(e),f=/Android/i.exec(e),v=/FBAN\/\w+;/i.exec(e),m=/Mobile/i.exec(e),d=!!/Win64/.exec(e),t){n=t[1]?parseFloat(t[1]):t[5]?parseFloat(t[5]):NaN,n&&document&&document.documentMode&&(n=document.documentMode);var b=/(?:Trident\/(\d+.\d+))/.exec(e);s=b?parseFloat(b[1])+4:n,r=t[2]?parseFloat(t[2]):NaN,o=t[3]?parseFloat(t[3]):NaN,i=t[4]?parseFloat(t[4]):NaN,i?(t=/(?:Chrome\/(\d+\.\d+))/.exec(e),a=t&&t[1]?parseFloat(t[1]):NaN):a=NaN}else n=r=o=a=i=NaN;if(g){if(g[1]){var _=/(?:Mac OS X (\d+(?:[._]\d+)?))/.exec(e);l=!_||parseFloat(_[1].replace("_","."))}else l=!1;u=!!g[2],c=!!g[3]}else l=u=c=!1}}var b={ie:function(){return g()||n},ieCompatibilityMode:function(){return g()||s>n},ie64:function(){return b.ie()&&d},firefox:function(){return g()||r},opera:function(){return g()||o},webkit:function(){return g()||i},safari:function(){return b.webkit()},chrome:function(){return g()||a},windows:function(){return g()||u},osx:function(){return g()||l},linux:function(){return g()||c},iphone:function(){return g()||p},mobile:function(){return g()||p||h||f||m},nativeApp:function(){return g()||v},android:function(){return g()||f},ipad:function(){return g()||h}};e.exports=b},"8f24":function(e,t,n){},"90e3":function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++n+r).toString(36)}},9112:function(e,t,n){var r=n("83ab"),o=n("9bf2"),i=n("5c6c");e.exports=r?function(e,t,n){return o.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},"94ca":function(e,t,n){var r=n("d039"),o=/#|\.prototype\./,i=function(e,t){var n=s[a(e)];return n==u||n!=l&&("function"==typeof t?r(t):!!t)},a=i.normalize=function(e){return String(e).replace(o,".").toLowerCase()},s=i.data={},l=i.NATIVE="N",u=i.POLYFILL="P";e.exports=i},9619:function(e,t,n){var r=n("597f"),o=n("0e15");e.exports={throttle:r,debounce:o}},"9bdd":function(e,t,n){var r=n("825a");e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(a){var i=e["return"];throw void 0!==i&&r(i.call(e)),a}}},"9bf2":function(e,t,n){var r=n("83ab"),o=n("0cfb"),i=n("825a"),a=n("c04e"),s=Object.defineProperty;t.f=r?s:function(e,t,n){if(i(e),t=a(t,!0),i(n),o)try{return s(e,t,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},"9d7e":function(e,t,n){"use strict";t.__esModule=!0;var r="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.default=function(e){function t(e){for(var t=arguments.length,n=Array(t>1?t-1:0),a=1;a0?r:n)(e)}},a742:function(e,t,n){"use strict";function r(e){return"[object String]"===Object.prototype.toString.call(e)}function o(e){return"[object Object]"===Object.prototype.toString.call(e)}function i(e){return e&&e.nodeType===Node.ELEMENT_NODE}t.__esModule=!0,t.isString=r,t.isObject=o,t.isHtmlElement=i;t.isFunction=function(e){var t={};return e&&"[object Function]"===t.toString.call(e)},t.isUndefined=function(e){return void 0===e},t.isDefined=function(e){return void 0!==e&&null!==e}},a79d:function(e,t,n){"use strict";var r=n("23e7"),o=n("c430"),i=n("fea9"),a=n("d039"),s=n("d066"),l=n("4840"),u=n("cdf9"),c=n("6eeb"),f=!!i&&a((function(){i.prototype["finally"].call({then:function(){}},(function(){}))}));r({target:"Promise",proto:!0,real:!0,forced:f},{finally:function(e){var t=l(this,s("Promise")),n="function"==typeof e;return this.then(n?function(n){return u(t,e()).then((function(){return n}))}:e,n?function(n){return u(t,e()).then((function(){throw n}))}:e)}}),o||"function"!=typeof i||i.prototype["finally"]||c(i.prototype,"finally",s("Promise").prototype["finally"])},ad41:function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=56)}([function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},,function(e,t){e.exports=n("5924")},function(e,t){e.exports=n("8122")},,function(e,t){e.exports=n("e974")},function(e,t){e.exports=n("6b7c")},function(e,t){e.exports=n("2b0e")},function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"i",(function(){return s})),n.d(t,"d",(function(){return l})),n.d(t,"e",(function(){return u})),n.d(t,"c",(function(){return c})),n.d(t,"g",(function(){return f})),n.d(t,"f",(function(){return d})),n.d(t,"h",(function(){return h})),n.d(t,"l",(function(){return v})),n.d(t,"k",(function(){return m})),n.d(t,"j",(function(){return y})),n.d(t,"a",(function(){return g})),n.d(t,"m",(function(){return b})),n.d(t,"n",(function(){return _}));var r=n(3),o="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=function(e){var t=e.target;while(t&&"HTML"!==t.tagName.toUpperCase()){if("TD"===t.tagName.toUpperCase())return t;t=t.parentNode}return null},a=function(e){return null!==e&&"object"===("undefined"===typeof e?"undefined":o(e))},s=function(e,t,n,o,i){if(!t&&!o&&(!i||Array.isArray(i)&&!i.length))return e;n="string"===typeof n?"descending"===n?-1:1:n&&n<0?-1:1;var s=o?null:function(n,o){return i?(Array.isArray(i)||(i=[i]),i.map((function(t){return"string"===typeof t?Object(r["getValueByPath"])(n,t):t(n,o,e)}))):("$key"!==t&&a(n)&&"$value"in n&&(n=n.$value),[a(n)?Object(r["getValueByPath"])(n,t):n])},l=function(e,t){if(o)return o(e.value,t.value);for(var n=0,r=e.key.length;nt.key[n])return 1}return 0};return e.map((function(e,t){return{value:e,index:t,key:s?s(e,t):null}})).sort((function(e,t){var r=l(e,t);return r||(r=e.index-t.index),r*n})).map((function(e){return e.value}))},l=function(e,t){var n=null;return e.columns.forEach((function(e){e.id===t&&(n=e)})),n},u=function(e,t){for(var n=null,r=0;r2&&void 0!==arguments[2]?arguments[2]:"children",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"hasChildren",o=function(e){return!(Array.isArray(e)&&e.length)};function i(e,a,s){t(e,a,s),a.forEach((function(e){if(e[r])t(e,null,s+1);else{var a=e[n];o(a)||i(e,a,s+1)}}))}e.forEach((function(e){if(e[r])t(e,null,0);else{var a=e[n];o(a)||i(e,a,0)}}))}},function(e,t){e.exports=n("7f4d")},,function(e,t){e.exports=n("2bb5")},function(e,t){e.exports=n("417f")},,function(e,t){e.exports=n("14e9")},function(e,t){e.exports=n("5128")},function(e,t){e.exports=n("4010")},function(e,t){e.exports=n("0e15")},function(e,t){e.exports=n("dcdc")},,,,,,,,,,,function(e,t){e.exports=n("299c")},,,,,,,,,,function(e,t){e.exports=n("e62d")},function(e,t){e.exports=n("7fc1")},,,function(e,t){e.exports=n("9619")},,,function(e,t){e.exports=n("c098")},,,,,,,,,,function(e,t,n){"use strict";n.r(t);var r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"el-table",class:[{"el-table--fit":e.fit,"el-table--striped":e.stripe,"el-table--border":e.border||e.isGroup,"el-table--hidden":e.isHidden,"el-table--group":e.isGroup,"el-table--fluid-height":e.maxHeight,"el-table--scrollable-x":e.layout.scrollX,"el-table--scrollable-y":e.layout.scrollY,"el-table--enable-row-hover":!e.store.states.isComplex,"el-table--enable-row-transition":0!==(e.store.states.data||[]).length&&(e.store.states.data||[]).length<100},e.tableSize?"el-table--"+e.tableSize:""],on:{mouseleave:function(t){e.handleMouseLeave(t)}}},[n("div",{ref:"hiddenColumns",staticClass:"hidden-columns"},[e._t("default")],2),e.showHeader?n("div",{directives:[{name:"mousewheel",rawName:"v-mousewheel",value:e.handleHeaderFooterMousewheel,expression:"handleHeaderFooterMousewheel"}],ref:"headerWrapper",staticClass:"el-table__header-wrapper"},[n("table-header",{ref:"tableHeader",style:{width:e.layout.bodyWidth?e.layout.bodyWidth+"px":""},attrs:{store:e.store,border:e.border,"default-sort":e.defaultSort}})],1):e._e(),n("div",{ref:"bodyWrapper",staticClass:"el-table__body-wrapper",class:[e.layout.scrollX?"is-scrolling-"+e.scrollPosition:"is-scrolling-none"],style:[e.bodyHeight]},[n("table-body",{style:{width:e.bodyWidth},attrs:{context:e.context,store:e.store,stripe:e.stripe,"row-class-name":e.rowClassName,"row-style":e.rowStyle,highlight:e.highlightCurrentRow}}),e.data&&0!==e.data.length?e._e():n("div",{ref:"emptyBlock",staticClass:"el-table__empty-block",style:e.emptyBlockStyle},[n("span",{staticClass:"el-table__empty-text"},[e._t("empty",[e._v(e._s(e.emptyText||e.t("el.table.emptyText")))])],2)]),e.$slots.append?n("div",{ref:"appendWrapper",staticClass:"el-table__append-wrapper"},[e._t("append")],2):e._e()],1),e.showSummary?n("div",{directives:[{name:"show",rawName:"v-show",value:e.data&&e.data.length>0,expression:"data && data.length > 0"},{name:"mousewheel",rawName:"v-mousewheel",value:e.handleHeaderFooterMousewheel,expression:"handleHeaderFooterMousewheel"}],ref:"footerWrapper",staticClass:"el-table__footer-wrapper"},[n("table-footer",{style:{width:e.layout.bodyWidth?e.layout.bodyWidth+"px":""},attrs:{store:e.store,border:e.border,"sum-text":e.sumText||e.t("el.table.sumText"),"summary-method":e.summaryMethod,"default-sort":e.defaultSort}})],1):e._e(),e.fixedColumns.length>0?n("div",{directives:[{name:"mousewheel",rawName:"v-mousewheel",value:e.handleFixedMousewheel,expression:"handleFixedMousewheel"}],ref:"fixedWrapper",staticClass:"el-table__fixed",style:[{width:e.layout.fixedWidth?e.layout.fixedWidth+"px":""},e.fixedHeight]},[e.showHeader?n("div",{ref:"fixedHeaderWrapper",staticClass:"el-table__fixed-header-wrapper"},[n("table-header",{ref:"fixedTableHeader",style:{width:e.bodyWidth},attrs:{fixed:"left",border:e.border,store:e.store}})],1):e._e(),n("div",{ref:"fixedBodyWrapper",staticClass:"el-table__fixed-body-wrapper",style:[{top:e.layout.headerHeight+"px"},e.fixedBodyHeight]},[n("table-body",{style:{width:e.bodyWidth},attrs:{fixed:"left",store:e.store,stripe:e.stripe,highlight:e.highlightCurrentRow,"row-class-name":e.rowClassName,"row-style":e.rowStyle}}),e.$slots.append?n("div",{staticClass:"el-table__append-gutter",style:{height:e.layout.appendHeight+"px"}}):e._e()],1),e.showSummary?n("div",{directives:[{name:"show",rawName:"v-show",value:e.data&&e.data.length>0,expression:"data && data.length > 0"}],ref:"fixedFooterWrapper",staticClass:"el-table__fixed-footer-wrapper"},[n("table-footer",{style:{width:e.bodyWidth},attrs:{fixed:"left",border:e.border,"sum-text":e.sumText||e.t("el.table.sumText"),"summary-method":e.summaryMethod,store:e.store}})],1):e._e()]):e._e(),e.rightFixedColumns.length>0?n("div",{directives:[{name:"mousewheel",rawName:"v-mousewheel",value:e.handleFixedMousewheel,expression:"handleFixedMousewheel"}],ref:"rightFixedWrapper",staticClass:"el-table__fixed-right",style:[{width:e.layout.rightFixedWidth?e.layout.rightFixedWidth+"px":"",right:e.layout.scrollY?(e.border?e.layout.gutterWidth:e.layout.gutterWidth||0)+"px":""},e.fixedHeight]},[e.showHeader?n("div",{ref:"rightFixedHeaderWrapper",staticClass:"el-table__fixed-header-wrapper"},[n("table-header",{ref:"rightFixedTableHeader",style:{width:e.bodyWidth},attrs:{fixed:"right",border:e.border,store:e.store}})],1):e._e(),n("div",{ref:"rightFixedBodyWrapper",staticClass:"el-table__fixed-body-wrapper",style:[{top:e.layout.headerHeight+"px"},e.fixedBodyHeight]},[n("table-body",{style:{width:e.bodyWidth},attrs:{fixed:"right",store:e.store,stripe:e.stripe,"row-class-name":e.rowClassName,"row-style":e.rowStyle,highlight:e.highlightCurrentRow}}),e.$slots.append?n("div",{staticClass:"el-table__append-gutter",style:{height:e.layout.appendHeight+"px"}}):e._e()],1),e.showSummary?n("div",{directives:[{name:"show",rawName:"v-show",value:e.data&&e.data.length>0,expression:"data && data.length > 0"}],ref:"rightFixedFooterWrapper",staticClass:"el-table__fixed-footer-wrapper"},[n("table-footer",{style:{width:e.bodyWidth},attrs:{fixed:"right",border:e.border,"sum-text":e.sumText||e.t("el.table.sumText"),"summary-method":e.summaryMethod,store:e.store}})],1):e._e()]):e._e(),e.rightFixedColumns.length>0?n("div",{ref:"rightFixedPatch",staticClass:"el-table__fixed-right-patch",style:{width:e.layout.scrollY?e.layout.gutterWidth+"px":"0",height:e.layout.headerHeight+"px"}}):e._e(),n("div",{directives:[{name:"show",rawName:"v-show",value:e.resizeProxyVisible,expression:"resizeProxyVisible"}],ref:"resizeProxy",staticClass:"el-table__column-resize-proxy"})])},o=[];r._withStripped=!0;var i=n(18),a=n.n(i),s=n(43),l=n(16),u=n(46),c=n.n(u),f="undefined"!==typeof navigator&&navigator.userAgent.toLowerCase().indexOf("firefox")>-1,d=function(e,t){e&&e.addEventListener&&e.addEventListener(f?"DOMMouseScroll":"mousewheel",(function(e){var n=c()(e);t&&t.apply(this,[e,n])}))},p={bind:function(e,t){d(e,t.value)}},h=n(6),v=n.n(h),m=n(11),y=n.n(m),g=n(7),b=n.n(g),_=n(9),x=n.n(_),w=n(8),C={data:function(){return{states:{defaultExpandAll:!1,expandRows:[]}}},methods:{updateExpandRows:function(){var e=this.states,t=e.data,n=void 0===t?[]:t,r=e.rowKey,o=e.defaultExpandAll,i=e.expandRows;if(o)this.states.expandRows=n.slice();else if(r){var a=Object(w["f"])(i,r);this.states.expandRows=n.reduce((function(e,t){var n=Object(w["g"])(t,r),o=a[n];return o&&e.push(t),e}),[])}else this.states.expandRows=[]},toggleRowExpansion:function(e,t){var n=Object(w["m"])(this.states.expandRows,e,t);n&&(this.table.$emit("expand-change",e,this.states.expandRows.slice()),this.scheduleLayout())},setExpandRowKeys:function(e){this.assertRowKey();var t=this.states,n=t.data,r=t.rowKey,o=Object(w["f"])(n,r);this.states.expandRows=e.reduce((function(e,t){var n=o[t];return n&&e.push(n.row),e}),[])},isRowExpanded:function(e){var t=this.states,n=t.expandRows,r=void 0===n?[]:n,o=t.rowKey;if(o){var i=Object(w["f"])(r,o);return!!i[Object(w["g"])(e,o)]}return-1!==r.indexOf(e)}}},S=n(3),O={data:function(){return{states:{_currentRowKey:null,currentRow:null}}},methods:{setCurrentRowKey:function(e){this.assertRowKey(),this.states._currentRowKey=e,this.setCurrentRowByKey(e)},restoreCurrentRowKey:function(){this.states._currentRowKey=null},setCurrentRowByKey:function(e){var t=this.states,n=t.data,r=void 0===n?[]:n,o=t.rowKey,i=null;o&&(i=Object(S["arrayFind"])(r,(function(t){return Object(w["g"])(t,o)===e}))),t.currentRow=i},updateCurrentRow:function(e){var t=this.states,n=this.table,r=t.currentRow;if(e&&e!==r)return t.currentRow=e,void n.$emit("current-change",e,r);!e&&r&&(t.currentRow=null,n.$emit("current-change",null,r))},updateCurrentRowData:function(){var e=this.states,t=this.table,n=e.rowKey,r=e._currentRowKey,o=e.data||[],i=e.currentRow;if(-1===o.indexOf(i)&&i){if(n){var a=Object(w["g"])(i,n);this.setCurrentRowByKey(a)}else e.currentRow=null;null===e.currentRow&&t.$emit("current-change",null,i)}else r&&(this.setCurrentRowByKey(r),this.restoreCurrentRowKey())}}},E=Object.assign||function(e){for(var t=1;t0&&t[0]&&"selection"===t[0].type&&!t[0].fixed&&(t[0].fixed=!0,e.fixedColumns.unshift(t[0]));var n=t.filter((function(e){return!e.fixed}));e.originColumns=[].concat(e.fixedColumns).concat(n).concat(e.rightFixedColumns);var r=j(n),o=j(e.fixedColumns),i=j(e.rightFixedColumns);e.leafColumnsLength=r.length,e.fixedLeafColumnsLength=o.length,e.rightFixedLeafColumnsLength=i.length,e.columns=[].concat(o).concat(r).concat(i),e.isComplex=e.fixedColumns.length>0||e.rightFixedColumns.length>0},scheduleLayout:function(e){e&&this.updateColumns(),this.table.debouncedUpdateLayout()},isSelected:function(e){var t=this.states.selection,n=void 0===t?[]:t;return n.indexOf(e)>-1},clearSelection:function(){var e=this.states;e.isAllSelected=!1;var t=e.selection;t.length&&(e.selection=[],this.table.$emit("selection-change",[]))},cleanSelection:function(){var e=this.states,t=e.data,n=e.rowKey,r=e.selection,o=void 0;if(n){o=[];var i=Object(w["f"])(r,n),a=Object(w["f"])(t,n);for(var s in i)i.hasOwnProperty(s)&&!a[s]&&o.push(i[s].row)}else o=r.filter((function(e){return-1===t.indexOf(e)}));if(o.length){var l=r.filter((function(e){return-1===o.indexOf(e)}));e.selection=l,this.table.$emit("selection-change",l.slice())}},toggleRowSelection:function(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r=Object(w["m"])(this.states.selection,e,t);if(r){var o=(this.states.selection||[]).slice();n&&this.table.$emit("select",o,e),this.table.$emit("selection-change",o)}},_toggleAllSelection:function(){var e=this.states,t=e.data,n=void 0===t?[]:t,r=e.selection,o=e.selectOnIndeterminate?!e.isAllSelected:!(e.isAllSelected||r.length);e.isAllSelected=o;var i=!1;n.forEach((function(t,n){e.selectable?e.selectable.call(null,t,n)&&Object(w["m"])(r,t,o)&&(i=!0):Object(w["m"])(r,t,o)&&(i=!0)})),i&&this.table.$emit("selection-change",r?r.slice():[]),this.table.$emit("select-all",r)},updateSelectionByRowKey:function(){var e=this.states,t=e.selection,n=e.rowKey,r=e.data,o=Object(w["f"])(t,n);r.forEach((function(e){var r=Object(w["g"])(e,n),i=o[r];i&&(t[i.index]=e)}))},updateAllSelected:function(){var e=this.states,t=e.selection,n=e.rowKey,r=e.selectable,o=e.data||[];if(0!==o.length){var i=void 0;n&&(i=Object(w["f"])(t,n));for(var a=function(e){return i?!!i[Object(w["g"])(e,n)]:-1!==t.indexOf(e)},s=!0,l=0,u=0,c=o.length;u1?n-1:0),o=1;o1&&void 0!==arguments[1]?arguments[1]:{};if(!e)throw new Error("Table is required.");var n=new T;return n.table=e,n.toggleAllSelection=P()(10,n._toggleAllSelection),Object.keys(t).forEach((function(e){n.states[e]=t[e]})),n}function N(e){var t={};return Object.keys(e).forEach((function(n){var r=e[n],o=void 0;"string"===typeof r?o=function(){return this.store.states[r]}:"function"===typeof r?o=function(){return r.call(this,this.store.states)}:console.error("invalid value type"),o&&(t[n]=o)})),t}var R=n(39),F=n.n(R);function I(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var H=function(){function e(t){for(var n in I(this,e),this.observers=[],this.table=null,this.store=null,this.columns=null,this.fit=!0,this.showHeader=!0,this.height=null,this.scrollX=!1,this.scrollY=!1,this.bodyWidth=null,this.fixedWidth=null,this.rightFixedWidth=null,this.tableHeight=null,this.headerHeight=44,this.appendHeight=0,this.footerHeight=44,this.viewportHeight=null,this.bodyHeight=null,this.fixedBodyHeight=null,this.gutterWidth=F()(),t)t.hasOwnProperty(n)&&(this[n]=t[n]);if(!this.table)throw new Error("table is required for Table Layout");if(!this.store)throw new Error("store is required for Table Layout")}return e.prototype.updateScrollY=function(){var e=this.height;if(null===e)return!1;var t=this.table.bodyWrapper;if(this.table.$el&&t){var n=t.querySelector(".el-table__body"),r=this.scrollY,o=n.offsetHeight>this.bodyHeight;return this.scrollY=o,r!==o}return!1},e.prototype.setHeight=function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"height";if(!b.a.prototype.$isServer){var r=this.table.$el;if(e=Object(w["j"])(e),this.height=e,!r&&(e||0===e))return b.a.nextTick((function(){return t.setHeight(e,n)}));"number"===typeof e?(r.style[n]=e+"px",this.updateElsHeight()):"string"===typeof e&&(r.style[n]=e,this.updateElsHeight())}},e.prototype.setMaxHeight=function(e){this.setHeight(e,"max-height")},e.prototype.getFlattenColumns=function(){var e=[],t=this.table.columns;return t.forEach((function(t){t.isColumnGroup?e.push.apply(e,t.columns):e.push(t)})),e},e.prototype.updateElsHeight=function(){var e=this;if(!this.table.$ready)return b.a.nextTick((function(){return e.updateElsHeight()}));var t=this.table.$refs,n=t.headerWrapper,r=t.appendWrapper,o=t.footerWrapper;if(this.appendHeight=r?r.offsetHeight:0,!this.showHeader||n){var i=n?n.querySelector(".el-table__header tr"):null,a=this.headerDisplayNone(i),s=this.headerHeight=this.showHeader?n.offsetHeight:0;if(this.showHeader&&!a&&n.offsetWidth>0&&(this.table.columns||[]).length>0&&s<2)return b.a.nextTick((function(){return e.updateElsHeight()}));var l=this.tableHeight=this.table.$el.clientHeight,u=this.footerHeight=o?o.offsetHeight:0;null!==this.height&&(this.bodyHeight=l-s-u+(o?1:0)),this.fixedBodyHeight=this.scrollX?this.bodyHeight-this.gutterWidth:this.bodyHeight;var c=!(this.store.states.data&&this.store.states.data.length);this.viewportHeight=this.scrollX?l-(c?0:this.gutterWidth):l,this.updateScrollY(),this.notifyObservers("scrollable")}},e.prototype.headerDisplayNone=function(e){if(!e)return!0;var t=e;while("DIV"!==t.tagName){if("none"===getComputedStyle(t).display)return!0;t=t.parentElement}return!1},e.prototype.updateColumnsWidth=function(){if(!b.a.prototype.$isServer){var e=this.fit,t=this.table.$el.clientWidth,n=0,r=this.getFlattenColumns(),o=r.filter((function(e){return"number"!==typeof e.width}));if(r.forEach((function(e){"number"===typeof e.width&&e.realWidth&&(e.realWidth=null)})),o.length>0&&e){r.forEach((function(e){n+=e.width||e.minWidth||80}));var i=this.scrollY?this.gutterWidth:0;if(n<=t-i){this.scrollX=!1;var a=t-i-n;if(1===o.length)o[0].realWidth=(o[0].minWidth||80)+a;else{var s=o.reduce((function(e,t){return e+(t.minWidth||80)}),0),l=a/s,u=0;o.forEach((function(e,t){if(0!==t){var n=Math.floor((e.minWidth||80)*l);u+=n,e.realWidth=(e.minWidth||80)+n}})),o[0].realWidth=(o[0].minWidth||80)+a-u}}else this.scrollX=!0,o.forEach((function(e){e.realWidth=e.minWidth}));this.bodyWidth=Math.max(n,t),this.table.resizeState.width=this.bodyWidth}else r.forEach((function(e){e.width||e.minWidth?e.realWidth=e.width||e.minWidth:e.realWidth=80,n+=e.realWidth})),this.scrollX=n>t,this.bodyWidth=n;var c=this.store.states.fixedColumns;if(c.length>0){var f=0;c.forEach((function(e){f+=e.realWidth||e.width})),this.fixedWidth=f}var d=this.store.states.rightFixedColumns;if(d.length>0){var p=0;d.forEach((function(e){p+=e.realWidth||e.width})),this.rightFixedWidth=p}this.notifyObservers("columns")}},e.prototype.addObserver=function(e){this.observers.push(e)},e.prototype.removeObserver=function(e){var t=this.observers.indexOf(e);-1!==t&&this.observers.splice(t,1)},e.prototype.notifyObservers=function(e){var t=this,n=this.observers;n.forEach((function(n){switch(e){case"columns":n.onColumnsChange(t);break;case"scrollable":n.onScrollableChange(t);break;default:throw new Error("Table Layout don't have event "+e+".")}}))},e}(),z=H,B=n(2),D=n(29),W=n.n(D),V={created:function(){this.tableLayout.addObserver(this)},destroyed:function(){this.tableLayout.removeObserver(this)},computed:{tableLayout:function(){var e=this.layout;if(!e&&this.table&&(e=this.table.layout),!e)throw new Error("Can not find table layout.");return e}},mounted:function(){this.onColumnsChange(this.tableLayout),this.onScrollableChange(this.tableLayout)},updated:function(){this.__updated__||(this.onColumnsChange(this.tableLayout),this.onScrollableChange(this.tableLayout),this.__updated__=!0)},methods:{onColumnsChange:function(e){var t=this.$el.querySelectorAll("colgroup > col");if(t.length){var n=e.getFlattenColumns(),r={};n.forEach((function(e){r[e.id]=e}));for(var o=0,i=t.length;o col[name=gutter]"),n=0,r=t.length;n=this.leftFixedLeafCount:"right"===this.fixed?e=this.columnsCount-this.rightFixedLeafCount},getSpan:function(e,t,n,r){var o=1,i=1,a=this.table.spanMethod;if("function"===typeof a){var s=a({row:e,column:t,rowIndex:n,columnIndex:r});Array.isArray(s)?(o=s[0],i=s[1]):"object"===("undefined"===typeof s?"undefined":U(s))&&(o=s.rowspan,i=s.colspan)}return{rowspan:o,colspan:i}},getRowStyle:function(e,t){var n=this.table.rowStyle;return"function"===typeof n?n.call(null,{row:e,rowIndex:t}):n||null},getRowClass:function(e,t){var n=["el-table__row"];this.table.highlightCurrentRow&&e===this.store.states.currentRow&&n.push("current-row"),this.stripe&&t%2===1&&n.push("el-table__row--striped");var r=this.table.rowClassName;return"string"===typeof r?n.push(r):"function"===typeof r&&n.push(r.call(null,{row:e,rowIndex:t})),this.store.states.expandRows.indexOf(e)>-1&&n.push("expanded"),n},getCellStyle:function(e,t,n,r){var o=this.table.cellStyle;return"function"===typeof o?o.call(null,{rowIndex:e,columnIndex:t,row:n,column:r}):o},getCellClass:function(e,t,n,r){var o=[r.id,r.align,r.className];this.isColumnHidden(t)&&o.push("is-hidden");var i=this.table.cellClassName;return"string"===typeof i?o.push(i):"function"===typeof i&&o.push(i.call(null,{rowIndex:e,columnIndex:t,row:n,column:r})),o.join(" ")},getColspanRealWidth:function(e,t,n){if(t<1)return e[n].realWidth;var r=e.map((function(e){var t=e.realWidth;return t})).slice(n,n+t);return r.reduce((function(e,t){return e+t}),-1)},handleCellMouseEnter:function(e,t){var n=this.table,r=Object(w["b"])(e);if(r){var o=Object(w["c"])(n,r),i=n.hoverState={cell:r,column:o,row:t};n.$emit("cell-mouse-enter",i.row,i.column,i.cell,e)}var a=e.target.querySelector(".cell");if(Object(B["hasClass"])(a,"el-tooltip")&&a.childNodes.length){var s=document.createRange();s.setStart(a,0),s.setEnd(a,a.childNodes.length);var l=s.getBoundingClientRect().width,u=(parseInt(Object(B["getStyle"])(a,"paddingLeft"),10)||0)+(parseInt(Object(B["getStyle"])(a,"paddingRight"),10)||0);if((l+u>a.offsetWidth||a.scrollWidth>a.offsetWidth)&&this.$refs.tooltip){var c=this.$refs.tooltip;this.tooltipContent=r.innerText||r.textContent,c.referenceElm=r,c.$refs.popper&&(c.$refs.popper.style.display="none"),c.doDestroy(),c.setExpectedState(!0),this.activateTooltip(c)}}},handleCellMouseLeave:function(e){var t=this.$refs.tooltip;t&&(t.setExpectedState(!1),t.handleClosePopper());var n=Object(w["b"])(e);if(n){var r=this.table.hoverState||{};this.table.$emit("cell-mouse-leave",r.row,r.column,r.cell,e)}},handleMouseEnter:P()(30,(function(e){this.store.commit("setHoverRow",e)})),handleMouseLeave:P()(30,(function(){this.store.commit("setHoverRow",null)})),handleContextMenu:function(e,t){this.handleEvent(e,t,"contextmenu")},handleDoubleClick:function(e,t){this.handleEvent(e,t,"dblclick")},handleClick:function(e,t){this.store.commit("setCurrentRow",t),this.handleEvent(e,t,"click")},handleEvent:function(e,t,n){var r=this.table,o=Object(w["b"])(e),i=void 0;o&&(i=Object(w["c"])(r,o),i&&r.$emit("cell-"+n,t,i,o,e)),r.$emit("row-"+n,t,i,e)},rowRender:function(e,t,n){var r=this,o=this.$createElement,i=this.treeIndent,a=this.columns,s=this.firstDefaultColumnIndex,l=a.map((function(e,t){return r.isColumnHidden(t)})),u=this.getRowClass(e,t),c=!0;n&&(u.push("el-table__row--level-"+n.level),c=n.display);var f=c?null:{display:"none"};return o("tr",{style:[f,this.getRowStyle(e,t)],class:u,key:this.getKeyOfRow(e,t),on:{dblclick:function(t){return r.handleDoubleClick(t,e)},click:function(t){return r.handleClick(t,e)},contextmenu:function(t){return r.handleContextMenu(t,e)},mouseenter:function(e){return r.handleMouseEnter(t)},mouseleave:this.handleMouseLeave}},[a.map((function(u,c){var f=r.getSpan(e,u,t,c),d=f.rowspan,p=f.colspan;if(!d||!p)return null;var h=q({},u);h.realWidth=r.getColspanRealWidth(a,p,c);var v={store:r.store,_self:r.context||r.table.$vnode.context,column:h,row:e,$index:t};return c===s&&n&&(v.treeNode={indent:n.level*i,level:n.level},"boolean"===typeof n.expanded&&(v.treeNode.expanded=n.expanded,"loading"in n&&(v.treeNode.loading=n.loading),"noLazyChildren"in n&&(v.treeNode.noLazyChildren=n.noLazyChildren))),o("td",{style:r.getCellStyle(t,c,e,u),class:r.getCellClass(t,c,e,u),attrs:{rowspan:d,colspan:p},on:{mouseenter:function(t){return r.handleCellMouseEnter(t,e)},mouseleave:r.handleCellMouseLeave}},[u.renderCell.call(r._renderProxy,r.$createElement,v,l[c])])}))])},wrappedRowRender:function(e,t){var n=this,r=this.$createElement,o=this.store,i=o.isRowExpanded,a=o.assertRowKey,s=o.states,l=s.treeData,u=s.lazyTreeNodeMap,c=s.childrenColumnName,f=s.rowKey;if(this.hasExpandColumn&&i(e)){var d=this.table.renderExpanded,p=this.rowRender(e,t);return d?[[p,r("tr",{key:"expanded-row__"+p.key},[r("td",{attrs:{colspan:this.columnsCount},class:"el-table__expanded-cell"},[d(this.$createElement,{row:e,$index:t,store:this.store})])])]]:(console.error("[Element Error]renderExpanded is required."),p)}if(Object.keys(l).length){a();var h=Object(w["g"])(e,f),v=l[h],m=null;v&&(m={expanded:v.expanded,level:v.level,display:!0},"boolean"===typeof v.lazy&&("boolean"===typeof v.loaded&&v.loaded&&(m.noLazyChildren=!(v.children&&v.children.length)),m.loading=v.loading));var y=[this.rowRender(e,t,m)];if(v){var g=0,b=function e(r,o){r&&r.length&&o&&r.forEach((function(r){var i={display:o.display&&o.expanded,level:o.level+1},a=Object(w["g"])(r,f);if(void 0===a||null===a)throw new Error("for nested data item, row-key is required.");if(v=q({},l[a]),v&&(i.expanded=v.expanded,v.level=v.level||i.level,v.display=!(!v.expanded||!i.display),"boolean"===typeof v.lazy&&("boolean"===typeof v.loaded&&v.loaded&&(i.noLazyChildren=!(v.children&&v.children.length)),i.loading=v.loading)),g++,y.push(n.rowRender(r,t+g,i)),v){var s=u[a]||r[c];e(s,v)}}))};v.display=!0;var _=u[h]||e[c];b(_,v)}return y}return this.rowRender(e,t)}}},G=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("transition",{attrs:{name:"el-zoom-in-top"}},[e.multiple?n("div",{directives:[{name:"clickoutside",rawName:"v-clickoutside",value:e.handleOutsideClick,expression:"handleOutsideClick"},{name:"show",rawName:"v-show",value:e.showPopper,expression:"showPopper"}],staticClass:"el-table-filter"},[n("div",{staticClass:"el-table-filter__content"},[n("el-scrollbar",{attrs:{"wrap-class":"el-table-filter__wrap"}},[n("el-checkbox-group",{staticClass:"el-table-filter__checkbox-group",model:{value:e.filteredValue,callback:function(t){e.filteredValue=t},expression:"filteredValue"}},e._l(e.filters,(function(t){return n("el-checkbox",{key:t.value,attrs:{label:t.value}},[e._v(e._s(t.text))])})),1)],1)],1),n("div",{staticClass:"el-table-filter__bottom"},[n("button",{class:{"is-disabled":0===e.filteredValue.length},attrs:{disabled:0===e.filteredValue.length},on:{click:e.handleConfirm}},[e._v(e._s(e.t("el.table.confirmFilter")))]),n("button",{on:{click:e.handleReset}},[e._v(e._s(e.t("el.table.resetFilter")))])])]):n("div",{directives:[{name:"clickoutside",rawName:"v-clickoutside",value:e.handleOutsideClick,expression:"handleOutsideClick"},{name:"show",rawName:"v-show",value:e.showPopper,expression:"showPopper"}],staticClass:"el-table-filter"},[n("ul",{staticClass:"el-table-filter__list"},[n("li",{staticClass:"el-table-filter__list-item",class:{"is-active":void 0===e.filterValue||null===e.filterValue},on:{click:function(t){e.handleSelect(null)}}},[e._v(e._s(e.t("el.table.clearFilter")))]),e._l(e.filters,(function(t){return n("li",{key:t.value,staticClass:"el-table-filter__list-item",class:{"is-active":e.isActive(t)},attrs:{label:t.value},on:{click:function(n){e.handleSelect(t.value)}}},[e._v(e._s(t.text))])}))],2)])])},X=[];G._withStripped=!0;var Y=n(5),J=n.n(Y),Z=n(15),Q=n(12),ee=n.n(Q),te=[];!b.a.prototype.$isServer&&document.addEventListener("click",(function(e){te.forEach((function(t){var n=e.target;t&&t.$el&&(n===t.$el||t.$el.contains(n)||t.handleOutsideClick&&t.handleOutsideClick(e))}))}));var ne={open:function(e){e&&te.push(e)},close:function(e){var t=te.indexOf(e);-1!==t&&te.splice(e,1)}},re=n(40),oe=n.n(re),ie=n(14),ae=n.n(ie),se={name:"ElTableFilterPanel",mixins:[J.a,v.a],directives:{Clickoutside:ee.a},components:{ElCheckbox:a.a,ElCheckboxGroup:oe.a,ElScrollbar:ae.a},props:{placement:{type:String,default:"bottom-end"}},methods:{isActive:function(e){return e.value===this.filterValue},handleOutsideClick:function(){var e=this;setTimeout((function(){e.showPopper=!1}),16)},handleConfirm:function(){this.confirmFilter(this.filteredValue),this.handleOutsideClick()},handleReset:function(){this.filteredValue=[],this.confirmFilter(this.filteredValue),this.handleOutsideClick()},handleSelect:function(e){this.filterValue=e,"undefined"!==typeof e&&null!==e?this.confirmFilter(this.filteredValue):this.confirmFilter([]),this.handleOutsideClick()},confirmFilter:function(e){this.table.store.commit("filterChange",{column:this.column,values:e}),this.table.store.updateAllSelected()}},data:function(){return{table:null,cell:null,column:null}},computed:{filters:function(){return this.column&&this.column.filters},filterValue:{get:function(){return(this.column.filteredValue||[])[0]},set:function(e){this.filteredValue&&("undefined"!==typeof e&&null!==e?this.filteredValue.splice(0,1,e):this.filteredValue.splice(0,1))}},filteredValue:{get:function(){return this.column&&this.column.filteredValue||[]},set:function(e){this.column&&(this.column.filteredValue=e)}},multiple:function(){return!this.column||this.column.filterMultiple}},mounted:function(){var e=this;this.popperElm=this.$el,this.referenceElm=this.cell,this.table.bodyWrapper.addEventListener("scroll",(function(){e.updatePopper()})),this.$watch("showPopper",(function(t){e.column&&(e.column.filterOpened=t),t?ne.open(e):ne.close(e)}))},watch:{showPopper:function(e){!0===e&&parseInt(this.popperJS._popper.style.zIndex,10)1;return o&&(this.$parent.isGroup=!0),e("table",{class:"el-table__header",attrs:{cellspacing:"0",cellpadding:"0",border:"0"}},[e("colgroup",[this.columns.map((function(t){return e("col",{attrs:{name:t.id},key:t.id})})),this.hasGutter?e("col",{attrs:{name:"gutter"}}):""]),e("thead",{class:[{"is-group":o,"has-gutter":this.hasGutter}]},[this._l(r,(function(n,r){return e("tr",{style:t.getHeaderRowStyle(r),class:t.getHeaderRowClass(r)},[n.map((function(o,i){return e("th",{attrs:{colspan:o.colSpan,rowspan:o.rowSpan},on:{mousemove:function(e){return t.handleMouseMove(e,o)},mouseout:t.handleMouseOut,mousedown:function(e){return t.handleMouseDown(e,o)},click:function(e){return t.handleHeaderClick(e,o)},contextmenu:function(e){return t.handleHeaderContextMenu(e,o)}},style:t.getHeaderCellStyle(r,i,n,o),class:t.getHeaderCellClass(r,i,n,o),key:o.id},[e("div",{class:["cell",o.filteredValue&&o.filteredValue.length>0?"highlight":"",o.labelClassName]},[o.renderHeader?o.renderHeader.call(t._renderProxy,e,{column:o,$index:i,store:t.store,_self:t.$parent.$vnode.context}):o.label,o.sortable?e("span",{class:"caret-wrapper",on:{click:function(e){return t.handleSortClick(e,o)}}},[e("i",{class:"sort-caret ascending",on:{click:function(e){return t.handleSortClick(e,o,"ascending")}}}),e("i",{class:"sort-caret descending",on:{click:function(e){return t.handleSortClick(e,o,"descending")}}})]):"",o.filterable?e("span",{class:"el-table__column-filter-trigger",on:{click:function(e){return t.handleFilterClick(e,o)}}},[e("i",{class:["el-icon-arrow-down",o.filterOpened?"el-icon-arrow-up":""]})]):""])])})),t.hasGutter?e("th",{class:"gutter"}):""])}))])])},props:{fixed:String,store:{required:!0},border:Boolean,defaultSort:{type:Object,default:function(){return{prop:"",order:""}}}},components:{ElCheckbox:a.a},computed:de({table:function(){return this.$parent},hasGutter:function(){return!this.fixed&&this.tableLayout.gutterWidth}},N({columns:"columns",isAllSelected:"isAllSelected",leftFixedLeafCount:"fixedLeafColumnsLength",rightFixedLeafCount:"rightFixedLeafColumnsLength",columnsCount:function(e){return e.columns.length},leftFixedCount:function(e){return e.fixedColumns.length},rightFixedCount:function(e){return e.rightFixedColumns.length}})),created:function(){this.filterPanels={}},mounted:function(){var e=this;this.$nextTick((function(){var t=e.defaultSort,n=t.prop,r=t.order,o=!0;e.store.commit("sort",{prop:n,order:r,init:o})}))},beforeDestroy:function(){var e=this.filterPanels;for(var t in e)e.hasOwnProperty(t)&&e[t]&&e[t].$destroy(!0)},methods:{isCellHidden:function(e,t){for(var n=0,r=0;r=this.leftFixedLeafCount:"right"===this.fixed?n=this.columnsCount-this.rightFixedLeafCount},getHeaderRowStyle:function(e){var t=this.table.headerRowStyle;return"function"===typeof t?t.call(null,{rowIndex:e}):t},getHeaderRowClass:function(e){var t=[],n=this.table.headerRowClassName;return"string"===typeof n?t.push(n):"function"===typeof n&&t.push(n.call(null,{rowIndex:e})),t.join(" ")},getHeaderCellStyle:function(e,t,n,r){var o=this.table.headerCellStyle;return"function"===typeof o?o.call(null,{rowIndex:e,columnIndex:t,row:n,column:r}):o},getHeaderCellClass:function(e,t,n,r){var o=[r.id,r.order,r.headerAlign,r.className,r.labelClassName];0===e&&this.isCellHidden(t,n)&&o.push("is-hidden"),r.children||o.push("is-leaf"),r.sortable&&o.push("is-sortable");var i=this.table.headerCellClassName;return"string"===typeof i?o.push(i):"function"===typeof i&&o.push(i.call(null,{rowIndex:e,columnIndex:t,row:n,column:r})),o.join(" ")},toggleAllSelection:function(e){e.stopPropagation(),this.store.commit("toggleAllSelection")},handleFilterClick:function(e,t){e.stopPropagation();var n=e.target,r="TH"===n.tagName?n:n.parentNode;if(!Object(B["hasClass"])(r,"noclick")){r=r.querySelector(".el-table__column-filter-trigger")||r;var o=this.$parent,i=this.filterPanels[t.id];i&&t.filterOpened?i.showPopper=!1:(i||(i=new b.a(fe),this.filterPanels[t.id]=i,t.filterPlacement&&(i.placement=t.filterPlacement),i.table=o,i.cell=r,i.column=t,!this.$isServer&&i.$mount(document.createElement("div"))),setTimeout((function(){i.showPopper=!0}),16))}},handleHeaderClick:function(e,t){!t.filters&&t.sortable?this.handleSortClick(e,t):t.filterable&&!t.sortable&&this.handleFilterClick(e,t),this.$parent.$emit("header-click",t,e)},handleHeaderContextMenu:function(e,t){this.$parent.$emit("header-contextmenu",t,e)},handleMouseDown:function(e,t){var n=this;if(!this.$isServer&&!(t.children&&t.children.length>0)&&this.draggingColumn&&this.border){this.dragging=!0,this.$parent.resizeProxyVisible=!0;var r=this.$parent,o=r.$el,i=o.getBoundingClientRect().left,a=this.$el.querySelector("th."+t.id),s=a.getBoundingClientRect(),l=s.left-i+30;Object(B["addClass"])(a,"noclick"),this.dragState={startMouseLeft:e.clientX,startLeft:s.right-i,startColumnLeft:s.left-i,tableLeft:i};var u=r.$refs.resizeProxy;u.style.left=this.dragState.startLeft+"px",document.onselectstart=function(){return!1},document.ondragstart=function(){return!1};var c=function(e){var t=e.clientX-n.dragState.startMouseLeft,r=n.dragState.startLeft+t;u.style.left=Math.max(l,r)+"px"},f=function o(){if(n.dragging){var i=n.dragState,s=i.startColumnLeft,l=i.startLeft,f=parseInt(u.style.left,10),d=f-s;t.width=t.realWidth=d,r.$emit("header-dragend",t.width,l-s,t,e),n.store.scheduleLayout(),document.body.style.cursor="",n.dragging=!1,n.draggingColumn=null,n.dragState={},r.resizeProxyVisible=!1}document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",o),document.onselectstart=null,document.ondragstart=null,setTimeout((function(){Object(B["removeClass"])(a,"noclick")}),0)};document.addEventListener("mousemove",c),document.addEventListener("mouseup",f)}},handleMouseMove:function(e,t){if(!(t.children&&t.children.length>0)){var n=e.target;while(n&&"TH"!==n.tagName)n=n.parentNode;if(t&&t.resizable&&!this.dragging&&this.border){var r=n.getBoundingClientRect(),o=document.body.style;r.width>12&&r.right-e.pageX<8?(o.cursor="col-resize",Object(B["hasClass"])(n,"is-sortable")&&(n.style.cursor="col-resize"),this.draggingColumn=t):this.dragging||(o.cursor="",Object(B["hasClass"])(n,"is-sortable")&&(n.style.cursor="pointer"),this.draggingColumn=null)}}},handleMouseOut:function(){this.$isServer||(document.body.style.cursor="")},toggleOrder:function(e){var t=e.order,n=e.sortOrders;if(""===t)return n[0];var r=n.indexOf(t||null);return n[r>n.length-2?0:r+1]},handleSortClick:function(e,t,n){e.stopPropagation();var r=t.order===n?null:n||this.toggleOrder(t),o=e.target;while(o&&"TH"!==o.tagName)o=o.parentNode;if(o&&"TH"===o.tagName&&Object(B["hasClass"])(o,"noclick"))Object(B["removeClass"])(o,"noclick");else if(t.sortable){var i=this.store.states,a=i.sortProp,s=void 0,l=i.sortingColumn;(l!==t||l===t&&null===l.order)&&(l&&(l.order=null),i.sortingColumn=t,a=t.property),s=t.order=r||null,i.sortProp=a,i.sortOrder=s,this.store.commit("changeSortCondition")}}},data:function(){return{draggingColumn:null,dragging:!1,dragState:{}}}},me=Object.assign||function(e){for(var t=1;t=this.leftFixedLeafCount;if("right"===this.fixed){for(var r=0,o=0;o=this.columnsCount-this.rightFixedCount)},getRowClasses:function(e,t){var n=[e.id,e.align,e.labelClassName];return e.className&&n.push(e.className),this.isCellHidden(t,this.columns,e)&&n.push("is-hidden"),e.children||n.push("is-leaf"),n}}},ge=Object.assign||function(e){for(var t=1;t0){var r=n.scrollTop;t.pixelY<0&&0!==r&&e.preventDefault(),t.pixelY>0&&n.scrollHeight-n.clientHeight>r&&e.preventDefault(),n.scrollTop+=Math.ceil(t.pixelY/5)}else n.scrollLeft+=Math.ceil(t.pixelX/5)},handleHeaderFooterMousewheel:function(e,t){var n=t.pixelX,r=t.pixelY;Math.abs(n)>=Math.abs(r)&&(this.bodyWrapper.scrollLeft+=t.pixelX/5)},syncPostion:Object(s["throttle"])(20,(function(){var e=this.bodyWrapper,t=e.scrollLeft,n=e.scrollTop,r=e.offsetWidth,o=e.scrollWidth,i=this.$refs,a=i.headerWrapper,s=i.footerWrapper,l=i.fixedBodyWrapper,u=i.rightFixedBodyWrapper;a&&(a.scrollLeft=t),s&&(s.scrollLeft=t),l&&(l.scrollTop=n),u&&(u.scrollTop=n);var c=o-r-1;this.scrollPosition=t>=c?"right":0===t?"left":"middle"})),bindEvents:function(){this.bodyWrapper.addEventListener("scroll",this.syncPostion,{passive:!0}),this.fit&&Object(l["addResizeListener"])(this.$el,this.resizeListener)},unbindEvents:function(){this.bodyWrapper.removeEventListener("scroll",this.syncPostion,{passive:!0}),this.fit&&Object(l["removeResizeListener"])(this.$el,this.resizeListener)},resizeListener:function(){if(this.$ready){var e=!1,t=this.$el,n=this.resizeState,r=n.width,o=n.height,i=t.offsetWidth;r!==i&&(e=!0);var a=t.offsetHeight;(this.height||this.shouldUpdateHeight)&&o!==a&&(e=!0),e&&(this.resizeState.width=i,this.resizeState.height=a,this.doLayout())}},doLayout:function(){this.shouldUpdateHeight&&this.layout.updateElsHeight(),this.layout.updateColumnsWidth()},sort:function(e,t){this.store.commit("sort",{prop:e,order:t})},toggleAllSelection:function(){this.store.commit("toggleAllSelection")}},computed:ge({tableSize:function(){return this.size||(this.$ELEMENT||{}).size},bodyWrapper:function(){return this.$refs.bodyWrapper},shouldUpdateHeight:function(){return this.height||this.maxHeight||this.fixedColumns.length>0||this.rightFixedColumns.length>0},bodyWidth:function(){var e=this.layout,t=e.bodyWidth,n=e.scrollY,r=e.gutterWidth;return t?t-(n?r:0)+"px":""},bodyHeight:function(){var e=this.layout,t=e.headerHeight,n=void 0===t?0:t,r=e.bodyHeight,o=e.footerHeight,i=void 0===o?0:o;if(this.height)return{height:r?r+"px":""};if(this.maxHeight){var a=Object(w["j"])(this.maxHeight);if("number"===typeof a)return{"max-height":a-i-(this.showHeader?n:0)+"px"}}return{}},fixedBodyHeight:function(){if(this.height)return{height:this.layout.fixedBodyHeight?this.layout.fixedBodyHeight+"px":""};if(this.maxHeight){var e=Object(w["j"])(this.maxHeight);if("number"===typeof e)return e=this.layout.scrollX?e-this.layout.gutterWidth:e,this.showHeader&&(e-=this.layout.headerHeight),e-=this.layout.footerHeight,{"max-height":e+"px"}}return{}},fixedHeight:function(){return this.maxHeight?this.showSummary?{bottom:0}:{bottom:this.layout.scrollX&&this.data.length?this.layout.gutterWidth+"px":""}:this.showSummary?{height:this.layout.tableHeight?this.layout.tableHeight+"px":""}:{height:this.layout.viewportHeight?this.layout.viewportHeight+"px":""}},emptyBlockStyle:function(){if(this.data&&this.data.length)return null;var e="100%";return this.layout.appendHeight&&(e="calc(100% - "+this.layout.appendHeight+"px)"),{width:this.bodyWidth,height:e}}},N({selection:"selection",columns:"columns",tableData:"data",fixedColumns:"fixedColumns",rightFixedColumns:"rightFixedColumns"})),watch:{height:{immediate:!0,handler:function(e){this.layout.setHeight(e)}},maxHeight:{immediate:!0,handler:function(e){this.layout.setMaxHeight(e)}},currentRowKey:{immediate:!0,handler:function(e){this.rowKey&&this.store.setCurrentRowKey(e)}},data:{immediate:!0,handler:function(e){this.store.commit("setData",e)}},expandRowKeys:{immediate:!0,handler:function(e){e&&this.store.setExpandRowKeysAdapter(e)}}},created:function(){var e=this;this.tableId="el-table_"+be++,this.debouncedUpdateLayout=Object(s["debounce"])(50,(function(){return e.doLayout()}))},mounted:function(){var e=this;this.bindEvents(),this.store.updateColumns(),this.doLayout(),this.resizeState={width:this.$el.offsetWidth,height:this.$el.offsetHeight},this.store.states.columns.forEach((function(t){t.filteredValue&&t.filteredValue.length&&e.store.commit("filterChange",{column:t,values:t.filteredValue,silent:!0})})),this.$ready=!0},destroyed:function(){this.unbindEvents()},data:function(){var e=this.treeProps,t=e.hasChildren,n=void 0===t?"hasChildren":t,r=e.children,o=void 0===r?"children":r;this.store=L(this,{rowKey:this.rowKey,defaultExpandAll:this.defaultExpandAll,selectOnIndeterminate:this.selectOnIndeterminate,indent:this.indent,lazy:this.lazy,lazyColumnIdentifier:n,childrenColumnName:o});var i=new z({store:this.store,table:this,fit:this.fit,showHeader:this.showHeader});return{layout:i,isHidden:!1,renderExpanded:null,resizeProxyVisible:!1,resizeState:{width:null,height:null},isGroup:!1,scrollPosition:"left"}}},xe=_e,we=Object(ue["a"])(xe,r,o,!1,null,null,null);we.options.__file="packages/table/src/table.vue";var Ce=we.exports;Ce.install=function(e){e.component(Ce.name,Ce)};t["default"]=Ce}])},ad6d:function(e,t,n){"use strict";var r=n("825a");e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},ae93:function(e,t,n){"use strict";var r,o,i,a=n("e163"),s=n("9112"),l=n("5135"),u=n("b622"),c=n("c430"),f=u("iterator"),d=!1,p=function(){return this};[].keys&&(i=[].keys(),"next"in i?(o=a(a(i)),o!==Object.prototype&&(r=o)):d=!0),void 0==r&&(r={}),c||l(r,f)||s(r,f,p),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:d}},b041:function(e,t,n){"use strict";var r=n("00ee"),o=n("f5df");e.exports=r?{}.toString:function(){return"[object "+o(this)+"]"}},b575:function(e,t,n){var r,o,i,a,s,l,u,c,f=n("da84"),d=n("06cf").f,p=n("c6b6"),h=n("2cf4").set,v=n("1cdc"),m=f.MutationObserver||f.WebKitMutationObserver,y=f.process,g=f.Promise,b="process"==p(y),_=d(f,"queueMicrotask"),x=_&&_.value;x||(r=function(){var e,t;b&&(e=y.domain)&&e.exit();while(o){t=o.fn,o=o.next;try{t()}catch(n){throw o?a():i=void 0,n}}i=void 0,e&&e.enter()},b?a=function(){y.nextTick(r)}:m&&!v?(s=!0,l=document.createTextNode(""),new m(r).observe(l,{characterData:!0}),a=function(){l.data=s=!s}):g&&g.resolve?(u=g.resolve(void 0),c=u.then,a=function(){c.call(u,r)}):a=function(){h.call(f,r)}),e.exports=x||function(e){var t={fn:e,next:void 0};i&&(i.next=t),o||(o=t,a()),i=t}},b622:function(e,t,n){var r=n("da84"),o=n("5692"),i=n("5135"),a=n("90e3"),s=n("4930"),l=n("fdbf"),u=o("wks"),c=r.Symbol,f=l?c:c&&c.withoutSetter||a;e.exports=function(e){return i(u,e)||(s&&i(c,e)?u[e]=c[e]:u[e]=f("Symbol."+e)),u[e]}},b84d:function(e,t,n){},be4f:function(e,t,n){},c04e:function(e,t,n){var r=n("861d");e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},c098:function(e,t,n){e.exports=n("d4af")},c216:function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=122)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},122:function(e,t,n){"use strict";n.r(t);var r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("span",{staticClass:"el-breadcrumb__item"},[n("span",{ref:"link",class:["el-breadcrumb__inner",e.to?"is-link":""],attrs:{role:"link"}},[e._t("default")],2),e.separatorClass?n("i",{staticClass:"el-breadcrumb__separator",class:e.separatorClass}):n("span",{staticClass:"el-breadcrumb__separator",attrs:{role:"presentation"}},[e._v(e._s(e.separator))])])},o=[];r._withStripped=!0;var i={name:"ElBreadcrumbItem",props:{to:{},replace:Boolean},data:function(){return{separator:"",separatorClass:""}},inject:["elBreadcrumb"],mounted:function(){var e=this;this.separator=this.elBreadcrumb.separator,this.separatorClass=this.elBreadcrumb.separatorClass;var t=this.$refs.link;t.setAttribute("role","link"),t.addEventListener("click",(function(t){var n=e.to,r=e.$router;n&&r&&(e.replace?r.replace(n):r.push(n))}))}},a=i,s=n(0),l=Object(s["a"])(a,r,o,!1,null,null,null);l.options.__file="packages/breadcrumb/src/breadcrumb-item.vue";var u=l.exports;u.install=function(e){e.component(u.name,u)};t["default"]=u}})},c430:function(e,t){e.exports=!1},c56a:function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:300,r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(!e||!t)throw new Error("instance & callback is required");var o=!1,i=function(){o||(o=!0,t&&t.apply(null,arguments))};r?e.$once("after-leave",i):e.$on("after-leave",i),setTimeout((function(){i()}),n+100)}},c6b6:function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},c6cd:function(e,t,n){var r=n("da84"),o=n("ce4e"),i="__core-js_shared__",a=r[i]||o(i,{});e.exports=a},c8ba:function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"===typeof window&&(n=window)}e.exports=n},ca84:function(e,t,n){var r=n("5135"),o=n("fc6a"),i=n("4d64").indexOf,a=n("d012");e.exports=function(e,t){var n,s=o(e),l=0,u=[];for(n in s)!r(a,n)&&r(s,n)&&u.push(n);while(t.length>l)r(s,n=t[l++])&&(~i(u,n)||u.push(n));return u}},cbb5:function(e,t,n){},cc12:function(e,t,n){var r=n("da84"),o=n("861d"),i=r.document,a=o(i)&&o(i.createElement);e.exports=function(e){return a?i.createElement(e):{}}},cca6:function(e,t,n){var r=n("23e7"),o=n("60da");r({target:"Object",stat:!0,forced:Object.assign!==o},{assign:o})},cdf9:function(e,t,n){var r=n("825a"),o=n("861d"),i=n("f069");e.exports=function(e,t){if(r(e),o(t)&&t.constructor===e)return t;var n=i.f(e),a=n.resolve;return a(t),n.promise}},ce4e:function(e,t,n){var r=n("da84"),o=n("9112");e.exports=function(e,t){try{o(r,e,t)}catch(n){r[e]=t}return t}},d010:function(e,t,n){"use strict";function r(e,t,n){this.$children.forEach((function(o){var i=o.$options.componentName;i===e?o.$emit.apply(o,[t].concat(n)):r.apply(o,[e,t].concat([n]))}))}t.__esModule=!0,t.default={methods:{dispatch:function(e,t,n){var r=this.$parent||this.$root,o=r.$options.componentName;while(r&&(!o||o!==e))r=r.$parent,r&&(o=r.$options.componentName);r&&r.$emit.apply(r,[t].concat(n))},broadcast:function(e,t,n){r.call(this,e,t,n)}}}},d012:function(e,t){e.exports={}},d039:function(e,t){e.exports=function(e){try{return!!e()}catch(t){return!0}}},d066:function(e,t,n){var r=n("428f"),o=n("da84"),i=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?i(r[e])||i(o[e]):r[e]&&r[e][t]||o[e]&&o[e][t]}},d1e7:function(e,t,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);t.f=i?function(e){var t=o(this,e);return!!t&&t.enumerable}:r},d2bb:function(e,t,n){var r=n("825a"),o=n("3bbe");e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set,e.call(n,[]),t=n instanceof Array}catch(i){}return function(n,i){return r(n),o(i),t?e.call(n,i):n.__proto__=i,n}}():void 0)},d397:function(e,t,n){"use strict";function r(e){return void 0!==e&&null!==e}function o(e){var t=/([(\uAC00-\uD7AF)|(\u3130-\u318F)])+/gi;return t.test(e)}t.__esModule=!0,t.isDef=r,t.isKorean=o},d3b7:function(e,t,n){var r=n("00ee"),o=n("6eeb"),i=n("b041");r||o(Object.prototype,"toString",i,{unsafe:!0})},d44e:function(e,t,n){var r=n("9bf2").f,o=n("5135"),i=n("b622"),a=i("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,a)&&r(e,a,{configurable:!0,value:t})}},d4af:function(e,t,n){"use strict";var r=n("8eb7"),o=n("7b3e"),i=10,a=40,s=800;function l(e){var t=0,n=0,r=0,o=0;return"detail"in e&&(n=e.detail),"wheelDelta"in e&&(n=-e.wheelDelta/120),"wheelDeltaY"in e&&(n=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=n,n=0),r=t*i,o=n*i,"deltaY"in e&&(o=e.deltaY),"deltaX"in e&&(r=e.deltaX),(r||o)&&e.deltaMode&&(1==e.deltaMode?(r*=a,o*=a):(r*=s,o*=s)),r&&!t&&(t=r<1?-1:1),o&&!n&&(n=o<1?-1:1),{spinX:t,spinY:n,pixelX:r,pixelY:o}}l.getEventType=function(){return r.firefox()?"DOMMouseScroll":o("wheel")?"wheel":"mousewheel"},e.exports=l},da84:function(e,t,n){(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof t&&t)||Function("return this")()}).call(this,n("c8ba"))},dcdc:function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=83)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},4:function(e,t){e.exports=n("d010")},83:function(e,t,n){"use strict";n.r(t);var r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("label",{staticClass:"el-checkbox",class:[e.border&&e.checkboxSize?"el-checkbox--"+e.checkboxSize:"",{"is-disabled":e.isDisabled},{"is-bordered":e.border},{"is-checked":e.isChecked}],attrs:{id:e.id}},[n("span",{staticClass:"el-checkbox__input",class:{"is-disabled":e.isDisabled,"is-checked":e.isChecked,"is-indeterminate":e.indeterminate,"is-focus":e.focus},attrs:{tabindex:!!e.indeterminate&&0,role:!!e.indeterminate&&"checkbox","aria-checked":!!e.indeterminate&&"mixed"}},[n("span",{staticClass:"el-checkbox__inner"}),e.trueLabel||e.falseLabel?n("input",{directives:[{name:"model",rawName:"v-model",value:e.model,expression:"model"}],staticClass:"el-checkbox__original",attrs:{type:"checkbox","aria-hidden":e.indeterminate?"true":"false",name:e.name,disabled:e.isDisabled,"true-value":e.trueLabel,"false-value":e.falseLabel},domProps:{checked:Array.isArray(e.model)?e._i(e.model,null)>-1:e._q(e.model,e.trueLabel)},on:{change:[function(t){var n=e.model,r=t.target,o=r.checked?e.trueLabel:e.falseLabel;if(Array.isArray(n)){var i=null,a=e._i(n,i);r.checked?a<0&&(e.model=n.concat([i])):a>-1&&(e.model=n.slice(0,a).concat(n.slice(a+1)))}else e.model=o},e.handleChange],focus:function(t){e.focus=!0},blur:function(t){e.focus=!1}}}):n("input",{directives:[{name:"model",rawName:"v-model",value:e.model,expression:"model"}],staticClass:"el-checkbox__original",attrs:{type:"checkbox","aria-hidden":e.indeterminate?"true":"false",disabled:e.isDisabled,name:e.name},domProps:{value:e.label,checked:Array.isArray(e.model)?e._i(e.model,e.label)>-1:e.model},on:{change:[function(t){var n=e.model,r=t.target,o=!!r.checked;if(Array.isArray(n)){var i=e.label,a=e._i(n,i);r.checked?a<0&&(e.model=n.concat([i])):a>-1&&(e.model=n.slice(0,a).concat(n.slice(a+1)))}else e.model=o},e.handleChange],focus:function(t){e.focus=!0},blur:function(t){e.focus=!1}}})]),e.$slots.default||e.label?n("span",{staticClass:"el-checkbox__label"},[e._t("default"),e.$slots.default?e._e():[e._v(e._s(e.label))]],2):e._e()])},o=[];r._withStripped=!0;var i=n(4),a=n.n(i),s={name:"ElCheckbox",mixins:[a.a],inject:{elForm:{default:""},elFormItem:{default:""}},componentName:"ElCheckbox",data:function(){return{selfModel:!1,focus:!1,isLimitExceeded:!1}},computed:{model:{get:function(){return this.isGroup?this.store:void 0!==this.value?this.value:this.selfModel},set:function(e){this.isGroup?(this.isLimitExceeded=!1,void 0!==this._checkboxGroup.min&&e.lengththis._checkboxGroup.max&&(this.isLimitExceeded=!0),!1===this.isLimitExceeded&&this.dispatch("ElCheckboxGroup","input",[e])):(this.$emit("input",e),this.selfModel=e)}},isChecked:function(){return"[object Boolean]"==={}.toString.call(this.model)?this.model:Array.isArray(this.model)?this.model.indexOf(this.label)>-1:null!==this.model&&void 0!==this.model?this.model===this.trueLabel:void 0},isGroup:function(){var e=this.$parent;while(e){if("ElCheckboxGroup"===e.$options.componentName)return this._checkboxGroup=e,!0;e=e.$parent}return!1},store:function(){return this._checkboxGroup?this._checkboxGroup.value:this.value},isLimitDisabled:function(){var e=this._checkboxGroup,t=e.max,n=e.min;return!(!t&&!n)&&this.model.length>=t&&!this.isChecked||this.model.length<=n&&this.isChecked},isDisabled:function(){return this.isGroup?this._checkboxGroup.disabled||this.disabled||(this.elForm||{}).disabled||this.isLimitDisabled:this.disabled||(this.elForm||{}).disabled},_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},checkboxSize:function(){var e=this.size||this._elFormItemSize||(this.$ELEMENT||{}).size;return this.isGroup&&this._checkboxGroup.checkboxGroupSize||e}},props:{value:{},label:{},indeterminate:Boolean,disabled:Boolean,checked:Boolean,name:String,trueLabel:[String,Number],falseLabel:[String,Number],id:String,controls:String,border:Boolean,size:String},methods:{addToStore:function(){Array.isArray(this.model)&&-1===this.model.indexOf(this.label)?this.model.push(this.label):this.model=this.trueLabel||!0},handleChange:function(e){var t=this;if(!this.isLimitExceeded){var n=void 0;n=e.target.checked?void 0===this.trueLabel||this.trueLabel:void 0!==this.falseLabel&&this.falseLabel,this.$emit("change",n,e),this.$nextTick((function(){t.isGroup&&t.dispatch("ElCheckboxGroup","change",[t._checkboxGroup.value])}))}}},created:function(){this.checked&&this.addToStore()},mounted:function(){this.indeterminate&&this.$el.setAttribute("aria-controls",this.controls)},watch:{value:function(e){this.dispatch("ElFormItem","el.form.change",e)}}},l=s,u=n(0),c=Object(u["a"])(l,r,o,!1,null,null,null);c.options.__file="packages/checkbox/src/checkbox.vue";var f=c.exports;f.install=function(e){e.component(f.name,f)};t["default"]=f}})},df75:function(e,t,n){var r=n("ca84"),o=n("7839");e.exports=Object.keys||function(e){return r(e,o)}},e163:function(e,t,n){var r=n("5135"),o=n("7b0b"),i=n("f772"),a=n("e177"),s=i("IE_PROTO"),l=Object.prototype;e.exports=a?Object.getPrototypeOf:function(e){return e=o(e),r(e,s)?e[s]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},e177:function(e,t,n){var r=n("d039");e.exports=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},e260:function(e,t,n){"use strict";var r=n("fc6a"),o=n("44d2"),i=n("3f8c"),a=n("69f3"),s=n("7dd0"),l="Array Iterator",u=a.set,c=a.getterFor(l);e.exports=s(Array,"Array",(function(e,t){u(this,{type:l,target:r(e),index:0,kind:t})}),(function(){var e=c(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values"),i.Arguments=i.Array,o("keys"),o("values"),o("entries")},e2cc:function(e,t,n){var r=n("6eeb");e.exports=function(e,t,n){for(var o in t)r(e,o,t[o],n);return e}},e3ea:function(e,t,n){},e452:function(e,t,n){"use strict";t.__esModule=!0;var r=r||{};r.Utils=r.Utils||{},r.Utils.focusFirstDescendant=function(e){for(var t=0;t=0;t--){var n=e.childNodes[t];if(r.Utils.attemptFocus(n)||r.Utils.focusLastDescendant(n))return!0}return!1},r.Utils.attemptFocus=function(e){if(!r.Utils.isFocusable(e))return!1;r.Utils.IgnoreUtilFocusChanges=!0;try{e.focus()}catch(t){}return r.Utils.IgnoreUtilFocusChanges=!1,document.activeElement===e},r.Utils.isFocusable=function(e){if(e.tabIndex>0||0===e.tabIndex&&null!==e.getAttribute("tabIndex"))return!0;if(e.disabled)return!1;switch(e.nodeName){case"A":return!!e.href&&"ignore"!==e.rel;case"INPUT":return"hidden"!==e.type&&"file"!==e.type;case"BUTTON":case"SELECT":case"TEXTAREA":return!0;default:return!1}},r.Utils.triggerEvent=function(e,t){var n=void 0;n=/^mouse|click/.test(t)?"MouseEvents":/^key/.test(t)?"KeyboardEvent":"HTMLEvents";for(var r=document.createEvent(n),o=arguments.length,i=Array(o>2?o-2:0),a=2;a=51&&/native code/.test(H))return!1;var t=H.resolve(1),n=function(e){e((function(){}),(function(){}))},r=t.constructor={};return r[L]=n,!(t.then((function(){}))instanceof n)})),ne=te||!w((function(e){H.all(e)["catch"]((function(){}))})),re=function(e){var t;return!(!m(e)||"function"!=typeof(t=e.then))&&t},oe=function(e,t,n){if(!t.notified){t.notified=!0;var r=t.reactions;O((function(){var o=t.value,i=t.state==J,a=0;while(r.length>a){var s,l,u,c=r[a++],f=i?c.ok:c.fail,d=c.resolve,p=c.reject,h=c.domain;try{f?(i||(t.rejection===ee&&le(e,t),t.rejection=Q),!0===f?s=o:(h&&h.enter(),s=f(o),h&&(h.exit(),u=!0)),s===c.promise?p(z("Promise-chain cycle")):(l=re(s))?l.call(s,d,p):d(s)):p(o)}catch(v){h&&!u&&h.exit(),p(v)}}t.reactions=[],t.notified=!1,n&&!t.rejection&&ae(e,t)}))}},ie=function(e,t,n){var r,o;K?(r=B.createEvent("Event"),r.promise=t,r.reason=n,r.initEvent(e,!1,!0),u.dispatchEvent(r)):r={promise:t,reason:n},(o=u["on"+e])?o(r):e===G&&k("Unhandled promise rejection",n)},ae=function(e,t){S.call(u,(function(){var n,r=t.value,o=se(t);if(o&&(n=j((function(){q?D.emit("unhandledRejection",r,e):ie(G,e,r)})),t.rejection=q||se(t)?ee:Q,n.error))throw n.value}))},se=function(e){return e.rejection!==Q&&!e.parent},le=function(e,t){S.call(u,(function(){q?D.emit("rejectionHandled",e):ie(X,e,t.value)}))},ue=function(e,t,n,r){return function(o){e(t,n,o,r)}},ce=function(e,t,n,r){t.done||(t.done=!0,r&&(t=r),t.value=n,t.state=Z,oe(e,t,!0))},fe=function(e,t,n,r){if(!t.done){t.done=!0,r&&(t=r);try{if(e===n)throw z("Promise can't be resolved itself");var o=re(n);o?O((function(){var r={done:!1};try{o.call(n,ue(fe,e,r,t),ue(ce,e,r,t))}catch(i){ce(e,r,i,t)}})):(t.value=n,t.state=J,oe(e,t,!1))}catch(i){ce(e,{done:!1},i,t)}}};te&&(H=function(e){g(this,H,N),y(e),r.call(this);var t=R(this);try{e(ue(fe,this,t),ue(ce,this,t))}catch(n){ce(this,t,n)}},r=function(e){F(this,{type:N,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:Y,value:void 0})},r.prototype=p(H.prototype,{then:function(e,t){var n=I(this),r=V(C(this,H));return r.ok="function"!=typeof e||e,r.fail="function"==typeof t&&t,r.domain=q?D.domain:void 0,n.parent=!0,n.reactions.push(r),n.state!=Y&&oe(this,n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),o=function(){var e=new r,t=R(e);this.promise=e,this.resolve=ue(fe,e,t),this.reject=ue(ce,e,t)},$.f=V=function(e){return e===H||e===i?new o(e):U(e)},l||"function"!=typeof f||(a=f.prototype.then,d(f.prototype,"then",(function(e,t){var n=this;return new H((function(e,t){a.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof W&&s({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return E(H,W.apply(u,arguments))}}))),s({global:!0,wrap:!0,forced:te},{Promise:H}),h(H,N,!1,!0),v(N),i=c(N),s({target:N,stat:!0,forced:te},{reject:function(e){var t=V(this);return t.reject.call(void 0,e),t.promise}}),s({target:N,stat:!0,forced:l||te},{resolve:function(e){return E(l&&this===i?H:this,e)}}),s({target:N,stat:!0,forced:ne},{all:function(e){var t=this,n=V(t),r=n.resolve,o=n.reject,i=j((function(){var n=y(t.resolve),i=[],a=0,s=1;x(e,(function(e){var l=a++,u=!1;i.push(void 0),s++,n.call(t,e).then((function(e){u||(u=!0,i[l]=e,--s||r(i))}),o)})),--s||r(i)}));return i.error&&o(i.value),n.promise},race:function(e){var t=this,n=V(t),r=n.reject,o=j((function(){var o=y(t.resolve);x(e,(function(e){o.call(t,e).then(n.resolve,r)}))}));return o.error&&r(o.value),n.promise}})},e893:function(e,t,n){var r=n("5135"),o=n("56ef"),i=n("06cf"),a=n("9bf2");e.exports=function(e,t){for(var n=o(t),s=a.f,l=i.f,u=0;u-1?"center "+n:n+" center"}},appendArrow:function(e){var t=void 0;if(!this.appended){for(var n in this.appended=!0,e.attributes)if(/^_v-/.test(e.attributes[n].name)){t=e.attributes[n].name;break}var r=document.createElement("div");t&&r.setAttribute(t,""),r.setAttribute("x-arrow",""),r.className="popper__arrow",e.appendChild(r)}}},beforeDestroy:function(){this.doDestroy(!0),this.popperElm&&this.popperElm.parentNode===document.body&&(this.popperElm.removeEventListener("click",l),document.body.removeChild(this.popperElm))},deactivated:function(){this.$options.beforeDestroy[0].call(this)}}},ecdf:function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=130)}({130:function(e,t,n){"use strict";n.r(t);var r=n(3),o={default:{order:""},selection:{width:48,minWidth:48,realWidth:48,order:"",className:"el-table-column--selection"},expand:{width:48,minWidth:48,realWidth:48,order:""},index:{width:48,minWidth:48,realWidth:48,order:""}},i={selection:{renderHeader:function(e,t){var n=t.store;return e("el-checkbox",{attrs:{disabled:n.states.data&&0===n.states.data.length,indeterminate:n.states.selection.length>0&&!this.isAllSelected,value:this.isAllSelected},nativeOn:{click:this.toggleAllSelection}})},renderCell:function(e,t){var n=t.row,r=t.column,o=t.store,i=t.$index;return e("el-checkbox",{nativeOn:{click:function(e){return e.stopPropagation()}},attrs:{value:o.isSelected(n),disabled:!!r.selectable&&!r.selectable.call(null,n,i)},on:{input:function(){o.commit("rowSelectedChanged",n)}}})},sortable:!1,resizable:!1},index:{renderHeader:function(e,t){var n=t.column;return n.label||"#"},renderCell:function(e,t){var n=t.$index,r=t.column,o=n+1,i=r.index;return"number"===typeof i?o=n+i:"function"===typeof i&&(o=i(n)),e("div",[o])},sortable:!1},expand:{renderHeader:function(e,t){var n=t.column;return n.label||""},renderCell:function(e,t){var n=t.row,r=t.store,o=["el-table__expand-icon"];r.states.expandRows.indexOf(n)>-1&&o.push("el-table__expand-icon--expanded");var i=function(e){e.stopPropagation(),r.toggleRowExpansion(n)};return e("div",{class:o,on:{click:i}},[e("i",{class:"el-icon el-icon-arrow-right"})])},sortable:!1,resizable:!1,className:"el-table__expand-column"}};function a(e,t){var n=t.row,o=t.column,i=t.$index,a=o.property,s=a&&Object(r["getPropByPath"])(n,a).v;return o&&o.formatter?o.formatter(n,o,s,i):s}function s(e,t){var n=t.row,r=t.treeNode,o=t.store;if(!r)return null;var i=[],a=function(e){e.stopPropagation(),o.loadOrToggle(n)};if(r.indent&&i.push(e("span",{class:"el-table__indent",style:{"padding-left":r.indent+"px"}})),"boolean"!==typeof r.expanded||r.noLazyChildren)i.push(e("span",{class:"el-table__placeholder"}));else{var s=["el-table__expand-icon",r.expanded?"el-table__expand-icon--expanded":""],l=["el-icon-arrow-right"];r.loading&&(l=["el-icon-loading"]),i.push(e("div",{class:s,on:{click:a}},[e("i",{class:l})]))}return i}var l=n(8),u=n(18),c=n.n(u),f=Object.assign||function(e){for(var t=1;t-1}))}}},data:function(){return{isSubColumn:!1,columns:[]}},computed:{owner:function(){var e=this.$parent;while(e&&!e.tableId)e=e.$parent;return e},columnOrTableParent:function(){var e=this.$parent;while(e&&!e.tableId&&!e.columnId)e=e.$parent;return e},realWidth:function(){return Object(l["l"])(this.width)},realMinWidth:function(){return Object(l["k"])(this.minWidth)},realAlign:function(){return this.align?"is-"+this.align:null},realHeaderAlign:function(){return this.headerAlign?"is-"+this.headerAlign:this.realAlign}},methods:{getPropsData:function(){for(var e=this,t=arguments.length,n=Array(t),r=0;rt.key[n])return 1}return 0};return e.map((function(e,t){return{value:e,index:t,key:s?s(e,t):null}})).sort((function(e,t){var r=l(e,t);return r||(r=e.index-t.index),r*n})).map((function(e){return e.value}))},l=function(e,t){var n=null;return e.columns.forEach((function(e){e.id===t&&(n=e)})),n},u=function(e,t){for(var n=null,r=0;r2&&void 0!==arguments[2]?arguments[2]:"children",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"hasChildren",o=function(e){return!(Array.isArray(e)&&e.length)};function i(e,a,s){t(e,a,s),a.forEach((function(e){if(e[r])t(e,null,s+1);else{var a=e[n];o(a)||i(e,a,s+1)}}))}e.forEach((function(e){if(e[r])t(e,null,0);else{var a=e[n];o(a)||i(e,a,0)}}))}}})},eedf:function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=97)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},97:function(e,t,n){"use strict";n.r(t);var r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("button",{staticClass:"el-button",class:[e.type?"el-button--"+e.type:"",e.buttonSize?"el-button--"+e.buttonSize:"",{"is-disabled":e.buttonDisabled,"is-loading":e.loading,"is-plain":e.plain,"is-round":e.round,"is-circle":e.circle}],attrs:{disabled:e.buttonDisabled||e.loading,autofocus:e.autofocus,type:e.nativeType},on:{click:e.handleClick}},[e.loading?n("i",{staticClass:"el-icon-loading"}):e._e(),e.icon&&!e.loading?n("i",{class:e.icon}):e._e(),e.$slots.default?n("span",[e._t("default")],2):e._e()])},o=[];r._withStripped=!0;var i={name:"ElButton",inject:{elForm:{default:""},elFormItem:{default:""}},props:{type:{type:String,default:"default"},size:String,icon:{type:String,default:""},nativeType:{type:String,default:"button"},loading:Boolean,disabled:Boolean,plain:Boolean,autofocus:Boolean,round:Boolean,circle:Boolean},computed:{_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},buttonSize:function(){return this.size||this._elFormItemSize||(this.$ELEMENT||{}).size},buttonDisabled:function(){return this.disabled||(this.elForm||{}).disabled}},methods:{handleClick:function(e){this.$emit("click",e)}}},a=i,s=n(0),l=Object(s["a"])(a,r,o,!1,null,null,null);l.options.__file="packages/button/src/button.vue";var u=l.exports;u.install=function(e){e.component(u.name,u)};t["default"]=u}})},f069:function(e,t,n){"use strict";var r=n("1c0b"),o=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r})),this.resolve=r(t),this.reject=r(n)};e.exports.f=function(e){return new o(e)}},f0d9:function(e,t,n){"use strict";t.__esModule=!0,t.default={el:{colorpicker:{confirm:"确定",clear:"清空"},datepicker:{now:"此刻",today:"今天",cancel:"取消",clear:"清空",confirm:"确定",selectDate:"选择日期",selectTime:"选择时间",startDate:"开始日期",startTime:"开始时间",endDate:"结束日期",endTime:"结束时间",prevYear:"前一年",nextYear:"后一年",prevMonth:"上个月",nextMonth:"下个月",year:"年",month1:"1 月",month2:"2 月",month3:"3 月",month4:"4 月",month5:"5 月",month6:"6 月",month7:"7 月",month8:"8 月",month9:"9 月",month10:"10 月",month11:"11 月",month12:"12 月",weeks:{sun:"日",mon:"一",tue:"二",wed:"三",thu:"四",fri:"五",sat:"六"},months:{jan:"一月",feb:"二月",mar:"三月",apr:"四月",may:"五月",jun:"六月",jul:"七月",aug:"八月",sep:"九月",oct:"十月",nov:"十一月",dec:"十二月"}},select:{loading:"加载中",noMatch:"无匹配数据",noData:"无数据",placeholder:"请选择"},cascader:{noMatch:"无匹配数据",loading:"加载中",placeholder:"请选择",noData:"暂无数据"},pagination:{goto:"前往",pagesize:"条/页",total:"共 {total} 条",pageClassifier:"页"},messagebox:{title:"提示",confirm:"确定",cancel:"取消",error:"输入的数据不合法!"},upload:{deleteTip:"按 delete 键可删除",delete:"删除",preview:"查看图片",continue:"继续上传"},table:{emptyText:"暂无数据",confirmFilter:"筛选",resetFilter:"重置",clearFilter:"全部",sumText:"合计"},tree:{emptyText:"暂无数据"},transfer:{noMatch:"无匹配数据",noData:"无数据",titles:["列表 1","列表 2"],filterPlaceholder:"请输入搜索内容",noCheckedFormat:"共 {total} 项",hasCheckedFormat:"已选 {checked}/{total} 项"},image:{error:"加载失败"},pageHeader:{title:"返回"},popconfirm:{confirmButtonText:"确定",cancelButtonText:"取消"}}}},f3ad:function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=76)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},11:function(e,t){e.exports=n("2bb5")},21:function(e,t){e.exports=n("d397")},4:function(e,t){e.exports=n("d010")},76:function(e,t,n){"use strict";n.r(t);var r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{class:["textarea"===e.type?"el-textarea":"el-input",e.inputSize?"el-input--"+e.inputSize:"",{"is-disabled":e.inputDisabled,"is-exceed":e.inputExceed,"el-input-group":e.$slots.prepend||e.$slots.append,"el-input-group--append":e.$slots.append,"el-input-group--prepend":e.$slots.prepend,"el-input--prefix":e.$slots.prefix||e.prefixIcon,"el-input--suffix":e.$slots.suffix||e.suffixIcon||e.clearable||e.showPassword}],on:{mouseenter:function(t){e.hovering=!0},mouseleave:function(t){e.hovering=!1}}},["textarea"!==e.type?[e.$slots.prepend?n("div",{staticClass:"el-input-group__prepend"},[e._t("prepend")],2):e._e(),"textarea"!==e.type?n("input",e._b({ref:"input",staticClass:"el-input__inner",attrs:{tabindex:e.tabindex,type:e.showPassword?e.passwordVisible?"text":"password":e.type,disabled:e.inputDisabled,readonly:e.readonly,autocomplete:e.autoComplete||e.autocomplete,"aria-label":e.label},on:{compositionstart:e.handleCompositionStart,compositionupdate:e.handleCompositionUpdate,compositionend:e.handleCompositionEnd,input:e.handleInput,focus:e.handleFocus,blur:e.handleBlur,change:e.handleChange}},"input",e.$attrs,!1)):e._e(),e.$slots.prefix||e.prefixIcon?n("span",{staticClass:"el-input__prefix"},[e._t("prefix"),e.prefixIcon?n("i",{staticClass:"el-input__icon",class:e.prefixIcon}):e._e()],2):e._e(),e.getSuffixVisible()?n("span",{staticClass:"el-input__suffix"},[n("span",{staticClass:"el-input__suffix-inner"},[e.showClear&&e.showPwdVisible&&e.isWordLimitVisible?e._e():[e._t("suffix"),e.suffixIcon?n("i",{staticClass:"el-input__icon",class:e.suffixIcon}):e._e()],e.showClear?n("i",{staticClass:"el-input__icon el-icon-circle-close el-input__clear",on:{mousedown:function(e){e.preventDefault()},click:e.clear}}):e._e(),e.showPwdVisible?n("i",{staticClass:"el-input__icon el-icon-view el-input__clear",on:{click:e.handlePasswordVisible}}):e._e(),e.isWordLimitVisible?n("span",{staticClass:"el-input__count"},[n("span",{staticClass:"el-input__count-inner"},[e._v("\n "+e._s(e.textLength)+"/"+e._s(e.upperLimit)+"\n ")])]):e._e()],2),e.validateState?n("i",{staticClass:"el-input__icon",class:["el-input__validateIcon",e.validateIcon]}):e._e()]):e._e(),e.$slots.append?n("div",{staticClass:"el-input-group__append"},[e._t("append")],2):e._e()]:n("textarea",e._b({ref:"textarea",staticClass:"el-textarea__inner",style:e.textareaStyle,attrs:{tabindex:e.tabindex,disabled:e.inputDisabled,readonly:e.readonly,autocomplete:e.autoComplete||e.autocomplete,"aria-label":e.label},on:{compositionstart:e.handleCompositionStart,compositionupdate:e.handleCompositionUpdate,compositionend:e.handleCompositionEnd,input:e.handleInput,focus:e.handleFocus,blur:e.handleBlur,change:e.handleChange}},"textarea",e.$attrs,!1)),e.isWordLimitVisible&&"textarea"===e.type?n("span",{staticClass:"el-input__count"},[e._v(e._s(e.textLength)+"/"+e._s(e.upperLimit))]):e._e()],2)},o=[];r._withStripped=!0;var i=n(4),a=n.n(i),s=n(11),l=n.n(s),u=void 0,c="\n height:0 !important;\n visibility:hidden !important;\n overflow:hidden !important;\n position:absolute !important;\n z-index:-1000 !important;\n top:0 !important;\n right:0 !important\n",f=["letter-spacing","line-height","padding-top","padding-bottom","font-family","font-weight","font-size","text-rendering","text-transform","width","text-indent","padding-left","padding-right","border-width","box-sizing"];function d(e){var t=window.getComputedStyle(e),n=t.getPropertyValue("box-sizing"),r=parseFloat(t.getPropertyValue("padding-bottom"))+parseFloat(t.getPropertyValue("padding-top")),o=parseFloat(t.getPropertyValue("border-bottom-width"))+parseFloat(t.getPropertyValue("border-top-width")),i=f.map((function(e){return e+":"+t.getPropertyValue(e)})).join(";");return{contextStyle:i,paddingSize:r,borderSize:o,boxSizing:n}}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;u||(u=document.createElement("textarea"),document.body.appendChild(u));var r=d(e),o=r.paddingSize,i=r.borderSize,a=r.boxSizing,s=r.contextStyle;u.setAttribute("style",s+";"+c),u.value=e.value||e.placeholder||"";var l=u.scrollHeight,f={};"border-box"===a?l+=i:"content-box"===a&&(l-=o),u.value="";var p=u.scrollHeight-o;if(null!==t){var h=p*t;"border-box"===a&&(h=h+o+i),l=Math.max(h,l),f.minHeight=h+"px"}if(null!==n){var v=p*n;"border-box"===a&&(v=v+o+i),l=Math.min(v,l)}return f.height=l+"px",u.parentNode&&u.parentNode.removeChild(u),u=null,f}var h=n(9),v=n.n(h),m=n(21),y={name:"ElInput",componentName:"ElInput",mixins:[a.a,l.a],inheritAttrs:!1,inject:{elForm:{default:""},elFormItem:{default:""}},data:function(){return{textareaCalcStyle:{},hovering:!1,focused:!1,isComposing:!1,passwordVisible:!1}},props:{value:[String,Number],size:String,resize:String,form:String,disabled:Boolean,readonly:Boolean,type:{type:String,default:"text"},autosize:{type:[Boolean,Object],default:!1},autocomplete:{type:String,default:"off"},autoComplete:{type:String,validator:function(e){return!0}},validateEvent:{type:Boolean,default:!0},suffixIcon:String,prefixIcon:String,label:String,clearable:{type:Boolean,default:!1},showPassword:{type:Boolean,default:!1},showWordLimit:{type:Boolean,default:!1},tabindex:String},computed:{_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},validateState:function(){return this.elFormItem?this.elFormItem.validateState:""},needStatusIcon:function(){return!!this.elForm&&this.elForm.statusIcon},validateIcon:function(){return{validating:"el-icon-loading",success:"el-icon-circle-check",error:"el-icon-circle-close"}[this.validateState]},textareaStyle:function(){return v()({},this.textareaCalcStyle,{resize:this.resize})},inputSize:function(){return this.size||this._elFormItemSize||(this.$ELEMENT||{}).size},inputDisabled:function(){return this.disabled||(this.elForm||{}).disabled},nativeInputValue:function(){return null===this.value||void 0===this.value?"":String(this.value)},showClear:function(){return this.clearable&&!this.inputDisabled&&!this.readonly&&this.nativeInputValue&&(this.focused||this.hovering)},showPwdVisible:function(){return this.showPassword&&!this.inputDisabled&&!this.readonly&&(!!this.nativeInputValue||this.focused)},isWordLimitVisible:function(){return this.showWordLimit&&this.$attrs.maxlength&&("text"===this.type||"textarea"===this.type)&&!this.inputDisabled&&!this.readonly&&!this.showPassword},upperLimit:function(){return this.$attrs.maxlength},textLength:function(){return"number"===typeof this.value?String(this.value).length:(this.value||"").length},inputExceed:function(){return this.isWordLimitVisible&&this.textLength>this.upperLimit}},watch:{value:function(e){this.$nextTick(this.resizeTextarea),this.validateEvent&&this.dispatch("ElFormItem","el.form.change",[e])},nativeInputValue:function(){this.setNativeInputValue()},type:function(){var e=this;this.$nextTick((function(){e.setNativeInputValue(),e.resizeTextarea(),e.updateIconOffset()}))}},methods:{focus:function(){this.getInput().focus()},blur:function(){this.getInput().blur()},getMigratingConfig:function(){return{props:{icon:"icon is removed, use suffix-icon / prefix-icon instead.","on-icon-click":"on-icon-click is removed."},events:{click:"click is removed."}}},handleBlur:function(e){this.focused=!1,this.$emit("blur",e),this.validateEvent&&this.dispatch("ElFormItem","el.form.blur",[this.value])},select:function(){this.getInput().select()},resizeTextarea:function(){if(!this.$isServer){var e=this.autosize,t=this.type;if("textarea"===t)if(e){var n=e.minRows,r=e.maxRows;this.textareaCalcStyle=p(this.$refs.textarea,n,r)}else this.textareaCalcStyle={minHeight:p(this.$refs.textarea).minHeight}}},setNativeInputValue:function(){var e=this.getInput();e&&e.value!==this.nativeInputValue&&(e.value=this.nativeInputValue)},handleFocus:function(e){this.focused=!0,this.$emit("focus",e)},handleCompositionStart:function(){this.isComposing=!0},handleCompositionUpdate:function(e){var t=e.target.value,n=t[t.length-1]||"";this.isComposing=!Object(m["isKorean"])(n)},handleCompositionEnd:function(e){this.isComposing&&(this.isComposing=!1,this.handleInput(e))},handleInput:function(e){this.isComposing||e.target.value!==this.nativeInputValue&&(this.$emit("input",e.target.value),this.$nextTick(this.setNativeInputValue))},handleChange:function(e){this.$emit("change",e.target.value)},calcIconOffset:function(e){var t=[].slice.call(this.$el.querySelectorAll(".el-input__"+e)||[]);if(t.length){for(var n=null,r=0;r0&&(this.timer=setTimeout((function(){e.closed||e.close()}),this.duration))},keydown:function(e){27===e.keyCode&&(this.closed||this.close())}},mounted:function(){this.startTimer(),document.addEventListener("keydown",this.keydown)},beforeDestroy:function(){document.removeEventListener("keydown",this.keydown)}},u=l,c=n(0),f=Object(c["a"])(u,i,a,!1,null,null,null);f.options.__file="packages/message/src/main.vue";var d=f.exports,p=n(15),h=n(23),v=o.a.extend(d),m=void 0,y=[],g=1,b=function e(t){if(!o.a.prototype.$isServer){t=t||{},"string"===typeof t&&(t={message:t});var n=t.onClose,r="message_"+g++;t.onClose=function(){e.close(r,n)},m=new v({data:t}),m.id=r,Object(h["isVNode"])(m.message)&&(m.$slots.default=[m.message],m.message=null),m.$mount(),document.body.appendChild(m.$el);var i=t.offset||20;return y.forEach((function(e){i+=e.$el.offsetHeight+16})),m.verticalOffset=i,m.visible=!0,m.$el.style.zIndex=p["PopupManager"].nextZIndex(),y.push(m),m}};["success","warning","info","error"].forEach((function(e){b[e]=function(t){return"string"===typeof t&&(t={message:t}),t.type=e,b(t)}})),b.close=function(e,t){for(var n=y.length,r=-1,o=void 0,i=0;iy.length-1))for(var a=r;a=0;e--)y[e].close()};var _=b;t["default"]=_}})},f5df:function(e,t,n){var r=n("00ee"),o=n("c6b6"),i=n("b622"),a=i("toStringTag"),s="Arguments"==o(function(){return arguments}()),l=function(e,t){try{return e[t]}catch(n){}};e.exports=r?o:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=l(t=Object(e),a))?n:s?o(t):"Object"==(r=o(t))&&"function"==typeof t.callee?"Arguments":r}},f772:function(e,t,n){var r=n("5692"),o=n("90e3"),i=r("keys");e.exports=function(e){return i[e]||(i[e]=o(e))}},fc6a:function(e,t,n){var r=n("44ad"),o=n("1d80");e.exports=function(e){return r(o(e))}},fdbf:function(e,t,n){var r=n("4930");e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},fea9:function(e,t,n){var r=n("da84");e.exports=r.Promise}}]); \ No newline at end of file diff --git a/app/src/main/assets/web/new/js/chunk-vendors.1042cf7f.js b/app/src/main/assets/web/new/js/chunk-vendors.1042cf7f.js new file mode 100644 index 000000000..c1eca4b88 --- /dev/null +++ b/app/src/main/assets/web/new/js/chunk-vendors.1042cf7f.js @@ -0,0 +1,33 @@ +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-vendors"],{"00ee":function(e,t,n){var r=n("b622"),o=r("toStringTag"),i={};i[o]="z",e.exports="[object z]"===String(i)},"0366":function(e,t,n){var r=n("1c0b");e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},"06cf":function(e,t,n){var r=n("83ab"),o=n("d1e7"),i=n("5c6c"),a=n("fc6a"),s=n("c04e"),l=n("5135"),u=n("0cfb"),c=Object.getOwnPropertyDescriptor;t.f=r?c:function(e,t){if(e=a(e),t=s(t,!0),u)try{return c(e,t)}catch(n){}if(l(e,t))return i(!o.f.call(e,t),e[t])}},"06f1":function(e,t,n){},"0cfb":function(e,t,n){var r=n("83ab"),o=n("d039"),i=n("cc12");e.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},"0e15":function(e,t,n){var r=n("597f");e.exports=function(e,t,n){return void 0===n?r(e,t,!1):r(e,n,!1!==t)}},"0fb7":function(e,t,n){},"10cb":function(e,t,n){},"14e9":function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=127)}({127:function(e,t,n){"use strict";n.r(t);var r=n(16),o=n(38),i=n.n(o),a=n(3),s=n(2),l={vertical:{offset:"offsetHeight",scroll:"scrollTop",scrollSize:"scrollHeight",size:"height",key:"vertical",axis:"Y",client:"clientY",direction:"top"},horizontal:{offset:"offsetWidth",scroll:"scrollLeft",scrollSize:"scrollWidth",size:"width",key:"horizontal",axis:"X",client:"clientX",direction:"left"}};function u(e){var t=e.move,n=e.size,r=e.bar,o={},i="translate"+r.axis+"("+t+"%)";return o[r.size]=n,o.transform=i,o.msTransform=i,o.webkitTransform=i,o}var c={name:"Bar",props:{vertical:Boolean,size:String,move:Number},computed:{bar:function(){return l[this.vertical?"vertical":"horizontal"]},wrap:function(){return this.$parent.wrap}},render:function(e){var t=this.size,n=this.move,r=this.bar;return e("div",{class:["el-scrollbar__bar","is-"+r.key],on:{mousedown:this.clickTrackHandler}},[e("div",{ref:"thumb",class:"el-scrollbar__thumb",on:{mousedown:this.clickThumbHandler},style:u({size:t,move:n,bar:r})})])},methods:{clickThumbHandler:function(e){e.ctrlKey||2===e.button||(this.startDrag(e),this[this.bar.axis]=e.currentTarget[this.bar.offset]-(e[this.bar.client]-e.currentTarget.getBoundingClientRect()[this.bar.direction]))},clickTrackHandler:function(e){var t=Math.abs(e.target.getBoundingClientRect()[this.bar.direction]-e[this.bar.client]),n=this.$refs.thumb[this.bar.offset]/2,r=100*(t-n)/this.$el[this.bar.offset];this.wrap[this.bar.scroll]=r*this.wrap[this.bar.scrollSize]/100},startDrag:function(e){e.stopImmediatePropagation(),this.cursorDown=!0,Object(s["on"])(document,"mousemove",this.mouseMoveDocumentHandler),Object(s["on"])(document,"mouseup",this.mouseUpDocumentHandler),document.onselectstart=function(){return!1}},mouseMoveDocumentHandler:function(e){if(!1!==this.cursorDown){var t=this[this.bar.axis];if(t){var n=-1*(this.$el.getBoundingClientRect()[this.bar.direction]-e[this.bar.client]),r=this.$refs.thumb[this.bar.offset]-t,o=100*(n-r)/this.$el[this.bar.offset];this.wrap[this.bar.scroll]=o*this.wrap[this.bar.scrollSize]/100}}},mouseUpDocumentHandler:function(e){this.cursorDown=!1,this[this.bar.axis]=0,Object(s["off"])(document,"mousemove",this.mouseMoveDocumentHandler),document.onselectstart=null}},destroyed:function(){Object(s["off"])(document,"mouseup",this.mouseUpDocumentHandler)}},f={name:"ElScrollbar",components:{Bar:c},props:{native:Boolean,wrapStyle:{},wrapClass:{},viewClass:{},viewStyle:{},noresize:Boolean,tag:{type:String,default:"div"}},data:function(){return{sizeWidth:"0",sizeHeight:"0",moveX:0,moveY:0}},computed:{wrap:function(){return this.$refs.wrap}},render:function(e){var t=i()(),n=this.wrapStyle;if(t){var r="-"+t+"px",o="margin-bottom: "+r+"; margin-right: "+r+";";Array.isArray(this.wrapStyle)?(n=Object(a["toObject"])(this.wrapStyle),n.marginRight=n.marginBottom=r):"string"===typeof this.wrapStyle?n+=o:n=o}var s=e(this.tag,{class:["el-scrollbar__view",this.viewClass],style:this.viewStyle,ref:"resize"},this.$slots.default),l=e("div",{ref:"wrap",style:n,on:{scroll:this.handleScroll},class:[this.wrapClass,"el-scrollbar__wrap",t?"":"el-scrollbar__wrap--hidden-default"]},[[s]]),u=void 0;return u=this.native?[e("div",{ref:"wrap",class:[this.wrapClass,"el-scrollbar__wrap"],style:n},[[s]])]:[l,e(c,{attrs:{move:this.moveX,size:this.sizeWidth}}),e(c,{attrs:{vertical:!0,move:this.moveY,size:this.sizeHeight}})],e("div",{class:"el-scrollbar"},u)},methods:{handleScroll:function(){var e=this.wrap;this.moveY=100*e.scrollTop/e.clientHeight,this.moveX=100*e.scrollLeft/e.clientWidth},update:function(){var e=void 0,t=void 0,n=this.wrap;n&&(e=100*n.clientHeight/n.scrollHeight,t=100*n.clientWidth/n.scrollWidth,this.sizeHeight=e<100?e+"%":"",this.sizeWidth=t<100?t+"%":"")}},mounted:function(){this.native||(this.$nextTick(this.update),!this.noresize&&Object(r["addResizeListener"])(this.$refs.resize,this.update))},beforeDestroy:function(){this.native||!this.noresize&&Object(r["removeResizeListener"])(this.$refs.resize,this.update)},install:function(e){e.component(f.name,f)}};t["default"]=f},16:function(e,t){e.exports=n("4010")},2:function(e,t){e.exports=n("5924")},3:function(e,t){e.exports=n("8122")},38:function(e,t){e.exports=n("e62d")}})},1951:function(e,t,n){},"19aa":function(e,t){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},"1be4":function(e,t,n){var r=n("d066");e.exports=r("document","documentElement")},"1c0b":function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},"1c7e":function(e,t,n){var r=n("b622"),o=r("iterator"),i=!1;try{var a=0,s={next:function(){return{done:!!a++}},return:function(){i=!0}};s[o]=function(){return this},Array.from(s,(function(){throw 2}))}catch(l){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var r={};r[o]=function(){return{next:function(){return{done:n=!0}}}},e(r)}catch(l){}return n}},"1cdc":function(e,t,n){var r=n("342f");e.exports=/(iphone|ipod|ipad).*applewebkit/i.test(r)},"1d80":function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},2266:function(e,t,n){var r=n("825a"),o=n("e95a"),i=n("50c4"),a=n("0366"),s=n("35a1"),l=n("2a62"),u=function(e,t){this.stopped=e,this.result=t};e.exports=function(e,t,n){var c,f,d,p,h,v,m,y=n&&n.that,g=!(!n||!n.AS_ENTRIES),b=!(!n||!n.IS_ITERATOR),_=!(!n||!n.INTERRUPTED),x=a(t,y,1+g+_),w=function(e){return c&&l(c),new u(!0,e)},C=function(e){return g?(r(e),_?x(e[0],e[1],w):x(e[0],e[1])):_?x(e,w):x(e)};if(b)c=e;else{if(f=s(e),"function"!=typeof f)throw TypeError("Target is not iterable");if(o(f)){for(d=0,p=i(e.length);p>d;d++)if(h=C(e[d]),h&&h instanceof u)return h;return new u(!1)}c=f.call(e)}v=c.next;while(!(m=v.call(c)).done){try{h=C(m.value)}catch(S){throw l(c),S}if("object"==typeof h&&h&&h instanceof u)return h}return new u(!1)}},"23cb":function(e,t,n){var r=n("a691"),o=Math.max,i=Math.min;e.exports=function(e,t){var n=r(e);return n<0?o(n+t,0):i(n,t)}},"23e7":function(e,t,n){var r=n("da84"),o=n("06cf").f,i=n("9112"),a=n("6eeb"),s=n("ce4e"),l=n("e893"),u=n("94ca");e.exports=function(e,t){var n,c,f,d,p,h,v=e.target,m=e.global,y=e.stat;if(c=m?r:y?r[v]||s(v,{}):(r[v]||{}).prototype,c)for(f in t){if(p=t[f],e.noTargetGet?(h=o(c,f),d=h&&h.value):d=c[f],n=u(m?f:v+(y?".":"#")+f,e.forced),!n&&void 0!==d){if(typeof p===typeof d)continue;l(p,d)}(e.sham||d&&d.sham)&&i(p,"sham",!0),a(c,f,p,e)}}},"241c":function(e,t,n){var r=n("ca84"),o=n("7839"),i=o.concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},"25f0":function(e,t,n){"use strict";var r=n("6eeb"),o=n("825a"),i=n("d039"),a=n("ad6d"),s="toString",l=RegExp.prototype,u=l[s],c=i((function(){return"/a/b"!=u.call({source:"a",flags:"b"})})),f=u.name!=s;(c||f)&&r(RegExp.prototype,s,(function(){var e=o(this),t=String(e.source),n=e.flags,r=String(void 0===n&&e instanceof RegExp&&!("flags"in l)?a.call(e):n);return"/"+t+"/"+r}),{unsafe:!0})},2626:function(e,t,n){"use strict";var r=n("d066"),o=n("9bf2"),i=n("b622"),a=n("83ab"),s=i("species");e.exports=function(e){var t=r(e),n=o.f;a&&t&&!t[s]&&n(t,s,{configurable:!0,get:function(){return this}})}},2877:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,(u.functional?this.parent:this).$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},"299c":function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=131)}({131:function(e,t,n){"use strict";n.r(t);var r=n(5),o=n.n(r),i=n(17),a=n.n(i),s=n(2),l=n(3),u=n(7),c=n.n(u),f={name:"ElTooltip",mixins:[o.a],props:{openDelay:{type:Number,default:0},disabled:Boolean,manual:Boolean,effect:{type:String,default:"dark"},arrowOffset:{type:Number,default:0},popperClass:String,content:String,visibleArrow:{default:!0},transition:{type:String,default:"el-fade-in-linear"},popperOptions:{default:function(){return{boundariesPadding:10,gpuAcceleration:!1}}},enterable:{type:Boolean,default:!0},hideAfter:{type:Number,default:0},tabindex:{type:Number,default:0}},data:function(){return{tooltipId:"el-tooltip-"+Object(l["generateId"])(),timeoutPending:null,focusing:!1}},beforeCreate:function(){var e=this;this.$isServer||(this.popperVM=new c.a({data:{node:""},render:function(e){return this.node}}).$mount(),this.debounceClose=a()(200,(function(){return e.handleClosePopper()})))},render:function(e){var t=this;this.popperVM&&(this.popperVM.node=e("transition",{attrs:{name:this.transition},on:{afterLeave:this.doDestroy}},[e("div",{on:{mouseleave:function(){t.setExpectedState(!1),t.debounceClose()},mouseenter:function(){t.setExpectedState(!0)}},ref:"popper",attrs:{role:"tooltip",id:this.tooltipId,"aria-hidden":this.disabled||!this.showPopper?"true":"false"},directives:[{name:"show",value:!this.disabled&&this.showPopper}],class:["el-tooltip__popper","is-"+this.effect,this.popperClass]},[this.$slots.content||this.content])]));var n=this.getFirstElement();if(!n)return null;var r=n.data=n.data||{};return r.staticClass=this.addTooltipClass(r.staticClass),n},mounted:function(){var e=this;this.referenceElm=this.$el,1===this.$el.nodeType&&(this.$el.setAttribute("aria-describedby",this.tooltipId),this.$el.setAttribute("tabindex",this.tabindex),Object(s["on"])(this.referenceElm,"mouseenter",this.show),Object(s["on"])(this.referenceElm,"mouseleave",this.hide),Object(s["on"])(this.referenceElm,"focus",(function(){if(e.$slots.default&&e.$slots.default.length){var t=e.$slots.default[0].componentInstance;t&&t.focus?t.focus():e.handleFocus()}else e.handleFocus()})),Object(s["on"])(this.referenceElm,"blur",this.handleBlur),Object(s["on"])(this.referenceElm,"click",this.removeFocusing)),this.value&&this.popperVM&&this.popperVM.$nextTick((function(){e.value&&e.updatePopper()}))},watch:{focusing:function(e){e?Object(s["addClass"])(this.referenceElm,"focusing"):Object(s["removeClass"])(this.referenceElm,"focusing")}},methods:{show:function(){this.setExpectedState(!0),this.handleShowPopper()},hide:function(){this.setExpectedState(!1),this.debounceClose()},handleFocus:function(){this.focusing=!0,this.show()},handleBlur:function(){this.focusing=!1,this.hide()},removeFocusing:function(){this.focusing=!1},addTooltipClass:function(e){return e?"el-tooltip "+e.replace("el-tooltip",""):"el-tooltip"},handleShowPopper:function(){var e=this;this.expectedState&&!this.manual&&(clearTimeout(this.timeout),this.timeout=setTimeout((function(){e.showPopper=!0}),this.openDelay),this.hideAfter>0&&(this.timeoutPending=setTimeout((function(){e.showPopper=!1}),this.hideAfter)))},handleClosePopper:function(){this.enterable&&this.expectedState||this.manual||(clearTimeout(this.timeout),this.timeoutPending&&clearTimeout(this.timeoutPending),this.showPopper=!1,this.disabled&&this.doDestroy())},setExpectedState:function(e){!1===e&&clearTimeout(this.timeoutPending),this.expectedState=e},getFirstElement:function(){var e=this.$slots.default;if(!Array.isArray(e))return null;for(var t=null,n=0;n=0&&Math.floor(t)===t&&isFinite(e)}function p(e){return o(e)&&"function"===typeof e.then&&"function"===typeof e.catch}function h(e){return null==e?"":Array.isArray(e)||c(e)&&e.toString===u?JSON.stringify(e,null,2):String(e)}function v(e){var t=parseFloat(e);return isNaN(t)?e:t}function m(e,t){for(var n=Object.create(null),r=e.split(","),o=0;o-1)return e.splice(n,1)}}var b=Object.prototype.hasOwnProperty;function _(e,t){return b.call(e,t)}function x(e){var t=Object.create(null);return function(n){var r=t[n];return r||(t[n]=e(n))}}var w=/-(\w)/g,C=x((function(e){return e.replace(w,(function(e,t){return t?t.toUpperCase():""}))})),S=x((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),O=/\B([A-Z])/g,E=x((function(e){return e.replace(O,"-$1").toLowerCase()}));function k(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n}function $(e,t){return e.bind(t)}var j=Function.prototype.bind?$:k;function A(e,t){t=t||0;var n=e.length-t,r=new Array(n);while(n--)r[n]=e[n+t];return r}function T(e,t){for(var n in t)e[n]=t[n];return e}function M(e){for(var t={},n=0;n0,ne=Q&&Q.indexOf("edge/")>0,re=(Q&&Q.indexOf("android"),Q&&/iphone|ipad|ipod|ios/.test(Q)||"ios"===Z),oe=(Q&&/chrome\/\d+/.test(Q),Q&&/phantomjs/.test(Q),Q&&Q.match(/firefox\/(\d+)/)),ie={}.watch,ae=!1;if(Y)try{var se={};Object.defineProperty(se,"passive",{get:function(){ae=!0}}),window.addEventListener("test-passive",null,se)}catch(Ca){}var le=function(){return void 0===G&&(G=!Y&&!J&&"undefined"!==typeof e&&(e["process"]&&"server"===e["process"].env.VUE_ENV)),G},ue=Y&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ce(e){return"function"===typeof e&&/native code/.test(e.toString())}var fe,de="undefined"!==typeof Symbol&&ce(Symbol)&&"undefined"!==typeof Reflect&&ce(Reflect.ownKeys);fe="undefined"!==typeof Set&&ce(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var pe=P,he=0,ve=function(){this.id=he++,this.subs=[]};ve.prototype.addSub=function(e){this.subs.push(e)},ve.prototype.removeSub=function(e){g(this.subs,e)},ve.prototype.depend=function(){ve.target&&ve.target.addDep(this)},ve.prototype.notify=function(){var e=this.subs.slice();for(var t=0,n=e.length;t-1)if(i&&!_(o,"default"))a=!1;else if(""===a||a===E(e)){var l=et(String,o.type);(l<0||s0&&(a=kt(a,(t||"")+"_"+n),Et(a[0])&&Et(u)&&(c[l]=we(u.text+a[0].text),a.shift()),c.push.apply(c,a)):s(a)?Et(u)?c[l]=we(u.text+a):""!==a&&c.push(we(a)):Et(a)&&Et(u)?c[l]=we(u.text+a.text):(i(e._isVList)&&o(a.tag)&&r(a.key)&&o(t)&&(a.key="__vlist"+t+"_"+n+"__"),c.push(a)));return c}function $t(e){var t=e.$options.provide;t&&(e._provided="function"===typeof t?t.call(e):t)}function jt(e){var t=At(e.$options.inject,e);t&&(je(!1),Object.keys(t).forEach((function(n){Le(e,n,t[n])})),je(!0))}function At(e,t){if(e){for(var n=Object.create(null),r=de?Reflect.ownKeys(e):Object.keys(e),o=0;o0,a=e?!!e.$stable:!i,s=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(a&&r&&r!==n&&s===r.$key&&!i&&!r.$hasNormal)return r;for(var l in o={},e)e[l]&&"$"!==l[0]&&(o[l]=Lt(t,l,e[l]))}else o={};for(var u in t)u in o||(o[u]=Rt(t,u));return e&&Object.isExtensible(e)&&(e._normalized=o),U(o,"$stable",a),U(o,"$key",s),U(o,"$hasNormal",i),o}function Lt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({});return e=e&&"object"===typeof e&&!Array.isArray(e)?[e]:Ot(e),e&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function Rt(e,t){return function(){return e[t]}}function Nt(e,t){var n,r,i,a,s;if(Array.isArray(e)||"string"===typeof e)for(n=new Array(e.length),r=0,i=e.length;r1?A(n):n;for(var r=A(arguments,1),o='event handler for "'+e+'"',i=0,a=n.length;idocument.createEvent("Event").timeStamp&&(Gn=function(){return Xn.now()})}function Yn(){var e,t;for(Kn=Gn(),Vn=!0,zn.sort((function(e,t){return e.id-t.id})),Un=0;UnUn&&zn[n].id>e.id)n--;zn.splice(n+1,0,e)}else zn.push(e);Wn||(Wn=!0,ht(Yn))}}var tr=0,nr=function(e,t,n,r,o){this.vm=e,o&&(e._watcher=this),e._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync,this.before=r.before):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++tr,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new fe,this.newDepIds=new fe,this.expression="","function"===typeof t?this.getter=t:(this.getter=K(t),this.getter||(this.getter=P)),this.value=this.lazy?void 0:this.get()};nr.prototype.get=function(){var e;ye(this);var t=this.vm;try{e=this.getter.call(t,t)}catch(Ca){if(!this.user)throw Ca;tt(Ca,t,'getter for watcher "'+this.expression+'"')}finally{this.deep&&mt(e),ge(),this.cleanupDeps()}return e},nr.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},nr.prototype.cleanupDeps=function(){var e=this.deps.length;while(e--){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},nr.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():er(this)},nr.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||l(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(Ca){tt(Ca,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},nr.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},nr.prototype.depend=function(){var e=this.deps.length;while(e--)this.deps[e].depend()},nr.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||g(this.vm._watchers,this);var e=this.deps.length;while(e--)this.deps[e].removeSub(this);this.active=!1}};var rr={enumerable:!0,configurable:!0,get:P,set:P};function or(e,t,n){rr.get=function(){return this[t][n]},rr.set=function(e){this[t][n]=e},Object.defineProperty(e,n,rr)}function ir(e){e._watchers=[];var t=e.$options;t.props&&ar(e,t.props),t.methods&&hr(e,t.methods),t.data?sr(e):Pe(e._data={},!0),t.computed&&cr(e,t.computed),t.watch&&t.watch!==ie&&vr(e,t.watch)}function ar(e,t){var n=e.$options.propsData||{},r=e._props={},o=e.$options._propKeys=[],i=!e.$parent;i||je(!1);var a=function(i){o.push(i);var a=Ye(i,t,n,e);Le(r,i,a),i in e||or(e,"_props",i)};for(var s in t)a(s);je(!0)}function sr(e){var t=e.$options.data;t=e._data="function"===typeof t?lr(t,e):t||{},c(t)||(t={});var n=Object.keys(t),r=e.$options.props,o=(e.$options.methods,n.length);while(o--){var i=n[o];0,r&&_(r,i)||V(i)||or(e,"_data",i)}Pe(t,!0)}function lr(e,t){ye();try{return e.call(t,t)}catch(Ca){return tt(Ca,t,"data()"),{}}finally{ge()}}var ur={lazy:!0};function cr(e,t){var n=e._computedWatchers=Object.create(null),r=le();for(var o in t){var i=t[o],a="function"===typeof i?i:i.get;0,r||(n[o]=new nr(e,a||P,P,ur)),o in e||fr(e,o,i)}}function fr(e,t,n){var r=!le();"function"===typeof n?(rr.get=r?dr(t):pr(n),rr.set=P):(rr.get=n.get?r&&!1!==n.cache?dr(t):pr(n.get):P,rr.set=n.set||P),Object.defineProperty(e,t,rr)}function dr(e){return function(){var t=this._computedWatchers&&this._computedWatchers[e];if(t)return t.dirty&&t.evaluate(),ve.target&&t.depend(),t.value}}function pr(e){return function(){return e.call(this,this)}}function hr(e,t){e.$options.props;for(var n in t)e[n]="function"!==typeof t[n]?P:j(t[n],e)}function vr(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var o=0;o-1)return this;var n=A(arguments,1);return n.unshift(this),"function"===typeof e.install?e.install.apply(e,n):"function"===typeof e&&e.apply(null,n),t.push(e),this}}function Or(e){e.mixin=function(e){return this.options=Ge(this.options,e),this}}function Er(e){e.cid=0;var t=1;e.extend=function(e){e=e||{};var n=this,r=n.cid,o=e._Ctor||(e._Ctor={});if(o[r])return o[r];var i=e.name||n.options.name;var a=function(e){this._init(e)};return a.prototype=Object.create(n.prototype),a.prototype.constructor=a,a.cid=t++,a.options=Ge(n.options,e),a["super"]=n,a.options.props&&kr(a),a.options.computed&&$r(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,z.forEach((function(e){a[e]=n[e]})),i&&(a.options.components[i]=a),a.superOptions=n.options,a.extendOptions=e,a.sealedOptions=T({},a.options),o[r]=a,a}}function kr(e){var t=e.options.props;for(var n in t)or(e.prototype,"_props",n)}function $r(e){var t=e.options.computed;for(var n in t)fr(e.prototype,n,t[n])}function jr(e){z.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&c(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"===typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}function Ar(e){return e&&(e.Ctor.options.name||e.tag)}function Tr(e,t){return Array.isArray(e)?e.indexOf(t)>-1:"string"===typeof e?e.split(",").indexOf(t)>-1:!!f(e)&&e.test(t)}function Mr(e,t){var n=e.cache,r=e.keys,o=e._vnode;for(var i in n){var a=n[i];if(a){var s=Ar(a.componentOptions);s&&!t(s)&&Pr(n,i,r,o)}}}function Pr(e,t,n,r){var o=e[t];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),e[t]=null,g(n,t)}br(Cr),yr(Cr),jn(Cr),Pn(Cr),gn(Cr);var Lr=[String,RegExp,Array],Rr={name:"keep-alive",abstract:!0,props:{include:Lr,exclude:Lr,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Pr(this.cache,e,this.keys)},mounted:function(){var e=this;this.$watch("include",(function(t){Mr(e,(function(e){return Tr(t,e)}))})),this.$watch("exclude",(function(t){Mr(e,(function(e){return!Tr(t,e)}))}))},render:function(){var e=this.$slots.default,t=Cn(e),n=t&&t.componentOptions;if(n){var r=Ar(n),o=this,i=o.include,a=o.exclude;if(i&&(!r||!Tr(i,r))||a&&r&&Tr(a,r))return t;var s=this,l=s.cache,u=s.keys,c=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;l[c]?(t.componentInstance=l[c].componentInstance,g(u,c),u.push(c)):(l[c]=t,u.push(c),this.max&&u.length>parseInt(this.max)&&Pr(l,u[0],u,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}},Nr={KeepAlive:Rr};function Ir(e){var t={get:function(){return B}};Object.defineProperty(e,"config",t),e.util={warn:pe,extend:T,mergeOptions:Ge,defineReactive:Le},e.set=Re,e.delete=Ne,e.nextTick=ht,e.observable=function(e){return Pe(e),e},e.options=Object.create(null),z.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,T(e.options.components,Nr),Sr(e),Or(e),Er(e),jr(e)}Ir(Cr),Object.defineProperty(Cr.prototype,"$isServer",{get:le}),Object.defineProperty(Cr.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Cr,"FunctionalRenderContext",{value:Jt}),Cr.version="2.6.12";var Fr=m("style,class"),Hr=m("input,textarea,option,select,progress"),zr=function(e,t,n){return"value"===n&&Hr(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Dr=m("contenteditable,draggable,spellcheck"),Br=m("events,caret,typing,plaintext-only"),Wr=function(e,t){return Gr(t)||"false"===t?"false":"contenteditable"===e&&Br(t)?t:"true"},Vr=m("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),Ur="http://www.w3.org/1999/xlink",qr=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Kr=function(e){return qr(e)?e.slice(6,e.length):""},Gr=function(e){return null==e||!1===e};function Xr(e){var t=e.data,n=e,r=e;while(o(r.componentInstance))r=r.componentInstance._vnode,r&&r.data&&(t=Yr(r.data,t));while(o(n=n.parent))n&&n.data&&(t=Yr(t,n.data));return Jr(t.staticClass,t.class)}function Yr(e,t){return{staticClass:Zr(e.staticClass,t.staticClass),class:o(e.class)?[e.class,t.class]:t.class}}function Jr(e,t){return o(e)||o(t)?Zr(e,Qr(t)):""}function Zr(e,t){return e?t?e+" "+t:e:t||""}function Qr(e){return Array.isArray(e)?eo(e):l(e)?to(e):"string"===typeof e?e:""}function eo(e){for(var t,n="",r=0,i=e.length;r-1?so[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:so[e]=/HTMLUnknownElement/.test(t.toString())}var uo=m("text,number,password,search,email,tel,url");function co(e){if("string"===typeof e){var t=document.querySelector(e);return t||document.createElement("div")}return e}function fo(e,t){var n=document.createElement(e);return"select"!==e||t.data&&t.data.attrs&&void 0!==t.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n}function po(e,t){return document.createElementNS(no[e],t)}function ho(e){return document.createTextNode(e)}function vo(e){return document.createComment(e)}function mo(e,t,n){e.insertBefore(t,n)}function yo(e,t){e.removeChild(t)}function go(e,t){e.appendChild(t)}function bo(e){return e.parentNode}function _o(e){return e.nextSibling}function xo(e){return e.tagName}function wo(e,t){e.textContent=t}function Co(e,t){e.setAttribute(t,"")}var So=Object.freeze({createElement:fo,createElementNS:po,createTextNode:ho,createComment:vo,insertBefore:mo,removeChild:yo,appendChild:go,parentNode:bo,nextSibling:_o,tagName:xo,setTextContent:wo,setStyleScope:Co}),Oo={create:function(e,t){Eo(t)},update:function(e,t){e.data.ref!==t.data.ref&&(Eo(e,!0),Eo(t))},destroy:function(e){Eo(e,!0)}};function Eo(e,t){var n=e.data.ref;if(o(n)){var r=e.context,i=e.componentInstance||e.elm,a=r.$refs;t?Array.isArray(a[n])?g(a[n],i):a[n]===i&&(a[n]=void 0):e.data.refInFor?Array.isArray(a[n])?a[n].indexOf(i)<0&&a[n].push(i):a[n]=[i]:a[n]=i}}var ko=new be("",{},[]),$o=["create","activate","update","remove","destroy"];function jo(e,t){return e.key===t.key&&(e.tag===t.tag&&e.isComment===t.isComment&&o(e.data)===o(t.data)&&Ao(e,t)||i(e.isAsyncPlaceholder)&&e.asyncFactory===t.asyncFactory&&r(t.asyncFactory.error))}function Ao(e,t){if("input"!==e.tag)return!0;var n,r=o(n=e.data)&&o(n=n.attrs)&&n.type,i=o(n=t.data)&&o(n=n.attrs)&&n.type;return r===i||uo(r)&&uo(i)}function To(e,t,n){var r,i,a={};for(r=t;r<=n;++r)i=e[r].key,o(i)&&(a[i]=r);return a}function Mo(e){var t,n,a={},l=e.modules,u=e.nodeOps;for(t=0;t<$o.length;++t)for(a[$o[t]]=[],n=0;nv?(f=r(n[g+1])?null:n[g+1].elm,C(e,f,n,h,g,i)):h>g&&O(t,d,v)}function $(e,t,n,r){for(var i=n;i-1?Wo(e,t,n):Vr(t)?Gr(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Dr(t)?e.setAttribute(t,Wr(t,n)):qr(t)?Gr(n)?e.removeAttributeNS(Ur,Kr(t)):e.setAttributeNS(Ur,t,n):Wo(e,t,n)}function Wo(e,t,n){if(Gr(n))e.removeAttribute(t);else{if(ee&&!te&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var Vo={create:Do,update:Do};function Uo(e,t){var n=t.elm,i=t.data,a=e.data;if(!(r(i.staticClass)&&r(i.class)&&(r(a)||r(a.staticClass)&&r(a.class)))){var s=Xr(t),l=n._transitionClasses;o(l)&&(s=Zr(s,Qr(l))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var qo,Ko={create:Uo,update:Uo},Go="__r",Xo="__c";function Yo(e){if(o(e[Go])){var t=ee?"change":"input";e[t]=[].concat(e[Go],e[t]||[]),delete e[Go]}o(e[Xo])&&(e.change=[].concat(e[Xo],e.change||[]),delete e[Xo])}function Jo(e,t,n){var r=qo;return function o(){var i=t.apply(null,arguments);null!==i&&ei(e,o,n,r)}}var Zo=at&&!(oe&&Number(oe[1])<=53);function Qo(e,t,n,r){if(Zo){var o=Kn,i=t;t=i._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=o||e.timeStamp<=0||e.target.ownerDocument!==document)return i.apply(this,arguments)}}qo.addEventListener(e,t,ae?{capture:n,passive:r}:n)}function ei(e,t,n,r){(r||qo).removeEventListener(e,t._wrapper||t,n)}function ti(e,t){if(!r(e.data.on)||!r(t.data.on)){var n=t.data.on||{},o=e.data.on||{};qo=t.elm,Yo(n),_t(n,o,Qo,ei,Jo,t.context),qo=void 0}}var ni,ri={create:ti,update:ti};function oi(e,t){if(!r(e.data.domProps)||!r(t.data.domProps)){var n,i,a=t.elm,s=e.data.domProps||{},l=t.data.domProps||{};for(n in o(l.__ob__)&&(l=t.data.domProps=T({},l)),s)n in l||(a[n]="");for(n in l){if(i=l[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),i===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=i;var u=r(i)?"":String(i);ii(a,u)&&(a.value=u)}else if("innerHTML"===n&&oo(a.tagName)&&r(a.innerHTML)){ni=ni||document.createElement("div"),ni.innerHTML=""+i+"";var c=ni.firstChild;while(a.firstChild)a.removeChild(a.firstChild);while(c.firstChild)a.appendChild(c.firstChild)}else if(i!==s[n])try{a[n]=i}catch(Ca){}}}}function ii(e,t){return!e.composing&&("OPTION"===e.tagName||ai(e,t)||si(e,t))}function ai(e,t){var n=!0;try{n=document.activeElement!==e}catch(Ca){}return n&&e.value!==t}function si(e,t){var n=e.value,r=e._vModifiers;if(o(r)){if(r.number)return v(n)!==v(t);if(r.trim)return n.trim()!==t.trim()}return n!==t}var li={create:oi,update:oi},ui=x((function(e){var t={},n=/;(?![^(]*\))/g,r=/:(.+)/;return e.split(n).forEach((function(e){if(e){var n=e.split(r);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}));function ci(e){var t=fi(e.style);return e.staticStyle?T(e.staticStyle,t):t}function fi(e){return Array.isArray(e)?M(e):"string"===typeof e?ui(e):e}function di(e,t){var n,r={};if(t){var o=e;while(o.componentInstance)o=o.componentInstance._vnode,o&&o.data&&(n=ci(o.data))&&T(r,n)}(n=ci(e.data))&&T(r,n);var i=e;while(i=i.parent)i.data&&(n=ci(i.data))&&T(r,n);return r}var pi,hi=/^--/,vi=/\s*!important$/,mi=function(e,t,n){if(hi.test(t))e.style.setProperty(t,n);else if(vi.test(n))e.style.setProperty(E(t),n.replace(vi,""),"important");else{var r=gi(t);if(Array.isArray(n))for(var o=0,i=n.length;o-1?t.split(xi).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function Ci(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(xi).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";while(n.indexOf(r)>=0)n=n.replace(r," ");n=n.trim(),n?e.setAttribute("class",n):e.removeAttribute("class")}}function Si(e){if(e){if("object"===typeof e){var t={};return!1!==e.css&&T(t,Oi(e.name||"v")),T(t,e),t}return"string"===typeof e?Oi(e):void 0}}var Oi=x((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),Ei=Y&&!te,ki="transition",$i="animation",ji="transition",Ai="transitionend",Ti="animation",Mi="animationend";Ei&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(ji="WebkitTransition",Ai="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Ti="WebkitAnimation",Mi="webkitAnimationEnd"));var Pi=Y?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Li(e){Pi((function(){Pi(e)}))}function Ri(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),wi(e,t))}function Ni(e,t){e._transitionClasses&&g(e._transitionClasses,t),Ci(e,t)}function Ii(e,t,n){var r=Hi(e,t),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s=o===ki?Ai:Mi,l=0,u=function(){e.removeEventListener(s,c),n()},c=function(t){t.target===e&&++l>=a&&u()};setTimeout((function(){l0&&(n=ki,c=a,f=i.length):t===$i?u>0&&(n=$i,c=u,f=l.length):(c=Math.max(a,u),n=c>0?a>u?ki:$i:null,f=n?n===ki?i.length:l.length:0);var d=n===ki&&Fi.test(r[ji+"Property"]);return{type:n,timeout:c,propCount:f,hasTransform:d}}function zi(e,t){while(e.length1}function qi(e,t){!0!==t.data.show&&Bi(t)}var Ki=Y?{create:qi,activate:qi,remove:function(e,t){!0!==e.data.show?Wi(e,t):t()}}:{},Gi=[Vo,Ko,ri,li,_i,Ki],Xi=Gi.concat(zo),Yi=Mo({nodeOps:So,modules:Xi});te&&document.addEventListener("selectionchange",(function(){var e=document.activeElement;e&&e.vmodel&&oa(e,"input")}));var Ji={inserted:function(e,t,n,r){"select"===n.tag?(r.elm&&!r.elm._vOptions?xt(n,"postpatch",(function(){Ji.componentUpdated(e,t,n)})):Zi(e,t,n.context),e._vOptions=[].map.call(e.options,ta)):("textarea"===n.tag||uo(e.type))&&(e._vModifiers=t.modifiers,t.modifiers.lazy||(e.addEventListener("compositionstart",na),e.addEventListener("compositionend",ra),e.addEventListener("change",ra),te&&(e.vmodel=!0)))},componentUpdated:function(e,t,n){if("select"===n.tag){Zi(e,t,n.context);var r=e._vOptions,o=e._vOptions=[].map.call(e.options,ta);if(o.some((function(e,t){return!N(e,r[t])}))){var i=e.multiple?t.value.some((function(e){return ea(e,o)})):t.value!==t.oldValue&&ea(t.value,o);i&&oa(e,"change")}}}};function Zi(e,t,n){Qi(e,t,n),(ee||ne)&&setTimeout((function(){Qi(e,t,n)}),0)}function Qi(e,t,n){var r=t.value,o=e.multiple;if(!o||Array.isArray(r)){for(var i,a,s=0,l=e.options.length;s-1,a.selected!==i&&(a.selected=i);else if(N(ta(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));o||(e.selectedIndex=-1)}}function ea(e,t){return t.every((function(t){return!N(t,e)}))}function ta(e){return"_value"in e?e._value:e.value}function na(e){e.target.composing=!0}function ra(e){e.target.composing&&(e.target.composing=!1,oa(e.target,"input"))}function oa(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function ia(e){return!e.componentInstance||e.data&&e.data.transition?e:ia(e.componentInstance._vnode)}var aa={bind:function(e,t,n){var r=t.value;n=ia(n);var o=n.data&&n.data.transition,i=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&o?(n.data.show=!0,Bi(n,(function(){e.style.display=i}))):e.style.display=r?i:"none"},update:function(e,t,n){var r=t.value,o=t.oldValue;if(!r!==!o){n=ia(n);var i=n.data&&n.data.transition;i?(n.data.show=!0,r?Bi(n,(function(){e.style.display=e.__vOriginalDisplay})):Wi(n,(function(){e.style.display="none"}))):e.style.display=r?e.__vOriginalDisplay:"none"}},unbind:function(e,t,n,r,o){o||(e.style.display=e.__vOriginalDisplay)}},sa={model:Ji,show:aa},la={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function ua(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?ua(Cn(t.children)):e}function ca(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var o=n._parentListeners;for(var i in o)t[C(i)]=o[i];return t}function fa(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}function da(e){while(e=e.parent)if(e.data.transition)return!0}function pa(e,t){return t.key===e.key&&t.tag===e.tag}var ha=function(e){return e.tag||wn(e)},va=function(e){return"show"===e.name},ma={name:"transition",props:la,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(ha),n.length)){0;var r=this.mode;0;var o=n[0];if(da(this.$vnode))return o;var i=ua(o);if(!i)return o;if(this._leaving)return fa(e,o);var a="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?a+"comment":a+i.tag:s(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var l=(i.data||(i.data={})).transition=ca(this),u=this._vnode,c=ua(u);if(i.data.directives&&i.data.directives.some(va)&&(i.data.show=!0),c&&c.data&&!pa(i,c)&&!wn(c)&&(!c.componentInstance||!c.componentInstance._vnode.isComment)){var f=c.data.transition=T({},l);if("out-in"===r)return this._leaving=!0,xt(f,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),fa(e,o);if("in-out"===r){if(wn(i))return u;var d,p=function(){d()};xt(l,"afterEnter",p),xt(l,"enterCancelled",p),xt(f,"delayLeave",(function(e){d=e}))}}return o}}},ya=T({tag:String,moveClass:String},la);delete ya.mode;var ga={props:ya,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var o=Tn(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,o(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=ca(this),s=0;sn)t.push(arguments[n++]);return _[++b]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},r(b),b},v=function(e){delete _[e]},d?r=function(e){m.nextTick(C(e))}:g&&g.now?r=function(e){g.now(C(e))}:y&&!f?(o=new y,i=o.port2,o.port1.onmessage=S,r=l(i.postMessage,i,1)):a.addEventListener&&"function"==typeof postMessage&&!a.importScripts&&p&&"file:"!==p.protocol&&!s(O)?(r=O,a.addEventListener("message",S,!1)):r=x in c("script")?function(e){u.appendChild(c("script"))[x]=function(){u.removeChild(this),w(e)}}:function(e){setTimeout(C(e),0)}),e.exports={set:h,clear:v}},"2d00":function(e,t,n){var r,o,i=n("da84"),a=n("342f"),s=i.process,l=s&&s.versions,u=l&&l.v8;u?(r=u.split("."),o=r[0]+r[1]):a&&(r=a.match(/Edge\/(\d+)/),(!r||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/),r&&(o=r[1]))),e.exports=o&&+o},"2f62":function(e,t,n){"use strict";(function(e){ +/*! + * vuex v3.6.2 + * (c) 2021 Evan You + * @license MIT + */ +function n(e){var t=Number(e.version.split(".")[0]);if(t>=2)e.mixin({beforeCreate:r});else{var n=e.prototype._init;e.prototype._init=function(e){void 0===e&&(e={}),e.init=e.init?[r].concat(e.init):r,n.call(this,e)}}function r(){var e=this.$options;e.store?this.$store="function"===typeof e.store?e.store():e.store:e.parent&&e.parent.$store&&(this.$store=e.parent.$store)}}var r="undefined"!==typeof window?window:"undefined"!==typeof e?e:{},o=r.__VUE_DEVTOOLS_GLOBAL_HOOK__;function i(e){o&&(e._devtoolHook=o,o.emit("vuex:init",e),o.on("vuex:travel-to-state",(function(t){e.replaceState(t)})),e.subscribe((function(e,t){o.emit("vuex:mutation",e,t)}),{prepend:!0}),e.subscribeAction((function(e,t){o.emit("vuex:action",e,t)}),{prepend:!0}))}function a(e,t){return e.filter(t)[0]}function s(e,t){if(void 0===t&&(t=[]),null===e||"object"!==typeof e)return e;var n=a(t,(function(t){return t.original===e}));if(n)return n.copy;var r=Array.isArray(e)?[]:{};return t.push({original:e,copy:r}),Object.keys(e).forEach((function(n){r[n]=s(e[n],t)})),r}function l(e,t){Object.keys(e).forEach((function(n){return t(e[n],n)}))}function u(e){return null!==e&&"object"===typeof e}function c(e){return e&&"function"===typeof e.then}function f(e,t){return function(){return e(t)}}var d=function(e,t){this.runtime=t,this._children=Object.create(null),this._rawModule=e;var n=e.state;this.state=("function"===typeof n?n():n)||{}},p={namespaced:{configurable:!0}};p.namespaced.get=function(){return!!this._rawModule.namespaced},d.prototype.addChild=function(e,t){this._children[e]=t},d.prototype.removeChild=function(e){delete this._children[e]},d.prototype.getChild=function(e){return this._children[e]},d.prototype.hasChild=function(e){return e in this._children},d.prototype.update=function(e){this._rawModule.namespaced=e.namespaced,e.actions&&(this._rawModule.actions=e.actions),e.mutations&&(this._rawModule.mutations=e.mutations),e.getters&&(this._rawModule.getters=e.getters)},d.prototype.forEachChild=function(e){l(this._children,e)},d.prototype.forEachGetter=function(e){this._rawModule.getters&&l(this._rawModule.getters,e)},d.prototype.forEachAction=function(e){this._rawModule.actions&&l(this._rawModule.actions,e)},d.prototype.forEachMutation=function(e){this._rawModule.mutations&&l(this._rawModule.mutations,e)},Object.defineProperties(d.prototype,p);var h=function(e){this.register([],e,!1)};function v(e,t,n){if(t.update(n),n.modules)for(var r in n.modules){if(!t.getChild(r))return void 0;v(e.concat(r),t.getChild(r),n.modules[r])}}h.prototype.get=function(e){return e.reduce((function(e,t){return e.getChild(t)}),this.root)},h.prototype.getNamespace=function(e){var t=this.root;return e.reduce((function(e,n){return t=t.getChild(n),e+(t.namespaced?n+"/":"")}),"")},h.prototype.update=function(e){v([],this.root,e)},h.prototype.register=function(e,t,n){var r=this;void 0===n&&(n=!0);var o=new d(t,n);if(0===e.length)this.root=o;else{var i=this.get(e.slice(0,-1));i.addChild(e[e.length-1],o)}t.modules&&l(t.modules,(function(t,o){r.register(e.concat(o),t,n)}))},h.prototype.unregister=function(e){var t=this.get(e.slice(0,-1)),n=e[e.length-1],r=t.getChild(n);r&&r.runtime&&t.removeChild(n)},h.prototype.isRegistered=function(e){var t=this.get(e.slice(0,-1)),n=e[e.length-1];return!!t&&t.hasChild(n)};var m;var y=function(e){var t=this;void 0===e&&(e={}),!m&&"undefined"!==typeof window&&window.Vue&&T(window.Vue);var n=e.plugins;void 0===n&&(n=[]);var r=e.strict;void 0===r&&(r=!1),this._committing=!1,this._actions=Object.create(null),this._actionSubscribers=[],this._mutations=Object.create(null),this._wrappedGetters=Object.create(null),this._modules=new h(e),this._modulesNamespaceMap=Object.create(null),this._subscribers=[],this._watcherVM=new m,this._makeLocalGettersCache=Object.create(null);var o=this,a=this,s=a.dispatch,l=a.commit;this.dispatch=function(e,t){return s.call(o,e,t)},this.commit=function(e,t,n){return l.call(o,e,t,n)},this.strict=r;var u=this._modules.root.state;w(this,u,[],this._modules.root),x(this,u),n.forEach((function(e){return e(t)}));var c=void 0!==e.devtools?e.devtools:m.config.devtools;c&&i(this)},g={state:{configurable:!0}};function b(e,t,n){return t.indexOf(e)<0&&(n&&n.prepend?t.unshift(e):t.push(e)),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}function _(e,t){e._actions=Object.create(null),e._mutations=Object.create(null),e._wrappedGetters=Object.create(null),e._modulesNamespaceMap=Object.create(null);var n=e.state;w(e,n,[],e._modules.root,!0),x(e,n,t)}function x(e,t,n){var r=e._vm;e.getters={},e._makeLocalGettersCache=Object.create(null);var o=e._wrappedGetters,i={};l(o,(function(t,n){i[n]=f(t,e),Object.defineProperty(e.getters,n,{get:function(){return e._vm[n]},enumerable:!0})}));var a=m.config.silent;m.config.silent=!0,e._vm=new m({data:{$$state:t},computed:i}),m.config.silent=a,e.strict&&$(e),r&&(n&&e._withCommit((function(){r._data.$$state=null})),m.nextTick((function(){return r.$destroy()})))}function w(e,t,n,r,o){var i=!n.length,a=e._modules.getNamespace(n);if(r.namespaced&&(e._modulesNamespaceMap[a],e._modulesNamespaceMap[a]=r),!i&&!o){var s=j(t,n.slice(0,-1)),l=n[n.length-1];e._withCommit((function(){m.set(s,l,r.state)}))}var u=r.context=C(e,a,n);r.forEachMutation((function(t,n){var r=a+n;O(e,r,t,u)})),r.forEachAction((function(t,n){var r=t.root?n:a+n,o=t.handler||t;E(e,r,o,u)})),r.forEachGetter((function(t,n){var r=a+n;k(e,r,t,u)})),r.forEachChild((function(r,i){w(e,t,n.concat(i),r,o)}))}function C(e,t,n){var r=""===t,o={dispatch:r?e.dispatch:function(n,r,o){var i=A(n,r,o),a=i.payload,s=i.options,l=i.type;return s&&s.root||(l=t+l),e.dispatch(l,a)},commit:r?e.commit:function(n,r,o){var i=A(n,r,o),a=i.payload,s=i.options,l=i.type;s&&s.root||(l=t+l),e.commit(l,a,s)}};return Object.defineProperties(o,{getters:{get:r?function(){return e.getters}:function(){return S(e,t)}},state:{get:function(){return j(e.state,n)}}}),o}function S(e,t){if(!e._makeLocalGettersCache[t]){var n={},r=t.length;Object.keys(e.getters).forEach((function(o){if(o.slice(0,r)===t){var i=o.slice(r);Object.defineProperty(n,i,{get:function(){return e.getters[o]},enumerable:!0})}})),e._makeLocalGettersCache[t]=n}return e._makeLocalGettersCache[t]}function O(e,t,n,r){var o=e._mutations[t]||(e._mutations[t]=[]);o.push((function(t){n.call(e,r.state,t)}))}function E(e,t,n,r){var o=e._actions[t]||(e._actions[t]=[]);o.push((function(t){var o=n.call(e,{dispatch:r.dispatch,commit:r.commit,getters:r.getters,state:r.state,rootGetters:e.getters,rootState:e.state},t);return c(o)||(o=Promise.resolve(o)),e._devtoolHook?o.catch((function(t){throw e._devtoolHook.emit("vuex:error",t),t})):o}))}function k(e,t,n,r){e._wrappedGetters[t]||(e._wrappedGetters[t]=function(e){return n(r.state,r.getters,e.state,e.getters)})}function $(e){e._vm.$watch((function(){return this._data.$$state}),(function(){0}),{deep:!0,sync:!0})}function j(e,t){return t.reduce((function(e,t){return e[t]}),e)}function A(e,t,n){return u(e)&&e.type&&(n=t,t=e,e=e.type),{type:e,payload:t,options:n}}function T(e){m&&e===m||(m=e,n(m))}g.state.get=function(){return this._vm._data.$$state},g.state.set=function(e){0},y.prototype.commit=function(e,t,n){var r=this,o=A(e,t,n),i=o.type,a=o.payload,s=(o.options,{type:i,payload:a}),l=this._mutations[i];l&&(this._withCommit((function(){l.forEach((function(e){e(a)}))})),this._subscribers.slice().forEach((function(e){return e(s,r.state)})))},y.prototype.dispatch=function(e,t){var n=this,r=A(e,t),o=r.type,i=r.payload,a={type:o,payload:i},s=this._actions[o];if(s){try{this._actionSubscribers.slice().filter((function(e){return e.before})).forEach((function(e){return e.before(a,n.state)}))}catch(u){0}var l=s.length>1?Promise.all(s.map((function(e){return e(i)}))):s[0](i);return new Promise((function(e,t){l.then((function(t){try{n._actionSubscribers.filter((function(e){return e.after})).forEach((function(e){return e.after(a,n.state)}))}catch(u){0}e(t)}),(function(e){try{n._actionSubscribers.filter((function(e){return e.error})).forEach((function(t){return t.error(a,n.state,e)}))}catch(u){0}t(e)}))}))}},y.prototype.subscribe=function(e,t){return b(e,this._subscribers,t)},y.prototype.subscribeAction=function(e,t){var n="function"===typeof e?{before:e}:e;return b(n,this._actionSubscribers,t)},y.prototype.watch=function(e,t,n){var r=this;return this._watcherVM.$watch((function(){return e(r.state,r.getters)}),t,n)},y.prototype.replaceState=function(e){var t=this;this._withCommit((function(){t._vm._data.$$state=e}))},y.prototype.registerModule=function(e,t,n){void 0===n&&(n={}),"string"===typeof e&&(e=[e]),this._modules.register(e,t),w(this,this.state,e,this._modules.get(e),n.preserveState),x(this,this.state)},y.prototype.unregisterModule=function(e){var t=this;"string"===typeof e&&(e=[e]),this._modules.unregister(e),this._withCommit((function(){var n=j(t.state,e.slice(0,-1));m.delete(n,e[e.length-1])})),_(this)},y.prototype.hasModule=function(e){return"string"===typeof e&&(e=[e]),this._modules.isRegistered(e)},y.prototype.hotUpdate=function(e){this._modules.update(e),_(this,!0)},y.prototype._withCommit=function(e){var t=this._committing;this._committing=!0,e(),this._committing=t},Object.defineProperties(y.prototype,g);var M=H((function(e,t){var n={};return I(t).forEach((function(t){var r=t.key,o=t.val;n[r]=function(){var t=this.$store.state,n=this.$store.getters;if(e){var r=z(this.$store,"mapState",e);if(!r)return;t=r.context.state,n=r.context.getters}return"function"===typeof o?o.call(this,t,n):t[o]},n[r].vuex=!0})),n})),P=H((function(e,t){var n={};return I(t).forEach((function(t){var r=t.key,o=t.val;n[r]=function(){var t=[],n=arguments.length;while(n--)t[n]=arguments[n];var r=this.$store.commit;if(e){var i=z(this.$store,"mapMutations",e);if(!i)return;r=i.context.commit}return"function"===typeof o?o.apply(this,[r].concat(t)):r.apply(this.$store,[o].concat(t))}})),n})),L=H((function(e,t){var n={};return I(t).forEach((function(t){var r=t.key,o=t.val;o=e+o,n[r]=function(){if(!e||z(this.$store,"mapGetters",e))return this.$store.getters[o]},n[r].vuex=!0})),n})),R=H((function(e,t){var n={};return I(t).forEach((function(t){var r=t.key,o=t.val;n[r]=function(){var t=[],n=arguments.length;while(n--)t[n]=arguments[n];var r=this.$store.dispatch;if(e){var i=z(this.$store,"mapActions",e);if(!i)return;r=i.context.dispatch}return"function"===typeof o?o.apply(this,[r].concat(t)):r.apply(this.$store,[o].concat(t))}})),n})),N=function(e){return{mapState:M.bind(null,e),mapGetters:L.bind(null,e),mapMutations:P.bind(null,e),mapActions:R.bind(null,e)}};function I(e){return F(e)?Array.isArray(e)?e.map((function(e){return{key:e,val:e}})):Object.keys(e).map((function(t){return{key:t,val:e[t]}})):[]}function F(e){return Array.isArray(e)||u(e)}function H(e){return function(t,n){return"string"!==typeof t?(n=t,t=""):"/"!==t.charAt(t.length-1)&&(t+="/"),e(t,n)}}function z(e,t,n){var r=e._modulesNamespaceMap[n];return r}function D(e){void 0===e&&(e={});var t=e.collapsed;void 0===t&&(t=!0);var n=e.filter;void 0===n&&(n=function(e,t,n){return!0});var r=e.transformer;void 0===r&&(r=function(e){return e});var o=e.mutationTransformer;void 0===o&&(o=function(e){return e});var i=e.actionFilter;void 0===i&&(i=function(e,t){return!0});var a=e.actionTransformer;void 0===a&&(a=function(e){return e});var l=e.logMutations;void 0===l&&(l=!0);var u=e.logActions;void 0===u&&(u=!0);var c=e.logger;return void 0===c&&(c=console),function(e){var f=s(e.state);"undefined"!==typeof c&&(l&&e.subscribe((function(e,i){var a=s(i);if(n(e,f,a)){var l=V(),u=o(e),d="mutation "+e.type+l;B(c,d,t),c.log("%c prev state","color: #9E9E9E; font-weight: bold",r(f)),c.log("%c mutation","color: #03A9F4; font-weight: bold",u),c.log("%c next state","color: #4CAF50; font-weight: bold",r(a)),W(c)}f=a})),u&&e.subscribeAction((function(e,n){if(i(e,n)){var r=V(),o=a(e),s="action "+e.type+r;B(c,s,t),c.log("%c action","color: #03A9F4; font-weight: bold",o),W(c)}})))}}function B(e,t,n){var r=n?e.groupCollapsed:e.group;try{r.call(e,t)}catch(o){e.log(t)}}function W(e){try{e.groupEnd()}catch(t){e.log("—— log end ——")}}function V(){var e=new Date;return" @ "+q(e.getHours(),2)+":"+q(e.getMinutes(),2)+":"+q(e.getSeconds(),2)+"."+q(e.getMilliseconds(),3)}function U(e,t){return new Array(t+1).join(e)}function q(e,t){return U("0",t-e.toString().length)+e}var K={Store:y,install:T,version:"3.6.2",mapState:M,mapMutations:P,mapGetters:L,mapActions:R,createNamespacedHelpers:N,createLogger:D};t["a"]=K}).call(this,n("c8ba"))},"342f":function(e,t,n){var r=n("d066");e.exports=r("navigator","userAgent")||""},"35a1":function(e,t,n){var r=n("f5df"),o=n("3f8c"),i=n("b622"),a=i("iterator");e.exports=function(e){if(void 0!=e)return e[a]||e["@@iterator"]||o[r(e)]}},"37e8":function(e,t,n){var r=n("83ab"),o=n("9bf2"),i=n("825a"),a=n("df75");e.exports=r?Object.defineProperties:function(e,t){i(e);var n,r=a(t),s=r.length,l=0;while(s>l)o.f(e,n=r[l++],t[n]);return e}},"38a0":function(e,t,n){},"3bbe":function(e,t,n){var r=n("861d");e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},"3c4e":function(e,t,n){"use strict";var r=function(e){return o(e)&&!i(e)};function o(e){return!!e&&"object"===typeof e}function i(e){var t=Object.prototype.toString.call(e);return"[object RegExp]"===t||"[object Date]"===t||l(e)}var a="function"===typeof Symbol&&Symbol.for,s=a?Symbol.for("react.element"):60103;function l(e){return e.$$typeof===s}function u(e){return Array.isArray(e)?[]:{}}function c(e,t){var n=t&&!0===t.clone;return n&&r(e)?p(u(e),e,t):e}function f(e,t,n){var o=e.slice();return t.forEach((function(t,i){"undefined"===typeof o[i]?o[i]=c(t,n):r(t)?o[i]=p(e[i],t,n):-1===e.indexOf(t)&&o.push(c(t,n))})),o}function d(e,t,n){var o={};return r(e)&&Object.keys(e).forEach((function(t){o[t]=c(e[t],n)})),Object.keys(t).forEach((function(i){r(t[i])&&e[i]?o[i]=p(e[i],t[i],n):o[i]=c(t[i],n)})),o}function p(e,t,n){var r=Array.isArray(t),o=Array.isArray(e),i=n||{arrayMerge:f},a=r===o;if(a){if(r){var s=i.arrayMerge||f;return s(e,t,n)}return d(e,t,n)}return c(t,n)}p.all=function(e,t){if(!Array.isArray(e)||e.length<2)throw new Error("first argument should be an array with at least two elements");return e.reduce((function(e,n){return p(e,n,t)}))};var h=p;e.exports=h},"3ca3":function(e,t,n){"use strict";var r=n("6547").charAt,o=n("69f3"),i=n("7dd0"),a="String Iterator",s=o.set,l=o.getterFor(a);i(String,"String",(function(e){s(this,{type:a,string:String(e),index:0})}),(function(){var e,t=l(this),n=t.string,o=t.index;return o>=n.length?{value:void 0,done:!0}:(e=r(n,o),t.index+=e.length,{value:e,done:!1})}))},"3f8c":function(e,t){e.exports={}},4010:function(e,t,n){"use strict";t.__esModule=!0,t.removeResizeListener=t.addResizeListener=void 0;var r=n("6dd8"),o=i(r);function i(e){return e&&e.__esModule?e:{default:e}}var a="undefined"===typeof window,s=function(e){var t=e,n=Array.isArray(t),r=0;for(t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var i=o,a=i.target.__resizeListeners__||[];a.length&&a.forEach((function(e){e()}))}};t.addResizeListener=function(e,t){a||(e.__resizeListeners__||(e.__resizeListeners__=[],e.__ro__=new o.default(s),e.__ro__.observe(e)),e.__resizeListeners__.push(t))},t.removeResizeListener=function(e,t){e&&e.__resizeListeners__&&(e.__resizeListeners__.splice(e.__resizeListeners__.indexOf(t),1),e.__resizeListeners__.length||e.__ro__.disconnect())}},"417f":function(e,t,n){"use strict";t.__esModule=!0;var r=n("2b0e"),o=a(r),i=n("5924");function a(e){return e&&e.__esModule?e:{default:e}}var s=[],l="@@clickoutsideContext",u=void 0,c=0;function f(e,t,n){return function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};!(n&&n.context&&r.target&&o.target)||e.contains(r.target)||e.contains(o.target)||e===r.target||n.context.popperElm&&(n.context.popperElm.contains(r.target)||n.context.popperElm.contains(o.target))||(t.expression&&e[l].methodName&&n.context[e[l].methodName]?n.context[e[l].methodName]():e[l].bindingFn&&e[l].bindingFn())}}!o.default.prototype.$isServer&&(0,i.on)(document,"mousedown",(function(e){return u=e})),!o.default.prototype.$isServer&&(0,i.on)(document,"mouseup",(function(e){s.forEach((function(t){return t[l].documentHandler(e,u)}))})),t.default={bind:function(e,t,n){s.push(e);var r=c++;e[l]={id:r,documentHandler:f(e,t,n),methodName:t.expression,bindingFn:t.value}},update:function(e,t,n){e[l].documentHandler=f(e,t,n),e[l].methodName=t.expression,e[l].bindingFn=t.value},unbind:function(e){for(var t=s.length,n=0;n0){var r=t[t.length-1];if(r.id===e){if(r.modalClass){var o=r.modalClass.trim().split(/\s+/);o.forEach((function(e){return(0,i.removeClass)(n,e)}))}t.pop(),t.length>0&&(n.style.zIndex=t[t.length-1].zIndex)}else for(var a=t.length-1;a>=0;a--)if(t[a].id===e){t.splice(a,1);break}}0===t.length&&(this.modalFade&&(0,i.addClass)(n,"v-modal-leave"),setTimeout((function(){0===t.length&&(n.parentNode&&n.parentNode.removeChild(n),n.style.display="none",d.modalDom=void 0),(0,i.removeClass)(n,"v-modal-leave")}),200))}};Object.defineProperty(d,"zIndex",{configurable:!0,get:function(){return l||(u=u||(o.default.prototype.$ELEMENT||{}).zIndex||2e3,l=!0),u},set:function(e){u=e}});var p=function(){if(!o.default.prototype.$isServer&&d.modalStack.length>0){var e=d.modalStack[d.modalStack.length-1];if(!e)return;var t=d.getInstance(e.id);return t}};o.default.prototype.$isServer||window.addEventListener("keydown",(function(e){if(27===e.keyCode){var t=p();t&&t.closeOnPressEscape&&(t.handleClose?t.handleClose():t.handleAction?t.handleAction("cancel"):t.close())}})),t.default=d},"4d64":function(e,t,n){var r=n("fc6a"),o=n("50c4"),i=n("23cb"),a=function(e){return function(t,n,a){var s,l=r(t),u=o(l.length),c=i(a,u);if(e&&n!=n){while(u>c)if(s=l[c++],s!=s)return!0}else for(;u>c;c++)if((e||c in l)&&l[c]===n)return e||c||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},"50c4":function(e,t,n){var r=n("a691"),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},5128:function(e,t,n){"use strict";t.__esModule=!0,t.PopupManager=void 0;var r=n("2b0e"),o=d(r),i=n("7f4d"),a=d(i),s=n("4b26"),l=d(s),u=n("e62d"),c=d(u),f=n("5924");function d(e){return e&&e.__esModule?e:{default:e}}var p=1,h=void 0;t.default={props:{visible:{type:Boolean,default:!1},openDelay:{},closeDelay:{},zIndex:{},modal:{type:Boolean,default:!1},modalFade:{type:Boolean,default:!0},modalClass:{},modalAppendToBody:{type:Boolean,default:!1},lockScroll:{type:Boolean,default:!0},closeOnPressEscape:{type:Boolean,default:!1},closeOnClickModal:{type:Boolean,default:!1}},beforeMount:function(){this._popupId="popup-"+p++,l.default.register(this._popupId,this)},beforeDestroy:function(){l.default.deregister(this._popupId),l.default.closeModal(this._popupId),this.restoreBodyStyle()},data:function(){return{opened:!1,bodyPaddingRight:null,computedBodyPaddingRight:0,withoutHiddenClass:!0,rendered:!1}},watch:{visible:function(e){var t=this;if(e){if(this._opening)return;this.rendered?this.open():(this.rendered=!0,o.default.nextTick((function(){t.open()})))}else this.close()}},methods:{open:function(e){var t=this;this.rendered||(this.rendered=!0);var n=(0,a.default)({},this.$props||this,e);this._closeTimer&&(clearTimeout(this._closeTimer),this._closeTimer=null),clearTimeout(this._openTimer);var r=Number(n.openDelay);r>0?this._openTimer=setTimeout((function(){t._openTimer=null,t.doOpen(n)}),r):this.doOpen(n)},doOpen:function(e){if(!this.$isServer&&(!this.willOpen||this.willOpen())&&!this.opened){this._opening=!0;var t=this.$el,n=e.modal,r=e.zIndex;if(r&&(l.default.zIndex=r),n&&(this._closing&&(l.default.closeModal(this._popupId),this._closing=!1),l.default.openModal(this._popupId,l.default.nextZIndex(),this.modalAppendToBody?void 0:t,e.modalClass,e.modalFade),e.lockScroll)){this.withoutHiddenClass=!(0,f.hasClass)(document.body,"el-popup-parent--hidden"),this.withoutHiddenClass&&(this.bodyPaddingRight=document.body.style.paddingRight,this.computedBodyPaddingRight=parseInt((0,f.getStyle)(document.body,"paddingRight"),10)),h=(0,c.default)();var o=document.documentElement.clientHeight0&&(o||"scroll"===i)&&this.withoutHiddenClass&&(document.body.style.paddingRight=this.computedBodyPaddingRight+h+"px"),(0,f.addClass)(document.body,"el-popup-parent--hidden")}"static"===getComputedStyle(t).position&&(t.style.position="absolute"),t.style.zIndex=l.default.nextZIndex(),this.opened=!0,this.onOpen&&this.onOpen(),this.doAfterOpen()}},doAfterOpen:function(){this._opening=!1},close:function(){var e=this;if(!this.willClose||this.willClose()){null!==this._openTimer&&(clearTimeout(this._openTimer),this._openTimer=null),clearTimeout(this._closeTimer);var t=Number(this.closeDelay);t>0?this._closeTimer=setTimeout((function(){e._closeTimer=null,e.doClose()}),t):this.doClose()}},doClose:function(){this._closing=!0,this.onClose&&this.onClose(),this.lockScroll&&setTimeout(this.restoreBodyStyle,200),this.opened=!1,this.doAfterClose()},doAfterClose:function(){l.default.closeModal(this._popupId),this._closing=!1},restoreBodyStyle:function(){this.modal&&this.withoutHiddenClass&&(document.body.style.paddingRight=this.bodyPaddingRight,(0,f.removeClass)(document.body,"el-popup-parent--hidden")),this.withoutHiddenClass=!0}}},t.PopupManager=l.default},5135:function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},5466:function(e,t,n){},5692:function(e,t,n){var r=n("c430"),o=n("c6cd");(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.9.0",mode:r?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},"56ef":function(e,t,n){var r=n("d066"),o=n("241c"),i=n("7418"),a=n("825a");e.exports=r("Reflect","ownKeys")||function(e){var t=o.f(a(e)),n=i.f;return n?t.concat(n(e)):t}},5924:function(e,t,n){"use strict";t.__esModule=!0,t.isInContainer=t.getScrollContainer=t.isScroll=t.getStyle=t.once=t.off=t.on=void 0;var r="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.hasClass=v,t.addClass=m,t.removeClass=y,t.setStyle=b;var o=n("2b0e"),i=a(o);function a(e){return e&&e.__esModule?e:{default:e}}var s=i.default.prototype.$isServer,l=/([\:\-\_]+(.))/g,u=/^moz([A-Z])/,c=s?0:Number(document.documentMode),f=function(e){return(e||"").replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g,"")},d=function(e){return e.replace(l,(function(e,t,n,r){return r?n.toUpperCase():n})).replace(u,"Moz$1")},p=t.on=function(){return!s&&document.addEventListener?function(e,t,n){e&&t&&n&&e.addEventListener(t,n,!1)}:function(e,t,n){e&&t&&n&&e.attachEvent("on"+t,n)}}(),h=t.off=function(){return!s&&document.removeEventListener?function(e,t,n){e&&t&&e.removeEventListener(t,n,!1)}:function(e,t,n){e&&t&&e.detachEvent("on"+t,n)}}();t.once=function(e,t,n){var r=function r(){n&&n.apply(this,arguments),h(e,t,r)};p(e,t,r)};function v(e,t){if(!e||!t)return!1;if(-1!==t.indexOf(" "))throw new Error("className should not contain space.");return e.classList?e.classList.contains(t):(" "+e.className+" ").indexOf(" "+t+" ")>-1}function m(e,t){if(e){for(var n=e.className,r=(t||"").split(" "),o=0,i=r.length;or.top&&n.right>r.left&&n.lefte?u():!0!==t&&(o=setTimeout(r?c:u,void 0===r?e-s:e))}return"boolean"!==typeof t&&(r=n,n=t,t=void 0),a}},"5c6c":function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},"605d":function(e,t,n){var r=n("c6b6"),o=n("da84");e.exports="process"==r(o.process)},"60da":function(e,t,n){"use strict";var r=n("83ab"),o=n("d039"),i=n("df75"),a=n("7418"),s=n("d1e7"),l=n("7b0b"),u=n("44ad"),c=Object.assign,f=Object.defineProperty;e.exports=!c||o((function(){if(r&&1!==c({b:1},c(f({},"a",{enumerable:!0,get:function(){f(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),o="abcdefghijklmnopqrst";return e[n]=7,o.split("").forEach((function(e){t[e]=e})),7!=c({},e)[n]||i(c({},t)).join("")!=o}))?function(e,t){var n=l(e),o=arguments.length,c=1,f=a.f,d=s.f;while(o>c){var p,h=u(arguments[c++]),v=f?i(h).concat(f(h)):i(h),m=v.length,y=0;while(m>y)p=v[y++],r&&!d.call(h,p)||(n[p]=h[p])}return n}:c},6167:function(e,t,n){"use strict";var r,o;"function"===typeof Symbol&&Symbol.iterator;(function(i,a){r=a,o="function"===typeof r?r.call(t,n,t,e):r,void 0===o||(e.exports=o)})(0,(function(){var e=window,t={placement:"bottom",gpuAcceleration:!0,offset:0,boundariesElement:"viewport",boundariesPadding:5,preventOverflowOrder:["left","right","top","bottom"],flipBehavior:"flip",arrowElement:"[x-arrow]",arrowOffset:0,modifiers:["shift","offset","preventOverflow","keepTogether","arrow","flip","applyStyle"],modifiersIgnored:[],forceAbsolute:!1};function n(e,n,r){this._reference=e.jquery?e[0]:e,this.state={};var o="undefined"===typeof n||null===n,i=n&&"[object Object]"===Object.prototype.toString.call(n);return this._popper=o||i?this.parse(i?n:{}):n.jquery?n[0]:n,this._options=Object.assign({},t,r),this._options.modifiers=this._options.modifiers.map(function(e){if(-1===this._options.modifiersIgnored.indexOf(e))return"applyStyle"===e&&this._popper.setAttribute("x-placement",this._options.placement),this.modifiers[e]||e}.bind(this)),this.state.position=this._getPosition(this._popper,this._reference),f(this._popper,{position:this.state.position,top:0}),this.update(),this._setupEventListeners(),this}function r(t){var n=t.style.display,r=t.style.visibility;t.style.display="block",t.style.visibility="hidden";t.offsetWidth;var o=e.getComputedStyle(t),i=parseFloat(o.marginTop)+parseFloat(o.marginBottom),a=parseFloat(o.marginLeft)+parseFloat(o.marginRight),s={width:t.offsetWidth+a,height:t.offsetHeight+i};return t.style.display=n,t.style.visibility=r,s}function o(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"};return e.replace(/left|right|bottom|top/g,(function(e){return t[e]}))}function i(e){var t=Object.assign({},e);return t.right=t.left+t.width,t.bottom=t.top+t.height,t}function a(e,t){var n,r=0;for(n in e){if(e[n]===t)return r;r++}return null}function s(t,n){var r=e.getComputedStyle(t,null);return r[n]}function l(t){var n=t.offsetParent;return n!==e.document.body&&n?n:e.document.documentElement}function u(t){var n=t.parentNode;return n?n===e.document?e.document.body.scrollTop||e.document.body.scrollLeft?e.document.body:e.document.documentElement:-1!==["scroll","auto"].indexOf(s(n,"overflow"))||-1!==["scroll","auto"].indexOf(s(n,"overflow-x"))||-1!==["scroll","auto"].indexOf(s(n,"overflow-y"))?n:u(t.parentNode):t}function c(t){return t!==e.document.body&&("fixed"===s(t,"position")||(t.parentNode?c(t.parentNode):t))}function f(e,t){function n(e){return""!==e&&!isNaN(parseFloat(e))&&isFinite(e)}Object.keys(t).forEach((function(r){var o="";-1!==["width","height","top","right","bottom","left"].indexOf(r)&&n(t[r])&&(o="px"),e.style[r]=t[r]+o}))}function d(e){var t={};return e&&"[object Function]"===t.toString.call(e)}function p(e){var t={width:e.offsetWidth,height:e.offsetHeight,left:e.offsetLeft,top:e.offsetTop};return t.right=t.left+t.width,t.bottom=t.top+t.height,t}function h(e){var t=e.getBoundingClientRect(),n=-1!=navigator.userAgent.indexOf("MSIE"),r=n&&"HTML"===e.tagName?-e.scrollTop:t.top;return{left:t.left,top:r,right:t.right,bottom:t.bottom,width:t.right-t.left,height:t.bottom-r}}function v(e,t,n){var r=h(e),o=h(t);if(n){var i=u(t);o.top+=i.scrollTop,o.bottom+=i.scrollTop,o.left+=i.scrollLeft,o.right+=i.scrollLeft}var a={top:r.top-o.top,left:r.left-o.left,bottom:r.top-o.top+r.height,right:r.left-o.left+r.width,width:r.width,height:r.height};return a}function m(t){for(var n=["","ms","webkit","moz","o"],r=0;r1&&console.warn("WARNING: the given `parent` query("+t.parent+") matched more than one element, the first one will be used"),0===a.length)throw"ERROR: the given `parent` doesn't exists!";a=a[0]}return a.length>1&&a instanceof Element===!1&&(console.warn("WARNING: you have passed as parent a list of elements, the first one will be used"),a=a[0]),a.appendChild(o),o;function s(e,t){t.forEach((function(t){e.classList.add(t)}))}function l(e,t){t.forEach((function(t){e.setAttribute(t.split(":")[0],t.split(":")[1]||"")}))}},n.prototype._getPosition=function(e,t){var n=l(t);if(this._options.forceAbsolute)return"absolute";var r=c(t,n);return r?"fixed":"absolute"},n.prototype._getOffsets=function(e,t,n){n=n.split("-")[0];var o={};o.position=this.state.position;var i="fixed"===o.position,a=v(t,l(e),i),s=r(e);return-1!==["right","left"].indexOf(n)?(o.top=a.top+a.height/2-s.height/2,o.left="left"===n?a.left-s.width:a.right):(o.left=a.left+a.width/2-s.width/2,o.top="top"===n?a.top-s.height:a.bottom),o.width=s.width,o.height=s.height,{popper:o,reference:a}},n.prototype._setupEventListeners=function(){if(this.state.updateBound=this.update.bind(this),e.addEventListener("resize",this.state.updateBound),"window"!==this._options.boundariesElement){var t=u(this._reference);t!==e.document.body&&t!==e.document.documentElement||(t=e),t.addEventListener("scroll",this.state.updateBound),this.state.scrollTarget=t}},n.prototype._removeEventListeners=function(){e.removeEventListener("resize",this.state.updateBound),"window"!==this._options.boundariesElement&&this.state.scrollTarget&&(this.state.scrollTarget.removeEventListener("scroll",this.state.updateBound),this.state.scrollTarget=null),this.state.updateBound=null},n.prototype._getBoundaries=function(t,n,r){var o,i,a={};if("window"===r){var s=e.document.body,c=e.document.documentElement;i=Math.max(s.scrollHeight,s.offsetHeight,c.clientHeight,c.scrollHeight,c.offsetHeight),o=Math.max(s.scrollWidth,s.offsetWidth,c.clientWidth,c.scrollWidth,c.offsetWidth),a={top:0,right:o,bottom:i,left:0}}else if("viewport"===r){var f=l(this._popper),d=u(this._popper),h=p(f),v=function(e){return e==document.body?Math.max(document.documentElement.scrollTop,document.body.scrollTop):e.scrollTop},m=function(e){return e==document.body?Math.max(document.documentElement.scrollLeft,document.body.scrollLeft):e.scrollLeft},y="fixed"===t.offsets.popper.position?0:v(d),g="fixed"===t.offsets.popper.position?0:m(d);a={top:0-(h.top-y),right:e.document.documentElement.clientWidth-(h.left-g),bottom:e.document.documentElement.clientHeight-(h.top-y),left:0-(h.left-g)}}else a=l(this._popper)===r?{top:0,left:0,right:r.clientWidth,bottom:r.clientHeight}:p(r);return a.left+=n,a.right-=n,a.top=a.top+n,a.bottom=a.bottom-n,a},n.prototype.runModifiers=function(e,t,n){var r=t.slice();return void 0!==n&&(r=this._options.modifiers.slice(0,a(this._options.modifiers,n))),r.forEach(function(t){d(t)&&(e=t.call(this,e))}.bind(this)),e},n.prototype.isModifierRequired=function(e,t){var n=a(this._options.modifiers,e);return!!this._options.modifiers.slice(0,n).filter((function(e){return e===t})).length},n.prototype.modifiers={},n.prototype.modifiers.applyStyle=function(e){var t,n={position:e.offsets.popper.position},r=Math.round(e.offsets.popper.left),o=Math.round(e.offsets.popper.top);return this._options.gpuAcceleration&&(t=m("transform"))?(n[t]="translate3d("+r+"px, "+o+"px, 0)",n.top=0,n.left=0):(n.left=r,n.top=o),Object.assign(n,e.styles),f(this._popper,n),this._popper.setAttribute("x-placement",e.placement),this.isModifierRequired(this.modifiers.applyStyle,this.modifiers.arrow)&&e.offsets.arrow&&f(e.arrowElement,e.offsets.arrow),e},n.prototype.modifiers.shift=function(e){var t=e.placement,n=t.split("-")[0],r=t.split("-")[1];if(r){var o=e.offsets.reference,a=i(e.offsets.popper),s={y:{start:{top:o.top},end:{top:o.top+o.height-a.height}},x:{start:{left:o.left},end:{left:o.left+o.width-a.width}}},l=-1!==["bottom","top"].indexOf(n)?"x":"y";e.offsets.popper=Object.assign(a,s[l][r])}return e},n.prototype.modifiers.preventOverflow=function(e){var t=this._options.preventOverflowOrder,n=i(e.offsets.popper),r={left:function(){var t=n.left;return n.lefte.boundaries.right&&(t=Math.min(n.left,e.boundaries.right-n.width)),{left:t}},top:function(){var t=n.top;return n.tope.boundaries.bottom&&(t=Math.min(n.top,e.boundaries.bottom-n.height)),{top:t}}};return t.forEach((function(t){e.offsets.popper=Object.assign(n,r[t]())})),e},n.prototype.modifiers.keepTogether=function(e){var t=i(e.offsets.popper),n=e.offsets.reference,r=Math.floor;return t.rightr(n.right)&&(e.offsets.popper.left=r(n.right)),t.bottomr(n.bottom)&&(e.offsets.popper.top=r(n.bottom)),e},n.prototype.modifiers.flip=function(e){if(!this.isModifierRequired(this.modifiers.flip,this.modifiers.preventOverflow))return console.warn("WARNING: preventOverflow modifier is required by flip modifier in order to work, be sure to include it before flip!"),e;if(e.flipped&&e.placement===e._originalPlacement)return e;var t=e.placement.split("-")[0],n=o(t),r=e.placement.split("-")[1]||"",a=[];return a="flip"===this._options.flipBehavior?[t,n]:this._options.flipBehavior,a.forEach(function(s,l){if(t===s&&a.length!==l+1){t=e.placement.split("-")[0],n=o(t);var u=i(e.offsets.popper),c=-1!==["right","bottom"].indexOf(t);(c&&Math.floor(e.offsets.reference[t])>Math.floor(u[n])||!c&&Math.floor(e.offsets.reference[t])s[p]&&(e.offsets.popper[f]+=l[f]+h-s[p]);var v=l[f]+(n||l[c]/2-h/2),m=v-s[f];return m=Math.max(Math.min(s[c]-h-8,m),8),o[f]=m,o[d]="",e.offsets.arrow=o,e.arrowElement=t,e},Object.assign||Object.defineProperty(Object,"assign",{enumerable:!1,configurable:!0,writable:!0,value:function(e){if(void 0===e||null===e)throw new TypeError("Cannot convert first argument to object");for(var t=Object(e),n=1;n=u?e?"":void 0:(i=s.charCodeAt(l),i<55296||i>56319||l+1===u||(a=s.charCodeAt(l+1))<56320||a>57343?e?s.charAt(l):i:e?s.slice(l,l+2):a-56320+(i-55296<<10)+65536)}};e.exports={codeAt:i(!1),charAt:i(!0)}},"69f3":function(e,t,n){var r,o,i,a=n("7f9a"),s=n("da84"),l=n("861d"),u=n("9112"),c=n("5135"),f=n("c6cd"),d=n("f772"),p=n("d012"),h=s.WeakMap,v=function(e){return i(e)?o(e):r(e,{})},m=function(e){return function(t){var n;if(!l(t)||(n=o(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}};if(a){var y=f.state||(f.state=new h),g=y.get,b=y.has,_=y.set;r=function(e,t){return t.facade=e,_.call(y,e,t),t},o=function(e){return g.call(y,e)||{}},i=function(e){return b.call(y,e)}}else{var x=d("state");p[x]=!0,r=function(e,t){return t.facade=e,u(e,x,t),t},o=function(e){return c(e,x)?e[x]:{}},i=function(e){return c(e,x)}}e.exports={set:r,get:o,has:i,enforce:v,getterFor:m}},"6ac9":function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=74)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},2:function(e,t){e.exports=n("5924")},3:function(e,t){e.exports=n("8122")},5:function(e,t){e.exports=n("e974")},7:function(e,t){e.exports=n("2b0e")},74:function(e,t,n){"use strict";n.r(t);var r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("span",[n("transition",{attrs:{name:e.transition},on:{"after-enter":e.handleAfterEnter,"after-leave":e.handleAfterLeave}},[n("div",{directives:[{name:"show",rawName:"v-show",value:!e.disabled&&e.showPopper,expression:"!disabled && showPopper"}],ref:"popper",staticClass:"el-popover el-popper",class:[e.popperClass,e.content&&"el-popover--plain"],style:{width:e.width+"px"},attrs:{role:"tooltip",id:e.tooltipId,"aria-hidden":e.disabled||!e.showPopper?"true":"false"}},[e.title?n("div",{staticClass:"el-popover__title",domProps:{textContent:e._s(e.title)}}):e._e(),e._t("default",[e._v(e._s(e.content))])],2)]),n("span",{ref:"wrapper",staticClass:"el-popover__reference-wrapper"},[e._t("reference")],2)],1)},o=[];r._withStripped=!0;var i=n(5),a=n.n(i),s=n(2),l=n(3),u={name:"ElPopover",mixins:[a.a],props:{trigger:{type:String,default:"click",validator:function(e){return["click","focus","hover","manual"].indexOf(e)>-1}},openDelay:{type:Number,default:0},closeDelay:{type:Number,default:200},title:String,disabled:Boolean,content:String,reference:{},popperClass:String,width:{},visibleArrow:{default:!0},arrowOffset:{type:Number,default:0},transition:{type:String,default:"fade-in-linear"},tabindex:{type:Number,default:0}},computed:{tooltipId:function(){return"el-popover-"+Object(l["generateId"])()}},watch:{showPopper:function(e){this.disabled||(e?this.$emit("show"):this.$emit("hide"))}},mounted:function(){var e=this,t=this.referenceElm=this.reference||this.$refs.reference,n=this.popper||this.$refs.popper;!t&&this.$refs.wrapper.children&&(t=this.referenceElm=this.$refs.wrapper.children[0]),t&&(Object(s["addClass"])(t,"el-popover__reference"),t.setAttribute("aria-describedby",this.tooltipId),t.setAttribute("tabindex",this.tabindex),n.setAttribute("tabindex",0),"click"!==this.trigger&&(Object(s["on"])(t,"focusin",(function(){e.handleFocus();var n=t.__vue__;n&&"function"===typeof n.focus&&n.focus()})),Object(s["on"])(n,"focusin",this.handleFocus),Object(s["on"])(t,"focusout",this.handleBlur),Object(s["on"])(n,"focusout",this.handleBlur)),Object(s["on"])(t,"keydown",this.handleKeydown),Object(s["on"])(t,"click",this.handleClick)),"click"===this.trigger?(Object(s["on"])(t,"click",this.doToggle),Object(s["on"])(document,"click",this.handleDocumentClick)):"hover"===this.trigger?(Object(s["on"])(t,"mouseenter",this.handleMouseEnter),Object(s["on"])(n,"mouseenter",this.handleMouseEnter),Object(s["on"])(t,"mouseleave",this.handleMouseLeave),Object(s["on"])(n,"mouseleave",this.handleMouseLeave)):"focus"===this.trigger&&(this.tabindex<0&&console.warn("[Element Warn][Popover]a negative taindex means that the element cannot be focused by tab key"),t.querySelector("input, textarea")?(Object(s["on"])(t,"focusin",this.doShow),Object(s["on"])(t,"focusout",this.doClose)):(Object(s["on"])(t,"mousedown",this.doShow),Object(s["on"])(t,"mouseup",this.doClose)))},beforeDestroy:function(){this.cleanup()},deactivated:function(){this.cleanup()},methods:{doToggle:function(){this.showPopper=!this.showPopper},doShow:function(){this.showPopper=!0},doClose:function(){this.showPopper=!1},handleFocus:function(){Object(s["addClass"])(this.referenceElm,"focusing"),"click"!==this.trigger&&"focus"!==this.trigger||(this.showPopper=!0)},handleClick:function(){Object(s["removeClass"])(this.referenceElm,"focusing")},handleBlur:function(){Object(s["removeClass"])(this.referenceElm,"focusing"),"click"!==this.trigger&&"focus"!==this.trigger||(this.showPopper=!1)},handleMouseEnter:function(){var e=this;clearTimeout(this._timer),this.openDelay?this._timer=setTimeout((function(){e.showPopper=!0}),this.openDelay):this.showPopper=!0},handleKeydown:function(e){27===e.keyCode&&"manual"!==this.trigger&&this.doClose()},handleMouseLeave:function(){var e=this;clearTimeout(this._timer),this.closeDelay?this._timer=setTimeout((function(){e.showPopper=!1}),this.closeDelay):this.showPopper=!1},handleDocumentClick:function(e){var t=this.reference||this.$refs.reference,n=this.popper||this.$refs.popper;!t&&this.$refs.wrapper.children&&(t=this.referenceElm=this.$refs.wrapper.children[0]),this.$el&&t&&!this.$el.contains(e.target)&&!t.contains(e.target)&&n&&!n.contains(e.target)&&(this.showPopper=!1)},handleAfterEnter:function(){this.$emit("after-enter")},handleAfterLeave:function(){this.$emit("after-leave"),this.doDestroy()},cleanup:function(){(this.openDelay||this.closeDelay)&&clearTimeout(this._timer)}},destroyed:function(){var e=this.reference;Object(s["off"])(e,"click",this.doToggle),Object(s["off"])(e,"mouseup",this.doClose),Object(s["off"])(e,"mousedown",this.doShow),Object(s["off"])(e,"focusin",this.doShow),Object(s["off"])(e,"focusout",this.doClose),Object(s["off"])(e,"mousedown",this.doShow),Object(s["off"])(e,"mouseup",this.doClose),Object(s["off"])(e,"mouseleave",this.handleMouseLeave),Object(s["off"])(e,"mouseenter",this.handleMouseEnter),Object(s["off"])(document,"click",this.handleDocumentClick)}},c=u,f=n(0),d=Object(f["a"])(c,r,o,!1,null,null,null);d.options.__file="packages/popover/src/main.vue";var p=d.exports,h=function(e,t,n){var r=t.expression?t.value:t.arg,o=n.context.$refs[r];o&&(Array.isArray(o)?o[0].$refs.reference=e:o.$refs.reference=e)},v={bind:function(e,t,n){h(e,t,n)},inserted:function(e,t,n){h(e,t,n)}},m=n(7),y=n.n(m);y.a.directive("popover",v),p.install=function(e){e.directive("popover",v),e.component(p.name,p)},p.directive=v;t["default"]=p}})},"6b7c":function(e,t,n){"use strict";t.__esModule=!0;var r=n("4897");t.default={methods:{t:function(){for(var e=arguments.length,t=Array(e),n=0;n0},e.prototype.connect_=function(){r&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),c?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){r&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(e){var t=e.propertyName,n=void 0===t?"":t,r=u.some((function(e){return!!~n.indexOf(e)}));r&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),d=function(e,t){for(var n=0,r=Object.keys(t);n0},e}(),$="undefined"!==typeof WeakMap?new WeakMap:new n,j=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=f.getInstance(),r=new k(t,n,this);$.set(this,r)}return e}();["observe","unobserve","disconnect"].forEach((function(e){j.prototype[e]=function(){var t;return(t=$.get(this))[e].apply(t,arguments)}}));var A=function(){return"undefined"!==typeof o.ResizeObserver?o.ResizeObserver:j}();t["default"]=A}.call(this,n("c8ba"))},"6ed5":function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=77)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},10:function(e,t){e.exports=n("f3ad")},13:function(e,t){e.exports=n("eedf")},15:function(e,t){e.exports=n("5128")},2:function(e,t){e.exports=n("5924")},20:function(e,t){e.exports=n("4897")},23:function(e,t){e.exports=n("41f8")},47:function(e,t){e.exports=n("722f")},6:function(e,t){e.exports=n("6b7c")},7:function(e,t){e.exports=n("2b0e")},77:function(e,t,n){"use strict";n.r(t);var r=n(7),o=n.n(r),i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("transition",{attrs:{name:"msgbox-fade"}},[n("div",{directives:[{name:"show",rawName:"v-show",value:e.visible,expression:"visible"}],staticClass:"el-message-box__wrapper",attrs:{tabindex:"-1",role:"dialog","aria-modal":"true","aria-label":e.title||"dialog"},on:{click:function(t){return t.target!==t.currentTarget?null:e.handleWrapperClick(t)}}},[n("div",{staticClass:"el-message-box",class:[e.customClass,e.center&&"el-message-box--center"]},[null!==e.title?n("div",{staticClass:"el-message-box__header"},[n("div",{staticClass:"el-message-box__title"},[e.icon&&e.center?n("div",{class:["el-message-box__status",e.icon]}):e._e(),n("span",[e._v(e._s(e.title))])]),e.showClose?n("button",{staticClass:"el-message-box__headerbtn",attrs:{type:"button","aria-label":"Close"},on:{click:function(t){e.handleAction(e.distinguishCancelAndClose?"close":"cancel")},keydown:function(t){if(!("button"in t)&&e._k(t.keyCode,"enter",13,t.key,"Enter"))return null;e.handleAction(e.distinguishCancelAndClose?"close":"cancel")}}},[n("i",{staticClass:"el-message-box__close el-icon-close"})]):e._e()]):e._e(),n("div",{staticClass:"el-message-box__content"},[n("div",{staticClass:"el-message-box__container"},[e.icon&&!e.center&&""!==e.message?n("div",{class:["el-message-box__status",e.icon]}):e._e(),""!==e.message?n("div",{staticClass:"el-message-box__message"},[e._t("default",[e.dangerouslyUseHTMLString?n("p",{domProps:{innerHTML:e._s(e.message)}}):n("p",[e._v(e._s(e.message))])])],2):e._e()]),n("div",{directives:[{name:"show",rawName:"v-show",value:e.showInput,expression:"showInput"}],staticClass:"el-message-box__input"},[n("el-input",{ref:"input",attrs:{type:e.inputType,placeholder:e.inputPlaceholder},nativeOn:{keydown:function(t){return!("button"in t)&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.handleInputEnter(t)}},model:{value:e.inputValue,callback:function(t){e.inputValue=t},expression:"inputValue"}}),n("div",{staticClass:"el-message-box__errormsg",style:{visibility:e.editorErrorMessage?"visible":"hidden"}},[e._v(e._s(e.editorErrorMessage))])],1)]),n("div",{staticClass:"el-message-box__btns"},[e.showCancelButton?n("el-button",{class:[e.cancelButtonClasses],attrs:{loading:e.cancelButtonLoading,round:e.roundButton,size:"small"},on:{keydown:function(t){if(!("button"in t)&&e._k(t.keyCode,"enter",13,t.key,"Enter"))return null;e.handleAction("cancel")}},nativeOn:{click:function(t){e.handleAction("cancel")}}},[e._v("\n "+e._s(e.cancelButtonText||e.t("el.messagebox.cancel"))+"\n ")]):e._e(),n("el-button",{directives:[{name:"show",rawName:"v-show",value:e.showConfirmButton,expression:"showConfirmButton"}],ref:"confirm",class:[e.confirmButtonClasses],attrs:{loading:e.confirmButtonLoading,round:e.roundButton,size:"small"},on:{keydown:function(t){if(!("button"in t)&&e._k(t.keyCode,"enter",13,t.key,"Enter"))return null;e.handleAction("confirm")}},nativeOn:{click:function(t){e.handleAction("confirm")}}},[e._v("\n "+e._s(e.confirmButtonText||e.t("el.messagebox.confirm"))+"\n ")])],1)])])])},a=[];i._withStripped=!0;var s=n(15),l=n.n(s),u=n(6),c=n.n(u),f=n(10),d=n.n(f),p=n(13),h=n.n(p),v=n(2),m=n(20),y=n(47),g=n.n(y),b=void 0,_={success:"success",info:"info",warning:"warning",error:"error"},x={mixins:[l.a,c.a],props:{modal:{default:!0},lockScroll:{default:!0},showClose:{type:Boolean,default:!0},closeOnClickModal:{default:!0},closeOnPressEscape:{default:!0},closeOnHashChange:{default:!0},center:{default:!1,type:Boolean},roundButton:{default:!1,type:Boolean}},components:{ElInput:d.a,ElButton:h.a},computed:{icon:function(){var e=this.type,t=this.iconClass;return t||(e&&_[e]?"el-icon-"+_[e]:"")},confirmButtonClasses:function(){return"el-button--primary "+this.confirmButtonClass},cancelButtonClasses:function(){return""+this.cancelButtonClass}},methods:{getSafeClose:function(){var e=this,t=this.uid;return function(){e.$nextTick((function(){t===e.uid&&e.doClose()}))}},doClose:function(){var e=this;this.visible&&(this.visible=!1,this._closing=!0,this.onClose&&this.onClose(),b.closeDialog(),this.lockScroll&&setTimeout(this.restoreBodyStyle,200),this.opened=!1,this.doAfterClose(),setTimeout((function(){e.action&&e.callback(e.action,e)})))},handleWrapperClick:function(){this.closeOnClickModal&&this.handleAction(this.distinguishCancelAndClose?"close":"cancel")},handleInputEnter:function(){if("textarea"!==this.inputType)return this.handleAction("confirm")},handleAction:function(e){("prompt"!==this.$type||"confirm"!==e||this.validate())&&(this.action=e,"function"===typeof this.beforeClose?(this.close=this.getSafeClose(),this.beforeClose(e,this,this.close)):this.doClose())},validate:function(){if("prompt"===this.$type){var e=this.inputPattern;if(e&&!e.test(this.inputValue||""))return this.editorErrorMessage=this.inputErrorMessage||Object(m["t"])("el.messagebox.error"),Object(v["addClass"])(this.getInputElement(),"invalid"),!1;var t=this.inputValidator;if("function"===typeof t){var n=t(this.inputValue);if(!1===n)return this.editorErrorMessage=this.inputErrorMessage||Object(m["t"])("el.messagebox.error"),Object(v["addClass"])(this.getInputElement(),"invalid"),!1;if("string"===typeof n)return this.editorErrorMessage=n,Object(v["addClass"])(this.getInputElement(),"invalid"),!1}}return this.editorErrorMessage="",Object(v["removeClass"])(this.getInputElement(),"invalid"),!0},getFirstFocus:function(){var e=this.$el.querySelector(".el-message-box__btns .el-button"),t=this.$el.querySelector(".el-message-box__btns .el-message-box__title");return e||t},getInputElement:function(){var e=this.$refs.input.$refs;return e.input||e.textarea},handleClose:function(){this.handleAction("close")}},watch:{inputValue:{immediate:!0,handler:function(e){var t=this;this.$nextTick((function(n){"prompt"===t.$type&&null!==e&&t.validate()}))}},visible:function(e){var t=this;e&&(this.uid++,"alert"!==this.$type&&"confirm"!==this.$type||this.$nextTick((function(){t.$refs.confirm.$el.focus()})),this.focusAfterClosed=document.activeElement,b=new g.a(this.$el,this.focusAfterClosed,this.getFirstFocus())),"prompt"===this.$type&&(e?setTimeout((function(){t.$refs.input&&t.$refs.input.$el&&t.getInputElement().focus()}),500):(this.editorErrorMessage="",Object(v["removeClass"])(this.getInputElement(),"invalid")))}},mounted:function(){var e=this;this.$nextTick((function(){e.closeOnHashChange&&window.addEventListener("hashchange",e.close)}))},beforeDestroy:function(){this.closeOnHashChange&&window.removeEventListener("hashchange",this.close),setTimeout((function(){b.closeDialog()}))},data:function(){return{uid:1,title:void 0,message:"",type:"",iconClass:"",customClass:"",showInput:!1,inputValue:null,inputPlaceholder:"",inputType:"text",inputPattern:null,inputValidator:null,inputErrorMessage:"",showConfirmButton:!0,showCancelButton:!1,action:"",confirmButtonText:"",cancelButtonText:"",confirmButtonLoading:!1,cancelButtonLoading:!1,confirmButtonClass:"",confirmButtonDisabled:!1,cancelButtonClass:"",editorErrorMessage:null,callback:null,dangerouslyUseHTMLString:!1,focusAfterClosed:null,isOnComposition:!1,distinguishCancelAndClose:!1}}},w=x,C=n(0),S=Object(C["a"])(w,i,a,!1,null,null,null);S.options.__file="packages/message-box/src/main.vue";var O=S.exports,E=n(9),k=n.n(E),$=n(23),j="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},A={title:null,message:"",type:"",iconClass:"",showInput:!1,showClose:!0,modalFade:!0,lockScroll:!0,closeOnClickModal:!0,closeOnPressEscape:!0,closeOnHashChange:!0,inputValue:null,inputPlaceholder:"",inputType:"text",inputPattern:null,inputValidator:null,inputErrorMessage:"",showConfirmButton:!0,showCancelButton:!1,confirmButtonPosition:"right",confirmButtonHighlight:!1,cancelButtonHighlight:!1,confirmButtonText:"",cancelButtonText:"",confirmButtonClass:"",cancelButtonClass:"",customClass:"",beforeClose:null,dangerouslyUseHTMLString:!1,center:!1,roundButton:!1,distinguishCancelAndClose:!1},T=o.a.extend(O),M=void 0,P=void 0,L=[],R=function(e){if(M){var t=M.callback;"function"===typeof t&&(P.showInput?t(P.inputValue,e):t(e)),M.resolve&&("confirm"===e?P.showInput?M.resolve({value:P.inputValue,action:e}):M.resolve(e):!M.reject||"cancel"!==e&&"close"!==e||M.reject(e))}},N=function(){P=new T({el:document.createElement("div")}),P.callback=R},I=function e(){if(P||N(),P.action="",(!P.visible||P.closeTimer)&&L.length>0){M=L.shift();var t=M.options;for(var n in t)t.hasOwnProperty(n)&&(P[n]=t[n]);void 0===t.callback&&(P.callback=R);var r=P.callback;P.callback=function(t,n){r(t,n),e()},Object($["isVNode"])(P.message)?(P.$slots.default=[P.message],P.message=null):delete P.$slots.default,["modal","showClose","closeOnClickModal","closeOnPressEscape","closeOnHashChange"].forEach((function(e){void 0===P[e]&&(P[e]=!0)})),document.body.appendChild(P.$el),o.a.nextTick((function(){P.visible=!0}))}},F=function e(t,n){if(!o.a.prototype.$isServer){if("string"===typeof t||Object($["isVNode"])(t)?(t={message:t},"string"===typeof arguments[1]&&(t.title=arguments[1])):t.callback&&!n&&(n=t.callback),"undefined"!==typeof Promise)return new Promise((function(r,o){L.push({options:k()({},A,e.defaults,t),callback:n,resolve:r,reject:o}),I()}));L.push({options:k()({},A,e.defaults,t),callback:n}),I()}};F.setDefaults=function(e){F.defaults=e},F.alert=function(e,t,n){return"object"===("undefined"===typeof t?"undefined":j(t))?(n=t,t=""):void 0===t&&(t=""),F(k()({title:t,message:e,$type:"alert",closeOnPressEscape:!1,closeOnClickModal:!1},n))},F.confirm=function(e,t,n){return"object"===("undefined"===typeof t?"undefined":j(t))?(n=t,t=""):void 0===t&&(t=""),F(k()({title:t,message:e,$type:"confirm",showCancelButton:!0},n))},F.prompt=function(e,t,n){return"object"===("undefined"===typeof t?"undefined":j(t))?(n=t,t=""):void 0===t&&(t=""),F(k()({title:t,message:e,showCancelButton:!0,showInput:!0,$type:"prompt"},n))},F.close=function(){P.doClose(),P.visible=!1,L=[],M=null};var H=F;t["default"]=H},9:function(e,t){e.exports=n("7f4d")}})},"6eeb":function(e,t,n){var r=n("da84"),o=n("9112"),i=n("5135"),a=n("ce4e"),s=n("8925"),l=n("69f3"),u=l.get,c=l.enforce,f=String(String).split("String");(e.exports=function(e,t,n,s){var l,u=!!s&&!!s.unsafe,d=!!s&&!!s.enumerable,p=!!s&&!!s.noTargetGet;"function"==typeof n&&("string"!=typeof t||i(n,"name")||o(n,"name",t),l=c(n),l.source||(l.source=f.join("string"==typeof t?t:""))),e!==r?(u?!p&&e[t]&&(d=!0):delete e[t],d?e[t]=n:o(e,t,n)):d?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&u(this).source||s(this)}))},"722f":function(e,t,n){"use strict";t.__esModule=!0;var r="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=n("e452"),i=a(o);function a(e){return e&&e.__esModule?e:{default:e}}var s,l=l||{};l.Dialog=function(e,t,n){var o=this;if(this.dialogNode=e,null===this.dialogNode||"dialog"!==this.dialogNode.getAttribute("role"))throw new Error("Dialog() requires a DOM element with ARIA role of dialog.");"string"===typeof t?this.focusAfterClosed=document.getElementById(t):"object"===("undefined"===typeof t?"undefined":r(t))?this.focusAfterClosed=t:this.focusAfterClosed=null,"string"===typeof n?this.focusFirst=document.getElementById(n):"object"===("undefined"===typeof n?"undefined":r(n))?this.focusFirst=n:this.focusFirst=null,this.focusFirst?this.focusFirst.focus():i.default.focusFirstDescendant(this.dialogNode),this.lastFocus=document.activeElement,s=function(e){o.trapFocus(e)},this.addListeners()},l.Dialog.prototype.addListeners=function(){document.addEventListener("focus",s,!0)},l.Dialog.prototype.removeListeners=function(){document.removeEventListener("focus",s,!0)},l.Dialog.prototype.closeDialog=function(){var e=this;this.removeListeners(),this.focusAfterClosed&&setTimeout((function(){e.focusAfterClosed.focus()}))},l.Dialog.prototype.trapFocus=function(e){i.default.IgnoreUtilFocusChanges||(this.dialogNode.contains(e.target)?this.lastFocus=e.target:(i.default.focusFirstDescendant(this.dialogNode),this.lastFocus===document.activeElement&&i.default.focusLastDescendant(this.dialogNode),this.lastFocus=document.activeElement))},t.default=l.Dialog},7418:function(e,t){t.f=Object.getOwnPropertySymbols},"76b9":function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=110)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},110:function(e,t,n){"use strict";n.r(t);var r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"el-breadcrumb",attrs:{"aria-label":"Breadcrumb",role:"navigation"}},[e._t("default")],2)},o=[];r._withStripped=!0;var i={name:"ElBreadcrumb",props:{separator:{type:String,default:"/"},separatorClass:{type:String,default:""}},provide:function(){return{elBreadcrumb:this}},mounted:function(){var e=this.$el.querySelectorAll(".el-breadcrumb__item");e.length&&e[e.length-1].setAttribute("aria-current","page")}},a=i,s=n(0),l=Object(s["a"])(a,r,o,!1,null,null,null);l.options.__file="packages/breadcrumb/src/breadcrumb.vue";var u=l.exports;u.install=function(e){e.component(u.name,u)};t["default"]=u}})},7839:function(e,t){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},"7b0b":function(e,t,n){var r=n("1d80");e.exports=function(e){return Object(r(e))}},"7b3e":function(e,t,n){"use strict";var r,o=n("a3de"); +/** + * Checks if an event is supported in the current execution environment. + * + * NOTE: This will not work correctly for non-generic events such as `change`, + * `reset`, `load`, `error`, and `select`. + * + * Borrows from Modernizr. + * + * @param {string} eventNameSuffix Event name, e.g. "click". + * @param {?boolean} capture Check if the capture phase is supported. + * @return {boolean} True if the event is supported. + * @internal + * @license Modernizr 3.0.0pre (Custom Build) | MIT + */ +function i(e,t){if(!o.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,i=n in document;if(!i){var a=document.createElement("div");a.setAttribute(n,"return;"),i="function"===typeof a[n]}return!i&&r&&"wheel"===e&&(i=document.implementation.hasFeature("Events.wheel","3.0")),i}o.canUseDOM&&(r=document.implementation&&document.implementation.hasFeature&&!0!==document.implementation.hasFeature("","")),e.exports=i},"7bc3":function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=118)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},118:function(e,t,n){"use strict";n.r(t);var r=function(e,t){var n=t._c;return n("div",t._g(t._b({class:[t.data.staticClass,"el-divider","el-divider--"+t.props.direction]},"div",t.data.attrs,!1),t.listeners),[t.slots().default&&"vertical"!==t.props.direction?n("div",{class:["el-divider__text","is-"+t.props.contentPosition]},[t._t("default")],2):t._e()])},o=[];r._withStripped=!0;var i={name:"ElDivider",props:{direction:{type:String,default:"horizontal",validator:function(e){return-1!==["horizontal","vertical"].indexOf(e)}},contentPosition:{type:String,default:"center",validator:function(e){return-1!==["left","center","right"].indexOf(e)}}}},a=i,s=n(0),l=Object(s["a"])(a,r,o,!0,null,null,null);l.options.__file="packages/divider/src/main.vue";var u=l.exports;u.install=function(e){e.component(u.name,u)};t["default"]=u}})},"7c73":function(e,t,n){var r,o=n("825a"),i=n("37e8"),a=n("7839"),s=n("d012"),l=n("1be4"),u=n("cc12"),c=n("f772"),f=">",d="<",p="prototype",h="script",v=c("IE_PROTO"),m=function(){},y=function(e){return d+h+f+e+d+"/"+h+f},g=function(e){e.write(y("")),e.close();var t=e.parentWindow.Object;return e=null,t},b=function(){var e,t=u("iframe"),n="java"+h+":";return t.style.display="none",l.appendChild(t),t.src=String(n),e=t.contentWindow.document,e.open(),e.write(y("document.F=Object")),e.close(),e.F},_=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(t){}_=r?g(r):b();var e=a.length;while(e--)delete _[p][a[e]];return _()};s[v]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(m[p]=o(e),n=new m,m[p]=null,n[v]=e):n=_(),void 0===t?n:i(n,t)}},"7dd0":function(e,t,n){"use strict";var r=n("23e7"),o=n("9ed3"),i=n("e163"),a=n("d2bb"),s=n("d44e"),l=n("9112"),u=n("6eeb"),c=n("b622"),f=n("c430"),d=n("3f8c"),p=n("ae93"),h=p.IteratorPrototype,v=p.BUGGY_SAFARI_ITERATORS,m=c("iterator"),y="keys",g="values",b="entries",_=function(){return this};e.exports=function(e,t,n,c,p,x,w){o(n,t,c);var C,S,O,E=function(e){if(e===p&&T)return T;if(!v&&e in j)return j[e];switch(e){case y:return function(){return new n(this,e)};case g:return function(){return new n(this,e)};case b:return function(){return new n(this,e)}}return function(){return new n(this)}},k=t+" Iterator",$=!1,j=e.prototype,A=j[m]||j["@@iterator"]||p&&j[p],T=!v&&A||E(p),M="Array"==t&&j.entries||A;if(M&&(C=i(M.call(new e)),h!==Object.prototype&&C.next&&(f||i(C)===h||(a?a(C,h):"function"!=typeof C[m]&&l(C,m,_)),s(C,k,!0,!0),f&&(d[k]=_))),p==g&&A&&A.name!==g&&($=!0,T=function(){return A.call(this)}),f&&!w||j[m]===T||l(j,m,T),d[t]=T,p)if(S={values:E(g),keys:x?T:E(y),entries:E(b)},w)for(O in S)(v||$||!(O in j))&&u(j,O,S[O]);else r({target:t,proto:!0,forced:v||$},S);return S}},"7f4d":function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e){for(var t=1,n=arguments.length;t0&&void 0!==arguments[0]?arguments[0]:"";return String(e).replace(/[|\\{}()[\]^$+*?.]/g,"\\$&")};var h=t.arrayFindIndex=function(e,t){for(var n=0;n!==e.length;++n)if(t(e[n]))return n;return-1},v=(t.arrayFind=function(e,t){var n=h(e,t);return-1!==n?e[n]:void 0},t.coerceTruthyValueToArray=function(e){return Array.isArray(e)?e:e?[e]:[]},t.isIE=function(){return!i.default.prototype.$isServer&&!isNaN(Number(document.documentMode))},t.isEdge=function(){return!i.default.prototype.$isServer&&navigator.userAgent.indexOf("Edge")>-1},t.isFirefox=function(){return!i.default.prototype.$isServer&&!!window.navigator.userAgent.match(/firefox/i)},t.autoprefixer=function(e){if("object"!==("undefined"===typeof e?"undefined":r(e)))return e;var t=["transform","transition","animation"],n=["ms-","webkit-"];return t.forEach((function(t){var r=e[t];t&&r&&n.forEach((function(n){e[n+t]=r}))})),e},t.kebabCase=function(e){var t=/([^-])([A-Z])/g;return e.replace(t,"$1-$2").replace(t,"$1-$2").toLowerCase()},t.capitalize=function(e){return(0,a.isString)(e)?e.charAt(0).toUpperCase()+e.slice(1):e},t.looseEqual=function(e,t){var n=(0,a.isObject)(e),r=(0,a.isObject)(t);return n&&r?JSON.stringify(e)===JSON.stringify(t):!n&&!r&&String(e)===String(t)}),m=t.arrayEquals=function(e,t){if(e=e||[],t=t||[],e.length!==t.length)return!1;for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};if(!o.a.prototype.$isServer){if(e=_()({},w,e),"string"===typeof e.target&&(e.target=document.querySelector(e.target)),e.target=e.target||document.body,e.target!==document.body?e.fullscreen=!1:e.body=!0,e.fullscreen&&C)return C;var t=e.body?document.body:e.target,n=new x({el:document.createElement("div"),data:e});return S(e,t,n),"absolute"!==n.originalPosition&&"fixed"!==n.originalPosition&&Object(d["addClass"])(t,"el-loading-parent--relative"),e.fullscreen&&e.lock&&Object(d["addClass"])(t,"el-loading-parent--hidden"),t.appendChild(n.$el),o.a.nextTick((function(){n.visible=!0})),e.fullscreen&&(C=n),n}},E=O;t["default"]={install:function(e){e.use(g),e.prototype.$loading=E},directive:g,service:E}},7:function(e,t){e.exports=n("2b0e")},9:function(e,t){e.exports=n("7f4d")}})},"8bbc":function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=124)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},124:function(e,t,n){"use strict";n.r(t);var r,o,i={name:"ElTag",props:{text:String,closable:Boolean,type:String,hit:Boolean,disableTransitions:Boolean,color:String,size:String,effect:{type:String,default:"light",validator:function(e){return-1!==["dark","light","plain"].indexOf(e)}}},methods:{handleClose:function(e){e.stopPropagation(),this.$emit("close",e)},handleClick:function(e){this.$emit("click",e)}},computed:{tagSize:function(){return this.size||(this.$ELEMENT||{}).size}},render:function(e){var t=this.type,n=this.tagSize,r=this.hit,o=this.effect,i=["el-tag",t?"el-tag--"+t:"",n?"el-tag--"+n:"",o?"el-tag--"+o:"",r&&"is-hit"],a=e("span",{class:i,style:{backgroundColor:this.color},on:{click:this.handleClick}},[this.$slots.default,this.closable&&e("i",{class:"el-tag__close el-icon-close",on:{click:this.handleClose}})]);return this.disableTransitions?a:e("transition",{attrs:{name:"el-zoom-in-center"}},[a])}},a=i,s=n(0),l=Object(s["a"])(a,r,o,!1,null,null,null);l.options.__file="packages/tag/src/tag.vue";var u=l.exports;u.install=function(e){e.component(u.name,u)};t["default"]=u}})},"8c4f":function(e,t,n){"use strict"; +/*! + * vue-router v3.5.1 + * (c) 2021 Evan You + * @license MIT + */function r(e,t){0}function o(e,t){for(var n in t)e[n]=t[n];return e}var i=/[!'()*]/g,a=function(e){return"%"+e.charCodeAt(0).toString(16)},s=/%2C/g,l=function(e){return encodeURIComponent(e).replace(i,a).replace(s,",")};function u(e){try{return decodeURIComponent(e)}catch(t){0}return e}function c(e,t,n){void 0===t&&(t={});var r,o=n||d;try{r=o(e||"")}catch(s){r={}}for(var i in t){var a=t[i];r[i]=Array.isArray(a)?a.map(f):f(a)}return r}var f=function(e){return null==e||"object"===typeof e?e:String(e)};function d(e){var t={};return e=e.trim().replace(/^(\?|#|&)/,""),e?(e.split("&").forEach((function(e){var n=e.replace(/\+/g," ").split("="),r=u(n.shift()),o=n.length>0?u(n.join("=")):null;void 0===t[r]?t[r]=o:Array.isArray(t[r])?t[r].push(o):t[r]=[t[r],o]})),t):t}function p(e){var t=e?Object.keys(e).map((function(t){var n=e[t];if(void 0===n)return"";if(null===n)return l(t);if(Array.isArray(n)){var r=[];return n.forEach((function(e){void 0!==e&&(null===e?r.push(l(t)):r.push(l(t)+"="+l(e)))})),r.join("&")}return l(t)+"="+l(n)})).filter((function(e){return e.length>0})).join("&"):null;return t?"?"+t:""}var h=/\/?$/;function v(e,t,n,r){var o=r&&r.options.stringifyQuery,i=t.query||{};try{i=m(i)}catch(s){}var a={name:t.name||e&&e.name,meta:e&&e.meta||{},path:t.path||"/",hash:t.hash||"",query:i,params:t.params||{},fullPath:b(t,o),matched:e?g(e):[]};return n&&(a.redirectedFrom=b(n,o)),Object.freeze(a)}function m(e){if(Array.isArray(e))return e.map(m);if(e&&"object"===typeof e){var t={};for(var n in e)t[n]=m(e[n]);return t}return e}var y=v(null,{path:"/"});function g(e){var t=[];while(e)t.unshift(e),e=e.parent;return t}function b(e,t){var n=e.path,r=e.query;void 0===r&&(r={});var o=e.hash;void 0===o&&(o="");var i=t||p;return(n||"/")+i(r)+o}function _(e,t,n){return t===y?e===t:!!t&&(e.path&&t.path?e.path.replace(h,"")===t.path.replace(h,"")&&(n||e.hash===t.hash&&x(e.query,t.query)):!(!e.name||!t.name)&&(e.name===t.name&&(n||e.hash===t.hash&&x(e.query,t.query)&&x(e.params,t.params))))}function x(e,t){if(void 0===e&&(e={}),void 0===t&&(t={}),!e||!t)return e===t;var n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((function(n,o){var i=e[n],a=r[o];if(a!==n)return!1;var s=t[n];return null==i||null==s?i===s:"object"===typeof i&&"object"===typeof s?x(i,s):String(i)===String(s)}))}function w(e,t){return 0===e.path.replace(h,"/").indexOf(t.path.replace(h,"/"))&&(!t.hash||e.hash===t.hash)&&C(e.query,t.query)}function C(e,t){for(var n in t)if(!(n in e))return!1;return!0}function S(e){for(var t=0;t=0&&(t=e.slice(r),e=e.slice(0,r));var o=e.indexOf("?");return o>=0&&(n=e.slice(o+1),e=e.slice(0,o)),{path:e,query:n,hash:t}}function A(e){return e.replace(/\/\//g,"/")}var T=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)},M=J,P=F,L=H,R=B,N=Y,I=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function F(e,t){var n,r=[],o=0,i=0,a="",s=t&&t.delimiter||"/";while(null!=(n=I.exec(e))){var l=n[0],u=n[1],c=n.index;if(a+=e.slice(i,c),i=c+l.length,u)a+=u[1];else{var f=e[i],d=n[2],p=n[3],h=n[4],v=n[5],m=n[6],y=n[7];a&&(r.push(a),a="");var g=null!=d&&null!=f&&f!==d,b="+"===m||"*"===m,_="?"===m||"*"===m,x=n[2]||s,w=h||v;r.push({name:p||o++,prefix:d||"",delimiter:x,optional:_,repeat:b,partial:g,asterisk:!!y,pattern:w?V(w):y?".*":"[^"+W(x)+"]+?"})}}return i1||!S.length)return 0===S.length?e():e("span",{},S)}if("a"===this.tag)C.on=x,C.attrs={href:l,"aria-current":g};else{var O=se(this.$slots.default);if(O){O.isStatic=!1;var E=O.data=o({},O.data);for(var k in E.on=E.on||{},E.on){var $=E.on[k];k in x&&(E.on[k]=Array.isArray($)?$:[$])}for(var j in x)j in E.on?E.on[j].push(x[j]):E.on[j]=b;var A=O.data.attrs=o({},O.data.attrs);A.href=l,A["aria-current"]=g}else C.on=x}return e(this.tag,C,this.$slots.default)}};function ae(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&(void 0===e.button||0===e.button)){if(e.currentTarget&&e.currentTarget.getAttribute){var t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function se(e){if(e)for(var t,n=0;n-1&&(s.params[f]=n.params[f]);return s.path=Q(u.path,s.params,'named route "'+l+'"'),d(u,s,a)}if(s.path){s.params={};for(var p=0;p=e.length?n():e[o]?t(e[o],(function(){r(o+1)})):r(o+1)};r(0)}var He={redirected:2,aborted:4,cancelled:8,duplicated:16};function ze(e,t){return Ve(e,t,He.redirected,'Redirected when going from "'+e.fullPath+'" to "'+qe(t)+'" via a navigation guard.')}function De(e,t){var n=Ve(e,t,He.duplicated,'Avoided redundant navigation to current location: "'+e.fullPath+'".');return n.name="NavigationDuplicated",n}function Be(e,t){return Ve(e,t,He.cancelled,'Navigation cancelled from "'+e.fullPath+'" to "'+t.fullPath+'" with a new navigation.')}function We(e,t){return Ve(e,t,He.aborted,'Navigation aborted from "'+e.fullPath+'" to "'+t.fullPath+'" via a navigation guard.')}function Ve(e,t,n,r){var o=new Error(r);return o._isRouter=!0,o.from=e,o.to=t,o.type=n,o}var Ue=["params","query","hash"];function qe(e){if("string"===typeof e)return e;if("path"in e)return e.path;var t={};return Ue.forEach((function(n){n in e&&(t[n]=e[n])})),JSON.stringify(t,null,2)}function Ke(e){return Object.prototype.toString.call(e).indexOf("Error")>-1}function Ge(e,t){return Ke(e)&&e._isRouter&&(null==t||e.type===t)}function Xe(e){return function(t,n,r){var o=!1,i=0,a=null;Ye(e,(function(e,t,n,s){if("function"===typeof e&&void 0===e.cid){o=!0,i++;var l,u=et((function(t){Qe(t)&&(t=t.default),e.resolved="function"===typeof t?t:te.extend(t),n.components[s]=t,i--,i<=0&&r()})),c=et((function(e){var t="Failed to resolve async component "+s+": "+e;a||(a=Ke(e)?e:new Error(t),r(a))}));try{l=e(u,c)}catch(d){c(d)}if(l)if("function"===typeof l.then)l.then(u,c);else{var f=l.component;f&&"function"===typeof f.then&&f.then(u,c)}}})),o||r()}}function Ye(e,t){return Je(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function Je(e){return Array.prototype.concat.apply([],e)}var Ze="function"===typeof Symbol&&"symbol"===typeof Symbol.toStringTag;function Qe(e){return e.__esModule||Ze&&"Module"===e[Symbol.toStringTag]}function et(e){var t=!1;return function(){var n=[],r=arguments.length;while(r--)n[r]=arguments[r];if(!t)return t=!0,e.apply(this,n)}}var tt=function(e,t){this.router=e,this.base=nt(t),this.current=y,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function nt(e){if(!e)if(ue){var t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^https?:\/\/[^\/]+/,"")}else e="/";return"/"!==e.charAt(0)&&(e="/"+e),e.replace(/\/$/,"")}function rt(e,t){var n,r=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,r=Re&&n;r&&this.listeners.push(Ce());var o=function(){var n=e.current,o=dt(e.base);e.current===y&&o===e._startLocation||e.transitionTo(o,(function(e){r&&Se(t,e,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var r=this,o=this,i=o.current;this.transitionTo(e,(function(e){Ne(A(r.base+e.fullPath)),Se(r.router,e,i,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this,i=o.current;this.transitionTo(e,(function(e){Ie(A(r.base+e.fullPath)),Se(r.router,e,i,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(dt(this.base)!==this.current.fullPath){var t=A(this.base+this.current.fullPath);e?Ne(t):Ie(t)}},t.prototype.getCurrentLocation=function(){return dt(this.base)},t}(tt);function dt(e){var t=window.location.pathname;return e&&0===t.toLowerCase().indexOf(e.toLowerCase())&&(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var pt=function(e){function t(t,n,r){e.call(this,t,n),r&&ht(this.base)||vt()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router,n=t.options.scrollBehavior,r=Re&&n;r&&this.listeners.push(Ce());var o=function(){var t=e.current;vt()&&e.transitionTo(mt(),(function(n){r&&Se(e.router,n,t,!0),Re||bt(n.fullPath)}))},i=Re?"popstate":"hashchange";window.addEventListener(i,o),this.listeners.push((function(){window.removeEventListener(i,o)}))}},t.prototype.push=function(e,t,n){var r=this,o=this,i=o.current;this.transitionTo(e,(function(e){gt(e.fullPath),Se(r.router,e,i,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this,i=o.current;this.transitionTo(e,(function(e){bt(e.fullPath),Se(r.router,e,i,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;mt()!==t&&(e?gt(t):bt(t))},t.prototype.getCurrentLocation=function(){return mt()},t}(tt);function ht(e){var t=dt(e);if(!/^\/#/.test(t))return window.location.replace(A(e+"/#"+t)),!0}function vt(){var e=mt();return"/"===e.charAt(0)||(bt("/"+e),!1)}function mt(){var e=window.location.href,t=e.indexOf("#");return t<0?"":(e=e.slice(t+1),e)}function yt(e){var t=window.location.href,n=t.indexOf("#"),r=n>=0?t.slice(0,n):t;return r+"#"+e}function gt(e){Re?Ne(yt(e)):window.location.hash=e}function bt(e){Re?Ie(yt(e)):window.location.replace(yt(e))}var _t=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index+1).concat(e),r.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var e=t.current;t.index=n,t.updateRoute(r),t.router.afterHooks.forEach((function(t){t&&t(r,e)}))}),(function(e){Ge(e,He.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(tt),xt=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=he(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!Re&&!1!==e.fallback,this.fallback&&(t="hash"),ue||(t="abstract"),this.mode=t,t){case"history":this.history=new ft(this,e.base);break;case"hash":this.history=new pt(this,e.base,this.fallback);break;case"abstract":this.history=new _t(this,e.base);break;default:0}},wt={currentRoute:{configurable:!0}};function Ct(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}function St(e,t,n){var r="hash"===n?"#"+t:t;return e?A(e+"/"+r):r}xt.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},wt.currentRoute.get=function(){return this.history&&this.history.current},xt.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof ft||n instanceof pt){var r=function(e){var r=n.current,o=t.options.scrollBehavior,i=Re&&o;i&&"fullPath"in e&&Se(t,e,r,!1)},o=function(e){n.setupListeners(),r(e)};n.transitionTo(n.getCurrentLocation(),o,o)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},xt.prototype.beforeEach=function(e){return Ct(this.beforeHooks,e)},xt.prototype.beforeResolve=function(e){return Ct(this.resolveHooks,e)},xt.prototype.afterEach=function(e){return Ct(this.afterHooks,e)},xt.prototype.onReady=function(e,t){this.history.onReady(e,t)},xt.prototype.onError=function(e){this.history.onError(e)},xt.prototype.push=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!==typeof Promise)return new Promise((function(t,n){r.history.push(e,t,n)}));this.history.push(e,t,n)},xt.prototype.replace=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!==typeof Promise)return new Promise((function(t,n){r.history.replace(e,t,n)}));this.history.replace(e,t,n)},xt.prototype.go=function(e){this.history.go(e)},xt.prototype.back=function(){this.go(-1)},xt.prototype.forward=function(){this.go(1)},xt.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},xt.prototype.resolve=function(e,t,n){t=t||this.history.current;var r=ee(e,t,n,this),o=this.match(r,t),i=o.redirectedFrom||o.fullPath,a=this.history.base,s=St(a,i,this.mode);return{location:r,route:o,href:s,normalizedTo:r,resolved:o}},xt.prototype.getRoutes=function(){return this.matcher.getRoutes()},xt.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==y&&this.history.transitionTo(this.history.getCurrentLocation())},xt.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==y&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(xt.prototype,wt),xt.install=le,xt.version="3.5.1",xt.isNavigationFailure=Ge,xt.NavigationFailureType=He,xt.START_LOCATION=y,ue&&window.Vue&&window.Vue.use(xt),t["a"]=xt},"8eb7":function(e,t){var n,r,o,i,a,s,l,u,c,f,d,p,h,v,m,y=!1;function g(){if(!y){y=!0;var e=navigator.userAgent,t=/(?:MSIE.(\d+\.\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\d+\.\d+))|(?:Opera(?:.+Version.|.)(\d+\.\d+))|(?:AppleWebKit.(\d+(?:\.\d+)?))|(?:Trident\/\d+\.\d+.*rv:(\d+\.\d+))/.exec(e),g=/(Mac OS X)|(Windows)|(Linux)/.exec(e);if(p=/\b(iPhone|iP[ao]d)/.exec(e),h=/\b(iP[ao]d)/.exec(e),f=/Android/i.exec(e),v=/FBAN\/\w+;/i.exec(e),m=/Mobile/i.exec(e),d=!!/Win64/.exec(e),t){n=t[1]?parseFloat(t[1]):t[5]?parseFloat(t[5]):NaN,n&&document&&document.documentMode&&(n=document.documentMode);var b=/(?:Trident\/(\d+.\d+))/.exec(e);s=b?parseFloat(b[1])+4:n,r=t[2]?parseFloat(t[2]):NaN,o=t[3]?parseFloat(t[3]):NaN,i=t[4]?parseFloat(t[4]):NaN,i?(t=/(?:Chrome\/(\d+\.\d+))/.exec(e),a=t&&t[1]?parseFloat(t[1]):NaN):a=NaN}else n=r=o=a=i=NaN;if(g){if(g[1]){var _=/(?:Mac OS X (\d+(?:[._]\d+)?))/.exec(e);l=!_||parseFloat(_[1].replace("_","."))}else l=!1;u=!!g[2],c=!!g[3]}else l=u=c=!1}}var b={ie:function(){return g()||n},ieCompatibilityMode:function(){return g()||s>n},ie64:function(){return b.ie()&&d},firefox:function(){return g()||r},opera:function(){return g()||o},webkit:function(){return g()||i},safari:function(){return b.webkit()},chrome:function(){return g()||a},windows:function(){return g()||u},osx:function(){return g()||l},linux:function(){return g()||c},iphone:function(){return g()||p},mobile:function(){return g()||p||h||f||m},nativeApp:function(){return g()||v},android:function(){return g()||f},ipad:function(){return g()||h}};e.exports=b},"8f24":function(e,t,n){},"90e3":function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++n+r).toString(36)}},9112:function(e,t,n){var r=n("83ab"),o=n("9bf2"),i=n("5c6c");e.exports=r?function(e,t,n){return o.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},"94ca":function(e,t,n){var r=n("d039"),o=/#|\.prototype\./,i=function(e,t){var n=s[a(e)];return n==u||n!=l&&("function"==typeof t?r(t):!!t)},a=i.normalize=function(e){return String(e).replace(o,".").toLowerCase()},s=i.data={},l=i.NATIVE="N",u=i.POLYFILL="P";e.exports=i},9619:function(e,t,n){var r=n("597f"),o=n("0e15");e.exports={throttle:r,debounce:o}},"9bf2":function(e,t,n){var r=n("83ab"),o=n("0cfb"),i=n("825a"),a=n("c04e"),s=Object.defineProperty;t.f=r?s:function(e,t,n){if(i(e),t=a(t,!0),i(n),o)try{return s(e,t,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},"9d7e":function(e,t,n){"use strict";t.__esModule=!0;var r="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.default=function(e){function t(e){for(var t=arguments.length,n=Array(t>1?t-1:0),a=1;a0?r:n)(e)}},a742:function(e,t,n){"use strict";function r(e){return"[object String]"===Object.prototype.toString.call(e)}function o(e){return"[object Object]"===Object.prototype.toString.call(e)}function i(e){return e&&e.nodeType===Node.ELEMENT_NODE}t.__esModule=!0,t.isString=r,t.isObject=o,t.isHtmlElement=i;t.isFunction=function(e){var t={};return e&&"[object Function]"===t.toString.call(e)},t.isUndefined=function(e){return void 0===e},t.isDefined=function(e){return void 0!==e&&null!==e}},a79d:function(e,t,n){"use strict";var r=n("23e7"),o=n("c430"),i=n("fea9"),a=n("d039"),s=n("d066"),l=n("4840"),u=n("cdf9"),c=n("6eeb"),f=!!i&&a((function(){i.prototype["finally"].call({then:function(){}},(function(){}))}));r({target:"Promise",proto:!0,real:!0,forced:f},{finally:function(e){var t=l(this,s("Promise")),n="function"==typeof e;return this.then(n?function(n){return u(t,e()).then((function(){return n}))}:e,n?function(n){return u(t,e()).then((function(){throw n}))}:e)}}),o||"function"!=typeof i||i.prototype["finally"]||c(i.prototype,"finally",s("Promise").prototype["finally"])},ad41:function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=56)}([function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},,function(e,t){e.exports=n("5924")},function(e,t){e.exports=n("8122")},,function(e,t){e.exports=n("e974")},function(e,t){e.exports=n("6b7c")},function(e,t){e.exports=n("2b0e")},function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"i",(function(){return s})),n.d(t,"d",(function(){return l})),n.d(t,"e",(function(){return u})),n.d(t,"c",(function(){return c})),n.d(t,"g",(function(){return f})),n.d(t,"f",(function(){return d})),n.d(t,"h",(function(){return h})),n.d(t,"l",(function(){return v})),n.d(t,"k",(function(){return m})),n.d(t,"j",(function(){return y})),n.d(t,"a",(function(){return g})),n.d(t,"m",(function(){return b})),n.d(t,"n",(function(){return _}));var r=n(3),o="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=function(e){var t=e.target;while(t&&"HTML"!==t.tagName.toUpperCase()){if("TD"===t.tagName.toUpperCase())return t;t=t.parentNode}return null},a=function(e){return null!==e&&"object"===("undefined"===typeof e?"undefined":o(e))},s=function(e,t,n,o,i){if(!t&&!o&&(!i||Array.isArray(i)&&!i.length))return e;n="string"===typeof n?"descending"===n?-1:1:n&&n<0?-1:1;var s=o?null:function(n,o){return i?(Array.isArray(i)||(i=[i]),i.map((function(t){return"string"===typeof t?Object(r["getValueByPath"])(n,t):t(n,o,e)}))):("$key"!==t&&a(n)&&"$value"in n&&(n=n.$value),[a(n)?Object(r["getValueByPath"])(n,t):n])},l=function(e,t){if(o)return o(e.value,t.value);for(var n=0,r=e.key.length;nt.key[n])return 1}return 0};return e.map((function(e,t){return{value:e,index:t,key:s?s(e,t):null}})).sort((function(e,t){var r=l(e,t);return r||(r=e.index-t.index),r*n})).map((function(e){return e.value}))},l=function(e,t){var n=null;return e.columns.forEach((function(e){e.id===t&&(n=e)})),n},u=function(e,t){for(var n=null,r=0;r2&&void 0!==arguments[2]?arguments[2]:"children",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"hasChildren",o=function(e){return!(Array.isArray(e)&&e.length)};function i(e,a,s){t(e,a,s),a.forEach((function(e){if(e[r])t(e,null,s+1);else{var a=e[n];o(a)||i(e,a,s+1)}}))}e.forEach((function(e){if(e[r])t(e,null,0);else{var a=e[n];o(a)||i(e,a,0)}}))}},function(e,t){e.exports=n("7f4d")},,function(e,t){e.exports=n("2bb5")},function(e,t){e.exports=n("417f")},,function(e,t){e.exports=n("14e9")},function(e,t){e.exports=n("5128")},function(e,t){e.exports=n("4010")},function(e,t){e.exports=n("0e15")},function(e,t){e.exports=n("dcdc")},,,,,,,,,,,function(e,t){e.exports=n("299c")},,,,,,,,,function(e,t){e.exports=n("e62d")},function(e,t){e.exports=n("7fc1")},,,,function(e,t){e.exports=n("9619")},,,function(e,t){e.exports=n("c098")},,,,,,,,,,function(e,t,n){"use strict";n.r(t);var r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"el-table",class:[{"el-table--fit":e.fit,"el-table--striped":e.stripe,"el-table--border":e.border||e.isGroup,"el-table--hidden":e.isHidden,"el-table--group":e.isGroup,"el-table--fluid-height":e.maxHeight,"el-table--scrollable-x":e.layout.scrollX,"el-table--scrollable-y":e.layout.scrollY,"el-table--enable-row-hover":!e.store.states.isComplex,"el-table--enable-row-transition":0!==(e.store.states.data||[]).length&&(e.store.states.data||[]).length<100},e.tableSize?"el-table--"+e.tableSize:""],on:{mouseleave:function(t){e.handleMouseLeave(t)}}},[n("div",{ref:"hiddenColumns",staticClass:"hidden-columns"},[e._t("default")],2),e.showHeader?n("div",{directives:[{name:"mousewheel",rawName:"v-mousewheel",value:e.handleHeaderFooterMousewheel,expression:"handleHeaderFooterMousewheel"}],ref:"headerWrapper",staticClass:"el-table__header-wrapper"},[n("table-header",{ref:"tableHeader",style:{width:e.layout.bodyWidth?e.layout.bodyWidth+"px":""},attrs:{store:e.store,border:e.border,"default-sort":e.defaultSort}})],1):e._e(),n("div",{ref:"bodyWrapper",staticClass:"el-table__body-wrapper",class:[e.layout.scrollX?"is-scrolling-"+e.scrollPosition:"is-scrolling-none"],style:[e.bodyHeight]},[n("table-body",{style:{width:e.bodyWidth},attrs:{context:e.context,store:e.store,stripe:e.stripe,"row-class-name":e.rowClassName,"row-style":e.rowStyle,highlight:e.highlightCurrentRow}}),e.data&&0!==e.data.length?e._e():n("div",{ref:"emptyBlock",staticClass:"el-table__empty-block",style:e.emptyBlockStyle},[n("span",{staticClass:"el-table__empty-text"},[e._t("empty",[e._v(e._s(e.emptyText||e.t("el.table.emptyText")))])],2)]),e.$slots.append?n("div",{ref:"appendWrapper",staticClass:"el-table__append-wrapper"},[e._t("append")],2):e._e()],1),e.showSummary?n("div",{directives:[{name:"show",rawName:"v-show",value:e.data&&e.data.length>0,expression:"data && data.length > 0"},{name:"mousewheel",rawName:"v-mousewheel",value:e.handleHeaderFooterMousewheel,expression:"handleHeaderFooterMousewheel"}],ref:"footerWrapper",staticClass:"el-table__footer-wrapper"},[n("table-footer",{style:{width:e.layout.bodyWidth?e.layout.bodyWidth+"px":""},attrs:{store:e.store,border:e.border,"sum-text":e.sumText||e.t("el.table.sumText"),"summary-method":e.summaryMethod,"default-sort":e.defaultSort}})],1):e._e(),e.fixedColumns.length>0?n("div",{directives:[{name:"mousewheel",rawName:"v-mousewheel",value:e.handleFixedMousewheel,expression:"handleFixedMousewheel"}],ref:"fixedWrapper",staticClass:"el-table__fixed",style:[{width:e.layout.fixedWidth?e.layout.fixedWidth+"px":""},e.fixedHeight]},[e.showHeader?n("div",{ref:"fixedHeaderWrapper",staticClass:"el-table__fixed-header-wrapper"},[n("table-header",{ref:"fixedTableHeader",style:{width:e.bodyWidth},attrs:{fixed:"left",border:e.border,store:e.store}})],1):e._e(),n("div",{ref:"fixedBodyWrapper",staticClass:"el-table__fixed-body-wrapper",style:[{top:e.layout.headerHeight+"px"},e.fixedBodyHeight]},[n("table-body",{style:{width:e.bodyWidth},attrs:{fixed:"left",store:e.store,stripe:e.stripe,highlight:e.highlightCurrentRow,"row-class-name":e.rowClassName,"row-style":e.rowStyle}}),e.$slots.append?n("div",{staticClass:"el-table__append-gutter",style:{height:e.layout.appendHeight+"px"}}):e._e()],1),e.showSummary?n("div",{directives:[{name:"show",rawName:"v-show",value:e.data&&e.data.length>0,expression:"data && data.length > 0"}],ref:"fixedFooterWrapper",staticClass:"el-table__fixed-footer-wrapper"},[n("table-footer",{style:{width:e.bodyWidth},attrs:{fixed:"left",border:e.border,"sum-text":e.sumText||e.t("el.table.sumText"),"summary-method":e.summaryMethod,store:e.store}})],1):e._e()]):e._e(),e.rightFixedColumns.length>0?n("div",{directives:[{name:"mousewheel",rawName:"v-mousewheel",value:e.handleFixedMousewheel,expression:"handleFixedMousewheel"}],ref:"rightFixedWrapper",staticClass:"el-table__fixed-right",style:[{width:e.layout.rightFixedWidth?e.layout.rightFixedWidth+"px":"",right:e.layout.scrollY?(e.border?e.layout.gutterWidth:e.layout.gutterWidth||0)+"px":""},e.fixedHeight]},[e.showHeader?n("div",{ref:"rightFixedHeaderWrapper",staticClass:"el-table__fixed-header-wrapper"},[n("table-header",{ref:"rightFixedTableHeader",style:{width:e.bodyWidth},attrs:{fixed:"right",border:e.border,store:e.store}})],1):e._e(),n("div",{ref:"rightFixedBodyWrapper",staticClass:"el-table__fixed-body-wrapper",style:[{top:e.layout.headerHeight+"px"},e.fixedBodyHeight]},[n("table-body",{style:{width:e.bodyWidth},attrs:{fixed:"right",store:e.store,stripe:e.stripe,"row-class-name":e.rowClassName,"row-style":e.rowStyle,highlight:e.highlightCurrentRow}}),e.$slots.append?n("div",{staticClass:"el-table__append-gutter",style:{height:e.layout.appendHeight+"px"}}):e._e()],1),e.showSummary?n("div",{directives:[{name:"show",rawName:"v-show",value:e.data&&e.data.length>0,expression:"data && data.length > 0"}],ref:"rightFixedFooterWrapper",staticClass:"el-table__fixed-footer-wrapper"},[n("table-footer",{style:{width:e.bodyWidth},attrs:{fixed:"right",border:e.border,"sum-text":e.sumText||e.t("el.table.sumText"),"summary-method":e.summaryMethod,store:e.store}})],1):e._e()]):e._e(),e.rightFixedColumns.length>0?n("div",{ref:"rightFixedPatch",staticClass:"el-table__fixed-right-patch",style:{width:e.layout.scrollY?e.layout.gutterWidth+"px":"0",height:e.layout.headerHeight+"px"}}):e._e(),n("div",{directives:[{name:"show",rawName:"v-show",value:e.resizeProxyVisible,expression:"resizeProxyVisible"}],ref:"resizeProxy",staticClass:"el-table__column-resize-proxy"})])},o=[];r._withStripped=!0;var i=n(18),a=n.n(i),s=n(43),l=n(16),u=n(46),c=n.n(u),f="undefined"!==typeof navigator&&navigator.userAgent.toLowerCase().indexOf("firefox")>-1,d=function(e,t){e&&e.addEventListener&&e.addEventListener(f?"DOMMouseScroll":"mousewheel",(function(e){var n=c()(e);t&&t.apply(this,[e,n])}))},p={bind:function(e,t){d(e,t.value)}},h=n(6),v=n.n(h),m=n(11),y=n.n(m),g=n(7),b=n.n(g),_=n(9),x=n.n(_),w=n(8),C={data:function(){return{states:{defaultExpandAll:!1,expandRows:[]}}},methods:{updateExpandRows:function(){var e=this.states,t=e.data,n=void 0===t?[]:t,r=e.rowKey,o=e.defaultExpandAll,i=e.expandRows;if(o)this.states.expandRows=n.slice();else if(r){var a=Object(w["f"])(i,r);this.states.expandRows=n.reduce((function(e,t){var n=Object(w["g"])(t,r),o=a[n];return o&&e.push(t),e}),[])}else this.states.expandRows=[]},toggleRowExpansion:function(e,t){var n=Object(w["m"])(this.states.expandRows,e,t);n&&(this.table.$emit("expand-change",e,this.states.expandRows.slice()),this.scheduleLayout())},setExpandRowKeys:function(e){this.assertRowKey();var t=this.states,n=t.data,r=t.rowKey,o=Object(w["f"])(n,r);this.states.expandRows=e.reduce((function(e,t){var n=o[t];return n&&e.push(n.row),e}),[])},isRowExpanded:function(e){var t=this.states,n=t.expandRows,r=void 0===n?[]:n,o=t.rowKey;if(o){var i=Object(w["f"])(r,o);return!!i[Object(w["g"])(e,o)]}return-1!==r.indexOf(e)}}},S=n(3),O={data:function(){return{states:{_currentRowKey:null,currentRow:null}}},methods:{setCurrentRowKey:function(e){this.assertRowKey(),this.states._currentRowKey=e,this.setCurrentRowByKey(e)},restoreCurrentRowKey:function(){this.states._currentRowKey=null},setCurrentRowByKey:function(e){var t=this.states,n=t.data,r=void 0===n?[]:n,o=t.rowKey,i=null;o&&(i=Object(S["arrayFind"])(r,(function(t){return Object(w["g"])(t,o)===e}))),t.currentRow=i},updateCurrentRow:function(e){var t=this.states,n=this.table,r=t.currentRow;if(e&&e!==r)return t.currentRow=e,void n.$emit("current-change",e,r);!e&&r&&(t.currentRow=null,n.$emit("current-change",null,r))},updateCurrentRowData:function(){var e=this.states,t=this.table,n=e.rowKey,r=e._currentRowKey,o=e.data||[],i=e.currentRow;if(-1===o.indexOf(i)&&i){if(n){var a=Object(w["g"])(i,n);this.setCurrentRowByKey(a)}else e.currentRow=null;null===e.currentRow&&t.$emit("current-change",null,i)}else r&&(this.setCurrentRowByKey(r),this.restoreCurrentRowKey())}}},E=Object.assign||function(e){for(var t=1;t0&&t[0]&&"selection"===t[0].type&&!t[0].fixed&&(t[0].fixed=!0,e.fixedColumns.unshift(t[0]));var n=t.filter((function(e){return!e.fixed}));e.originColumns=[].concat(e.fixedColumns).concat(n).concat(e.rightFixedColumns);var r=j(n),o=j(e.fixedColumns),i=j(e.rightFixedColumns);e.leafColumnsLength=r.length,e.fixedLeafColumnsLength=o.length,e.rightFixedLeafColumnsLength=i.length,e.columns=[].concat(o).concat(r).concat(i),e.isComplex=e.fixedColumns.length>0||e.rightFixedColumns.length>0},scheduleLayout:function(e){e&&this.updateColumns(),this.table.debouncedUpdateLayout()},isSelected:function(e){var t=this.states.selection,n=void 0===t?[]:t;return n.indexOf(e)>-1},clearSelection:function(){var e=this.states;e.isAllSelected=!1;var t=e.selection;t.length&&(e.selection=[],this.table.$emit("selection-change",[]))},cleanSelection:function(){var e=this.states,t=e.data,n=e.rowKey,r=e.selection,o=void 0;if(n){o=[];var i=Object(w["f"])(r,n),a=Object(w["f"])(t,n);for(var s in i)i.hasOwnProperty(s)&&!a[s]&&o.push(i[s].row)}else o=r.filter((function(e){return-1===t.indexOf(e)}));if(o.length){var l=r.filter((function(e){return-1===o.indexOf(e)}));e.selection=l,this.table.$emit("selection-change",l.slice())}},toggleRowSelection:function(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r=Object(w["m"])(this.states.selection,e,t);if(r){var o=(this.states.selection||[]).slice();n&&this.table.$emit("select",o,e),this.table.$emit("selection-change",o)}},_toggleAllSelection:function(){var e=this.states,t=e.data,n=void 0===t?[]:t,r=e.selection,o=e.selectOnIndeterminate?!e.isAllSelected:!(e.isAllSelected||r.length);e.isAllSelected=o;var i=!1;n.forEach((function(t,n){e.selectable?e.selectable.call(null,t,n)&&Object(w["m"])(r,t,o)&&(i=!0):Object(w["m"])(r,t,o)&&(i=!0)})),i&&this.table.$emit("selection-change",r?r.slice():[]),this.table.$emit("select-all",r)},updateSelectionByRowKey:function(){var e=this.states,t=e.selection,n=e.rowKey,r=e.data,o=Object(w["f"])(t,n);r.forEach((function(e){var r=Object(w["g"])(e,n),i=o[r];i&&(t[i.index]=e)}))},updateAllSelected:function(){var e=this.states,t=e.selection,n=e.rowKey,r=e.selectable,o=e.data||[];if(0!==o.length){var i=void 0;n&&(i=Object(w["f"])(t,n));for(var a=function(e){return i?!!i[Object(w["g"])(e,n)]:-1!==t.indexOf(e)},s=!0,l=0,u=0,c=o.length;u1?n-1:0),o=1;o1&&void 0!==arguments[1]?arguments[1]:{};if(!e)throw new Error("Table is required.");var n=new T;return n.table=e,n.toggleAllSelection=P()(10,n._toggleAllSelection),Object.keys(t).forEach((function(e){n.states[e]=t[e]})),n}function R(e){var t={};return Object.keys(e).forEach((function(n){var r=e[n],o=void 0;"string"===typeof r?o=function(){return this.store.states[r]}:"function"===typeof r?o=function(){return r.call(this,this.store.states)}:console.error("invalid value type"),o&&(t[n]=o)})),t}var N=n(38),I=n.n(N);function F(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var H=function(){function e(t){for(var n in F(this,e),this.observers=[],this.table=null,this.store=null,this.columns=null,this.fit=!0,this.showHeader=!0,this.height=null,this.scrollX=!1,this.scrollY=!1,this.bodyWidth=null,this.fixedWidth=null,this.rightFixedWidth=null,this.tableHeight=null,this.headerHeight=44,this.appendHeight=0,this.footerHeight=44,this.viewportHeight=null,this.bodyHeight=null,this.fixedBodyHeight=null,this.gutterWidth=I()(),t)t.hasOwnProperty(n)&&(this[n]=t[n]);if(!this.table)throw new Error("table is required for Table Layout");if(!this.store)throw new Error("store is required for Table Layout")}return e.prototype.updateScrollY=function(){var e=this.height;if(null===e)return!1;var t=this.table.bodyWrapper;if(this.table.$el&&t){var n=t.querySelector(".el-table__body"),r=this.scrollY,o=n.offsetHeight>this.bodyHeight;return this.scrollY=o,r!==o}return!1},e.prototype.setHeight=function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"height";if(!b.a.prototype.$isServer){var r=this.table.$el;if(e=Object(w["j"])(e),this.height=e,!r&&(e||0===e))return b.a.nextTick((function(){return t.setHeight(e,n)}));"number"===typeof e?(r.style[n]=e+"px",this.updateElsHeight()):"string"===typeof e&&(r.style[n]=e,this.updateElsHeight())}},e.prototype.setMaxHeight=function(e){this.setHeight(e,"max-height")},e.prototype.getFlattenColumns=function(){var e=[],t=this.table.columns;return t.forEach((function(t){t.isColumnGroup?e.push.apply(e,t.columns):e.push(t)})),e},e.prototype.updateElsHeight=function(){var e=this;if(!this.table.$ready)return b.a.nextTick((function(){return e.updateElsHeight()}));var t=this.table.$refs,n=t.headerWrapper,r=t.appendWrapper,o=t.footerWrapper;if(this.appendHeight=r?r.offsetHeight:0,!this.showHeader||n){var i=n?n.querySelector(".el-table__header tr"):null,a=this.headerDisplayNone(i),s=this.headerHeight=this.showHeader?n.offsetHeight:0;if(this.showHeader&&!a&&n.offsetWidth>0&&(this.table.columns||[]).length>0&&s<2)return b.a.nextTick((function(){return e.updateElsHeight()}));var l=this.tableHeight=this.table.$el.clientHeight,u=this.footerHeight=o?o.offsetHeight:0;null!==this.height&&(this.bodyHeight=l-s-u+(o?1:0)),this.fixedBodyHeight=this.scrollX?this.bodyHeight-this.gutterWidth:this.bodyHeight;var c=!(this.store.states.data&&this.store.states.data.length);this.viewportHeight=this.scrollX?l-(c?0:this.gutterWidth):l,this.updateScrollY(),this.notifyObservers("scrollable")}},e.prototype.headerDisplayNone=function(e){if(!e)return!0;var t=e;while("DIV"!==t.tagName){if("none"===getComputedStyle(t).display)return!0;t=t.parentElement}return!1},e.prototype.updateColumnsWidth=function(){if(!b.a.prototype.$isServer){var e=this.fit,t=this.table.$el.clientWidth,n=0,r=this.getFlattenColumns(),o=r.filter((function(e){return"number"!==typeof e.width}));if(r.forEach((function(e){"number"===typeof e.width&&e.realWidth&&(e.realWidth=null)})),o.length>0&&e){r.forEach((function(e){n+=e.width||e.minWidth||80}));var i=this.scrollY?this.gutterWidth:0;if(n<=t-i){this.scrollX=!1;var a=t-i-n;if(1===o.length)o[0].realWidth=(o[0].minWidth||80)+a;else{var s=o.reduce((function(e,t){return e+(t.minWidth||80)}),0),l=a/s,u=0;o.forEach((function(e,t){if(0!==t){var n=Math.floor((e.minWidth||80)*l);u+=n,e.realWidth=(e.minWidth||80)+n}})),o[0].realWidth=(o[0].minWidth||80)+a-u}}else this.scrollX=!0,o.forEach((function(e){e.realWidth=e.minWidth}));this.bodyWidth=Math.max(n,t),this.table.resizeState.width=this.bodyWidth}else r.forEach((function(e){e.width||e.minWidth?e.realWidth=e.width||e.minWidth:e.realWidth=80,n+=e.realWidth})),this.scrollX=n>t,this.bodyWidth=n;var c=this.store.states.fixedColumns;if(c.length>0){var f=0;c.forEach((function(e){f+=e.realWidth||e.width})),this.fixedWidth=f}var d=this.store.states.rightFixedColumns;if(d.length>0){var p=0;d.forEach((function(e){p+=e.realWidth||e.width})),this.rightFixedWidth=p}this.notifyObservers("columns")}},e.prototype.addObserver=function(e){this.observers.push(e)},e.prototype.removeObserver=function(e){var t=this.observers.indexOf(e);-1!==t&&this.observers.splice(t,1)},e.prototype.notifyObservers=function(e){var t=this,n=this.observers;n.forEach((function(n){switch(e){case"columns":n.onColumnsChange(t);break;case"scrollable":n.onScrollableChange(t);break;default:throw new Error("Table Layout don't have event "+e+".")}}))},e}(),z=H,D=n(2),B=n(29),W=n.n(B),V={created:function(){this.tableLayout.addObserver(this)},destroyed:function(){this.tableLayout.removeObserver(this)},computed:{tableLayout:function(){var e=this.layout;if(!e&&this.table&&(e=this.table.layout),!e)throw new Error("Can not find table layout.");return e}},mounted:function(){this.onColumnsChange(this.tableLayout),this.onScrollableChange(this.tableLayout)},updated:function(){this.__updated__||(this.onColumnsChange(this.tableLayout),this.onScrollableChange(this.tableLayout),this.__updated__=!0)},methods:{onColumnsChange:function(e){var t=this.$el.querySelectorAll("colgroup > col");if(t.length){var n=e.getFlattenColumns(),r={};n.forEach((function(e){r[e.id]=e}));for(var o=0,i=t.length;o col[name=gutter]"),n=0,r=t.length;n=this.leftFixedLeafCount:"right"===this.fixed?e=this.columnsCount-this.rightFixedLeafCount},getSpan:function(e,t,n,r){var o=1,i=1,a=this.table.spanMethod;if("function"===typeof a){var s=a({row:e,column:t,rowIndex:n,columnIndex:r});Array.isArray(s)?(o=s[0],i=s[1]):"object"===("undefined"===typeof s?"undefined":U(s))&&(o=s.rowspan,i=s.colspan)}return{rowspan:o,colspan:i}},getRowStyle:function(e,t){var n=this.table.rowStyle;return"function"===typeof n?n.call(null,{row:e,rowIndex:t}):n||null},getRowClass:function(e,t){var n=["el-table__row"];this.table.highlightCurrentRow&&e===this.store.states.currentRow&&n.push("current-row"),this.stripe&&t%2===1&&n.push("el-table__row--striped");var r=this.table.rowClassName;return"string"===typeof r?n.push(r):"function"===typeof r&&n.push(r.call(null,{row:e,rowIndex:t})),this.store.states.expandRows.indexOf(e)>-1&&n.push("expanded"),n},getCellStyle:function(e,t,n,r){var o=this.table.cellStyle;return"function"===typeof o?o.call(null,{rowIndex:e,columnIndex:t,row:n,column:r}):o},getCellClass:function(e,t,n,r){var o=[r.id,r.align,r.className];this.isColumnHidden(t)&&o.push("is-hidden");var i=this.table.cellClassName;return"string"===typeof i?o.push(i):"function"===typeof i&&o.push(i.call(null,{rowIndex:e,columnIndex:t,row:n,column:r})),o.join(" ")},getColspanRealWidth:function(e,t,n){if(t<1)return e[n].realWidth;var r=e.map((function(e){var t=e.realWidth;return t})).slice(n,n+t);return r.reduce((function(e,t){return e+t}),-1)},handleCellMouseEnter:function(e,t){var n=this.table,r=Object(w["b"])(e);if(r){var o=Object(w["c"])(n,r),i=n.hoverState={cell:r,column:o,row:t};n.$emit("cell-mouse-enter",i.row,i.column,i.cell,e)}var a=e.target.querySelector(".cell");if(Object(D["hasClass"])(a,"el-tooltip")&&a.childNodes.length){var s=document.createRange();s.setStart(a,0),s.setEnd(a,a.childNodes.length);var l=s.getBoundingClientRect().width,u=(parseInt(Object(D["getStyle"])(a,"paddingLeft"),10)||0)+(parseInt(Object(D["getStyle"])(a,"paddingRight"),10)||0);if((l+u>a.offsetWidth||a.scrollWidth>a.offsetWidth)&&this.$refs.tooltip){var c=this.$refs.tooltip;this.tooltipContent=r.innerText||r.textContent,c.referenceElm=r,c.$refs.popper&&(c.$refs.popper.style.display="none"),c.doDestroy(),c.setExpectedState(!0),this.activateTooltip(c)}}},handleCellMouseLeave:function(e){var t=this.$refs.tooltip;t&&(t.setExpectedState(!1),t.handleClosePopper());var n=Object(w["b"])(e);if(n){var r=this.table.hoverState||{};this.table.$emit("cell-mouse-leave",r.row,r.column,r.cell,e)}},handleMouseEnter:P()(30,(function(e){this.store.commit("setHoverRow",e)})),handleMouseLeave:P()(30,(function(){this.store.commit("setHoverRow",null)})),handleContextMenu:function(e,t){this.handleEvent(e,t,"contextmenu")},handleDoubleClick:function(e,t){this.handleEvent(e,t,"dblclick")},handleClick:function(e,t){this.store.commit("setCurrentRow",t),this.handleEvent(e,t,"click")},handleEvent:function(e,t,n){var r=this.table,o=Object(w["b"])(e),i=void 0;o&&(i=Object(w["c"])(r,o),i&&r.$emit("cell-"+n,t,i,o,e)),r.$emit("row-"+n,t,i,e)},rowRender:function(e,t,n){var r=this,o=this.$createElement,i=this.treeIndent,a=this.columns,s=this.firstDefaultColumnIndex,l=a.map((function(e,t){return r.isColumnHidden(t)})),u=this.getRowClass(e,t),c=!0;n&&(u.push("el-table__row--level-"+n.level),c=n.display);var f=c?null:{display:"none"};return o("tr",{style:[f,this.getRowStyle(e,t)],class:u,key:this.getKeyOfRow(e,t),on:{dblclick:function(t){return r.handleDoubleClick(t,e)},click:function(t){return r.handleClick(t,e)},contextmenu:function(t){return r.handleContextMenu(t,e)},mouseenter:function(e){return r.handleMouseEnter(t)},mouseleave:this.handleMouseLeave}},[a.map((function(u,c){var f=r.getSpan(e,u,t,c),d=f.rowspan,p=f.colspan;if(!d||!p)return null;var h=q({},u);h.realWidth=r.getColspanRealWidth(a,p,c);var v={store:r.store,_self:r.context||r.table.$vnode.context,column:h,row:e,$index:t};return c===s&&n&&(v.treeNode={indent:n.level*i,level:n.level},"boolean"===typeof n.expanded&&(v.treeNode.expanded=n.expanded,"loading"in n&&(v.treeNode.loading=n.loading),"noLazyChildren"in n&&(v.treeNode.noLazyChildren=n.noLazyChildren))),o("td",{style:r.getCellStyle(t,c,e,u),class:r.getCellClass(t,c,e,u),attrs:{rowspan:d,colspan:p},on:{mouseenter:function(t){return r.handleCellMouseEnter(t,e)},mouseleave:r.handleCellMouseLeave}},[u.renderCell.call(r._renderProxy,r.$createElement,v,l[c])])}))])},wrappedRowRender:function(e,t){var n=this,r=this.$createElement,o=this.store,i=o.isRowExpanded,a=o.assertRowKey,s=o.states,l=s.treeData,u=s.lazyTreeNodeMap,c=s.childrenColumnName,f=s.rowKey;if(this.hasExpandColumn&&i(e)){var d=this.table.renderExpanded,p=this.rowRender(e,t);return d?[[p,r("tr",{key:"expanded-row__"+p.key},[r("td",{attrs:{colspan:this.columnsCount},class:"el-table__expanded-cell"},[d(this.$createElement,{row:e,$index:t,store:this.store})])])]]:(console.error("[Element Error]renderExpanded is required."),p)}if(Object.keys(l).length){a();var h=Object(w["g"])(e,f),v=l[h],m=null;v&&(m={expanded:v.expanded,level:v.level,display:!0},"boolean"===typeof v.lazy&&("boolean"===typeof v.loaded&&v.loaded&&(m.noLazyChildren=!(v.children&&v.children.length)),m.loading=v.loading));var y=[this.rowRender(e,t,m)];if(v){var g=0,b=function e(r,o){r&&r.length&&o&&r.forEach((function(r){var i={display:o.display&&o.expanded,level:o.level+1},a=Object(w["g"])(r,f);if(void 0===a||null===a)throw new Error("for nested data item, row-key is required.");if(v=q({},l[a]),v&&(i.expanded=v.expanded,v.level=v.level||i.level,v.display=!(!v.expanded||!i.display),"boolean"===typeof v.lazy&&("boolean"===typeof v.loaded&&v.loaded&&(i.noLazyChildren=!(v.children&&v.children.length)),i.loading=v.loading)),g++,y.push(n.rowRender(r,t+g,i)),v){var s=u[a]||r[c];e(s,v)}}))};v.display=!0;var _=u[h]||e[c];b(_,v)}return y}return this.rowRender(e,t)}}},G=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("transition",{attrs:{name:"el-zoom-in-top"}},[e.multiple?n("div",{directives:[{name:"clickoutside",rawName:"v-clickoutside",value:e.handleOutsideClick,expression:"handleOutsideClick"},{name:"show",rawName:"v-show",value:e.showPopper,expression:"showPopper"}],staticClass:"el-table-filter"},[n("div",{staticClass:"el-table-filter__content"},[n("el-scrollbar",{attrs:{"wrap-class":"el-table-filter__wrap"}},[n("el-checkbox-group",{staticClass:"el-table-filter__checkbox-group",model:{value:e.filteredValue,callback:function(t){e.filteredValue=t},expression:"filteredValue"}},e._l(e.filters,(function(t){return n("el-checkbox",{key:t.value,attrs:{label:t.value}},[e._v(e._s(t.text))])})),1)],1)],1),n("div",{staticClass:"el-table-filter__bottom"},[n("button",{class:{"is-disabled":0===e.filteredValue.length},attrs:{disabled:0===e.filteredValue.length},on:{click:e.handleConfirm}},[e._v(e._s(e.t("el.table.confirmFilter")))]),n("button",{on:{click:e.handleReset}},[e._v(e._s(e.t("el.table.resetFilter")))])])]):n("div",{directives:[{name:"clickoutside",rawName:"v-clickoutside",value:e.handleOutsideClick,expression:"handleOutsideClick"},{name:"show",rawName:"v-show",value:e.showPopper,expression:"showPopper"}],staticClass:"el-table-filter"},[n("ul",{staticClass:"el-table-filter__list"},[n("li",{staticClass:"el-table-filter__list-item",class:{"is-active":void 0===e.filterValue||null===e.filterValue},on:{click:function(t){e.handleSelect(null)}}},[e._v(e._s(e.t("el.table.clearFilter")))]),e._l(e.filters,(function(t){return n("li",{key:t.value,staticClass:"el-table-filter__list-item",class:{"is-active":e.isActive(t)},attrs:{label:t.value},on:{click:function(n){e.handleSelect(t.value)}}},[e._v(e._s(t.text))])}))],2)])])},X=[];G._withStripped=!0;var Y=n(5),J=n.n(Y),Z=n(15),Q=n(12),ee=n.n(Q),te=[];!b.a.prototype.$isServer&&document.addEventListener("click",(function(e){te.forEach((function(t){var n=e.target;t&&t.$el&&(n===t.$el||t.$el.contains(n)||t.handleOutsideClick&&t.handleOutsideClick(e))}))}));var ne={open:function(e){e&&te.push(e)},close:function(e){var t=te.indexOf(e);-1!==t&&te.splice(e,1)}},re=n(39),oe=n.n(re),ie=n(14),ae=n.n(ie),se={name:"ElTableFilterPanel",mixins:[J.a,v.a],directives:{Clickoutside:ee.a},components:{ElCheckbox:a.a,ElCheckboxGroup:oe.a,ElScrollbar:ae.a},props:{placement:{type:String,default:"bottom-end"}},methods:{isActive:function(e){return e.value===this.filterValue},handleOutsideClick:function(){var e=this;setTimeout((function(){e.showPopper=!1}),16)},handleConfirm:function(){this.confirmFilter(this.filteredValue),this.handleOutsideClick()},handleReset:function(){this.filteredValue=[],this.confirmFilter(this.filteredValue),this.handleOutsideClick()},handleSelect:function(e){this.filterValue=e,"undefined"!==typeof e&&null!==e?this.confirmFilter(this.filteredValue):this.confirmFilter([]),this.handleOutsideClick()},confirmFilter:function(e){this.table.store.commit("filterChange",{column:this.column,values:e}),this.table.store.updateAllSelected()}},data:function(){return{table:null,cell:null,column:null}},computed:{filters:function(){return this.column&&this.column.filters},filterValue:{get:function(){return(this.column.filteredValue||[])[0]},set:function(e){this.filteredValue&&("undefined"!==typeof e&&null!==e?this.filteredValue.splice(0,1,e):this.filteredValue.splice(0,1))}},filteredValue:{get:function(){return this.column&&this.column.filteredValue||[]},set:function(e){this.column&&(this.column.filteredValue=e)}},multiple:function(){return!this.column||this.column.filterMultiple}},mounted:function(){var e=this;this.popperElm=this.$el,this.referenceElm=this.cell,this.table.bodyWrapper.addEventListener("scroll",(function(){e.updatePopper()})),this.$watch("showPopper",(function(t){e.column&&(e.column.filterOpened=t),t?ne.open(e):ne.close(e)}))},watch:{showPopper:function(e){!0===e&&parseInt(this.popperJS._popper.style.zIndex,10)1;return o&&(this.$parent.isGroup=!0),e("table",{class:"el-table__header",attrs:{cellspacing:"0",cellpadding:"0",border:"0"}},[e("colgroup",[this.columns.map((function(t){return e("col",{attrs:{name:t.id},key:t.id})})),this.hasGutter?e("col",{attrs:{name:"gutter"}}):""]),e("thead",{class:[{"is-group":o,"has-gutter":this.hasGutter}]},[this._l(r,(function(n,r){return e("tr",{style:t.getHeaderRowStyle(r),class:t.getHeaderRowClass(r)},[n.map((function(o,i){return e("th",{attrs:{colspan:o.colSpan,rowspan:o.rowSpan},on:{mousemove:function(e){return t.handleMouseMove(e,o)},mouseout:t.handleMouseOut,mousedown:function(e){return t.handleMouseDown(e,o)},click:function(e){return t.handleHeaderClick(e,o)},contextmenu:function(e){return t.handleHeaderContextMenu(e,o)}},style:t.getHeaderCellStyle(r,i,n,o),class:t.getHeaderCellClass(r,i,n,o),key:o.id},[e("div",{class:["cell",o.filteredValue&&o.filteredValue.length>0?"highlight":"",o.labelClassName]},[o.renderHeader?o.renderHeader.call(t._renderProxy,e,{column:o,$index:i,store:t.store,_self:t.$parent.$vnode.context}):o.label,o.sortable?e("span",{class:"caret-wrapper",on:{click:function(e){return t.handleSortClick(e,o)}}},[e("i",{class:"sort-caret ascending",on:{click:function(e){return t.handleSortClick(e,o,"ascending")}}}),e("i",{class:"sort-caret descending",on:{click:function(e){return t.handleSortClick(e,o,"descending")}}})]):"",o.filterable?e("span",{class:"el-table__column-filter-trigger",on:{click:function(e){return t.handleFilterClick(e,o)}}},[e("i",{class:["el-icon-arrow-down",o.filterOpened?"el-icon-arrow-up":""]})]):""])])})),t.hasGutter?e("th",{class:"gutter"}):""])}))])])},props:{fixed:String,store:{required:!0},border:Boolean,defaultSort:{type:Object,default:function(){return{prop:"",order:""}}}},components:{ElCheckbox:a.a},computed:de({table:function(){return this.$parent},hasGutter:function(){return!this.fixed&&this.tableLayout.gutterWidth}},R({columns:"columns",isAllSelected:"isAllSelected",leftFixedLeafCount:"fixedLeafColumnsLength",rightFixedLeafCount:"rightFixedLeafColumnsLength",columnsCount:function(e){return e.columns.length},leftFixedCount:function(e){return e.fixedColumns.length},rightFixedCount:function(e){return e.rightFixedColumns.length}})),created:function(){this.filterPanels={}},mounted:function(){var e=this;this.$nextTick((function(){var t=e.defaultSort,n=t.prop,r=t.order,o=!0;e.store.commit("sort",{prop:n,order:r,init:o})}))},beforeDestroy:function(){var e=this.filterPanels;for(var t in e)e.hasOwnProperty(t)&&e[t]&&e[t].$destroy(!0)},methods:{isCellHidden:function(e,t){for(var n=0,r=0;r=this.leftFixedLeafCount:"right"===this.fixed?n=this.columnsCount-this.rightFixedLeafCount},getHeaderRowStyle:function(e){var t=this.table.headerRowStyle;return"function"===typeof t?t.call(null,{rowIndex:e}):t},getHeaderRowClass:function(e){var t=[],n=this.table.headerRowClassName;return"string"===typeof n?t.push(n):"function"===typeof n&&t.push(n.call(null,{rowIndex:e})),t.join(" ")},getHeaderCellStyle:function(e,t,n,r){var o=this.table.headerCellStyle;return"function"===typeof o?o.call(null,{rowIndex:e,columnIndex:t,row:n,column:r}):o},getHeaderCellClass:function(e,t,n,r){var o=[r.id,r.order,r.headerAlign,r.className,r.labelClassName];0===e&&this.isCellHidden(t,n)&&o.push("is-hidden"),r.children||o.push("is-leaf"),r.sortable&&o.push("is-sortable");var i=this.table.headerCellClassName;return"string"===typeof i?o.push(i):"function"===typeof i&&o.push(i.call(null,{rowIndex:e,columnIndex:t,row:n,column:r})),o.join(" ")},toggleAllSelection:function(e){e.stopPropagation(),this.store.commit("toggleAllSelection")},handleFilterClick:function(e,t){e.stopPropagation();var n=e.target,r="TH"===n.tagName?n:n.parentNode;if(!Object(D["hasClass"])(r,"noclick")){r=r.querySelector(".el-table__column-filter-trigger")||r;var o=this.$parent,i=this.filterPanels[t.id];i&&t.filterOpened?i.showPopper=!1:(i||(i=new b.a(fe),this.filterPanels[t.id]=i,t.filterPlacement&&(i.placement=t.filterPlacement),i.table=o,i.cell=r,i.column=t,!this.$isServer&&i.$mount(document.createElement("div"))),setTimeout((function(){i.showPopper=!0}),16))}},handleHeaderClick:function(e,t){!t.filters&&t.sortable?this.handleSortClick(e,t):t.filterable&&!t.sortable&&this.handleFilterClick(e,t),this.$parent.$emit("header-click",t,e)},handleHeaderContextMenu:function(e,t){this.$parent.$emit("header-contextmenu",t,e)},handleMouseDown:function(e,t){var n=this;if(!this.$isServer&&!(t.children&&t.children.length>0)&&this.draggingColumn&&this.border){this.dragging=!0,this.$parent.resizeProxyVisible=!0;var r=this.$parent,o=r.$el,i=o.getBoundingClientRect().left,a=this.$el.querySelector("th."+t.id),s=a.getBoundingClientRect(),l=s.left-i+30;Object(D["addClass"])(a,"noclick"),this.dragState={startMouseLeft:e.clientX,startLeft:s.right-i,startColumnLeft:s.left-i,tableLeft:i};var u=r.$refs.resizeProxy;u.style.left=this.dragState.startLeft+"px",document.onselectstart=function(){return!1},document.ondragstart=function(){return!1};var c=function(e){var t=e.clientX-n.dragState.startMouseLeft,r=n.dragState.startLeft+t;u.style.left=Math.max(l,r)+"px"},f=function o(){if(n.dragging){var i=n.dragState,s=i.startColumnLeft,l=i.startLeft,f=parseInt(u.style.left,10),d=f-s;t.width=t.realWidth=d,r.$emit("header-dragend",t.width,l-s,t,e),n.store.scheduleLayout(),document.body.style.cursor="",n.dragging=!1,n.draggingColumn=null,n.dragState={},r.resizeProxyVisible=!1}document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",o),document.onselectstart=null,document.ondragstart=null,setTimeout((function(){Object(D["removeClass"])(a,"noclick")}),0)};document.addEventListener("mousemove",c),document.addEventListener("mouseup",f)}},handleMouseMove:function(e,t){if(!(t.children&&t.children.length>0)){var n=e.target;while(n&&"TH"!==n.tagName)n=n.parentNode;if(t&&t.resizable&&!this.dragging&&this.border){var r=n.getBoundingClientRect(),o=document.body.style;r.width>12&&r.right-e.pageX<8?(o.cursor="col-resize",Object(D["hasClass"])(n,"is-sortable")&&(n.style.cursor="col-resize"),this.draggingColumn=t):this.dragging||(o.cursor="",Object(D["hasClass"])(n,"is-sortable")&&(n.style.cursor="pointer"),this.draggingColumn=null)}}},handleMouseOut:function(){this.$isServer||(document.body.style.cursor="")},toggleOrder:function(e){var t=e.order,n=e.sortOrders;if(""===t)return n[0];var r=n.indexOf(t||null);return n[r>n.length-2?0:r+1]},handleSortClick:function(e,t,n){e.stopPropagation();var r=t.order===n?null:n||this.toggleOrder(t),o=e.target;while(o&&"TH"!==o.tagName)o=o.parentNode;if(o&&"TH"===o.tagName&&Object(D["hasClass"])(o,"noclick"))Object(D["removeClass"])(o,"noclick");else if(t.sortable){var i=this.store.states,a=i.sortProp,s=void 0,l=i.sortingColumn;(l!==t||l===t&&null===l.order)&&(l&&(l.order=null),i.sortingColumn=t,a=t.property),s=t.order=r||null,i.sortProp=a,i.sortOrder=s,this.store.commit("changeSortCondition")}}},data:function(){return{draggingColumn:null,dragging:!1,dragState:{}}}},me=Object.assign||function(e){for(var t=1;t=this.leftFixedLeafCount;if("right"===this.fixed){for(var r=0,o=0;o=this.columnsCount-this.rightFixedCount)},getRowClasses:function(e,t){var n=[e.id,e.align,e.labelClassName];return e.className&&n.push(e.className),this.isCellHidden(t,this.columns,e)&&n.push("is-hidden"),e.children||n.push("is-leaf"),n}}},ge=Object.assign||function(e){for(var t=1;t0){var r=n.scrollTop;t.pixelY<0&&0!==r&&e.preventDefault(),t.pixelY>0&&n.scrollHeight-n.clientHeight>r&&e.preventDefault(),n.scrollTop+=Math.ceil(t.pixelY/5)}else n.scrollLeft+=Math.ceil(t.pixelX/5)},handleHeaderFooterMousewheel:function(e,t){var n=t.pixelX,r=t.pixelY;Math.abs(n)>=Math.abs(r)&&(this.bodyWrapper.scrollLeft+=t.pixelX/5)},syncPostion:Object(s["throttle"])(20,(function(){var e=this.bodyWrapper,t=e.scrollLeft,n=e.scrollTop,r=e.offsetWidth,o=e.scrollWidth,i=this.$refs,a=i.headerWrapper,s=i.footerWrapper,l=i.fixedBodyWrapper,u=i.rightFixedBodyWrapper;a&&(a.scrollLeft=t),s&&(s.scrollLeft=t),l&&(l.scrollTop=n),u&&(u.scrollTop=n);var c=o-r-1;this.scrollPosition=t>=c?"right":0===t?"left":"middle"})),bindEvents:function(){this.bodyWrapper.addEventListener("scroll",this.syncPostion,{passive:!0}),this.fit&&Object(l["addResizeListener"])(this.$el,this.resizeListener)},unbindEvents:function(){this.bodyWrapper.removeEventListener("scroll",this.syncPostion,{passive:!0}),this.fit&&Object(l["removeResizeListener"])(this.$el,this.resizeListener)},resizeListener:function(){if(this.$ready){var e=!1,t=this.$el,n=this.resizeState,r=n.width,o=n.height,i=t.offsetWidth;r!==i&&(e=!0);var a=t.offsetHeight;(this.height||this.shouldUpdateHeight)&&o!==a&&(e=!0),e&&(this.resizeState.width=i,this.resizeState.height=a,this.doLayout())}},doLayout:function(){this.shouldUpdateHeight&&this.layout.updateElsHeight(),this.layout.updateColumnsWidth()},sort:function(e,t){this.store.commit("sort",{prop:e,order:t})},toggleAllSelection:function(){this.store.commit("toggleAllSelection")}},computed:ge({tableSize:function(){return this.size||(this.$ELEMENT||{}).size},bodyWrapper:function(){return this.$refs.bodyWrapper},shouldUpdateHeight:function(){return this.height||this.maxHeight||this.fixedColumns.length>0||this.rightFixedColumns.length>0},bodyWidth:function(){var e=this.layout,t=e.bodyWidth,n=e.scrollY,r=e.gutterWidth;return t?t-(n?r:0)+"px":""},bodyHeight:function(){var e=this.layout,t=e.headerHeight,n=void 0===t?0:t,r=e.bodyHeight,o=e.footerHeight,i=void 0===o?0:o;if(this.height)return{height:r?r+"px":""};if(this.maxHeight){var a=Object(w["j"])(this.maxHeight);if("number"===typeof a)return{"max-height":a-i-(this.showHeader?n:0)+"px"}}return{}},fixedBodyHeight:function(){if(this.height)return{height:this.layout.fixedBodyHeight?this.layout.fixedBodyHeight+"px":""};if(this.maxHeight){var e=Object(w["j"])(this.maxHeight);if("number"===typeof e)return e=this.layout.scrollX?e-this.layout.gutterWidth:e,this.showHeader&&(e-=this.layout.headerHeight),e-=this.layout.footerHeight,{"max-height":e+"px"}}return{}},fixedHeight:function(){return this.maxHeight?this.showSummary?{bottom:0}:{bottom:this.layout.scrollX&&this.data.length?this.layout.gutterWidth+"px":""}:this.showSummary?{height:this.layout.tableHeight?this.layout.tableHeight+"px":""}:{height:this.layout.viewportHeight?this.layout.viewportHeight+"px":""}},emptyBlockStyle:function(){if(this.data&&this.data.length)return null;var e="100%";return this.layout.appendHeight&&(e="calc(100% - "+this.layout.appendHeight+"px)"),{width:this.bodyWidth,height:e}}},R({selection:"selection",columns:"columns",tableData:"data",fixedColumns:"fixedColumns",rightFixedColumns:"rightFixedColumns"})),watch:{height:{immediate:!0,handler:function(e){this.layout.setHeight(e)}},maxHeight:{immediate:!0,handler:function(e){this.layout.setMaxHeight(e)}},currentRowKey:{immediate:!0,handler:function(e){this.rowKey&&this.store.setCurrentRowKey(e)}},data:{immediate:!0,handler:function(e){this.store.commit("setData",e)}},expandRowKeys:{immediate:!0,handler:function(e){e&&this.store.setExpandRowKeysAdapter(e)}}},created:function(){var e=this;this.tableId="el-table_"+be++,this.debouncedUpdateLayout=Object(s["debounce"])(50,(function(){return e.doLayout()}))},mounted:function(){var e=this;this.bindEvents(),this.store.updateColumns(),this.doLayout(),this.resizeState={width:this.$el.offsetWidth,height:this.$el.offsetHeight},this.store.states.columns.forEach((function(t){t.filteredValue&&t.filteredValue.length&&e.store.commit("filterChange",{column:t,values:t.filteredValue,silent:!0})})),this.$ready=!0},destroyed:function(){this.unbindEvents()},data:function(){var e=this.treeProps,t=e.hasChildren,n=void 0===t?"hasChildren":t,r=e.children,o=void 0===r?"children":r;this.store=L(this,{rowKey:this.rowKey,defaultExpandAll:this.defaultExpandAll,selectOnIndeterminate:this.selectOnIndeterminate,indent:this.indent,lazy:this.lazy,lazyColumnIdentifier:n,childrenColumnName:o});var i=new z({store:this.store,table:this,fit:this.fit,showHeader:this.showHeader});return{layout:i,isHidden:!1,renderExpanded:null,resizeProxyVisible:!1,resizeState:{width:null,height:null},isGroup:!1,scrollPosition:"left"}}},xe=_e,we=Object(ue["a"])(xe,r,o,!1,null,null,null);we.options.__file="packages/table/src/table.vue";var Ce=we.exports;Ce.install=function(e){e.component(Ce.name,Ce)};t["default"]=Ce}])},ad6d:function(e,t,n){"use strict";var r=n("825a");e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},ae93:function(e,t,n){"use strict";var r,o,i,a=n("d039"),s=n("e163"),l=n("9112"),u=n("5135"),c=n("b622"),f=n("c430"),d=c("iterator"),p=!1,h=function(){return this};[].keys&&(i=[].keys(),"next"in i?(o=s(s(i)),o!==Object.prototype&&(r=o)):p=!0);var v=void 0==r||a((function(){var e={};return r[d].call(e)!==e}));v&&(r={}),f&&!v||u(r,d)||l(r,d,h),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},b041:function(e,t,n){"use strict";var r=n("00ee"),o=n("f5df");e.exports=r?{}.toString:function(){return"[object "+o(this)+"]"}},b575:function(e,t,n){var r,o,i,a,s,l,u,c,f=n("da84"),d=n("06cf").f,p=n("2cf4").set,h=n("1cdc"),v=n("a4b4"),m=n("605d"),y=f.MutationObserver||f.WebKitMutationObserver,g=f.document,b=f.process,_=f.Promise,x=d(f,"queueMicrotask"),w=x&&x.value;w||(r=function(){var e,t;m&&(e=b.domain)&&e.exit();while(o){t=o.fn,o=o.next;try{t()}catch(n){throw o?a():i=void 0,n}}i=void 0,e&&e.enter()},h||m||v||!y||!g?_&&_.resolve?(u=_.resolve(void 0),c=u.then,a=function(){c.call(u,r)}):a=m?function(){b.nextTick(r)}:function(){p.call(f,r)}:(s=!0,l=g.createTextNode(""),new y(r).observe(l,{characterData:!0}),a=function(){l.data=s=!s})),e.exports=w||function(e){var t={fn:e,next:void 0};i&&(i.next=t),o||(o=t,a()),i=t}},b622:function(e,t,n){var r=n("da84"),o=n("5692"),i=n("5135"),a=n("90e3"),s=n("4930"),l=n("fdbf"),u=o("wks"),c=r.Symbol,f=l?c:c&&c.withoutSetter||a;e.exports=function(e){return i(u,e)||(s&&i(c,e)?u[e]=c[e]:u[e]=f("Symbol."+e)),u[e]}},b84d:function(e,t,n){},be4f:function(e,t,n){},c04e:function(e,t,n){var r=n("861d");e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},c098:function(e,t,n){e.exports=n("d4af")},c216:function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=122)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},122:function(e,t,n){"use strict";n.r(t);var r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("span",{staticClass:"el-breadcrumb__item"},[n("span",{ref:"link",class:["el-breadcrumb__inner",e.to?"is-link":""],attrs:{role:"link"}},[e._t("default")],2),e.separatorClass?n("i",{staticClass:"el-breadcrumb__separator",class:e.separatorClass}):n("span",{staticClass:"el-breadcrumb__separator",attrs:{role:"presentation"}},[e._v(e._s(e.separator))])])},o=[];r._withStripped=!0;var i={name:"ElBreadcrumbItem",props:{to:{},replace:Boolean},data:function(){return{separator:"",separatorClass:""}},inject:["elBreadcrumb"],mounted:function(){var e=this;this.separator=this.elBreadcrumb.separator,this.separatorClass=this.elBreadcrumb.separatorClass;var t=this.$refs.link;t.setAttribute("role","link"),t.addEventListener("click",(function(t){var n=e.to,r=e.$router;n&&r&&(e.replace?r.replace(n):r.push(n))}))}},a=i,s=n(0),l=Object(s["a"])(a,r,o,!1,null,null,null);l.options.__file="packages/breadcrumb/src/breadcrumb-item.vue";var u=l.exports;u.install=function(e){e.component(u.name,u)};t["default"]=u}})},c430:function(e,t){e.exports=!1},c56a:function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:300,r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(!e||!t)throw new Error("instance & callback is required");var o=!1,i=function(){o||(o=!0,t&&t.apply(null,arguments))};r?e.$once("after-leave",i):e.$on("after-leave",i),setTimeout((function(){i()}),n+100)}},c6b6:function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},c6cd:function(e,t,n){var r=n("da84"),o=n("ce4e"),i="__core-js_shared__",a=r[i]||o(i,{});e.exports=a},c8ba:function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"===typeof window&&(n=window)}e.exports=n},ca84:function(e,t,n){var r=n("5135"),o=n("fc6a"),i=n("4d64").indexOf,a=n("d012");e.exports=function(e,t){var n,s=o(e),l=0,u=[];for(n in s)!r(a,n)&&r(s,n)&&u.push(n);while(t.length>l)r(s,n=t[l++])&&(~i(u,n)||u.push(n));return u}},cbb5:function(e,t,n){},cc12:function(e,t,n){var r=n("da84"),o=n("861d"),i=r.document,a=o(i)&&o(i.createElement);e.exports=function(e){return a?i.createElement(e):{}}},cca6:function(e,t,n){var r=n("23e7"),o=n("60da");r({target:"Object",stat:!0,forced:Object.assign!==o},{assign:o})},cdf9:function(e,t,n){var r=n("825a"),o=n("861d"),i=n("f069");e.exports=function(e,t){if(r(e),o(t)&&t.constructor===e)return t;var n=i.f(e),a=n.resolve;return a(t),n.promise}},ce4e:function(e,t,n){var r=n("da84"),o=n("9112");e.exports=function(e,t){try{o(r,e,t)}catch(n){r[e]=t}return t}},d010:function(e,t,n){"use strict";function r(e,t,n){this.$children.forEach((function(o){var i=o.$options.componentName;i===e?o.$emit.apply(o,[t].concat(n)):r.apply(o,[e,t].concat([n]))}))}t.__esModule=!0,t.default={methods:{dispatch:function(e,t,n){var r=this.$parent||this.$root,o=r.$options.componentName;while(r&&(!o||o!==e))r=r.$parent,r&&(o=r.$options.componentName);r&&r.$emit.apply(r,[t].concat(n))},broadcast:function(e,t,n){r.call(this,e,t,n)}}}},d012:function(e,t){e.exports={}},d039:function(e,t){e.exports=function(e){try{return!!e()}catch(t){return!0}}},d066:function(e,t,n){var r=n("428f"),o=n("da84"),i=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?i(r[e])||i(o[e]):r[e]&&r[e][t]||o[e]&&o[e][t]}},d1e7:function(e,t,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);t.f=i?function(e){var t=o(this,e);return!!t&&t.enumerable}:r},d2bb:function(e,t,n){var r=n("825a"),o=n("3bbe");e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set,e.call(n,[]),t=n instanceof Array}catch(i){}return function(n,i){return r(n),o(i),t?e.call(n,i):n.__proto__=i,n}}():void 0)},d397:function(e,t,n){"use strict";function r(e){return void 0!==e&&null!==e}function o(e){var t=/([(\uAC00-\uD7AF)|(\u3130-\u318F)])+/gi;return t.test(e)}t.__esModule=!0,t.isDef=r,t.isKorean=o},d3b7:function(e,t,n){var r=n("00ee"),o=n("6eeb"),i=n("b041");r||o(Object.prototype,"toString",i,{unsafe:!0})},d44e:function(e,t,n){var r=n("9bf2").f,o=n("5135"),i=n("b622"),a=i("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,a)&&r(e,a,{configurable:!0,value:t})}},d4af:function(e,t,n){"use strict";var r=n("8eb7"),o=n("7b3e"),i=10,a=40,s=800;function l(e){var t=0,n=0,r=0,o=0;return"detail"in e&&(n=e.detail),"wheelDelta"in e&&(n=-e.wheelDelta/120),"wheelDeltaY"in e&&(n=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=n,n=0),r=t*i,o=n*i,"deltaY"in e&&(o=e.deltaY),"deltaX"in e&&(r=e.deltaX),(r||o)&&e.deltaMode&&(1==e.deltaMode?(r*=a,o*=a):(r*=s,o*=s)),r&&!t&&(t=r<1?-1:1),o&&!n&&(n=o<1?-1:1),{spinX:t,spinY:n,pixelX:r,pixelY:o}}l.getEventType=function(){return r.firefox()?"DOMMouseScroll":o("wheel")?"wheel":"mousewheel"},e.exports=l},da84:function(e,t,n){(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof t&&t)||function(){return this}()||Function("return this")()}).call(this,n("c8ba"))},dcdc:function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=83)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},4:function(e,t){e.exports=n("d010")},83:function(e,t,n){"use strict";n.r(t);var r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("label",{staticClass:"el-checkbox",class:[e.border&&e.checkboxSize?"el-checkbox--"+e.checkboxSize:"",{"is-disabled":e.isDisabled},{"is-bordered":e.border},{"is-checked":e.isChecked}],attrs:{id:e.id}},[n("span",{staticClass:"el-checkbox__input",class:{"is-disabled":e.isDisabled,"is-checked":e.isChecked,"is-indeterminate":e.indeterminate,"is-focus":e.focus},attrs:{tabindex:!!e.indeterminate&&0,role:!!e.indeterminate&&"checkbox","aria-checked":!!e.indeterminate&&"mixed"}},[n("span",{staticClass:"el-checkbox__inner"}),e.trueLabel||e.falseLabel?n("input",{directives:[{name:"model",rawName:"v-model",value:e.model,expression:"model"}],staticClass:"el-checkbox__original",attrs:{type:"checkbox","aria-hidden":e.indeterminate?"true":"false",name:e.name,disabled:e.isDisabled,"true-value":e.trueLabel,"false-value":e.falseLabel},domProps:{checked:Array.isArray(e.model)?e._i(e.model,null)>-1:e._q(e.model,e.trueLabel)},on:{change:[function(t){var n=e.model,r=t.target,o=r.checked?e.trueLabel:e.falseLabel;if(Array.isArray(n)){var i=null,a=e._i(n,i);r.checked?a<0&&(e.model=n.concat([i])):a>-1&&(e.model=n.slice(0,a).concat(n.slice(a+1)))}else e.model=o},e.handleChange],focus:function(t){e.focus=!0},blur:function(t){e.focus=!1}}}):n("input",{directives:[{name:"model",rawName:"v-model",value:e.model,expression:"model"}],staticClass:"el-checkbox__original",attrs:{type:"checkbox","aria-hidden":e.indeterminate?"true":"false",disabled:e.isDisabled,name:e.name},domProps:{value:e.label,checked:Array.isArray(e.model)?e._i(e.model,e.label)>-1:e.model},on:{change:[function(t){var n=e.model,r=t.target,o=!!r.checked;if(Array.isArray(n)){var i=e.label,a=e._i(n,i);r.checked?a<0&&(e.model=n.concat([i])):a>-1&&(e.model=n.slice(0,a).concat(n.slice(a+1)))}else e.model=o},e.handleChange],focus:function(t){e.focus=!0},blur:function(t){e.focus=!1}}})]),e.$slots.default||e.label?n("span",{staticClass:"el-checkbox__label"},[e._t("default"),e.$slots.default?e._e():[e._v(e._s(e.label))]],2):e._e()])},o=[];r._withStripped=!0;var i=n(4),a=n.n(i),s={name:"ElCheckbox",mixins:[a.a],inject:{elForm:{default:""},elFormItem:{default:""}},componentName:"ElCheckbox",data:function(){return{selfModel:!1,focus:!1,isLimitExceeded:!1}},computed:{model:{get:function(){return this.isGroup?this.store:void 0!==this.value?this.value:this.selfModel},set:function(e){this.isGroup?(this.isLimitExceeded=!1,void 0!==this._checkboxGroup.min&&e.lengththis._checkboxGroup.max&&(this.isLimitExceeded=!0),!1===this.isLimitExceeded&&this.dispatch("ElCheckboxGroup","input",[e])):(this.$emit("input",e),this.selfModel=e)}},isChecked:function(){return"[object Boolean]"==={}.toString.call(this.model)?this.model:Array.isArray(this.model)?this.model.indexOf(this.label)>-1:null!==this.model&&void 0!==this.model?this.model===this.trueLabel:void 0},isGroup:function(){var e=this.$parent;while(e){if("ElCheckboxGroup"===e.$options.componentName)return this._checkboxGroup=e,!0;e=e.$parent}return!1},store:function(){return this._checkboxGroup?this._checkboxGroup.value:this.value},isLimitDisabled:function(){var e=this._checkboxGroup,t=e.max,n=e.min;return!(!t&&!n)&&this.model.length>=t&&!this.isChecked||this.model.length<=n&&this.isChecked},isDisabled:function(){return this.isGroup?this._checkboxGroup.disabled||this.disabled||(this.elForm||{}).disabled||this.isLimitDisabled:this.disabled||(this.elForm||{}).disabled},_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},checkboxSize:function(){var e=this.size||this._elFormItemSize||(this.$ELEMENT||{}).size;return this.isGroup&&this._checkboxGroup.checkboxGroupSize||e}},props:{value:{},label:{},indeterminate:Boolean,disabled:Boolean,checked:Boolean,name:String,trueLabel:[String,Number],falseLabel:[String,Number],id:String,controls:String,border:Boolean,size:String},methods:{addToStore:function(){Array.isArray(this.model)&&-1===this.model.indexOf(this.label)?this.model.push(this.label):this.model=this.trueLabel||!0},handleChange:function(e){var t=this;if(!this.isLimitExceeded){var n=void 0;n=e.target.checked?void 0===this.trueLabel||this.trueLabel:void 0!==this.falseLabel&&this.falseLabel,this.$emit("change",n,e),this.$nextTick((function(){t.isGroup&&t.dispatch("ElCheckboxGroup","change",[t._checkboxGroup.value])}))}}},created:function(){this.checked&&this.addToStore()},mounted:function(){this.indeterminate&&this.$el.setAttribute("aria-controls",this.controls)},watch:{value:function(e){this.dispatch("ElFormItem","el.form.change",e)}}},l=s,u=n(0),c=Object(u["a"])(l,r,o,!1,null,null,null);c.options.__file="packages/checkbox/src/checkbox.vue";var f=c.exports;f.install=function(e){e.component(f.name,f)};t["default"]=f}})},ddb0:function(e,t,n){var r=n("da84"),o=n("fdbc"),i=n("e260"),a=n("9112"),s=n("b622"),l=s("iterator"),u=s("toStringTag"),c=i.values;for(var f in o){var d=r[f],p=d&&d.prototype;if(p){if(p[l]!==c)try{a(p,l,c)}catch(v){p[l]=c}if(p[u]||a(p,u,f),o[f])for(var h in i)if(p[h]!==i[h])try{a(p,h,i[h])}catch(v){p[h]=i[h]}}}},df75:function(e,t,n){var r=n("ca84"),o=n("7839");e.exports=Object.keys||function(e){return r(e,o)}},e163:function(e,t,n){var r=n("5135"),o=n("7b0b"),i=n("f772"),a=n("e177"),s=i("IE_PROTO"),l=Object.prototype;e.exports=a?Object.getPrototypeOf:function(e){return e=o(e),r(e,s)?e[s]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},e177:function(e,t,n){var r=n("d039");e.exports=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},e260:function(e,t,n){"use strict";var r=n("fc6a"),o=n("44d2"),i=n("3f8c"),a=n("69f3"),s=n("7dd0"),l="Array Iterator",u=a.set,c=a.getterFor(l);e.exports=s(Array,"Array",(function(e,t){u(this,{type:l,target:r(e),index:0,kind:t})}),(function(){var e=c(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values"),i.Arguments=i.Array,o("keys"),o("values"),o("entries")},e2cc:function(e,t,n){var r=n("6eeb");e.exports=function(e,t,n){for(var o in t)r(e,o,t[o],n);return e}},e3ea:function(e,t,n){},e452:function(e,t,n){"use strict";t.__esModule=!0;var r=r||{};r.Utils=r.Utils||{},r.Utils.focusFirstDescendant=function(e){for(var t=0;t=0;t--){var n=e.childNodes[t];if(r.Utils.attemptFocus(n)||r.Utils.focusLastDescendant(n))return!0}return!1},r.Utils.attemptFocus=function(e){if(!r.Utils.isFocusable(e))return!1;r.Utils.IgnoreUtilFocusChanges=!0;try{e.focus()}catch(t){}return r.Utils.IgnoreUtilFocusChanges=!1,document.activeElement===e},r.Utils.isFocusable=function(e){if(e.tabIndex>0||0===e.tabIndex&&null!==e.getAttribute("tabIndex"))return!0;if(e.disabled)return!1;switch(e.nodeName){case"A":return!!e.href&&"ignore"!==e.rel;case"INPUT":return"hidden"!==e.type&&"file"!==e.type;case"BUTTON":case"SELECT":case"TEXTAREA":return!0;default:return!1}},r.Utils.triggerEvent=function(e,t){var n=void 0;n=/^mouse|click/.test(t)?"MouseEvents":/^key/.test(t)?"KeyboardEvent":"HTMLEvents";for(var r=document.createEvent(n),o=arguments.length,i=Array(o>2?o-2:0),a=2;a=51&&/native code/.test(H))return!1;var t=H.resolve(1),n=function(e){e((function(){}),(function(){}))},r=t.constructor={};return r[L]=n,!(t.then((function(){}))instanceof n)})),ne=te||!x((function(e){H.all(e)["catch"]((function(){}))})),re=function(e){var t;return!(!m(e)||"function"!=typeof(t=e.then))&&t},oe=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;S((function(){var r=e.value,o=e.state==J,i=0;while(n.length>i){var a,s,l,u=n[i++],c=o?u.ok:u.fail,f=u.resolve,d=u.reject,p=u.domain;try{c?(o||(e.rejection===ee&&le(e),e.rejection=Q),!0===c?a=r:(p&&p.enter(),a=c(r),p&&(p.exit(),l=!0)),a===u.promise?d(z("Promise-chain cycle")):(s=re(a))?s.call(a,f,d):f(a)):d(r)}catch(h){p&&!l&&p.exit(),d(h)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&ae(e)}))}},ie=function(e,t,n){var r,o;q?(r=D.createEvent("Event"),r.promise=t,r.reason=n,r.initEvent(e,!1,!0),u.dispatchEvent(r)):r={promise:t,reason:n},!K&&(o=u["on"+e])?o(r):e===G&&E("Unhandled promise rejection",n)},ae=function(e){C.call(u,(function(){var t,n=e.facade,r=e.value,o=se(e);if(o&&(t=$((function(){M?B.emit("unhandledRejection",r,n):ie(G,n,r)})),e.rejection=M||se(e)?ee:Q,t.error))throw t.value}))},se=function(e){return e.rejection!==Q&&!e.parent},le=function(e){C.call(u,(function(){var t=e.facade;M?B.emit("rejectionHandled",t):ie(X,t,e.value)}))},ue=function(e,t,n){return function(r){e(t,r,n)}},ce=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=Z,oe(e,!0))},fe=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw z("Promise can't be resolved itself");var r=re(t);r?S((function(){var n={done:!1};try{r.call(t,ue(fe,n,e),ue(ce,n,e))}catch(o){ce(n,o,e)}})):(e.value=t,e.state=J,oe(e,!1))}catch(o){ce({done:!1},o,e)}}};te&&(H=function(e){g(this,H,R),y(e),r.call(this);var t=N(this);try{e(ue(fe,t),ue(ce,t))}catch(n){ce(t,n)}},r=function(e){I(this,{type:R,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:Y,value:void 0})},r.prototype=p(H.prototype,{then:function(e,t){var n=F(this),r=V(w(this,H));return r.ok="function"!=typeof e||e,r.fail="function"==typeof t&&t,r.domain=M?B.domain:void 0,n.parent=!0,n.reactions.push(r),n.state!=Y&&oe(n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),o=function(){var e=new r,t=N(e);this.promise=e,this.resolve=ue(fe,t),this.reject=ue(ce,t)},k.f=V=function(e){return e===H||e===i?new o(e):U(e)},l||"function"!=typeof f||(a=f.prototype.then,d(f.prototype,"then",(function(e,t){var n=this;return new H((function(e,t){a.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof W&&s({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return O(H,W.apply(u,arguments))}}))),s({global:!0,wrap:!0,forced:te},{Promise:H}),h(H,R,!1,!0),v(R),i=c(R),s({target:R,stat:!0,forced:te},{reject:function(e){var t=V(this);return t.reject.call(void 0,e),t.promise}}),s({target:R,stat:!0,forced:l||te},{resolve:function(e){return O(l&&this===i?H:this,e)}}),s({target:R,stat:!0,forced:ne},{all:function(e){var t=this,n=V(t),r=n.resolve,o=n.reject,i=$((function(){var n=y(t.resolve),i=[],a=0,s=1;_(e,(function(e){var l=a++,u=!1;i.push(void 0),s++,n.call(t,e).then((function(e){u||(u=!0,i[l]=e,--s||r(i))}),o)})),--s||r(i)}));return i.error&&o(i.value),n.promise},race:function(e){var t=this,n=V(t),r=n.reject,o=$((function(){var o=y(t.resolve);_(e,(function(e){o.call(t,e).then(n.resolve,r)}))}));return o.error&&r(o.value),n.promise}})},e893:function(e,t,n){var r=n("5135"),o=n("56ef"),i=n("06cf"),a=n("9bf2");e.exports=function(e,t){for(var n=o(t),s=a.f,l=i.f,u=0;u-1?"center "+n:n+" center"}},appendArrow:function(e){var t=void 0;if(!this.appended){for(var n in this.appended=!0,e.attributes)if(/^_v-/.test(e.attributes[n].name)){t=e.attributes[n].name;break}var r=document.createElement("div");t&&r.setAttribute(t,""),r.setAttribute("x-arrow",""),r.className="popper__arrow",e.appendChild(r)}}},beforeDestroy:function(){this.doDestroy(!0),this.popperElm&&this.popperElm.parentNode===document.body&&(this.popperElm.removeEventListener("click",l),document.body.removeChild(this.popperElm))},deactivated:function(){this.$options.beforeDestroy[0].call(this)}}},ecdf:function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=130)}({130:function(e,t,n){"use strict";n.r(t);var r=n(3),o={default:{order:""},selection:{width:48,minWidth:48,realWidth:48,order:"",className:"el-table-column--selection"},expand:{width:48,minWidth:48,realWidth:48,order:""},index:{width:48,minWidth:48,realWidth:48,order:""}},i={selection:{renderHeader:function(e,t){var n=t.store;return e("el-checkbox",{attrs:{disabled:n.states.data&&0===n.states.data.length,indeterminate:n.states.selection.length>0&&!this.isAllSelected,value:this.isAllSelected},nativeOn:{click:this.toggleAllSelection}})},renderCell:function(e,t){var n=t.row,r=t.column,o=t.store,i=t.$index;return e("el-checkbox",{nativeOn:{click:function(e){return e.stopPropagation()}},attrs:{value:o.isSelected(n),disabled:!!r.selectable&&!r.selectable.call(null,n,i)},on:{input:function(){o.commit("rowSelectedChanged",n)}}})},sortable:!1,resizable:!1},index:{renderHeader:function(e,t){var n=t.column;return n.label||"#"},renderCell:function(e,t){var n=t.$index,r=t.column,o=n+1,i=r.index;return"number"===typeof i?o=n+i:"function"===typeof i&&(o=i(n)),e("div",[o])},sortable:!1},expand:{renderHeader:function(e,t){var n=t.column;return n.label||""},renderCell:function(e,t){var n=t.row,r=t.store,o=["el-table__expand-icon"];r.states.expandRows.indexOf(n)>-1&&o.push("el-table__expand-icon--expanded");var i=function(e){e.stopPropagation(),r.toggleRowExpansion(n)};return e("div",{class:o,on:{click:i}},[e("i",{class:"el-icon el-icon-arrow-right"})])},sortable:!1,resizable:!1,className:"el-table__expand-column"}};function a(e,t){var n=t.row,o=t.column,i=t.$index,a=o.property,s=a&&Object(r["getPropByPath"])(n,a).v;return o&&o.formatter?o.formatter(n,o,s,i):s}function s(e,t){var n=t.row,r=t.treeNode,o=t.store;if(!r)return null;var i=[],a=function(e){e.stopPropagation(),o.loadOrToggle(n)};if(r.indent&&i.push(e("span",{class:"el-table__indent",style:{"padding-left":r.indent+"px"}})),"boolean"!==typeof r.expanded||r.noLazyChildren)i.push(e("span",{class:"el-table__placeholder"}));else{var s=["el-table__expand-icon",r.expanded?"el-table__expand-icon--expanded":""],l=["el-icon-arrow-right"];r.loading&&(l=["el-icon-loading"]),i.push(e("div",{class:s,on:{click:a}},[e("i",{class:l})]))}return i}var l=n(8),u=n(18),c=n.n(u),f=Object.assign||function(e){for(var t=1;t-1}))}}},data:function(){return{isSubColumn:!1,columns:[]}},computed:{owner:function(){var e=this.$parent;while(e&&!e.tableId)e=e.$parent;return e},columnOrTableParent:function(){var e=this.$parent;while(e&&!e.tableId&&!e.columnId)e=e.$parent;return e},realWidth:function(){return Object(l["l"])(this.width)},realMinWidth:function(){return Object(l["k"])(this.minWidth)},realAlign:function(){return this.align?"is-"+this.align:null},realHeaderAlign:function(){return this.headerAlign?"is-"+this.headerAlign:this.realAlign}},methods:{getPropsData:function(){for(var e=this,t=arguments.length,n=Array(t),r=0;rt.key[n])return 1}return 0};return e.map((function(e,t){return{value:e,index:t,key:s?s(e,t):null}})).sort((function(e,t){var r=l(e,t);return r||(r=e.index-t.index),r*n})).map((function(e){return e.value}))},l=function(e,t){var n=null;return e.columns.forEach((function(e){e.id===t&&(n=e)})),n},u=function(e,t){for(var n=null,r=0;r2&&void 0!==arguments[2]?arguments[2]:"children",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"hasChildren",o=function(e){return!(Array.isArray(e)&&e.length)};function i(e,a,s){t(e,a,s),a.forEach((function(e){if(e[r])t(e,null,s+1);else{var a=e[n];o(a)||i(e,a,s+1)}}))}e.forEach((function(e){if(e[r])t(e,null,0);else{var a=e[n];o(a)||i(e,a,0)}}))}}})},eedf:function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=97)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},97:function(e,t,n){"use strict";n.r(t);var r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("button",{staticClass:"el-button",class:[e.type?"el-button--"+e.type:"",e.buttonSize?"el-button--"+e.buttonSize:"",{"is-disabled":e.buttonDisabled,"is-loading":e.loading,"is-plain":e.plain,"is-round":e.round,"is-circle":e.circle}],attrs:{disabled:e.buttonDisabled||e.loading,autofocus:e.autofocus,type:e.nativeType},on:{click:e.handleClick}},[e.loading?n("i",{staticClass:"el-icon-loading"}):e._e(),e.icon&&!e.loading?n("i",{class:e.icon}):e._e(),e.$slots.default?n("span",[e._t("default")],2):e._e()])},o=[];r._withStripped=!0;var i={name:"ElButton",inject:{elForm:{default:""},elFormItem:{default:""}},props:{type:{type:String,default:"default"},size:String,icon:{type:String,default:""},nativeType:{type:String,default:"button"},loading:Boolean,disabled:Boolean,plain:Boolean,autofocus:Boolean,round:Boolean,circle:Boolean},computed:{_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},buttonSize:function(){return this.size||this._elFormItemSize||(this.$ELEMENT||{}).size},buttonDisabled:function(){return this.disabled||(this.elForm||{}).disabled}},methods:{handleClick:function(e){this.$emit("click",e)}}},a=i,s=n(0),l=Object(s["a"])(a,r,o,!1,null,null,null);l.options.__file="packages/button/src/button.vue";var u=l.exports;u.install=function(e){e.component(u.name,u)};t["default"]=u}})},f069:function(e,t,n){"use strict";var r=n("1c0b"),o=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r})),this.resolve=r(t),this.reject=r(n)};e.exports.f=function(e){return new o(e)}},f0d9:function(e,t,n){"use strict";t.__esModule=!0,t.default={el:{colorpicker:{confirm:"确定",clear:"清空"},datepicker:{now:"此刻",today:"今天",cancel:"取消",clear:"清空",confirm:"确定",selectDate:"选择日期",selectTime:"选择时间",startDate:"开始日期",startTime:"开始时间",endDate:"结束日期",endTime:"结束时间",prevYear:"前一年",nextYear:"后一年",prevMonth:"上个月",nextMonth:"下个月",year:"年",month1:"1 月",month2:"2 月",month3:"3 月",month4:"4 月",month5:"5 月",month6:"6 月",month7:"7 月",month8:"8 月",month9:"9 月",month10:"10 月",month11:"11 月",month12:"12 月",weeks:{sun:"日",mon:"一",tue:"二",wed:"三",thu:"四",fri:"五",sat:"六"},months:{jan:"一月",feb:"二月",mar:"三月",apr:"四月",may:"五月",jun:"六月",jul:"七月",aug:"八月",sep:"九月",oct:"十月",nov:"十一月",dec:"十二月"}},select:{loading:"加载中",noMatch:"无匹配数据",noData:"无数据",placeholder:"请选择"},cascader:{noMatch:"无匹配数据",loading:"加载中",placeholder:"请选择",noData:"暂无数据"},pagination:{goto:"前往",pagesize:"条/页",total:"共 {total} 条",pageClassifier:"页"},messagebox:{title:"提示",confirm:"确定",cancel:"取消",error:"输入的数据不合法!"},upload:{deleteTip:"按 delete 键可删除",delete:"删除",preview:"查看图片",continue:"继续上传"},table:{emptyText:"暂无数据",confirmFilter:"筛选",resetFilter:"重置",clearFilter:"全部",sumText:"合计"},tree:{emptyText:"暂无数据"},transfer:{noMatch:"无匹配数据",noData:"无数据",titles:["列表 1","列表 2"],filterPlaceholder:"请输入搜索内容",noCheckedFormat:"共 {total} 项",hasCheckedFormat:"已选 {checked}/{total} 项"},image:{error:"加载失败"},pageHeader:{title:"返回"},popconfirm:{confirmButtonText:"确定",cancelButtonText:"取消"}}}},f3ad:function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=76)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=l):o&&(l=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),l)if(u.functional){u._injectStyles=l;var c=u.render;u.render=function(e,t){return l.call(t),c(e,t)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,l):[l]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},11:function(e,t){e.exports=n("2bb5")},21:function(e,t){e.exports=n("d397")},4:function(e,t){e.exports=n("d010")},76:function(e,t,n){"use strict";n.r(t);var r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{class:["textarea"===e.type?"el-textarea":"el-input",e.inputSize?"el-input--"+e.inputSize:"",{"is-disabled":e.inputDisabled,"is-exceed":e.inputExceed,"el-input-group":e.$slots.prepend||e.$slots.append,"el-input-group--append":e.$slots.append,"el-input-group--prepend":e.$slots.prepend,"el-input--prefix":e.$slots.prefix||e.prefixIcon,"el-input--suffix":e.$slots.suffix||e.suffixIcon||e.clearable||e.showPassword}],on:{mouseenter:function(t){e.hovering=!0},mouseleave:function(t){e.hovering=!1}}},["textarea"!==e.type?[e.$slots.prepend?n("div",{staticClass:"el-input-group__prepend"},[e._t("prepend")],2):e._e(),"textarea"!==e.type?n("input",e._b({ref:"input",staticClass:"el-input__inner",attrs:{tabindex:e.tabindex,type:e.showPassword?e.passwordVisible?"text":"password":e.type,disabled:e.inputDisabled,readonly:e.readonly,autocomplete:e.autoComplete||e.autocomplete,"aria-label":e.label},on:{compositionstart:e.handleCompositionStart,compositionupdate:e.handleCompositionUpdate,compositionend:e.handleCompositionEnd,input:e.handleInput,focus:e.handleFocus,blur:e.handleBlur,change:e.handleChange}},"input",e.$attrs,!1)):e._e(),e.$slots.prefix||e.prefixIcon?n("span",{staticClass:"el-input__prefix"},[e._t("prefix"),e.prefixIcon?n("i",{staticClass:"el-input__icon",class:e.prefixIcon}):e._e()],2):e._e(),e.getSuffixVisible()?n("span",{staticClass:"el-input__suffix"},[n("span",{staticClass:"el-input__suffix-inner"},[e.showClear&&e.showPwdVisible&&e.isWordLimitVisible?e._e():[e._t("suffix"),e.suffixIcon?n("i",{staticClass:"el-input__icon",class:e.suffixIcon}):e._e()],e.showClear?n("i",{staticClass:"el-input__icon el-icon-circle-close el-input__clear",on:{mousedown:function(e){e.preventDefault()},click:e.clear}}):e._e(),e.showPwdVisible?n("i",{staticClass:"el-input__icon el-icon-view el-input__clear",on:{click:e.handlePasswordVisible}}):e._e(),e.isWordLimitVisible?n("span",{staticClass:"el-input__count"},[n("span",{staticClass:"el-input__count-inner"},[e._v("\n "+e._s(e.textLength)+"/"+e._s(e.upperLimit)+"\n ")])]):e._e()],2),e.validateState?n("i",{staticClass:"el-input__icon",class:["el-input__validateIcon",e.validateIcon]}):e._e()]):e._e(),e.$slots.append?n("div",{staticClass:"el-input-group__append"},[e._t("append")],2):e._e()]:n("textarea",e._b({ref:"textarea",staticClass:"el-textarea__inner",style:e.textareaStyle,attrs:{tabindex:e.tabindex,disabled:e.inputDisabled,readonly:e.readonly,autocomplete:e.autoComplete||e.autocomplete,"aria-label":e.label},on:{compositionstart:e.handleCompositionStart,compositionupdate:e.handleCompositionUpdate,compositionend:e.handleCompositionEnd,input:e.handleInput,focus:e.handleFocus,blur:e.handleBlur,change:e.handleChange}},"textarea",e.$attrs,!1)),e.isWordLimitVisible&&"textarea"===e.type?n("span",{staticClass:"el-input__count"},[e._v(e._s(e.textLength)+"/"+e._s(e.upperLimit))]):e._e()],2)},o=[];r._withStripped=!0;var i=n(4),a=n.n(i),s=n(11),l=n.n(s),u=void 0,c="\n height:0 !important;\n visibility:hidden !important;\n overflow:hidden !important;\n position:absolute !important;\n z-index:-1000 !important;\n top:0 !important;\n right:0 !important\n",f=["letter-spacing","line-height","padding-top","padding-bottom","font-family","font-weight","font-size","text-rendering","text-transform","width","text-indent","padding-left","padding-right","border-width","box-sizing"];function d(e){var t=window.getComputedStyle(e),n=t.getPropertyValue("box-sizing"),r=parseFloat(t.getPropertyValue("padding-bottom"))+parseFloat(t.getPropertyValue("padding-top")),o=parseFloat(t.getPropertyValue("border-bottom-width"))+parseFloat(t.getPropertyValue("border-top-width")),i=f.map((function(e){return e+":"+t.getPropertyValue(e)})).join(";");return{contextStyle:i,paddingSize:r,borderSize:o,boxSizing:n}}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;u||(u=document.createElement("textarea"),document.body.appendChild(u));var r=d(e),o=r.paddingSize,i=r.borderSize,a=r.boxSizing,s=r.contextStyle;u.setAttribute("style",s+";"+c),u.value=e.value||e.placeholder||"";var l=u.scrollHeight,f={};"border-box"===a?l+=i:"content-box"===a&&(l-=o),u.value="";var p=u.scrollHeight-o;if(null!==t){var h=p*t;"border-box"===a&&(h=h+o+i),l=Math.max(h,l),f.minHeight=h+"px"}if(null!==n){var v=p*n;"border-box"===a&&(v=v+o+i),l=Math.min(v,l)}return f.height=l+"px",u.parentNode&&u.parentNode.removeChild(u),u=null,f}var h=n(9),v=n.n(h),m=n(21),y={name:"ElInput",componentName:"ElInput",mixins:[a.a,l.a],inheritAttrs:!1,inject:{elForm:{default:""},elFormItem:{default:""}},data:function(){return{textareaCalcStyle:{},hovering:!1,focused:!1,isComposing:!1,passwordVisible:!1}},props:{value:[String,Number],size:String,resize:String,form:String,disabled:Boolean,readonly:Boolean,type:{type:String,default:"text"},autosize:{type:[Boolean,Object],default:!1},autocomplete:{type:String,default:"off"},autoComplete:{type:String,validator:function(e){return!0}},validateEvent:{type:Boolean,default:!0},suffixIcon:String,prefixIcon:String,label:String,clearable:{type:Boolean,default:!1},showPassword:{type:Boolean,default:!1},showWordLimit:{type:Boolean,default:!1},tabindex:String},computed:{_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},validateState:function(){return this.elFormItem?this.elFormItem.validateState:""},needStatusIcon:function(){return!!this.elForm&&this.elForm.statusIcon},validateIcon:function(){return{validating:"el-icon-loading",success:"el-icon-circle-check",error:"el-icon-circle-close"}[this.validateState]},textareaStyle:function(){return v()({},this.textareaCalcStyle,{resize:this.resize})},inputSize:function(){return this.size||this._elFormItemSize||(this.$ELEMENT||{}).size},inputDisabled:function(){return this.disabled||(this.elForm||{}).disabled},nativeInputValue:function(){return null===this.value||void 0===this.value?"":String(this.value)},showClear:function(){return this.clearable&&!this.inputDisabled&&!this.readonly&&this.nativeInputValue&&(this.focused||this.hovering)},showPwdVisible:function(){return this.showPassword&&!this.inputDisabled&&!this.readonly&&(!!this.nativeInputValue||this.focused)},isWordLimitVisible:function(){return this.showWordLimit&&this.$attrs.maxlength&&("text"===this.type||"textarea"===this.type)&&!this.inputDisabled&&!this.readonly&&!this.showPassword},upperLimit:function(){return this.$attrs.maxlength},textLength:function(){return"number"===typeof this.value?String(this.value).length:(this.value||"").length},inputExceed:function(){return this.isWordLimitVisible&&this.textLength>this.upperLimit}},watch:{value:function(e){this.$nextTick(this.resizeTextarea),this.validateEvent&&this.dispatch("ElFormItem","el.form.change",[e])},nativeInputValue:function(){this.setNativeInputValue()},type:function(){var e=this;this.$nextTick((function(){e.setNativeInputValue(),e.resizeTextarea(),e.updateIconOffset()}))}},methods:{focus:function(){this.getInput().focus()},blur:function(){this.getInput().blur()},getMigratingConfig:function(){return{props:{icon:"icon is removed, use suffix-icon / prefix-icon instead.","on-icon-click":"on-icon-click is removed."},events:{click:"click is removed."}}},handleBlur:function(e){this.focused=!1,this.$emit("blur",e),this.validateEvent&&this.dispatch("ElFormItem","el.form.blur",[this.value])},select:function(){this.getInput().select()},resizeTextarea:function(){if(!this.$isServer){var e=this.autosize,t=this.type;if("textarea"===t)if(e){var n=e.minRows,r=e.maxRows;this.textareaCalcStyle=p(this.$refs.textarea,n,r)}else this.textareaCalcStyle={minHeight:p(this.$refs.textarea).minHeight}}},setNativeInputValue:function(){var e=this.getInput();e&&e.value!==this.nativeInputValue&&(e.value=this.nativeInputValue)},handleFocus:function(e){this.focused=!0,this.$emit("focus",e)},handleCompositionStart:function(){this.isComposing=!0},handleCompositionUpdate:function(e){var t=e.target.value,n=t[t.length-1]||"";this.isComposing=!Object(m["isKorean"])(n)},handleCompositionEnd:function(e){this.isComposing&&(this.isComposing=!1,this.handleInput(e))},handleInput:function(e){this.isComposing||e.target.value!==this.nativeInputValue&&(this.$emit("input",e.target.value),this.$nextTick(this.setNativeInputValue))},handleChange:function(e){this.$emit("change",e.target.value)},calcIconOffset:function(e){var t=[].slice.call(this.$el.querySelectorAll(".el-input__"+e)||[]);if(t.length){for(var n=null,r=0;r0&&(this.timer=setTimeout((function(){e.closed||e.close()}),this.duration))},keydown:function(e){27===e.keyCode&&(this.closed||this.close())}},mounted:function(){this.startTimer(),document.addEventListener("keydown",this.keydown)},beforeDestroy:function(){document.removeEventListener("keydown",this.keydown)}},u=l,c=n(0),f=Object(c["a"])(u,i,a,!1,null,null,null);f.options.__file="packages/message/src/main.vue";var d=f.exports,p=n(15),h=n(23),v=o.a.extend(d),m=void 0,y=[],g=1,b=function e(t){if(!o.a.prototype.$isServer){t=t||{},"string"===typeof t&&(t={message:t});var n=t.onClose,r="message_"+g++;t.onClose=function(){e.close(r,n)},m=new v({data:t}),m.id=r,Object(h["isVNode"])(m.message)&&(m.$slots.default=[m.message],m.message=null),m.$mount(),document.body.appendChild(m.$el);var i=t.offset||20;return y.forEach((function(e){i+=e.$el.offsetHeight+16})),m.verticalOffset=i,m.visible=!0,m.$el.style.zIndex=p["PopupManager"].nextZIndex(),y.push(m),m}};["success","warning","info","error"].forEach((function(e){b[e]=function(t){return"string"===typeof t&&(t={message:t}),t.type=e,b(t)}})),b.close=function(e,t){for(var n=y.length,r=-1,o=void 0,i=0;iy.length-1))for(var a=r;a=0;e--)y[e].close()};var _=b;t["default"]=_}})},f5df:function(e,t,n){var r=n("00ee"),o=n("c6b6"),i=n("b622"),a=i("toStringTag"),s="Arguments"==o(function(){return arguments}()),l=function(e,t){try{return e[t]}catch(n){}};e.exports=r?o:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=l(t=Object(e),a))?n:s?o(t):"Object"==(r=o(t))&&"function"==typeof t.callee?"Arguments":r}},f772:function(e,t,n){var r=n("5692"),o=n("90e3"),i=r("keys");e.exports=function(e){return i[e]||(i[e]=o(e))}},fc6a:function(e,t,n){var r=n("44ad"),o=n("1d80");e.exports=function(e){return r(o(e))}},fdbc:function(e,t){e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},fdbf:function(e,t,n){var r=n("4930");e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},fea9:function(e,t,n){var r=n("da84");e.exports=r.Promise}}]); \ No newline at end of file diff --git a/app/src/main/assets/web/new/js/detail.4d0609e7.js b/app/src/main/assets/web/new/js/detail.4d0609e7.js new file mode 100644 index 000000000..6f017a50f --- /dev/null +++ b/app/src/main/assets/web/new/js/detail.4d0609e7.js @@ -0,0 +1 @@ +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["detail"],{"040c":function(t,e,n){},"057f":function(t,e,n){var o=n("fc6a"),i=n("241c").f,a={}.toString,s="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],r=function(t){try{return i(t)}catch(e){return s.slice()}};t.exports.f=function(t){return s&&"[object Window]"==a.call(t)?r(t):i(o(t))}},"05b3":function(t,e,n){},"0827":function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEUWGBkYGhsdHyAfISI1t/v6AAAB5ElEQVQozxXQsYoTURSA4f/EeycZsDgDdySDjihk38Hy3GWi2J2BCaziQhaiaB+tt9AFu1kwvYUPsIXNPoB9BAUfwAfwEUzKv/v4odGrroyp9/rUaC6rZ5skv5F8qPsfYYP+yKUMymmAEEeW55oUR4o8jr05KNzJ07yvB7w0KKfLwcQUSjfmMU0PJfPHFoEVU+ohNrcKMEzMQ23FDnVSI2dqtYWI7KlLu6vE4UnyvKc3SJuL7lBbeEEl42ItpGLjzIT8PRJCmkRjVpVpsbJFVN0687okJNZiHAr5Z7MV0BnGIDc+THM1zlbieBc1Fq+tH5BH+OpnbWkj40hSqC8Lw2TvFuF0SUFJCk2IytXbjeqcRAt6NHpnrUkUU4KRzZs8RCK8N/Akn2W04LwxMU/V7XK0bDyN2RxfDyx7I4h5vjZby72V8UnOWumZL3qtYc+8DTE0siSBMXGhywx2dMYPnQHbxdFZ7deiNGxCCtD/QWnbwDoGhRYPDzUdUA3krjpnkvdAgDN4ddLkEQSov9qjd42HaDjI34gEqS9TUueAk+sc4qg5ws407KQYKs8G1jv4xBlqBVk6cb4dISZIwVi1Jzu4+HLk6lyfUxkXvwy+1Q+4WVdHIhwfybZ6CWVhxMEhShOgsP/HOW0MvZJeFwAAAABJRU5ErkJggg=="},1276:function(t,e,n){"use strict";var o=n("d784"),i=n("44e7"),a=n("825a"),s=n("1d80"),r=n("4840"),c=n("8aa5"),l=n("50c4"),u=n("14c3"),A=n("9263"),f=n("d039"),g=[].push,d=Math.min,h=4294967295,p=!f((function(){return!RegExp(h,"y")}));o("split",2,(function(t,e,n){var o;return o="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var o=String(s(this)),a=void 0===n?h:n>>>0;if(0===a)return[];if(void 0===t)return[o];if(!i(t))return e.call(o,t,a);var r,c,l,u=[],f=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),d=0,p=new RegExp(t.source,f+"g");while(r=A.call(p,o)){if(c=p.lastIndex,c>d&&(u.push(o.slice(d,r.index)),r.length>1&&r.index=a))break;p.lastIndex===r.index&&p.lastIndex++}return d===o.length?!l&&p.test("")||u.push(""):u.push(o.slice(d)),u.length>a?u.slice(0,a):u}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var i=s(this),a=void 0==e?void 0:e[t];return void 0!==a?a.call(e,i,n):o.call(String(i),e,n)},function(t,i){var s=n(o,t,this,i,o!==e);if(s.done)return s.value;var A=a(t),f=String(this),g=r(A,RegExp),m=A.unicode,v=(A.ignoreCase?"i":"")+(A.multiline?"m":"")+(A.unicode?"u":"")+(p?"y":"g"),b=new g(p?A:"^(?:"+A.source+")",v),C=void 0===i?h:i>>>0;if(0===C)return[];if(0===f.length)return null===u(b,f)?[f]:[];var y=0,B=0,S=[];while(B=51||!o((function(){var e=[],n=e.constructor={};return n[s]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},"1e75":function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXM2t7O3ODQ3uLR4OTDp25yAAACdUlEQVQozw3P70sTcQDH8c/3/M7NG+j35mnHwjwh4hRy/QFK3zvPNbeIG1koPZmxfj2IDAwihL53zj0JYisfmEHcZJZOiBUG60lZiI8T/ANusuftgQ+kCPIPeMP7hS5mUrV9c1g6MQCAEZ8tDLHwofImAGRlX+SZK3Vu9rRRPuO4PK6/9nA4GIATsxlODS+rdCMhkAZivpYV0LWoQHSLSA4NfUg+6mY+7BKL2++F9LvnrBDYm6JO9i/YO3i/HJTGQ4pdIV82TbEDFG6vGYCd4wZchgK5J2CrKTLE+Tx0v+YGlIbdWJFcQl4ptBN8fUJQN1MCJLcZLYwUVVo+famGGty8EXJF5ofOEDzcodT3/Fb0I5sHmc1ZG7CcSl8COgxlXx09jT05OafjCZLIHJhGIaU6wDZHsuMQ41wbdjmQXbhKnMq1zlXSYrjCnyZblqexA7fC8RxS74tq2P3OxSQwTuJSApH8OZLzBBp1pOe0i3rdyDUA47GySZ31YmC4EQYSXvFSvieORGBxXF9aeVtUWKGS9WMC4Z9Y2uXnJ2nCUXVMbPOYqNYNmGWWQ7Evr+BWC+a0JAMTImcq/S4Z5INdQMeuOqDIMa9beilxfA60iC6sP1INcPDpmHBW8drZHNmqwyddJtVje9q8WGUgWAOzmbU4FCQBFi8B2Wk6pickBnYhJMenmJGuRmtt2IoKq9NuFGbNFR99sHnvrnLsLysKANDIsxbp6RNMAsoDSKuRpMwZbAAzI68QatIjmZ0aImyM3O8/4e2MNlOHZomFsa/fLDsysliHS+nlYLQJMnynxrH8QO4PaAV2Li8B/+52UgeGIVNFYf8B1XG/kFSmLcUAAAAASUVORK5CYII="},"356c":function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXPz8/R0dHT09PU1NToNyAhAAACdElEQVQozw3NP0xTQQDH8d9d7sFrG+QeKVgQ4aoFCwFkYERyLY//0UB8GNGg1WAC0RBGJrzW4mCXQmpgvCYOwEAYiulSpYtza2KiW7s5FgNJFSV2/CzfL7RwpoJ20iadmgA8owOyaxmusKE44scBeb4vIv00dqYgmf6jzWcr7W6INbDQeZbQL9ytXeYgtFfzmW1Fek5msxJlwhyt6qDDxOLQzpVPompYrMPnEnhvLm7M5BxY5nowAj3zkydAkpC0FIG6g7AK+Ub25ybyNWVYwtpseP2rfrQwiGRpfqrnMuPeuvr2dA0p2YsHF2XghkrXKtZ8tLBjR7S2qIaYbKmyLd/QP+EogLjqqwNw5Lq1pDlMLkM5+gNoSvdq+Pxmz9/61EFq6GYM6GqaGvlN95zy3gsmEWI8K3k8OP9OmRLEPO6DP3Wv3g42COinJTZ33dcIvs4ESp6opMTjDs6mcYTEbFeUifuxh989yZrIx4lkpuixxz0nHLCekKbE17suKhYkMGhoYhTZtVBvg4bfq/1L1Im0AGMVpBFwumM0zwyuKiCMi5dqR4Flx47AGyF2xTbxqUdTwCH94BT3DozpLV5WuAL/N8rGtHKjotBOOuOtCJ9E21uqsyBoLOzaXbHPrK5PQBP+fBfeidvJAeMIAmzVt5IkJJ9DBWaZDAepYUhlQqHt0h72SJ3j8TZHom64f516xx9T5evgMPgwG82jZdJaJIDyWp6LAjOCclVyzNA3iTKzIULlBQEPaTXlPHok5gISclmyaWZlqY2aTHdRHpJOwTdDEQ3ZfKtbpclcNhyVClagmY+fIfyKukntPqBgnx5QvZHk/D/MK8JMClrSigAAAABJRU5ErkJggg=="},4039:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAD1BMVEX0/PTx+fH2/vbz+/P4//htSO9OAAAC5UlEQVQ4yyWT0QGjMAxDZTsDWKQDmJQBYrgBUsr+M517x0+LRWw9CyA+pC1YzndrMgHaNXVKQ+di13Of1qbur48nWhuRjj8i6ON8e7pNm7zyag/DBTfS9Z4Hup1fUuXMKY4HEE8QOHCByXkIkl7lDT239RtL9quO4JItmmhOAHXg45QuYKrQFLyGJcRvaTw6kQqZy6mkR6JAPFH/XqsQjEDRmUOA+MNLHGyMUT7AHApoAhjgjIJmCxy6XHdf648AWCdGe57IUDazCeTImQOY4/z+eVYVX2IjOw9RydeAeJwl79iGi4HpgQgHEchWraUZLtayu8scq0lHHHUKMY3Ml8hB7CS1jOckDLG9ccgNeX3124phOcjL9fPnWJhTXpLHeG9DRmHnTxHEaHakS2J51lwAJcUraNbuU7q4gMTDQj3Eripc/x+qFM5VEKAB1roQfAkX5/PxqnS2QpOrxfK1Zft0/omV5T+xCSBUAIbEIwUQgvAfxFE1O8dnk233+1UZiqJ1mAbsue6Yt8tF+yOrxC/YrUhzC4qPlE3EbR5hGKhhHdlrg7J9WunV7L7BcYQwAeE59u2tnN1c6gfVYrQiLSZ9OxZdWDXQq0+r0Pbarh3UqGCwauVvbiXuDsNxCtLDdW9rTF8oQYN4EoXXdfmwNguQP26n/tRjDeo+F2W7PjWtfSr6Bn/z+cXOLp4NnMV4RytvSW4B68m+XN9XfZTFGhO/S+cHTuTqZDC21ccA0N7QsePALaDQC3D1f94U9CWo+aq6BjB3v0rxIimBM12296M3aKPHjXLQE9KQKH4By8RHraJ3AgVto2r4xdFqlaPaiAHLl1ZF4P2pI6cYc+K8UZdcmxy7lqGc1IoPxLmIFuIeEZ6j2sQT88muEg1zwrEDTIX5U/ZmcsqfgVlBumiBLF4sAyhf9BFlXOPKLZ4H0iFb3VoHrGhtHTldKrOvP2/reu2zfV8CXMPqzRdlgd0a5eI7WwB/AYcgavcqxXWEAAAAAElFTkSuQmCC"},4400:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAElBMVEUQERMODxESFBYWGBkaHB0eICLm6ozJAAACkUlEQVQ4yyWTUdLbMAiEASfvoOkBkBy/O5keIE0v8E/uf5h+68qZWALELgu2MG9PP9qyvCzTVhrrsPGOCjvTfXQZvtp/W3Gy6LCITqs4q/DZ+KYl76zKzHVYpY2wNY27nqN1sbLGcrLH3/ENH4oWlGctsDu8AO+HzTLlsYdh8MzP1m6YDMz0ACfcimvakBj+mwO/+5Uta5teOD379sxK1fUxmUhv8MU3jUT5gs26PMephFznkLcpQZ6/dPL9C/GWHcCxDN6oZhD5xBm5qoYBPA+PFE/H1tXDWcWl8TW7rS+4dUzAVy0BIrvC4/HcqW2TkG1HO8q9dC23INAg7NA4AFRFkDTM2lfELPyFzi1VddcpX2z0KjHBUDmdLNJ6dDps4ytrX+FPsZwE31wSL+6OWfHOAJ3+Y0Rk/MiKfmWNPg7oVP/U3Ck9FoCkC2gBpALOiqbMNTkOe8P4FWkTD2Y9Q3+5VmV0uLUJBl68U5uAK2Kl6QDXvLxbwweOL2sixW78uU8p0ysfc7cWrF1j6B1sPJ4WgclYSnJN1bzozrhEcFHmRzBkbJWqqdG+EYJXRFmT5jnLXPUNF6WBdoFbTxYsmDXVLU/WA7MExNc93sJS5hIXDeLxzMScHzdhKvEkibr6cQXYPrmtmTA7JcInISrTzRDvShTdka0uVGrsJAAR6tSn1sKziZtfKVjAxPrJsYgZO0bye+vKTZ/DgoAoLGNO6jYHimZYTL/3pLJHawquJukjBpfz8WOGVSVIWx9ywUfS5iENutidRM4NzkAmxgUSQ68xgNOU+ZLalr4TS2V+D2xqukZig+Z9DilR7Nouzwp1cp/3E5q6Rdlf08obKvAM4qZ6pMr+w3PmQALSSBfjyZn5DwrNRVbywBQiAAAAAElFTkSuQmCC"},"44e7":function(t,e,n){var o=n("861d"),i=n("c6b6"),a=n("b622"),s=a("match");t.exports=function(t){var e;return o(t)&&(void 0!==(e=t[s])?!!e:"RegExp"==i(t))}},"477e":function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAACVBMVEX28ef48+n69esoK7jYAAAB4UlEQVQozw2OsW4bQQxEhwLXkDrysGdEqRRgVShfQQq8wOr2jD0jSpXCLvwXbtKfADlFqgSwC/9ljqweZgYzQFnb/QGepYhA9jzmTc1WaSEtQpbFgjWATI00ZZtIckXx8q2Oe5yEByBy+RHOTcM+VVTadULsvxvRC/q8WTwgcWGD+Mnaqa0oy2gw2pKFzK+PzEsus5hP9AHojKslVynLlioVTBEN8cjDNnZoR1uMGTiZAAN47HxMtEkGUE9b8HWzkqNX5Lpk0yVziAJOs46rK1pG/xNuXLjz95fSDoJE5IqG23MAYPtWoeWPvfVtIV/Ng9oH3W0gGMPIOqd4MK4QZ55dV61gOb8Zxp7I9qayaGxp6Q91cmC0ZRdBwEQVHWzSAanlZwVWc9yljeTCeaHjBVvlPSLeyeBUT2rPdJegQI103jVS3uYkyIx1il6mslMDedZuOkwzolsagvPuQAfp7cYg7k9V1NOxfq64PNSvMdwONV4VYEmqlbpZy5OAakRKkjPnL4CBv5/OZRgoWHBmNbxB0LgB1I4vXFj93UoF2/0TPEsWwV9EhbIiTPqYoTHYoMn3enTDjmrFeDTIzaL1bUC/PBIMuF+vSSYSaxoVt90EO3Gu1zrMuMRGUk7Ffv3L+A931Gsb/yBoIgAAAABJRU5ErkJggg=="},"537b":function(t,e,n){"use strict";n.r(e);var o=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"chapter-wrapper",class:{night:t.isNight,day:!t.isNight},style:t.bodyTheme},[n("div",{staticClass:"tool-bar",style:t.leftBarTheme},[n("div",{staticClass:"tools"},[n("el-popover",{attrs:{placement:"right",width:t.cataWidth,trigger:"click","visible-arrow":!1,"popper-class":"pop-cata"},model:{value:t.popCataVisible,callback:function(e){t.popCataVisible=e},expression:"popCataVisible"}},[n("PopCata",{ref:"popCata",staticClass:"popup",on:{getContent:t.getContent}}),n("div",{staticClass:"tool-icon",class:{"no-point":t.noPoint},attrs:{slot:"reference"},slot:"reference"},[n("div",{staticClass:"iconfont"},[t._v("  ")]),n("div",{staticClass:"icon-text"},[t._v("目录")])])],1),n("el-popover",{attrs:{placement:"bottom-right",width:"470",trigger:"click","visible-arrow":!1,"popper-class":"pop-setting"},model:{value:t.readSettingsVisible,callback:function(e){t.readSettingsVisible=e},expression:"readSettingsVisible"}},[n("ReadSettings",{staticClass:"popup"}),n("div",{staticClass:"tool-icon",class:{"no-point":t.noPoint},attrs:{slot:"reference"},slot:"reference"},[n("div",{staticClass:"iconfont"},[t._v("  ")]),n("div",{staticClass:"icon-text"},[t._v("设置")])])],1),n("div",{staticClass:"tool-icon",on:{click:t.toShelf}},[n("div",{staticClass:"iconfont"},[t._v("  ")]),n("div",{staticClass:"icon-text"},[t._v("书架")])]),n("div",{staticClass:"tool-icon",class:{"no-point":t.noPoint},on:{click:t.toTop}},[n("div",{staticClass:"iconfont"},[t._v("  ")]),n("div",{staticClass:"icon-text"},[t._v("顶部")])]),n("div",{staticClass:"tool-icon",class:{"no-point":t.noPoint},on:{click:t.toBottom}},[n("div",{staticClass:"iconfont"},[t._v("  ")]),n("div",{staticClass:"icon-text"},[t._v("底部")])])],1)]),n("div",{staticClass:"read-bar",style:t.rightBarTheme},[n("div",{staticClass:"tools"},[n("div",{staticClass:"tool-icon",class:{"no-point":t.noPoint},on:{click:t.toLastChapter}},[n("div",{staticClass:"iconfont"},[t._v("  ")])]),n("div",{staticClass:"tool-icon",class:{"no-point":t.noPoint},on:{click:t.toNextChapter}},[n("div",{staticClass:"iconfont"},[t._v("  ")])])])]),n("div",{staticClass:"chapter-bar"}),n("div",{ref:"content",staticClass:"chapter",style:t.chapterTheme},[n("div",{staticClass:"content"},[n("div",{ref:"top",staticClass:"top-bar"}),t.show?n("div",{ref:"title",staticClass:"title"},[t._v(t._s(t.title))]):t._e(),n("Pcontent",{attrs:{carray:t.content}}),n("div",{ref:"bottom",staticClass:"bottom-bar"})],1)])])},i=[],a=(n("1276"),n("ac1f"),function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"cata-wrapper",style:t.popupTheme},[n("div",{staticClass:"title"},[t._v(" 目录 ")]),n("div",{ref:"cataData",staticClass:"data-wrapper",class:{night:t.isNight,day:!t.isNight}},[n("div",{staticClass:"cata"},t._l(t.catalog,(function(e,o){return n("div",{key:e.durChapterIndex,ref:"cata",refInFor:!0,staticClass:"log",class:{selected:t.isSelected(o)},on:{click:function(n){return t.gotoChapter(e)}}},[n("div",{staticClass:"log-text"},[t._v(" "+t._s(e.title)+" ")])])})),0)])])}),s=[];n("a4d3"),n("e01a"),n("d3b7"),n("d28b"),n("3ca3"),n("ddb0");function r(t){return r="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}var c,l,u=function(t,e,n,o){return t/=o/2,t<1?n/2*t*t+e:(t--,-n/2*(t*(t-2)-1)+e)},A=function(){var t,e,n,o,i,a,s,c,l,A,f,g,d;function h(){var e=t.scrollTop||t.scrollY||t.pageYOffset;return e="undefined"===typeof e?0:e,e}function p(e){var o=e.getBoundingClientRect().top,i=t.getBoundingClientRect?t.getBoundingClientRect().top:0;return o-i+n}function m(e){t.scrollTo?t.scrollTo(0,e):t.scrollTop=e}function v(t){A||(A=t),f=t-A,g=a(f,n,c,l),m(g),f1&&void 0!==arguments[1]?arguments[1]:{};switch(l=f.duration||1e3,i=f.offset||0,d=f.callback,a=f.easing||u,s=f.a11y||!1,r(f.container)){case"object":t=f.container;break;case"string":t=document.querySelector(f.container);break;default:t=window}switch(n=h(),r(A)){case"number":e=void 0,s=!1,o=n+A;break;case"object":e=A,o=p(e);break;case"string":e=document.querySelector(A),o=p(e);break}switch(c=o-n+i,r(f.duration)){case"number":l=f.duration;break;case"function":l=f.duration(c);break}requestAnimationFrame(v)}return C},f=A(),g=f,d=n("7286"),h=n.n(d),p=n("477e"),m=n.n(p),v=n("e160"),b=n.n(v),C=n("df5e"),y=n.n(C),B=n("ec0f"),S=n.n(B),I=n("b671"),x=n.n(I),E=n("5629"),w=n.n(E),k=n("d0e3"),U=n.n(k),D=n("4039"),Q=n.n(D),O=n("1e75"),V=n.n(O),R=n("1632"),P=n.n(R),F=n("7abd"),N=n.n(F),K=n("356c"),M=n.n(K),H=n("b165"),T=n.n(H),J=n("cf68"),L=n.n(J),z=n("4400"),W=n.n(z),G=n("802e"),q=n.n(G),Y=n("0827"),Z=n.n(Y),j={themes:[{body:"#ede7da url("+h.a+") repeat",content:"#ede7da url("+m.a+") repeat",popup:"#ede7da url("+b.a+") repeat"},{body:"#ede7da url("+y.a+") repeat",content:"#ede7da url("+S.a+") repeat",popup:"#ede7da url("+x.a+") repeat"},{body:"#ede7da url("+w.a+") repeat",content:"#ede7da url("+U.a+") repeat",popup:"#ede7da url("+Q.a+") repeat"},{body:"#ede7da url("+V.a+") repeat",content:"#ede7da url("+P.a+") repeat",popup:"#ede7da url("+N.a+") repeat"},{body:"#ebcece repeat",content:"#f5e4e4 repeat",popup:"#faeceb repeat"},{body:"#ede7da url("+M.a+") repeat",content:"#ede7da url("+T.a+") repeat",popup:"#ede7da url("+L.a+") repeat"},{body:"#ede7da url("+W.a+") repeat",content:"#ede7da url("+q.a+") repeat",popup:"#ede7da url("+Z.a+") repeat"}],fonts:[{fontFamily:"Microsoft YaHei, PingFangSC-Regular, HelveticaNeue-Light, Helvetica Neue Light, sans-serif"},{fontFamily:"PingFangSC-Regular, -apple-system, Simsun"},{fontFamily:"Kaiti"}]},X=j,$=(n("05b3"),{name:"PopCata",data:function(){return{isNight:6==this.$store.state.config.theme,index:this.$store.state.readingBook.index}},computed:{catalog:function(){return this.$store.state.readingBook.catalog},popCataVisible:function(){return this.$store.state.popCataVisible},theme:function(){return this.$store.state.config.theme},popupTheme:function(){return{background:X.themes[this.theme].popup}}},mounted:function(){},watch:{theme:function(t){this.isNight=6==t},popCataVisible:function(){this.$nextTick((function(){var t=this.$store.state.readingBook.index,e=this.$refs.cataData;g(this.$refs.cata[t],{container:e,duration:0})}))}},methods:{isSelected:function(t){return t==this.$store.state.readingBook.index},gotoChapter:function(t){this.index=this.catalog.indexOf(t),this.$store.commit("setPopCataVisible",!1),this.$store.commit("setContentLoading",!0),this.$emit("getContent",this.index)}}}),_=$,tt=(n("9078"),n("2877")),et=Object(tt["a"])(_,a,s,!1,null,"22f8c37b",null),nt=et.exports,ot=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"settings-wrapper",class:{night:t.isNight,day:!t.isNight},style:t.popupTheme},[n("div",{staticClass:"settings-title"},[t._v("设置")]),n("div",{staticClass:"setting-list"},[n("ul",[n("li",{staticClass:"theme-list"},[n("i",[t._v("阅读主题")]),t._l(t.themeColors,(function(e,o){return n("span",{key:o,ref:"themes",refInFor:!0,staticClass:"theme-item",class:{selected:t.selectedTheme==o},style:e,on:{click:function(e){return t.setTheme(o)}}},[o<6?n("em",{staticClass:"iconfont"},[t._v("")]):n("em",{staticClass:"moon-icon"},[t._v(t._s(t.moonIcon))])])}))],2),n("li",{staticClass:"font-list"},[n("i",[t._v("正文字体")]),t._l(t.fonts,(function(e,o){return n("span",{key:o,staticClass:"font-item",class:{selected:t.selectedFont==o},on:{click:function(e){return t.setFont(o)}}},[t._v(t._s(e))])}))],2),n("li",{staticClass:"font-size"},[n("i",[t._v("字体大小")]),n("div",{staticClass:"resize"},[n("span",{staticClass:"less",on:{click:t.lessFontSize}},[n("em",{staticClass:"iconfont"},[t._v("")])]),n("b"),t._v(" "),n("span",{staticClass:"lang"},[t._v(t._s(t.fontSize))]),n("b"),n("span",{staticClass:"more",on:{click:t.moreFontSize}},[n("em",{staticClass:"iconfont"},[t._v("")])])])]),n("li",{staticClass:"read-width"},[n("i",[t._v("页面宽度")]),n("div",{staticClass:"resize"},[n("span",{staticClass:"less",on:{click:t.lessReadWidth}},[n("em",{staticClass:"iconfont"},[t._v("")])]),n("b"),t._v(" "),n("span",{staticClass:"lang"},[t._v(t._s(t.readWidth))]),n("b"),n("span",{staticClass:"more",on:{click:t.moreReadWidth}},[n("em",{staticClass:"iconfont"},[t._v("")])])])])])])])},it=[],at=(n("82da"),{name:"ReadSettings",data:function(){return{theme:0,isNight:6==this.$store.state.config.theme,moonIcon:"",themeColors:[{background:"rgba(250, 245, 235, 0.8)"},{background:"rgba(245, 234, 204, 0.8)"},{background:"rgba(230, 242, 230, 0.8)"},{background:"rgba(228, 241, 245, 0.8)"},{background:"rgba(245, 228, 228, 0.8)"},{background:"rgba(224, 224, 224, 0.8)"},{background:"rgba(0, 0, 0, 0.5)"}],moonIconStyle:{display:"inline",color:"rgba(255,255,255,0.2)"},fonts:["雅黑","宋体","楷书"]}},mounted:function(){var t=this.$store.state.config;this.theme=t.theme,6==this.theme?this.moonIcon="":this.moonIcon=""},computed:{config:function(){return this.$store.state.config},popupTheme:function(){return{background:X.themes[this.config.theme].popup}},selectedTheme:function(){return this.$store.state.config.theme},selectedFont:function(){return this.$store.state.config.font},fontSize:function(){return this.$store.state.config.fontSize},readWidth:function(){return this.$store.state.config.readWidth}},methods:{setTheme:function(t){6==t?(this.isNight=!0,this.moonIcon="",this.moonIconStyle.color="#ed4259"):(this.isNight=!1,this.moonIcon="",this.moonIconStyle.color="rgba(255,255,255,0.2)");var e=this.config;e.theme=t,this.$store.commit("setConfig",e)},setFont:function(t){var e=this.config;e.font=t,this.$store.commit("setConfig",e)},moreFontSize:function(){var t=this.config;t.fontSize<48&&(t.fontSize+=2),this.$store.commit("setConfig",t)},lessFontSize:function(){var t=this.config;t.fontSize>12&&(t.fontSize-=2),this.$store.commit("setConfig",t)},moreReadWidth:function(){var t=this.config;t.readWidth<960&&(t.readWidth+=160),this.$store.commit("setConfig",t)},lessReadWidth:function(){var t=this.config;t.readWidth>640&&(t.readWidth-=160),this.$store.commit("setConfig",t)}}}),st=at,rt=(n("75ab"),Object(tt["a"])(st,ot,it,!1,null,"36dafd56",null)),ct=rt.exports,lt=(n("d81d"),{name:"pcontent",data:function(){return{}},props:["carray"],render:function(){var t=arguments[0],e=this.fontFamily,n=this.fontSize,o=e;return o.fontSize=n,this.show?t("div",[this.carray.map((function(e){return t("p",{style:o,domProps:{innerHTML:e}})}))]):t("div")},computed:{show:function(){return this.$store.state.showContent},fontFamily:function(){return X.fonts[this.$store.state.config.font]},fontSize:function(){return this.$store.state.config.fontSize+"px"}},watch:{fontSize:function(){var t=this;t.$store.commit("setShowContent",!1),this.$nextTick((function(){t.$store.commit("setShowContent",!0)}))}}}),ut=lt,At=(n("ca36"),Object(tt["a"])(ut,c,l,!1,null,"7b03cca0",null)),ft=At.exports,gt=n("bc3a"),dt=n.n(gt),ht={components:{PopCata:nt,Pcontent:ft,ReadSettings:ct},created:function(){var t=JSON.parse(localStorage.getItem("config"));null!=t&&this.$store.commit("setConfig",t)},beforeCreate:function(){var t=JSON.parse(localStorage.getItem("config"));null!=t&&this.$store.commit("setConfig",t)},mounted:function(){var t=this;this.loading=this.$loading({target:this.$refs.content,lock:!0,text:"正在获取内容",spinner:"el-icon-loading",background:"rgba(0,0,0,0)"});var e=this,n=sessionStorage.getItem("bookUrl"),o=sessionStorage.getItem("bookName"),i=sessionStorage.getItem("chapterIndex")||0,a=JSON.parse(localStorage.getItem(n));(null==a||i>0)&&(a={bookName:o,bookUrl:n,index:i},localStorage.setItem(n,JSON.stringify(a))),this.getCatalog(n).then((function(n){var o=n.data.data;a.catalog=o,e.$store.commit("setReadingBook",a);var i=e.$store.state.readingBook.index||0;t.getContent(i),window.addEventListener("keyup",(function(t){switch(t.key){case"ArrowLeft":t.stopPropagation(),t.preventDefault(),e.toLastChapter();break;case"ArrowRight":t.stopPropagation(),t.preventDefault(),e.toNextChapter();break;case"ArrowUp":t.stopPropagation(),t.preventDefault(),0===document.documentElement.scrollTop?e.$message.warning("已到达页面顶部"):g(0-document.documentElement.clientHeight+100);break;case"ArrowDown":t.stopPropagation(),t.preventDefault(),document.documentElement.clientHeight+document.documentElement.scrollTop===document.documentElement.scrollHeight?e.$message.warning("已到达页面底部"):g(document.documentElement.clientHeight-100);break}}))}),(function(t){throw e.loading.close(),e.$message.error("获取书籍目录失败"),t}))},watch:{chapterName:function(t){this.title=t},content:function(){this.$store.commit("setContentLoading",!1)},theme:function(t){this.isNight=6==t},bodyColor:function(t){this.bodyTheme.background=t},chapterColor:function(t){this.chapterTheme.background=t},readWidth:function(t){this.chapterTheme.width=t;var e=-((parseInt(t)+130)/2+68)+"px",n=-((parseInt(t)+130)/2+52)+"px";this.leftBarTheme.marginLeft=e,this.rightBarTheme.marginRight=n},popupColor:function(t){this.leftBarTheme.background=t,this.rightBarTheme.background=t},readSettingsVisible:function(t){if(!t){var e=JSON.stringify(this.$store.state.config);localStorage.setItem("config",e)}}},data:function(){return{title:"",content:[],noPoint:!0,isNight:6==this.$store.state.config.theme,bodyTheme:{background:X.themes[this.$store.state.config.theme].body},chapterTheme:{background:X.themes[this.$store.state.config.theme].content,width:this.$store.state.config.readWidth-130+"px"},leftBarTheme:{background:X.themes[this.$store.state.config.theme].popup,marginLeft:-(this.$store.state.config.readWidth/2+68)+"px"},rightBarTheme:{background:X.themes[this.$store.state.config.theme].popup,marginRight:-(this.$store.state.config.readWidth/2+52)+"px"}}},computed:{catalog:function(){return this.$store.state.catalog},windowHeight:function(){return window.innerHeight},contentHeight:function(){return this.$refs.content.offsetHeight},popCataVisible:{get:function(){return this.$store.state.popCataVisible},set:function(t){this.$store.commit("setPopCataVisible",t)}},readSettingsVisible:{get:function(){return this.$store.state.readSettingsVisible},set:function(t){this.$store.commit("setReadSettingsVisible",t)}},config:function(){return this.$store.state.config},theme:function(){return this.config.theme},bodyColor:function(){return X.themes[this.config.theme].body},chapterColor:function(){return X.themes[this.config.theme].content},popupColor:function(){return X.themes[this.config.theme].popup},readWidth:function(){return this.$store.state.config.readWidth-130+"px"},cataWidth:function(){return this.$store.state.config.readWidth-33},show:function(){return this.$store.state.showContent}},methods:{getCatalog:function(t){return dt.a.get("/getChapterList?url="+encodeURIComponent(t))},getContent:function(t){var e=this;this.$store.commit("setShowContent",!1),this.loading.visible||(this.loading=this.$loading({target:this.$refs.content,lock:!0,text:"正在获取内容",spinner:"el-icon-loading",background:"rgba(0,0,0,0)"}));var n=sessionStorage.getItem("bookUrl"),o=JSON.parse(localStorage.getItem(n));o.index=t,localStorage.setItem(n,JSON.stringify(o)),this.$store.state.readingBook.index=t;var i=this.$store.state.readingBook.catalog[t].title,a=this.$store.state.readingBook.catalog[t].index;this.title=i,g(this.$refs.top,{duration:0});var s=this;dt.a.get("/getBookContent?url="+encodeURIComponent(n)+"&index="+a).then((function(t){var n=t.data.data,o=n.split("\n\n"),i="";i=o.length>1?o[1].split("\n"):o[0].split("\n"),s.content=i,e.$store.commit("setContentLoading",!0),s.loading.close(),s.noPoint=!1,s.$store.commit("setShowContent",!0)}),(function(t){throw s.$message.error("获取章节内容失败"),s.content="  获取章节内容失败!",t}))},toTop:function(){g(this.$refs.top)},toBottom:function(){g(this.$refs.bottom)},toNextChapter:function(){this.$store.commit("setContentLoading",!0);var t=this.$store.state.readingBook.index;t++,"undefined"!==typeof this.$store.state.readingBook.catalog[t]?(this.$message.info("下一章"),this.getContent(t)):this.$message.error("本章是最后一章")},toLastChapter:function(){this.$store.commit("setContentLoading",!0);var t=this.$store.state.readingBook.index;t--,"undefined"!==typeof this.$store.state.readingBook.catalog[t]?(this.$message.info("上一章"),this.getContent(t)):this.$message.error("本章是第一章")},toShelf:function(){this.$router.push("/")}}},pt=ht,mt=(n("ae55"),Object(tt["a"])(pt,o,i,!1,null,"51d89d6a",null));e["default"]=mt.exports},5629:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXN383Q4tDP4c/R5NEInCCXAAACVElEQVQozw3Hv2sTYRwH4M/79pJ7bZL2bXqtERJ97zjUpbZDhg6pfC8qibi8hLR0EaJ0EFxaCSWDxjfpj1zrYBcRBKE6SAfBJWsx9i8IQfdQxDlKtA6t2OnhQfN3lbG7ytYRywF8rVoPCNO0X2sQOKDpAnSDK2VwkHgmh5yLGT8qASt+2KofnNt2Xg1gf1UF8AoM6052cRMNaloLZb7RKQGrKKji2OefsZF+VqIvos5ZLVIZCX61JcwUdk56wASVkgQvzPfvmT2twTSwyYaC/Pl/UhAHorFhBgZtL6XdAZRp1tkPwC1NLa9CWs5prLhI85NBQsLdXvjDymG3/EbYfQhVNYqc3TtktQhWLY3ko0QsdMbSEp+64v0NfxyqLbIGdh6M2xHHlLBGqKTyQo4E/nebBgBfe1GpdeywYXc8CT7D3cKXuMXkBy4xN6o5OuKamYp3DVI6uccO9lxgd2CAlJgI2BGgaAgIJV/TYwKqu3WFccjbMuA+bVkWgS2bfnlRbD1Eb1sDyWMmjKYIBgGAWbqKRicfvzBkBIz3V5AKnguWdglQEysQsSuVzOg6ALy1pitA5ykGCsc857BRYcgCSZyFOdvoOigSGoPc5Ta73mgxshIcQE5sHMHd9D7yqITw7JO+GHVMxjhzYLcKPSEgmz3fU+BRy3iYNtiXLaBssCW8KguReqkQOTb3MStV0Ugt4U1eIs1RZWRII6Ww8xeNNItyGGQI4ZMlpg/3lQtkl2JFnBp1imRyFe0kK2Id3PCslMgiQNMS77gvFeDhG3cSkYvheeg/e7ClIh5oh+IAAAAASUVORK5CYII="},"58c8":function(t,e,n){},"5ca7":function(t,e,n){"use strict";n("a7bd")},"63f0":function(t,e,n){},"65f0":function(t,e,n){var o=n("861d"),i=n("e8b5"),a=n("b622"),s=a("species");t.exports=function(t,e){var n;return i(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!i(n.prototype)?o(n)&&(n=n[s],null===n&&(n=void 0)):n=void 0),new(void 0===n?Array:n)(0===e?0:e)}},7286:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXr5djn4dTp49bt59rT6LKxAAACnElEQVQozw3NUUwScRzA8d8R6MF8YMIx8uk47hDSJbj14IPzOGc7jPLvwTGg5uAYDbe2tt56cLtznvEnS6yDqCcEaWi91DvrbLJZz7b1aFtz1aO+2OZWvn+/+4CHeB6BMYaqBLfjPNRY6RFT2JJYby+uAk4WUTrtlmJ4hgPYb2q1XGDQjaK8pgJHvqNaAX+KyuIkDXpgQinb46nOulnn4b5laUHTxLfseeArAoNOeJlOIjdoal0n1FA7tKFv5roK+YaHOqP3P0XyKHPHY+MhTRe5uCZnKhtJKw2eSrSoBDPLtpZuNcFNJcFyiCMxOaaHIfXz1e8HQbWLySrBQ4x0x1qlhnHlnz2HQEC6TNb0gTHXa7IKhcaHqkE015hk9whA0YeWiLIXf7Fa2CZo3DjqjB4tTuF8jIcbfcEx5z/w4sXpQhXW+ju0cqh7icTFmRMaG+v6CIvTjcSpHcH8JEsF3EPh3fRthYdVLLgI2fWXm85/pGFE4l046s70L+yKCcirGFR+jbpy3kMmiCGHrSezVONsn1RBixncyk2PcVWk7DlgxHo8iZwDyq5uAUD854dZhdIFYzKoQig2haUKi1lVufz2RZUZPZ41n/hrOQB6h0Hhg8I367FNoEHgeM/KY7szSeQwD8q2WE3HM35ZLl0K1MJiOtHIkBclRQUwZnyOWcNsRQQgVLj1PSqkjF9DsoOSaSg3iinKzvfmgsNFFfpP/2T3GLGvL4fHEfwIX1sVvXcPqLztehWGcfn9nI2U9nTfCgJPe/jFPLZwgVEzimBgAm0VIyK2tt1cE/AzQdLK+SxLSQ4aDCZnnId94OG2S1XwvnTbNk/ZnhyRCQT+sZM6z9g6LXL1BOBe+zJySiFkHAINCtnQokbCJ/apCv0foqPiZVfhpywAAAAASUVORK5CYII="},"746f":function(t,e,n){var o=n("428f"),i=n("5135"),a=n("e538"),s=n("9bf2").f;t.exports=function(t){var e=o.Symbol||(o.Symbol={});i(e,t)||s(e,t,{value:a.f(t)})}},"75ab":function(t,e,n){"use strict";n("63f0")},"7abd":function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXm9PXq+Pno9vfs+vttWKBGAAACPElEQVQozw3RQWrbQACF4TfCMjPqZgIj4RRaxsZKE0PuMBZ2cLKaCI9RDAXFmJJknUWWI1O1UlamOMHJSjGkuFn3AD2Cr9CepDrAg+/xIxK4QwIqHHQkUhQ/WuphInVIFBojl8QXc012Tgq4RTtVHWVLZVFh1tEoI91uiN4joCqde8Ukn/zGM1B2W4ari2PtTwyw55Ld+Wways54qhGPyS6FzbIT3lIY8WwWdCq56Yolx6KmSKzoqrsCB5heAp4TGNQWJ1Pc6XlE5jQD5OlIX9I47A9uiUQcPQxcury/ToyxWJG/za6ki88crxKPocKS59Sl3EtBG7C89fCGflpfqoSzCeC4crioJA7F0V5+8MaSIk4qSCdwzpogmbqzEirVpGiS2dOVJvUuuqFEmhHao06KEpq+8lvHI14NJk3Qrmi9vBuRLwAz0qZB4hsDXQFXgtnlpDX3C6ug9BquSw/CYtwAzuTz5vuQNdr/YibhR68378ehZH30FSpjh71LpQkrsj+Q062h5WwZ5wlRoD6uQJy1DqvSYuCUapMBqT5YA4ZFw4KlWapxoUGlKWrx0eDQvmigu4WMYt97ruru98fYL8/0lG6CTOFcFWBhFK5gKw19h2JN808nh7xhkU6sWKLXdtkqBL6h+lULK5k19wFB/FldnGYf3LDeuf6IC2/MzJOSOP0qPxLqzaGIqtBcFIItrstkazONOkrc1D1czjuwEGESB4JJnjgSMN7PXAu7fZQpl1C236C+9mM4Af8P98Ch4R2TRl8AAAAASUVORK5CYII="},"802e":function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEUWGBkYGhsdHyAfISI1t/v6AAAB5ElEQVQozxXQsYoTURSA4f/EeycZsDgDdySDjihk38Hy3GWi2J2BCaziQhaiaB+tt9AFu1kwvYUPsIXNPoB9BAUfwAfwEUzKv/v4odGrroyp9/rUaC6rZ5skv5F8qPsfYYP+yKUMymmAEEeW55oUR4o8jr05KNzJ07yvB7w0KKfLwcQUSjfmMU0PJfPHFoEVU+ohNrcKMEzMQ23FDnVSI2dqtYWI7KlLu6vE4UnyvKc3SJuL7lBbeEEl42ItpGLjzIT8PRJCmkRjVpVpsbJFVN0687okJNZiHAr5Z7MV0BnGIDc+THM1zlbieBc1Fq+tH5BH+OpnbWkj40hSqC8Lw2TvFuF0SUFJCk2IytXbjeqcRAt6NHpnrUkUU4KRzZs8RCK8N/Akn2W04LwxMU/V7XK0bDyN2RxfDyx7I4h5vjZby72V8UnOWumZL3qtYc+8DTE0siSBMXGhywx2dMYPnQHbxdFZ7deiNGxCCtD/QWnbwDoGhRYPDzUdUA3krjpnkvdAgDN4ddLkEQSov9qjd42HaDjI34gEqS9TUueAk+sc4qg5ws407KQYKs8G1jv4xBlqBVk6cb4dISZIwVi1Jzu4+HLk6lyfUxkXvwy+1Q+4WVdHIhwfybZ6CWVhxMEhShOgsP/HOW0MvZJeFwAAAABJRU5ErkJggg=="},"82da":function(t,e,n){},"8aa5":function(t,e,n){"use strict";var o=n("6547").charAt;t.exports=function(t,e,n){return e+(n?o(t,e).length:1)}},9078:function(t,e,n){"use strict";n("c0bc")},9263:function(t,e,n){"use strict";var o=n("ad6d"),i=n("9f7f"),a=RegExp.prototype.exec,s=String.prototype.replace,r=a,c=function(){var t=/a/,e=/b*/g;return a.call(t,"a"),a.call(e,"a"),0!==t.lastIndex||0!==e.lastIndex}(),l=i.UNSUPPORTED_Y||i.BROKEN_CARET,u=void 0!==/()??/.exec("")[1],A=c||u||l;A&&(r=function(t){var e,n,i,r,A=this,f=l&&A.sticky,g=o.call(A),d=A.source,h=0,p=t;return f&&(g=g.replace("y",""),-1===g.indexOf("g")&&(g+="g"),p=String(t).slice(A.lastIndex),A.lastIndex>0&&(!A.multiline||A.multiline&&"\n"!==t[A.lastIndex-1])&&(d="(?: "+d+")",p=" "+p,h++),n=new RegExp("^(?:"+d+")",g)),u&&(n=new RegExp("^"+d+"$(?!\\s)",g)),c&&(e=A.lastIndex),i=a.call(f?n:A,p),f?i?(i.input=i.input.slice(h),i[0]=i[0].slice(h),i.index=A.lastIndex,A.lastIndex+=i[0].length):A.lastIndex=0:c&&i&&(A.lastIndex=A.global?i.index+i[0].length:e),u&&i&&i.length>1&&s.call(i[0],n,(function(){for(r=1;ra)i.push(arguments[a++]);if(o=e,(g(e)||void 0!==t)&&!rt(t))return f(e)||(e=function(t,e){if("function"==typeof o&&(e=o.call(this,t,e)),!rt(e))return e}),i[1]=e,q.apply(null,i)}})}G[T][J]||w(G[T],J,G[T].valueOf),F(G,H),Q[M]=!0},a7bd:function(t,e,n){},ac1f:function(t,e,n){"use strict";var o=n("23e7"),i=n("9263");o({target:"RegExp",proto:!0,forced:/./.exec!==i},{exec:i})},ae55:function(t,e,n){"use strict";n("040c")},b165:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXe3t7a2trc3Nzg4OCXP9lCAAACoklEQVQozwXBzU/TYBwA4N+QEr4CNbSFwcFuowSqMRvEAwShHWAYNsu7dS0dLnGUSWT4kZB4lGzE4VtcwgIDJqcOWLJxcv4BOoQZuCPxSNSD4WSWLJGL8XmAIiyo2RgJ4A1pxQQlOxRAszLTdnPu2oQGb05RC5slJld7ZAIfo4O44Bn1ud59F0BcjnYOa17Jhwc6EdiKettncsXjT1f8KUBZUW41pK0Jc1Az4dEV3rkkPBtDSZ83Blyt0kSf2PRjzIykoBwINisPbPPtljdVE9iAXRfUPkXLVIgYrCccp5g687NdZbcJ+xa5VE/HhTtT23IKsN5jj/pcUd0dTZNAqCVw72n4gOwnTOC0vvHfaauT8d9zAoRRfPpISZRVyUiw8ELzOG1b2DZpFzkSrHLhq52twDEdyZHwvp2j4uv/bjvOf23/AcEtTuJbY5Cp4YcAer1IGkUzOo2rn8LQOKjFJw3NTw24nprQXY5aF4wxcqcSdbFQ00H4xFl8Drx4X4CikvAM1tuR8bKIBCBoLnKN10KJG4zKAsc7c9WEB9gnCi6BhVjqoco6t20ILAJuVctvaEZK732cRHDRmGfuihOam0o2CHByUZ/epCcVlRs2wmCnMqsd6aSim3ibBJtm1LGyXW3Bb7tJCPlFtUG+SvPdeEUAB60lNdo+VQbLcwRNVtT68FsLcr1+NotgNihlpExS1V2SFgNbeC8bEhgm8sM17wSi6Us2gxVWJU/5GKBpandvfyYbU1yHCLpCgWGbbPXn40rehEsUXKIJr9DMKgICfjc4bl1YfvUhE/YIECGRqjCxSM9hrybAIkND5OeWfFZsXkxB+qDzb7pUQ3EfQ3Ml6EChEt3D+iS01VqC7EQ/Z/DuPQcz4yChoFQJce2Qr+NNAv0HxofmpXGqgHkAAAAASUVORK5CYII="},b671:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAD1BMVEX48dr48Nf58tv379X17NJtIBxUAAACFUlEQVQ4y1XRUZakMAgF0Af2AiDWApDZgHZqAV1nZv9rGh7Rj7Y8McUFEg1wvcMESMNVD/neU8Xcaz7nYYkYlYO6Ti82PBI4BvIEg1aj3wKwRvIMgZsUy5LdhCawPFh1sZs4SrlyN9fQKpv8s5dgZ2eLyqqJiu+WkCmUEybXkm3INS01WAiv0PapJ0CZc0SJQUzcWnZYbOOY20iFD8Bk+/j2A3wNxH7GdShFYS5ff237kXh9I9zSkQmIAhOsOSVfJ6DIXTMDaPnzkRJ92S1BQQmXl5LdirgRLLDdcYqcGPwe3QN4xCBiGNbrqq9wpW1XCecChwaQdVOsRDpPCpeoolPdxeXp3WNB9PHVzWBHlygy4NJCCrFHREv6bDt0VGwJZASkpONmm1UseGeFKAQexgaAkrfYWl3AGxWOLL2AIMBNbCXpktmS3k3vHeYjGCPBa43wJTurO3ZFVpQSJdAZGLoHTyk1upkjxMEaIxum3iIARcCa5kSkFAW5fi1mUlL9eyOsaanFmOMruwvEdE3ZYzsRSzo5ewRLXyVPPEvknt8ij4DvCg2O7xOgBCUprEzV4z1WekSpUgI8DT2mrnSOXKRfQavwuKA1F+tFnMKdJSUpMA7wQAifWRkMgjUKKZE4lBl6MCM4B1pq1P4uIjDE6Pq6rL0FnW1nIFmta5vrSvq/Ch4tpqG/ZNyyWa5jZPktq81eYv8Bt5s4iFITOp4AAAAASUVORK5CYII="},b727:function(t,e,n){var o=n("0366"),i=n("44ad"),a=n("7b0b"),s=n("50c4"),r=n("65f0"),c=[].push,l=function(t){var e=1==t,n=2==t,l=3==t,u=4==t,A=6==t,f=7==t,g=5==t||A;return function(d,h,p,m){for(var v,b,C=a(d),y=i(C),B=o(h,p,3),S=s(y.length),I=0,x=m||r,E=e?x(d,S):n||f?x(d,0):void 0;S>I;I++)if((g||I in y)&&(v=y[I],b=B(v,I,C),t))if(e)E[I]=b;else if(b)switch(t){case 3:return!0;case 5:return v;case 6:return I;case 2:c.call(E,v)}else switch(t){case 4:return!1;case 7:c.call(E,v)}return A?-1:l||u?u:E}};t.exports={forEach:l(0),map:l(1),filter:l(2),some:l(3),every:l(4),find:l(5),findIndex:l(6),filterOut:l(7)}},c0bc:function(t,e,n){},c84b:function(t,e,n){"use strict";n.r(e);var o=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"detail-wrapper"},[n("div",{staticClass:"detail"},[n("div",{staticClass:"bar"},[n("el-breadcrumb",{attrs:{separator:"/"}},[n("el-breadcrumb-item",{staticClass:"index",attrs:{to:{path:"/"}}},[t._v("书架")]),n("el-breadcrumb-item",{staticClass:"sub"},[t._v("目录")])],1)],1),n("el-divider"),n("div",{staticClass:"catalog"},t._l(this.$store.state.catalog,(function(e){return n("div",{key:e.index,staticClass:"note",on:{click:function(n){return t.toChapter(e.url,e.title,e.index)}}},[t._v(" "+t._s(e.title)+" ")])})),0)],1)])},i=[],a=n("bc3a"),s=n.n(a),r={data:function(){return{key:"value"}},mounted:function(){var t=this;s.a.get("/getChapterList?url="+encodeURIComponent(sessionStorage.getItem("bookUrl"))).then((function(e){t.$store.commit("setCatalog",e.data.data),sessionStorage.setItem("catalog",JSON.stringify(e.data.data))}),(function(t){throw t}))},methods:{toChapter:function(t,e,n){sessionStorage.setItem("chapterID",n),this.$router.push({path:"/chapter"})}}},c=r,l=(n("5ca7"),n("2877")),u=Object(l["a"])(c,o,i,!1,null,"57115a66",null);e["default"]=u.exports},ca36:function(t,e,n){"use strict";n("58c8")},cf68:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAD1BMVEXm5ubo6Ojp6enr6+vt7e1FnZagAAACrklEQVQ4yx1SixUbMQgT3AKAFwDcAfzpBN1/qMrJS5w7bCQhC6IGSUGYQJd6Ox9ZPXi1AGJBavhUTT0JjYPGAab9WcDYIxsmlnxkayX8mhxCmKHA75az5cfRbWybEExiu08xDSgGym0mwuf3j4SvHeQxDJJzh2zp4iOlrD8iOb4SXyC1wiOLRTcnrje+nGamFeXVKWkmzbFIPChkmJ6Fg7mBpV8n+JGOVCd4jv1thThkjeQGNeafpeV3rsEWLfyWc8tC9jOv6FQ8rRzHOOVB+jCYEUAJpDvh8xHNFm/Tm5p5lw94Pp3NhtKEfQsGvnXhowdZE73hPwxKvjDd4i4PCdd0fe3W5fO8ktAsUAacLgstpUw60JCiPLg2XpkgiqPIYYXJd9ksGIT3q+LlevypzItvO+s0F1dBzVr2QDMUkYmuyGcrIS44mVJ7JVKwQXjYuBYp0Uetecbswzsikzu3gUR8bJC/C8Gd/NAzI/xdUGOYQQHDZ8X2d5XuzGRUiXAi9si5CRgoiToRZPtzLJkd0FUHRHZwJf0BHT1sE7gcnh0jmKKlSSF4/GBirGk5+K9NKlGDCfc9JtPhg78JdabH0YQRKNZnJ8tFnPfXHJb4xum1TTCeEmyEdbyEJLjznMLHuFD2Y9NEkSleIBs7SiCbblhgctVi9ch++kDYnn1C9DA5TvdPsToXM55wI6k+8eKT1blwPTqWb5CFJ+7dTBmab+KHy+xwNtItXhZNSpHD2fxnynrxG3ZBKRe8KBpXk11AnadlccEhr9w1nBBvBylNkv7A8eqpGBCDqhitmWQXBjjdS6idr/QjXWLDeMzMbVDoJuM8zN7WenMZWXgZ2vX3F01J3jHZbwk1LRP+DWEvDJtOUoh/AIaBUz5VpWyhuyx4QtgL/NmgC6kM/JvNe+R/C/5aL7BKIbYAAAAASUVORK5CYII="},d0e3:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXh7eHl8eXj7+Pn8+eTbH1KAAACPElEQVQozxWPQWrbQABF/0xn3JFKQRTZOIuUsbCCbOgdRoYEOauxkYPcTRyTlPQWIxEltrsRwQ6hK9nEQek6F+gNTE/Q3qLLusv34cN7SH3mFicdYW4gNIhJWXPBRVXzjcFD0IqeU4o4PRbAIVjyico0vJpIifqPfL80QN9DAQY5ucRHE/hpHxBldXe9GilaHKcKMlj6pho2zXgkNdBl0oJ8kiF1DSiJF1ZHBJkQr0Dbux/5I42Zp4cFahJDFGeW6/QjBwmFY/Q7vZ2SnoOdW2parv/Cnm81+m0xrEfiVXQ3W4nOXIqVYi3l6AAQBwMFkViVBANMto4enXHPNTkHBB0oVj4r5vHzCWayrgBvxtygDlDB2CNDjd80ZInY69aKVYZcfJ8DW+fWuc+syEODALx+ojqoafHsthTI+ZW27PGpIeo/cR6YKcbqIuIFhHmBrzAovzIOOJk1ucvcDzrMRYGVBH2yvcAOf0KiKwfRovBI3tm/kW1eemtfNWwIIXE2mJNhvoszfmMBfRCv0OPwd2321uDW3nx2q/BDxFVeoN1g7a6Im8yRnoawa8kbdXnU0cHeTMxKfZGlJgvLb3sKsxgglQnDdAfvj9LUnqWRDo0GiUmPwyU7TAsD7wHeIW3Nfy1qVGKoE9NgJCdYCAexNRob9yCn4DAQmXtQuUtera6bEmTTXhZy6h856xi4mnEl6BI9mfISkLbtJyZIMJIAUd5ZOBEu88KRAk71yxfItj/hpIB0Errv4gO1os4/UICf+o3kkqwAAAAASUVORK5CYII="},d28b:function(t,e,n){var o=n("746f");o("iterator")},d784:function(t,e,n){"use strict";n("ac1f");var o=n("6eeb"),i=n("d039"),a=n("b622"),s=n("9263"),r=n("9112"),c=a("species"),l=!i((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")})),u=function(){return"$0"==="a".replace(/./,"$0")}(),A=a("replace"),f=function(){return!!/./[A]&&""===/./[A]("a","$0")}(),g=!i((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));t.exports=function(t,e,n,A){var d=a(t),h=!i((function(){var e={};return e[d]=function(){return 7},7!=""[t](e)})),p=h&&!i((function(){var e=!1,n=/a/;return"split"===t&&(n={},n.constructor={},n.constructor[c]=function(){return n},n.flags="",n[d]=/./[d]),n.exec=function(){return e=!0,null},n[d](""),!e}));if(!h||!p||"replace"===t&&(!l||!u||f)||"split"===t&&!g){var m=/./[d],v=n(d,""[t],(function(t,e,n,o,i){return e.exec===s?h&&!i?{done:!0,value:m.call(e,n,o)}:{done:!0,value:t.call(n,e,o)}:{done:!1}}),{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),b=v[0],C=v[1];o(String.prototype,t,b),o(RegExp.prototype,d,2==e?function(t,e){return C.call(t,this,e)}:function(t){return C.call(t,this)})}A&&r(RegExp.prototype[d],"sham",!0)}},d81d:function(t,e,n){"use strict";var o=n("23e7"),i=n("b727").map,a=n("1dde"),s=a("map");o({target:"Array",proto:!0,forced:!s},{map:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}})},df5e:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAATlBMVEXdzaHh0KPgz6LdzKDezqLczJ7ezZ/fz6Dcy5zi0aXdzZ3fz6Tfz57h0KDg0aLcyZrg0KXi0qPfzZ3j06bh0qbdyJbfzJrhz5/cxpLZwo0vDconAAAFn0lEQVRIxxyPW5LjMAwDAT5FybLl2JnM3P+i6+wXWVC1GoQGaD0h4XM3Q5o4T0HgABHBi6pZ4CDXXcUOFd6VhqC3Kch4EI8w9oMXwvU6m5LOOvcxKMOhuu8i5+5cMjcgb0t4F2uvOoeI3/MlT4IqsbtM9UG2AGSXUOsxzPevnXzK1CSHytZLvx7VdQmUcJsJCxJh2nmHW12Qod1qPjt8pih47uQ9aGpoNWF+yElCt60oH7vdIU/MnlRPSBLC/VwqxcKR8PFqnADN9ih5ufqnTlG9KwCofvs7kKYqOPHTNMQ93j9qNImFw9vjHPZ0F1m8hUUVB/Q/TrRYDMXr9++APMFARAt6sPh6wVAXzxUGhZsFUwCNfPZ8/72TAHebAhvuOuT3gO1Vn5d9Jd5sBRkg0p2seL9B7ulkjFJFIt9HPpLzdSzzMP3UcodAfMqC6pBuET2heHK1itZf1GZ1bi0BwOSxiCS8f/JBHMPMM4XCu3Mt1uz9lJbDJRqsKDZuikzkvskQEz6hanfDfO494azY5JpqPqOF1RhxD9XYEdaNxiqWqakKgmPfmrsta8KAiwF4HBxGVUJAgeSqQaiRRZJ7D2jedhw5t1CIAKxag0CBA60BpoBE6DcUi8O5AuM4pLfN0kHLmeu2B4e6HofqbgxsTWUw3PAODqa1oDtyzgXBlusi1KFdclMPE8O3jvLJ8RNi5/RxDQVzVmXA233XQ4KummunfxvLOZo+iH37964YjP06995CTdu9hsvErqJNzmf4wTrZ5DL7+qW9EoLnadrx67b8dUtrJnBXaT1N1uvPaYRKpWkq52xNsMN7vv4Sdryt/f4MhQoMCKnvVxikai1CQ6ZsnwJDc8+3Y/z8HcfvYQNq66pnAu1Hwa+3KNSwbNu8h3nDPqTl9fl7tx8fBhFfdS0o0F3JUKEZtZG9b/LZEM95lzaR30OnWPzroMxyZYdBIMoMnpN0J+m7/40+/P4soFSUjgzE7yY5zrMJuoZv0CmpVguYx1pprfb5HOviRVhHUVi/352shxCYrYBZxGtVaxiAz/MsaGSIsB7R1t4zJXH//n7RTTQQwxqcGEqEvklFHUgiO2GvJV+jAIPR+N29usWDoiSOVrN3XuqT1egQJAAU9EwslVJC8u0rGcy+WPqktJhjfMpatIG6CDAb0v5H34MGKqiVRue7GGLZ9Otxtt4JIrAhxBDwDuqI9JavcO0A7GlqFt219tH/bln9jBXzaKWAEqJV0CBxs5TwM8EvUPHaa8S86vN303MVWOsl3goDBHPWSoQ9c0kQmCKljfsKNH1+ofEOHW8a9a7glZGS8fPieL/SRSs0LAhI4FDTnXs1QYtubv2+IXPZpHB4bhivRexBkYKsSrYXNjvMUbVXpVJ+N6haV72c1k2zrnv5IYBMJBYTSZx0KTkoM3vY93rU/qs7zHplc/3d2ACadhFWByrn9LUk2IWb5JywvawTQc3F0iz+lgsBmInAIemBJtft2plKIlAFOgcroigrG2XlDsAzywQECNyaI8yr2ogoh7D4qJOYmZBzQgoZAM1PAcB8sDrr1uE5CDMR+nWSSVUGUCHAs8Vd21HOE0FzNj37pX0sLp9p3K8k++xxpkmzDxK64rmTSJnDUuIgTeslui6lg92jonZXI4jqNiUuzN4IagcKMjCniMGCODoo8T4tGDprn2hRww+NrnYiCwokd9iiWrkmbRfXYGLAoZrjO1lVQKExjUy5fIkgJURmz2uGFdASwwlWx5gDVTMK7hP6ISRVsFbYNmqtZL9MQtio285PaekyzDhZmtdexCYB0SZcTmBdhvdbmAEonk8hwcHQuZN1kVqrhyKoHHsnQhQAjF7SG533Da2S4LGjx1LoZqp7XeKQLDUBmYmydG0NQHpMeR5lRIRQc1PQ2ASMQflF4YBDMt0/GFlEHeRwCcEAAAAASUVORK5CYII="},e01a:function(t,e,n){"use strict";var o=n("23e7"),i=n("83ab"),a=n("da84"),s=n("5135"),r=n("861d"),c=n("9bf2").f,l=n("e893"),u=a.Symbol;if(i&&"function"==typeof u&&(!("description"in u.prototype)||void 0!==u().description)){var A={},f=function(){var t=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),e=this instanceof f?new u(t):void 0===t?u():u(t);return""===t&&(A[e]=!0),e};l(f,u);var g=f.prototype=u.prototype;g.constructor=f;var d=g.toString,h="Symbol(test)"==String(u("test")),p=/^Symbol\((.*)\)[^)]+$/;c(g,"description",{configurable:!0,get:function(){var t=r(this)?this.valueOf():this,e=d.call(t);if(s(A,t))return"";var n=h?e.slice(7,-1):e.replace(p,"$1");return""===n?void 0:n}}),o({global:!0,forced:!0},{Symbol:f})}},e160:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEX6+fP8+/X+/ff///kbczPAAAACeElEQVQozxXHQUgUUQAG4P8936yzs6VvZNZmN9QxVxiF9OLBoOjtOC6rQq6ygXjI2fCQBdXBg4egtzFGdqkoI+zgBFbqkm3hQSxhFYLotOcubeKhOnVYoqQy+m4f5g5TvpX0xHLbLY9j8SMhJp+Jk4LfAUS2kVRIjILmnwGBTX42PhCVlDJQkIiy2nWAvaJ1h+oFIpJ0hMSYVbyyrgDWshcMpMyL1brPDQKWmduO+KTJ6XeXAMK9Yc3FpD7atyNwg6kt5XgFpLPhjUTFSYVn2abDiugGShwD8JTVRJVo/2ecuKtRb/qc4BK+9TboFfokog4T2Fn6Oqdnsjk90NMS76Rji6E0NmwkPBAZ4Xbkw8KoDAkAbEhkc78e9omxxgxg6qa5HvMv+UZbCV0qmHnSHKl5TxeA2XTCGWekR581mwC5crBH81PznASqB9va3TbkYAjJPLfg5uBfXaJgIgIBv9eessRIhxe7PA7kj6uUMeMaQ/OEQOYRaaHlqH2Gxwsl6E/pwVY5FH7uCypBZPKvDQyVziYBrAkMURe2MOOOxG/eQpp5PF+bFzUV5HtPj9GeiVSNZDELleifYTp9NAjsoiXg4cW+4ZORkdSMB/B74aAdjhsVakhgkugsbmqcDSLEoWp8zRjrux3tli6Q5uM3E+maT99Wy0RiP7tboiuRZle2c6CYeL2kcUc1KvPtQKucogMadKVTQOJYCeyCYlhQQ/Q7Etfd/vBygy9iqy+LyHeF46saCYvW6ingsbA9RBWtdi8GgUXW+oQx9/wP6bAAX1TWeV+CbShZDlQ9xT6SoSxZmKRAkmXb60kzEzkRF+Ccb94BGspGJoN/UzmyR4wjXHAAAAAASUVORK5CYII="},e538:function(t,e,n){var o=n("b622");e.f=o},e8b5:function(t,e,n){var o=n("c6b6");t.exports=Array.isArray||function(t){return"Array"==o(t)}},ec0f:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAALVBMVEXx58b168ny6Mjz6sn06sf27Mvw5sTz6cbw5cLy58T37svv47/168v37s7t4Ltrv0//AAAEjUlEQVQ4yw2Ty2sTURxGf3dmOqmPxb0zmaStCnfmZpL6gpmbxIpUSMZGrSJkxsZiVZimNVaqMklrUnWTRq2KIDFWWx+IFrIRFxXEB4KIgqu6EBdu7M6FIPg32PW3+DhwDmBaYrK56KP4HGIsvg/uvOV0wK+qgBMlO9BujuH4DSJlOseqV5a/BEF97gt0ChyIPqBhXI9BtqtIB8vJB/LdCQ3OVjaLNX0g7+OmoI4e7nkemAqX6o8vg0yyQAyQS7IfgvFbI+6QyI3R4KELxw7kwM2ooQfyQigYnwY5MZbMlHI1DvnQVCoVcrt+R+bO7vPDif3ybNajwqAAe443dpfDsPt379VMWZzGRuqM79mQF+DUz9nt74bQ8J/O80MtVR51U02JKKmTCvTzLVf+vuxP/aHnPo9+2bW+zVsJ0Y630/CrfzX+b+UL+7O68Rczv+7lrMh5etfKXvhc2rk6KforxuoO2xB2tcxKfeXHt18rHOiHI/0RRjW/YGRDkHiwo3nzqL60o58C/bgRuaj7vk+QOwOhpnFNdjuWpKMCGP8Yapu9Ty5FTHKQLGSEFikjd9ADwP9ciaNNjc5qMH6w50AF/LKOsOYqsOG9GjKgc7ZXolqntm6fysJ6Ma6ll2CiqmOgE6O7x1wXExklbeqMYcwsmJmOoigt8SBg2WfilDSsAZJcBxDcrqtBXzFQJqZNHfscyIhoZlygAtyYAceah+elrFbI+46gEHDGiW878Kj7JpWyfhg6iyRMymV1MKBSeVpfgLHIohyTojI6sRyK1VpcqzVZeEBLOnA9unhGKUXPJDYtV9Dxuz4iA5xSkSWhCJdAiJR9PHlvfvbntbrR14FDqUNRAYDJmSnv3oKxuz5+7fiblgVJyYLTbgUM05P7LESkoXvyWNfb0aUU6FZizgQIa25VqKQZqFrk6v6BsqqIHlQmkQ9KrBhkC20/DrFsAFEEYLjM+lj2wYHXCwnNvZQR42XJ2iVK+UBXnI+OBE6oXpUUHiQ1yg0MhA03iwGbnOdQYc1CMiPIPQrCQJFH4L4BMFktAtKd9PN5gnU2Gra4KuK+V+mjtBRpAGIqDVe4wnSnajiFGO5d7smvhVQEMEYwqshrENIEaY7YeblJYtsb3QhAHWZCEKK67swwPMKw0If1Ta+6DgHmlgPzcUTSbi3rrv1Y64/BYEMPQ5SDHUOR022B4QRF6xLUPAaPX/V4IDI5N2BMwx4LqO1uO4j6uW7NvM7lATqGAxY/ZHVgoGZbu7SvkNR75x6qGSB23FdouENVwN7sCbewTdsXGrrnQ5ZZKOCOFtMTIzxlPu6eYmtL+nMFmoK7OeXajn86r9sqWbfmvHC4IagE5qfCPGZvLSq5F55hHIxJFa4/vRxHBlz0og4TojU1l/MOHJX17lybdF0mQhFO44JYUNt3UA473IXw/iPfDWtKG5oFSXIF5iU/VnyDSjxxeDk3jAXRyVyGTNB9FxH9qcFDNJpVbt2y9LytUXkK7Py6+z1RezHQqnoY8XcLimmd8dCnBhQCuaGpJCq3SoIlmYvLz8UkWhJw7T8k+Db/DYEKwgAAAABJRU5ErkJggg=="}}]); \ No newline at end of file diff --git a/app/src/main/assets/web/new/js/detail.6a5cc86c.js b/app/src/main/assets/web/new/js/detail.6a5cc86c.js deleted file mode 100644 index c9482df1f..000000000 --- a/app/src/main/assets/web/new/js/detail.6a5cc86c.js +++ /dev/null @@ -1 +0,0 @@ -(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["detail"],{"040c":function(t,e,n){},"057f":function(t,e,n){var i=n("fc6a"),o=n("241c").f,r={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return o(t)}catch(e){return a.slice()}};t.exports.f=function(t){return a&&"[object Window]"==r.call(t)?s(t):o(i(t))}},"05b3":function(t,e,n){},"0827":function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEUWGBkYGhsdHyAfISI1t/v6AAAB5ElEQVQozxXQsYoTURSA4f/EeycZsDgDdySDjihk38Hy3GWi2J2BCaziQhaiaB+tt9AFu1kwvYUPsIXNPoB9BAUfwAfwEUzKv/v4odGrroyp9/rUaC6rZ5skv5F8qPsfYYP+yKUMymmAEEeW55oUR4o8jr05KNzJ07yvB7w0KKfLwcQUSjfmMU0PJfPHFoEVU+ohNrcKMEzMQ23FDnVSI2dqtYWI7KlLu6vE4UnyvKc3SJuL7lBbeEEl42ItpGLjzIT8PRJCmkRjVpVpsbJFVN0687okJNZiHAr5Z7MV0BnGIDc+THM1zlbieBc1Fq+tH5BH+OpnbWkj40hSqC8Lw2TvFuF0SUFJCk2IytXbjeqcRAt6NHpnrUkUU4KRzZs8RCK8N/Akn2W04LwxMU/V7XK0bDyN2RxfDyx7I4h5vjZby72V8UnOWumZL3qtYc+8DTE0siSBMXGhywx2dMYPnQHbxdFZ7deiNGxCCtD/QWnbwDoGhRYPDzUdUA3krjpnkvdAgDN4ddLkEQSov9qjd42HaDjI34gEqS9TUueAk+sc4qg5ws407KQYKs8G1jv4xBlqBVk6cb4dISZIwVi1Jzu4+HLk6lyfUxkXvwy+1Q+4WVdHIhwfybZ6CWVhxMEhShOgsP/HOW0MvZJeFwAAAABJRU5ErkJggg=="},1276:function(t,e,n){"use strict";var i=n("d784"),o=n("44e7"),r=n("825a"),a=n("1d80"),s=n("4840"),c=n("8aa5"),l=n("50c4"),u=n("14c3"),A=n("9263"),f=n("d039"),d=[].push,g=Math.min,h=4294967295,p=!f((function(){return!RegExp(h,"y")}));i("split",2,(function(t,e,n){var i;return i="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var i=String(a(this)),r=void 0===n?h:n>>>0;if(0===r)return[];if(void 0===t)return[i];if(!o(t))return e.call(i,t,r);var s,c,l,u=[],f=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),g=0,p=new RegExp(t.source,f+"g");while(s=A.call(p,i)){if(c=p.lastIndex,c>g&&(u.push(i.slice(g,s.index)),s.length>1&&s.index=r))break;p.lastIndex===s.index&&p.lastIndex++}return g===i.length?!l&&p.test("")||u.push(""):u.push(i.slice(g)),u.length>r?u.slice(0,r):u}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var o=a(this),r=void 0==e?void 0:e[t];return void 0!==r?r.call(e,o,n):i.call(String(o),e,n)},function(t,o){var a=n(i,t,this,o,i!==e);if(a.done)return a.value;var A=r(t),f=String(this),d=s(A,RegExp),m=A.unicode,v=(A.ignoreCase?"i":"")+(A.multiline?"m":"")+(A.unicode?"u":"")+(p?"y":"g"),b=new d(p?A:"^(?:"+A.source+")",v),C=void 0===o?h:o>>>0;if(0===C)return[];if(0===f.length)return null===u(b,f)?[f]:[];var y=0,S=0,x=[];while(S=51||!i((function(){var e=[],n=e.constructor={};return n[a]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},"1e75":function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXM2t7O3ODQ3uLR4OTDp25yAAACdUlEQVQozw3P70sTcQDH8c/3/M7NG+j35mnHwjwh4hRy/QFK3zvPNbeIG1koPZmxfj2IDAwihL53zj0JYisfmEHcZJZOiBUG60lZiI8T/ANusuftgQ+kCPIPeMP7hS5mUrV9c1g6MQCAEZ8tDLHwofImAGRlX+SZK3Vu9rRRPuO4PK6/9nA4GIATsxlODS+rdCMhkAZivpYV0LWoQHSLSA4NfUg+6mY+7BKL2++F9LvnrBDYm6JO9i/YO3i/HJTGQ4pdIV82TbEDFG6vGYCd4wZchgK5J2CrKTLE+Tx0v+YGlIbdWJFcQl4ptBN8fUJQN1MCJLcZLYwUVVo+famGGty8EXJF5ofOEDzcodT3/Fb0I5sHmc1ZG7CcSl8COgxlXx09jT05OafjCZLIHJhGIaU6wDZHsuMQ41wbdjmQXbhKnMq1zlXSYrjCnyZblqexA7fC8RxS74tq2P3OxSQwTuJSApH8OZLzBBp1pOe0i3rdyDUA47GySZ31YmC4EQYSXvFSvieORGBxXF9aeVtUWKGS9WMC4Z9Y2uXnJ2nCUXVMbPOYqNYNmGWWQ7Evr+BWC+a0JAMTImcq/S4Z5INdQMeuOqDIMa9beilxfA60iC6sP1INcPDpmHBW8drZHNmqwyddJtVje9q8WGUgWAOzmbU4FCQBFi8B2Wk6pickBnYhJMenmJGuRmtt2IoKq9NuFGbNFR99sHnvrnLsLysKANDIsxbp6RNMAsoDSKuRpMwZbAAzI68QatIjmZ0aImyM3O8/4e2MNlOHZomFsa/fLDsysliHS+nlYLQJMnynxrH8QO4PaAV2Li8B/+52UgeGIVNFYf8B1XG/kFSmLcUAAAAASUVORK5CYII="},"356c":function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXPz8/R0dHT09PU1NToNyAhAAACdElEQVQozw3NP0xTQQDH8d9d7sFrG+QeKVgQ4aoFCwFkYERyLY//0UB8GNGg1WAC0RBGJrzW4mCXQmpgvCYOwEAYiulSpYtza2KiW7s5FgNJFSV2/CzfL7RwpoJ20iadmgA8owOyaxmusKE44scBeb4vIv00dqYgmf6jzWcr7W6INbDQeZbQL9ytXeYgtFfzmW1Fek5msxJlwhyt6qDDxOLQzpVPompYrMPnEnhvLm7M5BxY5nowAj3zkydAkpC0FIG6g7AK+Ub25ybyNWVYwtpseP2rfrQwiGRpfqrnMuPeuvr2dA0p2YsHF2XghkrXKtZ8tLBjR7S2qIaYbKmyLd/QP+EogLjqqwNw5Lq1pDlMLkM5+gNoSvdq+Pxmz9/61EFq6GYM6GqaGvlN95zy3gsmEWI8K3k8OP9OmRLEPO6DP3Wv3g42COinJTZ33dcIvs4ESp6opMTjDs6mcYTEbFeUifuxh989yZrIx4lkpuixxz0nHLCekKbE17suKhYkMGhoYhTZtVBvg4bfq/1L1Im0AGMVpBFwumM0zwyuKiCMi5dqR4Flx47AGyF2xTbxqUdTwCH94BT3DozpLV5WuAL/N8rGtHKjotBOOuOtCJ9E21uqsyBoLOzaXbHPrK5PQBP+fBfeidvJAeMIAmzVt5IkJJ9DBWaZDAepYUhlQqHt0h72SJ3j8TZHom64f516xx9T5evgMPgwG82jZdJaJIDyWp6LAjOCclVyzNA3iTKzIULlBQEPaTXlPHok5gISclmyaWZlqY2aTHdRHpJOwTdDEQ3ZfKtbpclcNhyVClagmY+fIfyKukntPqBgnx5QvZHk/D/MK8JMClrSigAAAABJRU5ErkJggg=="},"3ca3":function(t,e,n){"use strict";var i=n("6547").charAt,o=n("69f3"),r=n("7dd0"),a="String Iterator",s=o.set,c=o.getterFor(a);r(String,"String",(function(t){s(this,{type:a,string:String(t),index:0})}),(function(){var t,e=c(this),n=e.string,o=e.index;return o>=n.length?{value:void 0,done:!0}:(t=i(n,o),e.index+=t.length,{value:t,done:!1})}))},4039:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAD1BMVEX0/PTx+fH2/vbz+/P4//htSO9OAAAC5UlEQVQ4yyWT0QGjMAxDZTsDWKQDmJQBYrgBUsr+M517x0+LRWw9CyA+pC1YzndrMgHaNXVKQ+di13Of1qbur48nWhuRjj8i6ON8e7pNm7zyag/DBTfS9Z4Hup1fUuXMKY4HEE8QOHCByXkIkl7lDT239RtL9quO4JItmmhOAHXg45QuYKrQFLyGJcRvaTw6kQqZy6mkR6JAPFH/XqsQjEDRmUOA+MNLHGyMUT7AHApoAhjgjIJmCxy6XHdf648AWCdGe57IUDazCeTImQOY4/z+eVYVX2IjOw9RydeAeJwl79iGi4HpgQgHEchWraUZLtayu8scq0lHHHUKMY3Ml8hB7CS1jOckDLG9ccgNeX3124phOcjL9fPnWJhTXpLHeG9DRmHnTxHEaHakS2J51lwAJcUraNbuU7q4gMTDQj3Eripc/x+qFM5VEKAB1roQfAkX5/PxqnS2QpOrxfK1Zft0/omV5T+xCSBUAIbEIwUQgvAfxFE1O8dnk233+1UZiqJ1mAbsue6Yt8tF+yOrxC/YrUhzC4qPlE3EbR5hGKhhHdlrg7J9WunV7L7BcYQwAeE59u2tnN1c6gfVYrQiLSZ9OxZdWDXQq0+r0Pbarh3UqGCwauVvbiXuDsNxCtLDdW9rTF8oQYN4EoXXdfmwNguQP26n/tRjDeo+F2W7PjWtfSr6Bn/z+cXOLp4NnMV4RytvSW4B68m+XN9XfZTFGhO/S+cHTuTqZDC21ccA0N7QsePALaDQC3D1f94U9CWo+aq6BjB3v0rxIimBM12296M3aKPHjXLQE9KQKH4By8RHraJ3AgVto2r4xdFqlaPaiAHLl1ZF4P2pI6cYc+K8UZdcmxy7lqGc1IoPxLmIFuIeEZ6j2sQT88muEg1zwrEDTIX5U/ZmcsqfgVlBumiBLF4sAyhf9BFlXOPKLZ4H0iFb3VoHrGhtHTldKrOvP2/reu2zfV8CXMPqzRdlgd0a5eI7WwB/AYcgavcqxXWEAAAAAElFTkSuQmCC"},4400:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAElBMVEUQERMODxESFBYWGBkaHB0eICLm6ozJAAACkUlEQVQ4yyWTUdLbMAiEASfvoOkBkBy/O5keIE0v8E/uf5h+68qZWALELgu2MG9PP9qyvCzTVhrrsPGOCjvTfXQZvtp/W3Gy6LCITqs4q/DZ+KYl76zKzHVYpY2wNY27nqN1sbLGcrLH3/ENH4oWlGctsDu8AO+HzTLlsYdh8MzP1m6YDMz0ACfcimvakBj+mwO/+5Uta5teOD379sxK1fUxmUhv8MU3jUT5gs26PMephFznkLcpQZ6/dPL9C/GWHcCxDN6oZhD5xBm5qoYBPA+PFE/H1tXDWcWl8TW7rS+4dUzAVy0BIrvC4/HcqW2TkG1HO8q9dC23INAg7NA4AFRFkDTM2lfELPyFzi1VddcpX2z0KjHBUDmdLNJ6dDps4ytrX+FPsZwE31wSL+6OWfHOAJ3+Y0Rk/MiKfmWNPg7oVP/U3Ck9FoCkC2gBpALOiqbMNTkOe8P4FWkTD2Y9Q3+5VmV0uLUJBl68U5uAK2Kl6QDXvLxbwweOL2sixW78uU8p0ysfc7cWrF1j6B1sPJ4WgclYSnJN1bzozrhEcFHmRzBkbJWqqdG+EYJXRFmT5jnLXPUNF6WBdoFbTxYsmDXVLU/WA7MExNc93sJS5hIXDeLxzMScHzdhKvEkibr6cQXYPrmtmTA7JcInISrTzRDvShTdka0uVGrsJAAR6tSn1sKziZtfKVjAxPrJsYgZO0bye+vKTZ/DgoAoLGNO6jYHimZYTL/3pLJHawquJukjBpfz8WOGVSVIWx9ywUfS5iENutidRM4NzkAmxgUSQ68xgNOU+ZLalr4TS2V+D2xqukZig+Z9DilR7Nouzwp1cp/3E5q6Rdlf08obKvAM4qZ6pMr+w3PmQALSSBfjyZn5DwrNRVbywBQiAAAAAElFTkSuQmCC"},"44e7":function(t,e,n){var i=n("861d"),o=n("c6b6"),r=n("b622"),a=r("match");t.exports=function(t){var e;return i(t)&&(void 0!==(e=t[a])?!!e:"RegExp"==o(t))}},"477e":function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAACVBMVEX28ef48+n69esoK7jYAAAB4UlEQVQozw2OsW4bQQxEhwLXkDrysGdEqRRgVShfQQq8wOr2jD0jSpXCLvwXbtKfADlFqgSwC/9ljqweZgYzQFnb/QGepYhA9jzmTc1WaSEtQpbFgjWATI00ZZtIckXx8q2Oe5yEByBy+RHOTcM+VVTadULsvxvRC/q8WTwgcWGD+Mnaqa0oy2gw2pKFzK+PzEsus5hP9AHojKslVynLlioVTBEN8cjDNnZoR1uMGTiZAAN47HxMtEkGUE9b8HWzkqNX5Lpk0yVziAJOs46rK1pG/xNuXLjz95fSDoJE5IqG23MAYPtWoeWPvfVtIV/Ng9oH3W0gGMPIOqd4MK4QZ55dV61gOb8Zxp7I9qayaGxp6Q91cmC0ZRdBwEQVHWzSAanlZwVWc9yljeTCeaHjBVvlPSLeyeBUT2rPdJegQI103jVS3uYkyIx1il6mslMDedZuOkwzolsagvPuQAfp7cYg7k9V1NOxfq64PNSvMdwONV4VYEmqlbpZy5OAakRKkjPnL4CBv5/OZRgoWHBmNbxB0LgB1I4vXFj93UoF2/0TPEsWwV9EhbIiTPqYoTHYoMn3enTDjmrFeDTIzaL1bUC/PBIMuF+vSSYSaxoVt90EO3Gu1zrMuMRGUk7Ffv3L+A931Gsb/yBoIgAAAABJRU5ErkJggg=="},"537b":function(t,e,n){"use strict";n.r(e);var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"chapter-wrapper",class:{night:t.isNight,day:!t.isNight},style:t.bodyTheme},[n("div",{staticClass:"tool-bar",style:t.leftBarTheme},[n("div",{staticClass:"tools"},[n("el-popover",{attrs:{placement:"right",width:t.cataWidth,trigger:"click","visible-arrow":!1,"popper-class":"pop-cata"},model:{value:t.popCataVisible,callback:function(e){t.popCataVisible=e},expression:"popCataVisible"}},[n("PopCata",{ref:"popCata",staticClass:"popup",on:{getContent:t.getContent}}),n("div",{staticClass:"tool-icon",class:{"no-point":t.noPoint},attrs:{slot:"reference"},slot:"reference"},[n("div",{staticClass:"iconfont"},[t._v("  ")]),n("div",{staticClass:"icon-text"},[t._v("目录")])])],1),n("el-popover",{attrs:{placement:"bottom-right",width:"470",trigger:"click","visible-arrow":!1,"popper-class":"pop-setting"},model:{value:t.readSettingsVisible,callback:function(e){t.readSettingsVisible=e},expression:"readSettingsVisible"}},[n("ReadSettings",{staticClass:"popup"}),n("div",{staticClass:"tool-icon",class:{"no-point":t.noPoint},attrs:{slot:"reference"},slot:"reference"},[n("div",{staticClass:"iconfont"},[t._v("  ")]),n("div",{staticClass:"icon-text"},[t._v("设置")])])],1),n("div",{staticClass:"tool-icon",on:{click:t.toShelf}},[n("div",{staticClass:"iconfont"},[t._v("  ")]),n("div",{staticClass:"icon-text"},[t._v("书架")])]),n("div",{staticClass:"tool-icon",class:{"no-point":t.noPoint},on:{click:t.toTop}},[n("div",{staticClass:"iconfont"},[t._v("  ")]),n("div",{staticClass:"icon-text"},[t._v("顶部")])]),n("div",{staticClass:"tool-icon",class:{"no-point":t.noPoint},on:{click:t.toBottom}},[n("div",{staticClass:"iconfont"},[t._v("  ")]),n("div",{staticClass:"icon-text"},[t._v("底部")])])],1)]),n("div",{staticClass:"read-bar",style:t.rightBarTheme},[n("div",{staticClass:"tools"},[n("div",{staticClass:"tool-icon",class:{"no-point":t.noPoint},on:{click:t.toLastChapter}},[n("div",{staticClass:"iconfont"},[t._v("  ")])]),n("div",{staticClass:"tool-icon",class:{"no-point":t.noPoint},on:{click:t.toNextChapter}},[n("div",{staticClass:"iconfont"},[t._v("  ")])])])]),n("div",{staticClass:"chapter-bar"}),n("div",{ref:"content",staticClass:"chapter",style:t.chapterTheme},[n("div",{staticClass:"content"},[n("div",{ref:"top",staticClass:"top-bar"}),t.show?n("div",{ref:"title",staticClass:"title"},[t._v(t._s(t.title))]):t._e(),n("Pcontent",{attrs:{carray:t.content}}),n("div",{ref:"bottom",staticClass:"bottom-bar"})],1)])])},o=[],r=(n("ac1f"),n("1276"),function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"cata-wrapper",style:t.popupTheme},[n("div",{staticClass:"title"},[t._v(" 目录 ")]),n("div",{ref:"cataData",staticClass:"data-wrapper",class:{night:t.isNight,day:!t.isNight}},[n("div",{staticClass:"cata"},t._l(t.catalog,(function(e,i){return n("div",{key:e.durChapterIndex,ref:"cata",refInFor:!0,staticClass:"log",class:{selected:t.isSelected(i)},on:{click:function(n){return t.gotoChapter(e)}}},[n("div",{staticClass:"log-text"},[t._v(" "+t._s(e.title)+" ")])])})),0)])])}),a=[];n("c975"),n("a4d3"),n("e01a"),n("d28b"),n("d3b7"),n("3ca3"),n("ddb0");function s(t){return s="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}var c,l,u=function(t,e,n,i){return t/=i/2,t<1?n/2*t*t+e:(t--,-n/2*(t*(t-2)-1)+e)},A=function(){var t,e,n,i,o,r,a,c,l,A,f,d,g;function h(){var e=t.scrollTop||t.scrollY||t.pageYOffset;return e="undefined"===typeof e?0:e,e}function p(e){var i=e.getBoundingClientRect().top,o=t.getBoundingClientRect?t.getBoundingClientRect().top:0;return i-o+n}function m(e){t.scrollTo?t.scrollTo(0,e):t.scrollTop=e}function v(t){A||(A=t),f=t-A,d=r(f,n,c,l),m(d),f1&&void 0!==arguments[1]?arguments[1]:{};switch(l=f.duration||1e3,o=f.offset||0,g=f.callback,r=f.easing||u,a=f.a11y||!1,s(f.container)){case"object":t=f.container;break;case"string":t=document.querySelector(f.container);break;default:t=window}switch(n=h(),s(A)){case"number":e=void 0,a=!1,i=n+A;break;case"object":e=A,i=p(e);break;case"string":e=document.querySelector(A),i=p(e);break}switch(c=i-n+o,s(f.duration)){case"number":l=f.duration;break;case"function":l=f.duration(c);break}requestAnimationFrame(v)}return C},f=A(),d=f,g=n("7286"),h=n.n(g),p=n("477e"),m=n.n(p),v=n("e160"),b=n.n(v),C=n("df5e"),y=n.n(C),S=n("ec0f"),x=n.n(S),B=n("b671"),I=n.n(B),E=n("5629"),k=n.n(E),w=n("d0e3"),O=n.n(w),U=n("4039"),D=n.n(U),Q=n("1e75"),V=n.n(Q),R=n("1632"),P=n.n(R),M=n("7abd"),L=n.n(M),F=n("356c"),N=n.n(F),T=n("b165"),K=n.n(T),H=n("cf68"),J=n.n(H),z=n("4400"),W=n.n(z),G=n("802e"),q=n.n(G),Y=n("0827"),Z=n.n(Y),j={themes:[{body:"#ede7da url("+h.a+") repeat",content:"#ede7da url("+m.a+") repeat",popup:"#ede7da url("+b.a+") repeat"},{body:"#ede7da url("+y.a+") repeat",content:"#ede7da url("+x.a+") repeat",popup:"#ede7da url("+I.a+") repeat"},{body:"#ede7da url("+k.a+") repeat",content:"#ede7da url("+O.a+") repeat",popup:"#ede7da url("+D.a+") repeat"},{body:"#ede7da url("+V.a+") repeat",content:"#ede7da url("+P.a+") repeat",popup:"#ede7da url("+L.a+") repeat"},{body:"#ebcece repeat",content:"#f5e4e4 repeat",popup:"#faeceb repeat"},{body:"#ede7da url("+N.a+") repeat",content:"#ede7da url("+K.a+") repeat",popup:"#ede7da url("+J.a+") repeat"},{body:"#ede7da url("+W.a+") repeat",content:"#ede7da url("+q.a+") repeat",popup:"#ede7da url("+Z.a+") repeat"}],fonts:[{fontFamily:"Microsoft YaHei, PingFangSC-Regular, HelveticaNeue-Light, Helvetica Neue Light, sans-serif"},{fontFamily:"PingFangSC-Regular, -apple-system, Simsun"},{fontFamily:"Kaiti"}]},X=j,$=(n("05b3"),{name:"PopCata",data:function(){return{isNight:6==this.$store.state.config.theme,index:this.$store.state.readingBook.index}},computed:{catalog:function(){return this.$store.state.readingBook.catalog},popCataVisible:function(){return this.$store.state.popCataVisible},theme:function(){return this.$store.state.config.theme},popupTheme:function(){return{background:X.themes[this.theme].popup}}},mounted:function(){},watch:{theme:function(t){this.isNight=6==t},popCataVisible:function(){this.$nextTick((function(){var t=this.$store.state.readingBook.index,e=this.$refs.cataData;d(this.$refs.cata[t],{container:e,duration:0})}))}},methods:{isSelected:function(t){return t==this.$store.state.readingBook.index},gotoChapter:function(t){this.index=this.catalog.indexOf(t),this.$store.commit("setPopCataVisible",!1),this.$store.commit("setContentLoading",!0),this.$emit("getContent",this.index)}}}),_=$,tt=(n("9078"),n("2877")),et=Object(tt["a"])(_,r,a,!1,null,"22f8c37b",null),nt=et.exports,it=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"settings-wrapper",class:{night:t.isNight,day:!t.isNight},style:t.popupTheme},[n("div",{staticClass:"settings-title"},[t._v("设置")]),n("div",{staticClass:"setting-list"},[n("ul",[n("li",{staticClass:"theme-list"},[n("i",[t._v("阅读主题")]),t._l(t.themeColors,(function(e,i){return n("span",{key:i,ref:"themes",refInFor:!0,staticClass:"theme-item",class:{selected:t.selectedTheme==i},style:e,on:{click:function(e){return t.setTheme(i)}}},[i<6?n("em",{staticClass:"iconfont"},[t._v("")]):n("em",{staticClass:"moon-icon"},[t._v(t._s(t.moonIcon))])])}))],2),n("li",{staticClass:"font-list"},[n("i",[t._v("正文字体")]),t._l(t.fonts,(function(e,i){return n("span",{key:i,staticClass:"font-item",class:{selected:t.selectedFont==i},on:{click:function(e){return t.setFont(i)}}},[t._v(t._s(e))])}))],2),n("li",{staticClass:"font-size"},[n("i",[t._v("字体大小")]),n("div",{staticClass:"resize"},[n("span",{staticClass:"less",on:{click:t.lessFontSize}},[n("em",{staticClass:"iconfont"},[t._v("")])]),n("b"),t._v(" "),n("span",{staticClass:"lang"},[t._v(t._s(t.fontSize))]),n("b"),n("span",{staticClass:"more",on:{click:t.moreFontSize}},[n("em",{staticClass:"iconfont"},[t._v("")])])])]),n("li",{staticClass:"read-width"},[n("i",[t._v("页面宽度")]),n("div",{staticClass:"resize"},[n("span",{staticClass:"less",on:{click:t.lessReadWidth}},[n("em",{staticClass:"iconfont"},[t._v("")])]),n("b"),t._v(" "),n("span",{staticClass:"lang"},[t._v(t._s(t.readWidth))]),n("b"),n("span",{staticClass:"more",on:{click:t.moreReadWidth}},[n("em",{staticClass:"iconfont"},[t._v("")])])])])])])])},ot=[],rt=(n("82da"),{name:"ReadSettings",data:function(){return{theme:0,isNight:6==this.$store.state.config.theme,moonIcon:"",themeColors:[{background:"rgba(250, 245, 235, 0.8)"},{background:"rgba(245, 234, 204, 0.8)"},{background:"rgba(230, 242, 230, 0.8)"},{background:"rgba(228, 241, 245, 0.8)"},{background:"rgba(245, 228, 228, 0.8)"},{background:"rgba(224, 224, 224, 0.8)"},{background:"rgba(0, 0, 0, 0.5)"}],moonIconStyle:{display:"inline",color:"rgba(255,255,255,0.2)"},fonts:["雅黑","宋体","楷书"]}},mounted:function(){var t=this.$store.state.config;this.theme=t.theme,6==this.theme?this.moonIcon="":this.moonIcon=""},computed:{config:function(){return this.$store.state.config},popupTheme:function(){return{background:X.themes[this.config.theme].popup}},selectedTheme:function(){return this.$store.state.config.theme},selectedFont:function(){return this.$store.state.config.font},fontSize:function(){return this.$store.state.config.fontSize},readWidth:function(){return this.$store.state.config.readWidth}},methods:{setTheme:function(t){6==t?(this.isNight=!0,this.moonIcon="",this.moonIconStyle.color="#ed4259"):(this.isNight=!1,this.moonIcon="",this.moonIconStyle.color="rgba(255,255,255,0.2)");var e=this.config;e.theme=t,this.$store.commit("setConfig",e)},setFont:function(t){var e=this.config;e.font=t,this.$store.commit("setConfig",e)},moreFontSize:function(){var t=this.config;t.fontSize<48&&(t.fontSize+=2),this.$store.commit("setConfig",t)},lessFontSize:function(){var t=this.config;t.fontSize>12&&(t.fontSize-=2),this.$store.commit("setConfig",t)},moreReadWidth:function(){var t=this.config;t.readWidth<960&&(t.readWidth+=160),this.$store.commit("setConfig",t)},lessReadWidth:function(){var t=this.config;t.readWidth>640&&(t.readWidth-=160),this.$store.commit("setConfig",t)}}}),at=rt,st=(n("75ab"),Object(tt["a"])(at,it,ot,!1,null,"36dafd56",null)),ct=st.exports,lt=(n("d81d"),{name:"pcontent",data:function(){return{}},props:["carray"],render:function(){var t=arguments[0],e=this.fontFamily,n=this.fontSize,i=e;return i.fontSize=n,this.show?t("div",[this.carray.map((function(e){return t("p",{style:i,domProps:{innerHTML:e}})}))]):t("div")},computed:{show:function(){return this.$store.state.showContent},fontFamily:function(){return X.fonts[this.$store.state.config.font]},fontSize:function(){return this.$store.state.config.fontSize+"px"}},watch:{fontSize:function(){var t=this;t.$store.commit("setShowContent",!1),this.$nextTick((function(){t.$store.commit("setShowContent",!0)}))}}}),ut=lt,At=(n("ca36"),Object(tt["a"])(ut,c,l,!1,null,"7b03cca0",null)),ft=At.exports,dt=n("bc3a"),gt=n.n(dt),ht={components:{PopCata:nt,Pcontent:ft,ReadSettings:ct},created:function(){var t=JSON.parse(localStorage.getItem("config"));null!=t&&this.$store.commit("setConfig",t)},beforeCreate:function(){var t=JSON.parse(localStorage.getItem("config"));null!=t&&this.$store.commit("setConfig",t)},mounted:function(){var t=this;this.loading=this.$loading({target:this.$refs.content,lock:!0,text:"正在获取内容",spinner:"el-icon-loading",background:"rgba(0,0,0,0)"});var e=this,n=sessionStorage.getItem("bookUrl"),i=sessionStorage.getItem("bookName"),o=sessionStorage.getItem("chapterIndex")||0,r=JSON.parse(localStorage.getItem(n));(null==r||o>0)&&(r={bookName:i,bookUrl:n,index:o},localStorage.setItem(n,JSON.stringify(r))),this.getCatalog(n).then((function(n){var i=n.data.data;r.catalog=i,e.$store.commit("setReadingBook",r);var o=e.$store.state.readingBook.index||0;t.getContent(o),window.addEventListener("keyup",(function(t){switch(t.key){case"ArrowLeft":t.stopPropagation(),t.preventDefault(),e.toLastChapter();break;case"ArrowRight":t.stopPropagation(),t.preventDefault(),e.toNextChapter();break;case"ArrowUp":t.stopPropagation(),t.preventDefault(),0===document.documentElement.scrollTop?e.$message.warning("已到达页面顶部"):d(0-document.documentElement.clientHeight+100);break;case"ArrowDown":t.stopPropagation(),t.preventDefault(),document.documentElement.clientHeight+document.documentElement.scrollTop===document.documentElement.scrollHeight?e.$message.warning("已到达页面底部"):d(document.documentElement.clientHeight-100);break}}))}),(function(t){throw e.loading.close(),e.$message.error("获取书籍目录失败"),t}))},watch:{chapterName:function(t){this.title=t},content:function(){this.$store.commit("setContentLoading",!1)},theme:function(t){this.isNight=6==t},bodyColor:function(t){this.bodyTheme.background=t},chapterColor:function(t){this.chapterTheme.background=t},readWidth:function(t){this.chapterTheme.width=t;var e=-((parseInt(t)+130)/2+68)+"px",n=-((parseInt(t)+130)/2+52)+"px";this.leftBarTheme.marginLeft=e,this.rightBarTheme.marginRight=n},popupColor:function(t){this.leftBarTheme.background=t,this.rightBarTheme.background=t},readSettingsVisible:function(t){if(!t){var e=JSON.stringify(this.$store.state.config);localStorage.setItem("config",e)}}},data:function(){return{title:"",content:[],noPoint:!0,isNight:6==this.$store.state.config.theme,bodyTheme:{background:X.themes[this.$store.state.config.theme].body},chapterTheme:{background:X.themes[this.$store.state.config.theme].content,width:this.$store.state.config.readWidth-130+"px"},leftBarTheme:{background:X.themes[this.$store.state.config.theme].popup,marginLeft:-(this.$store.state.config.readWidth/2+68)+"px"},rightBarTheme:{background:X.themes[this.$store.state.config.theme].popup,marginRight:-(this.$store.state.config.readWidth/2+52)+"px"}}},computed:{catalog:function(){return this.$store.state.catalog},windowHeight:function(){return window.innerHeight},contentHeight:function(){return this.$refs.content.offsetHeight},popCataVisible:{get:function(){return this.$store.state.popCataVisible},set:function(t){this.$store.commit("setPopCataVisible",t)}},readSettingsVisible:{get:function(){return this.$store.state.readSettingsVisible},set:function(t){this.$store.commit("setReadSettingsVisible",t)}},config:function(){return this.$store.state.config},theme:function(){return this.config.theme},bodyColor:function(){return X.themes[this.config.theme].body},chapterColor:function(){return X.themes[this.config.theme].content},popupColor:function(){return X.themes[this.config.theme].popup},readWidth:function(){return this.$store.state.config.readWidth-130+"px"},cataWidth:function(){return this.$store.state.config.readWidth-33},show:function(){return this.$store.state.showContent}},methods:{getCatalog:function(t){return gt.a.get("/getChapterList?url="+encodeURIComponent(t))},getContent:function(t){var e=this;this.$store.commit("setShowContent",!1),this.loading.visible||(this.loading=this.$loading({target:this.$refs.content,lock:!0,text:"正在获取内容",spinner:"el-icon-loading",background:"rgba(0,0,0,0)"}));var n=sessionStorage.getItem("bookUrl"),i=JSON.parse(localStorage.getItem(n));i.index=t,localStorage.setItem(n,JSON.stringify(i)),this.$store.state.readingBook.index=t;var o=this.$store.state.readingBook.catalog[t].title,r=this.$store.state.readingBook.catalog[t].index;this.title=o,d(this.$refs.top,{duration:0});var a=this;gt.a.get("/getBookContent?url="+encodeURIComponent(n)+"&index="+r).then((function(t){var n=t.data.data,i=n.split("\n\n"),o="";o=i.length>1?i[1].split("\n"):i[0].split("\n"),a.content=o,e.$store.commit("setContentLoading",!0),a.loading.close(),a.noPoint=!1,a.$store.commit("setShowContent",!0)}),(function(t){throw a.$message.error("获取章节内容失败"),a.content="  获取章节内容失败!",t}))},toTop:function(){d(this.$refs.top)},toBottom:function(){d(this.$refs.bottom)},toNextChapter:function(){this.$store.commit("setContentLoading",!0);var t=this.$store.state.readingBook.index;t++,"undefined"!==typeof this.$store.state.readingBook.catalog[t]?(this.$message.info("下一章"),this.getContent(t)):this.$message.error("本章是最后一章")},toLastChapter:function(){this.$store.commit("setContentLoading",!0);var t=this.$store.state.readingBook.index;t--,"undefined"!==typeof this.$store.state.readingBook.catalog[t]?(this.$message.info("上一章"),this.getContent(t)):this.$message.error("本章是第一章")},toShelf:function(){this.$router.push("/")}}},pt=ht,mt=(n("ae55"),Object(tt["a"])(pt,i,o,!1,null,"51d89d6a",null));e["default"]=mt.exports},5629:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXN383Q4tDP4c/R5NEInCCXAAACVElEQVQozw3Hv2sTYRwH4M/79pJ7bZL2bXqtERJ97zjUpbZDhg6pfC8qibi8hLR0EaJ0EFxaCSWDxjfpj1zrYBcRBKE6SAfBJWsx9i8IQfdQxDlKtA6t2OnhQfN3lbG7ytYRywF8rVoPCNO0X2sQOKDpAnSDK2VwkHgmh5yLGT8qASt+2KofnNt2Xg1gf1UF8AoM6052cRMNaloLZb7RKQGrKKji2OefsZF+VqIvos5ZLVIZCX61JcwUdk56wASVkgQvzPfvmT2twTSwyYaC/Pl/UhAHorFhBgZtL6XdAZRp1tkPwC1NLa9CWs5prLhI85NBQsLdXvjDymG3/EbYfQhVNYqc3TtktQhWLY3ko0QsdMbSEp+64v0NfxyqLbIGdh6M2xHHlLBGqKTyQo4E/nebBgBfe1GpdeywYXc8CT7D3cKXuMXkBy4xN6o5OuKamYp3DVI6uccO9lxgd2CAlJgI2BGgaAgIJV/TYwKqu3WFccjbMuA+bVkWgS2bfnlRbD1Eb1sDyWMmjKYIBgGAWbqKRicfvzBkBIz3V5AKnguWdglQEysQsSuVzOg6ALy1pitA5ykGCsc857BRYcgCSZyFOdvoOigSGoPc5Ta73mgxshIcQE5sHMHd9D7yqITw7JO+GHVMxjhzYLcKPSEgmz3fU+BRy3iYNtiXLaBssCW8KguReqkQOTb3MStV0Ugt4U1eIs1RZWRII6Ww8xeNNItyGGQI4ZMlpg/3lQtkl2JFnBp1imRyFe0kK2Id3PCslMgiQNMS77gvFeDhG3cSkYvheeg/e7ClIh5oh+IAAAAASUVORK5CYII="},"58c8":function(t,e,n){},"5ca7":function(t,e,n){"use strict";n("a7bd")},"63f0":function(t,e,n){},6547:function(t,e,n){var i=n("a691"),o=n("1d80"),r=function(t){return function(e,n){var r,a,s=String(o(e)),c=i(n),l=s.length;return c<0||c>=l?t?"":void 0:(r=s.charCodeAt(c),r<55296||r>56319||c+1===l||(a=s.charCodeAt(c+1))<56320||a>57343?t?s.charAt(c):r:t?s.slice(c,c+2):a-56320+(r-55296<<10)+65536)}};t.exports={codeAt:r(!1),charAt:r(!0)}},"65f0":function(t,e,n){var i=n("861d"),o=n("e8b5"),r=n("b622"),a=r("species");t.exports=function(t,e){var n;return o(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!o(n.prototype)?i(n)&&(n=n[a],null===n&&(n=void 0)):n=void 0),new(void 0===n?Array:n)(0===e?0:e)}},7286:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXr5djn4dTp49bt59rT6LKxAAACnElEQVQozw3NUUwScRzA8d8R6MF8YMIx8uk47hDSJbj14IPzOGc7jPLvwTGg5uAYDbe2tt56cLtznvEnS6yDqCcEaWi91DvrbLJZz7b1aFtz1aO+2OZWvn+/+4CHeB6BMYaqBLfjPNRY6RFT2JJYby+uAk4WUTrtlmJ4hgPYb2q1XGDQjaK8pgJHvqNaAX+KyuIkDXpgQinb46nOulnn4b5laUHTxLfseeArAoNOeJlOIjdoal0n1FA7tKFv5roK+YaHOqP3P0XyKHPHY+MhTRe5uCZnKhtJKw2eSrSoBDPLtpZuNcFNJcFyiCMxOaaHIfXz1e8HQbWLySrBQ4x0x1qlhnHlnz2HQEC6TNb0gTHXa7IKhcaHqkE015hk9whA0YeWiLIXf7Fa2CZo3DjqjB4tTuF8jIcbfcEx5z/w4sXpQhXW+ju0cqh7icTFmRMaG+v6CIvTjcSpHcH8JEsF3EPh3fRthYdVLLgI2fWXm85/pGFE4l046s70L+yKCcirGFR+jbpy3kMmiCGHrSezVONsn1RBixncyk2PcVWk7DlgxHo8iZwDyq5uAUD854dZhdIFYzKoQig2haUKi1lVufz2RZUZPZ41n/hrOQB6h0Hhg8I367FNoEHgeM/KY7szSeQwD8q2WE3HM35ZLl0K1MJiOtHIkBclRQUwZnyOWcNsRQQgVLj1PSqkjF9DsoOSaSg3iinKzvfmgsNFFfpP/2T3GLGvL4fHEfwIX1sVvXcPqLztehWGcfn9nI2U9nTfCgJPe/jFPLZwgVEzimBgAm0VIyK2tt1cE/AzQdLK+SxLSQ4aDCZnnId94OG2S1XwvnTbNk/ZnhyRCQT+sZM6z9g6LXL1BOBe+zJySiFkHAINCtnQokbCJ/apCv0foqPiZVfhpywAAAAASUVORK5CYII="},"746f":function(t,e,n){var i=n("428f"),o=n("5135"),r=n("e538"),a=n("9bf2").f;t.exports=function(t){var e=i.Symbol||(i.Symbol={});o(e,t)||a(e,t,{value:r.f(t)})}},"75ab":function(t,e,n){"use strict";n("63f0")},"7abd":function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXm9PXq+Pno9vfs+vttWKBGAAACPElEQVQozw3RQWrbQACF4TfCMjPqZgIj4RRaxsZKE0PuMBZ2cLKaCI9RDAXFmJJknUWWI1O1UlamOMHJSjGkuFn3AD2Cr9CepDrAg+/xIxK4QwIqHHQkUhQ/WuphInVIFBojl8QXc012Tgq4RTtVHWVLZVFh1tEoI91uiN4joCqde8Ukn/zGM1B2W4ari2PtTwyw55Ld+Wways54qhGPyS6FzbIT3lIY8WwWdCq56Yolx6KmSKzoqrsCB5heAp4TGNQWJ1Pc6XlE5jQD5OlIX9I47A9uiUQcPQxcury/ToyxWJG/za6ki88crxKPocKS59Sl3EtBG7C89fCGflpfqoSzCeC4crioJA7F0V5+8MaSIk4qSCdwzpogmbqzEirVpGiS2dOVJvUuuqFEmhHao06KEpq+8lvHI14NJk3Qrmi9vBuRLwAz0qZB4hsDXQFXgtnlpDX3C6ug9BquSw/CYtwAzuTz5vuQNdr/YibhR68378ehZH30FSpjh71LpQkrsj+Q062h5WwZ5wlRoD6uQJy1DqvSYuCUapMBqT5YA4ZFw4KlWapxoUGlKWrx0eDQvmigu4WMYt97ruru98fYL8/0lG6CTOFcFWBhFK5gKw19h2JN808nh7xhkU6sWKLXdtkqBL6h+lULK5k19wFB/FldnGYf3LDeuf6IC2/MzJOSOP0qPxLqzaGIqtBcFIItrstkazONOkrc1D1czjuwEGESB4JJnjgSMN7PXAu7fZQpl1C236C+9mM4Af8P98Ch4R2TRl8AAAAASUVORK5CYII="},"802e":function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEUWGBkYGhsdHyAfISI1t/v6AAAB5ElEQVQozxXQsYoTURSA4f/EeycZsDgDdySDjihk38Hy3GWi2J2BCaziQhaiaB+tt9AFu1kwvYUPsIXNPoB9BAUfwAfwEUzKv/v4odGrroyp9/rUaC6rZ5skv5F8qPsfYYP+yKUMymmAEEeW55oUR4o8jr05KNzJ07yvB7w0KKfLwcQUSjfmMU0PJfPHFoEVU+ohNrcKMEzMQ23FDnVSI2dqtYWI7KlLu6vE4UnyvKc3SJuL7lBbeEEl42ItpGLjzIT8PRJCmkRjVpVpsbJFVN0687okJNZiHAr5Z7MV0BnGIDc+THM1zlbieBc1Fq+tH5BH+OpnbWkj40hSqC8Lw2TvFuF0SUFJCk2IytXbjeqcRAt6NHpnrUkUU4KRzZs8RCK8N/Akn2W04LwxMU/V7XK0bDyN2RxfDyx7I4h5vjZby72V8UnOWumZL3qtYc+8DTE0siSBMXGhywx2dMYPnQHbxdFZ7deiNGxCCtD/QWnbwDoGhRYPDzUdUA3krjpnkvdAgDN4ddLkEQSov9qjd42HaDjI34gEqS9TUueAk+sc4qg5ws407KQYKs8G1jv4xBlqBVk6cb4dISZIwVi1Jzu4+HLk6lyfUxkXvwy+1Q+4WVdHIhwfybZ6CWVhxMEhShOgsP/HOW0MvZJeFwAAAABJRU5ErkJggg=="},"82da":function(t,e,n){},"8aa5":function(t,e,n){"use strict";var i=n("6547").charAt;t.exports=function(t,e,n){return e+(n?i(t,e).length:1)}},9078:function(t,e,n){"use strict";n("c0bc")},9263:function(t,e,n){"use strict";var i=n("ad6d"),o=n("9f7f"),r=RegExp.prototype.exec,a=String.prototype.replace,s=r,c=function(){var t=/a/,e=/b*/g;return r.call(t,"a"),r.call(e,"a"),0!==t.lastIndex||0!==e.lastIndex}(),l=o.UNSUPPORTED_Y||o.BROKEN_CARET,u=void 0!==/()??/.exec("")[1],A=c||u||l;A&&(s=function(t){var e,n,o,s,A=this,f=l&&A.sticky,d=i.call(A),g=A.source,h=0,p=t;return f&&(d=d.replace("y",""),-1===d.indexOf("g")&&(d+="g"),p=String(t).slice(A.lastIndex),A.lastIndex>0&&(!A.multiline||A.multiline&&"\n"!==t[A.lastIndex-1])&&(g="(?: "+g+")",p=" "+p,h++),n=new RegExp("^(?:"+g+")",d)),u&&(n=new RegExp("^"+g+"$(?!\\s)",d)),c&&(e=A.lastIndex),o=r.call(f?n:A,p),f?o?(o.input=o.input.slice(h),o[0]=o[0].slice(h),o.index=A.lastIndex,A.lastIndex+=o[0].length):A.lastIndex=0:c&&o&&(A.lastIndex=A.global?o.index+o[0].length:e),u&&o&&o.length>1&&a.call(o[0],n,(function(){for(s=1;sr)o.push(arguments[r++]);if(i=e,(d(e)||void 0!==t)&&!st(t))return f(e)||(e=function(t,e){if("function"==typeof i&&(e=i.call(this,t,e)),!st(e))return e}),o[1]=e,q.apply(null,o)}})}G[K][H]||k(G[K],H,G[K].valueOf),M(G,T),D[N]=!0},a640:function(t,e,n){"use strict";var i=n("d039");t.exports=function(t,e){var n=[][t];return!!n&&i((function(){n.call(null,e||function(){throw 1},1)}))}},a7bd:function(t,e,n){},ac1f:function(t,e,n){"use strict";var i=n("23e7"),o=n("9263");i({target:"RegExp",proto:!0,forced:/./.exec!==o},{exec:o})},ae40:function(t,e,n){var i=n("83ab"),o=n("d039"),r=n("5135"),a=Object.defineProperty,s={},c=function(t){throw t};t.exports=function(t,e){if(r(s,t))return s[t];e||(e={});var n=[][t],l=!!r(e,"ACCESSORS")&&e.ACCESSORS,u=r(e,0)?e[0]:c,A=r(e,1)?e[1]:void 0;return s[t]=!!n&&!o((function(){if(l&&!i)return!0;var t={length:-1};l?a(t,1,{enumerable:!0,get:c}):t[1]=1,n.call(t,u,A)}))}},ae55:function(t,e,n){"use strict";n("040c")},b165:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXe3t7a2trc3Nzg4OCXP9lCAAACoklEQVQozwXBzU/TYBwA4N+QEr4CNbSFwcFuowSqMRvEAwShHWAYNsu7dS0dLnGUSWT4kZB4lGzE4VtcwgIDJqcOWLJxcv4BOoQZuCPxSNSD4WSWLJGL8XmAIiyo2RgJ4A1pxQQlOxRAszLTdnPu2oQGb05RC5slJld7ZAIfo4O44Bn1ud59F0BcjnYOa17Jhwc6EdiKettncsXjT1f8KUBZUW41pK0Jc1Az4dEV3rkkPBtDSZ83Blyt0kSf2PRjzIykoBwINisPbPPtljdVE9iAXRfUPkXLVIgYrCccp5g687NdZbcJ+xa5VE/HhTtT23IKsN5jj/pcUd0dTZNAqCVw72n4gOwnTOC0vvHfaauT8d9zAoRRfPpISZRVyUiw8ELzOG1b2DZpFzkSrHLhq52twDEdyZHwvp2j4uv/bjvOf23/AcEtTuJbY5Cp4YcAer1IGkUzOo2rn8LQOKjFJw3NTw24nprQXY5aF4wxcqcSdbFQ00H4xFl8Drx4X4CikvAM1tuR8bKIBCBoLnKN10KJG4zKAsc7c9WEB9gnCi6BhVjqoco6t20ILAJuVctvaEZK732cRHDRmGfuihOam0o2CHByUZ/epCcVlRs2wmCnMqsd6aSim3ibBJtm1LGyXW3Bb7tJCPlFtUG+SvPdeEUAB60lNdo+VQbLcwRNVtT68FsLcr1+NotgNihlpExS1V2SFgNbeC8bEhgm8sM17wSi6Us2gxVWJU/5GKBpandvfyYbU1yHCLpCgWGbbPXn40rehEsUXKIJr9DMKgICfjc4bl1YfvUhE/YIECGRqjCxSM9hrybAIkND5OeWfFZsXkxB+qDzb7pUQ3EfQ3Ml6EChEt3D+iS01VqC7EQ/Z/DuPQcz4yChoFQJce2Qr+NNAv0HxofmpXGqgHkAAAAASUVORK5CYII="},b671:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAD1BMVEX48dr48Nf58tv379X17NJtIBxUAAACFUlEQVQ4y1XRUZakMAgF0Af2AiDWApDZgHZqAV1nZv9rGh7Rj7Y8McUFEg1wvcMESMNVD/neU8Xcaz7nYYkYlYO6Ti82PBI4BvIEg1aj3wKwRvIMgZsUy5LdhCawPFh1sZs4SrlyN9fQKpv8s5dgZ2eLyqqJiu+WkCmUEybXkm3INS01WAiv0PapJ0CZc0SJQUzcWnZYbOOY20iFD8Bk+/j2A3wNxH7GdShFYS5ff237kXh9I9zSkQmIAhOsOSVfJ6DIXTMDaPnzkRJ92S1BQQmXl5LdirgRLLDdcYqcGPwe3QN4xCBiGNbrqq9wpW1XCecChwaQdVOsRDpPCpeoolPdxeXp3WNB9PHVzWBHlygy4NJCCrFHREv6bDt0VGwJZASkpONmm1UseGeFKAQexgaAkrfYWl3AGxWOLL2AIMBNbCXpktmS3k3vHeYjGCPBa43wJTurO3ZFVpQSJdAZGLoHTyk1upkjxMEaIxum3iIARcCa5kSkFAW5fi1mUlL9eyOsaanFmOMruwvEdE3ZYzsRSzo5ewRLXyVPPEvknt8ij4DvCg2O7xOgBCUprEzV4z1WekSpUgI8DT2mrnSOXKRfQavwuKA1F+tFnMKdJSUpMA7wQAifWRkMgjUKKZE4lBl6MCM4B1pq1P4uIjDE6Pq6rL0FnW1nIFmta5vrSvq/Ch4tpqG/ZNyyWa5jZPktq81eYv8Bt5s4iFITOp4AAAAASUVORK5CYII="},b727:function(t,e,n){var i=n("0366"),o=n("44ad"),r=n("7b0b"),a=n("50c4"),s=n("65f0"),c=[].push,l=function(t){var e=1==t,n=2==t,l=3==t,u=4==t,A=6==t,f=5==t||A;return function(d,g,h,p){for(var m,v,b=r(d),C=o(b),y=i(g,h,3),S=a(C.length),x=0,B=p||s,I=e?B(d,S):n?B(d,0):void 0;S>x;x++)if((f||x in C)&&(m=C[x],v=y(m,x,b),t))if(e)I[x]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return x;case 2:c.call(I,m)}else if(u)return!1;return A?-1:l||u?u:I}};t.exports={forEach:l(0),map:l(1),filter:l(2),some:l(3),every:l(4),find:l(5),findIndex:l(6)}},c0bc:function(t,e,n){},c84b:function(t,e,n){"use strict";n.r(e);var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"detail-wrapper"},[n("div",{staticClass:"detail"},[n("div",{staticClass:"bar"},[n("el-breadcrumb",{attrs:{separator:"/"}},[n("el-breadcrumb-item",{staticClass:"index",attrs:{to:{path:"/"}}},[t._v("书架")]),n("el-breadcrumb-item",{staticClass:"sub"},[t._v("目录")])],1)],1),n("el-divider"),n("div",{staticClass:"catalog"},t._l(this.$store.state.catalog,(function(e){return n("div",{key:e.index,staticClass:"note",on:{click:function(n){return t.toChapter(e.url,e.title,e.index)}}},[t._v(" "+t._s(e.title)+" ")])})),0)],1)])},o=[],r=n("bc3a"),a=n.n(r),s={data:function(){return{key:"value"}},mounted:function(){var t=this;a.a.get("/getChapterList?url="+encodeURIComponent(sessionStorage.getItem("bookUrl"))).then((function(e){t.$store.commit("setCatalog",e.data.data),sessionStorage.setItem("catalog",JSON.stringify(e.data.data))}),(function(t){throw t}))},methods:{toChapter:function(t,e,n){sessionStorage.setItem("chapterID",n),this.$router.push({path:"/chapter"})}}},c=s,l=(n("5ca7"),n("2877")),u=Object(l["a"])(c,i,o,!1,null,"57115a66",null);e["default"]=u.exports},c975:function(t,e,n){"use strict";var i=n("23e7"),o=n("4d64").indexOf,r=n("a640"),a=n("ae40"),s=[].indexOf,c=!!s&&1/[1].indexOf(1,-0)<0,l=r("indexOf"),u=a("indexOf",{ACCESSORS:!0,1:0});i({target:"Array",proto:!0,forced:c||!l||!u},{indexOf:function(t){return c?s.apply(this,arguments)||0:o(this,t,arguments.length>1?arguments[1]:void 0)}})},ca36:function(t,e,n){"use strict";n("58c8")},cf68:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAD1BMVEXm5ubo6Ojp6enr6+vt7e1FnZagAAACrklEQVQ4yx1SixUbMQgT3AKAFwDcAfzpBN1/qMrJS5w7bCQhC6IGSUGYQJd6Ox9ZPXi1AGJBavhUTT0JjYPGAab9WcDYIxsmlnxkayX8mhxCmKHA75az5cfRbWybEExiu08xDSgGym0mwuf3j4SvHeQxDJJzh2zp4iOlrD8iOb4SXyC1wiOLRTcnrje+nGamFeXVKWkmzbFIPChkmJ6Fg7mBpV8n+JGOVCd4jv1thThkjeQGNeafpeV3rsEWLfyWc8tC9jOv6FQ8rRzHOOVB+jCYEUAJpDvh8xHNFm/Tm5p5lw94Pp3NhtKEfQsGvnXhowdZE73hPwxKvjDd4i4PCdd0fe3W5fO8ktAsUAacLgstpUw60JCiPLg2XpkgiqPIYYXJd9ksGIT3q+LlevypzItvO+s0F1dBzVr2QDMUkYmuyGcrIS44mVJ7JVKwQXjYuBYp0Uetecbswzsikzu3gUR8bJC/C8Gd/NAzI/xdUGOYQQHDZ8X2d5XuzGRUiXAi9si5CRgoiToRZPtzLJkd0FUHRHZwJf0BHT1sE7gcnh0jmKKlSSF4/GBirGk5+K9NKlGDCfc9JtPhg78JdabH0YQRKNZnJ8tFnPfXHJb4xum1TTCeEmyEdbyEJLjznMLHuFD2Y9NEkSleIBs7SiCbblhgctVi9ch++kDYnn1C9DA5TvdPsToXM55wI6k+8eKT1blwPTqWb5CFJ+7dTBmab+KHy+xwNtItXhZNSpHD2fxnynrxG3ZBKRe8KBpXk11AnadlccEhr9w1nBBvBylNkv7A8eqpGBCDqhitmWQXBjjdS6idr/QjXWLDeMzMbVDoJuM8zN7WenMZWXgZ2vX3F01J3jHZbwk1LRP+DWEvDJtOUoh/AIaBUz5VpWyhuyx4QtgL/NmgC6kM/JvNe+R/C/5aL7BKIbYAAAAASUVORK5CYII="},d0e3:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXh7eHl8eXj7+Pn8+eTbH1KAAACPElEQVQozxWPQWrbQABF/0xn3JFKQRTZOIuUsbCCbOgdRoYEOauxkYPcTRyTlPQWIxEltrsRwQ6hK9nEQek6F+gNTE/Q3qLLusv34cN7SH3mFicdYW4gNIhJWXPBRVXzjcFD0IqeU4o4PRbAIVjyico0vJpIifqPfL80QN9DAQY5ucRHE/hpHxBldXe9GilaHKcKMlj6pho2zXgkNdBl0oJ8kiF1DSiJF1ZHBJkQr0Dbux/5I42Zp4cFahJDFGeW6/QjBwmFY/Q7vZ2SnoOdW2parv/Cnm81+m0xrEfiVXQ3W4nOXIqVYi3l6AAQBwMFkViVBANMto4enXHPNTkHBB0oVj4r5vHzCWayrgBvxtygDlDB2CNDjd80ZInY69aKVYZcfJ8DW+fWuc+syEODALx+ojqoafHsthTI+ZW27PGpIeo/cR6YKcbqIuIFhHmBrzAovzIOOJk1ucvcDzrMRYGVBH2yvcAOf0KiKwfRovBI3tm/kW1eemtfNWwIIXE2mJNhvoszfmMBfRCv0OPwd2321uDW3nx2q/BDxFVeoN1g7a6Im8yRnoawa8kbdXnU0cHeTMxKfZGlJgvLb3sKsxgglQnDdAfvj9LUnqWRDo0GiUmPwyU7TAsD7wHeIW3Nfy1qVGKoE9NgJCdYCAexNRob9yCn4DAQmXtQuUtera6bEmTTXhZy6h856xi4mnEl6BI9mfISkLbtJyZIMJIAUd5ZOBEu88KRAk71yxfItj/hpIB0Errv4gO1os4/UICf+o3kkqwAAAAASUVORK5CYII="},d28b:function(t,e,n){var i=n("746f");i("iterator")},d784:function(t,e,n){"use strict";n("ac1f");var i=n("6eeb"),o=n("d039"),r=n("b622"),a=n("9263"),s=n("9112"),c=r("species"),l=!o((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")})),u=function(){return"$0"==="a".replace(/./,"$0")}(),A=r("replace"),f=function(){return!!/./[A]&&""===/./[A]("a","$0")}(),d=!o((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));t.exports=function(t,e,n,A){var g=r(t),h=!o((function(){var e={};return e[g]=function(){return 7},7!=""[t](e)})),p=h&&!o((function(){var e=!1,n=/a/;return"split"===t&&(n={},n.constructor={},n.constructor[c]=function(){return n},n.flags="",n[g]=/./[g]),n.exec=function(){return e=!0,null},n[g](""),!e}));if(!h||!p||"replace"===t&&(!l||!u||f)||"split"===t&&!d){var m=/./[g],v=n(g,""[t],(function(t,e,n,i,o){return e.exec===a?h&&!o?{done:!0,value:m.call(e,n,i)}:{done:!0,value:t.call(n,e,i)}:{done:!1}}),{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),b=v[0],C=v[1];i(String.prototype,t,b),i(RegExp.prototype,g,2==e?function(t,e){return C.call(t,this,e)}:function(t){return C.call(t,this)})}A&&s(RegExp.prototype[g],"sham",!0)}},d81d:function(t,e,n){"use strict";var i=n("23e7"),o=n("b727").map,r=n("1dde"),a=n("ae40"),s=r("map"),c=a("map");i({target:"Array",proto:!0,forced:!s||!c},{map:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},ddb0:function(t,e,n){var i=n("da84"),o=n("fdbc"),r=n("e260"),a=n("9112"),s=n("b622"),c=s("iterator"),l=s("toStringTag"),u=r.values;for(var A in o){var f=i[A],d=f&&f.prototype;if(d){if(d[c]!==u)try{a(d,c,u)}catch(h){d[c]=u}if(d[l]||a(d,l,A),o[A])for(var g in r)if(d[g]!==r[g])try{a(d,g,r[g])}catch(h){d[g]=r[g]}}}},df5e:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAATlBMVEXdzaHh0KPgz6LdzKDezqLczJ7ezZ/fz6Dcy5zi0aXdzZ3fz6Tfz57h0KDg0aLcyZrg0KXi0qPfzZ3j06bh0qbdyJbfzJrhz5/cxpLZwo0vDconAAAFn0lEQVRIxxyPW5LjMAwDAT5FybLl2JnM3P+i6+wXWVC1GoQGaD0h4XM3Q5o4T0HgABHBi6pZ4CDXXcUOFd6VhqC3Kch4EI8w9oMXwvU6m5LOOvcxKMOhuu8i5+5cMjcgb0t4F2uvOoeI3/MlT4IqsbtM9UG2AGSXUOsxzPevnXzK1CSHytZLvx7VdQmUcJsJCxJh2nmHW12Qod1qPjt8pih47uQ9aGpoNWF+yElCt60oH7vdIU/MnlRPSBLC/VwqxcKR8PFqnADN9ih5ufqnTlG9KwCofvs7kKYqOPHTNMQ93j9qNImFw9vjHPZ0F1m8hUUVB/Q/TrRYDMXr9++APMFARAt6sPh6wVAXzxUGhZsFUwCNfPZ8/72TAHebAhvuOuT3gO1Vn5d9Jd5sBRkg0p2seL9B7ulkjFJFIt9HPpLzdSzzMP3UcodAfMqC6pBuET2heHK1itZf1GZ1bi0BwOSxiCS8f/JBHMPMM4XCu3Mt1uz9lJbDJRqsKDZuikzkvskQEz6hanfDfO494azY5JpqPqOF1RhxD9XYEdaNxiqWqakKgmPfmrsta8KAiwF4HBxGVUJAgeSqQaiRRZJ7D2jedhw5t1CIAKxag0CBA60BpoBE6DcUi8O5AuM4pLfN0kHLmeu2B4e6HofqbgxsTWUw3PAODqa1oDtyzgXBlusi1KFdclMPE8O3jvLJ8RNi5/RxDQVzVmXA233XQ4KummunfxvLOZo+iH37964YjP06995CTdu9hsvErqJNzmf4wTrZ5DL7+qW9EoLnadrx67b8dUtrJnBXaT1N1uvPaYRKpWkq52xNsMN7vv4Sdryt/f4MhQoMCKnvVxikai1CQ6ZsnwJDc8+3Y/z8HcfvYQNq66pnAu1Hwa+3KNSwbNu8h3nDPqTl9fl7tx8fBhFfdS0o0F3JUKEZtZG9b/LZEM95lzaR30OnWPzroMxyZYdBIMoMnpN0J+m7/40+/P4soFSUjgzE7yY5zrMJuoZv0CmpVguYx1pprfb5HOviRVhHUVi/352shxCYrYBZxGtVaxiAz/MsaGSIsB7R1t4zJXH//n7RTTQQwxqcGEqEvklFHUgiO2GvJV+jAIPR+N29usWDoiSOVrN3XuqT1egQJAAU9EwslVJC8u0rGcy+WPqktJhjfMpatIG6CDAb0v5H34MGKqiVRue7GGLZ9Otxtt4JIrAhxBDwDuqI9JavcO0A7GlqFt219tH/bln9jBXzaKWAEqJV0CBxs5TwM8EvUPHaa8S86vN303MVWOsl3goDBHPWSoQ9c0kQmCKljfsKNH1+ofEOHW8a9a7glZGS8fPieL/SRSs0LAhI4FDTnXs1QYtubv2+IXPZpHB4bhivRexBkYKsSrYXNjvMUbVXpVJ+N6haV72c1k2zrnv5IYBMJBYTSZx0KTkoM3vY93rU/qs7zHplc/3d2ACadhFWByrn9LUk2IWb5JywvawTQc3F0iz+lgsBmInAIemBJtft2plKIlAFOgcroigrG2XlDsAzywQECNyaI8yr2ogoh7D4qJOYmZBzQgoZAM1PAcB8sDrr1uE5CDMR+nWSSVUGUCHAs8Vd21HOE0FzNj37pX0sLp9p3K8k++xxpkmzDxK64rmTSJnDUuIgTeslui6lg92jonZXI4jqNiUuzN4IagcKMjCniMGCODoo8T4tGDprn2hRww+NrnYiCwokd9iiWrkmbRfXYGLAoZrjO1lVQKExjUy5fIkgJURmz2uGFdASwwlWx5gDVTMK7hP6ISRVsFbYNmqtZL9MQtio285PaekyzDhZmtdexCYB0SZcTmBdhvdbmAEonk8hwcHQuZN1kVqrhyKoHHsnQhQAjF7SG533Da2S4LGjx1LoZqp7XeKQLDUBmYmydG0NQHpMeR5lRIRQc1PQ2ASMQflF4YBDMt0/GFlEHeRwCcEAAAAASUVORK5CYII="},e01a:function(t,e,n){"use strict";var i=n("23e7"),o=n("83ab"),r=n("da84"),a=n("5135"),s=n("861d"),c=n("9bf2").f,l=n("e893"),u=r.Symbol;if(o&&"function"==typeof u&&(!("description"in u.prototype)||void 0!==u().description)){var A={},f=function(){var t=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),e=this instanceof f?new u(t):void 0===t?u():u(t);return""===t&&(A[e]=!0),e};l(f,u);var d=f.prototype=u.prototype;d.constructor=f;var g=d.toString,h="Symbol(test)"==String(u("test")),p=/^Symbol\((.*)\)[^)]+$/;c(d,"description",{configurable:!0,get:function(){var t=s(this)?this.valueOf():this,e=g.call(t);if(a(A,t))return"";var n=h?e.slice(7,-1):e.replace(p,"$1");return""===n?void 0:n}}),i({global:!0,forced:!0},{Symbol:f})}},e160:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEX6+fP8+/X+/ff///kbczPAAAACeElEQVQozxXHQUgUUQAG4P8936yzs6VvZNZmN9QxVxiF9OLBoOjtOC6rQq6ygXjI2fCQBdXBg4egtzFGdqkoI+zgBFbqkm3hQSxhFYLotOcubeKhOnVYoqQy+m4f5g5TvpX0xHLbLY9j8SMhJp+Jk4LfAUS2kVRIjILmnwGBTX42PhCVlDJQkIiy2nWAvaJ1h+oFIpJ0hMSYVbyyrgDWshcMpMyL1brPDQKWmduO+KTJ6XeXAMK9Yc3FpD7atyNwg6kt5XgFpLPhjUTFSYVn2abDiugGShwD8JTVRJVo/2ecuKtRb/qc4BK+9TboFfokog4T2Fn6Oqdnsjk90NMS76Rji6E0NmwkPBAZ4Xbkw8KoDAkAbEhkc78e9omxxgxg6qa5HvMv+UZbCV0qmHnSHKl5TxeA2XTCGWekR581mwC5crBH81PznASqB9va3TbkYAjJPLfg5uBfXaJgIgIBv9eessRIhxe7PA7kj6uUMeMaQ/OEQOYRaaHlqH2Gxwsl6E/pwVY5FH7uCypBZPKvDQyVziYBrAkMURe2MOOOxG/eQpp5PF+bFzUV5HtPj9GeiVSNZDELleifYTp9NAjsoiXg4cW+4ZORkdSMB/B74aAdjhsVakhgkugsbmqcDSLEoWp8zRjrux3tli6Q5uM3E+maT99Wy0RiP7tboiuRZle2c6CYeL2kcUc1KvPtQKucogMadKVTQOJYCeyCYlhQQ/Q7Etfd/vBygy9iqy+LyHeF46saCYvW6ingsbA9RBWtdi8GgUXW+oQx9/wP6bAAX1TWeV+CbShZDlQ9xT6SoSxZmKRAkmXb60kzEzkRF+Ccb94BGspGJoN/UzmyR4wjXHAAAAAASUVORK5CYII="},e538:function(t,e,n){var i=n("b622");e.f=i},e8b5:function(t,e,n){var i=n("c6b6");t.exports=Array.isArray||function(t){return"Array"==i(t)}},ec0f:function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAALVBMVEXx58b168ny6Mjz6sn06sf27Mvw5sTz6cbw5cLy58T37svv47/168v37s7t4Ltrv0//AAAEjUlEQVQ4yw2Ty2sTURxGf3dmOqmPxb0zmaStCnfmZpL6gpmbxIpUSMZGrSJkxsZiVZimNVaqMklrUnWTRq2KIDFWWx+IFrIRFxXEB4KIgqu6EBdu7M6FIPg32PW3+DhwDmBaYrK56KP4HGIsvg/uvOV0wK+qgBMlO9BujuH4DSJlOseqV5a/BEF97gt0ChyIPqBhXI9BtqtIB8vJB/LdCQ3OVjaLNX0g7+OmoI4e7nkemAqX6o8vg0yyQAyQS7IfgvFbI+6QyI3R4KELxw7kwM2ooQfyQigYnwY5MZbMlHI1DvnQVCoVcrt+R+bO7vPDif3ybNajwqAAe443dpfDsPt379VMWZzGRuqM79mQF+DUz9nt74bQ8J/O80MtVR51U02JKKmTCvTzLVf+vuxP/aHnPo9+2bW+zVsJ0Y630/CrfzX+b+UL+7O68Rczv+7lrMh5etfKXvhc2rk6KforxuoO2xB2tcxKfeXHt18rHOiHI/0RRjW/YGRDkHiwo3nzqL60o58C/bgRuaj7vk+QOwOhpnFNdjuWpKMCGP8Yapu9Ty5FTHKQLGSEFikjd9ADwP9ciaNNjc5qMH6w50AF/LKOsOYqsOG9GjKgc7ZXolqntm6fysJ6Ma6ll2CiqmOgE6O7x1wXExklbeqMYcwsmJmOoigt8SBg2WfilDSsAZJcBxDcrqtBXzFQJqZNHfscyIhoZlygAtyYAceah+elrFbI+46gEHDGiW878Kj7JpWyfhg6iyRMymV1MKBSeVpfgLHIohyTojI6sRyK1VpcqzVZeEBLOnA9unhGKUXPJDYtV9Dxuz4iA5xSkSWhCJdAiJR9PHlvfvbntbrR14FDqUNRAYDJmSnv3oKxuz5+7fiblgVJyYLTbgUM05P7LESkoXvyWNfb0aUU6FZizgQIa25VqKQZqFrk6v6BsqqIHlQmkQ9KrBhkC20/DrFsAFEEYLjM+lj2wYHXCwnNvZQR42XJ2iVK+UBXnI+OBE6oXpUUHiQ1yg0MhA03iwGbnOdQYc1CMiPIPQrCQJFH4L4BMFktAtKd9PN5gnU2Gra4KuK+V+mjtBRpAGIqDVe4wnSnajiFGO5d7smvhVQEMEYwqshrENIEaY7YeblJYtsb3QhAHWZCEKK67swwPMKw0If1Ta+6DgHmlgPzcUTSbi3rrv1Y64/BYEMPQ5SDHUOR022B4QRF6xLUPAaPX/V4IDI5N2BMwx4LqO1uO4j6uW7NvM7lATqGAxY/ZHVgoGZbu7SvkNR75x6qGSB23FdouENVwN7sCbewTdsXGrrnQ5ZZKOCOFtMTIzxlPu6eYmtL+nMFmoK7OeXajn86r9sqWbfmvHC4IagE5qfCPGZvLSq5F55hHIxJFa4/vRxHBlz0og4TojU1l/MOHJX17lybdF0mQhFO44JYUNt3UA473IXw/iPfDWtKG5oFSXIF5iU/VnyDSjxxeDk3jAXRyVyGTNB9FxH9qcFDNJpVbt2y9LytUXkK7Py6+z1RezHQqnoY8XcLimmd8dCnBhQCuaGpJCq3SoIlmYvLz8UkWhJw7T8k+Db/DYEKwgAAAABJRU5ErkJggg=="},fdbc:function(t,e){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}}}]); \ No newline at end of file diff --git a/app/src/main/assets/web/new/precache-manifest.00f143f3962d167b482bfdc0fc9c4e77.js b/app/src/main/assets/web/new/precache-manifest.591d552208e3dedf905ccfa69870ce16.js similarity index 65% rename from app/src/main/assets/web/new/precache-manifest.00f143f3962d167b482bfdc0fc9c4e77.js rename to app/src/main/assets/web/new/precache-manifest.591d552208e3dedf905ccfa69870ce16.js index 253229785..0ee5baa4b 100644 --- a/app/src/main/assets/web/new/precache-manifest.00f143f3962d167b482bfdc0fc9c4e77.js +++ b/app/src/main/assets/web/new/precache-manifest.591d552208e3dedf905ccfa69870ce16.js @@ -1,18 +1,18 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ { - "revision": "414c7503fa98c3f2e328", + "revision": "12386c7dce7d463af4ed", "url": "css/about.dbe575e1.css" }, { - "revision": "13925596cfa342cbb55d", + "revision": "d761b0dee902b1105e91", "url": "css/app.e4c919b7.css" }, { - "revision": "d53f06b957b78ddb78b7", + "revision": "16ab934214be8df372e3", "url": "css/chunk-vendors.ad4ff18f.css" }, { - "revision": "0607c99f49945c348397", + "revision": "4083fbb292940cf804ca", "url": "css/detail.b4324411.css" }, { @@ -40,28 +40,28 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "img/noCover.b5c48bc1.jpeg" }, { - "revision": "8ff165c058a9618dc10065e65133a4e7", + "revision": "bc7efb33b2dbae4d4578e3657e73de4b", "url": "index.html" }, { - "revision": "414c7503fa98c3f2e328", - "url": "js/about.d8b0dc91.js" + "revision": "12386c7dce7d463af4ed", + "url": "js/about.4300b5ad.js" }, { - "revision": "2c81bd893f3a92f018d8", - "url": "js/about~detail.1caf6ef5.js" + "revision": "2828d7869f38c2483b33", + "url": "js/about~detail.c1b29cbc.js" }, { - "revision": "13925596cfa342cbb55d", - "url": "js/app.d60dad33.js" + "revision": "d761b0dee902b1105e91", + "url": "js/app.acf50eba.js" }, { - "revision": "d53f06b957b78ddb78b7", - "url": "js/chunk-vendors.060eee33.js" + "revision": "16ab934214be8df372e3", + "url": "js/chunk-vendors.1042cf7f.js" }, { - "revision": "0607c99f49945c348397", - "url": "js/detail.6a5cc86c.js" + "revision": "4083fbb292940cf804ca", + "url": "js/detail.4d0609e7.js" }, { "revision": "b46d04eb43bc31ca0f9f95121646440d", diff --git a/app/src/main/assets/web/new/service-worker.js b/app/src/main/assets/web/new/service-worker.js index 3584a617a..dbf3d73ba 100755 --- a/app/src/main/assets/web/new/service-worker.js +++ b/app/src/main/assets/web/new/service-worker.js @@ -14,7 +14,7 @@ importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); importScripts( - "precache-manifest.00f143f3962d167b482bfdc0fc9c4e77.js" + "precache-manifest.591d552208e3dedf905ccfa69870ce16.js" ); workbox.core.setCacheNameDetails({prefix: "yd-web-tool"}); diff --git a/app/src/main/java/io/legado/app/App.kt b/app/src/main/java/io/legado/app/App.kt index 6b48a7499..6345cf1b1 100644 --- a/app/src/main/java/io/legado/app/App.kt +++ b/app/src/main/java/io/legado/app/App.kt @@ -5,58 +5,33 @@ import android.app.NotificationManager import android.content.Context import android.content.res.Configuration import android.os.Build -import android.provider.Settings -import androidx.appcompat.app.AppCompatDelegate import androidx.multidex.MultiDexApplication import com.jeremyliao.liveeventbus.LiveEventBus import io.legado.app.constant.AppConst import io.legado.app.constant.AppConst.channelIdDownload import io.legado.app.constant.AppConst.channelIdReadAloud import io.legado.app.constant.AppConst.channelIdWeb -import io.legado.app.constant.EventBus -import io.legado.app.data.AppDatabase -import io.legado.app.help.* +import io.legado.app.help.ActivityHelp +import io.legado.app.help.AppConfig +import io.legado.app.help.CrashHandler +import io.legado.app.help.ThemeConfig.applyDayNight import io.legado.app.help.http.HttpHelper import io.legado.app.utils.LanguageUtils -import io.legado.app.utils.postEvent -import org.jetbrains.anko.defaultSharedPreferences +import io.legado.app.utils.defaultSharedPreferences import rxhttp.wrapper.param.RxHttp -@Suppress("DEPRECATION") class App : MultiDexApplication() { - companion object { - @JvmStatic - lateinit var INSTANCE: App - private set - - @JvmStatic - lateinit var db: AppDatabase - private set - - lateinit var androidId: String - var versionCode = 0 - var versionName = "" - var navigationBarHeight = 0 - } - override fun onCreate() { super.onCreate() - INSTANCE = this - androidId = Settings.System.getString(contentResolver, Settings.Secure.ANDROID_ID) CrashHandler(this) LanguageUtils.setConfiguration(this) - db = AppDatabase.createDatabase(INSTANCE) RxHttp.init(HttpHelper.client, BuildConfig.DEBUG) RxHttp.setOnParamAssembly { it.addHeader(AppConst.UA_NAME, AppConfig.userAgent) } - packageManager.getPackageInfo(packageName, 0)?.let { - versionCode = it.versionCode - versionName = it.versionName - } createNotificationChannels() - applyDayNight() + applyDayNight(this) LiveEventBus.config() .supportBroadcast(this) .lifecycleObserverAlwaysActive(true) @@ -69,27 +44,10 @@ class App : MultiDexApplication() { super.onConfigurationChanged(newConfig) when (newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK) { Configuration.UI_MODE_NIGHT_YES, - Configuration.UI_MODE_NIGHT_NO -> applyDayNight() + Configuration.UI_MODE_NIGHT_NO -> applyDayNight(this) } } - fun applyDayNight() { - ReadBookConfig.upBg() - ThemeConfig.applyTheme(this) - initNightMode() - postEvent(EventBus.RECREATE, "") - } - - private fun initNightMode() { - val targetMode = - if (AppConfig.isNightTheme) { - AppCompatDelegate.MODE_NIGHT_YES - } else { - AppCompatDelegate.MODE_NIGHT_NO - } - AppCompatDelegate.setDefaultNightMode(targetMode) - } - /** * 创建通知ID */ @@ -99,7 +57,7 @@ class App : MultiDexApplication() { val downloadChannel = NotificationChannel( channelIdDownload, getString(R.string.action_download), - NotificationManager.IMPORTANCE_LOW + NotificationManager.IMPORTANCE_DEFAULT ).apply { enableLights(false) enableVibration(false) @@ -109,7 +67,7 @@ class App : MultiDexApplication() { val readAloudChannel = NotificationChannel( channelIdReadAloud, getString(R.string.read_aloud), - NotificationManager.IMPORTANCE_LOW + NotificationManager.IMPORTANCE_DEFAULT ).apply { enableLights(false) enableVibration(false) @@ -119,7 +77,7 @@ class App : MultiDexApplication() { val webChannel = NotificationChannel( channelIdWeb, getString(R.string.web_service), - NotificationManager.IMPORTANCE_LOW + NotificationManager.IMPORTANCE_DEFAULT ).apply { enableLights(false) enableVibration(false) @@ -131,4 +89,8 @@ class App : MultiDexApplication() { } } + companion object { + var navigationBarHeight = 0 + } + } diff --git a/app/src/main/java/io/legado/app/api/controller/BookshelfController.kt b/app/src/main/java/io/legado/app/api/controller/BookshelfController.kt index c8e878f0f..82005aac2 100644 --- a/app/src/main/java/io/legado/app/api/controller/BookshelfController.kt +++ b/app/src/main/java/io/legado/app/api/controller/BookshelfController.kt @@ -1,8 +1,8 @@ package io.legado.app.api.controller -import io.legado.app.App import io.legado.app.api.ReturnData import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.help.BookHelp import io.legado.app.model.webBook.WebBook @@ -12,17 +12,18 @@ import io.legado.app.utils.cnCompare import io.legado.app.utils.fromJsonObject import io.legado.app.utils.getPrefInt import kotlinx.coroutines.runBlocking +import splitties.init.appCtx object BookshelfController { val bookshelf: ReturnData get() { - val books = App.db.bookDao.all + val books = appDb.bookDao.all val returnData = ReturnData() return if (books.isEmpty()) { returnData.setErrorMsg("还没有添加小说") } else { - val data = when (App.INSTANCE.getPrefInt(PreferKey.bookshelfSort)) { + val data = when (appCtx.getPrefInt(PreferKey.bookshelfSort)) { 1 -> books.sortedByDescending { it.latestChapterTime } 2 -> books.sortedWith { o1, o2 -> o1.name.cnCompare(o2.name) @@ -40,7 +41,7 @@ object BookshelfController { if (bookUrl.isNullOrEmpty()) { return returnData.setErrorMsg("参数url不能为空,请指定书籍地址") } - val chapterList = App.db.bookChapterDao.getChapterList(bookUrl) + val chapterList = appDb.bookChapterDao.getChapterList(bookUrl) return returnData.setData(chapterList) } @@ -54,8 +55,8 @@ object BookshelfController { if (index == null) { return returnData.setErrorMsg("参数index不能为空, 请指定目录序号") } - val book = App.db.bookDao.getBook(bookUrl) - val chapter = App.db.bookChapterDao.getChapter(bookUrl, index) + val book = appDb.bookDao.getBook(bookUrl) + val chapter = appDb.bookChapterDao.getChapter(bookUrl, index) if (book == null || chapter == null) { returnData.setErrorMsg("未找到") } else { @@ -64,7 +65,7 @@ object BookshelfController { saveBookReadIndex(book, index) returnData.setData(content) } else { - App.db.bookSourceDao.getBookSource(book.origin)?.let { source -> + appDb.bookSourceDao.getBookSource(book.origin)?.let { source -> runBlocking { WebBook(source).getContentAwait(this, book, chapter) }.let { @@ -81,7 +82,7 @@ object BookshelfController { val book = GSON.fromJsonObject(postData) val returnData = ReturnData() if (book != null) { - App.db.bookDao.insert(book) + appDb.bookDao.insert(book) if (ReadBook.book?.bookUrl == book.bookUrl) { ReadBook.book = book ReadBook.durChapterIndex = book.durChapterIndex @@ -95,10 +96,10 @@ object BookshelfController { if (index > book.durChapterIndex) { book.durChapterIndex = index book.durChapterTime = System.currentTimeMillis() - App.db.bookChapterDao.getChapter(book.bookUrl, index)?.let { + appDb.bookChapterDao.getChapter(book.bookUrl, index)?.let { book.durChapterTitle = it.title } - App.db.bookDao.update(book) + appDb.bookDao.update(book) if (ReadBook.book?.bookUrl == book.bookUrl) { ReadBook.book = book ReadBook.durChapterIndex = index diff --git a/app/src/main/java/io/legado/app/api/controller/SourceController.kt b/app/src/main/java/io/legado/app/api/controller/SourceController.kt index 6dc142804..3972295e5 100644 --- a/app/src/main/java/io/legado/app/api/controller/SourceController.kt +++ b/app/src/main/java/io/legado/app/api/controller/SourceController.kt @@ -2,8 +2,8 @@ package io.legado.app.api.controller import android.text.TextUtils -import io.legado.app.App import io.legado.app.api.ReturnData +import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonArray @@ -14,7 +14,7 @@ object SourceController { val sources: ReturnData get() { - val bookSources = App.db.bookSourceDao.all + val bookSources = appDb.bookSourceDao.all val returnData = ReturnData() return if (bookSources.isEmpty()) { returnData.setErrorMsg("设备书源列表为空") @@ -29,7 +29,7 @@ object SourceController { if (TextUtils.isEmpty(bookSource.bookSourceName) || TextUtils.isEmpty(bookSource.bookSourceUrl)) { returnData.setErrorMsg("书源名称和URL不能为空") } else { - App.db.bookSourceDao.insert(bookSource) + appDb.bookSourceDao.insert(bookSource) returnData.setData("") } } else { @@ -50,7 +50,7 @@ object SourceController { if (bookSource.bookSourceName.isBlank() || bookSource.bookSourceUrl.isBlank()) { continue } - App.db.bookSourceDao.insert(bookSource) + appDb.bookSourceDao.insert(bookSource) okSources.add(bookSource) } } @@ -64,7 +64,7 @@ object SourceController { if (url.isNullOrEmpty()) { return returnData.setErrorMsg("参数url不能为空,请指定书源地址") } - val bookSource = App.db.bookSourceDao.getBookSource(url) + val bookSource = appDb.bookSourceDao.getBookSource(url) ?: return returnData.setErrorMsg("未找到书源,请检查书源地址") return returnData.setData(bookSource) } @@ -73,7 +73,7 @@ object SourceController { kotlin.runCatching { GSON.fromJsonArray(postData)?.let { it.forEach { source -> - App.db.bookSourceDao.delete(source) + appDb.bookSourceDao.delete(source) } } } diff --git a/app/src/main/java/io/legado/app/base/BaseActivity.kt b/app/src/main/java/io/legado/app/base/BaseActivity.kt index 4f1124ae4..31deca8e4 100644 --- a/app/src/main/java/io/legado/app/base/BaseActivity.kt +++ b/app/src/main/java/io/legado/app/base/BaseActivity.kt @@ -16,6 +16,7 @@ import io.legado.app.R import io.legado.app.constant.AppConst import io.legado.app.constant.Theme import io.legado.app.help.AppConfig +import io.legado.app.help.ThemeConfig import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.ThemeStore import io.legado.app.lib.theme.backgroundColor @@ -151,6 +152,11 @@ abstract class BaseActivity( ATH.applyBackgroundTint(window.decorView) } } + if (AppConfig.isGooglePlay) { + ThemeConfig.getBgImage(this)?.let { + window.decorView.background = it + } + } } private fun setupSystemBar() { diff --git a/app/src/main/java/io/legado/app/base/BaseViewModel.kt b/app/src/main/java/io/legado/app/base/BaseViewModel.kt index e5432e204..88ddc4b5e 100644 --- a/app/src/main/java/io/legado/app/base/BaseViewModel.kt +++ b/app/src/main/java/io/legado/app/base/BaseViewModel.kt @@ -6,15 +6,13 @@ import androidx.annotation.CallSuper import androidx.lifecycle.AndroidViewModel import io.legado.app.App import io.legado.app.help.coroutine.Coroutine +import io.legado.app.utils.toastOnUi import kotlinx.coroutines.* -import org.jetbrains.anko.AnkoLogger -import org.jetbrains.anko.toast import kotlin.coroutines.CoroutineContext @Suppress("unused") open class BaseViewModel(application: Application) : AndroidViewModel(application), - CoroutineScope by MainScope(), - AnkoLogger { + CoroutineScope by MainScope() { val context: Context by lazy { this.getApplication() } @@ -40,27 +38,12 @@ open class BaseViewModel(application: Application) : AndroidViewModel(applicatio cancel() } - open fun toast(message: Int) { - launch { - context.toast(message) - } + open fun toastOnUi(message: Int) { + context.toastOnUi(message) } - open fun toast(message: CharSequence?) { - launch { - context.toast(message ?: toString()) - } + open fun toastOnUi(message: CharSequence?) { + context.toastOnUi(message ?: toString()) } - open fun longToast(message: Int) { - launch { - context.toast(message) - } - } - - open fun longToast(message: CharSequence?) { - launch { - context.toast(message ?: toString()) - } - } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/base/adapter/DiffRecyclerAdapter.kt b/app/src/main/java/io/legado/app/base/adapter/DiffRecyclerAdapter.kt index 60d3600ed..2575ea067 100644 --- a/app/src/main/java/io/legado/app/base/adapter/DiffRecyclerAdapter.kt +++ b/app/src/main/java/io/legado/app/base/adapter/DiffRecyclerAdapter.kt @@ -8,6 +8,7 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding +import splitties.views.onLongClick /** * Created by Invincible on 2017/12/15. @@ -130,10 +131,10 @@ abstract class DiffRecyclerAdapter(protected val context } if (itemLongClickListener != null) { - holder.itemView.setOnLongClickListener { + holder.itemView.onLongClick { getItem(holder.layoutPosition)?.let { - itemLongClickListener?.invoke(holder, it) ?: true - } ?: true + itemLongClickListener?.invoke(holder, it) + } } } diff --git a/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt b/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt index 0d6e3b668..11dd17f8c 100644 --- a/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt +++ b/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt @@ -8,6 +8,7 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding +import splitties.views.onLongClick import java.util.* /** @@ -351,10 +352,10 @@ abstract class RecyclerAdapter(protected val context: Co } if (itemLongClickListener != null) { - holder.itemView.setOnLongClickListener { + holder.itemView.onLongClick { getItem(holder.layoutPosition)?.let { - itemLongClickListener?.invoke(holder, it) ?: true - } ?: true + itemLongClickListener?.invoke(holder, it) + } } } diff --git a/app/src/main/java/io/legado/app/constant/AppConst.kt b/app/src/main/java/io/legado/app/constant/AppConst.kt index 07257a46c..69036d5d0 100644 --- a/app/src/main/java/io/legado/app/constant/AppConst.kt +++ b/app/src/main/java/io/legado/app/constant/AppConst.kt @@ -1,8 +1,8 @@ package io.legado.app.constant import android.annotation.SuppressLint -import io.legado.app.App import io.legado.app.R +import splitties.init.appCtx import java.text.SimpleDateFormat import javax.script.ScriptEngine import javax.script.ScriptEngineManager @@ -68,5 +68,12 @@ object AppConst { "androidx.appcompat.view.menu.ListMenuItemView" ) - val sysElevation = App.INSTANCE.resources.getDimension(R.dimen.design_appbar_elevation).toInt() + val sysElevation = appCtx.resources.getDimension(R.dimen.design_appbar_elevation).toInt() + + val darkWebViewJs by lazy { + """ + document.body.style.backgroundColor = "#222222"; + document.getElementsByTagName('body')[0].style.webkitTextFillColor = '#8a8a8a'; + """.trimIndent() + } } diff --git a/app/src/main/java/io/legado/app/constant/Const.kt b/app/src/main/java/io/legado/app/constant/Const.kt new file mode 100644 index 000000000..b3500a2ae --- /dev/null +++ b/app/src/main/java/io/legado/app/constant/Const.kt @@ -0,0 +1,30 @@ +package io.legado.app.constant + +import android.provider.Settings +import splitties.init.appCtx + +val androidId: String by lazy { + Settings.System.getString(appCtx.contentResolver, Settings.Secure.ANDROID_ID) +} + +val appInfo: AppInfo by lazy { + val appInfo = AppInfo() + appCtx.packageManager.getPackageInfo(appCtx.packageName, 0)?.let { + appInfo.versionName = it.versionName + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) { + appInfo.versionCode = it.longVersionCode + } else { + @Suppress("DEPRECATION") + appInfo.versionCode = it.versionCode.toLong() + } + } + appInfo +} + +val charsets = + arrayListOf("UTF-8", "GB2312", "GB18030", "GBK", "Unicode", "UTF-16", "UTF-16LE", "ASCII") + +data class AppInfo( + var versionCode: Long = 0L, + var versionName: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index b8cbedf1c..e9801a743 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -39,7 +39,7 @@ object PreferKey { const val webDavAccount = "web_dav_account" const val webDavPassword = "web_dav_password" const val webDavCreateDir = "webDavCreateDir" - const val webDavCacheBackup = "webDavCacheBackup" + const val exportToWebDav = "webDavCacheBackup" const val changeSourceLoadToc = "changeSourceLoadToc" const val changeSourceLoadInfo = "changeSourceLoadInfo" const val chineseConverterType = "chineseConverterType" @@ -65,6 +65,11 @@ object PreferKey { const val screenOrientation = "screenOrientation" const val syncBookProgress = "syncBookProgress" const val preDownload = "preDownload" + const val autoRefresh = "auto_refresh" + const val defaultToRead = "defaultToRead" + const val exportCharset = "exportCharset" + const val exportUseReplace = "exportUseReplace" + const val useZhLayout = "useZhLayout" const val cPrimary = "colorPrimary" const val cAccent = "colorAccent" diff --git a/app/src/main/java/io/legado/app/constant/Theme.kt b/app/src/main/java/io/legado/app/constant/Theme.kt index 896e73ea0..8145f4d01 100644 --- a/app/src/main/java/io/legado/app/constant/Theme.kt +++ b/app/src/main/java/io/legado/app/constant/Theme.kt @@ -4,16 +4,18 @@ import io.legado.app.help.AppConfig import io.legado.app.utils.ColorUtils enum class Theme { - Dark, Light, Auto, Transparent; + Dark, Light, Auto, Transparent, EInk; companion object { - fun getTheme() = - if (AppConfig.isNightTheme) Dark - else Light + fun getTheme() = when { + AppConfig.isEInkMode -> EInk + AppConfig.isNightTheme -> Dark + else -> Light + } fun getTheme(backgroundColor: Int) = if (ColorUtils.isColorLight(backgroundColor)) Light else Dark - + } } \ No newline at end of file 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 315793633..a1e9db1a1 100644 --- a/app/src/main/java/io/legado/app/data/AppDatabase.kt +++ b/app/src/main/java/io/legado/app/data/AppDatabase.kt @@ -6,20 +6,24 @@ import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase -import io.legado.app.App import io.legado.app.constant.AppConst +import io.legado.app.constant.androidId import io.legado.app.data.dao.* import io.legado.app.data.entities.* +import splitties.init.appCtx import java.util.* +val appDb by lazy { + AppDatabase.createDatabase(appCtx) +} @Database( entities = [Book::class, BookGroup::class, BookSource::class, BookChapter::class, ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class, RssSource::class, Bookmark::class, RssArticle::class, RssReadRecord::class, RssStar::class, TxtTocRule::class, ReadRecord::class, HttpTTS::class, Cache::class, - RuleSub::class], - version = 28, + RuleSub::class, EpubChapter::class], + version = 30, exportSchema = true ) abstract class AppDatabase : RoomDatabase() { @@ -36,11 +40,12 @@ abstract class AppDatabase : RoomDatabase() { abstract val rssArticleDao: RssArticleDao abstract val rssStarDao: RssStarDao abstract val cookieDao: CookieDao - abstract val txtTocRule: TxtTocRuleDao + abstract val txtTocRuleDao: TxtTocRuleDao abstract val readRecordDao: ReadRecordDao abstract val httpTTSDao: HttpTTSDao abstract val cacheDao: CacheDao abstract val ruleSubDao: RuleSubDao + abstract val epubChapterDao: EpubChapterDao companion object { @@ -54,7 +59,7 @@ abstract class AppDatabase : RoomDatabase() { migration_14_15, migration_15_17, migration_17_18, migration_18_19, migration_19_20, migration_20_21, migration_21_22, migration_22_23, migration_23_24, migration_24_25, migration_25_26, migration_26_27, - migration_27_28 + migration_27_28, migration_28_29, migration_29_30 ) .allowMainThreadQueries() .addCallback(dbCallback) @@ -151,7 +156,7 @@ abstract class AppDatabase : RoomDatabase() { """CREATE TABLE IF NOT EXISTS `readRecordNew` (`androidId` TEXT NOT NULL, `bookName` TEXT NOT NULL, `readTime` INTEGER NOT NULL, PRIMARY KEY(`androidId`, `bookName`))""" ) - database.execSQL("INSERT INTO readRecordNew(androidId, bookName, readTime) select '${App.androidId}' as androidId, bookName, readTime from readRecord") + database.execSQL("INSERT INTO readRecordNew(androidId, bookName, readTime) select '${androidId}' as androidId, bookName, readTime from readRecord") database.execSQL("DROP TABLE readRecord") database.execSQL("ALTER TABLE readRecordNew RENAME TO readRecord") } @@ -251,6 +256,28 @@ abstract class AppDatabase : RoomDatabase() { database.execSQL("ALTER TABLE rssStars ADD variable TEXT") } } + + private val migration_28_29 = object : Migration(28, 29) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE rssSources ADD sourceComment TEXT") + } + } + + private val migration_29_30 = object : Migration(29, 30) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE chapters ADD `startFragmentId` TEXT") + database.execSQL("ALTER TABLE chapters ADD `endFragmentId` TEXT") + database.execSQL( + """ + CREATE TABLE IF NOT EXISTS `epubChapters` + (`bookUrl` TEXT NOT NULL, `href` TEXT NOT NULL, `parentHref` TEXT, + PRIMARY KEY(`bookUrl`, `href`), FOREIGN KEY(`bookUrl`) REFERENCES `books`(`bookUrl`) ON UPDATE NO ACTION ON DELETE CASCADE ) + """ + ) + database.execSQL("CREATE INDEX IF NOT EXISTS `index_epubChapters_bookUrl` ON `epubChapters` (`bookUrl`)") + database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `index_epubChapters_bookUrl_href` ON `epubChapters` (`bookUrl`, `href`)") + } + } } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/dao/BookGroupDao.kt b/app/src/main/java/io/legado/app/data/dao/BookGroupDao.kt index 6bf596905..34e6a3e88 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookGroupDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookGroupDao.kt @@ -19,7 +19,7 @@ interface BookGroupDao { @Query( """ - SELECT * FROM book_groups where groupId >= 0 + SELECT * FROM book_groups where (groupId >= 0 and show > 0) or (groupId = -4 and show > 0 and (select count(bookUrl) from books where type != ${BookType.audio} and origin != '${BookType.local}' and ((SELECT sum(groupId) FROM book_groups where groupId > 0) & `group`) = 0) > 0) or (groupId = -3 and show > 0 and (select count(bookUrl) from books where type = ${BookType.audio}) > 0) or (groupId = -2 and show > 0 and (select count(bookUrl) from books where origin = '${BookType.local}') > 0) diff --git a/app/src/main/java/io/legado/app/data/dao/EpubChapterDao.kt b/app/src/main/java/io/legado/app/data/dao/EpubChapterDao.kt new file mode 100644 index 000000000..cf2f66d2a --- /dev/null +++ b/app/src/main/java/io/legado/app/data/dao/EpubChapterDao.kt @@ -0,0 +1,32 @@ +package io.legado.app.data.dao + +import androidx.room.* +import io.legado.app.data.entities.EpubChapter + +@Dao +interface EpubChapterDao { + @get:Query("select * from epubChapters") + val all: List + + @Query("select count(*) from epubChapters Where bookUrl = :bookUrl") + fun getCnt(bookUrl: String): Int + + @Query("select * from epubChapters Where bookUrl = :bookUrl and parentHref = :parentHref ") + fun get(bookUrl: String, parentHref: String): List + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(vararg chapter: EpubChapter) + + @Query("delete from epubChapters") + fun clear() + + @Query("delete from epubChapters Where bookUrl = :bookUrl") + fun deleteByName(bookUrl: String) + + @Delete + fun delete(vararg chapter: EpubChapter) + + @Update + fun update(vararg chapter: EpubChapter) + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index 2b30a8538..5093c05c1 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/app/src/main/java/io/legado/app/data/entities/Book.kt @@ -2,9 +2,9 @@ package io.legado.app.data.entities import android.os.Parcelable import androidx.room.* -import io.legado.app.App import io.legado.app.constant.AppPattern import io.legado.app.constant.BookType +import io.legado.app.data.appDb import io.legado.app.help.AppConfig import io.legado.app.service.help.ReadBook import io.legado.app.utils.GSON @@ -146,6 +146,31 @@ data class Book( config().pageAnim = pageAnim } + fun getImageStyle(): String? { + return config().imageStyle + } + + fun setImageStyle(imageStyle: String?) { + config().imageStyle = imageStyle + } + + fun getDelParagraph(): Int { + return config().delParagraph + } + + fun setDelParagraph(num: Int) { + config().delParagraph = num + } + + fun setDelTag(tag: Long) { + config().delTag = + if ((config().delTag and tag) == tag) config().delTag and tag.inv() else config().delTag or tag + } + + fun getDelTag(tag: Long): Boolean { + return config().delTag and tag == tag + } + fun getFolderName(): String { //防止书名过长,只取9位 var folderName = name.replace(AppPattern.fileNameRegex, "") @@ -182,14 +207,14 @@ data class Book( newBook.canUpdate = canUpdate newBook.readConfig = readConfig delete() - App.db.bookDao.insert(newBook) + appDb.bookDao.insert(newBook) } fun delete() { if (ReadBook.book?.bookUrl == bookUrl) { ReadBook.book = null } - App.db.bookDao.delete(this) + appDb.bookDao.delete(this) } fun upInfoFromOld(oldBook: Book?) { @@ -207,11 +232,23 @@ data class Book( } } + companion object { + const val hTag = 2L + const val rubyTag = 4L + const val imgTag = 8L + const val imgStyleDefault = "DEFAULT" + const val imgStyleFull = "FULL" + const val imgStyleText = "TEXT" + } + @Parcelize data class ReadConfig( var pageAnim: Int = -1, var reSegment: Boolean = false, - var useReplaceRule: Boolean = AppConfig.replaceEnableDefault, // 正文使用净化替换规则 + var imageStyle: String? = null, + var useReplaceRule: Boolean = AppConfig.replaceEnableDefault,// 正文使用净化替换规则 + var delParagraph: Int = 0,//去除段首 + var delTag: Long = 0L,//去除标签 ) : Parcelable class Converters { diff --git a/app/src/main/java/io/legado/app/data/entities/BookChapter.kt b/app/src/main/java/io/legado/app/data/entities/BookChapter.kt index ea97c94f8..bdf56417c 100644 --- a/app/src/main/java/io/legado/app/data/entities/BookChapter.kt +++ b/app/src/main/java/io/legado/app/data/entities/BookChapter.kt @@ -37,6 +37,8 @@ data class BookChapter( var tag: String? = null, // var start: Long? = null, // 章节起始位置 var end: Long? = null, // 章节终止位置 + var startFragmentId: String? = null, //EPUB书籍当前章节的fragmentId + var endFragmentId: String? = null, //EPUB书籍下一章节的fragmentId var variable: String? = null //变量 ) : Parcelable { diff --git a/app/src/main/java/io/legado/app/data/entities/BookSource.kt b/app/src/main/java/io/legado/app/data/entities/BookSource.kt index b439fb367..8f5adc182 100644 --- a/app/src/main/java/io/legado/app/data/entities/BookSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/BookSource.kt @@ -3,7 +3,6 @@ package io.legado.app.data.entities import android.os.Parcelable import android.text.TextUtils import androidx.room.* -import io.legado.app.App import io.legado.app.constant.AppConst import io.legado.app.constant.BookType import io.legado.app.data.entities.rule.* @@ -16,6 +15,7 @@ import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonObject import io.legado.app.utils.splitNotBlank import kotlinx.parcelize.Parcelize +import splitties.init.appCtx import javax.script.SimpleBindings @Parcelize @@ -105,8 +105,10 @@ data class BookSource( var a = urlRule if (a.isNotBlank()) { kotlin.runCatching { - if (urlRule.startsWith("", false)) { - val aCache = ACache.get(App.INSTANCE, "explore") + if (urlRule.startsWith("", false) + || urlRule.startsWith("@js", false) + ) { + val aCache = ACache.get(appCtx, "explore") a = aCache.getAsString(bookSourceUrl) ?: "" if (a.isBlank()) { val bindings = SimpleBindings() @@ -114,10 +116,12 @@ data class BookSource( bindings["java"] = this bindings["cookie"] = CookieStore bindings["cache"] = CacheManager - a = AppConst.SCRIPT_ENGINE.eval( - urlRule.substring(4, urlRule.lastIndexOf("<")), - bindings - ).toString() + val jsStr = if (urlRule.startsWith("@")) { + urlRule.substring(3) + } else { + urlRule.substring(4, urlRule.lastIndexOf("<")) + } + a = AppConst.SCRIPT_ENGINE.eval(jsStr, bindings).toString() aCache.put(bookSourceUrl, a) } } diff --git a/app/src/main/java/io/legado/app/data/entities/EpubChapter.kt b/app/src/main/java/io/legado/app/data/entities/EpubChapter.kt new file mode 100644 index 000000000..390b63a64 --- /dev/null +++ b/app/src/main/java/io/legado/app/data/entities/EpubChapter.kt @@ -0,0 +1,23 @@ +package io.legado.app.data.entities + +import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.Index + +@Entity( + tableName = "epubChapters", + primaryKeys = ["bookUrl", "href"], + indices = [(Index(value = ["bookUrl"], unique = false)), + (Index(value = ["bookUrl", "href"], unique = true))], + foreignKeys = [(ForeignKey( + entity = Book::class, + parentColumns = ["bookUrl"], + childColumns = ["bookUrl"], + onDelete = ForeignKey.CASCADE + ))] +) +data class EpubChapter( + var bookUrl: String = "", + var href: String = "", + var parentHref: String? = null, +) \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/RssSource.kt b/app/src/main/java/io/legado/app/data/entities/RssSource.kt index 9fe33e039..5c3280812 100644 --- a/app/src/main/java/io/legado/app/data/entities/RssSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/RssSource.kt @@ -9,9 +9,11 @@ import io.legado.app.help.AppConfig import io.legado.app.help.CacheManager import io.legado.app.help.JsExtensions import io.legado.app.help.http.CookieStore +import io.legado.app.utils.ACache import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonObject import kotlinx.parcelize.Parcelize +import splitties.init.appCtx import java.util.* import javax.script.SimpleBindings @@ -23,6 +25,7 @@ data class RssSource( var sourceName: String = "", var sourceIcon: String = "", var sourceGroup: String? = null, + var sourceComment: String? = null, var enabled: Boolean = true, var sortUrl: String? = null, var singleUrl: Boolean = false, @@ -104,9 +107,30 @@ data class RssSource( return a == b || (a.isNullOrEmpty() && b.isNullOrEmpty()) } - fun sortUrls(): LinkedHashMap = - linkedMapOf().apply { - sortUrl?.split("(&&|\n)+".toRegex())?.forEach { c -> + fun sortUrls(): LinkedHashMap = linkedMapOf().apply { + kotlin.runCatching { + var a = sortUrl + if (sortUrl?.startsWith("", false) == true + || sortUrl?.startsWith("@js", false) == true + ) { + val aCache = ACache.get(appCtx, "rssSortUrl") + a = aCache.getAsString(sourceUrl) ?: "" + if (a.isBlank()) { + val bindings = SimpleBindings() + bindings["baseUrl"] = sourceUrl + bindings["java"] = this + bindings["cookie"] = CookieStore + bindings["cache"] = CacheManager + val jsStr = if (sortUrl!!.startsWith("@")) { + sortUrl!!.substring(3) + } else { + sortUrl!!.substring(4, sortUrl!!.lastIndexOf("<")) + } + a = AppConst.SCRIPT_ENGINE.eval(jsStr, bindings).toString() + aCache.put(sourceUrl, a) + } + } + a?.split("(&&|\n)+".toRegex())?.forEach { c -> val d = c.split("::") if (d.size > 1) this[d[0]] = d[1] @@ -115,4 +139,5 @@ data class RssSource( this[""] = sourceUrl } } + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/AppConfig.kt b/app/src/main/java/io/legado/app/help/AppConfig.kt index 1c5c10a72..a0d2dff56 100644 --- a/app/src/main/java/io/legado/app/help/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/AppConfig.kt @@ -2,52 +2,52 @@ package io.legado.app.help import android.content.Context import android.content.SharedPreferences -import io.legado.app.App -import io.legado.app.R import io.legado.app.constant.AppConst import io.legado.app.constant.PreferKey import io.legado.app.utils.* +import splitties.init.appCtx @Suppress("MemberVisibilityCanBePrivate") object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { - private val context get() = App.INSTANCE - val isGooglePlay = context.channel == "google" + val isGooglePlay = appCtx.channel == "google" var userAgent: String = getPrefUserAgent() - var replaceEnableDefault = context.getPrefBoolean(PreferKey.replaceEnableDefault, true) - var isEInkMode = context.getPrefString(PreferKey.themeMode) == "3" - var clickActionTL = context.getPrefInt(PreferKey.clickActionTL, 2) - var clickActionTC = context.getPrefInt(PreferKey.clickActionTC, 2) - var clickActionTR = context.getPrefInt(PreferKey.clickActionTR, 1) - var clickActionML = context.getPrefInt(PreferKey.clickActionML, 2) - var clickActionMC = context.getPrefInt(PreferKey.clickActionMC, 0) - var clickActionMR = context.getPrefInt(PreferKey.clickActionMR, 1) - var clickActionBL = context.getPrefInt(PreferKey.clickActionBL, 2) - var clickActionBC = context.getPrefInt(PreferKey.clickActionBC, 1) - var clickActionBR = context.getPrefInt(PreferKey.clickActionBR, 1) + var replaceEnableDefault = appCtx.getPrefBoolean(PreferKey.replaceEnableDefault, true) + var isEInkMode = appCtx.getPrefString(PreferKey.themeMode) == "3" + var clickActionTL = appCtx.getPrefInt(PreferKey.clickActionTL, 2) + var clickActionTC = appCtx.getPrefInt(PreferKey.clickActionTC, 2) + var clickActionTR = appCtx.getPrefInt(PreferKey.clickActionTR, 1) + var clickActionML = appCtx.getPrefInt(PreferKey.clickActionML, 2) + var clickActionMC = appCtx.getPrefInt(PreferKey.clickActionMC, 0) + var clickActionMR = appCtx.getPrefInt(PreferKey.clickActionMR, 1) + var clickActionBL = appCtx.getPrefInt(PreferKey.clickActionBL, 2) + var clickActionBC = appCtx.getPrefInt(PreferKey.clickActionBC, 1) + var clickActionBR = appCtx.getPrefInt(PreferKey.clickActionBR, 1) override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { when (key) { - PreferKey.themeMode -> isEInkMode = context.getPrefString(PreferKey.themeMode) == "3" + PreferKey.themeMode -> isEInkMode = appCtx.getPrefString(PreferKey.themeMode) == "3" PreferKey.clickActionTL -> clickActionTL = - context.getPrefInt(PreferKey.clickActionTL, 2) + appCtx.getPrefInt(PreferKey.clickActionTL, 2) PreferKey.clickActionTC -> clickActionTC = - context.getPrefInt(PreferKey.clickActionTC, 2) + appCtx.getPrefInt(PreferKey.clickActionTC, 2) PreferKey.clickActionTR -> clickActionTR = - context.getPrefInt(PreferKey.clickActionTR, 2) + appCtx.getPrefInt(PreferKey.clickActionTR, 2) PreferKey.clickActionML -> clickActionML = - context.getPrefInt(PreferKey.clickActionML, 2) + appCtx.getPrefInt(PreferKey.clickActionML, 2) PreferKey.clickActionMC -> clickActionMC = - context.getPrefInt(PreferKey.clickActionMC, 2) + appCtx.getPrefInt(PreferKey.clickActionMC, 2) PreferKey.clickActionMR -> clickActionMR = - context.getPrefInt(PreferKey.clickActionMR, 2) + appCtx.getPrefInt(PreferKey.clickActionMR, 2) PreferKey.clickActionBL -> clickActionBL = - context.getPrefInt(PreferKey.clickActionBL, 2) + appCtx.getPrefInt(PreferKey.clickActionBL, 2) PreferKey.clickActionBC -> clickActionBC = - context.getPrefInt(PreferKey.clickActionBC, 2) + appCtx.getPrefInt(PreferKey.clickActionBC, 2) PreferKey.clickActionBR -> clickActionBR = - context.getPrefInt(PreferKey.clickActionBR, 2) + appCtx.getPrefInt(PreferKey.clickActionBR, 2) PreferKey.readBodyToLh -> ReadBookConfig.readBodyToLh = - context.getPrefBoolean(PreferKey.readBodyToLh, true) + appCtx.getPrefBoolean(PreferKey.readBodyToLh, true) + PreferKey.useZhLayout -> ReadBookConfig.useZhLayout = + appCtx.getPrefBoolean(PreferKey.useZhLayout) PreferKey.userAgent -> userAgent = getPrefUserAgent() } } @@ -62,97 +62,123 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var isNightTheme: Boolean - get() = isNightTheme(context) + get() = isNightTheme(appCtx) set(value) { if (isNightTheme != value) { if (value) { - context.putPrefString(PreferKey.themeMode, "2") + appCtx.putPrefString(PreferKey.themeMode, "2") } else { - context.putPrefString(PreferKey.themeMode, "1") + appCtx.putPrefString(PreferKey.themeMode, "1") } } } val isTransparentStatusBar: Boolean - get() = context.getPrefBoolean(PreferKey.transparentStatusBar, true) + get() = appCtx.getPrefBoolean(PreferKey.transparentStatusBar, true) val immNavigationBar: Boolean - get() = context.getPrefBoolean(PreferKey.immNavigationBar, true) + get() = appCtx.getPrefBoolean(PreferKey.immNavigationBar, true) val screenOrientation: String? - get() = context.getPrefString(PreferKey.screenOrientation) + get() = appCtx.getPrefString(PreferKey.screenOrientation) var backupPath: String? - get() = context.getPrefString(PreferKey.backupPath) + get() = appCtx.getPrefString(PreferKey.backupPath) set(value) { if (value.isNullOrEmpty()) { - context.removePref(PreferKey.backupPath) + appCtx.removePref(PreferKey.backupPath) } else { - context.putPrefString(PreferKey.backupPath, value) + appCtx.putPrefString(PreferKey.backupPath, value) } } val isShowRSS: Boolean - get() = context.getPrefBoolean(PreferKey.showRss, true) + get() = appCtx.getPrefBoolean(PreferKey.showRss, true) val autoRefreshBook: Boolean - get() = context.getPrefBoolean(R.string.pk_auto_refresh) + get() = appCtx.getPrefBoolean(PreferKey.autoRefresh) var threadCount: Int - get() = context.getPrefInt(PreferKey.threadCount, 16) + get() = appCtx.getPrefInt(PreferKey.threadCount, 16) set(value) { - context.putPrefInt(PreferKey.threadCount, value) + appCtx.putPrefInt(PreferKey.threadCount, value) } var importBookPath: String? - get() = context.getPrefString("importBookPath") + get() = appCtx.getPrefString("importBookPath") set(value) { if (value == null) { - context.removePref("importBookPath") + appCtx.removePref("importBookPath") } else { - context.putPrefString("importBookPath", value) + appCtx.putPrefString("importBookPath", value) } } var ttsSpeechRate: Int - get() = context.getPrefInt(PreferKey.ttsSpeechRate, 5) + get() = appCtx.getPrefInt(PreferKey.ttsSpeechRate, 5) set(value) { - context.putPrefInt(PreferKey.ttsSpeechRate, value) + appCtx.putPrefInt(PreferKey.ttsSpeechRate, value) } var chineseConverterType: Int - get() = context.getPrefInt(PreferKey.chineseConverterType) + get() = appCtx.getPrefInt(PreferKey.chineseConverterType) set(value) { - context.putPrefInt(PreferKey.chineseConverterType, value) + appCtx.putPrefInt(PreferKey.chineseConverterType, value) } var systemTypefaces: Int - get() = context.getPrefInt(PreferKey.systemTypefaces) + get() = appCtx.getPrefInt(PreferKey.systemTypefaces) set(value) { - context.putPrefInt(PreferKey.systemTypefaces, value) + appCtx.putPrefInt(PreferKey.systemTypefaces, value) } var elevation: Int - get() = context.getPrefInt(PreferKey.barElevation, AppConst.sysElevation) + get() = appCtx.getPrefInt(PreferKey.barElevation, AppConst.sysElevation) set(value) { - context.putPrefInt(PreferKey.barElevation, value) + appCtx.putPrefInt(PreferKey.barElevation, value) + } + + var exportCharset: String + get() { + val c = appCtx.getPrefString(PreferKey.exportCharset) + if (c.isNullOrBlank()) { + return "UTF-8" + } + return c + } + set(value) { + appCtx.putPrefString(PreferKey.exportCharset, value) + } + + var exportUseReplace: Boolean + get() = appCtx.getPrefBoolean(PreferKey.exportUseReplace, true) + set(value) { + appCtx.putPrefBoolean(PreferKey.exportUseReplace, value) + } + + var exportToWebDav: Boolean + get() = appCtx.getPrefBoolean(PreferKey.exportToWebDav) + set(value) { + appCtx.putPrefBoolean(PreferKey.exportToWebDav, value) } val autoChangeSource: Boolean - get() = context.getPrefBoolean(PreferKey.autoChangeSource, true) + get() = appCtx.getPrefBoolean(PreferKey.autoChangeSource, true) + + val changeSourceLoadInfo get() = appCtx.getPrefBoolean(PreferKey.changeSourceLoadToc) - val changeSourceLoadInfo get() = context.getPrefBoolean(PreferKey.changeSourceLoadToc) + val changeSourceLoadToc get() = appCtx.getPrefBoolean(PreferKey.changeSourceLoadToc) - val changeSourceLoadToc get() = context.getPrefBoolean(PreferKey.changeSourceLoadToc) + val importKeepName get() = appCtx.getPrefBoolean(PreferKey.importKeepName) - val importKeepName get() = context.getPrefBoolean(PreferKey.importKeepName) + val syncBookProgress get() = appCtx.getPrefBoolean(PreferKey.syncBookProgress, true) - val syncBookProgress get() = context.getPrefBoolean(PreferKey.syncBookProgress, true) + val preDownload get() = appCtx.getPrefBoolean(PreferKey.preDownload, true) - val preDownload get() = context.getPrefBoolean(PreferKey.preDownload, true) + val mediaButtonOnExit get() = appCtx.getPrefBoolean("mediaButtonOnExit", true) private fun getPrefUserAgent(): String { - val ua = context.getPrefString(PreferKey.userAgent) + val ua = appCtx.getPrefString(PreferKey.userAgent) if (ua.isNullOrBlank()) { return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" } diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index c8fad6f6e..69ea5ff42 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -1,8 +1,8 @@ package io.legado.app.help -import io.legado.app.App 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.coroutine.Coroutine @@ -11,6 +11,7 @@ import io.legado.app.model.localBook.LocalBook import io.legado.app.utils.* import kotlinx.coroutines.delay import org.apache.commons.text.similarity.JaccardSimilarity +import splitties.init.appCtx import java.io.File import java.util.concurrent.CopyOnWriteArraySet import java.util.regex.Matcher @@ -22,7 +23,7 @@ import kotlin.math.min object BookHelp { private const val cacheFolderName = "book_cache" private const val cacheImageFolderName = "images" - private val downloadDir: File = App.INSTANCE.externalFilesDir + private val downloadDir: File = appCtx.externalFilesDir private val downloadImages = CopyOnWriteArraySet() fun clearCache() { @@ -42,7 +43,7 @@ object BookHelp { fun clearRemovedCache() { Coroutine.async { val bookFolderNames = arrayListOf() - App.db.bookDao.all.forEach { + appDb.bookDao.all.forEach { bookFolderNames.add(it.getFolderName()) } val file = FileUtils.getFile(downloadDir, cacheFolderName) @@ -147,7 +148,7 @@ object BookHelp { fun getChapterFiles(book: Book): List { val fileNameList = arrayListOf() - if (book.isLocalBook()) { + if (book.isLocalTxt()) { return fileNameList } FileUtils.createFolderIfNotExist( @@ -161,7 +162,7 @@ object BookHelp { // 检测该章节是否下载 fun hasContent(book: Book, bookChapter: BookChapter): Boolean { - return if (book.isLocalBook()) { + return if (book.isLocalTxt()) { true } else { FileUtils.exists( @@ -174,8 +175,19 @@ object BookHelp { } fun getContent(book: Book, bookChapter: BookChapter): String? { - if (book.isLocalBook()) { + if (book.isLocalTxt()) { return LocalBook.getContext(book, bookChapter) + } else if (book.isEpub() && !hasContent(book, bookChapter)) { + val string = LocalBook.getContext(book, bookChapter) + string?.let { + FileUtils.createFileIfNotExist( + downloadDir, + cacheFolderName, + book.getFolderName(), + bookChapter.getFileName(), + ).writeText(it) + } + return string } else { val file = FileUtils.getFile( downloadDir, @@ -190,8 +202,27 @@ object BookHelp { return null } + fun reverseContent(book: Book, bookChapter: BookChapter) { + if (!book.isLocalBook()) { + val file = FileUtils.getFile( + downloadDir, + cacheFolderName, + book.getFolderName(), + bookChapter.getFileName() + ) + if (file.exists()) { + val text = file.readText() + val stringBuilder = StringBuilder() + text.toStringArray().forEach { + stringBuilder.insert(0, it) + } + file.writeText(stringBuilder.toString()) + } + } + } + fun delContent(book: Book, bookChapter: BookChapter) { - if (book.isLocalBook()) { + if (book.isLocalTxt()) { return } else { FileUtils.createFileIfNotExist( diff --git a/app/src/main/java/io/legado/app/help/CacheManager.kt b/app/src/main/java/io/legado/app/help/CacheManager.kt index f7cb1ba5b..6194a6175 100644 --- a/app/src/main/java/io/legado/app/help/CacheManager.kt +++ b/app/src/main/java/io/legado/app/help/CacheManager.kt @@ -1,9 +1,10 @@ package io.legado.app.help -import io.legado.app.App +import io.legado.app.data.appDb import io.legado.app.data.entities.Cache import io.legado.app.model.analyzeRule.QueryTTF import io.legado.app.utils.ACache +import splitties.init.appCtx @Suppress("unused") object CacheManager { @@ -19,16 +20,16 @@ object CacheManager { if (saveTime == 0) 0 else System.currentTimeMillis() + saveTime * 1000 when (value) { is QueryTTF -> queryTTFMap[key] = Pair(deadline, value) - is ByteArray -> ACache.get(App.INSTANCE).put(key, value, saveTime) + is ByteArray -> ACache.get(appCtx).put(key, value, saveTime) else -> { val cache = Cache(key, value.toString(), deadline) - App.db.cacheDao.insert(cache) + appDb.cacheDao.insert(cache) } } } fun get(key: String): String? { - return App.db.cacheDao.get(key, System.currentTimeMillis()) + return appDb.cacheDao.get(key, System.currentTimeMillis()) } fun getInt(key: String): Int? { @@ -48,7 +49,7 @@ object CacheManager { } fun getByteArray(key: String): ByteArray? { - return ACache.get(App.INSTANCE).getAsBinary(key) + return ACache.get(appCtx).getAsBinary(key) } fun getQueryTTF(key: String): QueryTTF? { diff --git a/app/src/main/java/io/legado/app/help/ContentHelp.kt b/app/src/main/java/io/legado/app/help/ContentHelp.kt index 9c2b612bb..70b4cb634 100644 --- a/app/src/main/java/io/legado/app/help/ContentHelp.kt +++ b/app/src/main/java/io/legado/app/help/ContentHelp.kt @@ -17,22 +17,8 @@ object ContentHelp { */ fun reSegment(content: String, chapterName: String): String { var content1 = content - val content2: String - val chapterNameLength = chapterName.trim { it <= ' ' }.length - content2 = if (chapterNameLength > 1) { - val regexp = - chapterName.trim { it <= ' ' }.replace("\\s+".toRegex(), "(\\\\s*)") - // 质量较低的页面,章节内可能重复出现章节标题 - if (chapterNameLength > 5) content1.replace(regexp.toRegex(), "") - .trim { it <= ' ' } else content1.replaceFirst( - "^\\s*" + regexp.toRegex(), - "" - ).trim { it <= ' ' } - } else { - content1 - } - val dict = makeDict(content2) - var p = content2 + val dict = makeDict(content1) + var p = content1 .replace(""".toRegex(), "“") .replace("[::]['\"‘”“]+".toRegex(), ":“") .replace("[\"”“]+[\\s]*[\"”“][\\s\"”“]*".toRegex(), "”\n“") @@ -315,14 +301,6 @@ object ContentHelp { if (loop2Mod1 < 0 && loop2Mod2 > 0) { if (match(MARK_SENTENCES_END, string[j])) insN.add(j) } - /* - else if (mod[i - 1] > 0 && mod[i] < 0) { - if (j > 0) { - if (match(MARK_SENTENCES_END, string.charAt(j))) - ins_n.add(j); - } - } - */ loop2Mod1 = loop2Mod2 i++ } @@ -441,28 +419,6 @@ object ContentHelp { insN = ArrayList(HashSet(insN)) insN.sort() -// 输出log进行检验 -/* - System.out.println("quote[i]:position/mod\t" + string); - for (int i = 0; i < array_quote.size(); i++) { - System.out.print(" [" + i + "]" + array_quote.get(i) + "/" + mod[i]); - } - System.out.print("\n"); - - System.out.print("ins_q:"); - for (int i = 0; i < ins_quote.length; i++) { - System.out.print(" " + ins_quote[i]); - } - System.out.print("\n"); - - System.out.print("ins_n:"); - - for (int i : ins_n) { - System.out.print(" " + i); - } - System.out.print("\n"); -*/ - // 完成字符串拼接(从string复制、插入引号和换行 // ins_quote 在引号前插入一个引号。 ins_quote[i]!=0,则array_quote.get(i)的引号前需要前插入'”' // ins_n 插入换行。数组的值表示插入换行符的位置 @@ -626,37 +582,6 @@ object ContentHelp { return -1 } - /** - * 计算字符串与字典的距离。 - * - * @param str 数据字符串 - * @param form 从第几个字符开始匹配 - * @param to 匹配到第几个字符串结束 - * @param inOrder 是否从前向后匹配。 - * @param words 可变长参数构成的字典。每个字符串代表一个字符 - * @return 匹配结果。注意这个距离是使用第一个字符进行计算的 - */ - private fun seekWordsIndex( - str: String, - form: Int, - to: Int, - inOrder: Boolean, - vararg words: String - ): Int { - if (words.isEmpty()) return -2 - val i = seekIndex(str, words[0], form, to, inOrder) - if (i < 0) return i - for (j in 1 until words.size) { - val k = seekIndex(str, words[j], form, to, inOrder) - if (inOrder) { - if (i + j != k) return -3 - } else { - if (i - j != k) return -3 - } - } - return i - } - /* 搜寻引号并进行分段。处理了一、二、五三类常见情况 参照百科词条[引号#应用示例](https://baike.baidu.com/item/%E5%BC%95%E5%8F%B7/998963?#5)对引号内容进行矫正并分句。 一、完整引用说话内容,在反引号内侧有断句标点。例如: diff --git a/app/src/main/java/io/legado/app/help/ContentProcessor.kt b/app/src/main/java/io/legado/app/help/ContentProcessor.kt index c3fa8624d..ab3a60f04 100644 --- a/app/src/main/java/io/legado/app/help/ContentProcessor.kt +++ b/app/src/main/java/io/legado/app/help/ContentProcessor.kt @@ -1,12 +1,13 @@ package io.legado.app.help import com.hankcs.hanlp.HanLP -import io.legado.app.App +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.ReplaceRule +import io.legado.app.utils.toastOnUi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import org.jetbrains.anko.toast +import splitties.init.appCtx class ContentProcessor(private val bookName: String, private val bookOrigin: String) { @@ -19,17 +20,18 @@ class ContentProcessor(private val bookName: String, private val bookOrigin: Str @Synchronized fun upReplaceRules() { replaceRules.clear() - replaceRules.addAll(App.db.replaceRuleDao.findEnabledByScope(bookName, bookOrigin)) + replaceRules.addAll(appDb.replaceRuleDao.findEnabledByScope(bookName, bookOrigin)) } suspend fun getContent( book: Book, title: String, //已经经过简繁转换 content: String, - isRead: Boolean = true + isRead: Boolean = true, + useReplace: Boolean = book.getUseReplaceRule() ): List { var content1 = content - if (book.getUseReplaceRule()) { + if (useReplace) { replaceRules.forEach { item -> if (item.pattern.isNotEmpty()) { try { @@ -40,7 +42,7 @@ class ContentProcessor(private val bookName: String, private val bookOrigin: Str } } catch (e: Exception) { withContext(Dispatchers.Main) { - App.INSTANCE.toast("${item.name}替换出错") + appCtx.toastOnUi("${item.name}替换出错") } } } @@ -57,7 +59,7 @@ class ContentProcessor(private val bookName: String, private val bookOrigin: Str } } catch (e: Exception) { withContext(Dispatchers.Main) { - App.INSTANCE.toast("简繁转换出错") + appCtx.toastOnUi("简繁转换出错") } } } diff --git a/app/src/main/java/io/legado/app/help/CrashHandler.kt b/app/src/main/java/io/legado/app/help/CrashHandler.kt index d54d09a57..b518d276f 100644 --- a/app/src/main/java/io/legado/app/help/CrashHandler.kt +++ b/app/src/main/java/io/legado/app/help/CrashHandler.kt @@ -4,12 +4,11 @@ import android.annotation.SuppressLint import android.content.Context import android.content.pm.PackageManager import android.os.Build -import android.os.Handler -import android.os.Looper import android.util.Log -import android.widget.Toast import io.legado.app.service.help.ReadAloud import io.legado.app.utils.FileUtils +import io.legado.app.utils.longToastOnUi +import io.legado.app.utils.msg import java.io.PrintWriter import java.io.StringWriter import java.text.SimpleDateFormat @@ -26,7 +25,7 @@ class CrashHandler(val context: Context) : Thread.UncaughtExceptionHandler { /** * 系统默认UncaughtExceptionHandler */ - private var mDefaultHandler: Thread.UncaughtExceptionHandler? = null + private var mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler() /** * 存储异常和参数信息 @@ -40,7 +39,6 @@ class CrashHandler(val context: Context) : Thread.UncaughtExceptionHandler { private val format = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss") init { - mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler() //设置该CrashHandler为系统默认的 Thread.setDefaultUncaughtExceptionHandler(this) } @@ -63,18 +61,9 @@ class CrashHandler(val context: Context) : Thread.UncaughtExceptionHandler { collectDeviceInfo(context) //添加自定义信息 addCustomInfo() - kotlin.runCatching { - //使用Toast来显示异常信息 - Handler(Looper.getMainLooper()).post { - Toast.makeText( - context, - ex.message, - Toast.LENGTH_LONG - ).show() - } - } //保存日志文件 saveCrashInfo2File(ex) + context.longToastOnUi(ex.msg) } /** @@ -116,35 +105,33 @@ class CrashHandler(val context: Context) : Thread.UncaughtExceptionHandler { * 保存错误信息到文件中 */ private fun saveCrashInfo2File(ex: Throwable) { - kotlin.runCatching { - val sb = StringBuilder() - for ((key, value) in paramsMap) { - sb.append(key).append("=").append(value).append("\n") - } + val sb = StringBuilder() + for ((key, value) in paramsMap) { + sb.append(key).append("=").append(value).append("\n") + } - val writer = StringWriter() - val printWriter = PrintWriter(writer) - ex.printStackTrace(printWriter) - var cause: Throwable? = ex.cause - while (cause != null) { - cause.printStackTrace(printWriter) - cause = cause.cause - } - printWriter.close() - val result = writer.toString() - sb.append(result) - val timestamp = System.currentTimeMillis() - val time = format.format(Date()) - val fileName = "crash-$time-$timestamp.log" - context.externalCacheDir?.let { rootFile -> - FileUtils.getFile(rootFile, "crash").listFiles()?.forEach { - if (it.lastModified() < System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7)) { - it.delete() - } + val writer = StringWriter() + val printWriter = PrintWriter(writer) + ex.printStackTrace(printWriter) + var cause: Throwable? = ex.cause + while (cause != null) { + cause.printStackTrace(printWriter) + cause = cause.cause + } + printWriter.close() + val result = writer.toString() + sb.append(result) + val timestamp = System.currentTimeMillis() + val time = format.format(Date()) + val fileName = "crash-$time-$timestamp.log" + context.externalCacheDir?.let { rootFile -> + FileUtils.getFile(rootFile, "crash").listFiles()?.forEach { + if (it.lastModified() < System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7)) { + it.delete() } - FileUtils.createFileIfNotExist(rootFile, "crash", fileName) - .writeText(sb.toString()) } + FileUtils.createFileIfNotExist(rootFile, "crash", fileName) + .writeText(sb.toString()) } } diff --git a/app/src/main/java/io/legado/app/help/DefaultData.kt b/app/src/main/java/io/legado/app/help/DefaultData.kt index ba06316b9..b429ba05d 100644 --- a/app/src/main/java/io/legado/app/help/DefaultData.kt +++ b/app/src/main/java/io/legado/app/help/DefaultData.kt @@ -1,11 +1,12 @@ package io.legado.app.help -import io.legado.app.App +import io.legado.app.data.appDb import io.legado.app.data.entities.HttpTTS import io.legado.app.data.entities.RssSource import io.legado.app.data.entities.TxtTocRule import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonArray +import splitties.init.appCtx import java.io.File object DefaultData { @@ -16,7 +17,7 @@ object DefaultData { val httpTTS by lazy { val json = String( - App.INSTANCE.assets.open("defaultData${File.separator}$httpTtsFileName") + appCtx.assets.open("defaultData${File.separator}$httpTtsFileName") .readBytes() ) GSON.fromJsonArray(json)!! @@ -24,7 +25,7 @@ object DefaultData { val readConfigs by lazy { val json = String( - App.INSTANCE.assets.open("defaultData${File.separator}${ReadBookConfig.configFileName}") + appCtx.assets.open("defaultData${File.separator}${ReadBookConfig.configFileName}") .readBytes() ) GSON.fromJsonArray(json)!! @@ -32,7 +33,7 @@ object DefaultData { val txtTocRules by lazy { val json = String( - App.INSTANCE.assets.open("defaultData${File.separator}$txtTocRuleFileName") + appCtx.assets.open("defaultData${File.separator}$txtTocRuleFileName") .readBytes() ) GSON.fromJsonArray(json)!! @@ -40,7 +41,7 @@ object DefaultData { val themeConfigs by lazy { val json = String( - App.INSTANCE.assets.open("defaultData${File.separator}${ThemeConfig.configFileName}") + appCtx.assets.open("defaultData${File.separator}${ThemeConfig.configFileName}") .readBytes() ) GSON.fromJsonArray(json)!! @@ -48,23 +49,23 @@ object DefaultData { val rssSources by lazy { val json = String( - App.INSTANCE.assets.open("defaultData${File.separator}rssSources.json") + appCtx.assets.open("defaultData${File.separator}rssSources.json") .readBytes() ) GSON.fromJsonArray(json)!! } fun importDefaultHttpTTS() { - App.db.httpTTSDao.deleteDefault() - App.db.httpTTSDao.insert(*httpTTS.toTypedArray()) + appDb.httpTTSDao.deleteDefault() + appDb.httpTTSDao.insert(*httpTTS.toTypedArray()) } fun importDefaultTocRules() { - App.db.txtTocRule.deleteDefault() - App.db.txtTocRule.insert(*txtTocRules.toTypedArray()) + appDb.txtTocRuleDao.deleteDefault() + appDb.txtTocRuleDao.insert(*txtTocRules.toTypedArray()) } fun importDefaultRssSources() { - App.db.rssSourceDao.insert(*rssSources.toTypedArray()) + appDb.rssSourceDao.insert(*rssSources.toTypedArray()) } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/IntentHelp.kt b/app/src/main/java/io/legado/app/help/IntentHelp.kt index 7524bed78..10e1c53ac 100644 --- a/app/src/main/java/io/legado/app/help/IntentHelp.kt +++ b/app/src/main/java/io/legado/app/help/IntentHelp.kt @@ -5,7 +5,7 @@ import android.content.Context import android.content.Intent import android.os.Bundle import io.legado.app.R -import org.jetbrains.anko.toast +import io.legado.app.utils.toastOnUi @Suppress("unused") object IntentHelp { @@ -19,7 +19,7 @@ object IntentHelp { intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK context.startActivity(intent) }.onFailure { - context.toast(R.string.tip_cannot_jump_setting_page) + context.toastOnUi(R.string.tip_cannot_jump_setting_page) } } @@ -30,7 +30,7 @@ object IntentHelp { intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK context.startActivity(intent) }.onFailure { - context.toast("无法打开设置") + context.toastOnUi("无法打开设置") } } diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index 7a38e2a33..ed56073a1 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -3,7 +3,6 @@ package io.legado.app.help import android.net.Uri import android.util.Base64 import androidx.annotation.Keep -import io.legado.app.App import io.legado.app.constant.AppConst.dateFormat import io.legado.app.help.http.CookieStore import io.legado.app.help.http.SSLHelper @@ -16,9 +15,9 @@ import org.jsoup.Connection import org.jsoup.Jsoup import rxhttp.wrapper.param.RxHttp import rxhttp.wrapper.param.toByteArray +import splitties.init.appCtx import java.io.File import java.net.URLEncoder -import java.nio.charset.Charset import java.util.* @Keep @@ -63,8 +62,8 @@ interface JsExtensions { fun downloadFile(content: String, url: String): String { val type = AnalyzeUrl(url).type ?: return "" val zipPath = FileUtils.getPath( - FileUtils.createFolderIfNotExist(FileUtils.getCachePath()), - "${MD5Utils.md5Encode16(url)}.${type}" + FileUtils.createFolderIfNotExist(FileUtils.getCachePath()), + "${MD5Utils.md5Encode16(url)}.${type}" ) FileUtils.deleteFile(zipPath) val zipFile = FileUtils.createFileIfNotExist(zipPath) @@ -82,8 +81,8 @@ interface JsExtensions { fun unzipFile(zipPath: String): String { if (zipPath.isEmpty()) return "" val unzipPath = FileUtils.getPath( - FileUtils.createFolderIfNotExist(FileUtils.getCachePath()), - FileUtils.getNameExcludeExtension(zipPath) + FileUtils.createFolderIfNotExist(FileUtils.getCachePath()), + FileUtils.getNameExcludeExtension(zipPath) ) FileUtils.deleteFile(unzipPath) val zipFile = FileUtils.createFileIfNotExist(zipPath) @@ -104,8 +103,8 @@ interface JsExtensions { if (it != null) { for (f in it) { val charsetName = EncodingDetect.getEncode(f) - contents.append(String(f.readBytes(), Charset.forName(charsetName))) - .append("\n") + contents.append(String(f.readBytes(), charset(charsetName))) + .append("\n") } contents.deleteCharAt(contents.length - 1) } @@ -119,12 +118,12 @@ interface JsExtensions { */ fun get(urlStr: String, headers: Map): Connection.Response { return Jsoup.connect(urlStr) - .sslSocketFactory(SSLHelper.unsafeSSLSocketFactory) - .ignoreContentType(true) - .followRedirects(false) - .headers(headers) - .method(Connection.Method.GET) - .execute() + .sslSocketFactory(SSLHelper.unsafeSSLSocketFactory) + .ignoreContentType(true) + .followRedirects(false) + .headers(headers) + .method(Connection.Method.GET) + .execute() } /** @@ -132,13 +131,13 @@ interface JsExtensions { */ fun post(urlStr: String, body: String, headers: Map): Connection.Response { return Jsoup.connect(urlStr) - .sslSocketFactory(SSLHelper.unsafeSSLSocketFactory) - .ignoreContentType(true) - .followRedirects(false) - .requestBody(body) - .headers(headers) - .method(Connection.Method.POST) - .execute() + .sslSocketFactory(SSLHelper.unsafeSSLSocketFactory) + .ignoreContentType(true) + .followRedirects(false) + .requestBody(body) + .headers(headers) + .method(Connection.Method.POST) + .execute() } /** @@ -234,10 +233,20 @@ interface JsExtensions { /** * 读取本地文件 */ - fun readFile(path: String): ByteArray? { + fun readFile(path: String): ByteArray { return File(path).readBytes() } + fun readTxtFile(path: String): String { + val f = File(path) + val charsetName = EncodingDetect.getEncode(f) + return String(f.readBytes(), charset(charsetName)) + } + + fun readTxtFile(path: String, charsetName: String): String { + return String(File(path).readBytes(), charset(charsetName)) + } + /** * 解析字体,返回字体解析类 */ @@ -264,7 +273,7 @@ interface JsExtensions { } return@runBlocking x } - str.isContentScheme() -> Uri.parse(str).readBytes(App.INSTANCE) + str.isContentScheme() -> Uri.parse(str).readBytes(appCtx) str.startsWith("/storage") -> File(str).readBytes() else -> base64DecodeToByteArray(str) } @@ -275,9 +284,9 @@ interface JsExtensions { } fun replaceFont( - text: String, - font1: QueryTTF?, - font2: QueryTTF? + text: String, + font1: QueryTTF?, + font2: QueryTTF? ): String { if (font1 == null || font2 == null) return text val contentArray = text.toCharArray() diff --git a/app/src/main/java/io/legado/app/help/LauncherIconHelp.kt b/app/src/main/java/io/legado/app/help/LauncherIconHelp.kt index 04723c21a..3a226e071 100644 --- a/app/src/main/java/io/legado/app/help/LauncherIconHelp.kt +++ b/app/src/main/java/io/legado/app/help/LauncherIconHelp.kt @@ -3,30 +3,30 @@ package io.legado.app.help import android.content.ComponentName import android.content.pm.PackageManager import android.os.Build -import io.legado.app.App import io.legado.app.R import io.legado.app.ui.welcome.* -import org.jetbrains.anko.toast +import io.legado.app.utils.toastOnUi +import splitties.init.appCtx /** * Created by GKF on 2018/2/27. * 更换图标 */ object LauncherIconHelp { - private val packageManager: PackageManager = App.INSTANCE.packageManager + private val packageManager: PackageManager = appCtx.packageManager private val componentNames = arrayListOf( - ComponentName(App.INSTANCE, Launcher1::class.java.name), - ComponentName(App.INSTANCE, Launcher2::class.java.name), - ComponentName(App.INSTANCE, Launcher3::class.java.name), - ComponentName(App.INSTANCE, Launcher4::class.java.name), - ComponentName(App.INSTANCE, Launcher5::class.java.name), - ComponentName(App.INSTANCE, Launcher6::class.java.name) + ComponentName(appCtx, Launcher1::class.java.name), + ComponentName(appCtx, Launcher2::class.java.name), + ComponentName(appCtx, Launcher3::class.java.name), + ComponentName(appCtx, Launcher4::class.java.name), + ComponentName(appCtx, Launcher5::class.java.name), + ComponentName(appCtx, Launcher6::class.java.name) ) fun changeIcon(icon: String?) { if (icon.isNullOrEmpty()) return if (Build.VERSION.SDK_INT < 26) { - App.INSTANCE.toast(R.string.change_icon_error) + appCtx.toastOnUi(R.string.change_icon_error) return } var hasEnabled = false @@ -50,13 +50,13 @@ object LauncherIconHelp { } if (hasEnabled) { packageManager.setComponentEnabledSetting( - ComponentName(App.INSTANCE, WelcomeActivity::class.java.name), + ComponentName(appCtx, WelcomeActivity::class.java.name), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP ) } else { packageManager.setComponentEnabledSetting( - ComponentName(App.INSTANCE, WelcomeActivity::class.java.name), + ComponentName(appCtx, WelcomeActivity::class.java.name), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP ) diff --git a/app/src/main/java/io/legado/app/help/LocalConfig.kt b/app/src/main/java/io/legado/app/help/LocalConfig.kt index 6278c0c55..ed0e46b2b 100644 --- a/app/src/main/java/io/legado/app/help/LocalConfig.kt +++ b/app/src/main/java/io/legado/app/help/LocalConfig.kt @@ -2,19 +2,19 @@ package io.legado.app.help import android.content.Context import androidx.core.content.edit -import io.legado.app.App +import splitties.init.appCtx object LocalConfig { - private const val versionCodeKey = "versionCode" + private const val versionCodeKey = "appVersionCode" private val localConfig = - App.INSTANCE.getSharedPreferences("local", Context.MODE_PRIVATE) + appCtx.getSharedPreferences("local", Context.MODE_PRIVATE) var versionCode - get() = localConfig.getInt(versionCodeKey, 0) + get() = localConfig.getLong(versionCodeKey, 0) set(value) { localConfig.edit { - putInt(versionCodeKey, value) + putLong(versionCodeKey, value) } } @@ -71,5 +71,5 @@ object LocalConfig { get() = !isLastVersion(1, "txtTocRuleVersion") val hasUpRssSources: Boolean - get() = !isLastVersion(1, "rssSourceVersion") + get() = !isLastVersion(2, "rssSourceVersion") } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/ReadBookConfig.kt b/app/src/main/java/io/legado/app/help/ReadBookConfig.kt index de8e0aaed..b024838f3 100644 --- a/app/src/main/java/io/legado/app/help/ReadBookConfig.kt +++ b/app/src/main/java/io/legado/app/help/ReadBookConfig.kt @@ -5,12 +5,12 @@ import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import androidx.annotation.Keep -import io.legado.app.App import io.legado.app.R import io.legado.app.constant.PreferKey import io.legado.app.help.coroutine.Coroutine import io.legado.app.ui.book.read.page.provider.ChapterProvider import io.legado.app.utils.* +import splitties.init.appCtx import java.io.File /** @@ -20,9 +20,8 @@ import java.io.File object ReadBookConfig { const val configFileName = "readConfig.json" const val shareConfigFileName = "shareReadConfig.json" - val context get() = App.INSTANCE - val configFilePath = FileUtils.getPath(context.filesDir, configFileName) - val shareConfigFilePath = FileUtils.getPath(context.filesDir, shareConfigFileName) + val configFilePath = FileUtils.getPath(appCtx.filesDir, configFileName) + val shareConfigFilePath = FileUtils.getPath(appCtx.filesDir, shareConfigFileName) val configList: ArrayList = arrayListOf() lateinit var shareConfig: Config var durConfig @@ -84,7 +83,7 @@ object ReadBookConfig { } fun upBg() { - val resources = context.resources + val resources = appCtx.resources val dm = resources.displayMetrics val width = dm.widthPixels val height = dm.heightPixels @@ -133,30 +132,31 @@ object ReadBookConfig { } //配置写入读取 - var readBodyToLh = context.getPrefBoolean(PreferKey.readBodyToLh, true) - var autoReadSpeed = context.getPrefInt(PreferKey.autoReadSpeed, 46) + var readBodyToLh = appCtx.getPrefBoolean(PreferKey.readBodyToLh, true) + var autoReadSpeed = appCtx.getPrefInt(PreferKey.autoReadSpeed, 46) set(value) { field = value - context.putPrefInt(PreferKey.autoReadSpeed, value) + appCtx.putPrefInt(PreferKey.autoReadSpeed, value) } - var styleSelect = context.getPrefInt(PreferKey.readStyleSelect) + var styleSelect = appCtx.getPrefInt(PreferKey.readStyleSelect) set(value) { field = value - if (context.getPrefInt(PreferKey.readStyleSelect) != value) { - context.putPrefInt(PreferKey.readStyleSelect, value) + if (appCtx.getPrefInt(PreferKey.readStyleSelect) != value) { + appCtx.putPrefInt(PreferKey.readStyleSelect, value) } } - var shareLayout = context.getPrefBoolean(PreferKey.shareLayout) + var shareLayout = appCtx.getPrefBoolean(PreferKey.shareLayout) set(value) { field = value - if (context.getPrefBoolean(PreferKey.shareLayout) != value) { - context.putPrefBoolean(PreferKey.shareLayout, value) + if (appCtx.getPrefBoolean(PreferKey.shareLayout) != value) { + appCtx.putPrefBoolean(PreferKey.shareLayout, value) } } - val textFullJustify get() = context.getPrefBoolean(PreferKey.textFullJustify, true) - val textBottomJustify get() = context.getPrefBoolean(PreferKey.textBottomJustify, true) - var hideStatusBar = context.getPrefBoolean(PreferKey.hideStatusBar) - var hideNavigationBar = context.getPrefBoolean(PreferKey.hideNavigationBar) + val textFullJustify get() = appCtx.getPrefBoolean(PreferKey.textFullJustify, true) + val textBottomJustify get() = appCtx.getPrefBoolean(PreferKey.textBottomJustify, true) + var hideStatusBar = appCtx.getPrefBoolean(PreferKey.hideStatusBar) + var hideNavigationBar = appCtx.getPrefBoolean(PreferKey.hideNavigationBar) + var useZhLayout = appCtx.getPrefBoolean(PreferKey.useZhLayout) val config get() = if (shareLayout) shareConfig else durConfig @@ -490,7 +490,7 @@ object ReadBookConfig { fun curBgDrawable(width: Int, height: Int): Drawable { var bgDrawable: Drawable? = null - val resources = context.resources + val resources = appCtx.resources try { bgDrawable = when (curBgType()) { 0 -> ColorDrawable(Color.parseColor(curBgStr())) @@ -498,7 +498,7 @@ object ReadBookConfig { BitmapDrawable( resources, BitmapUtils.decodeAssetsBitmap( - context, + appCtx, "bg" + File.separator + curBgStr(), width, height @@ -513,7 +513,7 @@ object ReadBookConfig { } catch (e: Exception) { e.printStackTrace() } - return bgDrawable ?: ColorDrawable(context.getCompatColor(R.color.background)) + return bgDrawable ?: ColorDrawable(appCtx.getCompatColor(R.color.background)) } } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/ReadTipConfig.kt b/app/src/main/java/io/legado/app/help/ReadTipConfig.kt index c09876802..d962f64c0 100644 --- a/app/src/main/java/io/legado/app/help/ReadTipConfig.kt +++ b/app/src/main/java/io/legado/app/help/ReadTipConfig.kt @@ -1,11 +1,11 @@ package io.legado.app.help -import io.legado.app.App import io.legado.app.R +import splitties.init.appCtx object ReadTipConfig { val tips by lazy { - App.INSTANCE.resources.getStringArray(R.array.read_tip).toList() + appCtx.resources.getStringArray(R.array.read_tip).toList() } val headerModes by lazy { linkedMapOf(0 to "状态栏显示时隐藏", 1 to "显示", 2 to "隐藏") diff --git a/app/src/main/java/io/legado/app/help/SourceHelp.kt b/app/src/main/java/io/legado/app/help/SourceHelp.kt index 02b20bf52..be977ec87 100644 --- a/app/src/main/java/io/legado/app/help/SourceHelp.kt +++ b/app/src/main/java/io/legado/app/help/SourceHelp.kt @@ -2,20 +2,21 @@ package io.legado.app.help import android.os.Handler import android.os.Looper -import io.legado.app.App +import io.legado.app.data.appDb 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.splitNotBlank -import org.jetbrains.anko.toast +import io.legado.app.utils.toastOnUi +import splitties.init.appCtx object SourceHelp { private val handler = Handler(Looper.getMainLooper()) private val list18Plus by lazy { try { - return@lazy String(App.INSTANCE.assets.open("18PlusList.txt").readBytes()) + return@lazy String(appCtx.assets.open("18PlusList.txt").readBytes()) .splitNotBlank("\n") } catch (e: Exception) { return@lazy arrayOf() @@ -26,10 +27,10 @@ object SourceHelp { rssSources.forEach { rssSource -> if (is18Plus(rssSource.sourceUrl)) { handler.post { - App.INSTANCE.toast("${rssSource.sourceName}是18+网址,禁止导入.") + appCtx.toastOnUi("${rssSource.sourceName}是18+网址,禁止导入.") } } else { - App.db.rssSourceDao.insert(rssSource) + appDb.rssSourceDao.insert(rssSource) } } } @@ -38,10 +39,10 @@ object SourceHelp { bookSources.forEach { bookSource -> if (is18Plus(bookSource.bookSourceUrl)) { handler.post { - App.INSTANCE.toast("${bookSource.bookSourceName}是18+网址,禁止导入.") + appCtx.toastOnUi("${bookSource.bookSourceName}是18+网址,禁止导入.") } } else { - App.db.bookSourceDao.insert(bookSource) + appDb.bookSourceDao.insert(bookSource) } } } diff --git a/app/src/main/java/io/legado/app/help/ThemeConfig.kt b/app/src/main/java/io/legado/app/help/ThemeConfig.kt index 0b0298e91..409b5be24 100644 --- a/app/src/main/java/io/legado/app/help/ThemeConfig.kt +++ b/app/src/main/java/io/legado/app/help/ThemeConfig.kt @@ -2,29 +2,58 @@ package io.legado.app.help import android.content.Context import android.graphics.Color +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable import androidx.annotation.Keep -import io.legado.app.App +import androidx.appcompat.app.AppCompatDelegate import io.legado.app.R import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey +import io.legado.app.constant.Theme import io.legado.app.lib.theme.ThemeStore import io.legado.app.utils.* +import splitties.init.appCtx import java.io.File object ThemeConfig { const val configFileName = "themeConfig.json" - val configFilePath = FileUtils.getPath(App.INSTANCE.filesDir, configFileName) + val configFilePath = FileUtils.getPath(appCtx.filesDir, configFileName) val configList: ArrayList by lazy { val cList = getConfigs() ?: DefaultData.themeConfigs ArrayList(cList) } - fun upConfig() { - getConfigs()?.let { - it.forEach { config -> - addConfig(config) + fun applyDayNight(context: Context) { + ReadBookConfig.upBg() + applyTheme(context) + initNightMode() + postEvent(EventBus.RECREATE, "") + } + + private fun initNightMode() { + val targetMode = + if (AppConfig.isNightTheme) { + AppCompatDelegate.MODE_NIGHT_YES + } else { + AppCompatDelegate.MODE_NIGHT_NO } + AppCompatDelegate.setDefaultNightMode(targetMode) + } + + fun getBgImage(context: Context): Drawable? { + val bgPath = when (Theme.getTheme()) { + Theme.Light -> context.getPrefString(PreferKey.bgImage) + Theme.Dark -> context.getPrefString(PreferKey.bgImageN) + else -> null + } + if (bgPath.isNullOrBlank()) return null + return BitmapDrawable.createFromPath(bgPath) + } + + fun upConfig() { + getConfigs()?.forEach { config -> + addConfig(config) } } @@ -88,8 +117,7 @@ object ThemeConfig { context.putPrefInt(PreferKey.cBBackground, bBackground) } AppConfig.isNightTheme = config.isNightTheme - App.INSTANCE.applyDayNight() - postEvent(EventBus.RECREATE, "") + applyDayNight(context) } fun saveDayTheme(context: Context, name: String) { @@ -204,7 +232,6 @@ object ThemeConfig { var primaryColor: String, var accentColor: String, var backgroundColor: String, - var backgroundImage: String? = null, var bottomBackground: String ) diff --git a/app/src/main/java/io/legado/app/help/coroutine/Coroutine.kt b/app/src/main/java/io/legado/app/help/coroutine/Coroutine.kt index a31c9d1e0..6cb5892b5 100644 --- a/app/src/main/java/io/legado/app/help/coroutine/Coroutine.kt +++ b/app/src/main/java/io/legado/app/help/coroutine/Coroutine.kt @@ -197,7 +197,9 @@ class Coroutine( return withContext(scope.coroutineContext.plus(context)) { if (timeMillis > 0L) withTimeout(timeMillis) { block() - } else block() + } else { + block() + } } } diff --git a/app/src/main/java/io/legado/app/help/http/AjaxWebView.kt b/app/src/main/java/io/legado/app/help/http/AjaxWebView.kt index 731e8ec9d..8bf30ba8d 100644 --- a/app/src/main/java/io/legado/app/help/http/AjaxWebView.kt +++ b/app/src/main/java/io/legado/app/help/http/AjaxWebView.kt @@ -9,19 +9,15 @@ import android.webkit.CookieManager import android.webkit.WebSettings import android.webkit.WebView import android.webkit.WebViewClient -import io.legado.app.App import io.legado.app.constant.AppConst import org.apache.commons.text.StringEscapeUtils +import splitties.init.appCtx import java.lang.ref.WeakReference class AjaxWebView { var callback: Callback? = null - private var mHandler: AjaxHandler - - init { - mHandler = AjaxHandler(this) - } + private var mHandler: AjaxHandler = AjaxHandler(this) class AjaxHandler(private val ajaxWebView: AjaxWebView) : Handler(Looper.getMainLooper()) { @@ -51,7 +47,7 @@ class AjaxWebView { @SuppressLint("SetJavaScriptEnabled", "JavascriptInterface") fun createAjaxWebView(params: AjaxParams, handler: Handler): WebView { - val webView = WebView(App.INSTANCE) + val webView = WebView(appCtx) val settings = webView.settings settings.javaScriptEnabled = true settings.domStorageEnabled = true diff --git a/app/src/main/java/io/legado/app/help/http/CookieStore.kt b/app/src/main/java/io/legado/app/help/http/CookieStore.kt index 9aa344dbb..c8d516091 100644 --- a/app/src/main/java/io/legado/app/help/http/CookieStore.kt +++ b/app/src/main/java/io/legado/app/help/http/CookieStore.kt @@ -3,7 +3,7 @@ package io.legado.app.help.http import android.text.TextUtils -import io.legado.app.App +import io.legado.app.data.appDb import io.legado.app.data.entities.Cookie import io.legado.app.help.http.api.CookieManager import io.legado.app.utils.NetworkUtils @@ -12,7 +12,7 @@ object CookieStore : CookieManager { override fun setCookie(url: String, cookie: String?) { val cookieBean = Cookie(NetworkUtils.getSubDomain(url), cookie ?: "") - App.db.cookieDao.insert(cookieBean) + appDb.cookieDao.insert(cookieBean) } override fun replaceCookie(url: String, cookie: String) { @@ -31,12 +31,12 @@ object CookieStore : CookieManager { } override fun getCookie(url: String): String { - val cookieBean = App.db.cookieDao.get(NetworkUtils.getSubDomain(url)) + val cookieBean = appDb.cookieDao.get(NetworkUtils.getSubDomain(url)) return cookieBean?.cookie ?: "" } override fun removeCookie(url: String) { - App.db.cookieDao.delete(NetworkUtils.getSubDomain(url)) + appDb.cookieDao.delete(NetworkUtils.getSubDomain(url)) } override fun cookieToMap(cookie: String): MutableMap { @@ -77,7 +77,7 @@ object CookieStore : CookieManager { } fun clear() { - App.db.cookieDao.deleteOkHttp() + appDb.cookieDao.deleteOkHttp() } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/permission/PermissionActivity.kt b/app/src/main/java/io/legado/app/help/permission/PermissionActivity.kt index 04722997b..bd27e56e9 100644 --- a/app/src/main/java/io/legado/app/help/permission/PermissionActivity.kt +++ b/app/src/main/java/io/legado/app/help/permission/PermissionActivity.kt @@ -8,7 +8,7 @@ import android.view.KeyEvent import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import io.legado.app.R -import org.jetbrains.anko.toast +import io.legado.app.utils.toastOnUi class PermissionActivity : AppCompatActivity() { @@ -32,7 +32,7 @@ class PermissionActivity : AppCompatActivity() { settingIntent.data = Uri.fromParts("package", packageName, null) startActivityForResult(settingIntent, Request.TYPE_REQUEST_SETTING) } catch (e: Exception) { - toast(R.string.tip_cannot_jump_setting_page) + toastOnUi(R.string.tip_cannot_jump_setting_page) finish() } diff --git a/app/src/main/java/io/legado/app/help/permission/Request.kt b/app/src/main/java/io/legado/app/help/permission/Request.kt index f7ed0293a..7a26f521f 100644 --- a/app/src/main/java/io/legado/app/help/permission/Request.kt +++ b/app/src/main/java/io/legado/app/help/permission/Request.kt @@ -9,7 +9,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import io.legado.app.R -import org.jetbrains.anko.startActivity +import io.legado.app.utils.startActivity import java.util.* internal class Request : OnRequestPermissionsResultCallback { @@ -77,20 +77,26 @@ internal class Request : OnRequestPermissionsResultCallback { if (deniedPermissions == null) { onPermissionsGranted(requestCode) } else { - val rationale = if (rationaleResId != 0) source?.context?.getText(rationaleResId) else rationale + val rationale = + if (rationaleResId != 0) source?.context?.getText(rationaleResId) else rationale if (rationale != null) { - showSettingDialog(rationale) { onPermissionsDenied(requestCode, deniedPermissions) } + showSettingDialog(rationale) { + onPermissionsDenied( + requestCode, + deniedPermissions + ) + } } else { onPermissionsDenied(requestCode, deniedPermissions) } } } else { if (deniedPermissions != null) { - source?.context?.startActivity( - PermissionActivity.KEY_INPUT_REQUEST_TYPE to TYPE_REQUEST_PERMISSION, - PermissionActivity.KEY_INPUT_PERMISSIONS_CODE to requestCode, - PermissionActivity.KEY_INPUT_PERMISSIONS to deniedPermissions - ) + source?.context?.startActivity { + putExtra(PermissionActivity.KEY_INPUT_REQUEST_TYPE, TYPE_REQUEST_PERMISSION) + putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS_CODE, requestCode) + putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS, deniedPermissions) + } } else { onPermissionsGranted(requestCode) } @@ -132,9 +138,12 @@ internal class Request : OnRequestPermissionsResultCallback { .setTitle(R.string.dialog_title) .setMessage(rationale) .setPositiveButton(R.string.dialog_setting) { _, _ -> - it.startActivity( - PermissionActivity.KEY_INPUT_REQUEST_TYPE to TYPE_REQUEST_SETTING - ) + it.startActivity { + putExtra( + PermissionActivity.KEY_INPUT_REQUEST_TYPE, + TYPE_REQUEST_SETTING + ) + } } .setNegativeButton(R.string.dialog_cancel) { _, _ -> cancel() } .show() @@ -160,10 +169,15 @@ internal class Request : OnRequestPermissionsResultCallback { RequestPlugins.sResultCallback?.onPermissionsDenied(requestCode, deniedPermissions) } - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { val deniedPermissions = getDeniedPermissions(permissions) if (deniedPermissions != null) { - val rationale = if (rationaleResId != 0) source?.context?.getText(rationaleResId) else rationale + val rationale = + if (rationaleResId != 0) source?.context?.getText(rationaleResId) else rationale if (rationale != null) { showSettingDialog(rationale) { onPermissionsDenied(requestCode, deniedPermissions) } } else { diff --git a/app/src/main/java/io/legado/app/help/storage/Backup.kt b/app/src/main/java/io/legado/app/help/storage/Backup.kt index a26f5174f..fac7826be 100644 --- a/app/src/main/java/io/legado/app/help/storage/Backup.kt +++ b/app/src/main/java/io/legado/app/help/storage/Backup.kt @@ -3,8 +3,8 @@ package io.legado.app.help.storage import android.content.Context import android.net.Uri import androidx.documentfile.provider.DocumentFile -import io.legado.app.App import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.help.DefaultData import io.legado.app.help.ReadBookConfig import io.legado.app.help.ThemeConfig @@ -12,7 +12,7 @@ import io.legado.app.help.coroutine.Coroutine import io.legado.app.utils.* import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.withContext -import org.jetbrains.anko.defaultSharedPreferences +import splitties.init.appCtx import java.io.File import java.util.concurrent.TimeUnit @@ -20,7 +20,7 @@ import java.util.concurrent.TimeUnit object Backup { val backupPath: String by lazy { - FileUtils.getFile(App.INSTANCE.filesDir, "backup").absolutePath + FileUtils.getFile(appCtx.filesDir, "backup").absolutePath } val backupFileNames by lazy { @@ -57,32 +57,33 @@ object Backup { context.putPrefLong(PreferKey.lastBackup, System.currentTimeMillis()) withContext(IO) { FileUtils.deleteFile(backupPath) - writeListToJson(App.db.bookDao.all, "bookshelf.json", backupPath) - writeListToJson(App.db.bookmarkDao.all, "bookmark.json", backupPath) - writeListToJson(App.db.bookGroupDao.all, "bookGroup.json", backupPath) - writeListToJson(App.db.bookSourceDao.all, "bookSource.json", backupPath) - writeListToJson(App.db.rssSourceDao.all, "rssSources.json", backupPath) - writeListToJson(App.db.rssStarDao.all, "rssStar.json", backupPath) - writeListToJson(App.db.replaceRuleDao.all, "replaceRule.json", backupPath) - writeListToJson(App.db.readRecordDao.all, "readRecord.json", backupPath) - writeListToJson(App.db.searchKeywordDao.all, "searchHistory.json", backupPath) - writeListToJson(App.db.ruleSubDao.all, "sourceSub.json", backupPath) - writeListToJson(App.db.txtTocRule.all, DefaultData.txtTocRuleFileName, backupPath) - writeListToJson(App.db.httpTTSDao.all, DefaultData.httpTtsFileName, backupPath) + writeListToJson(appDb.bookDao.all, "bookshelf.json", backupPath) + writeListToJson(appDb.bookmarkDao.all, "bookmark.json", backupPath) + writeListToJson(appDb.bookGroupDao.all, "bookGroup.json", backupPath) + writeListToJson(appDb.bookSourceDao.all, "bookSource.json", backupPath) + writeListToJson(appDb.rssSourceDao.all, "rssSources.json", backupPath) + writeListToJson(appDb.rssStarDao.all, "rssStar.json", backupPath) + writeListToJson(appDb.replaceRuleDao.all, "replaceRule.json", backupPath) + writeListToJson(appDb.readRecordDao.all, "readRecord.json", backupPath) + writeListToJson(appDb.searchKeywordDao.all, "searchHistory.json", backupPath) + writeListToJson(appDb.ruleSubDao.all, "sourceSub.json", backupPath) + writeListToJson(appDb.txtTocRuleDao.all, DefaultData.txtTocRuleFileName, backupPath) + writeListToJson(appDb.httpTTSDao.all, DefaultData.httpTtsFileName, backupPath) GSON.toJson(ReadBookConfig.configList).let { FileUtils.createFileIfNotExist(backupPath + File.separator + ReadBookConfig.configFileName) .writeText(it) } GSON.toJson(ReadBookConfig.shareConfig).let { FileUtils.createFileIfNotExist(backupPath + File.separator + ReadBookConfig.shareConfigFileName) + .writeText(it) } GSON.toJson(ThemeConfig.configList).let { FileUtils.createFileIfNotExist(backupPath + File.separator + ThemeConfig.configFileName) .writeText(it) } - Preferences.getSharedPreferences(App.INSTANCE, backupPath, "config")?.let { sp -> + Preferences.getSharedPreferences(appCtx, backupPath, "config")?.let { sp -> val edit = sp.edit() - App.INSTANCE.defaultSharedPreferences.all.map { + appCtx.defaultSharedPreferences.all.map { when (val value = it.value) { is Int -> edit.putInt(it.key, value) is Boolean -> edit.putBoolean(it.key, value) diff --git a/app/src/main/java/io/legado/app/help/storage/BookWebDav.kt b/app/src/main/java/io/legado/app/help/storage/BookWebDav.kt index f3b7310b4..5af0231f0 100644 --- a/app/src/main/java/io/legado/app/help/storage/BookWebDav.kt +++ b/app/src/main/java/io/legado/app/help/storage/BookWebDav.kt @@ -3,7 +3,6 @@ package io.legado.app.help.storage import android.content.Context import android.os.Handler import android.os.Looper -import io.legado.app.App import io.legado.app.R import io.legado.app.constant.PreferKey import io.legado.app.data.entities.Book @@ -16,7 +15,7 @@ import io.legado.app.utils.* import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.withContext -import org.jetbrains.anko.toast +import splitties.init.appCtx import java.io.File import java.text.SimpleDateFormat import java.util.* @@ -28,20 +27,20 @@ object BookWebDav { private val rootWebDavUrl: String get() { - var url = App.INSTANCE.getPrefString(PreferKey.webDavUrl) + var url = appCtx.getPrefString(PreferKey.webDavUrl) if (url.isNullOrEmpty()) { url = defaultWebDavUrl } if (!url.endsWith("/")) url = "${url}/" - if (App.INSTANCE.getPrefBoolean(PreferKey.webDavCreateDir, true)) { + if (appCtx.getPrefBoolean(PreferKey.webDavCreateDir, true)) { url = "${url}legado/" } return url } - suspend fun initWebDav(): Boolean { - val account = App.INSTANCE.getPrefString(PreferKey.webDavAccount) - val password = App.INSTANCE.getPrefString(PreferKey.webDavPassword) + private suspend fun initWebDav(): Boolean { + val account = appCtx.getPrefString(PreferKey.webDavAccount) + val password = appCtx.getPrefString(PreferKey.webDavPassword) if (!account.isNullOrBlank() && !password.isNullOrBlank()) { HttpAuth.auth = HttpAuth.Auth(account, password) WebDav(rootWebDavUrl).makeAsDir() @@ -80,7 +79,7 @@ object BookWebDav { Coroutine.async { restoreWebDav(names[index]) }.onError { - App.INSTANCE.toast("WebDavError:${it.localizedMessage}") + appCtx.toastOnUi("WebDavError:${it.localizedMessage}") } } } @@ -118,28 +117,25 @@ object BookWebDav { } } catch (e: Exception) { Handler(Looper.getMainLooper()).post { - App.INSTANCE.toast("WebDav\n${e.localizedMessage}") + appCtx.toastOnUi("WebDav\n${e.localizedMessage}") } } } - suspend fun exportWebDav(path: String, fileName: String) { + suspend fun exportWebDav(byteArray: ByteArray, fileName: String) { try { if (initWebDav()) { // 默认导出到legado文件夹下exports目录 val exportsWebDavUrl = rootWebDavUrl + EncoderUtils.escape("exports") + "/" // 在legado文件夹创建exports目录,如果不存在的话 WebDav(exportsWebDavUrl).makeAsDir() - val file = File("${path}${File.separator}${fileName}") // 如果导出的本地文件存在,开始上传 - if (file.exists()) { - val putUrl = exportsWebDavUrl + fileName - WebDav(putUrl).upload("${path}${File.separator}${fileName}") - } + val putUrl = exportsWebDavUrl + fileName + WebDav(putUrl).upload(byteArray) } } catch (e: Exception) { Handler(Looper.getMainLooper()).post { - App.INSTANCE.toast("WebDav导出\n${e.localizedMessage}") + appCtx.toastOnUi("WebDav导出\n${e.localizedMessage}") } } } diff --git a/app/src/main/java/io/legado/app/help/storage/ImportOldData.kt b/app/src/main/java/io/legado/app/help/storage/ImportOldData.kt index 178f8369a..afaaa5e92 100644 --- a/app/src/main/java/io/legado/app/help/storage/ImportOldData.kt +++ b/app/src/main/java/io/legado/app/help/storage/ImportOldData.kt @@ -3,12 +3,12 @@ package io.legado.app.help.storage import android.content.Context import android.net.Uri import androidx.documentfile.provider.DocumentFile -import io.legado.app.App +import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.utils.DocumentUtils import io.legado.app.utils.FileUtils import io.legado.app.utils.isContentScheme -import org.jetbrains.anko.toast +import io.legado.app.utils.toastOnUi import java.io.File object ImportOldData { @@ -21,28 +21,28 @@ object ImportOldData { kotlin.runCatching { DocumentUtils.readText(context, doc.uri)?.let { json -> val importCount = importOldBookshelf(json) - context.toast("成功导入书籍${importCount}") + context.toastOnUi("成功导入书籍${importCount}") } }.onFailure { - context.toast("导入书籍失败\n${it.localizedMessage}") + context.toastOnUi("导入书籍失败\n${it.localizedMessage}") } "myBookSource.json" -> kotlin.runCatching { DocumentUtils.readText(context, doc.uri)?.let { json -> val importCount = importOldSource(json) - context.toast("成功导入书源${importCount}") + context.toastOnUi("成功导入书源${importCount}") } }.onFailure { - context.toast("导入源失败\n${it.localizedMessage}") + context.toastOnUi("导入源失败\n${it.localizedMessage}") } "myBookReplaceRule.json" -> kotlin.runCatching { DocumentUtils.readText(context, doc.uri)?.let { json -> val importCount = importOldReplaceRule(json) - context.toast("成功导入替换规则${importCount}") + context.toastOnUi("成功导入替换规则${importCount}") } }.onFailure { - context.toast("导入替换规则失败\n${it.localizedMessage}") + context.toastOnUi("导入替换规则失败\n${it.localizedMessage}") } } } @@ -54,9 +54,9 @@ object ImportOldData { FileUtils.createFileIfNotExist(file, "myBookShelf.json") val json = shelfFile.readText() val importCount = importOldBookshelf(json) - context.toast("成功导入书籍${importCount}") + context.toastOnUi("成功导入书籍${importCount}") }.onFailure { - context.toast("导入书籍失败\n${it.localizedMessage}") + context.toastOnUi("导入书籍失败\n${it.localizedMessage}") } kotlin.runCatching {// Book source @@ -64,9 +64,9 @@ object ImportOldData { FileUtils.getFile(file, "myBookSource.json") val json = sourceFile.readText() val importCount = importOldSource(json) - context.toast("成功导入书源${importCount}") + context.toastOnUi("成功导入书源${importCount}") }.onFailure { - context.toast("导入源失败\n${it.localizedMessage}") + context.toastOnUi("导入源失败\n${it.localizedMessage}") } kotlin.runCatching {// Replace rules @@ -74,12 +74,12 @@ object ImportOldData { if (ruleFile.exists()) { val json = ruleFile.readText() val importCount = importOldReplaceRule(json) - context.toast("成功导入替换规则${importCount}") + context.toastOnUi("成功导入替换规则${importCount}") } else { - context.toast("未找到替换规则") + context.toastOnUi("未找到替换规则") } }.onFailure { - context.toast("导入替换规则失败\n${it.localizedMessage}") + context.toastOnUi("导入替换规则失败\n${it.localizedMessage}") } } } @@ -87,7 +87,7 @@ object ImportOldData { private fun importOldBookshelf(json: String): Int { val books = OldBook.toNewBook(json) - App.db.bookDao.insert(*books.toTypedArray()) + appDb.bookDao.insert(*books.toTypedArray()) return books.size } @@ -100,13 +100,13 @@ object ImportOldData { bookSources.add(it) } } - App.db.bookSourceDao.insert(*bookSources.toTypedArray()) + appDb.bookSourceDao.insert(*bookSources.toTypedArray()) return bookSources.size } private fun importOldReplaceRule(json: String): Int { val rules = OldReplace.jsonToReplaceRules(json) - App.db.replaceRuleDao.insert(*rules.toTypedArray()) + appDb.replaceRuleDao.insert(*rules.toTypedArray()) return rules.size } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/storage/OldBook.kt b/app/src/main/java/io/legado/app/help/storage/OldBook.kt index b90bb2734..bc874d549 100644 --- a/app/src/main/java/io/legado/app/help/storage/OldBook.kt +++ b/app/src/main/java/io/legado/app/help/storage/OldBook.kt @@ -1,8 +1,8 @@ package io.legado.app.help.storage import android.util.Log -import io.legado.app.App import io.legado.app.constant.AppConst +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.utils.readBool import io.legado.app.utils.readInt @@ -14,7 +14,7 @@ object OldBook { fun toNewBook(json: String): List { val books = mutableListOf() val items: List> = Restore.jsonPath.parse(json).read("$") - val existingBooks = App.db.bookDao.allBookUrls.toSet() + val existingBooks = appDb.bookDao.allBookUrls.toSet() for (item in items) { val jsonItem = Restore.jsonPath.parse(item) val book = Book() diff --git a/app/src/main/java/io/legado/app/help/storage/Restore.kt b/app/src/main/java/io/legado/app/help/storage/Restore.kt index 212152849..16340aeea 100644 --- a/app/src/main/java/io/legado/app/help/storage/Restore.kt +++ b/app/src/main/java/io/legado/app/help/storage/Restore.kt @@ -1,5 +1,7 @@ package io.legado.app.help.storage +import android.app.AlarmManager +import android.app.PendingIntent import android.content.Context import android.net.Uri import androidx.documentfile.provider.DocumentFile @@ -7,28 +9,29 @@ import com.jayway.jsonpath.Configuration import com.jayway.jsonpath.JsonPath import com.jayway.jsonpath.Option import com.jayway.jsonpath.ParseContext -import io.legado.app.App import io.legado.app.BuildConfig import io.legado.app.R -import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey +import io.legado.app.constant.androidId +import io.legado.app.data.appDb import io.legado.app.data.entities.* import io.legado.app.help.DefaultData import io.legado.app.help.LauncherIconHelp import io.legado.app.help.ReadBookConfig import io.legado.app.help.ThemeConfig -import io.legado.app.service.help.ReadBook -import io.legado.app.ui.book.read.page.provider.ChapterProvider import io.legado.app.utils.* import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main +import kotlinx.coroutines.delay import kotlinx.coroutines.withContext -import org.jetbrains.anko.defaultSharedPreferences -import org.jetbrains.anko.toast +import splitties.init.appCtx +import splitties.systemservices.alarmManager import java.io.File +import kotlin.system.exitProcess + object Restore { - private val ignoreConfigPath = FileUtils.getPath(App.INSTANCE.filesDir, "restoreIgnore.json") + private val ignoreConfigPath = FileUtils.getPath(appCtx.filesDir, "restoreIgnore.json") val ignoreConfig: HashMap by lazy { val file = FileUtils.createFileIfNotExist(ignoreConfigPath) val json = file.readText() @@ -46,11 +49,11 @@ object Restore { //忽略标题 val ignoreTitle = arrayOf( - App.INSTANCE.getString(R.string.read_config), - App.INSTANCE.getString(R.string.theme_mode), - App.INSTANCE.getString(R.string.bookshelf_layout), - App.INSTANCE.getString(R.string.show_rss), - App.INSTANCE.getString(R.string.thread_count) + appCtx.getString(R.string.read_config), + appCtx.getString(R.string.theme_mode), + appCtx.getString(R.string.bookshelf_layout), + appCtx.getString(R.string.show_rss), + appCtx.getString(R.string.thread_count) ) //默认忽略keys @@ -111,48 +114,48 @@ object Restore { suspend fun restoreDatabase(path: String = Backup.backupPath) { withContext(IO) { fileToListT(path, "bookshelf.json")?.let { - App.db.bookDao.insert(*it.toTypedArray()) + appDb.bookDao.insert(*it.toTypedArray()) } fileToListT(path, "bookmark.json")?.let { - App.db.bookmarkDao.insert(*it.toTypedArray()) + appDb.bookmarkDao.insert(*it.toTypedArray()) } fileToListT(path, "bookGroup.json")?.let { - App.db.bookGroupDao.insert(*it.toTypedArray()) + appDb.bookGroupDao.insert(*it.toTypedArray()) } fileToListT(path, "bookSource.json")?.let { - App.db.bookSourceDao.insert(*it.toTypedArray()) + appDb.bookSourceDao.insert(*it.toTypedArray()) } fileToListT(path, "rssSources.json")?.let { - App.db.rssSourceDao.insert(*it.toTypedArray()) + appDb.rssSourceDao.insert(*it.toTypedArray()) } fileToListT(path, "rssStar.json")?.let { - App.db.rssStarDao.insert(*it.toTypedArray()) + appDb.rssStarDao.insert(*it.toTypedArray()) } fileToListT(path, "replaceRule.json")?.let { - App.db.replaceRuleDao.insert(*it.toTypedArray()) + appDb.replaceRuleDao.insert(*it.toTypedArray()) } fileToListT(path, "searchHistory.json")?.let { - App.db.searchKeywordDao.insert(*it.toTypedArray()) + appDb.searchKeywordDao.insert(*it.toTypedArray()) } fileToListT(path, "sourceSub.json")?.let { - App.db.ruleSubDao.insert(*it.toTypedArray()) + appDb.ruleSubDao.insert(*it.toTypedArray()) } fileToListT(path, DefaultData.txtTocRuleFileName)?.let { - App.db.txtTocRule.insert(*it.toTypedArray()) + appDb.txtTocRuleDao.insert(*it.toTypedArray()) } fileToListT(path, DefaultData.httpTtsFileName)?.let { - App.db.httpTTSDao.insert(*it.toTypedArray()) + appDb.httpTTSDao.insert(*it.toTypedArray()) } fileToListT(path, "readRecord.json")?.let { it.forEach { readRecord -> //判断是不是本机记录 - if (readRecord.androidId != App.androidId) { - App.db.readRecordDao.insert(readRecord) + if (readRecord.androidId != androidId) { + appDb.readRecordDao.insert(readRecord) } else { - val time = App.db.readRecordDao + val time = appDb.readRecordDao .getReadTime(readRecord.androidId, readRecord.bookName) if (time == null || time < readRecord.readTime) { - App.db.readRecordDao.insert(readRecord) + appDb.readRecordDao.insert(readRecord) } } } @@ -197,8 +200,8 @@ object Restore { e.printStackTrace() } } - Preferences.getSharedPreferences(App.INSTANCE, path, "config")?.all?.let { map -> - val edit = App.INSTANCE.defaultSharedPreferences.edit() + Preferences.getSharedPreferences(appCtx, path, "config")?.all?.let { map -> + val edit = appCtx.defaultSharedPreferences.edit() map.forEach { if (keyIsNotIgnore(it.key)) { when (val value = it.value) { @@ -207,30 +210,31 @@ object Restore { is Long -> edit.putLong(it.key, value) is Float -> edit.putFloat(it.key, value) is String -> edit.putString(it.key, value) - else -> Unit } } } edit.apply() } ReadBookConfig.apply { - styleSelect = App.INSTANCE.getPrefInt(PreferKey.readStyleSelect) - shareLayout = App.INSTANCE.getPrefBoolean(PreferKey.shareLayout) - hideStatusBar = App.INSTANCE.getPrefBoolean(PreferKey.hideStatusBar) - hideNavigationBar = App.INSTANCE.getPrefBoolean(PreferKey.hideNavigationBar) - autoReadSpeed = App.INSTANCE.getPrefInt(PreferKey.autoReadSpeed, 46) + styleSelect = appCtx.getPrefInt(PreferKey.readStyleSelect) + shareLayout = appCtx.getPrefBoolean(PreferKey.shareLayout) + hideStatusBar = appCtx.getPrefBoolean(PreferKey.hideStatusBar) + hideNavigationBar = appCtx.getPrefBoolean(PreferKey.hideNavigationBar) + autoReadSpeed = appCtx.getPrefInt(PreferKey.autoReadSpeed, 46) } - ChapterProvider.upStyle() - ReadBook.loadContent(resetPageOffset = false) } + appCtx.toastOnUi(R.string.restore_success) withContext(Main) { - App.INSTANCE.toast(R.string.restore_success) + delay(100) if (!BuildConfig.DEBUG) { - LauncherIconHelp.changeIcon(App.INSTANCE.getPrefString(PreferKey.launcherIcon)) + LauncherIconHelp.changeIcon(appCtx.getPrefString(PreferKey.launcherIcon)) + } + appCtx.packageManager.getLaunchIntentForPackage(appCtx.packageName)?.let { intent -> + val restartIntent = + PendingIntent.getActivity(appCtx, 0, intent, PendingIntent.FLAG_ONE_SHOT) + alarmManager[AlarmManager.RTC, System.currentTimeMillis() + 300] = restartIntent + exitProcess(0) } - LanguageUtils.setConfiguration(App.INSTANCE) - App.INSTANCE.applyDayNight() - postEvent(EventBus.SHOW_RSS, "") } } diff --git a/app/src/main/java/io/legado/app/lib/dialogs/AlertBuilder.kt b/app/src/main/java/io/legado/app/lib/dialogs/AlertBuilder.kt index 6a245e5fb..5dab676bb 100644 --- a/app/src/main/java/io/legado/app/lib/dialogs/AlertBuilder.kt +++ b/app/src/main/java/io/legado/app/lib/dialogs/AlertBuilder.kt @@ -11,40 +11,28 @@ import android.view.View import androidx.annotation.DrawableRes import androidx.annotation.StringRes import io.legado.app.R -import org.jetbrains.anko.internals.AnkoInternals.NO_GETTER -import kotlin.DeprecationLevel.ERROR @SuppressLint("SupportAnnotationUsage") interface AlertBuilder { val ctx: Context - var title: CharSequence - @Deprecated(NO_GETTER, level = ERROR) get + fun setTitle(title: CharSequence) - var titleResource: Int - @Deprecated(NO_GETTER, level = ERROR) get + fun setTitle(titleResource: Int) - var message: CharSequence - @Deprecated(NO_GETTER, level = ERROR) get + fun setMessage(message: CharSequence) - var messageResource: Int - @Deprecated(NO_GETTER, level = ERROR) get + fun setMessage(messageResource: Int) - var icon: Drawable - @Deprecated(NO_GETTER, level = ERROR) get + fun setIcon(icon: Drawable) - @setparam:DrawableRes - var iconResource: Int - @Deprecated(NO_GETTER, level = ERROR) get + fun setIcon(@DrawableRes iconResource: Int) - var customTitle: View - @Deprecated(NO_GETTER, level = ERROR) get + fun setCustomTitle(customTitle: View) - var customView: View - @Deprecated(NO_GETTER, level = ERROR) get + fun setCustomView(customView: View) - var isCancelable: Boolean - @Deprecated(NO_GETTER, level = ERROR) get + fun setCancelable(isCancelable: Boolean) fun positiveButton(buttonText: String, onClicked: ((dialog: DialogInterface) -> Unit)? = null) fun positiveButton( @@ -97,11 +85,11 @@ interface AlertBuilder { fun customTitle(view: () -> View) { - customTitle = view() + setCustomTitle(view()) } fun customView(view: () -> View) { - customView = view() + setCustomView(view()) } fun okButton(handler: ((dialog: DialogInterface) -> Unit)? = null) = diff --git a/app/src/main/java/io/legado/app/lib/dialogs/AndroidAlertBuilder.kt b/app/src/main/java/io/legado/app/lib/dialogs/AndroidAlertBuilder.kt index cf53eac12..47cb3432b 100644 --- a/app/src/main/java/io/legado/app/lib/dialogs/AndroidAlertBuilder.kt +++ b/app/src/main/java/io/legado/app/lib/dialogs/AndroidAlertBuilder.kt @@ -7,48 +7,45 @@ import android.view.KeyEvent import android.view.View import androidx.appcompat.app.AlertDialog import io.legado.app.utils.applyTint -import org.jetbrains.anko.internals.AnkoInternals -import org.jetbrains.anko.internals.AnkoInternals.NO_GETTER -import kotlin.DeprecationLevel.ERROR internal class AndroidAlertBuilder(override val ctx: Context) : AlertBuilder { private val builder = AlertDialog.Builder(ctx) - override var title: CharSequence - @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() - set(value) { builder.setTitle(value) } + override fun setTitle(title: CharSequence) { + builder.setTitle(title) + } - override var titleResource: Int - @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() - set(value) { builder.setTitle(value) } + override fun setTitle(titleResource: Int) { + builder.setTitle(titleResource) + } - override var message: CharSequence - @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() - set(value) { builder.setMessage(value) } + override fun setMessage(message: CharSequence) { + builder.setMessage(message) + } - override var messageResource: Int - @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() - set(value) { builder.setMessage(value) } + override fun setMessage(messageResource: Int) { + builder.setMessage(messageResource) + } - override var icon: Drawable - @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() - set(value) { builder.setIcon(value) } + override fun setIcon(icon: Drawable) { + builder.setIcon(icon) + } - override var iconResource: Int - @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() - set(value) { builder.setIcon(value) } + override fun setIcon(iconResource: Int) { + builder.setIcon(iconResource) + } - override var customTitle: View - @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() - set(value) { builder.setCustomTitle(value) } + override fun setCustomTitle(customTitle: View) { + builder.setCustomTitle(customTitle) + } - override var customView: View - @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() - set(value) { builder.setView(value) } + override fun setCustomView(customView: View) { + builder.setView(customView) + } - override var isCancelable: Boolean - @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() - set(value) { builder.setCancelable(value) } + override fun setCancelable(isCancelable: Boolean) { + builder.setCancelable(isCancelable) + } override fun onCancelled(handler: (DialogInterface) -> Unit) { builder.setOnCancelListener(handler) @@ -58,7 +55,10 @@ internal class AndroidAlertBuilder(override val ctx: Context) : AlertBuilder Unit)?) { + override fun positiveButton( + buttonText: String, + onClicked: ((dialog: DialogInterface) -> Unit)? + ) { builder.setPositiveButton(buttonText) { dialog, _ -> onClicked?.invoke(dialog) } } diff --git a/app/src/main/java/io/legado/app/lib/dialogs/AndroidDialogs.kt b/app/src/main/java/io/legado/app/lib/dialogs/AndroidDialogs.kt index 233bbfe7d..d99ec1e7b 100644 --- a/app/src/main/java/io/legado/app/lib/dialogs/AndroidDialogs.kt +++ b/app/src/main/java/io/legado/app/lib/dialogs/AndroidDialogs.kt @@ -7,7 +7,6 @@ import android.content.Context import android.content.DialogInterface import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment -import org.jetbrains.anko.AnkoContext inline fun Fragment.alert( title: CharSequence? = null, @@ -22,10 +21,10 @@ fun Context.alert( ): AlertBuilder { return AndroidAlertBuilder(this).apply { if (title != null) { - this.title = title + this.setTitle(title) } if (message != null) { - this.message = message + this.setMessage(message) } if (init != null) init() } @@ -44,17 +43,16 @@ fun Context.alert( ): AlertBuilder { return AndroidAlertBuilder(this).apply { if (titleResource != null) { - this.titleResource = titleResource + this.setTitle(titleResource) } if (messageResource != null) { - this.messageResource = messageResource + this.setMessage(messageResource) } if (init != null) init() } } -inline fun AnkoContext<*>.alert(noinline init: AlertBuilder.() -> Unit) = ctx.alert(init) inline fun Fragment.alert(noinline init: AlertBuilder.() -> Unit) = requireContext().alert(init) fun Context.alert(init: AlertBuilder.() -> Unit): AlertBuilder = diff --git a/app/src/main/java/io/legado/app/lib/dialogs/AndroidSelectors.kt b/app/src/main/java/io/legado/app/lib/dialogs/AndroidSelectors.kt index fd6570240..6033879de 100644 --- a/app/src/main/java/io/legado/app/lib/dialogs/AndroidSelectors.kt +++ b/app/src/main/java/io/legado/app/lib/dialogs/AndroidSelectors.kt @@ -35,7 +35,7 @@ fun Context.selector( ) { with(AndroidAlertBuilder(this)) { if (title != null) { - this.title = title + this.setTitle(title) } items(items, onClick) show() @@ -49,7 +49,7 @@ fun Context.selector( ) { with(AndroidAlertBuilder(this)) { if (titleSource != null) { - this.title = getString(titleSource) + this.setTitle(titleSource) } items(items, onClick) show() diff --git a/app/src/main/java/io/legado/app/lib/dialogs/Dialogs.kt b/app/src/main/java/io/legado/app/lib/dialogs/Dialogs.kt index fb3729465..0abcc36c0 100644 --- a/app/src/main/java/io/legado/app/lib/dialogs/Dialogs.kt +++ b/app/src/main/java/io/legado/app/lib/dialogs/Dialogs.kt @@ -23,10 +23,10 @@ fun Context.alert( ): AlertBuilder { return factory(this).apply { if (title != null) { - this.title = title + this.setTitle(title) } if (message != null) { - this.message = message + this.setMessage(message) } if (init != null) init() } @@ -47,10 +47,10 @@ fun Context.alert( ): AlertBuilder { return factory(this).apply { if (titleResource != null) { - this.titleResource = titleResource + this.setTitle(titleResource) } if (messageResource != null) { - this.messageResource = messageResource + this.setMessage(messageResource) } if (init != null) init() } diff --git a/app/src/main/java/io/legado/app/lib/dialogs/Selectors.kt b/app/src/main/java/io/legado/app/lib/dialogs/Selectors.kt index 87a35cf76..c74535955 100644 --- a/app/src/main/java/io/legado/app/lib/dialogs/Selectors.kt +++ b/app/src/main/java/io/legado/app/lib/dialogs/Selectors.kt @@ -21,7 +21,7 @@ fun Context.selector( ) { with(factory(this)) { if (title != null) { - this.title = title + this.setTitle(title) } items(items, onClick) show() diff --git a/app/src/main/java/io/legado/app/lib/theme/ATH.kt b/app/src/main/java/io/legado/app/lib/theme/ATH.kt index f5274d09a..cbe1c2ebb 100644 --- a/app/src/main/java/io/legado/app/lib/theme/ATH.kt +++ b/app/src/main/java/io/legado/app/lib/theme/ATH.kt @@ -18,14 +18,12 @@ import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.RecyclerView import androidx.viewpager.widget.ViewPager import com.google.android.material.bottomnavigation.BottomNavigationView -import io.legado.app.App import io.legado.app.R import io.legado.app.help.AppConfig import io.legado.app.utils.ColorUtils import io.legado.app.utils.dp import io.legado.app.utils.getCompatColor -import org.jetbrains.anko.backgroundColor - +import splitties.init.appCtx /** * @author Karim Abou Zeid (kabouzeid) @@ -272,7 +270,7 @@ object ATH { fun applyBackgroundTint(view: View?) { view?.apply { if (background == null) { - backgroundColor = context.backgroundColor + setBackgroundColor(context.backgroundColor) } else { setBackgroundTint(this, context.backgroundColor) } @@ -290,7 +288,7 @@ object ATH { fun getDialogBackground(): GradientDrawable { val background = GradientDrawable() background.cornerRadius = 3F.dp - background.setColor(App.INSTANCE.backgroundColor) + background.setColor(appCtx.backgroundColor) return background } diff --git a/app/src/main/java/io/legado/app/lib/theme/ThemeStore.kt b/app/src/main/java/io/legado/app/lib/theme/ThemeStore.kt index 182db2d40..ab88e798f 100644 --- a/app/src/main/java/io/legado/app/lib/theme/ThemeStore.kt +++ b/app/src/main/java/io/legado/app/lib/theme/ThemeStore.kt @@ -9,9 +9,9 @@ import androidx.annotation.CheckResult import androidx.annotation.ColorInt import androidx.annotation.ColorRes import androidx.core.content.ContextCompat -import io.legado.app.App import io.legado.app.R import io.legado.app.utils.ColorUtils +import splitties.init.appCtx /** * @author Aidan Follestad (afollestad), Karim Abou Zeid (kabouzeid) @@ -200,7 +200,7 @@ private constructor(private val mContext: Context) : ThemeStoreInterface { @CheckResult @ColorInt - fun primaryColor(context: Context = App.INSTANCE): Int { + fun primaryColor(context: Context = appCtx): Int { return prefs(context).getInt( ThemeStorePrefKeys.KEY_PRIMARY_COLOR, ATHUtils.resolveColor(context, R.attr.colorPrimary, Color.parseColor("#455A64")) @@ -218,7 +218,7 @@ private constructor(private val mContext: Context) : ThemeStoreInterface { @CheckResult @ColorInt - fun accentColor(context: Context = App.INSTANCE): Int { + fun accentColor(context: Context = appCtx): Int { return prefs(context).getInt( ThemeStorePrefKeys.KEY_ACCENT_COLOR, ATHUtils.resolveColor(context, R.attr.colorAccent, Color.parseColor("#263238")) @@ -292,7 +292,7 @@ private constructor(private val mContext: Context) : ThemeStoreInterface { @CheckResult @ColorInt - fun backgroundColor(context: Context = App.INSTANCE): Int { + fun backgroundColor(context: Context = appCtx): Int { return prefs(context).getInt( ThemeStorePrefKeys.KEY_BACKGROUND_COLOR, ATHUtils.resolveColor(context, android.R.attr.colorBackground) @@ -314,7 +314,7 @@ private constructor(private val mContext: Context) : ThemeStoreInterface { @CheckResult @ColorInt - fun bottomBackground(context: Context = App.INSTANCE): Int { + fun bottomBackground(context: Context = appCtx): Int { return prefs(context).getInt( ThemeStorePrefKeys.KEY_BOTTOM_BACKGROUND, ATHUtils.resolveColor(context, android.R.attr.colorBackground) diff --git a/app/src/main/java/io/legado/app/model/Debug.kt b/app/src/main/java/io/legado/app/model/Debug.kt index c74a36b5e..d96aaa42b 100644 --- a/app/src/main/java/io/legado/app/model/Debug.kt +++ b/app/src/main/java/io/legado/app/model/Debug.kt @@ -186,6 +186,12 @@ object Debug { } private fun infoDebug(scope: CoroutineScope, webBook: WebBook, book: Book) { + if (book.tocUrl.isNotBlank()) { + log(debugSource, "目录url不为空,详情页已解析") + log(debugSource, showTime = false) + tocDebug(scope, webBook, book) + return + } log(debugSource, "︾开始解析详情页") val info = webBook.getBookInfo(scope, book) .onSuccess { @@ -206,7 +212,7 @@ object Debug { if (it.isNotEmpty()) { log(debugSource, "︽目录页解析完成") log(debugSource, showTime = false) - val nextChapterUrl = if (it.size > 1) it[1].url else null + val nextChapterUrl = it.getOrNull(1)?.url contentDebug(scope, webBook, book, it[0], nextChapterUrl) } else { log(debugSource, "︽目录列表为空", state = -1) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeByJSoup.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeByJSoup.kt index b6d41ad76..be68320e9 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeByJSoup.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeByJSoup.kt @@ -97,16 +97,16 @@ class AnalyzeByJSoup(doc: Any) { } val results = ArrayList>() for (ruleStrX in ruleStrS) { - val temp: List? - temp = if (sourceRule.isCss) { - val lastIndex = ruleStrX.lastIndexOf('@') - getResultLast( - element.select(ruleStrX.substring(0, lastIndex)), - ruleStrX.substring(lastIndex + 1) - ) - } else { - getResultList(ruleStrX) - } + val temp: List? = + if (sourceRule.isCss) { + val lastIndex = ruleStrX.lastIndexOf('@') + getResultLast( + element.select(ruleStrX.substring(0, lastIndex)), + ruleStrX.substring(lastIndex + 1) + ) + } else { + getResultList(ruleStrX) + } if (!temp.isNullOrEmpty()) { results.add(temp) if (results.isNotEmpty() && elementsType == "|") { diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 98e590cf9..b408f1a86 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -27,9 +27,10 @@ import kotlin.collections.HashMap class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { var book: BaseBook? = null var chapter: BookChapter? = null - private var content: Any? = null - private var baseUrl: String? = null - private var baseURL: URL? = null + var nextChapterUrl: String? = null + var content: Any? = null + var baseUrl: String? = null + var redirectUrl: URL? = null private var isJSON: Boolean = false private var isRegex: Boolean = false @@ -62,11 +63,13 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { fun setBaseUrl(baseUrl: String?): AnalyzeRule { baseUrl?.let { this.baseUrl = baseUrl - kotlin.runCatching { - baseURL = URL(baseUrl.substringBefore(",")) - }.onFailure { - it.printStackTrace() - } + } + return this + } + + fun setRedirectUrl(url: String): AnalyzeRule { + kotlin.runCatching { + redirectUrl = URL(url.split(AnalyzeUrl.splitUrlRegex, 1)[0]) } return this } @@ -169,7 +172,7 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { val urlList = ArrayList() if (result is List<*>) { for (url in result as List<*>) { - val absoluteURL = NetworkUtils.getAbsoluteURL(baseURL, url.toString()) + val absoluteURL = NetworkUtils.getAbsoluteURL(redirectUrl, url.toString()) if (absoluteURL.isNotEmpty() && !urlList.contains(absoluteURL)) { urlList.add(absoluteURL) } @@ -238,7 +241,7 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { return if (str.isBlank()) { baseUrl ?: "" } else { - NetworkUtils.getAbsoluteURL(baseURL, str) + NetworkUtils.getAbsoluteURL(redirectUrl, str) } } return str @@ -646,6 +649,7 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { bindings["chapter"] = chapter bindings["title"] = chapter?.title bindings["src"] = content + bindings["nextChapterUrl"] = nextChapterUrl return runBlocking { SCRIPT_ENGINE.eval(jsStr, bindings) } diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.java b/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.java new file mode 100644 index 000000000..72b614f97 --- /dev/null +++ b/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.java @@ -0,0 +1,600 @@ +package io.legado.app.model.analyzeRule; + +import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.lang3.tuple.Triple; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +public class QueryTTF { + private static class Header { + public int majorVersion; + public int minorVersion; + public int numOfTables; + public int searchRange; + public int entrySelector; + public int rangeShift; + } + + private static class Directory { + public String tag; // table name + public int checkSum; // Check sum + public int offset; // Offset from beginning of file + public int length; // length of the table in bytes + } + + private static class NameLayout { + public int format; + public int count; + public int stringOffset; + public List records = new LinkedList<>(); + } + + private static class NameRecord { + public int platformID; // 平台标识符<0:Unicode, 1:Mac, 2:ISO, 3:Windows, 4:Custom> + public int encodingID; // 编码标识符 + public int languageID; // 语言标识符 + public int nameID; // 名称标识符 + public int length; // 名称字符串的长度 + public int offset; // 名称字符串相对于stringOffset的字节偏移量 + } + + private static class HeadLayout { + public int majorVersion; + public int minorVersion; + public int fontRevision; + public int checkSumAdjustment; + public int magicNumber; + public int flags; + public int unitsPerEm; + public long created; + public long modified; + public short xMin; + public short yMin; + public short xMax; + public short yMax; + public int macStyle; + public int lowestRecPPEM; + public short fontDirectionHint; + public short indexToLocFormat; // <0:loca是2字节数组, 1:loca是4字节数组> + public short glyphDataFormat; + } + + private static class MaxpLayout { + public int majorVersion; + public int minorVersion; + public int numGlyphs; // 字体中的字形数量 + public int maxPoints; + public int maxContours; + public int maxCompositePoints; + public int maxCompositeContours; + public int maxZones; + public int maxTwilightPoints; + public int maxStorage; + public int maxFunctionDefs; + public int maxInstructionDefs; + public int maxStackElements; + public int maxSizeOfInstructions; + public int maxComponentElements; + public int maxComponentDepth; + } + + private class CmapLayout { + public int version; + public int numTables; + public List records = new LinkedList<>(); + public Map tables = new HashMap<>(); + } + + private static class CmapRecord { + public int platformID; + public int encodingID; + public int offset; + } + + private static class CmapFormat { + public int format; + public int length; + public int language; + public byte[] glyphIdArray; + } + + private static class CmapFormat4 extends CmapFormat { + public int segCountX2; + public int searchRange; + public int entrySelector; + public int rangeShift; + public int[] endCode; + public int reservedPad; + public int[] startCode; + public short[] idDelta; + public int[] idRangeOffset; + public int[] glyphIdArray; + } + + private static class CmapFormat6 extends CmapFormat { + public int firstCode; + public int entryCount; + public int[] glyphIdArray; + } + + private static class CmapFormat12 extends CmapFormat { + public int reserved; + public int length; + public int language; + public int numGroups; + public List> groups; + } + + private static class GlyfLayout { + public short numberOfContours; // 非负值为简单字型,负值为符合字型 + public short xMin; + public short yMin; + public short xMax; + public short yMax; + public int[] endPtsOfContours; // length=numberOfContours + public int instructionLength; + public byte[] instructions; // length=instructionLength + public byte[] flags; + public short[] xCoordinates; // length = flags.length + public short[] yCoordinates; // length = flags.length + } + + private static class ByteArrayReader { + public int Index; + public byte[] Buffer; + + public ByteArrayReader(byte[] buffer, int index) { + Buffer = buffer; + Index = index; + } + + public long ReadUIntX(long len) { + long result = 0; + for (long i = 0; i < len; ++i) { + result <<= 8; + result |= Buffer[Index++] & 0xFF; + } + return result; + } + + public long ReadUInt64() { + return ReadUIntX(8); + } + + public int ReadUInt32() { + return (int) ReadUIntX(4); + } + + public int ReadUInt16() { + return (int) ReadUIntX(2); + } + + public short ReadInt16() { + return (short) ReadUIntX(2); + } + + public short ReadUInt8() { + return (short) ReadUIntX(1); + } + + + public String ReadStrings(int len, Charset charset) { + byte[] result = len > 0 ? new byte[len] : null; + for (int i = 0; i < len; ++i) result[i] = Buffer[Index++]; + return new String(result, charset); + } + + public byte GetByte() { + return Buffer[Index++]; + } + + public byte[] GetBytes(int len) { + byte[] result = len > 0 ? new byte[len] : null; + for (int i = 0; i < len; ++i) result[i] = Buffer[Index++]; + return result; + } + + public int[] GetUInt16Array(int len) { + int[] result = len > 0 ? new int[len] : null; + for (int i = 0; i < len; ++i) result[i] = ReadUInt16(); + return result; + } + + public short[] GetInt16Array(int len) { + short[] result = len > 0 ? new short[len] : null; + for (int i = 0; i < len; ++i) result[i] = ReadInt16(); + return result; + } + } + + private final ByteArrayReader FontReader; + private final Header fileHeader = new Header(); + private final List Directorys = new LinkedList<>(); + private final NameLayout Name = new NameLayout(); + private final HeadLayout head = new HeadLayout(); + private final MaxpLayout maxp = new MaxpLayout(); + private final List loca = new LinkedList<>(); + private final CmapLayout Cmap = new CmapLayout(); + private final List glyf = new LinkedList<>(); + private final Pair[] pps = new Pair[]{ + Pair.of(3, 10), + Pair.of(0, 4), + Pair.of(3, 1), + Pair.of(1, 0), + Pair.of(0, 3), + Pair.of(0, 1) + }; + + public final Map CodeToGlyph = new HashMap<>(); + public final Map GlyphToCode = new HashMap<>(); + private int LimitMix = 0; + private int LimitMax = 0; + + /** + * 构造函数 + * + * @param buffer 传入TTF字体二进制数组 + */ + public QueryTTF(byte[] buffer) { + FontReader = new ByteArrayReader(buffer, 0); + // 获取文件头 + fileHeader.majorVersion = FontReader.ReadUInt16(); + fileHeader.minorVersion = FontReader.ReadUInt16(); + fileHeader.numOfTables = FontReader.ReadUInt16(); + fileHeader.searchRange = FontReader.ReadUInt16(); + fileHeader.entrySelector = FontReader.ReadUInt16(); + fileHeader.rangeShift = FontReader.ReadUInt16(); + // 获取目录 + for (int i = 0; i < fileHeader.numOfTables; ++i) { + Directory d = new Directory(); + d.tag = FontReader.ReadStrings(4, StandardCharsets.US_ASCII); + d.checkSum = FontReader.ReadUInt32(); + d.offset = FontReader.ReadUInt32(); + d.length = FontReader.ReadUInt32(); + Directorys.add(d); + } + // 解析表 name (字体信息,包含版权、名称、作者等...) + for (Directory Temp : Directorys) { + if (Temp.tag.equals("name")) { + FontReader.Index = Temp.offset; + Name.format = FontReader.ReadUInt16(); + Name.count = FontReader.ReadUInt16(); + Name.stringOffset = FontReader.ReadUInt16(); + for (int i = 0; i < Name.count; ++i) { + NameRecord record = new NameRecord(); + record.platformID = FontReader.ReadUInt16(); + record.encodingID = FontReader.ReadUInt16(); + record.languageID = FontReader.ReadUInt16(); + record.nameID = FontReader.ReadUInt16(); + record.length = FontReader.ReadUInt16(); + record.offset = FontReader.ReadUInt16(); + Name.records.add(record); + } + } + } + // 解析表 head (获取 head.indexToLocFormat) + for (Directory Temp : Directorys) { + if (Temp.tag.equals("head")) { + FontReader.Index = Temp.offset; + head.majorVersion = FontReader.ReadUInt16(); + head.minorVersion = FontReader.ReadUInt16(); + head.fontRevision = FontReader.ReadUInt32(); + head.checkSumAdjustment = FontReader.ReadUInt32(); + head.magicNumber = FontReader.ReadUInt32(); + head.flags = FontReader.ReadUInt16(); + head.unitsPerEm = FontReader.ReadUInt16(); + head.created = FontReader.ReadUInt64(); + head.modified = FontReader.ReadUInt64(); + head.xMin = FontReader.ReadInt16(); + head.yMin = FontReader.ReadInt16(); + head.xMax = FontReader.ReadInt16(); + head.yMax = FontReader.ReadInt16(); + head.macStyle = FontReader.ReadUInt16(); + head.lowestRecPPEM = FontReader.ReadUInt16(); + head.fontDirectionHint = FontReader.ReadInt16(); + head.indexToLocFormat = FontReader.ReadInt16(); + head.glyphDataFormat = FontReader.ReadInt16(); + } + } + // 解析表 maxp (获取 maxp.numGlyphs) + for (Directory Temp : Directorys) { + if (Temp.tag.equals("maxp")) { + FontReader.Index = Temp.offset; + maxp.majorVersion = FontReader.ReadUInt16(); + maxp.minorVersion = FontReader.ReadUInt16(); + maxp.numGlyphs = FontReader.ReadUInt16(); + maxp.maxPoints = FontReader.ReadUInt16(); + maxp.maxContours = FontReader.ReadUInt16(); + maxp.maxCompositePoints = FontReader.ReadUInt16(); + maxp.maxCompositeContours = FontReader.ReadUInt16(); + maxp.maxZones = FontReader.ReadUInt16(); + maxp.maxTwilightPoints = FontReader.ReadUInt16(); + maxp.maxStorage = FontReader.ReadUInt16(); + maxp.maxFunctionDefs = FontReader.ReadUInt16(); + maxp.maxInstructionDefs = FontReader.ReadUInt16(); + maxp.maxStackElements = FontReader.ReadUInt16(); + maxp.maxSizeOfInstructions = FontReader.ReadUInt16(); + maxp.maxComponentElements = FontReader.ReadUInt16(); + maxp.maxComponentDepth = FontReader.ReadUInt16(); + } + } + // 解析表 loca (轮廓数据偏移地址表) + for (Directory Temp : Directorys) { + if (Temp.tag.equals("loca")) { + FontReader.Index = Temp.offset; + int offset = head.indexToLocFormat == 0 ? 2 : 4; + for (long i = 0; i < Temp.length; i += offset) { + loca.add(offset == 2 ? FontReader.ReadUInt16() << 1 : FontReader.ReadUInt32()); + } + } + } + // 解析表 cmap (Unicode编码轮廓索引对照表) + for (Directory Temp : Directorys) { + if (Temp.tag.equals("cmap")) { + FontReader.Index = Temp.offset; + Cmap.version = FontReader.ReadUInt16(); + Cmap.numTables = FontReader.ReadUInt16(); + + for (int i = 0; i < Cmap.numTables; ++i) { + CmapRecord record = new CmapRecord(); + record.platformID = FontReader.ReadUInt16(); + record.encodingID = FontReader.ReadUInt16(); + record.offset = FontReader.ReadUInt32(); + Cmap.records.add(record); + } + for (int i = 0; i < Cmap.numTables; ++i) { + int fmtOffset = Cmap.records.get(i).offset; + FontReader.Index = Temp.offset + fmtOffset; + int EndIndex = FontReader.Index; + + int format = FontReader.ReadUInt16(); + if (Cmap.tables.containsKey(fmtOffset)) continue; + if (format == 0) { + CmapFormat f = new CmapFormat(); + f.format = format; + f.length = FontReader.ReadUInt16(); + f.language = FontReader.ReadUInt16(); + f.glyphIdArray = FontReader.GetBytes(f.length - 6); + Cmap.tables.put(fmtOffset, f); + } else if (format == 4) { + CmapFormat4 f = new CmapFormat4(); + f.format = format; + f.length = FontReader.ReadUInt16(); + f.language = FontReader.ReadUInt16(); + f.segCountX2 = FontReader.ReadUInt16(); + int segCount = f.segCountX2 >> 1; + f.searchRange = FontReader.ReadUInt16(); + f.entrySelector = FontReader.ReadUInt16(); + f.rangeShift = FontReader.ReadUInt16(); + f.endCode = FontReader.GetUInt16Array(segCount); + f.reservedPad = FontReader.ReadUInt16(); + f.startCode = FontReader.GetUInt16Array(segCount); + f.idDelta = FontReader.GetInt16Array(segCount); + f.idRangeOffset = FontReader.GetUInt16Array(segCount); + f.glyphIdArray = FontReader.GetUInt16Array((EndIndex + f.length - FontReader.Index) >> 1); + Cmap.tables.put(fmtOffset, f); + } else if (format == 6) { + CmapFormat6 f = new CmapFormat6(); + f.format = format; + f.length = FontReader.ReadUInt16(); + f.language = FontReader.ReadUInt16(); + f.firstCode = FontReader.ReadUInt16(); + f.entryCount = FontReader.ReadUInt16(); + f.glyphIdArray = FontReader.GetUInt16Array(f.entryCount); + Cmap.tables.put(fmtOffset, f); + } else if (format == 12) { + CmapFormat12 f = new CmapFormat12(); + f.format = format; + f.reserved = FontReader.ReadUInt16(); + f.length = FontReader.ReadUInt32(); + f.language = FontReader.ReadUInt32(); + f.numGroups = FontReader.ReadUInt32(); + f.groups = new ArrayList<>(f.numGroups); + for (int n = 0; n < f.numGroups; ++n) { + f.groups.add(Triple.of(FontReader.ReadUInt32(), FontReader.ReadUInt32(), FontReader.ReadUInt32())); + } + Cmap.tables.put(fmtOffset, f); + } + } + } + } + // 解析表 glyf (字体轮廓数据表) + for (Directory Temp : Directorys) { + if (Temp.tag.equals("glyf")) { + FontReader.Index = Temp.offset; + for (int i = 0; i < maxp.numGlyphs; ++i) { + FontReader.Index = Temp.offset + loca.get(i); + + short numberOfContours = FontReader.ReadInt16(); + if (numberOfContours > 0) { + GlyfLayout g = new GlyfLayout(); + g.numberOfContours = numberOfContours; + g.xMin = FontReader.ReadInt16(); + g.yMin = FontReader.ReadInt16(); + g.xMax = FontReader.ReadInt16(); + g.yMax = FontReader.ReadInt16(); + g.endPtsOfContours = FontReader.GetUInt16Array(numberOfContours); + g.instructionLength = FontReader.ReadUInt16(); + g.instructions = FontReader.GetBytes(g.instructionLength); + int flagLength = g.endPtsOfContours[g.endPtsOfContours.length - 1] + 1; + // 获取轮廓点描述标志 + g.flags = new byte[flagLength]; + for (int n = 0; n < flagLength; ++n) { + g.flags[n] = FontReader.GetByte(); + if ((g.flags[n] & 0x08) != 0x00) { + for (int m = FontReader.ReadUInt8(); m > 0; --m) { + g.flags[++n] = g.flags[n - 1]; + } + } + } + // 获取轮廓点描述x轴相对值 + g.xCoordinates = new short[flagLength]; + for (int n = 0; n < flagLength; ++n) { + short same = (short) ((g.flags[n] & 0x10) != 0 ? 1 : -1); + if ((g.flags[n] & 0x02) != 0) { + g.xCoordinates[n] = (short) (same * FontReader.ReadUInt8()); + } else { + g.xCoordinates[n] = same == 1 ? (short) 0 : FontReader.ReadInt16(); + } + } + // 获取轮廓点描述y轴相对值 + g.yCoordinates = new short[flagLength]; + for (int n = 0; n < flagLength; ++n) { + short same = (short) ((g.flags[n] & 0x20) != 0 ? 1 : -1); + if ((g.flags[n] & 0x04) != 0) { + g.yCoordinates[n] = (short) (same * FontReader.ReadUInt8()); + } else { + g.yCoordinates[n] = same == 1 ? (short) 0 : FontReader.ReadInt16(); + } + } + // 相对坐标转绝对坐标 +// for (int n = 1; n < flagLength; ++n) { +// xCoordinates[n] += xCoordinates[n - 1]; +// yCoordinates[n] += yCoordinates[n - 1]; +// } + + glyf.add(g); + } else { + // 复合字体暂未使用 + } + } + } + } + + // 建立Unicode&Glyph双向表 + for (int key = 0; key < 130000; ++key) { + if (key == 0xFF) key = 0x3400; + int gid = getGlyfIndex(key); + if (gid == 0) continue; + StringBuilder sb = new StringBuilder(); + // 字型数据转String,方便存HashMap + for (short b : glyf.get(gid).xCoordinates) sb.append(b); + for (short b : glyf.get(gid).yCoordinates) sb.append(b); + String val = sb.toString(); + if (LimitMix == 0) LimitMix = key; + LimitMax = key; + CodeToGlyph.put(key, val); + if (GlyphToCode.containsKey(val)) continue; + GlyphToCode.put(val, key); + } + } + + /** + * 获取字体信息 (1=字体名称) + * + * @param nameId 传入十进制字体信息索引 + * @return 返回查询结果字符串 + */ + public String getNameById(int nameId) { + for (Directory Temp : Directorys) { + if (!Temp.tag.equals("name")) continue; + FontReader.Index = Temp.offset; + break; + } + for (NameRecord record : Name.records) { + if (record.nameID != nameId) continue; + FontReader.Index += Name.stringOffset + record.offset; + return FontReader.ReadStrings(record.length, record.platformID == 1 ? StandardCharsets.UTF_8 : StandardCharsets.UTF_16BE); + } + return "error"; + } + + /** + * 使用Unicode值查找轮廓索引 + * + * @param code 传入Unicode十进制值 + * @return 返回十进制轮廓索引 + */ + private int getGlyfIndex(int code) { + if (code == 0) return 0; + int fmtKey = 0; + for (@SuppressWarnings("unchecked") Pair item : pps) { + for (CmapRecord record : Cmap.records) { + if ((item.getLeft() == record.platformID) && (item.getRight() == record.encodingID)) { + fmtKey = record.offset; + break; + } + } + if (fmtKey > 0) break; + } + if (fmtKey == 0) return 0; + + int glyfID = 0; + CmapFormat table = Cmap.tables.get(fmtKey); + int fmt = table.format; + if (fmt == 0) { + if (code < table.glyphIdArray.length) glyfID = table.glyphIdArray[code] & 0xFF; + } else if (fmt == 4) { + CmapFormat4 tab = (CmapFormat4) table; + if (code > tab.endCode[tab.endCode.length - 1]) return 0; + // 二分法查找数值索引 + int start = 0, middle, end = tab.endCode.length - 1; + while (start + 1 < end) { + middle = (start + end) / 2; + if (tab.endCode[middle] <= code) start = middle; + else end = middle; + } + if (tab.endCode[start] < code) ++start; + if (code < tab.startCode[start]) return 0; + if (tab.idRangeOffset[start] != 0) { + glyfID = tab.glyphIdArray[code - tab.startCode[start] + (tab.idRangeOffset[start] >> 1) - (tab.idRangeOffset.length - start)]; + } else glyfID = code + tab.idDelta[start]; + glyfID &= 0xFFFF; + } else if (fmt == 6) { + CmapFormat6 tab = (CmapFormat6) table; + int index = code - tab.firstCode; + if (index < 0 || index >= tab.glyphIdArray.length) glyfID = 0; + else glyfID = tab.glyphIdArray[index]; + } else if (fmt == 12) { + CmapFormat12 tab = (CmapFormat12) table; + if (code > tab.groups.get(tab.numGroups - 1).getMiddle()) return 0; + // 二分法查找数值索引 + int start = 0, middle, end = tab.numGroups - 1; + while (start + 1 < end) { + middle = (start + end) / 2; + if (tab.groups.get(middle).getLeft() <= code) start = middle; + else end = middle; + } + if (tab.groups.get(start).getLeft() <= code && code <= tab.groups.get(start).getMiddle()) { + glyfID = tab.groups.get(start).getRight() + code - tab.groups.get(start).getLeft(); + } + } + return glyfID; + } + + /** + * 判断Unicode值是否在字体范围内 + * + * @param code 传入Unicode十进制值 + * @return 返回bool查询结果 + */ + public boolean inLimit(char code) { + return (LimitMix <= code) && (code < LimitMax); + } + + /** + * 使用Unicode值获取轮廓数据 + * + * @param key 传入Unicode十进制值 + * @return 返回轮廓数组的String值 + */ + public String getGlyfByCode(int key) { + return CodeToGlyph.getOrDefault(key, ""); + } + + /** + * 使用轮廓数据获取Unicode值 + * + * @param val 传入轮廓数组的String值 + * @return 返回Unicode十进制值 + */ + public int getCodeByGlyf(String val) { + return GlyphToCode.getOrDefault(val, 0); + } +} diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.kt b/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.kt deleted file mode 100644 index 0f7af2c52..000000000 --- a/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.kt +++ /dev/null @@ -1,633 +0,0 @@ -package io.legado.app.model.analyzeRule - -import org.apache.commons.lang3.tuple.Pair -import org.apache.commons.lang3.tuple.Triple -import java.nio.charset.Charset -import java.nio.charset.StandardCharsets -import java.util.* -import kotlin.experimental.and - -class QueryTTF(buffer: ByteArray) { - private class Header( - var majorVersion: Int = 0, - var minorVersion: Int = 0, - var numOfTables: Int = 0, - var searchRange: Int = 0, - var entrySelector: Int = 0, - var rangeShift: Int = 0, - ) - - private class Directory { - lateinit var tag: String // table name - var checkSum: Int = 0 // Check sum - var offset: Int = 0 // Offset from beginning of file - var length: Int = 0 // length of the table in bytes - } - - private class NameLayout( - var format: Int = 0, - var count: Int = 0, - var stringOffset: Int = 0, - var records: MutableList = LinkedList(), - ) - - private class NameRecord( - var platformID: Int = 0, // 平台标识符<0:Unicode, 1:Mac, 2:ISO, 3:Windows, 4:Custom> - var encodingID: Int = 0, // 编码标识符 - var languageID: Int = 0, // 语言标识符 - var nameID: Int = 0, // 名称标识符 - var length: Int = 0,// 名称字符串的长度 - var offset: Int = 0, // 名称字符串相对于stringOffset的字节偏移量 - ) - - private class HeadLayout( - var majorVersion: Int = 0, - var minorVersion: Int = 0, - var fontRevision: Int = 0, - var checkSumAdjustment: Int = 0, - var magicNumber: Int = 0, - var flags: Int = 0, - var unitsPerEm: Int = 0, - var created: Long = 0, - var modified: Long = 0, - var xMin: Short = 0, - var yMin: Short = 0, - var xMax: Short = 0, - var yMax: Short = 0, - var macStyle: Int = 0, - var lowestRecPPEM: Int = 0, - var fontDirectionHint: Short = 0, - var indexToLocFormat: Short = 0, // <0:loca是2字节数组, 1:loca是4字节数组> - var glyphDataFormat: Short = 0, - ) - - private class MaxpLayout( - var majorVersion: Int = 0, - var minorVersion: Int = 0, - var numGlyphs: Int = 0, // 字体中的字形数量 - var maxPoints: Int = 0, - var maxContours: Int = 0, - var maxCompositePoints: Int = 0, - var maxCompositeContours: Int = 0, - var maxZones: Int = 0, - var maxTwilightPoints: Int = 0, - var maxStorage: Int = 0, - var maxFunctionDefs: Int = 0, - var maxInstructionDefs: Int = 0, - var maxStackElements: Int = 0, - var maxSizeOfInstructions: Int = 0, - var maxComponentElements: Int = 0, - var maxComponentDepth: Int = 0, - ) - - private class CmapLayout( - var version: Int = 0, - var numTables: Int = 0, - var records: MutableList = LinkedList(), - var tables: MutableMap = HashMap(), - ) - - private class CmapRecord( - var platformID: Int = 0, - var encodingID: Int = 0, - var offset: Int = 0, - ) - - private open class CmapFormat { - var format: Int = 0 - open var length: Int = 0 - open var language: Int = 0 - lateinit var glyphIdArray: IntArray - } - - private class CmapFormat4 : CmapFormat() { - var segCountX2: Int = 0 - var searchRange: Int = 0 - var entrySelector: Int = 0 - var rangeShift: Int = 0 - lateinit var endCode: IntArray - var reservedPad: Int = 0 - lateinit var startCode: IntArray - lateinit var idDelta: ShortArray - lateinit var idRangeOffset: IntArray -// override lateinit var glyphIdArray: IntArray - } - - private class CmapFormat6( - var firstCode: Int = 0, - var entryCount: Int = 0, - ) : CmapFormat() - - private class CmapFormat12( - var reserved: Int = 0, - override var length: Int = 0, - override var language: Int = 0, - var numGroups: Int = 0, - var groups: MutableList> - ) : CmapFormat() - - private class GlyfLayout( - var numberOfContours: Short = 0, // 非负值为简单字型,负值为符合字型 - var xMin: Short = 0, - var yMin: Short = 0, - var xMax: Short = 0, - var yMax: Short = 0, - var instructionLength: Int = 0 - ) { - lateinit var endPtsOfContours: IntArray // length=numberOfContours - lateinit var instructions: IntArray // length=instructionLength - lateinit var flags: ByteArray - lateinit var xCoordinates: ShortArray // length = flags.length - lateinit var yCoordinates: ShortArray // length = flags.length - } - - private class ByteArrayReader(var buffer: ByteArray, var index: Int) { - fun readUIntX(len: Long): Long { - var result: Long = 0 - for (i in 0 until len) { - result = result shl 8 - result = result or ((buffer[index++] and 0xFF.toByte()).toLong()) - } - return result - } - - fun readUInt64(): Long = readUIntX(8) - - fun readUInt32(): Int = readUIntX(4).toInt() - - fun readUInt16(): Int = readUIntX(2).toInt() - - fun readInt16(): Short = readUIntX(2).toShort() - - fun readUInt8(): Short = readUIntX(1).toShort() - - fun readStrings(len: Int, charset: Charset): String { - val result = ByteArray(len) - for (i in 0 until len) { - result[i] = buffer[index++] - } - return String(result, charset) - } - - fun getByte() = buffer[index++] - - fun getBytes(len: Int): IntArray { - val result = IntArray(len) - for (i in 0 until len) { - result[i] = buffer[index++].toInt() - } - return result - } - - fun getUInt16Array(len: Int): IntArray { - val result = IntArray(len) - for (i in 0 until len) { - result[i] = readUInt16() - } - return result - } - - fun getInt16Array(len: Int): ShortArray { - val result = ShortArray(len) - for (i in 0 until len) { - result[i] = readInt16() - } - return result - } - } - - private val fontReader: ByteArrayReader = ByteArrayReader(buffer, 0) - private val directories: MutableList = LinkedList() - private val name = NameLayout() - private val cmap = CmapLayout() - private val pps: Array> = arrayOf( - Pair.of(3, 10), - Pair.of(0, 4), - Pair.of(3, 1), - Pair.of(1, 0), - Pair.of(0, 3), - Pair.of(0, 1) - ) - private val codeToGlyph: MutableMap = HashMap() - private val glyphToCode: MutableMap = HashMap() - private var limitMix = 0 - private var limitMax = 0 - - /** - * 获取字体信息 (1=字体名称) - * - * @param nameId 传入十进制字体信息索引 - * @return 返回查询结果字符串 - */ - fun getNameById(nameId: Int): String { - for (temp in directories) { - if ("name" != temp.tag) { - continue - } - fontReader.index = temp.offset - break - } - for (record in name.records) { - if (record.nameID != nameId) { - continue - } - fontReader.index += name.stringOffset + record.offset - return fontReader.readStrings(record.length, if (record.platformID == 1) StandardCharsets.UTF_8 else StandardCharsets.UTF_16BE) - } - return "error" - } - - /** - * 使用Unicode值查找轮廓索引 - * - * @param code 传入Unicode十进制值 - * @return 返回十进制轮廓索引 - */ - private fun getGlyfIndex(code: Int): Int { - if (code == 0) { - return 0 - } - var fmtKey = 0 - for (item in pps) { - for (record in cmap.records) { - if (item.left == record.platformID && item.right == record.encodingID) { - fmtKey = record.offset - break - } - } - if (fmtKey > 0) { - break - } - } - if (fmtKey == 0) { - return 0 - } - var glyfID = 0 - val table = cmap.tables[fmtKey] - when (table?.format) { - 0 -> { - if (code < table.glyphIdArray.size) { - glyfID = table.glyphIdArray[code] and 0xFF - } - } - 4 -> { - val tab = table as CmapFormat4 - if (code > tab.endCode[tab.endCode.size - 1]) { - return 0 - } - // 二分法查找数值索引 - var start = 0 - var middle: Int - var end = tab.endCode.size - 1 - while (start + 1 < end) { - middle = (start + end) / 2 - if (tab.endCode[middle] <= code) { - start = middle - } else { - end = middle - } - } - if (tab.endCode[start] < code) { - ++start - } - if (code < tab.startCode[start]) { - return 0 - } - glyfID = if (tab.idRangeOffset[start] != 0) { - tab.glyphIdArray[code - tab.startCode[start] + (tab.idRangeOffset[start] shr 1) - (tab.idRangeOffset.size - start)] - } else { - code + tab.idDelta[start] - } - glyfID = glyfID and 0xFFFF - } - 6 -> { - val tab = table as CmapFormat6 - val index = code - tab.firstCode - glyfID = if (index < 0 || index >= tab.glyphIdArray.size) { - 0 - } else { - tab.glyphIdArray[index] - } - } - 12 -> { - val tab = table as CmapFormat12 - if (code > tab.groups[tab.numGroups - 1].middle) { - return 0 - } - // 二分法查找数值索引 - var start = 0 - var middle: Int - var end = tab.numGroups - 1 - while (start + 1 < end) { - middle = (start + end) / 2 - if (tab.groups[middle].left <= code) { - start = middle - } else { - end = middle - } - } - if (tab.groups[start].left <= code && code <= tab.groups[start].middle) { - glyfID = tab.groups[start].right + code - tab.groups[start].left - } - } - } - return glyfID - } - - /** - * 判断Unicode值是否在字体范围内 - * @param code 传入Unicode十进制值 - * @return 返回bool查询结果 - */ - fun inLimit(code: Char): Boolean = code.toInt() in limitMix until limitMax - - /** - * 使用Unicode值获取轮廓数据 - * - * @param key 传入Unicode十进制值 - * @return 返回轮廓数组的String值 - */ - fun getGlyfByCode(key: Int): String = codeToGlyph.getOrDefault(key, "") - - /** - * 使用轮廓数据获取Unicode值 - * - * @param val 传入轮廓数组的String值 - * @return 返回Unicode十进制值 - */ - fun getCodeByGlyf(`val`: String): Int = glyphToCode.getOrDefault(`val`, 0) - - /** - * 构造函数 buffer 传入TTF字体二进制数组 - */ - init { - // 获取文件头 - val fileHeader = Header() - fileHeader.majorVersion = fontReader.readUInt16() - fileHeader.minorVersion = fontReader.readUInt16() - fileHeader.numOfTables = fontReader.readUInt16() - fileHeader.searchRange = fontReader.readUInt16() - fileHeader.entrySelector = fontReader.readUInt16() - fileHeader.rangeShift = fontReader.readUInt16() - // 获取目录 - for (i in 0 until fileHeader.numOfTables) { - val d = Directory() - d.tag = fontReader.readStrings(4, StandardCharsets.US_ASCII) - d.checkSum = fontReader.readUInt32() - d.offset = fontReader.readUInt32() - d.length = fontReader.readUInt32() - directories.add(d) - } - // 解析表 name (字体信息,包含版权、名称、作者等...) - for (temp in directories) { - if ("name" == temp.tag) { - fontReader.index = temp.offset - name.format = fontReader.readUInt16() - name.count = fontReader.readUInt16() - name.stringOffset = fontReader.readUInt16() - for (i in 0 until name.count) { - val record = NameRecord() - record.platformID = fontReader.readUInt16() - record.encodingID = fontReader.readUInt16() - record.languageID = fontReader.readUInt16() - record.nameID = fontReader.readUInt16() - record.length = fontReader.readUInt16() - record.offset = fontReader.readUInt16() - name.records.add(record) - } - } - } - // 解析表 head (获取 head.indexToLocFormat) - val head = HeadLayout() - for (temp in directories) { - if ("head" == temp.tag) { - fontReader.index = temp.offset - head.majorVersion = fontReader.readUInt16() - head.minorVersion = fontReader.readUInt16() - head.fontRevision = fontReader.readUInt32() - head.checkSumAdjustment = fontReader.readUInt32() - head.magicNumber = fontReader.readUInt32() - head.flags = fontReader.readUInt16() - head.unitsPerEm = fontReader.readUInt16() - head.created = fontReader.readUInt64() - head.modified = fontReader.readUInt64() - head.xMin = fontReader.readInt16() - head.yMin = fontReader.readInt16() - head.xMax = fontReader.readInt16() - head.yMax = fontReader.readInt16() - head.macStyle = fontReader.readUInt16() - head.lowestRecPPEM = fontReader.readUInt16() - head.fontDirectionHint = fontReader.readInt16() - head.indexToLocFormat = fontReader.readInt16() - head.glyphDataFormat = fontReader.readInt16() - } - } - // 解析表 maxp (获取 maxp.numGlyphs) - val maxp = MaxpLayout() - for (temp in directories) { - if ("maxp" == temp.tag) { - fontReader.index = temp.offset - maxp.majorVersion = fontReader.readUInt16() - maxp.minorVersion = fontReader.readUInt16() - maxp.numGlyphs = fontReader.readUInt16() - maxp.maxPoints = fontReader.readUInt16() - maxp.maxContours = fontReader.readUInt16() - maxp.maxCompositePoints = fontReader.readUInt16() - maxp.maxCompositeContours = fontReader.readUInt16() - maxp.maxZones = fontReader.readUInt16() - maxp.maxTwilightPoints = fontReader.readUInt16() - maxp.maxStorage = fontReader.readUInt16() - maxp.maxFunctionDefs = fontReader.readUInt16() - maxp.maxInstructionDefs = fontReader.readUInt16() - maxp.maxStackElements = fontReader.readUInt16() - maxp.maxSizeOfInstructions = fontReader.readUInt16() - maxp.maxComponentElements = fontReader.readUInt16() - maxp.maxComponentDepth = fontReader.readUInt16() - } - } - // 解析表 loca (轮廓数据偏移地址表) - val loca: MutableList = LinkedList() - for (temp in directories) { - if ("loca" == temp.tag) { - fontReader.index = temp.offset - val offset = if (head.indexToLocFormat == 0.toShort()) 2 else 4 - var i: Long = 0 - while (i < temp.length) { - loca.add(if (offset == 2) fontReader.readUInt16() shl 1 else fontReader.readUInt32()) - i += offset - } - } - } - // 解析表 cmap (Unicode编码轮廓索引对照表) - for (temp in directories) { - if ("cmap" == temp.tag) { - fontReader.index = temp.offset - cmap.version = fontReader.readUInt16() - cmap.numTables = fontReader.readUInt16() - for (i in 0 until cmap.numTables) { - val record = CmapRecord() - record.platformID = fontReader.readUInt16() - record.encodingID = fontReader.readUInt16() - record.offset = fontReader.readUInt32() - cmap.records.add(record) - } - for (i in 0 until cmap.numTables) { - val fmtOffset = cmap.records[i].offset - fontReader.index = temp.offset + fmtOffset - val endIndex = fontReader.index - val format = fontReader.readUInt16() - if (cmap.tables.containsKey(fmtOffset)) { - continue - } - when (format) { - 0 -> { - val f = CmapFormat() - f.format = format - f.length = fontReader.readUInt16() - f.language = fontReader.readUInt16() - f.glyphIdArray = fontReader.getBytes(f.length - 6) - cmap.tables[fmtOffset] = f - } - 4 -> { - val f = CmapFormat4() - f.format = format - f.length = fontReader.readUInt16() - f.language = fontReader.readUInt16() - f.segCountX2 = fontReader.readUInt16() - val segCount = f.segCountX2 shr 1 - f.searchRange = fontReader.readUInt16() - f.entrySelector = fontReader.readUInt16() - f.rangeShift = fontReader.readUInt16() - f.endCode = fontReader.getUInt16Array(segCount) - f.reservedPad = fontReader.readUInt16() - f.startCode = fontReader.getUInt16Array(segCount) - f.idDelta = fontReader.getInt16Array(segCount) - f.idRangeOffset = fontReader.getUInt16Array(segCount) - f.glyphIdArray = fontReader.getUInt16Array(endIndex + f.length - fontReader.index shr 1) - cmap.tables[fmtOffset] = f - } - 6 -> { - val f = CmapFormat6() - f.format = format - f.length = fontReader.readUInt16() - f.language = fontReader.readUInt16() - f.firstCode = fontReader.readUInt16() - f.entryCount = fontReader.readUInt16() - f.glyphIdArray = fontReader.getUInt16Array(f.entryCount) - cmap.tables[fmtOffset] = f - } - 12 -> { - val f = CmapFormat12( - reserved = fontReader.readUInt16(), - length = fontReader.readUInt32(), - language = fontReader.readUInt32(), - numGroups = fontReader.readUInt32(), - groups = ArrayList(fontReader.readUInt32()) - ) - f.format = format - for (n in 0 until f.numGroups) { - (f.groups as ArrayList>).add(Triple.of(fontReader.readUInt32(), fontReader.readUInt32(), fontReader.readUInt32())) - } - cmap.tables[fmtOffset] = f - } - } - } - } - } - // 解析表 glyf (字体轮廓数据表) - val glyf: MutableList = LinkedList() - for (temp in directories) { - if ("glyf" == temp.tag) { - fontReader.index = temp.offset - for (i in 0 until maxp.numGlyphs) { - fontReader.index = temp.offset + loca[i] - val numberOfContours = fontReader.readInt16() - if (numberOfContours > 0) { - val g = GlyfLayout() - g.numberOfContours = numberOfContours - g.xMin = fontReader.readInt16() - g.yMin = fontReader.readInt16() - g.xMax = fontReader.readInt16() - g.yMax = fontReader.readInt16() - g.endPtsOfContours = fontReader.getUInt16Array(numberOfContours.toInt()) - g.instructionLength = fontReader.readUInt16() - g.instructions = fontReader.getBytes(g.instructionLength) - val flagLength = g.endPtsOfContours[g.endPtsOfContours.size - 1] + 1 - // 获取轮廓点描述标志 - g.flags = ByteArray(flagLength).apply { - var n = 0 - while (n < flagLength) { - this[n] = fontReader.getByte() - if ((this[n] and 0x08) != 0x00.toByte()) { - for (m in fontReader.readUInt8() downTo 1) { - this[++n] = this[n - 1] - } - } - ++n - } - } - // 获取轮廓点描述x轴相对值 - g.xCoordinates = ShortArray(flagLength) - for (n in 0 until flagLength) { - val same = (if (g.flags[n] and 0x10 != 0.toByte()) 1 else -1).toShort() - if (g.flags[n] and 0x02 != 0.toByte()) { - g.xCoordinates[n] = (same * fontReader.readUInt8()).toShort() - } else { - g.xCoordinates[n] = if (same.toInt() == 1) 0.toShort() else fontReader.readInt16() - } - } - // 获取轮廓点描述y轴相对值 - g.yCoordinates = ShortArray(flagLength) - for (n in 0 until flagLength) { - val same = (if (g.flags[n] and 0x20 != 0.toByte()) 1 else -1).toShort() - if (g.flags[n] and 0x04 != 0.toByte()) { - g.yCoordinates[n] = (same * fontReader.readUInt8()).toShort() - } else { - g.yCoordinates[n] = if (same.toInt() == 1) 0.toShort() else fontReader.readInt16() - } - } - // 相对坐标转绝对坐标 -// for (int n = 1; n < flagLength; ++n) { -// xCoordinates[n] += xCoordinates[n - 1]; -// yCoordinates[n] += yCoordinates[n - 1]; -// } - glyf.add(g) - } //else情况:复合字体暂未使用 - } - } - } - - // 建立Unicode&Glyph双向表 - var key = 0 - while (key < 130000) { - if (key == 0xFF) { - key = 0x3400 - } - val gid = getGlyfIndex(key) - if (gid == 0) { - ++key - continue - } - val sb = StringBuilder() - // 字型数据转String,方便存HashMap - for (b in glyf[gid].xCoordinates) { - sb.append(b.toInt()) - } - for (b in glyf[gid].yCoordinates) { - sb.append(b.toInt()) - } - val `val` = sb.toString() - if (limitMix == 0) { - limitMix = key - } - limitMax = key - codeToGlyph[key] = `val` - if (glyphToCode.containsKey(`val`)) { - ++key - continue - } - glyphToCode[`val`] = key - ++key - } - } -} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt index a6f952e66..938aa06c8 100644 --- a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt @@ -1,12 +1,13 @@ package io.legado.app.model.localBook import android.net.Uri -import io.legado.app.App +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.TxtTocRule import io.legado.app.help.DefaultData import io.legado.app.utils.* +import splitties.init.appCtx import java.io.File import java.io.RandomAccessFile import java.nio.charset.Charset @@ -266,7 +267,7 @@ class AnalyzeTxtFile { val bookFile = FileUtils.getFile(LocalBook.cacheFolder, book.originName) if (!bookFile.exists()) { bookFile.createNewFile() - DocumentUtils.readBytes(App.INSTANCE, uri)?.let { + DocumentUtils.readBytes(appCtx, uri)?.let { bookFile.writeBytes(it) } } @@ -276,10 +277,10 @@ class AnalyzeTxtFile { } private fun getTocRules(): List { - var rules = App.db.txtTocRule.enabled + var rules = appDb.txtTocRuleDao.enabled if (rules.isEmpty()) { rules = DefaultData.txtTocRules.apply { - App.db.txtTocRule.insert(*this.toTypedArray()) + appDb.txtTocRuleDao.insert(*this.toTypedArray()) }.filter { it.enable } diff --git a/app/src/main/java/io/legado/app/model/localBook/EPUBFile.kt b/app/src/main/java/io/legado/app/model/localBook/EPUBFile.kt index 2cc0b4340..77246e20b 100644 --- a/app/src/main/java/io/legado/app/model/localBook/EPUBFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/EPUBFile.kt @@ -4,13 +4,20 @@ import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri import android.text.TextUtils -import io.legado.app.App +import io.legado.app.data.appDb import io.legado.app.data.entities.BookChapter +import io.legado.app.data.entities.EpubChapter import io.legado.app.utils.* +import net.sf.jazzlib.ZipEntry +import net.sf.jazzlib.ZipInputStream import nl.siegmann.epublib.domain.Book +import nl.siegmann.epublib.domain.Resources import nl.siegmann.epublib.domain.TOCReference import nl.siegmann.epublib.epub.EpubReader +import nl.siegmann.epublib.service.MediatypeService +import nl.siegmann.epublib.util.ResourceUtil import org.jsoup.Jsoup +import splitties.init.appCtx import java.io.File import java.io.FileOutputStream import java.io.IOException @@ -18,7 +25,7 @@ import java.io.InputStream import java.nio.charset.Charset import java.util.* -class EPUBFile(val book: io.legado.app.data.entities.Book) { +class EPUBFile(var book: io.legado.app.data.entities.Book) { companion object { private var eFile: EPUBFile? = null @@ -29,6 +36,7 @@ class EPUBFile(val book: io.legado.app.data.entities.Book) { eFile = EPUBFile(book) return eFile!! } + eFile?.book = book return eFile!! } @@ -49,6 +57,11 @@ class EPUBFile(val book: io.legado.app.data.entities.Book) { ): InputStream? { return getEFile(book).getImage(href) } + + @Synchronized + fun upBookInfo(book: io.legado.app.data.entities.Book) { + return getEFile(book).upBookInfo() + } } private var epubBook: Book? = null @@ -56,28 +69,30 @@ class EPUBFile(val book: io.legado.app.data.entities.Book) { init { try { - val epubReader = EpubReader() val inputStream = if (book.bookUrl.isContentScheme()) { val uri = Uri.parse(book.bookUrl) - App.INSTANCE.contentResolver.openInputStream(uri) + appCtx.contentResolver.openInputStream(uri) } else { File(book.bookUrl).inputStream() } - epubBook = epubReader.readEpub(inputStream) - if (book.coverUrl.isNullOrEmpty()) { - book.coverUrl = FileUtils.getPath( - App.INSTANCE.externalFilesDir, - "covers", - "${MD5Utils.md5Encode16(book.bookUrl)}.jpg" - ) - } - if (!File(book.coverUrl!!).exists()) { - epubBook!!.coverImage?.inputStream?.use { - val cover = BitmapFactory.decodeStream(it) - val out = FileOutputStream(FileUtils.createFileIfNotExist(book.coverUrl!!)) - cover.compress(Bitmap.CompressFormat.JPEG, 90, out) - out.flush() - out.close() + epubBook = readEpub(inputStream) + if (epubBook != null) { + if (book.coverUrl.isNullOrEmpty()) { + book.coverUrl = FileUtils.getPath( + appCtx.externalFilesDir, + "covers", + "${MD5Utils.md5Encode16(book.bookUrl)}.jpg" + ) + } + if (!File(book.coverUrl!!).exists()) { + /*部分书籍DRM处理后,封面获取异常,待优化*/ + epubBook!!.coverImage?.inputStream?.use { + val cover = BitmapFactory.decodeStream(it) + val out = FileOutputStream(FileUtils.createFileIfNotExist(book.coverUrl!!)) + cover.compress(Bitmap.CompressFormat.JPEG, 90, out) + out.flush() + out.close() + } } } } catch (e: Exception) { @@ -85,14 +100,88 @@ class EPUBFile(val book: io.legado.app.data.entities.Book) { } } + /*重写epub文件解析代码,直接读出压缩包文件生成Resources给epublib,这样的好处是可以逐一修改某些文件的格式错误*/ + private fun readEpub(input: InputStream?): Book? { + if (input == null) return null + try { + val inZip = ZipInputStream(input) + var zipEntry: ZipEntry? + val resources = Resources() + do { + zipEntry = inZip.nextEntry + if ((zipEntry == null) || zipEntry.isDirectory || zipEntry == ZipEntry("")) continue + val resource = ResourceUtil.createResource(zipEntry, inZip) + if (resource.mediaType == MediatypeService.XHTML) resource.inputEncoding = "UTF-8" + if (zipEntry.name.endsWith(".opf")) { + /*掌上书苑有很多自制书OPF的nameSpace格式不标准,强制修复成正确的格式*/ + val newS = String(resource.data).replace( + "\\smlns=\"http://www.idpf.org/2007/opf\"".toRegex(), + " xmlns=\"http://www.idpf.org/2007/opf\"" + ) + resource.data = newS.toByteArray() + } + resources.add(resource) + } while (zipEntry != null) + if (resources.size() > 0) return EpubReader().readEpub(resources) + } catch (e: Exception) { + e.printStackTrace() + } + return null + } + private fun getContent(chapter: BookChapter): String? { - epubBook?.let { eBook -> - val resource = eBook.resources.getByHref(chapter.url) - val doc = Jsoup.parse(String(resource.data, mCharset)) - val elements = doc.body().children() + /*获取当前章节文本*/ + var string = getChildChapter(chapter, chapter.url) + val childContends = appDb.epubChapterDao.get(book.bookUrl, chapter.url) + childContends.forEach { + string += "\n" + getChildChapter(chapter, it.href) + } + return string + } + + private fun getChildChapter(chapter: BookChapter, href: String): String? { + epubBook?.let { + val body = Jsoup.parse(String(it.resources.getByHref(href).data, mCharset)).body() + + if (chapter.url == href) { + val startFragmentId = chapter.startFragmentId + val endFragmentId = chapter.endFragmentId + /*一些书籍依靠href索引的resource会包含多个章节,需要依靠fragmentId来截取到当前章节的内容*/ + /*注:这里较大增加了内容加载的时间,所以首次获取内容后可存储到本地cache,减少重复加载*/ + if (!startFragmentId.isNullOrBlank()) + body.getElementById(startFragmentId)?.previousElementSiblings()?.remove() + if (!endFragmentId.isNullOrBlank() && endFragmentId != startFragmentId) + body.getElementById(endFragmentId)?.nextElementSiblings()?.remove() + } + + /*选择去除正文中的H标签,部分书籍标题与阅读标题重复待优化*/ + var tag = io.legado.app.data.entities.Book.hTag + if (book.getDelTag(tag)) { + body.getElementsByTag("h1")?.remove() + body.getElementsByTag("h2")?.remove() + body.getElementsByTag("h3")?.remove() + body.getElementsByTag("h4")?.remove() + body.getElementsByTag("h5")?.remove() + body.getElementsByTag("h6")?.remove() + //body.getElementsMatchingOwnText(chapter.title)?.remove() + } + + /*选择去除正文中的img标签,目前图片支持效果待优化*/ + tag = io.legado.app.data.entities.Book.imgTag + if (book.getDelTag(tag)) { + body.getElementsByTag("img")?.remove() + } + + val elements = body.children() elements.select("script").remove() elements.select("style").remove() - return elements.outerHtml().htmlFormat() + /*选择去除正文中的ruby标签,目前注释支持效果待优化*/ + tag = io.legado.app.data.entities.Book.rubyTag + var html = elements.outerHtml() + if (book.getDelTag(tag)) { + html = html.replace("\\s?([\\u4e00-\\u9fa5])\\s?.*?".toRegex(), "$1") + } + return html.htmlFormat() } return null } @@ -102,11 +191,13 @@ class EPUBFile(val book: io.legado.app.data.entities.Book) { return epubBook?.resources?.getByHref(abHref)?.inputStream } - private fun getChapterList(): ArrayList { - val chapterList = ArrayList() - epubBook?.let { eBook -> - val metadata = eBook.metadata - book.name = metadata.firstTitle + private fun upBookInfo() { + if (epubBook == null) { + eFile = null + book.intro = "书籍导入异常" + } else { + val metadata = epubBook!!.metadata + book.name = book.originName if (metadata.authors.size > 0) { val author = metadata.authors[0].toString().replace("^, |, $".toRegex(), "") @@ -115,7 +206,12 @@ class EPUBFile(val book: io.legado.app.data.entities.Book) { if (metadata.descriptions.size > 0) { book.intro = Jsoup.parse(metadata.descriptions[0]).text() } + } + } + private fun getChapterList(): ArrayList { + val chapterList = ArrayList() + epubBook?.let { eBook -> val refs = eBook.tableOfContents.tocReferences if (refs == null || refs.isEmpty()) { val spineReferences = eBook.spine.spineReferences @@ -130,7 +226,7 @@ class EPUBFile(val book: io.legado.app.data.entities.Book) { val doc = Jsoup.parse(String(resource.data, mCharset)) val elements = doc.getElementsByTag("title") - if (elements.size > 0) { + if (elements != null && elements.size > 0) { title = elements[0].text() } } catch (e: IOException) { @@ -150,10 +246,12 @@ class EPUBFile(val book: io.legado.app.data.entities.Book) { i++ } } else { + parseFirstPage(chapterList, refs) parseMenu(chapterList, refs, 0) for (i in chapterList.indices) { chapterList[i].index = i } + getChildChapter(chapterList) } } book.latestChapterTitle = chapterList.lastOrNull()?.title @@ -161,19 +259,100 @@ class EPUBFile(val book: io.legado.app.data.entities.Book) { return chapterList } + /*获取当前章节的子章节。部分书籍一个章节包含多个html文件,(一些精排书籍,每一章节正文前的标题、标题封面、引言等都会有独立html)*/ + /*需在读取常规章节列表后调用,遍历书籍全内容,根据href检索原不包含在章节内的html归属父章节*/ + private fun getChildChapter(chapterList: ArrayList) { + epubBook?.let { + val contents = it.contents + val chapters = ArrayList() + if (contents != null) { + var i = 0 + var j = 0 + var parentHref: String? = null + while (i < contents.size) { + val content = contents[i] + if (j < chapterList.size && content.href == chapterList[j].url) { + parentHref = content.href + j++ + } else if (!parentHref.isNullOrBlank() && content.mediaType.toString() + .contains("htm") + ) { + val epubChapter = EpubChapter() + epubChapter.bookUrl = book.bookUrl + epubChapter.href = content.href + epubChapter.parentHref = parentHref + chapters.add(epubChapter) + } + i++ + } + } + appDb.epubChapterDao.deleteByName(book.bookUrl) + if (chapters.size > 0) appDb.epubChapterDao.insert(*chapters.toTypedArray()) + } + } + + /*获取书籍起始页内容。部分书籍第一章之前存在封面,引言,扉页等内容*/ + /*tile获取不同书籍风格杂乱,格式化处理待优化*/ + private var durIndex = 0 + private fun parseFirstPage( + chapterList: ArrayList, + refs: List? + ) { + val contents = epubBook?.contents + if (epubBook == null || contents == null || refs == null) return + var i = 0 + durIndex = 0 + while (i < contents.size) { + val content = contents[i] + if (!content.mediaType.toString().contains("htm")) continue + /*检索到第一章href停止*/ + if (refs[0].completeHref == content.href) break + val chapter = BookChapter() + var title = content.title + if (TextUtils.isEmpty(title)) { + val elements = Jsoup.parse( + String( + epubBook!!.resources.getByHref(content.href).data, + mCharset + ) + ).getElementsByTag("title") + title = + if (elements != null && elements.size > 0) elements[0].text() else "--卷首--" + } + chapter.bookUrl = book.bookUrl + chapter.title = title + chapter.url = content.href + chapter.startFragmentId = + if (content.href.substringAfter("#") == content.href) null + else content.href.substringAfter("#") + if (durIndex > 0) { + val preIndex = durIndex - 1 + chapterList[preIndex].endFragmentId = chapter.startFragmentId + } + chapterList.add(chapter) + durIndex++ + i++ + } + } + private fun parseMenu( chapterList: ArrayList, refs: List?, level: Int ) { - if (refs == null) return - for (ref in refs) { + refs?.forEach { ref -> if (ref.resource != null) { val chapter = BookChapter() chapter.bookUrl = book.bookUrl chapter.title = ref.title chapter.url = ref.completeHref + chapter.startFragmentId = ref.fragmentId + if (durIndex > 0) { + val preIndex = durIndex - 1 + chapterList[preIndex].endFragmentId = chapter.startFragmentId + } chapterList.add(chapter) + durIndex++ } if (ref.children != null && ref.children.isNotEmpty()) { parseMenu(chapterList, ref.children, level + 1) diff --git a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt index ff96cb519..e65eaa7b1 100644 --- a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt +++ b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt @@ -2,20 +2,21 @@ package io.legado.app.model.localBook import android.net.Uri import androidx.documentfile.provider.DocumentFile -import io.legado.app.App +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.BookHelp import io.legado.app.utils.* +import splitties.init.appCtx import java.io.File object LocalBook { private const val folderName = "bookTxt" val cacheFolder: File by lazy { - val rootFile = App.INSTANCE.getExternalFilesDir(null) - ?: App.INSTANCE.externalCacheDir - ?: App.INSTANCE.cacheDir + val rootFile = appCtx.getExternalFilesDir(null) + ?: appCtx.externalCacheDir + ?: appCtx.cacheDir FileUtils.createFolderIfNotExist(rootFile, folderName) } @@ -39,12 +40,12 @@ object LocalBook { val path: String val fileName = if (uri.isContentScheme()) { path = uri.toString() - val doc = DocumentFile.fromSingleUri(App.INSTANCE, uri) + val doc = DocumentFile.fromSingleUri(appCtx, uri) doc?.let { val bookFile = FileUtils.getFile(cacheFolder, it.name!!) if (!bookFile.exists()) { bookFile.createNewFile() - doc.readBytes(App.INSTANCE)?.let { bytes -> + doc.readBytes(appCtx)?.let { bytes -> bookFile.writeBytes(bytes) } } @@ -77,12 +78,13 @@ object LocalBook { author = author, originName = fileName, coverUrl = FileUtils.getPath( - App.INSTANCE.externalFilesDir, + appCtx.externalFilesDir, "covers", "${MD5Utils.md5Encode16(path)}.jpg" ) ) - App.db.bookDao.insert(book) + if (book.isEpub()) EPUBFile.upBookInfo(book) + appDb.bookDao.insert(book) return book } @@ -96,7 +98,7 @@ object LocalBook { if (deleteOriginal) { if (book.bookUrl.isContentScheme()) { val uri = Uri.parse(book.bookUrl) - DocumentFile.fromSingleUri(App.INSTANCE, uri)?.delete() + DocumentFile.fromSingleUri(appCtx, uri)?.delete() } else { FileUtils.deleteFile(book.bookUrl) } diff --git a/app/src/main/java/io/legado/app/model/rss/RssParserByRule.kt b/app/src/main/java/io/legado/app/model/rss/RssParserByRule.kt index 18d05c022..e2b702cce 100644 --- a/app/src/main/java/io/legado/app/model/rss/RssParserByRule.kt +++ b/app/src/main/java/io/legado/app/model/rss/RssParserByRule.kt @@ -1,7 +1,6 @@ package io.legado.app.model.rss import androidx.annotation.Keep -import io.legado.app.App import io.legado.app.R import io.legado.app.data.entities.RssArticle import io.legado.app.data.entities.RssSource @@ -10,6 +9,7 @@ import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.RuleDataInterface import io.legado.app.utils.GSON import io.legado.app.utils.NetworkUtils +import splitties.init.appCtx import java.util.* @Keep @@ -27,7 +27,7 @@ object RssParserByRule { var nextUrl: String? = null if (body.isNullOrBlank()) { throw Exception( - App.INSTANCE.getString(R.string.error_get_web_content, rssSource.sourceUrl) + appCtx.getString(R.string.error_get_web_content, rssSource.sourceUrl) ) } Debug.log(sourceUrl, "≡获取成功:$sourceUrl") @@ -39,6 +39,7 @@ object RssParserByRule { val articleList = mutableListOf() val analyzeRule = AnalyzeRule(ruleData) analyzeRule.setContent(body).setBaseUrl(sortUrl) + analyzeRule.setRedirectUrl(sortUrl) var reverse = false if (ruleArticles.startsWith("-")) { reverse = true diff --git a/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt b/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt index 1bdf1ca05..4b03eb4a4 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt @@ -1,7 +1,6 @@ package io.legado.app.model.webBook import android.text.TextUtils -import io.legado.app.App import io.legado.app.R import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter @@ -14,6 +13,7 @@ import io.legado.app.model.analyzeRule.AnalyzeUrl import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ensureActive import kotlinx.coroutines.suspendCancellableCoroutine +import splitties.init.appCtx import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException @@ -24,12 +24,13 @@ object BookChapterList { book: Book, body: String?, bookSource: BookSource, - baseUrl: String + baseUrl: String, + redirectUrl: String ): List = suspendCancellableCoroutine { block -> kotlin.runCatching { val chapterList = ArrayList() body ?: throw Exception( - App.INSTANCE.getString(R.string.error_get_web_content, baseUrl) + appCtx.getString(R.string.error_get_web_content, baseUrl) ) Debug.log(bookSource.bookSourceUrl, "≡获取成功:${baseUrl}") @@ -46,7 +47,8 @@ object BookChapterList { } var chapterData = analyzeChapterList( - scope, book, baseUrl, body, tocRule, listRule, bookSource, log = true + scope, book, baseUrl, redirectUrl, body, + tocRule, listRule, bookSource, log = true ) chapterData.chapterList?.let { chapterList.addAll(it) @@ -66,7 +68,8 @@ object BookChapterList { headerMapF = bookSource.getHeaderMap() ).getStrResponse(bookSource.bookSourceUrl).body?.let { nextBody -> chapterData = analyzeChapterList( - this, book, nextUrl, nextBody, tocRule, listRule, bookSource + this, book, nextUrl, nextUrl, + nextBody, tocRule, listRule, bookSource ) nextUrl = chapterData.nextUrl.firstOrNull() ?: "" chapterData.chapterList?.let { @@ -128,7 +131,8 @@ object BookChapterList { ).getStrResponse(bookSource.bookSourceUrl).body ?: throw Exception("${chapterData.nextUrl}, 下载失败") val nextChapterData = analyzeChapterList( - this, book, chapterData.nextUrl, nextBody, tocRule, listRule, bookSource, false + this, book, chapterData.nextUrl, chapterData.nextUrl, + nextBody, tocRule, listRule, bookSource, false ) synchronized(chapterDataList) { val isFinished = addChapterListIsFinish( @@ -195,6 +199,7 @@ object BookChapterList { scope: CoroutineScope, book: Book, baseUrl: String, + redirectUrl: String, body: String, tocRule: TocRule, listRule: String, @@ -204,7 +209,13 @@ object BookChapterList { ): ChapterData> { val analyzeRule = AnalyzeRule(book) analyzeRule.setContent(body).setBaseUrl(baseUrl) + analyzeRule.setRedirectUrl(redirectUrl) + //获取目录列表 val chapterList = arrayListOf() + Debug.log(bookSource.bookSourceUrl, "┌获取目录列表", log) + val elements = analyzeRule.getElements(listRule) + Debug.log(bookSource.bookSourceUrl, "└列表大小:${elements.size}", log) + //获取下一页链接 val nextUrlList = arrayListOf() val nextTocRule = tocRule.nextTocUrl if (getNextUrl && !nextTocRule.isNullOrEmpty()) { @@ -222,11 +233,9 @@ object BookChapterList { log ) } - Debug.log(bookSource.bookSourceUrl, "┌获取目录列表", log) - val elements = analyzeRule.getElements(listRule) - Debug.log(bookSource.bookSourceUrl, "└列表大小:${elements.size}", log) scope.ensureActive() if (elements.isNotEmpty()) { + Debug.log(bookSource.bookSourceUrl, "┌解析目录列表", log) val nameRule = analyzeRule.splitSourceRule(tocRule.chapterName) val urlRule = analyzeRule.splitSourceRule(tocRule.chapterUrl) val vipRule = analyzeRule.splitSourceRule(tocRule.isVip) @@ -251,11 +260,12 @@ object BookChapterList { chapterList.add(bookChapter) } } - Debug.log(bookSource.bookSourceUrl, "┌获取首章名称", log) + Debug.log(bookSource.bookSourceUrl, "└解析目录列表完成", log) + Debug.log(bookSource.bookSourceUrl, "┌首章名称", log) Debug.log(bookSource.bookSourceUrl, "└${chapterList[0].title}", log) - Debug.log(bookSource.bookSourceUrl, "┌获取首章链接", log) + Debug.log(bookSource.bookSourceUrl, "┌首章链接", log) Debug.log(bookSource.bookSourceUrl, "└${chapterList[0].url}", log) - Debug.log(bookSource.bookSourceUrl, "┌获取首章信息", log) + Debug.log(bookSource.bookSourceUrl, "┌首章信息", log) Debug.log(bookSource.bookSourceUrl, "└${chapterList[0].tag}", log) } return ChapterData(chapterList, nextUrlList) diff --git a/app/src/main/java/io/legado/app/model/webBook/BookContent.kt b/app/src/main/java/io/legado/app/model/webBook/BookContent.kt index 25fcfa512..a17a621f5 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookContent.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookContent.kt @@ -1,7 +1,7 @@ package io.legado.app.model.webBook -import io.legado.app.App import io.legado.app.R +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookSource @@ -14,6 +14,7 @@ import io.legado.app.utils.NetworkUtils import io.legado.app.utils.htmlFormat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.withContext +import splitties.init.appCtx object BookContent { @@ -25,31 +26,34 @@ object BookContent { bookChapter: BookChapter, bookSource: BookSource, baseUrl: String, - nextChapterUrlF: String? = null + nextChapterUrl: String? = null ): String { body ?: throw Exception( - App.INSTANCE.getString(R.string.error_get_web_content, baseUrl) + appCtx.getString(R.string.error_get_web_content, baseUrl) ) Debug.log(bookSource.bookSourceUrl, "≡获取成功:${baseUrl}") + val mNextChapterUrl = if (!nextChapterUrl.isNullOrEmpty()) { + nextChapterUrl + } else { + appDb.bookChapterDao.getChapter(book.bookUrl, bookChapter.index + 1)?.url + } val content = StringBuilder() val nextUrlList = arrayListOf(baseUrl) val contentRule = bookSource.getContentRule() val analyzeRule = AnalyzeRule(book).setContent(body, baseUrl) + analyzeRule.setRedirectUrl(baseUrl) + analyzeRule.nextChapterUrl = mNextChapterUrl var contentData = analyzeContent( - book, baseUrl, body, contentRule, bookChapter, bookSource + book, baseUrl, body, contentRule, bookChapter, bookSource, mNextChapterUrl ) content.append(contentData.content).append("\n") if (contentData.nextUrl.size == 1) { var nextUrl = contentData.nextUrl[0] - val nextChapterUrl = if (!nextChapterUrlF.isNullOrEmpty()) - nextChapterUrlF - else - App.db.bookChapterDao.getChapter(book.bookUrl, bookChapter.index + 1)?.url while (nextUrl.isNotEmpty() && !nextUrlList.contains(nextUrl)) { - if (!nextChapterUrl.isNullOrEmpty() + if (!mNextChapterUrl.isNullOrEmpty() && NetworkUtils.getAbsoluteURL(baseUrl, nextUrl) - == NetworkUtils.getAbsoluteURL(baseUrl, nextChapterUrl) + == NetworkUtils.getAbsoluteURL(baseUrl, mNextChapterUrl) ) break nextUrlList.add(nextUrl) AnalyzeUrl( @@ -58,7 +62,14 @@ object BookContent { headerMapF = bookSource.getHeaderMap() ).getStrResponse(bookSource.bookSourceUrl).body?.let { nextBody -> contentData = analyzeContent( - book, nextUrl, nextBody, contentRule, bookChapter, bookSource, false + book, + nextUrl, + nextBody, + contentRule, + bookChapter, + bookSource, + mNextChapterUrl, + false ) nextUrl = if (contentData.nextUrl.isNotEmpty()) contentData.nextUrl[0] else "" @@ -80,7 +91,14 @@ object BookContent { headerMapF = bookSource.getHeaderMap() ).getStrResponse(bookSource.bookSourceUrl).body?.let { contentData = analyzeContent( - book, item.nextUrl, it, contentRule, bookChapter, bookSource, false + book, + item.nextUrl, + it, + contentRule, + bookChapter, + bookSource, + mNextChapterUrl, + false ) item.content = contentData.content } @@ -114,12 +132,18 @@ object BookContent { contentRule: ContentRule, chapter: BookChapter, bookSource: BookSource, + nextChapterUrl: String?, printLog: Boolean = true ): ContentData> { val analyzeRule = AnalyzeRule(book) analyzeRule.setContent(body).setBaseUrl(baseUrl) + analyzeRule.setRedirectUrl(baseUrl) + analyzeRule.nextChapterUrl = nextChapterUrl val nextUrlList = arrayListOf() analyzeRule.chapter = chapter + //获取正文 + val content = analyzeRule.getString(contentRule.content) + //获取下一页链接 val nextUrlRule = contentRule.nextContentUrl if (!nextUrlRule.isNullOrEmpty()) { Debug.log(bookSource.bookSourceUrl, "┌获取正文下一页链接", printLog) @@ -128,7 +152,6 @@ object BookContent { } Debug.log(bookSource.bookSourceUrl, "└" + nextUrlList.joinToString(","), printLog) } - val content = analyzeRule.getString(contentRule.content) return ContentData(content, nextUrlList) } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/model/webBook/BookInfo.kt b/app/src/main/java/io/legado/app/model/webBook/BookInfo.kt index d4eb8b9d9..febe122d8 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookInfo.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookInfo.kt @@ -1,6 +1,5 @@ package io.legado.app.model.webBook -import io.legado.app.App import io.legado.app.R import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookSource @@ -12,6 +11,7 @@ import io.legado.app.utils.StringUtils.wordCountFormat import io.legado.app.utils.htmlFormat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ensureActive +import splitties.init.appCtx object BookInfo { @@ -22,15 +22,30 @@ object BookInfo { body: String?, bookSource: BookSource, baseUrl: String, + redirectUrl: String, canReName: Boolean, ) { body ?: throw Exception( - App.INSTANCE.getString(R.string.error_get_web_content, baseUrl) + appCtx.getString(R.string.error_get_web_content, baseUrl) ) Debug.log(bookSource.bookSourceUrl, "≡获取成功:${baseUrl}") - val infoRule = bookSource.getBookInfoRule() val analyzeRule = AnalyzeRule(book) analyzeRule.setContent(body).setBaseUrl(baseUrl) + analyzeRule.setRedirectUrl(redirectUrl) + analyzeBookInfo(scope, book, body, analyzeRule, bookSource, baseUrl, redirectUrl, canReName) + } + + fun analyzeBookInfo( + scope: CoroutineScope, + book: Book, + body: String, + analyzeRule: AnalyzeRule, + bookSource: BookSource, + baseUrl: String, + redirectUrl: String, + canReName: Boolean, + ) { + val infoRule = bookSource.getBookInfoRule() infoRule.init?.let { if (it.isNotBlank()) { scope.ensureActive() @@ -84,7 +99,7 @@ object BookInfo { scope.ensureActive() Debug.log(bookSource.bookSourceUrl, "┌获取封面链接") analyzeRule.getString(infoRule.coverUrl).let { - if (it.isNotEmpty()) book.coverUrl = NetworkUtils.getAbsoluteURL(baseUrl, it) + if (it.isNotEmpty()) book.coverUrl = NetworkUtils.getAbsoluteURL(redirectUrl, it) } Debug.log(bookSource.bookSourceUrl, "└${book.coverUrl}") scope.ensureActive() diff --git a/app/src/main/java/io/legado/app/model/webBook/BookList.kt b/app/src/main/java/io/legado/app/model/webBook/BookList.kt index 25ab215e6..c550f25ea 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookList.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookList.kt @@ -1,7 +1,7 @@ package io.legado.app.model.webBook -import io.legado.app.App import io.legado.app.R +import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.SearchBook import io.legado.app.data.entities.rule.BookListRule @@ -14,6 +14,7 @@ import io.legado.app.utils.StringUtils.wordCountFormat import io.legado.app.utils.htmlFormat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ensureActive +import splitties.init.appCtx object BookList { @@ -29,7 +30,7 @@ object BookList { ): ArrayList { val bookList = ArrayList() body ?: throw Exception( - App.INSTANCE.getString( + appCtx.getString( R.string.error_get_web_content, analyzeUrl.ruleUrl ) @@ -37,11 +38,12 @@ object BookList { Debug.log(bookSource.bookSourceUrl, "≡获取成功:${analyzeUrl.ruleUrl}") val analyzeRule = AnalyzeRule(variableBook) analyzeRule.setContent(body).setBaseUrl(baseUrl) + analyzeRule.setRedirectUrl(baseUrl) bookSource.bookUrlPattern?.let { scope.ensureActive() if (baseUrl.matches(it.toRegex())) { Debug.log(bookSource.bookSourceUrl, "≡链接为详情页") - getInfoItem(scope, analyzeRule, bookSource, baseUrl, variableBook.variable) + getInfoItem(scope, body, analyzeRule, bookSource, baseUrl, variableBook.variable) ?.let { searchBook -> searchBook.infoHtml = body bookList.add(searchBook) @@ -69,7 +71,7 @@ object BookList { scope.ensureActive() if (collections.isEmpty() && bookSource.bookUrlPattern.isNullOrEmpty()) { Debug.log(bookSource.bookSourceUrl, "└列表为空,按详情页解析") - getInfoItem(scope, analyzeRule, bookSource, baseUrl, variableBook.variable) + getInfoItem(scope, body, analyzeRule, bookSource, baseUrl, variableBook.variable) ?.let { searchBook -> searchBook.infoHtml = body bookList.add(searchBook) @@ -118,57 +120,31 @@ object BookList { @Throws(Exception::class) private fun getInfoItem( scope: CoroutineScope, + body: String, analyzeRule: AnalyzeRule, bookSource: BookSource, baseUrl: String, variable: String? ): SearchBook? { - val searchBook = SearchBook(variable = variable) - searchBook.bookUrl = baseUrl - searchBook.origin = bookSource.bookSourceUrl - searchBook.originName = bookSource.bookSourceName - searchBook.originOrder = bookSource.customOrder - searchBook.type = bookSource.bookSourceType - analyzeRule.book = searchBook - with(bookSource.getBookInfoRule()) { - init?.let { - if (it.isNotEmpty()) { - scope.ensureActive() - Debug.log(bookSource.bookSourceUrl, "≡执行详情页初始化规则") - analyzeRule.setContent(analyzeRule.getElement(it)) - } - } - scope.ensureActive() - Debug.log(bookSource.bookSourceUrl, "┌获取书名") - searchBook.name = BookHelp.formatBookName(analyzeRule.getString(name)) - Debug.log(bookSource.bookSourceUrl, "└${searchBook.name}") - if (searchBook.name.isNotEmpty()) { - scope.ensureActive() - Debug.log(bookSource.bookSourceUrl, "┌获取作者") - searchBook.author = BookHelp.formatBookAuthor(analyzeRule.getString(author)) - Debug.log(bookSource.bookSourceUrl, "└${searchBook.author}") - scope.ensureActive() - Debug.log(bookSource.bookSourceUrl, "┌获取分类") - searchBook.kind = analyzeRule.getStringList(kind)?.joinToString(",") - Debug.log(bookSource.bookSourceUrl, "└${searchBook.kind}") - scope.ensureActive() - Debug.log(bookSource.bookSourceUrl, "┌获取字数") - searchBook.wordCount = wordCountFormat(analyzeRule.getString(wordCount)) - Debug.log(bookSource.bookSourceUrl, "└${searchBook.wordCount}") - scope.ensureActive() - Debug.log(bookSource.bookSourceUrl, "┌获取最新章节") - searchBook.latestChapterTitle = analyzeRule.getString(lastChapter) - Debug.log(bookSource.bookSourceUrl, "└${searchBook.latestChapterTitle}") - scope.ensureActive() - Debug.log(bookSource.bookSourceUrl, "┌获取简介") - searchBook.intro = analyzeRule.getString(intro).htmlFormat() - Debug.log(bookSource.bookSourceUrl, "└${searchBook.intro}") - scope.ensureActive() - Debug.log(bookSource.bookSourceUrl, "┌获取封面链接") - searchBook.coverUrl = analyzeRule.getString(coverUrl, true) - Debug.log(bookSource.bookSourceUrl, "└${searchBook.coverUrl}") - return searchBook - } + val book = Book(variable = variable) + book.bookUrl = baseUrl + book.origin = bookSource.bookSourceUrl + book.originName = bookSource.bookSourceName + book.originOrder = bookSource.customOrder + book.type = bookSource.bookSourceType + analyzeRule.book = book + BookInfo.analyzeBookInfo( + scope, + book, + body, + analyzeRule, + bookSource, + baseUrl, + baseUrl, + false + ) + if (book.name.isNotBlank()) { + return book.toSearchBook() } return null } diff --git a/app/src/main/java/io/legado/app/model/webBook/SearchBookModel.kt b/app/src/main/java/io/legado/app/model/webBook/SearchBookModel.kt index 95aa3a95e..2cdc53f43 100644 --- a/app/src/main/java/io/legado/app/model/webBook/SearchBookModel.kt +++ b/app/src/main/java/io/legado/app/model/webBook/SearchBookModel.kt @@ -1,6 +1,6 @@ package io.legado.app.model.webBook -import io.legado.app.App +import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.SearchBook import io.legado.app.help.AppConfig @@ -10,6 +10,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.ExecutorCoroutineDispatcher import kotlinx.coroutines.asCoroutineDispatcher +import splitties.init.appCtx import java.util.concurrent.Executors import kotlin.math.min @@ -44,12 +45,12 @@ class SearchBookModel(private val scope: CoroutineScope, private val callBack: C initSearchPool() mSearchId = searchId searchPage = 1 - val searchGroup = App.INSTANCE.getPrefString("searchGroup") ?: "" + val searchGroup = appCtx.getPrefString("searchGroup") ?: "" bookSourceList.clear() if (searchGroup.isBlank()) { - bookSourceList.addAll(App.db.bookSourceDao.allEnabled) + bookSourceList.addAll(appDb.bookSourceDao.allEnabled) } else { - bookSourceList.addAll(App.db.bookSourceDao.getEnabledByGroup(searchGroup)) + bookSourceList.addAll(appDb.bookSourceDao.getEnabledByGroup(searchGroup)) } } else { searchPage++ diff --git a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt index bafc0ca0f..8e9e549ed 100644 --- a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt +++ b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt @@ -127,6 +127,7 @@ class WebBook(val bookSource: BookSource) { book.infoHtml, bookSource, book.bookUrl, + book.bookUrl, canReName ) } else { @@ -136,7 +137,15 @@ class WebBook(val bookSource: BookSource) { headerMapF = bookSource.getHeaderMap(), book = book ).getStrResponse(bookSource.bookSourceUrl) - BookInfo.analyzeBookInfo(scope, book, res.body, bookSource, book.bookUrl, canReName) + BookInfo.analyzeBookInfo( + scope, + book, + res.body, + bookSource, + book.bookUrl, + res.url, + canReName + ) } return book } @@ -160,7 +169,14 @@ class WebBook(val bookSource: BookSource) { ): List { book.type = bookSource.bookSourceType return if (book.bookUrl == book.tocUrl && !book.tocHtml.isNullOrEmpty()) { - BookChapterList.analyzeChapterList(scope, book, book.tocHtml, bookSource, book.tocUrl) + BookChapterList.analyzeChapterList( + scope, + book, + book.tocHtml, + bookSource, + book.tocUrl, + book.tocUrl + ) } else { val res = AnalyzeUrl( book = book, @@ -168,7 +184,14 @@ class WebBook(val bookSource: BookSource) { baseUrl = book.bookUrl, headerMapF = bookSource.getHeaderMap() ).getStrResponse(bookSource.bookSourceUrl) - BookChapterList.analyzeChapterList(scope, book, res.body, bookSource, book.tocUrl) + BookChapterList.analyzeChapterList( + scope, + book, + res.body, + bookSource, + book.tocUrl, + res.url + ) } } diff --git a/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt b/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt index ddd065570..beded7255 100644 --- a/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt +++ b/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt @@ -4,10 +4,10 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.view.KeyEvent -import io.legado.app.App import io.legado.app.constant.EventBus -import io.legado.app.data.entities.Book +import io.legado.app.data.appDb import io.legado.app.help.ActivityHelp +import io.legado.app.help.AppConfig import io.legado.app.service.AudioPlayService import io.legado.app.service.BaseReadAloudService import io.legado.app.service.help.AudioPlay @@ -15,13 +15,7 @@ import io.legado.app.service.help.ReadAloud import io.legado.app.ui.audio.AudioPlayActivity import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.main.MainActivity -import io.legado.app.utils.getPrefBoolean import io.legado.app.utils.postEvent -import kotlinx.coroutines.Dispatchers.IO -import kotlinx.coroutines.Dispatchers.Main -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext /** @@ -31,6 +25,12 @@ import kotlinx.coroutines.withContext class MediaButtonReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (handleIntent(context, intent) && isOrderedBroadcast) { + abortBroadcast() + } + } + companion object { fun handleIntent(context: Context, intent: Intent): Boolean { @@ -55,7 +55,7 @@ class MediaButtonReceiver : BroadcastReceiver() { return true } - private fun readAloud(context: Context) { + fun readAloud(context: Context, isMediaKey: Boolean = true) { when { BaseReadAloudService.isRun -> if (BaseReadAloudService.isPlay()) { ReadAloud.pause(context) @@ -73,34 +73,23 @@ class MediaButtonReceiver : BroadcastReceiver() { postEvent(EventBus.MEDIA_BUTTON, true) ActivityHelp.isExist(AudioPlayActivity::class.java) -> postEvent(EventBus.MEDIA_BUTTON, true) - else -> if (context.getPrefBoolean("mediaButtonOnExit", true)) { - GlobalScope.launch(Main) { - val lastBook: Book? = withContext(IO) { - App.db.bookDao.lastReadBook - } - lastBook?.let { - if (!ActivityHelp.isExist(MainActivity::class.java)) { - Intent(context, MainActivity::class.java).let { - it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - context.startActivity(it) - } - } - Intent(context, ReadBookActivity::class.java).let { + else -> if (AppConfig.mediaButtonOnExit || !isMediaKey) { + appDb.bookDao.lastReadBook?.let { + if (!ActivityHelp.isExist(MainActivity::class.java)) { + Intent(context, MainActivity::class.java).let { it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - it.putExtra("readAloud", true) context.startActivity(it) } } + Intent(context, ReadBookActivity::class.java).let { + it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + it.putExtra("readAloud", true) + context.startActivity(it) + } } } } } } - override fun onReceive(context: Context, intent: Intent) { - if (handleIntent(context, intent) && isOrderedBroadcast) { - abortBroadcast() - } - } - } diff --git a/app/src/main/java/io/legado/app/receiver/SharedReceiverActivity.kt b/app/src/main/java/io/legado/app/receiver/SharedReceiverActivity.kt index e6b78f0f5..a6bb0af91 100644 --- a/app/src/main/java/io/legado/app/receiver/SharedReceiverActivity.kt +++ b/app/src/main/java/io/legado/app/receiver/SharedReceiverActivity.kt @@ -6,7 +6,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import io.legado.app.ui.book.search.SearchActivity import io.legado.app.ui.main.MainActivity -import org.jetbrains.anko.startActivity +import io.legado.app.utils.startActivity +import splitties.init.appCtx class SharedReceiverActivity : AppCompatActivity() { @@ -19,21 +20,30 @@ class SharedReceiverActivity : AppCompatActivity() { } private fun initIntent() { - if (Intent.ACTION_SEND == intent.action && intent.type == receivingType) { - intent.getStringExtra(Intent.EXTRA_TEXT)?.let { - if (openUrl(it)) { - startActivity(Pair("key", it)) + when { + Intent.ACTION_SEND == intent.action && intent.type == receivingType -> { + intent.getStringExtra(Intent.EXTRA_TEXT)?.let { + if (openUrl(it)) { + startActivity { + putExtra("key", it) + } + } } } - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - && Intent.ACTION_PROCESS_TEXT == intent.action - && intent.type == receivingType - ) { - intent.getStringExtra(Intent.EXTRA_PROCESS_TEXT)?.let { - if (openUrl(it)) { - startActivity(Pair("key", it)) + Build.VERSION.SDK_INT >= Build.VERSION_CODES.M + && Intent.ACTION_PROCESS_TEXT == intent.action + && intent.type == receivingType -> { + intent.getStringExtra(Intent.EXTRA_PROCESS_TEXT)?.let { + if (openUrl(it)) { + startActivity { + putExtra("key", it) + } + } } } + intent.getStringExtra("action") == "readAloud" -> { + MediaButtonReceiver.readAloud(appCtx, false) + } } } diff --git a/app/src/main/java/io/legado/app/service/AudioPlayService.kt b/app/src/main/java/io/legado/app/service/AudioPlayService.kt index 805fdfc14..c2659337f 100644 --- a/app/src/main/java/io/legado/app/service/AudioPlayService.kt +++ b/app/src/main/java/io/legado/app/service/AudioPlayService.kt @@ -16,13 +16,13 @@ import android.os.Looper import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.PlaybackStateCompat import androidx.core.app.NotificationCompat -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseService import io.legado.app.constant.AppConst import io.legado.app.constant.EventBus import io.legado.app.constant.IntentAction import io.legado.app.constant.Status +import io.legado.app.data.appDb import io.legado.app.data.entities.BookChapter import io.legado.app.help.IntentHelp import io.legado.app.help.MediaHelp @@ -31,10 +31,11 @@ import io.legado.app.receiver.MediaButtonReceiver import io.legado.app.service.help.AudioPlay import io.legado.app.ui.audio.AudioPlayActivity import io.legado.app.utils.postEvent +import io.legado.app.utils.toastOnUi import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.jetbrains.anko.toast +import splitties.init.appCtx class AudioPlayService : BaseService(), @@ -133,7 +134,7 @@ class AudioPlayService : BaseService(), }.onFailure { it.printStackTrace() launch { - toast("$url ${it.localizedMessage}") + toastOnUi("$url ${it.localizedMessage}") stopSelf() } } @@ -219,7 +220,7 @@ class AudioPlayService : BaseService(), if (!mediaPlayer.isPlaying) { AudioPlay.status = Status.STOP postEvent(EventBus.AUDIO_STATE, Status.STOP) - launch { toast("error: $what $extra $url") } + launch { toastOnUi("error: $what $extra $url") } } return true } @@ -274,7 +275,7 @@ class AudioPlayService : BaseService(), .onSuccess { content -> if (content.isEmpty()) { withContext(Main) { - toast("未获取到资源链接") + toastOnUi("未获取到资源链接") } } else { contentLoadFinish(chapter, content) @@ -286,7 +287,7 @@ class AudioPlayService : BaseService(), } } else { removeLoading(chapter.index) - toast("book or source is null") + toastOnUi("book or source is null") } } } @@ -321,7 +322,7 @@ class AudioPlayService : BaseService(), execute { AudioPlay.book?.let { AudioPlay.durChapterPos = mediaPlayer.currentPosition - App.db.bookDao.upProgress(it.bookUrl, AudioPlay.durChapterPos) + appDb.bookDao.upProgress(it.bookUrl, AudioPlay.durChapterPos) } } } @@ -370,7 +371,7 @@ class AudioPlayService : BaseService(), Intent( Intent.ACTION_MEDIA_BUTTON, null, - App.INSTANCE, + appCtx, MediaButtonReceiver::class.java ), PendingIntent.FLAG_CANCEL_CURRENT diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 9e60ac6b2..541a2d99e 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -14,7 +14,6 @@ import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.PlaybackStateCompat import androidx.annotation.CallSuper import androidx.core.app.NotificationCompat -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseService import io.legado.app.constant.* @@ -27,6 +26,7 @@ import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.book.read.page.entities.TextChapter import io.legado.app.utils.getPrefBoolean import io.legado.app.utils.postEvent +import splitties.init.appCtx abstract class BaseReadAloudService : BaseService(), AudioManager.OnAudioFocusChangeListener { @@ -233,7 +233,7 @@ abstract class BaseReadAloudService : BaseService(), Intent( Intent.ACTION_MEDIA_BUTTON, null, - App.INSTANCE, + appCtx, MediaButtonReceiver::class.java ), PendingIntent.FLAG_CANCEL_CURRENT diff --git a/app/src/main/java/io/legado/app/service/CacheBookService.kt b/app/src/main/java/io/legado/app/service/CacheBookService.kt index 06a6dea35..963dc534c 100644 --- a/app/src/main/java/io/legado/app/service/CacheBookService.kt +++ b/app/src/main/java/io/legado/app/service/CacheBookService.kt @@ -4,12 +4,12 @@ import android.content.Intent import android.os.Handler import android.os.Looper import androidx.core.app.NotificationCompat -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseService import io.legado.app.constant.AppConst import io.legado.app.constant.EventBus import io.legado.app.constant.IntentAction +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 @@ -20,9 +20,10 @@ import io.legado.app.help.coroutine.Coroutine import io.legado.app.model.webBook.WebBook import io.legado.app.service.help.CacheBook import io.legado.app.utils.postEvent +import io.legado.app.utils.toastOnUi import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.isActive -import org.jetbrains.anko.toast +import splitties.init.appCtx import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.CopyOnWriteArraySet import java.util.concurrent.Executors @@ -43,7 +44,7 @@ class CacheBookService : BaseService() { @Volatile private var downloadingCount = 0 - private var notificationContent = App.INSTANCE.getString(R.string.starting_download) + private var notificationContent = appCtx.getString(R.string.starting_download) private val notificationBuilder by lazy { val builder = NotificationCompat.Builder(this, AppConst.channelIdDownload) @@ -95,7 +96,7 @@ class CacheBookService : BaseService() { synchronized(this) { book = bookMap[bookUrl] if (book == null) { - book = App.db.bookDao.getBook(bookUrl) + book = appDb.bookDao.getBook(bookUrl) if (book == null) { removeDownload(bookUrl) } @@ -111,7 +112,7 @@ class CacheBookService : BaseService() { synchronized(this) { webBook = webBookMap[origin] if (webBook == null) { - App.db.bookSourceDao.getBookSource(origin)?.let { + appDb.bookSourceDao.getBookSource(origin)?.let { webBook = WebBook(it) } if (webBook == null) { @@ -128,12 +129,12 @@ class CacheBookService : BaseService() { if (downloadMap.containsKey(bookUrl)) { notificationContent = getString(R.string.already_in_download) upNotification() - toast(notificationContent) + toastOnUi(notificationContent) return } downloadCount[bookUrl] = DownloadCount() execute { - App.db.bookChapterDao.getChapterList(bookUrl, start, end).let { + appDb.bookChapterDao.getChapterList(bookUrl, start, end).let { if (it.isNotEmpty()) { val chapters = CopyOnWriteArraySet() chapters.addAll(it) diff --git a/app/src/main/java/io/legado/app/service/CheckSourceService.kt b/app/src/main/java/io/legado/app/service/CheckSourceService.kt index 6bd72e7bf..6c66be641 100644 --- a/app/src/main/java/io/legado/app/service/CheckSourceService.kt +++ b/app/src/main/java/io/legado/app/service/CheckSourceService.kt @@ -2,12 +2,12 @@ package io.legado.app.service import android.content.Intent import androidx.core.app.NotificationCompat -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseService import io.legado.app.constant.AppConst import io.legado.app.constant.EventBus import io.legado.app.constant.IntentAction +import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.help.AppConfig import io.legado.app.help.IntentHelp @@ -16,8 +16,8 @@ import io.legado.app.model.webBook.WebBook import io.legado.app.service.help.CheckSource import io.legado.app.ui.book.source.manage.BookSourceActivity import io.legado.app.utils.postEvent +import io.legado.app.utils.toastOnUi import kotlinx.coroutines.asCoroutineDispatcher -import org.jetbrains.anko.toast import java.util.concurrent.Executors import kotlin.math.min @@ -70,7 +70,7 @@ class CheckSourceService : BaseService() { private fun check(ids: List) { if (allIds.isNotEmpty()) { - toast("已有书源在校验,等完成后再试") + toastOnUi("已有书源在校验,等完成后再试") return } tasks.clear() @@ -97,7 +97,7 @@ class CheckSourceService : BaseService() { execute { if (index < allIds.size) { val sourceUrl = allIds[index] - App.db.bookSourceDao.getBookSource(sourceUrl)?.let { source -> + appDb.bookSourceDao.getBookSource(sourceUrl)?.let { source -> check(source) } ?: onNext(sourceUrl, "") } @@ -107,22 +107,36 @@ class CheckSourceService : BaseService() { fun check(source: BookSource) { execute(context = searchCoroutine) { val webBook = WebBook(source) - val books = webBook.searchBookAwait(this, CheckSource.keyword) + var books = webBook.searchBookAwait(this, CheckSource.keyword) + if (books.isEmpty()) { + val exs = source.getExploreKinds() + if (exs.isEmpty()) { + throw Exception("搜索内容为空并且没有发现") + } + var url: String? = null + for (ex in exs) { + url = ex.url + if (!url.isNullOrBlank()) { + break + } + } + books = webBook.exploreBookAwait(this, url!!) + } val book = webBook.getBookInfoAwait(this, books.first().toBook()) val toc = webBook.getChapterListAwait(this, book) val content = webBook.getContentAwait(this, book, toc.first()) if (content.isBlank()) { throw Exception("正文内容为空") } - }.timeout(60000L) + }.timeout(180000L) .onError { source.addGroup("失效") source.bookSourceComment = "error:${it.localizedMessage}\n${source.bookSourceComment}" - App.db.bookSourceDao.update(source) + appDb.bookSourceDao.update(source) }.onSuccess { source.removeGroup("失效") - App.db.bookSourceDao.update(source) + appDb.bookSourceDao.update(source) }.onFinally { onNext(source.bookSourceUrl, source.bookSourceName) } diff --git a/app/src/main/java/io/legado/app/service/DownloadService.kt b/app/src/main/java/io/legado/app/service/DownloadService.kt index fd21a079b..134ca55eb 100644 --- a/app/src/main/java/io/legado/app/service/DownloadService.kt +++ b/app/src/main/java/io/legado/app/service/DownloadService.kt @@ -20,8 +20,8 @@ import io.legado.app.constant.IntentAction import io.legado.app.help.IntentHelp import io.legado.app.utils.RealPathUtil import io.legado.app.utils.msg -import org.jetbrains.anko.downloadManager -import org.jetbrains.anko.toast +import io.legado.app.utils.toastOnUi +import splitties.systemservices.downloadManager import java.io.File @@ -149,7 +149,7 @@ class DownloadService : BaseService() { try { startActivity(intent) } catch (e: Exception) { - toast(e.msg) + toastOnUi(e.msg) } } } diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index a91771e66..bccf89319 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -3,6 +3,7 @@ package io.legado.app.service import android.app.PendingIntent import android.content.Intent import android.media.MediaPlayer + import io.legado.app.constant.EventBus import io.legado.app.help.AppConfig import io.legado.app.help.IntentHelp @@ -10,26 +11,23 @@ import io.legado.app.help.coroutine.Coroutine import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.service.help.ReadAloud import io.legado.app.service.help.ReadBook -import io.legado.app.utils.FileUtils -import io.legado.app.utils.LogUtils -import io.legado.app.utils.MD5Utils -import io.legado.app.utils.postEvent +import io.legado.app.utils.* import kotlinx.coroutines.ensureActive import kotlinx.coroutines.isActive -import org.jetbrains.anko.collections.forEachWithIndex import java.io.File import java.io.FileDescriptor import java.io.FileInputStream +import java.io.IOException import java.net.ConnectException import java.net.SocketTimeoutException import java.util.* class HttpReadAloudService : BaseReadAloudService(), - MediaPlayer.OnPreparedListener, - MediaPlayer.OnErrorListener, - MediaPlayer.OnCompletionListener { + MediaPlayer.OnPreparedListener, + MediaPlayer.OnErrorListener, + MediaPlayer.OnCompletionListener { - private val mediaPlayer = MediaPlayer() + private val player by lazy { MediaPlayer() } private lateinit var ttsFolder: String private var task: Coroutine<*>? = null private var playingIndex = -1 @@ -37,9 +35,9 @@ class HttpReadAloudService : BaseReadAloudService(), override fun onCreate() { super.onCreate() ttsFolder = externalCacheDir!!.absolutePath + File.separator + "httpTTS" - mediaPlayer.setOnErrorListener(this) - mediaPlayer.setOnPreparedListener(this) - mediaPlayer.setOnCompletionListener(this) + player.setOnErrorListener(this) + player.setOnPreparedListener(this) + player.setOnCompletionListener(this) } override fun onTaskRemoved(rootIntent: Intent?) { @@ -50,11 +48,11 @@ class HttpReadAloudService : BaseReadAloudService(), override fun onDestroy() { super.onDestroy() task?.cancel() - mediaPlayer.release() + player.release() } override fun newReadAloud(dataKey: String?, play: Boolean) { - mediaPlayer.reset() + player.reset() playingIndex = -1 super.newReadAloud(dataKey, play) } @@ -81,7 +79,7 @@ class HttpReadAloudService : BaseReadAloudService(), task = execute { removeCacheFile() ReadAloud.httpTTS?.let { - contentList.forEachWithIndex { index, item -> + contentList.forEachIndexed { index, item -> if (isActive) { val fileName = md5SpeakFileName(it.url, AppConfig.ttsSpeechRate.toString(), item) @@ -100,27 +98,37 @@ class HttpReadAloudService : BaseReadAloudService(), try { createSpeakCacheFile(fileName) AnalyzeUrl( - it.url, - speakText = item, - speakSpeed = AppConfig.ttsSpeechRate + it.url, + speakText = item, + speakSpeed = AppConfig.ttsSpeechRate ).getByteArray().let { bytes -> ensureActive() - val file = getSpeakFileAsMd5(fileName) + + val file = getSpeakFileAsMd5IfNotExist(fileName) //val file = getSpeakFile(index) file.writeBytes(bytes) removeSpeakCacheFile(fileName) + + val fis = FileInputStream(file) + if (index == nowSpeak) { @Suppress("BlockingMethodInNonBlockingContext") - val fis = FileInputStream(file) playAudio(fis.fd) } } } catch (e: SocketTimeoutException) { removeSpeakCacheFile(fileName) - // delay(2000) - // downloadAudio() + toastOnUi("tts接口超时,尝试重新获取") + downloadAudio() } catch (e: ConnectException) { removeSpeakCacheFile(fileName) + toastOnUi("网络错误") + } catch (e: IOException) { + val file = getSpeakFileAsMd5(fileName) + if (file.exists()) { + FileUtils.deleteFile(file.absolutePath) + } + toastOnUi("tts文件解析错误") } catch (e: Exception) { removeSpeakCacheFile(fileName) } @@ -135,9 +143,9 @@ class HttpReadAloudService : BaseReadAloudService(), private fun playAudio(fd: FileDescriptor) { if (playingIndex != nowSpeak && requestFocus()) { try { - mediaPlayer.reset() - mediaPlayer.setDataSource(fd) - mediaPlayer.prepareAsync() + player.reset() + player.setDataSource(fd) + player.prepareAsync() playingIndex = nowSpeak postEvent(EventBus.TTS_PROGRESS, readAloudNumber + 1) } catch (e: Exception) { @@ -152,20 +160,23 @@ class HttpReadAloudService : BaseReadAloudService(), } private fun hasSpeakFile(name: String) = - FileUtils.exist("${speakFilePath()}$name.mp3") + FileUtils.exist("${speakFilePath()}$name.mp3") private fun hasSpeakCacheFile(name: String) = - FileUtils.exist("${speakFilePath()}$name.mp3.cache") + FileUtils.exist("${speakFilePath()}$name.mp3.cache") private fun createSpeakCacheFile(name: String): File = - FileUtils.createFileWithReplace("${speakFilePath()}$name.mp3.cache") + FileUtils.createFileWithReplace("${speakFilePath()}$name.mp3.cache") private fun removeSpeakCacheFile(name: String) { FileUtils.delete("${speakFilePath()}$name.mp3.cache") } private fun getSpeakFileAsMd5(name: String): File = - FileUtils.createFileIfNotExist("${speakFilePath()}$name.mp3") + FileUtils.getFile(File(speakFilePath()), "$name.mp3") + + private fun getSpeakFileAsMd5IfNotExist(name: String): File = + FileUtils.createFileIfNotExist("${speakFilePath()}$name.mp3") private fun removeCacheFile() { FileUtils.listDirsAndFiles(speakFilePath())?.forEach { @@ -174,7 +185,7 @@ class HttpReadAloudService : BaseReadAloudService(), } if (Regex(""".+\.mp3$""").matches(it.name)) { //mp3缓存文件 val reg = - """^${MD5Utils.md5Encode16(textChapter!!.title)}_[a-z0-9]{16}\.mp3$""".toRegex() + """^${MD5Utils.md5Encode16(textChapter!!.title)}_[a-z0-9]{16}\.mp3$""".toRegex() if (!reg.matches(it.name)) { FileUtils.deleteFile(it.absolutePath) } @@ -189,7 +200,7 @@ class HttpReadAloudService : BaseReadAloudService(), override fun pauseReadAloud(pause: Boolean) { super.pauseReadAloud(pause) - mediaPlayer.pause() + player.pause() } override fun resumeReadAloud() { @@ -197,7 +208,7 @@ class HttpReadAloudService : BaseReadAloudService(), if (playingIndex == -1) { play() } else { - mediaPlayer.start() + player.start() } } @@ -206,7 +217,7 @@ class HttpReadAloudService : BaseReadAloudService(), */ override fun upSpeechRate(reset: Boolean) { task?.cancel() - mediaPlayer.stop() + player.stop() playingIndex = -1 downloadAudio() } @@ -216,7 +227,7 @@ class HttpReadAloudService : BaseReadAloudService(), */ override fun prevP() { if (nowSpeak > 0) { - mediaPlayer.stop() + player.stop() nowSpeak-- readAloudNumber -= contentList[nowSpeak].length.minus(1) play() @@ -228,7 +239,7 @@ class HttpReadAloudService : BaseReadAloudService(), */ override fun nextP() { if (nowSpeak < contentList.size - 1) { - mediaPlayer.stop() + player.stop() readAloudNumber += contentList[nowSpeak].length.plus(1) nowSpeak++ play() diff --git a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt index d1341a4c3..60cb11bdf 100644 --- a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt @@ -13,8 +13,8 @@ import io.legado.app.help.MediaHelp import io.legado.app.service.help.ReadBook import io.legado.app.utils.getPrefBoolean import io.legado.app.utils.postEvent +import io.legado.app.utils.toastOnUi import kotlinx.coroutines.launch -import org.jetbrains.anko.toast import java.util.* class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener { @@ -64,7 +64,7 @@ class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener } } else { launch { - toast(R.string.tts_init_failed) + toastOnUi(R.string.tts_init_failed) } } } diff --git a/app/src/main/java/io/legado/app/service/WebService.kt b/app/src/main/java/io/legado/app/service/WebService.kt index 03bddff2c..da350a90a 100644 --- a/app/src/main/java/io/legado/app/service/WebService.kt +++ b/app/src/main/java/io/legado/app/service/WebService.kt @@ -10,14 +10,9 @@ import io.legado.app.constant.EventBus import io.legado.app.constant.IntentAction import io.legado.app.constant.PreferKey import io.legado.app.help.IntentHelp -import io.legado.app.utils.NetworkUtils -import io.legado.app.utils.getPrefInt -import io.legado.app.utils.postEvent +import io.legado.app.utils.* import io.legado.app.web.HttpServer import io.legado.app.web.WebSocketServer -import kotlinx.coroutines.launch -import org.jetbrains.anko.startService -import org.jetbrains.anko.toast import java.io.IOException class WebService : BaseService() { @@ -92,10 +87,8 @@ class WebService : BaseService() { notificationContent = hostAddress upNotification() } catch (e: IOException) { - launch { - toast(e.localizedMessage ?: "") - stopSelf() - } + toastOnUi(e.localizedMessage ?: "") + stopSelf() } } else { stopSelf() diff --git a/app/src/main/java/io/legado/app/service/help/AudioPlay.kt b/app/src/main/java/io/legado/app/service/help/AudioPlay.kt index 65f6e7f0d..7a599a190 100644 --- a/app/src/main/java/io/legado/app/service/help/AudioPlay.kt +++ b/app/src/main/java/io/legado/app/service/help/AudioPlay.kt @@ -3,10 +3,10 @@ package io.legado.app.service.help import android.content.Context import android.content.Intent import androidx.lifecycle.MutableLiveData -import io.legado.app.App import io.legado.app.constant.EventBus import io.legado.app.constant.IntentAction import io.legado.app.constant.Status +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.coroutine.Coroutine @@ -44,7 +44,7 @@ object AudioPlay { } fun upDurChapter(book: Book) { - durChapter = App.db.bookChapterDao.getChapter(book.bookUrl, durChapterIndex) + durChapter = appDb.bookChapterDao.getChapter(book.bookUrl, durChapterIndex) postEvent(EventBus.AUDIO_SUB_TITLE, durChapter?.title ?: "") postEvent(EventBus.AUDIO_SIZE, durChapter?.end?.toInt() ?: 0) postEvent(EventBus.AUDIO_PROGRESS, durChapterPos) @@ -153,10 +153,10 @@ object AudioPlay { book.durChapterTime = System.currentTimeMillis() book.durChapterIndex = durChapterIndex book.durChapterPos = durChapterPos - App.db.bookChapterDao.getChapter(book.bookUrl, book.durChapterIndex)?.let { + appDb.bookChapterDao.getChapter(book.bookUrl, book.durChapterIndex)?.let { book.durChapterTitle = it.title } - App.db.bookDao.update(book) + appDb.bookDao.update(book) } } } @@ -165,7 +165,7 @@ object AudioPlay { Coroutine.async { durChapter?.let { it.end = audioSize - App.db.bookChapterDao.insert(it) + appDb.bookChapterDao.insert(it) } } } diff --git a/app/src/main/java/io/legado/app/service/help/CacheBook.kt b/app/src/main/java/io/legado/app/service/help/CacheBook.kt index 782ab3bf8..3a8a5d0ce 100644 --- a/app/src/main/java/io/legado/app/service/help/CacheBook.kt +++ b/app/src/main/java/io/legado/app/service/help/CacheBook.kt @@ -2,7 +2,6 @@ package io.legado.app.service.help import android.content.Context import android.content.Intent -import io.legado.app.App import io.legado.app.R import io.legado.app.constant.IntentAction import io.legado.app.data.entities.Book @@ -11,6 +10,7 @@ import io.legado.app.model.webBook.WebBook import io.legado.app.service.CacheBookService import io.legado.app.utils.msg import kotlinx.coroutines.CoroutineScope +import splitties.init.appCtx import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.CopyOnWriteArraySet @@ -81,7 +81,7 @@ object CacheBook { ReadBook.contentLoadFinish( book, chapter, - content.ifBlank { App.INSTANCE.getString(R.string.content_empty) }, + content.ifBlank { appCtx.getString(R.string.content_empty) }, resetPageOffset = resetPageOffset ) } diff --git a/app/src/main/java/io/legado/app/service/help/CheckSource.kt b/app/src/main/java/io/legado/app/service/help/CheckSource.kt index d38e6c225..725c303e7 100644 --- a/app/src/main/java/io/legado/app/service/help/CheckSource.kt +++ b/app/src/main/java/io/legado/app/service/help/CheckSource.kt @@ -6,14 +6,14 @@ import io.legado.app.R import io.legado.app.constant.IntentAction import io.legado.app.data.entities.BookSource import io.legado.app.service.CheckSourceService -import org.jetbrains.anko.toast +import io.legado.app.utils.toastOnUi object CheckSource { var keyword = "我的" fun start(context: Context, sources: List) { if (sources.isEmpty()) { - context.toast(R.string.non_select) + context.toastOnUi(R.string.non_select) return } val selectedIds: ArrayList = arrayListOf() diff --git a/app/src/main/java/io/legado/app/service/help/ReadAloud.kt b/app/src/main/java/io/legado/app/service/help/ReadAloud.kt index 1bcdae796..fb0b71804 100644 --- a/app/src/main/java/io/legado/app/service/help/ReadAloud.kt +++ b/app/src/main/java/io/legado/app/service/help/ReadAloud.kt @@ -2,22 +2,23 @@ package io.legado.app.service.help import android.content.Context import android.content.Intent -import io.legado.app.App import io.legado.app.constant.IntentAction import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.data.entities.HttpTTS import io.legado.app.service.BaseReadAloudService import io.legado.app.service.HttpReadAloudService import io.legado.app.service.TTSReadAloudService import io.legado.app.utils.getPrefLong +import splitties.init.appCtx object ReadAloud { private var aloudClass: Class<*> = getReadAloudClass() var httpTTS: HttpTTS? = null private fun getReadAloudClass(): Class<*> { - val spId = App.INSTANCE.getPrefLong(PreferKey.speakEngine) - httpTTS = App.db.httpTTSDao.get(spId) + val spId = appCtx.getPrefLong(PreferKey.speakEngine) + httpTTS = appDb.httpTTSDao.get(spId) return if (httpTTS != null) { HttpReadAloudService::class.java } else { @@ -26,7 +27,7 @@ object ReadAloud { } fun upReadAloudClass() { - stop(App.INSTANCE) + stop(appCtx) aloudClass = getReadAloudClass() } diff --git a/app/src/main/java/io/legado/app/service/help/ReadBook.kt b/app/src/main/java/io/legado/app/service/help/ReadBook.kt index 1a2d7b340..63d892374 100644 --- a/app/src/main/java/io/legado/app/service/help/ReadBook.kt +++ b/app/src/main/java/io/legado/app/service/help/ReadBook.kt @@ -2,8 +2,8 @@ package io.legado.app.service.help import androidx.lifecycle.MutableLiveData import com.hankcs.hanlp.HanLP -import io.legado.app.App import io.legado.app.constant.BookType +import io.legado.app.data.appDb import io.legado.app.data.entities.* import io.legado.app.help.* import io.legado.app.help.coroutine.Coroutine @@ -14,12 +14,13 @@ import io.legado.app.ui.book.read.page.entities.TextChapter import io.legado.app.ui.book.read.page.entities.TextPage import io.legado.app.ui.book.read.page.provider.ChapterProvider import io.legado.app.ui.book.read.page.provider.ImageProvider +import io.legado.app.utils.msg +import io.legado.app.utils.toastOnUi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import org.jetbrains.anko.getStackTraceString -import org.jetbrains.anko.toast +import splitties.init.appCtx @Suppress("MemberVisibilityCanBePrivate") @@ -47,7 +48,7 @@ object ReadBook { this.book = book contentProcessor = ContentProcessor(book.name, book.origin) readRecord.bookName = book.name - readRecord.readTime = App.db.readRecordDao.getReadTime(book.name) ?: 0 + readRecord.readTime = appDb.readRecordDao.getReadTime(book.name) ?: 0 durChapterIndex = book.durChapterIndex durChapterPos = book.durChapterPos isLocalBook = book.origin == BookType.local @@ -67,9 +68,12 @@ object ReadBook { bookSource = null webBook = null } else { - App.db.bookSourceDao.getBookSource(book.origin)?.let { + appDb.bookSourceDao.getBookSource(book.origin)?.let { bookSource = it webBook = WebBook(it) + if (book.getImageStyle().isNullOrBlank()) { + book.setImageStyle(it.getContentRule().imageStyle) + } } ?: let { bookSource = null webBook = null @@ -102,7 +106,7 @@ object ReadBook { Coroutine.async { readRecord.readTime = readRecord.readTime + System.currentTimeMillis() - readStartTime readStartTime = System.currentTimeMillis() - App.db.readRecordDao.insert(readRecord) + appDb.readRecordDao.insert(readRecord) } } @@ -185,7 +189,7 @@ object ReadBook { fun skipToPage(index: Int, success: (() -> Unit)? = null) { durChapterPos = curTextChapter?.getReadLength(index) ?: index - callBack?.upContent() { + callBack?.upContent { success?.invoke() } curPageChanged() @@ -215,7 +219,7 @@ object ReadBook { if (book != null && textChapter != null) { val key = IntentDataHelp.putData(textChapter) ReadAloud.play( - App.INSTANCE, book.name, textChapter.title, durPageIndex(), key, play + appCtx, book.name, textChapter.title, durPageIndex(), key, play ) } } @@ -259,7 +263,7 @@ object ReadBook { book?.let { book -> if (addLoading(index)) { Coroutine.async { - App.db.bookChapterDao.getChapter(book.bookUrl, index)?.let { chapter -> + appDb.bookChapterDao.getChapter(book.bookUrl, index)?.let { chapter -> BookHelp.getContent(book, chapter)?.let { contentLoadFinish(book, chapter, it, upContent, resetPageOffset) { success?.invoke() @@ -279,7 +283,7 @@ object ReadBook { if (book.isLocalBook()) return if (addLoading(index)) { Coroutine.async { - App.db.bookChapterDao.getChapter(book.bookUrl, index)?.let { chapter -> + appDb.bookChapterDao.getChapter(book.bookUrl, index)?.let { chapter -> if (BookHelp.hasContent(book, chapter)) { removeLoading(chapter.index) } else { @@ -412,7 +416,7 @@ object ReadBook { durChapterIndex -> { curTextChapter = ChapterProvider.getTextChapter( - book, chapter, contents, chapterSize, imageStyle + book, chapter, contents, chapterSize ) if (upContent) callBack?.upContent(resetPageOffset = resetPageOffset) callBack?.upView() @@ -422,14 +426,14 @@ object ReadBook { durChapterIndex - 1 -> { prevTextChapter = ChapterProvider.getTextChapter( - book, chapter, contents, chapterSize, imageStyle + book, chapter, contents, chapterSize ) if (upContent) callBack?.upContent(-1, resetPageOffset) } durChapterIndex + 1 -> { nextTextChapter = ChapterProvider.getTextChapter( - book, chapter, contents, chapterSize, imageStyle + book, chapter, contents, chapterSize ) if (upContent) callBack?.upContent(1, resetPageOffset) } @@ -437,14 +441,12 @@ object ReadBook { } }.onError { it.printStackTrace() - App.INSTANCE.toast("ChapterProvider ERROR:\n${it.getStackTraceString()}") + appCtx.toastOnUi("ChapterProvider ERROR:\n${it.msg}") }.onSuccess { success?.invoke() } } - private val imageStyle get() = webBook?.bookSource?.ruleContent?.imageStyle - fun pageAnim(): Int { book?.let { return if (it.getPageAnim() < 0) @@ -470,10 +472,10 @@ object ReadBook { book.durChapterTime = System.currentTimeMillis() book.durChapterIndex = durChapterIndex book.durChapterPos = durChapterPos - App.db.bookChapterDao.getChapter(book.bookUrl, durChapterIndex)?.let { + appDb.bookChapterDao.getChapter(book.bookUrl, durChapterIndex)?.let { book.durChapterTitle = it.title } - App.db.bookDao.update(book) + appDb.bookDao.update(book) } } } diff --git a/app/src/main/java/io/legado/app/ui/about/AboutActivity.kt b/app/src/main/java/io/legado/app/ui/about/AboutActivity.kt index f6c9088de..2c669aacd 100644 --- a/app/src/main/java/io/legado/app/ui/about/AboutActivity.kt +++ b/app/src/main/java/io/legado/app/ui/about/AboutActivity.kt @@ -12,7 +12,7 @@ import io.legado.app.databinding.ActivityAboutBinding import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.accentColor import io.legado.app.utils.openUrl -import org.jetbrains.anko.share +import io.legado.app.utils.share class AboutActivity : BaseActivity() { diff --git a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt index 992bf6931..166161c19 100644 --- a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt +++ b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt @@ -7,15 +7,13 @@ import android.view.View import androidx.annotation.StringRes import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat -import io.legado.app.App import io.legado.app.R +import io.legado.app.constant.appInfo import io.legado.app.help.AppConfig import io.legado.app.lib.dialogs.alert +import io.legado.app.lib.dialogs.selector import io.legado.app.ui.widget.dialog.TextDialog -import io.legado.app.utils.openUrl -import io.legado.app.utils.sendMail -import io.legado.app.utils.sendToClip -import io.legado.app.utils.toast +import io.legado.app.utils.* class AboutFragment : PreferenceFragmentCompat() { @@ -25,7 +23,7 @@ class AboutFragment : PreferenceFragmentCompat() { Pair("(QQ群VIP1)701903217", "-iolizL4cbJSutKRpeImHlXlpLDZnzeF"), Pair("(QQ群VIP2)263949160", "xwfh7_csb2Gf3Aw2qexEcEtviLfLfd4L"), Pair("(QQ群VIP3)680280282", "_N0i7yZObjKSeZQvzoe2ej7j02kLnOOK"), - Pair("(QQ群VIP4)680280282", "VF2UwvUCuaqlo6pddWTe_kw__a1_Fr8O"), + Pair("(QQ群VIP4)682555679", "VF2UwvUCuaqlo6pddWTe_kw__a1_Fr8O"), Pair("(QQ群1)805192012", "6GlFKjLeIk5RhQnR3PNVDaKB6j10royo"), Pair("(QQ群2)773736122", "5Bm5w6OgLupXnICbYvbgzpPUgf0UlsJF"), Pair("(QQ群3)981838750", "g_Sgmp2nQPKqcZQ5qPcKLHziwX_mpps9"), @@ -34,12 +32,13 @@ class AboutFragment : PreferenceFragmentCompat() { Pair("(QQ群6)870270970", "FeCF8iSxfQbe90HPvGsvcqs5P5oSeY5n"), Pair("(QQ群7)15987187", "S2g2TMD0LGd3sefUADd1AbyPEW2o2XfC"), Pair("(QQ群8)1079926194", "gg2qFH8q9IPFaCHV3H7CqCN-YljvazE1"), + Pair("(QQ群9)892108780", "Ci_O3aysKjEBfplOWeCud-rxl71TjU2Q") ) override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.about) findPreference("update_log")?.summary = - "${getString(R.string.version)} ${App.versionName}" + "${getString(R.string.version)} ${appInfo.versionName}" if (AppConfig.isGooglePlay) { preferenceScreen.removePreferenceRecursively("check_update") } @@ -63,6 +62,7 @@ class AboutFragment : PreferenceFragmentCompat() { "disclaimer" -> requireContext().openUrl(disclaimerUrl) "qq" -> showQqGroups() "gzGzh" -> requireContext().sendToClip(getString(R.string.legado_gzh)) + "crashLog" -> showCrashLogs() "tg" -> openUrl(R.string.tg_url) "discord" -> openUrl(R.string.discord_url) } @@ -105,9 +105,25 @@ class AboutFragment : PreferenceFragmentCompat() { startActivity(intent) return true }.onFailure { - toast("添加失败,请手动添加") + toastOnUi("添加失败,请手动添加") } return false } + private fun showCrashLogs() { + context?.externalCacheDir?.let { exCacheDir -> + val crashDir = FileUtils.getFile(exCacheDir, "crash") + val crashLogs = crashDir.listFiles() + val crashLogNames = arrayListOf() + crashLogs?.forEach { + crashLogNames.add(it.name) + } + context?.selector(R.string.crash_log, crashLogNames) { _, select -> + crashLogs?.getOrNull(select)?.let { logFile -> + TextDialog.show(childFragmentManager, logFile.readText()) + } + } + } + } + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/about/DonateFragment.kt b/app/src/main/java/io/legado/app/ui/about/DonateFragment.kt index b716c8f05..29da08d54 100644 --- a/app/src/main/java/io/legado/app/ui/about/DonateFragment.kt +++ b/app/src/main/java/io/legado/app/ui/about/DonateFragment.kt @@ -8,9 +8,9 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import io.legado.app.R import io.legado.app.utils.ACache +import io.legado.app.utils.longToastOnUi import io.legado.app.utils.openUrl import io.legado.app.utils.sendToClip -import org.jetbrains.anko.longToast class DonateFragment : PreferenceFragmentCompat() { @@ -42,7 +42,7 @@ class DonateFragment : PreferenceFragmentCompat() { private fun getZfbHb(context: Context) { requireContext().sendToClip("537954522") - context.longToast("高级功能已开启\n红包码已复制\n支付宝首页搜索“537954522” 立即领红包") + context.longToastOnUi("高级功能已开启\n红包码已复制\n支付宝首页搜索“537954522” 立即领红包") try { val packageManager = context.applicationContext.packageManager val intent = packageManager.getLaunchIntentForPackage("com.eg.android.AlipayGphone")!! diff --git a/app/src/main/java/io/legado/app/ui/about/ReadRecordActivity.kt b/app/src/main/java/io/legado/app/ui/about/ReadRecordActivity.kt index ea467af80..8d3295299 100644 --- a/app/src/main/java/io/legado/app/ui/about/ReadRecordActivity.kt +++ b/app/src/main/java/io/legado/app/ui/about/ReadRecordActivity.kt @@ -5,11 +5,11 @@ import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.view.ViewGroup -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseActivity import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.data.appDb import io.legado.app.data.entities.ReadRecordShow import io.legado.app.databinding.ActivityReadRecordBinding import io.legado.app.databinding.ItemReadRecordBinding @@ -19,7 +19,6 @@ import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.jetbrains.anko.sdk27.listeners.onClick import java.util.* class ReadRecordActivity : BaseActivity() { @@ -59,10 +58,10 @@ class ReadRecordActivity : BaseActivity() { readRecord.tvBookName.setText(R.string.all_read_time) adapter = RecordAdapter(this@ReadRecordActivity) recyclerView.adapter = adapter - readRecord.ivRemove.onClick { + readRecord.tvRemove.setOnClickListener { alert(R.string.delete, R.string.sure_del) { okButton { - App.db.readRecordDao.clear() + appDb.readRecordDao.clear() initData() } noButton() @@ -72,11 +71,11 @@ class ReadRecordActivity : BaseActivity() { private fun initData() { launch(IO) { - val allTime = App.db.readRecordDao.allTime + val allTime = appDb.readRecordDao.allTime withContext(Main) { binding.readRecord.tvReadTime.text = formatDuring(allTime) } - var readRecords = App.db.readRecordDao.allShow + var readRecords = appDb.readRecordDao.allShow readRecords = when (sortMode) { 1 -> readRecords.sortedBy { it.readTime } else -> { @@ -112,7 +111,7 @@ class ReadRecordActivity : BaseActivity() { override fun registerListener(holder: ItemViewHolder, binding: ItemReadRecordBinding) { binding.apply { - ivRemove.onClick { + tvRemove.setOnClickListener { getItem(holder.layoutPosition)?.let { item -> sureDelAlert(item) } @@ -122,9 +121,9 @@ class ReadRecordActivity : BaseActivity() { private fun sureDelAlert(item: ReadRecordShow) { alert(R.string.delete) { - message = getString(R.string.sure_del_any, item.bookName) + setMessage(getString(R.string.sure_del_any, item.bookName)) okButton { - App.db.readRecordDao.deleteByName(item.bookName) + appDb.readRecordDao.deleteByName(item.bookName) initData() } noButton() @@ -142,7 +141,11 @@ class ReadRecordActivity : BaseActivity() { val h = if (hours > 0) "${hours}小时" else "" val m = if (minutes > 0) "${minutes}分钟" else "" val s = if (seconds > 0) "${seconds}秒" else "" - return "$d$h$m$s" + var time = "$d$h$m$s" + if (time.isBlank()) { + time = "0秒" + } + return time } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/association/FileAssociationActivity.kt b/app/src/main/java/io/legado/app/ui/association/FileAssociationActivity.kt index a9f79def1..67aec440f 100644 --- a/app/src/main/java/io/legado/app/ui/association/FileAssociationActivity.kt +++ b/app/src/main/java/io/legado/app/ui/association/FileAssociationActivity.kt @@ -2,14 +2,14 @@ package io.legado.app.ui.association import android.content.Intent import android.os.Bundle +import androidx.activity.viewModels import io.legado.app.base.VMBaseActivity import io.legado.app.constant.Theme import io.legado.app.databinding.ActivityTranslucenceBinding import io.legado.app.ui.main.MainActivity -import io.legado.app.utils.getViewModel -import org.jetbrains.anko.startActivity -import org.jetbrains.anko.toast +import io.legado.app.utils.startActivity +import io.legado.app.utils.toastOnUi class FileAssociationActivity : VMBaseActivity( @@ -20,14 +20,13 @@ class FileAssociationActivity : return ActivityTranslucenceBinding.inflate(layoutInflater) } - override val viewModel: FileAssociationViewModel - get() = getViewModel(FileAssociationViewModel::class.java) + override val viewModel: FileAssociationViewModel by viewModels() override fun onActivityCreated(savedInstanceState: Bundle?) { binding.rotateLoading.show() viewModel.errorLiveData.observe(this, { binding.rotateLoading.hide() - toast(it) + toastOnUi(it) finish() }) viewModel.successLiveData.observe(this, { diff --git a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceActivity.kt index f6e11de63..09007b795 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceActivity.kt @@ -1,14 +1,15 @@ package io.legado.app.ui.association import android.os.Bundle +import androidx.activity.viewModels import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.Theme import io.legado.app.databinding.ActivityTranslucenceBinding import io.legado.app.help.IntentDataHelp import io.legado.app.lib.dialogs.alert -import io.legado.app.utils.getViewModel -import org.jetbrains.anko.toast + +import io.legado.app.utils.toastOnUi class ImportBookSourceActivity : @@ -21,7 +22,7 @@ class ImportBookSourceActivity : } override val viewModel: ImportBookSourceViewModel - get() = getViewModel(ImportBookSourceViewModel::class.java) + by viewModels() override fun onActivityCreated(savedInstanceState: Bundle?) { binding.rotateLoading.show() @@ -66,7 +67,7 @@ class ImportBookSourceActivity : } else -> { binding.rotateLoading.hide() - toast(R.string.wrong_format) + toastOnUi(R.string.wrong_format) finish() } } diff --git a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt index 0f3e6008f..038df02d5 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt @@ -9,23 +9,28 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar +import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.LinearLayoutManager -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.constant.AppPattern import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogRecyclerViewBinding import io.legado.app.databinding.ItemSourceImportBinding import io.legado.app.help.AppConfig import io.legado.app.lib.dialogs.alert -import io.legado.app.utils.* +import io.legado.app.ui.widget.dialog.WaitDialog +import io.legado.app.utils.dp +import io.legado.app.utils.putPrefBoolean +import io.legado.app.utils.splitNotBlank import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onClick +import io.legado.app.utils.visible + /** * 导入书源弹出窗口 @@ -34,8 +39,7 @@ class ImportBookSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickList private val binding by viewBinding(DialogRecyclerViewBinding::bind) - val viewModel: ImportBookSourceViewModel - get() = getViewModelOfActivity(ImportBookSourceViewModel::class.java) + val viewModel: ImportBookSourceViewModel by activityViewModels() lateinit var adapter: SourcesAdapter override fun onStart() { @@ -62,14 +66,45 @@ class ImportBookSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickList binding.recyclerView.adapter = adapter adapter.setItems(viewModel.allSources) binding.tvCancel.visible() - binding.tvCancel.onClick { - dismiss() + binding.tvCancel.setOnClickListener { + dismissAllowingStateLoss() } binding.tvOk.visible() - binding.tvOk.onClick { + binding.tvOk.setOnClickListener { + val waitDialog = WaitDialog(requireContext()) + waitDialog.show() viewModel.importSelect { - dismiss() + waitDialog.dismiss() + dismissAllowingStateLoss() + } + } + upSelectText() + binding.tvFooterLeft.visible() + binding.tvFooterLeft.setOnClickListener { + val selectAll = viewModel.isSelectAll() + viewModel.selectStatus.forEachIndexed { index, b -> + if (b != !selectAll) { + viewModel.selectStatus[index] = !selectAll + } } + adapter.notifyDataSetChanged() + upSelectText() + } + } + + private fun upSelectText() { + if (viewModel.isSelectAll()) { + binding.tvFooterLeft.text = getString( + R.string.select_cancel_count, + viewModel.selectCount(), + viewModel.allSources.size + ) + } else { + binding.tvFooterLeft.text = getString( + R.string.select_all_count, + viewModel.selectCount(), + viewModel.allSources.size + ) } } @@ -87,13 +122,15 @@ class ImportBookSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickList alert(R.string.diy_edit_source_group) { val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply { val groups = linkedSetOf() - App.db.bookSourceDao.allGroup.forEach { group -> + appDb.bookSourceDao.allGroup.forEach { group -> groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) } editView.setFilterValues(groups.toList()) editView.dropDownHeight = 180.dp } - customView = alertBinding.root + customView { + alertBinding.root + } okButton { alertBinding.editView.text?.toString()?.let { group -> viewModel.groupName = group @@ -103,22 +140,6 @@ class ImportBookSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickList noButton() }.show() } - R.id.menu_select_all -> { - viewModel.selectStatus.forEachIndexed { index, b -> - if (!b) { - viewModel.selectStatus[index] = true - } - } - adapter.notifyDataSetChanged() - } - R.id.menu_un_select_all -> { - viewModel.selectStatus.forEachIndexed { index, b -> - if (b) { - viewModel.selectStatus[index] = false - } - } - adapter.notifyDataSetChanged() - } R.id.menu_Keep_original_name -> { item.isChecked = !item.isChecked putPrefBoolean(PreferKey.importKeepName, item.isChecked) @@ -163,6 +184,7 @@ class ImportBookSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickList cbSourceName.setOnCheckedChangeListener { buttonView, isChecked -> if (buttonView.isPressed) { viewModel.selectStatus[holder.layoutPosition] = isChecked + upSelectText() } } } diff --git a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceViewModel.kt index 8b3397a0c..42647cf6e 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceViewModel.kt @@ -5,9 +5,9 @@ import android.net.Uri import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.MutableLiveData import com.jayway.jsonpath.JsonPath -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.help.AppConfig import io.legado.app.help.SourceHelp @@ -27,6 +27,24 @@ class ImportBookSourceViewModel(app: Application) : BaseViewModel(app) { val checkSources = arrayListOf() val selectStatus = arrayListOf() + fun isSelectAll(): Boolean { + selectStatus.forEach { + if (!it) { + return false + } + } + return true + } + + fun selectCount(): Int { + var count = 0 + selectStatus.forEach { + if (it) { + count++ + } + } + return count + } fun importSelect(finally: () -> Unit) { execute { @@ -134,9 +152,9 @@ class ImportBookSourceViewModel(app: Application) : BaseViewModel(app) { private fun comparisonSource() { execute { allSources.forEach { - val has = App.db.bookSourceDao.getBookSource(it.bookSourceUrl) - checkSources.add(has) - selectStatus.add(has == null) + val source = appDb.bookSourceDao.getBookSource(it.bookSourceUrl) + checkSources.add(source) + selectStatus.add(source == null || source.lastUpdateTime < it.lastUpdateTime) } successLiveData.postValue(allSources.size) } diff --git a/app/src/main/java/io/legado/app/ui/association/ImportReplaceRuleActivity.kt b/app/src/main/java/io/legado/app/ui/association/ImportReplaceRuleActivity.kt index 19e90b540..d048b1264 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportReplaceRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportReplaceRuleActivity.kt @@ -1,15 +1,15 @@ package io.legado.app.ui.association import android.os.Bundle -import io.legado.app.App +import androidx.activity.viewModels import io.legado.app.base.VMBaseActivity import io.legado.app.constant.Theme +import io.legado.app.data.appDb import io.legado.app.data.entities.ReplaceRule import io.legado.app.databinding.ActivityTranslucenceBinding import io.legado.app.help.IntentDataHelp import io.legado.app.lib.dialogs.alert -import io.legado.app.utils.getViewModel -import org.jetbrains.anko.toast +import io.legado.app.utils.toastOnUi class ImportReplaceRuleActivity : VMBaseActivity( @@ -21,7 +21,7 @@ class ImportReplaceRuleActivity : } override val viewModel: ImportReplaceRuleViewModel - get() = getViewModel(ImportReplaceRuleViewModel::class.java) + by viewModels() override fun onActivityCreated(savedInstanceState: Bundle?) { binding.rotateLoading.show() @@ -66,7 +66,7 @@ class ImportReplaceRuleActivity : } else -> { binding.rotateLoading.hide() - toast("格式不对") + toastOnUi("格式不对") finish() } } @@ -85,7 +85,7 @@ class ImportReplaceRuleActivity : private fun successDialog(allSource: ArrayList) { alert("解析结果", "共${allSource.size}个替换规则,是否确认导入?") { okButton { - App.db.replaceRuleDao.insert(*allSource.toTypedArray()) + appDb.replaceRuleDao.insert(*allSource.toTypedArray()) } noButton() onDismiss { diff --git a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceActivity.kt b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceActivity.kt index 76e7bb2c7..3a8efd37b 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceActivity.kt @@ -1,14 +1,15 @@ package io.legado.app.ui.association import android.os.Bundle +import androidx.activity.viewModels import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.Theme import io.legado.app.databinding.ActivityTranslucenceBinding import io.legado.app.help.IntentDataHelp import io.legado.app.lib.dialogs.alert -import io.legado.app.utils.getViewModel -import org.jetbrains.anko.toast + +import io.legado.app.utils.toastOnUi class ImportRssSourceActivity : VMBaseActivity( @@ -20,7 +21,7 @@ class ImportRssSourceActivity : } override val viewModel: ImportRssSourceViewModel - get() = getViewModel(ImportRssSourceViewModel::class.java) + by viewModels() override fun onActivityCreated(savedInstanceState: Bundle?) { binding.rotateLoading.show() @@ -65,7 +66,7 @@ class ImportRssSourceActivity : } else -> { binding.rotateLoading.hide() - toast(R.string.wrong_format) + toastOnUi(R.string.wrong_format) finish() } } diff --git a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceDialog.kt b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceDialog.kt index 5ad9aeee7..6a7c9b844 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceDialog.kt @@ -9,23 +9,27 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar +import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.LinearLayoutManager -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.constant.AppPattern import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.data.entities.RssSource import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogRecyclerViewBinding import io.legado.app.databinding.ItemSourceImportBinding import io.legado.app.help.AppConfig import io.legado.app.lib.dialogs.alert -import io.legado.app.utils.* +import io.legado.app.ui.widget.dialog.WaitDialog +import io.legado.app.utils.dp +import io.legado.app.utils.putPrefBoolean +import io.legado.app.utils.splitNotBlank import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onClick +import io.legado.app.utils.visible /** * 导入rss源弹出窗口 @@ -33,9 +37,7 @@ import org.jetbrains.anko.sdk27.listeners.onClick class ImportRssSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { private val binding by viewBinding(DialogRecyclerViewBinding::bind) - - val viewModel: ImportRssSourceViewModel - get() = getViewModelOfActivity(ImportRssSourceViewModel::class.java) + val viewModel: ImportRssSourceViewModel by activityViewModels() lateinit var adapter: SourcesAdapter override fun onStart() { @@ -62,14 +64,45 @@ class ImportRssSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListe binding.recyclerView.adapter = adapter adapter.setItems(viewModel.allSources) binding.tvCancel.visible() - binding.tvCancel.onClick { - dismiss() + binding.tvCancel.setOnClickListener { + dismissAllowingStateLoss() } binding.tvOk.visible() - binding.tvOk.onClick { + binding.tvOk.setOnClickListener { + val waitDialog = WaitDialog(requireContext()) + waitDialog.show() viewModel.importSelect { - dismiss() + waitDialog.dismiss() + dismissAllowingStateLoss() + } + } + upSelectText() + binding.tvFooterLeft.visible() + binding.tvFooterLeft.setOnClickListener { + val selectAll = viewModel.isSelectAll() + viewModel.selectStatus.forEachIndexed { index, b -> + if (b != !selectAll) { + viewModel.selectStatus[index] = !selectAll + } } + adapter.notifyDataSetChanged() + upSelectText() + } + } + + private fun upSelectText() { + if (viewModel.isSelectAll()) { + binding.tvFooterLeft.text = getString( + R.string.select_cancel_count, + viewModel.selectCount(), + viewModel.allSources.size + ) + } else { + binding.tvFooterLeft.text = getString( + R.string.select_all_count, + viewModel.selectCount(), + viewModel.allSources.size + ) } } @@ -87,13 +120,15 @@ class ImportRssSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListe alert(R.string.diy_edit_source_group) { val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply { val groups = linkedSetOf() - App.db.rssSourceDao.allGroup.forEach { group -> + appDb.rssSourceDao.allGroup.forEach { group -> groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) } editView.setFilterValues(groups.toList()) editView.dropDownHeight = 180.dp } - customView = alertBinding.root + customView { + alertBinding.root + } okButton { alertBinding.editView.text?.toString()?.let { group -> viewModel.groupName = group @@ -103,22 +138,6 @@ class ImportRssSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListe noButton() }.show() } - R.id.menu_select_all -> { - viewModel.selectStatus.forEachIndexed { index, b -> - if (!b) { - viewModel.selectStatus[index] = true - } - } - adapter.notifyDataSetChanged() - } - R.id.menu_un_select_all -> { - viewModel.selectStatus.forEachIndexed { index, b -> - if (b) { - viewModel.selectStatus[index] = false - } - } - adapter.notifyDataSetChanged() - } R.id.menu_Keep_original_name -> { item.isChecked = !item.isChecked putPrefBoolean(PreferKey.importKeepName, item.isChecked) @@ -161,6 +180,7 @@ class ImportRssSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListe cbSourceName.setOnCheckedChangeListener { buttonView, isChecked -> if (buttonView.isPressed) { viewModel.selectStatus[holder.layoutPosition] = isChecked + upSelectText() } } } diff --git a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceViewModel.kt index 35aad7c27..06cf2da11 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceViewModel.kt @@ -5,9 +5,9 @@ import android.net.Uri import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.MutableLiveData import com.jayway.jsonpath.JsonPath -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.RssSource import io.legado.app.help.AppConfig import io.legado.app.help.SourceHelp @@ -26,6 +26,24 @@ class ImportRssSourceViewModel(app: Application) : BaseViewModel(app) { val checkSources = arrayListOf() val selectStatus = arrayListOf() + fun isSelectAll(): Boolean { + selectStatus.forEach { + if (!it) { + return false + } + } + return true + } + + fun selectCount(): Int { + var count = 0 + selectStatus.forEach { + if (it) { + count++ + } + } + return count + } fun importSelect(finally: () -> Unit) { execute { @@ -129,7 +147,7 @@ class ImportRssSourceViewModel(app: Application) : BaseViewModel(app) { private fun comparisonSource() { execute { allSources.forEach { - val has = App.db.rssSourceDao.getByKey(it.sourceUrl) + val has = appDb.rssSourceDao.getByKey(it.sourceUrl) checkSources.add(has) selectStatus.add(has == null) } diff --git a/app/src/main/java/io/legado/app/ui/audio/AudioPlayActivity.kt b/app/src/main/java/io/legado/app/ui/audio/AudioPlayActivity.kt index aa8a95a83..a210aeb99 100644 --- a/app/src/main/java/io/legado/app/ui/audio/AudioPlayActivity.kt +++ b/app/src/main/java/io/legado/app/ui/audio/AudioPlayActivity.kt @@ -9,6 +9,7 @@ import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.widget.SeekBar +import androidx.activity.viewModels import com.bumptech.glide.RequestBuilder import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.request.RequestOptions.bitmapTransform @@ -28,9 +29,7 @@ import io.legado.app.ui.book.toc.ChapterListActivity import io.legado.app.ui.widget.image.CoverImageView import io.legado.app.ui.widget.seekbar.SeekBarChangeListener import io.legado.app.utils.* -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.sdk27.listeners.onLongClick -import org.jetbrains.anko.startActivityForResult +import splitties.views.onLongClick import java.util.* /** @@ -41,7 +40,7 @@ class AudioPlayActivity : ChangeSourceDialog.CallBack { override val viewModel: AudioPlayViewModel - get() = getViewModel(AudioPlayViewModel::class.java) + by viewModels() private var requestCodeChapter = 8461 private var adjustProgress = false @@ -80,18 +79,17 @@ class AudioPlayActivity : } private fun initView() { - binding.fabPlayStop.onClick { + binding.fabPlayStop.setOnClickListener { playButton() } binding.fabPlayStop.onLongClick { - AudioPlay.stop(this) - true + AudioPlay.stop(this@AudioPlayActivity) } - binding.ivSkipNext.onClick { - AudioPlay.next(this) + binding.ivSkipNext.setOnClickListener { + AudioPlay.next(this@AudioPlayActivity) } - binding.ivSkipPrevious.onClick { - AudioPlay.prev(this) + binding.ivSkipPrevious.setOnClickListener { + AudioPlay.prev(this@AudioPlayActivity) } binding.playerProgress.setOnSeekBarChangeListener(object : SeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { @@ -107,26 +105,25 @@ class AudioPlayActivity : AudioPlay.adjustProgress(this@AudioPlayActivity, seekBar.progress) } }) - binding.ivChapter.onClick { + binding.ivChapter.setOnClickListener { AudioPlay.book?.let { - startActivityForResult( - requestCodeChapter, - Pair("bookUrl", it.bookUrl) - ) + startActivityForResult(requestCodeChapter) { + putExtra("bookUrl", it.bookUrl) + } } } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { binding.ivFastRewind.invisible() binding.ivFastForward.invisible() } - binding.ivFastForward.onClick { - AudioPlay.adjustSpeed(this, 0.1f) + binding.ivFastForward.setOnClickListener { + AudioPlay.adjustSpeed(this@AudioPlayActivity, 0.1f) } - binding.ivFastRewind.onClick { - AudioPlay.adjustSpeed(this, -0.1f) + binding.ivFastRewind.setOnClickListener { + AudioPlay.adjustSpeed(this@AudioPlayActivity, -0.1f) } - binding.ivTimer.onClick { - AudioPlay.addTimer(this) + binding.ivTimer.setOnClickListener { + AudioPlay.addTimer(this@AudioPlayActivity) } } @@ -166,7 +163,7 @@ class AudioPlayActivity : AudioPlay.book?.let { if (!AudioPlay.inBookshelf) { alert(title = getString(R.string.add_to_shelf)) { - message = getString(R.string.check_add_bookshelf, it.name) + setMessage(getString(R.string.check_add_bookshelf, it.name)) okButton { AudioPlay.inBookshelf = true setResult(Activity.RESULT_OK) diff --git a/app/src/main/java/io/legado/app/ui/audio/AudioPlayViewModel.kt b/app/src/main/java/io/legado/app/ui/audio/AudioPlayViewModel.kt index 184663f3d..c5cd330ef 100644 --- a/app/src/main/java/io/legado/app/ui/audio/AudioPlayViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/audio/AudioPlayViewModel.kt @@ -2,9 +2,9 @@ package io.legado.app.ui.audio import android.app.Application import android.content.Intent -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseViewModel +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.BookHelp @@ -21,18 +21,18 @@ class AudioPlayViewModel(application: Application) : BaseViewModel(application) stop(context) inBookshelf = intent.getBooleanExtra("inBookshelf", true) book = if (!bookUrl.isNullOrEmpty()) { - App.db.bookDao.getBook(bookUrl) + appDb.bookDao.getBook(bookUrl) } else { - App.db.bookDao.lastReadBook + appDb.bookDao.lastReadBook } book?.let { book -> titleData.postValue(book.name) coverData.postValue(book.getDisplayCover()) durChapterIndex = book.durChapterIndex durChapterPos = book.durChapterPos - durChapter = App.db.bookChapterDao.getChapter(book.bookUrl, durChapterIndex) + durChapter = appDb.bookChapterDao.getChapter(book.bookUrl, durChapterIndex) upDurChapter(book) - App.db.bookSourceDao.getBookSource(book.origin)?.let { + appDb.bookSourceDao.getBookSource(book.origin)?.let { webBook = WebBook(it) } if (durChapter == null) { @@ -69,16 +69,16 @@ class AudioPlayViewModel(application: Application) : BaseViewModel(application) ?.onSuccess(Dispatchers.IO) { cList -> if (cList.isNotEmpty()) { if (changeDruChapterIndex == null) { - App.db.bookChapterDao.insert(*cList.toTypedArray()) + appDb.bookChapterDao.insert(*cList.toTypedArray()) } else { changeDruChapterIndex(cList) } AudioPlay.upDurChapter(book) } else { - toast(R.string.error_load_toc) + toastOnUi(R.string.error_load_toc) } }?.onError { - toast(R.string.error_load_toc) + toastOnUi(R.string.error_load_toc) } } } @@ -89,11 +89,11 @@ class AudioPlayViewModel(application: Application) : BaseViewModel(application) AudioPlay.book?.let { oldTocSize = it.totalChapterNum book1.order = it.order - App.db.bookDao.delete(it) + appDb.bookDao.delete(it) } - App.db.bookDao.insert(book1) + appDb.bookDao.insert(book1) AudioPlay.book = book1 - App.db.bookSourceDao.getBookSource(book1.origin)?.let { + appDb.bookSourceDao.getBookSource(book1.origin)?.let { AudioPlay.webBook = WebBook(it) } if (book1.tocUrl.isEmpty()) { @@ -118,15 +118,15 @@ class AudioPlayViewModel(application: Application) : BaseViewModel(application) ) book.durChapterIndex = AudioPlay.durChapterIndex book.durChapterTitle = chapters[AudioPlay.durChapterIndex].title - App.db.bookDao.update(book) - App.db.bookChapterDao.insert(*chapters.toTypedArray()) + appDb.bookDao.update(book) + appDb.bookChapterDao.insert(*chapters.toTypedArray()) } } fun removeFromBookshelf(success: (() -> Unit)?) { execute { AudioPlay.book?.let { - App.db.bookDao.delete(it) + appDb.bookDao.delete(it) } }.onSuccess { success?.invoke() diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index 216fc076a..d75e13828 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -3,15 +3,16 @@ package io.legado.app.ui.book.arrange import android.os.Bundle import android.view.Menu import android.view.MenuItem +import androidx.activity.viewModels import androidx.appcompat.widget.PopupMenu import androidx.lifecycle.LiveData import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager -import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.AppConst import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookGroup import io.legado.app.databinding.ActivityArrangeBookBinding @@ -25,7 +26,6 @@ import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.cnCompare import io.legado.app.utils.getPrefInt -import io.legado.app.utils.getViewModel class ArrangeBookActivity : VMBaseActivity(), @@ -34,7 +34,7 @@ class ArrangeBookActivity : VMBaseActivity = arrayListOf() private val groupRequestCode = 22 private val addToGroupRequestCode = 34 @@ -102,7 +102,7 @@ class ArrangeBookActivity : VMBaseActivity App.db.bookDao.observeAll() - AppConst.bookGroupLocalId -> App.db.bookDao.observeLocal() - AppConst.bookGroupAudioId -> App.db.bookDao.observeAudio() - AppConst.bookGroupNoneId -> App.db.bookDao.observeNoGroup() - else -> App.db.bookDao.observeByGroup(groupId) + AppConst.bookGroupAllId -> appDb.bookDao.observeAll() + AppConst.bookGroupLocalId -> appDb.bookDao.observeLocal() + AppConst.bookGroupAudioId -> appDb.bookDao.observeAudio() + AppConst.bookGroupNoneId -> appDb.bookDao.observeNoGroup() + else -> appDb.bookDao.observeByGroup(groupId) } booksLiveData?.observe(this, { list -> val books = when (getPrefInt(PreferKey.bookshelfSort)) { @@ -140,7 +140,7 @@ class ArrangeBookActivity : VMBaseActivity if (item.groupId == R.id.menu_group) { binding.titleBar.subtitle = item.title - groupId = App.db.bookGroupDao.getByName(item.title.toString())?.groupId ?: 0 + groupId = appDb.bookGroupDao.getByName(item.title.toString())?.groupId ?: 0 initBookData() } } diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt index d2423de01..00474109f 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt @@ -13,8 +13,6 @@ import io.legado.app.databinding.ItemArrangeBookBinding import io.legado.app.lib.theme.backgroundColor import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback -import org.jetbrains.anko.backgroundColor -import org.jetbrains.anko.sdk27.listeners.onClick import java.util.* class ArrangeBookAdapter(context: Context, val callBack: CallBack) : @@ -40,7 +38,7 @@ class ArrangeBookAdapter(context: Context, val callBack: CallBack) : payloads: MutableList ) { binding.apply { - root.backgroundColor = context.backgroundColor + root.setBackgroundColor(context.backgroundColor) tvName.text = item.name tvAuthor.text = item.author tvAuthor.visibility = if (item.author.isEmpty()) View.GONE else View.VISIBLE @@ -65,7 +63,7 @@ class ArrangeBookAdapter(context: Context, val callBack: CallBack) : } } } - root.onClick { + root.setOnClickListener { getItem(holder.layoutPosition)?.let { checkbox.isChecked = !checkbox.isChecked if (checkbox.isChecked) { @@ -76,12 +74,12 @@ class ArrangeBookAdapter(context: Context, val callBack: CallBack) : callBack.upSelectCount() } } - tvDelete.onClick { + tvDelete.setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.deleteBook(it) } } - tvGroup.onClick { + tvGroup.setOnClickListener { getItem(holder.layoutPosition)?.let { actionItem = it callBack.selectGroup(groupRequestCode, it.group) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt index 890fcf8bb..c6d389997 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt @@ -1,8 +1,8 @@ package io.legado.app.ui.book.arrange import android.app.Application -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.Book @@ -13,19 +13,19 @@ class ArrangeBookViewModel(application: Application) : BaseViewModel(application books.forEach { it.canUpdate = canUpdate } - App.db.bookDao.update(*books) + appDb.bookDao.update(*books) } } fun updateBook(vararg book: Book) { execute { - App.db.bookDao.update(*book) + appDb.bookDao.update(*book) } } fun deleteBook(vararg book: Book) { execute { - App.db.bookDao.delete(*book) + appDb.bookDao.delete(*book) } } diff --git a/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt b/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt index 1e417a1a0..121f4f114 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt @@ -5,20 +5,25 @@ import android.content.Intent import android.os.Bundle import android.view.Menu import android.view.MenuItem +import androidx.activity.viewModels import androidx.lifecycle.LiveData import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.snackbar.Snackbar -import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.AppConst import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey +import io.legado.app.constant.charsets +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookGroup import io.legado.app.databinding.ActivityCacheBookBinding +import io.legado.app.databinding.DialogEditTextBinding +import io.legado.app.help.AppConfig import io.legado.app.help.BookHelp +import io.legado.app.lib.dialogs.alert import io.legado.app.service.help.CacheBook import io.legado.app.ui.filepicker.FilePicker import io.legado.app.ui.filepicker.FilePickerDialog @@ -45,8 +50,7 @@ class CacheActivity : VMBaseActivity() private val groupList: ArrayList = arrayListOf() private var groupId: Long = -1 - override val viewModel: CacheViewModel - get() = getViewModel(CacheViewModel::class.java) + override val viewModel: CacheViewModel by viewModels() override fun getViewBinding(): ActivityCacheBookBinding { return ActivityCacheBookBinding.inflate(layoutInflater) @@ -71,6 +75,12 @@ class CacheActivity : VMBaseActivity() return super.onPrepareOptionsMenu(menu) } + override fun onMenuOpened(featureId: Int, menu: Menu): Boolean { + menu.findItem(R.id.menu_enable_replace)?.isChecked = AppConfig.exportUseReplace + menu.findItem(R.id.menu_export_web_dav)?.isChecked = AppConfig.exportToWebDav + return super.onMenuOpened(featureId, menu) + } + private fun upMenu() { menu?.findItem(R.id.menu_book_group)?.subMenu?.let { subMenu -> subMenu.removeGroup(R.id.menu_group) @@ -96,12 +106,15 @@ class CacheActivity : VMBaseActivity() CacheBook.stop(this@CacheActivity) } } - R.id.menu_log -> { + R.id.menu_enable_replace -> AppConfig.exportUseReplace = !item.isChecked + R.id.menu_export_web_dav -> AppConfig.exportToWebDav = !item.isChecked + R.id.menu_export_folder -> export(-1) + R.id.menu_export_charset -> showCharsetConfig() + R.id.menu_log -> TextListDialog.show(supportFragmentManager, getString(R.string.log), CacheBook.logs) - } else -> if (item.groupId == R.id.menu_group) { binding.titleBar.subtitle = item.title - groupId = App.db.bookGroupDao.getByName(item.title.toString())?.groupId ?: 0 + groupId = appDb.bookGroupDao.getByName(item.title.toString())?.groupId ?: 0 initBookData() } } @@ -117,11 +130,11 @@ class CacheActivity : VMBaseActivity() private fun initBookData() { booksLiveData?.removeObservers(this) booksLiveData = when (groupId) { - AppConst.bookGroupAllId -> App.db.bookDao.observeAll() - AppConst.bookGroupLocalId -> App.db.bookDao.observeLocal() - AppConst.bookGroupAudioId -> App.db.bookDao.observeAudio() - AppConst.bookGroupNoneId -> App.db.bookDao.observeNoGroup() - else -> App.db.bookDao.observeByGroup(groupId) + AppConst.bookGroupAllId -> appDb.bookDao.observeAll() + AppConst.bookGroupLocalId -> appDb.bookDao.observeLocal() + AppConst.bookGroupAudioId -> appDb.bookDao.observeAudio() + AppConst.bookGroupNoneId -> appDb.bookDao.observeNoGroup() + else -> appDb.bookDao.observeByGroup(groupId) } booksLiveData?.observe(this, { list -> val booksDownload = list.filter { @@ -142,7 +155,7 @@ class CacheActivity : VMBaseActivity() private fun initGroupData() { groupLiveData?.removeObservers(this) - groupLiveData = App.db.bookGroupDao.liveDataAll() + groupLiveData = appDb.bookGroupDao.liveDataAll() groupLiveData?.observe(this, { groupList.clear() groupList.addAll(it) @@ -156,7 +169,7 @@ class CacheActivity : VMBaseActivity() books.forEach { book -> val chapterCaches = hashSetOf() val cacheNames = BookHelp.getChapterFiles(book) - App.db.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter -> + appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter -> if (cacheNames.contains(chapter.getFileName())) { chapterCaches.add(chapter.url) } @@ -188,6 +201,15 @@ class CacheActivity : VMBaseActivity() override fun export(position: Int) { exportPosition = position + val path = ACache.get(this@CacheActivity).getAsString(exportBookPathKey) + if (path.isNullOrEmpty() || position < 0) { + selectExportFolder() + } else { + startExport(path) + } + } + + private fun selectExportFolder() { val default = arrayListOf() val path = ACache.get(this@CacheActivity).getAsString(exportBookPathKey) if (!path.isNullOrEmpty()) { @@ -208,6 +230,20 @@ class CacheActivity : VMBaseActivity() } } + private fun showCharsetConfig() { + alert(R.string.set_charset) { + val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply { + editView.setFilterValues(charsets) + editView.setText(AppConfig.exportCharset) + } + customView { alertBinding.root } + okButton { + AppConfig.exportCharset = alertBinding.editView.text?.toString() ?: "UTF-8" + } + cancelButton() + }.show() + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { diff --git a/app/src/main/java/io/legado/app/ui/book/cache/CacheAdapter.kt b/app/src/main/java/io/legado/app/ui/book/cache/CacheAdapter.kt index c7e3209b8..96d20d3df 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/CacheAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/cache/CacheAdapter.kt @@ -10,7 +10,7 @@ import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.databinding.ItemDownloadBinding import io.legado.app.service.help.CacheBook -import org.jetbrains.anko.sdk27.listeners.onClick + import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.CopyOnWriteArraySet @@ -54,7 +54,7 @@ class CacheAdapter(context: Context, private val callBack: CallBack) : override fun registerListener(holder: ItemViewHolder, binding: ItemDownloadBinding) { with(binding) { - ivDownload.onClick { + ivDownload.setOnClickListener { getItem(holder.layoutPosition)?.let { if (downloadMap?.containsKey(it.bookUrl) == true) { CacheBook.remove(context, it.bookUrl) @@ -63,7 +63,7 @@ class CacheAdapter(context: Context, private val callBack: CallBack) : } } } - tvExport.onClick { + tvExport.setOnClickListener { callBack.export(holder.layoutPosition) } } diff --git a/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt b/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt index 2df117411..d420372c6 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt @@ -3,17 +3,18 @@ package io.legado.app.ui.book.cache import android.app.Application import android.net.Uri import androidx.documentfile.provider.DocumentFile -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppPattern -import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.data.entities.Book +import io.legado.app.help.AppConfig import io.legado.app.help.BookHelp import io.legado.app.help.ContentProcessor import io.legado.app.help.storage.BookWebDav import io.legado.app.utils.* import java.io.File +import java.nio.charset.Charset class CacheViewModel(application: Application) : BaseViewModel(application) { @@ -36,20 +37,24 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { } } + @Suppress("BlockingMethodInNonBlockingContext") private suspend fun export(doc: DocumentFile, book: Book) { val filename = "${book.name} by ${book.author}.txt" - val content = getAllContents(book) - DocumentUtils.createFileIfNotExist(doc, filename) - ?.writeText(context, content) - if (App.INSTANCE.getPrefBoolean(PreferKey.webDavCacheBackup, false)) { - FileUtils.createFileIfNotExist( - File(FileUtils.getCachePath()), - filename - ).writeText(content) // 写出文件到cache目录 - // 导出到webdav - BookWebDav.exportWebDav(FileUtils.getCachePath(), filename) - // 上传完删除cache文件 - FileUtils.deleteFile("${FileUtils.getCachePath()}${File.separator}${filename}") + DocumentUtils.delete(doc, filename) + DocumentUtils.createFileIfNotExist(doc, filename)?.let { bookDoc -> + val stringBuilder = StringBuilder() + context.contentResolver.openOutputStream(bookDoc.uri, "wa")?.use { bookOs -> + getAllContents(book) { + bookOs.write(it.toByteArray(Charset.forName(AppConfig.exportCharset))) + stringBuilder.append(it) + } + } + if (AppConfig.exportToWebDav) { + // 导出到webdav + val byteArray = + stringBuilder.toString().toByteArray(Charset.forName(AppConfig.exportCharset)) + BookWebDav.exportWebDav(byteArray, filename) + } } getSrcList(book).forEach { val vFile = BookHelp.getImage(book, it.third) @@ -65,10 +70,17 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { private suspend fun export(file: File, book: Book) { val filename = "${book.name} by ${book.author}.txt" - FileUtils.createFileIfNotExist(file, filename) - .writeText(getAllContents(book)) - if (App.INSTANCE.getPrefBoolean(PreferKey.webDavCacheBackup, false)) { - BookWebDav.exportWebDav(file.absolutePath, filename) // 导出到webdav + val bookPath = FileUtils.getPath(file, filename) + val bookFile = FileUtils.createFileWithReplace(bookPath) + val stringBuilder = StringBuilder() + getAllContents(book) { + bookFile.appendText(it, Charset.forName(AppConfig.exportCharset)) + stringBuilder.append(it) + } + if (AppConfig.exportToWebDav) { + val byteArray = + stringBuilder.toString().toByteArray(Charset.forName(AppConfig.exportCharset)) + BookWebDav.exportWebDav(byteArray, filename) // 导出到webdav } getSrcList(book).forEach { val vFile = BookHelp.getImage(book, it.third) @@ -84,27 +96,23 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { } } - private suspend fun getAllContents(book: Book): String { + private suspend fun getAllContents(book: Book, append: (text: String) -> Unit) { + val useReplace = AppConfig.exportUseReplace val contentProcessor = ContentProcessor(book.name, book.origin) - val stringBuilder = StringBuilder() - stringBuilder.append(book.name) - .append("\n") - .append(context.getString(R.string.author_show, book.author)) - App.db.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter -> + append("${book.name}\n${context.getString(R.string.author_show, book.author)}") + appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter -> BookHelp.getContent(book, chapter).let { content -> val content1 = contentProcessor - .getContent(book, chapter.title, content ?: "null", false) + .getContent(book, chapter.title, content ?: "null", false, useReplace) .joinToString("\n") - stringBuilder.append("\n\n") - .append(content1) + append.invoke("\n\n$content1") } } - return stringBuilder.toString() } private fun getSrcList(book: Book): ArrayList> { val srcList = arrayListOf>() - App.db.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter -> + appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter -> BookHelp.getContent(book, chapter)?.let { content -> content.split("\n").forEachIndexed { index, text -> val matcher = AppPattern.imgPattern.matcher(text) diff --git a/app/src/main/java/io/legado/app/ui/book/changecover/ChangeCoverDialog.kt b/app/src/main/java/io/legado/app/ui/book/changecover/ChangeCoverDialog.kt index 483fbbb75..5558da7fc 100644 --- a/app/src/main/java/io/legado/app/ui/book/changecover/ChangeCoverDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/changecover/ChangeCoverDialog.kt @@ -7,6 +7,7 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar import androidx.fragment.app.FragmentManager +import androidx.fragment.app.viewModels import androidx.recyclerview.widget.GridLayoutManager import io.legado.app.R import io.legado.app.base.BaseDialogFragment @@ -14,7 +15,7 @@ import io.legado.app.databinding.DialogChangeCoverBinding import io.legado.app.lib.theme.primaryColor import io.legado.app.utils.applyTint import io.legado.app.utils.getSize -import io.legado.app.utils.getViewModel + import io.legado.app.utils.viewbindingdelegate.viewBinding @@ -39,7 +40,7 @@ class ChangeCoverDialog : BaseDialogFragment(), private val binding by viewBinding(DialogChangeCoverBinding::bind) private var callBack: CallBack? = null - private lateinit var viewModel: ChangeCoverViewModel + private val viewModel: ChangeCoverViewModel by viewModels() lateinit var adapter: CoverAdapter override fun onStart() { @@ -54,7 +55,6 @@ class ChangeCoverDialog : BaseDialogFragment(), savedInstanceState: Bundle? ): View? { callBack = activity as? CallBack - viewModel = getViewModel(ChangeCoverViewModel::class.java) return inflater.inflate(R.layout.dialog_change_cover, container) } @@ -107,7 +107,7 @@ class ChangeCoverDialog : BaseDialogFragment(), override fun changeTo(coverUrl: String) { callBack?.coverChangeTo(coverUrl) - dismiss() + dismissAllowingStateLoss() } interface CallBack { diff --git a/app/src/main/java/io/legado/app/ui/book/changecover/ChangeCoverViewModel.kt b/app/src/main/java/io/legado/app/ui/book/changecover/ChangeCoverViewModel.kt index 2bfcffdaa..13488567b 100644 --- a/app/src/main/java/io/legado/app/ui/book/changecover/ChangeCoverViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/changecover/ChangeCoverViewModel.kt @@ -5,9 +5,9 @@ import android.os.Bundle import android.os.Handler import android.os.Looper import androidx.lifecycle.MutableLiveData -import io.legado.app.App import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppPattern +import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.SearchBook import io.legado.app.help.AppConfig @@ -55,7 +55,7 @@ class ChangeCoverViewModel(application: Application) : BaseViewModel(application fun loadDbSearchBook() { execute { - App.db.searchBookDao.getEnableHasCover(name, author).let { + appDb.searchBookDao.getEnableHasCover(name, author).let { searchBooks.addAll(it) searchBooksLiveData.postValue(searchBooks.toList()) if (it.size <= 1) { @@ -81,7 +81,7 @@ class ChangeCoverViewModel(application: Application) : BaseViewModel(application private fun startSearch() { execute { bookSourceList.clear() - bookSourceList.addAll(App.db.bookSourceDao.allEnabled) + bookSourceList.addAll(appDb.bookSourceDao.allEnabled) searchStateData.postValue(true) initSearchPool() for (i in 0 until threadCount) { @@ -90,45 +90,53 @@ class ChangeCoverViewModel(application: Application) : BaseViewModel(application } } + @Synchronized private fun search() { - synchronized(this) { - if (searchIndex >= bookSourceList.lastIndex) { - return - } - searchIndex++ - val source = bookSourceList[searchIndex] - val task = WebBook(source) - .searchBook(this, name, context = searchPool!!) - .timeout(60000L) - .onSuccess(Dispatchers.IO) { - if (it.isNotEmpty()) { - val searchBook = it[0] - if (searchBook.name == name && searchBook.author == author - && !searchBook.coverUrl.isNullOrEmpty() - ) { - App.db.searchBookDao.insert(searchBook) - if (!searchBooks.contains(searchBook)) { - searchBooks.add(searchBook) - upAdapter() - } - } - } - } - .onFinally { - synchronized(this) { - if (searchIndex < bookSourceList.lastIndex) { - search() - } else { - searchIndex++ - } - if (searchIndex >= bookSourceList.lastIndex + min(bookSourceList.size, - threadCount) - ) { - searchStateData.postValue(false) + if (searchIndex >= bookSourceList.lastIndex) { + return + } + searchIndex++ + val source = bookSourceList[searchIndex] + if (source.getSearchRule().coverUrl.isNullOrBlank()) { + searchNext() + return + } + val task = WebBook(source) + .searchBook(this, name, context = searchPool!!) + .timeout(60000L) + .onSuccess(Dispatchers.IO) { + if (it.isNotEmpty()) { + val searchBook = it[0] + if (searchBook.name == name && searchBook.author == author + && !searchBook.coverUrl.isNullOrEmpty() + ) { + appDb.searchBookDao.insert(searchBook) + if (!searchBooks.contains(searchBook)) { + searchBooks.add(searchBook) + upAdapter() } } } - tasks.add(task) + } + .onFinally { + searchNext() + } + tasks.add(task) + } + + @Synchronized + private fun searchNext() { + if (searchIndex < bookSourceList.lastIndex) { + search() + } else { + searchIndex++ + } + if (searchIndex >= bookSourceList.lastIndex + min( + bookSourceList.size, + threadCount + ) + ) { + searchStateData.postValue(false) } } diff --git a/app/src/main/java/io/legado/app/ui/book/changecover/CoverAdapter.kt b/app/src/main/java/io/legado/app/ui/book/changecover/CoverAdapter.kt index 2d181d28c..0f75ed99f 100644 --- a/app/src/main/java/io/legado/app/ui/book/changecover/CoverAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/changecover/CoverAdapter.kt @@ -7,7 +7,7 @@ import io.legado.app.base.adapter.DiffRecyclerAdapter import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.data.entities.SearchBook import io.legado.app.databinding.ItemCoverBinding -import org.jetbrains.anko.sdk27.listeners.onClick + class CoverAdapter(context: Context, val callBack: CallBack) : DiffRecyclerAdapter(context) { @@ -41,7 +41,7 @@ class CoverAdapter(context: Context, val callBack: CallBack) : override fun registerListener(holder: ItemViewHolder, binding: ItemCoverBinding) { holder.itemView.apply { - onClick { + setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.changeTo(it.coverUrl ?: "") } diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceAdapter.kt index 2db9cb239..70196a543 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceAdapter.kt @@ -13,8 +13,7 @@ import io.legado.app.data.entities.SearchBook import io.legado.app.databinding.ItemChangeSourceBinding import io.legado.app.utils.invisible import io.legado.app.utils.visible -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.sdk27.listeners.onLongClick +import splitties.views.onLongClick class ChangeSourceAdapter(context: Context, val callBack: CallBack) : @@ -65,14 +64,13 @@ class ChangeSourceAdapter(context: Context, val callBack: CallBack) : } override fun registerListener(holder: ItemViewHolder, binding: ItemChangeSourceBinding) { - holder.itemView.onClick { + holder.itemView.setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.changeTo(it) } } holder.itemView.onLongClick { showMenu(holder.itemView, getItem(holder.layoutPosition)) - true } } diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt index fe26451fb..e6be2e4be 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt @@ -5,13 +5,14 @@ import android.view.* import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.Toolbar import androidx.fragment.app.FragmentManager +import androidx.fragment.app.viewModels import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.constant.AppPattern import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.SearchBook import io.legado.app.databinding.DialogChangeSourceBinding @@ -45,7 +46,7 @@ class ChangeSourceDialog : BaseDialogFragment(), private val binding by viewBinding(DialogChangeSourceBinding::bind) private val groups = linkedSetOf() private var callBack: CallBack? = null - private lateinit var viewModel: ChangeSourceViewModel + private val viewModel: ChangeSourceViewModel by viewModels() lateinit var adapter: ChangeSourceAdapter override fun onStart() { @@ -60,7 +61,6 @@ class ChangeSourceDialog : BaseDialogFragment(), savedInstanceState: Bundle? ): View? { callBack = activity as? CallBack - viewModel = getViewModel(ChangeSourceViewModel::class.java) return inflater.inflate(R.layout.dialog_change_source, container) } @@ -146,7 +146,7 @@ class ChangeSourceDialog : BaseDialogFragment(), viewModel.searchBooksLiveData.observe(viewLifecycleOwner, { adapter.setItems(it) }) - App.db.bookSourceDao.liveGroupEnabled().observe(this, { + appDb.bookSourceDao.liveGroupEnabled().observe(this, { groups.clear() it.map { group -> groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) @@ -190,7 +190,7 @@ class ChangeSourceDialog : BaseDialogFragment(), val book = searchBook.toBook() book.upInfoFromOld(callBack?.oldBook) callBack?.changeTo(book) - dismiss() + dismissAllowingStateLoss() } override val bookUrl: String? diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt index 0c738d93e..ae3114e04 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt @@ -5,11 +5,10 @@ import android.os.Bundle import android.os.Handler import android.os.Looper import androidx.lifecycle.MutableLiveData -import io.legado.app.App -import io.legado.app.R import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppPattern import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.SearchBook @@ -21,7 +20,7 @@ import io.legado.app.utils.getPrefString import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.ExecutorCoroutineDispatcher import kotlinx.coroutines.asCoroutineDispatcher -import org.jetbrains.anko.debug +import splitties.init.appCtx import java.util.concurrent.CopyOnWriteArraySet import java.util.concurrent.Executors @@ -39,7 +38,7 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio private val searchBooks = CopyOnWriteArraySet() private var postTime = 0L private val sendRunnable = Runnable { upAdapter() } - private val searchGroup get() = App.INSTANCE.getPrefString("searchGroup") ?: "" + private val searchGroup get() = appCtx.getPrefString("searchGroup") ?: "" @Volatile private var searchIndex = -1 @@ -64,7 +63,7 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio execute { searchBooks.clear() upAdapter() - App.db.searchBookDao.getChangeSourceSearch(name, author, searchGroup).let { + appDb.searchBookDao.getChangeSourceSearch(name, author, searchGroup).let { searchBooks.addAll(it) searchBooksLiveData.postValue(searchBooks.toList()) if (it.size <= 1) { @@ -89,7 +88,7 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio private fun searchFinish(searchBook: SearchBook) { if (searchBooks.contains(searchBook)) return - App.db.searchBookDao.insert(searchBook) + appDb.searchBookDao.insert(searchBook) if (screenKey.isEmpty()) { searchBooks.add(searchBook) } else if (searchBook.name.contains(screenKey)) { @@ -100,14 +99,14 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio private fun startSearch() { execute { - App.db.searchBookDao.clear(name, author) + appDb.searchBookDao.clear(name, author) searchBooks.clear() upAdapter() bookSourceList.clear() if (searchGroup.isBlank()) { - bookSourceList.addAll(App.db.bookSourceDao.allEnabled) + bookSourceList.addAll(appDb.bookSourceDao.allEnabled) } else { - bookSourceList.addAll(App.db.bookSourceDao.getEnabledByGroup(searchGroup)) + bookSourceList.addAll(appDb.bookSourceDao.getEnabledByGroup(searchGroup)) } searchStateData.postValue(true) initSearchPool() @@ -173,7 +172,7 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio searchFinish(searchBook) } }.onError { - debug { context.getString(R.string.error_get_book_info) } + it.printStackTrace() } } @@ -186,7 +185,7 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio searchFinish(searchBook) } }.onError { - debug { context.getString(R.string.error_get_chapter_list) } + it.printStackTrace() } } @@ -200,7 +199,7 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio loadDbSearchBook() } else { val items = - App.db.searchBookDao.getChangeSourceSearch(name, author, screenKey, searchGroup) + appDb.searchBookDao.getChangeSourceSearch(name, author, screenKey, searchGroup) searchBooks.clear() searchBooks.addAll(items) upAdapter() @@ -225,9 +224,9 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio fun disableSource(searchBook: SearchBook) { execute { - App.db.bookSourceDao.getBookSource(searchBook.origin)?.let { source -> + appDb.bookSourceDao.getBookSource(searchBook.origin)?.let { source -> source.enabled = false - App.db.bookSourceDao.update(source) + appDb.bookSourceDao.update(source) } searchBooks.remove(searchBook) upAdapter() diff --git a/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowActivity.kt b/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowActivity.kt index 136717903..95f1a12bc 100644 --- a/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowActivity.kt @@ -1,6 +1,7 @@ package io.legado.app.ui.book.explore import android.os.Bundle +import androidx.activity.viewModels import androidx.recyclerview.widget.RecyclerView import io.legado.app.R import io.legado.app.base.VMBaseActivity @@ -11,13 +12,12 @@ import io.legado.app.databinding.ViewLoadMoreBinding import io.legado.app.ui.book.info.BookInfoActivity import io.legado.app.ui.widget.recycler.LoadMoreView import io.legado.app.ui.widget.recycler.VerticalDivider -import io.legado.app.utils.getViewModel -import org.jetbrains.anko.startActivity +import io.legado.app.utils.startActivity class ExploreShowActivity : VMBaseActivity(), ExploreShowAdapter.CallBack { override val viewModel: ExploreShowViewModel - get() = getViewModel(ExploreShowViewModel::class.java) + by viewModels() private lateinit var adapter: ExploreShowAdapter private lateinit var loadMoreView: LoadMoreView @@ -87,9 +87,9 @@ class ExploreShowActivity : VMBaseActivity( - Pair("name", book.name), - Pair("author", book.author) - ) + startActivity { + putExtra("name", book.name) + putExtra("author", book.author) + } } } diff --git a/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowAdapter.kt b/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowAdapter.kt index 77b15300a..9c0e521b7 100644 --- a/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowAdapter.kt @@ -10,7 +10,7 @@ import io.legado.app.data.entities.SearchBook import io.legado.app.databinding.ItemSearchBinding import io.legado.app.utils.gone import io.legado.app.utils.visible -import org.jetbrains.anko.sdk27.listeners.onClick + class ExploreShowAdapter(context: Context, val callBack: CallBack) : RecyclerAdapter(context) { @@ -51,7 +51,7 @@ class ExploreShowAdapter(context: Context, val callBack: CallBack) : } override fun registerListener(holder: ItemViewHolder, binding: ItemSearchBinding) { - holder.itemView.onClick { + holder.itemView.setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.showBookInfo(it.toBook()) } diff --git a/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowViewModel.kt b/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowViewModel.kt index 502fdefa5..9fedbd613 100644 --- a/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowViewModel.kt @@ -3,8 +3,8 @@ package io.legado.app.ui.book.explore import android.app.Application import android.content.Intent import androidx.lifecycle.MutableLiveData -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.SearchBook import io.legado.app.model.webBook.WebBook @@ -24,7 +24,7 @@ class ExploreShowViewModel(application: Application) : BaseViewModel(application val sourceUrl = intent.getStringExtra("sourceUrl") exploreUrl = intent.getStringExtra("exploreUrl") if (bookSource == null && sourceUrl != null) { - bookSource = App.db.bookSourceDao.getBookSource(sourceUrl) + bookSource = appDb.bookSourceDao.getBookSource(sourceUrl) } explore() } @@ -38,7 +38,7 @@ class ExploreShowViewModel(application: Application) : BaseViewModel(application .timeout(30000L) .onSuccess(IO) { searchBooks -> booksData.postValue(searchBooks) - App.db.searchBookDao.insert(*searchBooks.toTypedArray()) + appDb.searchBookDao.insert(*searchBooks.toTypedArray()) page++ }.onError { it.printStackTrace() diff --git a/app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt b/app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt index 4eda999ce..6a6498459 100644 --- a/app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt @@ -8,31 +8,34 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar -import androidx.core.view.isGone +import androidx.fragment.app.viewModels import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.data.appDb import io.legado.app.data.entities.BookGroup import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogRecyclerViewBinding -import io.legado.app.databinding.ItemGroupManageBinding +import io.legado.app.databinding.ItemBookGroupManageBinding import io.legado.app.lib.dialogs.alert import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.backgroundColor import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.ui.widget.recycler.VerticalDivider -import io.legado.app.utils.* +import io.legado.app.utils.applyTint +import io.legado.app.utils.getSize +import io.legado.app.utils.requestInputMethod import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onClick +import io.legado.app.utils.visible + class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { - private lateinit var viewModel: GroupViewModel + private val viewModel: GroupViewModel by viewModels() private lateinit var adapter: GroupAdapter private val binding by viewBinding(DialogRecyclerViewBinding::bind) @@ -47,7 +50,6 @@ class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener container: ViewGroup?, savedInstanceState: Bundle? ): View? { - viewModel = getViewModel(GroupViewModel::class.java) return inflater.inflate(R.layout.dialog_recycler_view, container) } @@ -69,11 +71,13 @@ class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener ItemTouchHelper(itemTouchCallback).attachToRecyclerView(binding.recyclerView) binding.tvOk.setTextColor(requireContext().accentColor) binding.tvOk.visible() - binding.tvOk.onClick { dismiss() } + binding.tvOk.setOnClickListener { + dismissAllowingStateLoss() + } } private fun initData() { - App.db.bookGroupDao.liveDataAll().observe(viewLifecycleOwner, { + appDb.bookGroupDao.liveDataAll().observe(viewLifecycleOwner, { adapter.setItems(it) }) } @@ -97,7 +101,7 @@ class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply { editView.setHint(R.string.group_name) } - customView = alertBinding.root + customView { alertBinding.root } yesButton { alertBinding.editView.text?.toString()?.let { if (it.isNotBlank()) { @@ -116,7 +120,12 @@ class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener editView.setHint(R.string.group_name) editView.setText(bookGroup.groupName) } - customView = alertBinding.root + if (bookGroup.groupId >= 0) { + neutralButton(R.string.delete) { + deleteGroup(bookGroup) + } + } + customView { alertBinding.root } yesButton { alertBinding.editView.text?.toString()?.let { viewModel.upGroup(bookGroup.copy(groupName = it)) @@ -136,18 +145,18 @@ class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener } private inner class GroupAdapter(context: Context) : - RecyclerAdapter(context), + RecyclerAdapter(context), ItemTouchCallback.Callback { private var isMoved = false - override fun getViewBinding(parent: ViewGroup): ItemGroupManageBinding { - return ItemGroupManageBinding.inflate(inflater, parent, false) + override fun getViewBinding(parent: ViewGroup): ItemBookGroupManageBinding { + return ItemBookGroupManageBinding.inflate(inflater, parent, false) } override fun convert( holder: ItemViewHolder, - binding: ItemGroupManageBinding, + binding: ItemBookGroupManageBinding, item: BookGroup, payloads: MutableList ) { @@ -155,15 +164,12 @@ class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener root.setBackgroundColor(context.backgroundColor) tvGroup.text = item.getManageName(context) swShow.isChecked = item.show - tvDel.isGone = item.groupId < 0 - swShow.isGone = item.groupId >= 0 } } - override fun registerListener(holder: ItemViewHolder, binding: ItemGroupManageBinding) { + override fun registerListener(holder: ItemViewHolder, binding: ItemBookGroupManageBinding) { with(binding) { - tvEdit.onClick { getItem(holder.layoutPosition)?.let { editGroup(it) } } - tvDel.onClick { getItem(holder.layoutPosition)?.let { deleteGroup(it) } } + tvEdit.setOnClickListener { getItem(holder.layoutPosition)?.let { editGroup(it) } } swShow.setOnCheckedChangeListener { buttonView, isChecked -> if (buttonView.isPressed) { getItem(holder.layoutPosition)?.let { diff --git a/app/src/main/java/io/legado/app/ui/book/group/GroupSelectDialog.kt b/app/src/main/java/io/legado/app/ui/book/group/GroupSelectDialog.kt index 0aaac8ce4..91ed1ab74 100644 --- a/app/src/main/java/io/legado/app/ui/book/group/GroupSelectDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/group/GroupSelectDialog.kt @@ -9,14 +9,15 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar import androidx.fragment.app.FragmentManager +import androidx.fragment.app.viewModels import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.data.appDb import io.legado.app.data.entities.BookGroup import io.legado.app.databinding.DialogBookGroupPickerBinding import io.legado.app.databinding.DialogEditTextBinding @@ -29,10 +30,9 @@ import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.applyTint import io.legado.app.utils.getSize -import io.legado.app.utils.getViewModel import io.legado.app.utils.requestInputMethod import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onClick + class GroupSelectDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { @@ -52,7 +52,7 @@ class GroupSelectDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener private val binding by viewBinding(DialogBookGroupPickerBinding::bind) private var requestCode: Int = -1 - private lateinit var viewModel: GroupViewModel + private val viewModel: GroupViewModel by viewModels() private lateinit var adapter: GroupAdapter private var callBack: CallBack? = null private var groupId: Long = 0 @@ -68,7 +68,6 @@ class GroupSelectDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener container: ViewGroup?, savedInstanceState: Bundle? ): View? { - viewModel = getViewModel(GroupViewModel::class.java) return inflater.inflate(R.layout.dialog_book_group_picker, container) } @@ -95,16 +94,18 @@ class GroupSelectDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener val itemTouchCallback = ItemTouchCallback(adapter) itemTouchCallback.isCanDrag = true ItemTouchHelper(itemTouchCallback).attachToRecyclerView(binding.recyclerView) - binding.tvCancel.onClick { dismiss() } + binding.tvCancel.setOnClickListener { + dismissAllowingStateLoss() + } binding.tvOk.setTextColor(requireContext().accentColor) - binding.tvOk.onClick { + binding.tvOk.setOnClickListener { callBack?.upGroup(requestCode, groupId) - dismiss() + dismissAllowingStateLoss() } } private fun initData() { - App.db.bookGroupDao.liveDataSelect().observe(viewLifecycleOwner, { + appDb.bookGroupDao.liveDataSelect().observe(viewLifecycleOwner, { adapter.setItems(it) }) } @@ -122,7 +123,7 @@ class GroupSelectDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply { editView.setHint(R.string.group_name) } - customView = alertBinding.root + customView { alertBinding.root } yesButton { alertBinding.editView.text?.toString()?.let { if (it.isNotBlank()) { @@ -141,7 +142,7 @@ class GroupSelectDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener editView.setHint(R.string.group_name) editView.setText(bookGroup.groupName) } - customView = alertBinding.root + customView { alertBinding.root } yesButton { alertBinding.editView.text?.toString()?.let { viewModel.upGroup(bookGroup.copy(groupName = it)) @@ -187,7 +188,7 @@ class GroupSelectDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener } } } - tvEdit.onClick { getItem(holder.layoutPosition)?.let { editGroup(it) } } + tvEdit.setOnClickListener { getItem(holder.layoutPosition)?.let { editGroup(it) } } } } diff --git a/app/src/main/java/io/legado/app/ui/book/group/GroupViewModel.kt b/app/src/main/java/io/legado/app/ui/book/group/GroupViewModel.kt index 80fbac639..3b78e45f8 100644 --- a/app/src/main/java/io/legado/app/ui/book/group/GroupViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/group/GroupViewModel.kt @@ -1,8 +1,8 @@ package io.legado.app.ui.book.group import android.app.Application -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.BookGroup class GroupViewModel(application: Application) : BaseViewModel(application) { @@ -10,34 +10,34 @@ class GroupViewModel(application: Application) : BaseViewModel(application) { fun addGroup(groupName: String) { execute { var id = 1L - val idsSum = App.db.bookGroupDao.idsSum + val idsSum = appDb.bookGroupDao.idsSum while (id and idsSum != 0L) { id = id.shl(1) } val bookGroup = BookGroup( groupId = id, groupName = groupName, - order = App.db.bookGroupDao.maxOrder.plus(1) + order = appDb.bookGroupDao.maxOrder.plus(1) ) - App.db.bookGroupDao.insert(bookGroup) + appDb.bookGroupDao.insert(bookGroup) } } fun upGroup(vararg bookGroup: BookGroup) { execute { - App.db.bookGroupDao.update(*bookGroup) + appDb.bookGroupDao.update(*bookGroup) } } fun delGroup(vararg bookGroup: BookGroup) { execute { - App.db.bookGroupDao.delete(*bookGroup) + appDb.bookGroupDao.delete(*bookGroup) bookGroup.forEach { group -> - val books = App.db.bookDao.getBooksByGroup(group.groupId) + val books = appDb.bookDao.getBooksByGroup(group.groupId) books.forEach { it.group = it.group - group.groupId } - App.db.bookDao.update(*books.toTypedArray()) + appDb.bookDao.update(*books.toTypedArray()) } } } diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 3314f8aa9..c1ec7109d 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -9,6 +9,7 @@ import android.view.Menu import android.view.MenuItem import android.widget.CheckBox import android.widget.LinearLayout +import androidx.activity.viewModels import com.bumptech.glide.RequestBuilder import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.request.RequestOptions.bitmapTransform @@ -37,10 +38,6 @@ import io.legado.app.ui.book.source.edit.BookSourceEditActivity import io.legado.app.ui.book.toc.ChapterListActivity import io.legado.app.ui.widget.image.CoverImageView import io.legado.app.utils.* -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.startActivity -import org.jetbrains.anko.startActivityForResult -import org.jetbrains.anko.toast class BookInfoActivity : @@ -54,8 +51,7 @@ class BookInfoActivity : private val requestCodeInfoEdit = 562 private val requestCodeRead = 432 - override val viewModel: BookInfoViewModel - get() = getViewModel(BookInfoViewModel::class.java) + override val viewModel: BookInfoViewModel by viewModels() override fun getViewBinding(): ActivityBookInfoBinding { return ActivityBookInfoBinding.inflate(layoutInflater) @@ -87,19 +83,20 @@ class BookInfoActivity : if (viewModel.inBookshelf) { viewModel.bookData.value?.let { startActivityForResult( - requestCodeInfoEdit, - Pair("bookUrl", it.bookUrl) - ) + requestCodeInfoEdit + ) { + putExtra("bookUrl", it.bookUrl) + } } } else { - toast(R.string.after_add_bookshelf) + toastOnUi(R.string.after_add_bookshelf) } } R.id.menu_share_it -> { viewModel.bookData.value?.let { val bookJson = GSON.toJson(it) val shareStr = "${it.bookUrl}#$bookJson" - shareWithQr(it.name, shareStr) + shareWithQr(shareStr, it.name) } } R.id.menu_refresh -> { @@ -113,7 +110,7 @@ class BookInfoActivity : } R.id.menu_copy_url -> viewModel.bookData.value?.bookUrl?.let { sendToClip(it) - } ?: toast(R.string.no_book) + } ?: toastOnUi(R.string.no_book) R.id.menu_can_update -> { if (viewModel.inBookshelf) { viewModel.bookData.value?.let { @@ -121,7 +118,7 @@ class BookInfoActivity : viewModel.saveBook() } } else { - toast(R.string.after_add_bookshelf) + toastOnUi(R.string.after_add_bookshelf) } } R.id.menu_clear_cache -> viewModel.clearCache() @@ -207,17 +204,17 @@ class BookInfoActivity : } private fun initOnClick() = with(binding) { - ivCover.onClick { + ivCover.setOnClickListener { viewModel.bookData.value?.let { ChangeCoverDialog.show(supportFragmentManager, it.name, it.author) } } - tvRead.onClick { + tvRead.setOnClickListener { viewModel.bookData.value?.let { readBook(it) } } - tvShelf.onClick { + tvShelf.setOnClickListener { if (viewModel.inBookshelf) { deleteBook() } else { @@ -226,17 +223,19 @@ class BookInfoActivity : } } } - tvOrigin.onClick { + tvOrigin.setOnClickListener { viewModel.bookData.value?.let { - startActivity(Pair("data", it.origin)) + startActivity { + putExtra("data", it.origin) + } } } - tvChangeSource.onClick { + tvChangeSource.setOnClickListener { viewModel.bookData.value?.let { ChangeSourceDialog.show(supportFragmentManager, it.name, it.author) } } - tvTocView.onClick { + tvTocView.setOnClickListener { if (!viewModel.inBookshelf) { viewModel.saveBook { viewModel.saveChapterList { @@ -247,16 +246,20 @@ class BookInfoActivity : openChapterList() } } - tvChangeGroup.onClick { + tvChangeGroup.setOnClickListener { viewModel.bookData.value?.let { GroupSelectDialog.show(supportFragmentManager, it.group) } } - tvAuthor.onClick { - startActivity(Pair("key", viewModel.bookData.value?.author)) + tvAuthor.setOnClickListener { + startActivity { + putExtra("key", viewModel.bookData.value?.author) + } } - tvName.onClick { - startActivity(Pair("key", viewModel.bookData.value?.name)) + tvName.setOnClickListener { + startActivity { + putExtra("key", viewModel.bookData.value?.name) + } } } @@ -275,7 +278,7 @@ class BookInfoActivity : setPadding(16.dp, 0, 16.dp, 0) addView(checkBox) } - customView = view + customView { view } positiveButton(R.string.yes) { viewModel.delBook(checkBox.isChecked) { finish() @@ -293,14 +296,15 @@ class BookInfoActivity : private fun openChapterList() { if (viewModel.chapterListData.value.isNullOrEmpty()) { - toast(R.string.chapter_list_empty) + toastOnUi(R.string.chapter_list_empty) return } viewModel.bookData.value?.let { startActivityForResult( - requestCodeChapterList, - Pair("bookUrl", it.bookUrl) - ) + requestCodeChapterList + ) { + putExtra("bookUrl", it.bookUrl) + } } } @@ -321,16 +325,18 @@ class BookInfoActivity : private fun startReadActivity(book: Book) { when (book.type) { BookType.audio -> startActivityForResult( - requestCodeRead, - Pair("bookUrl", book.bookUrl), - Pair("inBookshelf", viewModel.inBookshelf) - ) + requestCodeRead + ) { + putExtra("bookUrl", book.bookUrl) + putExtra("inBookshelf", viewModel.inBookshelf) + } else -> startActivityForResult( - requestCodeRead, - Pair("bookUrl", book.bookUrl), - Pair("inBookshelf", viewModel.inBookshelf), - Pair("key", IntentDataHelp.putData(book)) - ) + requestCodeRead + ) { + putExtra("bookUrl", book.bookUrl) + putExtra("inBookshelf", viewModel.inBookshelf) + putExtra("key", IntentDataHelp.putData(book)) + } } } diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index 21f2dd157..8348dca02 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -3,9 +3,9 @@ package io.legado.app.ui.book.info import android.app.Application import android.content.Intent import androidx.lifecycle.MutableLiveData -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseViewModel +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.BookHelp @@ -24,10 +24,10 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { execute { val name = intent.getStringExtra("name") ?: "" val author = intent.getStringExtra("author") ?: "" - App.db.bookDao.getBook(name, author)?.let { book -> + appDb.bookDao.getBook(name, author)?.let { book -> inBookshelf = true setBook(book) - } ?: App.db.searchBookDao.getFirstByNameAuthor(name, author)?.toBook()?.let { book -> + } ?: appDb.searchBookDao.getFirstByNameAuthor(name, author)?.toBook()?.let { book -> setBook(book) } } @@ -39,7 +39,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { if (book.tocUrl.isEmpty()) { loadBookInfo(book) } else { - val chapterList = App.db.bookChapterDao.getChapterList(book.bookUrl) + val chapterList = appDb.bookChapterDao.getChapterList(book.bookUrl) if (chapterList.isNotEmpty()) { chapterListData.postValue(chapterList) } else { @@ -56,20 +56,20 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { if (book.isLocalBook()) { loadChapter(book, changeDruChapterIndex) } else { - App.db.bookSourceDao.getBookSource(book.origin)?.let { bookSource -> + appDb.bookSourceDao.getBookSource(book.origin)?.let { bookSource -> WebBook(bookSource).getBookInfo(this, book, canReName = canReName) .onSuccess(IO) { bookData.postValue(book) if (inBookshelf) { - App.db.bookDao.update(book) + appDb.bookDao.update(book) } loadChapter(it, changeDruChapterIndex) }.onError { - toast(R.string.error_get_book_info) + toastOnUi(R.string.error_get_book_info) } } ?: let { chapterListData.postValue(null) - toast(R.string.error_no_source) + toastOnUi(R.string.error_no_source) } } } @@ -82,18 +82,18 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { execute { if (book.isLocalBook()) { LocalBook.getChapterList(book).let { - App.db.bookDao.update(book) - App.db.bookChapterDao.insert(*it.toTypedArray()) + appDb.bookDao.update(book) + appDb.bookChapterDao.insert(*it.toTypedArray()) chapterListData.postValue(it) } } else { - App.db.bookSourceDao.getBookSource(book.origin)?.let { bookSource -> + appDb.bookSourceDao.getBookSource(book.origin)?.let { bookSource -> WebBook(bookSource).getChapterList(this, book) .onSuccess(IO) { if (it.isNotEmpty()) { if (inBookshelf) { - App.db.bookDao.update(book) - App.db.bookChapterDao.insert(*it.toTypedArray()) + appDb.bookDao.update(book) + appDb.bookChapterDao.insert(*it.toTypedArray()) } if (changeDruChapterIndex == null) { chapterListData.postValue(it) @@ -101,25 +101,25 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { changeDruChapterIndex(it) } } else { - toast(R.string.chapter_list_empty) + toastOnUi(R.string.chapter_list_empty) } }.onError { chapterListData.postValue(null) - toast(R.string.error_get_chapter_list) + toastOnUi(R.string.error_get_chapter_list) } } ?: let { chapterListData.postValue(null) - toast(R.string.error_no_source) + toastOnUi(R.string.error_no_source) } } }.onError { - toast("LoadTocError:${it.localizedMessage}") + toastOnUi("LoadTocError:${it.localizedMessage}") } } fun loadGroup(groupId: Long, success: ((groupNames: String?) -> Unit)) { execute { - App.db.bookGroupDao.getGroupNames(groupId).joinToString(",") + appDb.bookGroupDao.getGroupNames(groupId).joinToString(",") }.onSuccess { success.invoke(it) } @@ -161,8 +161,8 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { ) book.durChapterTitle = chapters[book.durChapterIndex].title if (inBookshelf) { - App.db.bookDao.update(book) - App.db.bookChapterDao.insert(*chapters.toTypedArray()) + appDb.bookDao.update(book) + appDb.bookChapterDao.insert(*chapters.toTypedArray()) } bookData.postValue(book) chapterListData.postValue(chapters) @@ -173,13 +173,13 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { execute { bookData.value?.let { book -> if (book.order == 0) { - book.order = App.db.bookDao.maxOrder + 1 + book.order = appDb.bookDao.maxOrder + 1 } - App.db.bookDao.getBook(book.name, book.author)?.let { + appDb.bookDao.getBook(book.name, book.author)?.let { book.durChapterPos = it.durChapterPos book.durChapterTitle = it.durChapterTitle } - App.db.bookDao.insert(book) + appDb.bookDao.insert(book) if (ReadBook.book?.name == book.name && ReadBook.book?.author == book.author) { ReadBook.book = book } @@ -192,7 +192,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { fun saveChapterList(success: (() -> Unit)?) { execute { chapterListData.value?.let { - App.db.bookChapterDao.insert(*it.toTypedArray()) + appDb.bookChapterDao.insert(*it.toTypedArray()) } }.onSuccess { success?.invoke() @@ -203,16 +203,16 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { execute { bookData.value?.let { book -> if (book.order == 0) { - book.order = App.db.bookDao.maxOrder + 1 + book.order = appDb.bookDao.maxOrder + 1 } - App.db.bookDao.getBook(book.name, book.author)?.let { + appDb.bookDao.getBook(book.name, book.author)?.let { book.durChapterPos = it.durChapterPos book.durChapterTitle = it.durChapterTitle } - App.db.bookDao.insert(book) + appDb.bookDao.insert(book) } chapterListData.value?.let { - App.db.bookChapterDao.insert(*it.toTypedArray()) + appDb.bookChapterDao.insert(*it.toTypedArray()) } inBookshelf = true }.onSuccess { @@ -238,15 +238,15 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { execute { BookHelp.clearCache(bookData.value!!) }.onSuccess { - toast(R.string.clear_cache_success) + toastOnUi(R.string.clear_cache_success) }.onError { - toast(it.stackTraceToString()) + toastOnUi(it.stackTraceToString()) } } fun upEditBook() { bookData.value?.let { - App.db.bookDao.getBook(it.bookUrl)?.let { book -> + appDb.bookDao.getBook(it.bookUrl)?.let { book -> bookData.postValue(book) } } diff --git a/app/src/main/java/io/legado/app/ui/book/info/ChapterListAdapter.kt b/app/src/main/java/io/legado/app/ui/book/info/ChapterListAdapter.kt index dab2525ec..dde20e3e8 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/ChapterListAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/ChapterListAdapter.kt @@ -8,8 +8,8 @@ import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.data.entities.BookChapter import io.legado.app.databinding.ItemChapterListBinding import io.legado.app.lib.theme.accentColor -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.textColorResource +import io.legado.app.utils.getCompatColor + class ChapterListAdapter(context: Context, var callBack: CallBack) : RecyclerAdapter(context) { @@ -29,7 +29,7 @@ class ChapterListAdapter(context: Context, var callBack: CallBack) : if (item.index == callBack.durChapterIndex()) { tvChapterName.setTextColor(context.accentColor) } else { - tvChapterName.textColorResource = R.color.secondaryText + tvChapterName.setTextColor(context.getCompatColor(R.color.secondaryText)) } } @@ -37,7 +37,7 @@ class ChapterListAdapter(context: Context, var callBack: CallBack) : override fun registerListener(holder: ItemViewHolder, binding: ItemChapterListBinding) { holder.itemView.apply { - this.onClick { + this.setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.openChapter(it) } diff --git a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt index f5e4e9f38..4d16ba6bd 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt @@ -6,6 +6,7 @@ import android.net.Uri import android.os.Bundle import android.view.Menu import android.view.MenuItem +import androidx.activity.viewModels import androidx.documentfile.provider.DocumentFile import io.legado.app.R import io.legado.app.base.VMBaseActivity @@ -15,8 +16,6 @@ import io.legado.app.help.permission.Permissions import io.legado.app.help.permission.PermissionsCompat import io.legado.app.ui.book.changecover.ChangeCoverDialog import io.legado.app.utils.* -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.toast import java.io.File class BookInfoEditActivity : @@ -26,7 +25,7 @@ class BookInfoEditActivity : private val resultSelectCover = 132 override val viewModel: BookInfoEditViewModel - get() = getViewModel(BookInfoEditViewModel::class.java) + by viewModels() override fun getViewBinding(): ActivityBookInfoEditBinding { return ActivityBookInfoEditBinding.inflate(layoutInflater) @@ -55,15 +54,15 @@ class BookInfoEditActivity : } private fun initEvent() = with(binding) { - tvChangeCover.onClick { + tvChangeCover.setOnClickListener { viewModel.bookData.value?.let { ChangeCoverDialog.show(supportFragmentManager, it.name, it.author) } } - tvSelectCover.onClick { + tvSelectCover.setOnClickListener { selectImage() } - tvRefreshCover.onClick { + tvRefreshCover.setOnClickListener { viewModel.book?.customCoverUrl = tieCoverUrl.text?.toString() upCover() } @@ -121,7 +120,7 @@ class BookInfoEditActivity : }.getOrNull()?.let { byteArray -> file.writeBytes(byteArray) coverChangeTo(file.absolutePath) - } ?: toast("获取文件出错") + } ?: toastOnUi("获取文件出错") } } else { PermissionsCompat.Builder(this) diff --git a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditViewModel.kt index 357360763..1265d9b4d 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditViewModel.kt @@ -2,8 +2,8 @@ package io.legado.app.ui.book.info.edit import android.app.Application import androidx.lifecycle.MutableLiveData -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.service.help.ReadBook @@ -13,7 +13,7 @@ class BookInfoEditViewModel(application: Application) : BaseViewModel(applicatio fun loadBook(bookUrl: String) { execute { - book = App.db.bookDao.getBook(bookUrl) + book = appDb.bookDao.getBook(bookUrl) book?.let { bookData.postValue(it) } @@ -25,7 +25,7 @@ class BookInfoEditViewModel(application: Application) : BaseViewModel(applicatio if (ReadBook.book?.bookUrl == book.bookUrl) { ReadBook.book = book } - App.db.bookDao.update(book) + appDb.bookDao.update(book) }.onSuccess { success?.invoke() } diff --git a/app/src/main/java/io/legado/app/ui/book/local/ImportBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/local/ImportBookActivity.kt index f87a0817e..776d980c5 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/ImportBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/ImportBookActivity.kt @@ -8,13 +8,14 @@ import android.os.Bundle import android.provider.DocumentsContract import android.view.Menu import android.view.MenuItem +import androidx.activity.viewModels import androidx.appcompat.widget.PopupMenu import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.LiveData import androidx.recyclerview.widget.LinearLayoutManager -import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseActivity +import io.legado.app.data.appDb import io.legado.app.databinding.ActivityImportBookBinding import io.legado.app.help.AppConfig import io.legado.app.help.permission.Permissions @@ -28,8 +29,6 @@ import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.toast import java.io.File import java.util.* @@ -50,7 +49,7 @@ class ImportBookActivity : VMBaseActivity when (item.itemId) { R.id.menu_enable_replace -> item.isChecked = book.getUseReplaceRule() R.id.menu_re_segment -> item.isChecked = book.getReSegment() + R.id.menu_reverse_content -> item.isVisible = onLine } } } @@ -235,13 +241,29 @@ class ReadBookActivity : ReadBookBaseActivity(), binding.readView.upPageAnim() } R.id.menu_book_info -> ReadBook.book?.let { - startActivity(Pair("name", it.name), Pair("author", it.author)) + startActivity { + putExtra("name", it.name) + putExtra("author", it.author) + } } R.id.menu_toc_regex -> TocRegexDialog.show( supportFragmentManager, ReadBook.book?.tocUrl ) + R.id.menu_reverse_content -> ReadBook.book?.let { + viewModel.reverseContent(it) + } R.id.menu_set_charset -> showCharsetConfig() + R.id.menu_image_style -> { + val imgStyles = + arrayListOf(Book.imgStyleDefault, Book.imgStyleFull, Book.imgStyleText) + selector( + R.string.image_style, + imgStyles + ) { _, index -> + ReadBook.book?.setImageStyle(imgStyles[index]) + } + } R.id.menu_get_progress -> ReadBook.book?.let { viewModel.syncBookProgress(it) { progress -> sureSyncProgress(progress) @@ -347,7 +369,7 @@ class ReadBookActivity : ReadBookBaseActivity(), ) { if (BaseReadAloudService.isPlay()) { ReadAloud.pause(this) - toast(R.string.read_aloud_pause) + toastOnUi(R.string.read_aloud_pause) return true } if (isAutoPage) { @@ -453,7 +475,7 @@ class ReadBookActivity : ReadBookBaseActivity(), R.id.menu_bookmark -> binding.readView.curPage.let { val bookmark = it.createBookmark() if (bookmark == null) { - toast(R.string.create_bookmark_error) + toastOnUi(R.string.create_bookmark_error) } else { showBookMark(bookmark) } @@ -566,6 +588,7 @@ class ReadBookActivity : ReadBookBaseActivity(), launch { binding.readMenu.setSeekPage(ReadBook.durPageIndex()) } + mHandler.postDelayed(backupRunnable, 600000) } /** @@ -658,9 +681,10 @@ class ReadBookActivity : ReadBookBaseActivity(), override fun openSourceEditActivity() { ReadBook.webBook?.let { startActivityForResult( - requestCodeEditSource, - Pair("data", it.bookSource.bookSourceUrl) - ) + requestCodeEditSource + ) { + putExtra("data", it.bookSource.bookSourceUrl) + } } } @@ -677,9 +701,10 @@ class ReadBookActivity : ReadBookBaseActivity(), override fun openChapterList() { ReadBook.book?.let { startActivityForResult( - requestCodeChapterList, - Pair("bookUrl", it.bookUrl) - ) + requestCodeChapterList + ) { + putExtra("bookUrl", it.bookUrl) + } } } @@ -689,10 +714,11 @@ class ReadBookActivity : ReadBookBaseActivity(), override fun openSearchActivity(searchWord: String?) { ReadBook.book?.let { startActivityForResult( - requestCodeSearchResult, - Pair("bookUrl", it.bookUrl), - Pair("searchWord", searchWord ?: viewModel.searchContentQuery) - ) + requestCodeSearchResult + ) { + putExtra("bookUrl", it.bookUrl) + putExtra("searchWord", searchWord ?: viewModel.searchContentQuery) + } } } @@ -720,10 +746,11 @@ class ReadBookActivity : ReadBookBaseActivity(), override fun showLogin() { ReadBook.webBook?.bookSource?.let { - startActivity( - Pair("sourceUrl", it.bookSourceUrl), - Pair("loginUrl", it.loginUrl) - ) + startActivity { + putExtra("sourceUrl", it.bookSourceUrl) + putExtra("loginUrl", it.loginUrl) + putExtra("userAgent", it.getHeaderMap()[AppConst.UA_NAME]) + } } } @@ -775,7 +802,7 @@ class ReadBookActivity : ReadBookBaseActivity(), private fun sureSyncProgress(progress: BookProgress) { alert(R.string.get_book_progress) { - message = getString(R.string.current_progress_exceeds_cloud) + setMessage(R.string.current_progress_exceeds_cloud) okButton { ReadBook.setProgress(progress) } @@ -846,7 +873,7 @@ class ReadBookActivity : ReadBookBaseActivity(), ReadBook.book?.let { if (!ReadBook.inBookshelf) { alert(title = getString(R.string.add_to_shelf)) { - message = getString(R.string.check_add_bookshelf, it.name) + setMessage(getString(R.string.check_add_bookshelf, it.name)) okButton { ReadBook.inBookshelf = true setResult(Activity.RESULT_OK) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookBaseActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookBaseActivity.kt index 6a305f928..8dde10425 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookBaseActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookBaseActivity.kt @@ -6,11 +6,13 @@ import android.graphics.Color import android.os.Build import android.os.Bundle import android.view.* +import androidx.activity.viewModels import androidx.core.view.isVisible -import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.PreferKey +import io.legado.app.constant.charsets +import io.legado.app.data.appDb import io.legado.app.data.entities.Bookmark import io.legado.app.databinding.ActivityBookReadBinding import io.legado.app.databinding.DialogBookmarkBinding @@ -31,7 +33,6 @@ import io.legado.app.ui.book.read.config.BgTextConfigDialog import io.legado.app.ui.book.read.config.ClickActionConfigDialog import io.legado.app.ui.book.read.config.PaddingConfigDialog import io.legado.app.utils.getPrefString -import io.legado.app.utils.getViewModel import io.legado.app.utils.requestInputMethod /** @@ -41,7 +42,7 @@ abstract class ReadBookBaseActivity : VMBaseActivity() { override val viewModel: ReadBookViewModel - get() = getViewModel(ReadBookViewModel::class.java) + by viewModels() var bottomDialog = 0 override fun getViewBinding(): ActivityBookReadBinding { @@ -186,7 +187,7 @@ abstract class ReadBookBaseActivity : editStart.setText((book.durChapterIndex + 1).toString()) editEnd.setText(book.totalChapterNum.toString()) } - customView = alertBinding.root + customView { alertBinding.root } yesButton { alertBinding.run { val start = editStart.text?.toString()?.toInt() ?: 0 @@ -202,18 +203,18 @@ abstract class ReadBookBaseActivity : @SuppressLint("InflateParams") fun showBookMark(bookmark: Bookmark) { alert(title = getString(R.string.bookmark_add)) { - message = bookmark.chapterName + setMessage(bookmark.chapterName) val alertBinding = DialogBookmarkBinding.inflate(layoutInflater).apply { editBookText.setText(bookmark.bookText) editView.setText(bookmark.content) } - customView = alertBinding.root + customView { alertBinding.root } yesButton { alertBinding.apply { Coroutine.async { bookmark.bookText = editBookText.text.toString() bookmark.content = editView.text.toString() - App.db.bookmarkDao.insert(bookmark) + appDb.bookmarkDao.insert(bookmark) } } } @@ -221,16 +222,13 @@ abstract class ReadBookBaseActivity : }.show().requestInputMethod() } - @SuppressLint("InflateParams") fun showCharsetConfig() { - val charsets = - arrayListOf("UTF-8", "GB2312", "GBK", "Unicode", "UTF-16", "UTF-16LE", "ASCII") alert(R.string.set_charset) { val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply { editView.setFilterValues(charsets) editView.setText(ReadBook.book?.charset) } - customView = alertBinding.root + customView { alertBinding.root } okButton { alertBinding.editView.text?.toString()?.let { ReadBook.setCharset(it) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index d73f96658..5b6281320 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -2,9 +2,9 @@ package io.legado.app.ui.book.read import android.app.Application import android.content.Intent -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookProgress @@ -33,10 +33,10 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { IntentDataHelp.getData(intent.getStringExtra("key"))?.let { initBook(it) } ?: intent.getStringExtra("bookUrl")?.let { - App.db.bookDao.getBook(it)?.let { book -> + appDb.bookDao.getBook(it)?.let { book -> initBook(book) } - } ?: App.db.bookDao.lastReadBook?.let { + } ?: appDb.bookDao.lastReadBook?.let { initBook(it) } }.onFinally { @@ -54,7 +54,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { autoChangeSource(book.name, book.author) return } - ReadBook.chapterSize = App.db.bookChapterDao.getChapterCount(book.bookUrl) + ReadBook.chapterSize = appDb.bookChapterDao.getChapterCount(book.bookUrl) if (ReadBook.chapterSize == 0) { if (book.tocUrl.isEmpty()) { loadBookInfo(book) @@ -84,7 +84,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { autoChangeSource(book.name, book.author) return } - ReadBook.chapterSize = App.db.bookChapterDao.getChapterCount(book.bookUrl) + ReadBook.chapterSize = appDb.bookChapterDao.getChapterCount(book.bookUrl) if (ReadBook.chapterSize == 0) { if (book.tocUrl.isEmpty()) { loadBookInfo(book) @@ -125,9 +125,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { if (book.isLocalBook()) { execute { LocalBook.getChapterList(book).let { - App.db.bookChapterDao.delByBook(book.bookUrl) - App.db.bookChapterDao.insert(*it.toTypedArray()) - App.db.bookDao.update(book) + appDb.bookChapterDao.delByBook(book.bookUrl) + appDb.bookChapterDao.insert(*it.toTypedArray()) + appDb.bookDao.update(book) ReadBook.chapterSize = it.size if (it.isEmpty()) { ReadBook.upMsg(context.getString(R.string.error_load_toc)) @@ -144,8 +144,8 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { ?.onSuccess(IO) { cList -> if (cList.isNotEmpty()) { if (changeDruChapterIndex == null) { - App.db.bookChapterDao.insert(*cList.toTypedArray()) - App.db.bookDao.update(book) + appDb.bookChapterDao.insert(*cList.toTypedArray()) + appDb.bookDao.update(book) ReadBook.chapterSize = cList.size ReadBook.upMsg(null) ReadBook.loadContent(resetPageOffset = true) @@ -191,7 +191,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { it.changeTo(newBook) } ReadBook.book = newBook - App.db.bookSourceDao.getBookSource(newBook.origin)?.let { + appDb.bookSourceDao.getBookSource(newBook.origin)?.let { ReadBook.webBook = WebBook(it) } ReadBook.prevTextChapter = null @@ -215,7 +215,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { private fun autoChangeSource(name: String, author: String) { if (!AppConfig.autoChangeSource) return execute { - val sources = App.db.bookSourceDao.allTextEnabled + val sources = appDb.bookSourceDao.allTextEnabled val book = PreciseSearch.searchFirstBook(this, sources, name, author) if (book != null) { book.upInfoFromOld(ReadBook.book) @@ -226,7 +226,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { }.onStart { ReadBook.upMsg(context.getString(R.string.source_auto_changing)) }.onError { - toast(it.msg) + toastOnUi(it.msg) }.onFinally { ReadBook.upMsg(null) } @@ -242,8 +242,8 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { ) book.durChapterIndex = ReadBook.durChapterIndex book.durChapterTitle = chapters[ReadBook.durChapterIndex].title - App.db.bookDao.update(book) - App.db.bookChapterDao.insert(*chapters.toTypedArray()) + appDb.bookDao.update(book) + appDb.bookChapterDao.insert(*chapters.toTypedArray()) ReadBook.chapterSize = chapters.size ReadBook.upMsg(null) ReadBook.loadContent(resetPageOffset = true) @@ -276,7 +276,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { fun upBookSource(success: (() -> Unit)?) { execute { ReadBook.book?.let { book -> - App.db.bookSourceDao.getBookSource(book.origin)?.let { + appDb.bookSourceDao.getBookSource(book.origin)?.let { ReadBook.webBook = WebBook(it) } } @@ -287,7 +287,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { fun refreshContent(book: Book) { execute { - App.db.bookChapterDao.getChapter(book.bookUrl, ReadBook.durChapterIndex) + appDb.bookChapterDao.getChapter(book.bookUrl, ReadBook.durChapterIndex) ?.let { chapter -> BookHelp.delContent(book, chapter) ReadBook.loadContent(ReadBook.durChapterIndex, resetPageOffset = false) @@ -295,6 +295,16 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } } + fun reverseContent(book: Book) { + execute { + appDb.bookChapterDao.getChapter(book.bookUrl, ReadBook.durChapterIndex) + ?.let { chapter -> + BookHelp.reverseContent(book, chapter) + ReadBook.loadContent(ReadBook.durChapterIndex, resetPageOffset = false) + } + } + } + /** * 替换规则变化 */ diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt index 63fa5c0f1..60a90b56e 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt @@ -11,18 +11,17 @@ import android.widget.FrameLayout import android.widget.SeekBar import androidx.core.view.isGone import androidx.core.view.isVisible -import io.legado.app.App import io.legado.app.R import io.legado.app.constant.PreferKey import io.legado.app.databinding.ViewReadMenuBinding import io.legado.app.help.AppConfig import io.legado.app.help.LocalConfig +import io.legado.app.help.ThemeConfig import io.legado.app.lib.theme.* import io.legado.app.service.help.ReadBook import io.legado.app.ui.widget.seekbar.SeekBarChangeListener import io.legado.app.utils.* -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.sdk27.listeners.onLongClick +import splitties.views.onLongClick /** * 阅读界面菜单 @@ -83,8 +82,8 @@ class ReadMenu @JvmOverloads constructor( tvFont.setTextColor(textColor) ivSetting.setColorFilter(textColor) tvSetting.setTextColor(textColor) - vwBg.onClick { } - vwNavigationBar.onClick { } + vwBg.setOnClickListener { } + vwNavigationBar.setOnClickListener { } seekBrightness.progress = context.getPrefInt("brightness", 100) } @@ -135,16 +134,16 @@ class ReadMenu @JvmOverloads constructor( } private fun bindEvent() = with(binding) { - tvChapterName.onClick { + tvChapterName.setOnClickListener { callBack.openSourceEditActivity() } - tvChapterUrl.onClick { + tvChapterUrl.setOnClickListener { context.openUrl(binding.tvChapterUrl.text.toString()) } - tvLogin.onClick { + tvLogin.setOnClickListener { callBack.showLogin() } - ivBrightnessAuto.onClick { + ivBrightnessAuto.setOnClickListener { context.putPrefBoolean("brightnessAuto", !brightnessAuto()) upBrightnessState() } @@ -171,60 +170,59 @@ class ReadMenu @JvmOverloads constructor( }) //搜索 - fabSearch.onClick { + fabSearch.setOnClickListener { runMenuOut { callBack.openSearchActivity(null) } } //自动翻页 - fabAutoPage.onClick { + fabAutoPage.setOnClickListener { runMenuOut { callBack.autoPage() } } //替换 - fabReplaceRule.onClick { callBack.openReplaceRule() } + fabReplaceRule.setOnClickListener { callBack.openReplaceRule() } //夜间模式 - fabNightTheme.onClick { + fabNightTheme.setOnClickListener { AppConfig.isNightTheme = !AppConfig.isNightTheme - App.INSTANCE.applyDayNight() + ThemeConfig.applyDayNight(context) } //上一章 - tvPre.onClick { ReadBook.moveToPrevChapter(upContent = true, toLast = false) } + tvPre.setOnClickListener { ReadBook.moveToPrevChapter(upContent = true, toLast = false) } //下一章 - tvNext.onClick { ReadBook.moveToNextChapter(true) } + tvNext.setOnClickListener { ReadBook.moveToNextChapter(true) } //目录 - llCatalog.onClick { + llCatalog.setOnClickListener { runMenuOut { callBack.openChapterList() } } //朗读 - llReadAloud.onClick { + llReadAloud.setOnClickListener { runMenuOut { callBack.onClickReadAloud() } } llReadAloud.onLongClick { runMenuOut { callBack.showReadAloudDialog() } - true } //界面 - llFont.onClick { + llFont.setOnClickListener { runMenuOut { callBack.showReadStyle() } } //设置 - llSetting.onClick { + llSetting.setOnClickListener { runMenuOut { callBack.showMoreSetting() } @@ -242,7 +240,7 @@ class ReadMenu @JvmOverloads constructor( } override fun onAnimationEnd(animation: Animation) { - binding.vwMenuBg.onClick { runMenuOut() } + binding.vwMenuBg.setOnClickListener { runMenuOut() } binding.vwNavigationBar.layoutParams = binding.vwNavigationBar.layoutParams.apply { height = activity!!.navigationBarHeight } diff --git a/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt index 4a75e05c0..29373ae37 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/TextActionMenu.kt @@ -24,13 +24,7 @@ import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.databinding.ItemTextBinding import io.legado.app.databinding.PopupActionMenuBinding import io.legado.app.service.BaseReadAloudService -import io.legado.app.utils.gone -import io.legado.app.utils.isAbsUrl -import io.legado.app.utils.sendToClip -import io.legado.app.utils.visible -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.share -import org.jetbrains.anko.toast +import io.legado.app.utils.* import java.util.* @SuppressLint("RestrictedApi") @@ -73,7 +67,7 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac if (moreMenu.size() > 0) { ivMenuMore.visible() } - ivMenuMore.onClick { + ivMenuMore.setOnClickListener { if (recyclerView.isVisible) { ivMenuMore.setImageResource(R.drawable.ic_arrow_back) adapter.setItems(moreMenu.visibleItems) @@ -107,7 +101,7 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac } override fun registerListener(holder: ItemViewHolder, binding: ItemTextBinding) { - holder.itemView.onClick { + holder.itemView.setOnClickListener { getItem(holder.layoutPosition)?.let { if (!callBack.onMenuItemSelected(it.itemId)) { onMenuItemSelected(it) @@ -124,7 +118,7 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac R.id.menu_share_str -> context.share(callBack.selectedText) R.id.menu_aloud -> { if (BaseReadAloudService.isRun) { - context.toast(R.string.alouding_disable) + context.toastOnUi(R.string.alouding_disable) return } readAloud(callBack.selectedText) @@ -143,7 +137,7 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac context.startActivity(intent) }.onFailure { it.printStackTrace() - context.toast(it.localizedMessage ?: "ERROR") + context.toastOnUi(it.localizedMessage ?: "ERROR") } } else -> item.intent?.let { @@ -219,7 +213,7 @@ class TextActionMenu(private val context: Context, private val callBack: CallBac ).intent = createProcessTextIntentForResolveInfo(resolveInfo) } }.onFailure { - context.toast("获取文字操作菜单出错:${it.localizedMessage}") + context.toastOnUi("获取文字操作菜单出错:${it.localizedMessage}") } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/AutoReadDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/AutoReadDialog.kt index 67656c57e..d4a0d9506 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/AutoReadDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/AutoReadDialog.kt @@ -16,7 +16,7 @@ import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.widget.seekbar.SeekBarChangeListener import io.legado.app.utils.ColorUtils import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onClick + class AutoReadDialog : BaseDialogFragment() { var callBack: CallBack? = null @@ -94,14 +94,17 @@ class AutoReadDialog : BaseDialogFragment() { } private fun initEvent() { - binding.llMainMenu.onClick { callBack?.showMenuBar(); dismiss() } - binding.llSetting.onClick { + binding.llMainMenu.setOnClickListener { + callBack?.showMenuBar() + dismissAllowingStateLoss() + } + binding.llSetting.setOnClickListener { ReadAloudConfigDialog().show(childFragmentManager, "readAloudConfigDialog") } - binding.llCatalog.onClick { callBack?.openChapterList() } - binding.llAutoPageStop.onClick { + binding.llCatalog.setOnClickListener { callBack?.openChapterList() } + binding.llAutoPageStop.setOnClickListener { callBack?.autoPageStop() - dismiss() + dismissAllowingStateLoss() } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/BgAdapter.kt b/app/src/main/java/io/legado/app/ui/book/read/config/BgAdapter.kt index 826a701f2..fd0d390e9 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/BgAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/BgAdapter.kt @@ -9,7 +9,7 @@ import io.legado.app.databinding.ItemBgImageBinding import io.legado.app.help.ImageLoader import io.legado.app.help.ReadBookConfig import io.legado.app.utils.postEvent -import org.jetbrains.anko.sdk27.listeners.onClick + import java.io.File class BgAdapter(context: Context, val textColor: Int) : @@ -39,7 +39,7 @@ class BgAdapter(context: Context, val textColor: Int) : override fun registerListener(holder: ItemViewHolder, binding: ItemBgImageBinding) { holder.itemView.apply { - this.onClick { + this.setOnClickListener { getItemByLayoutPosition(holder.layoutPosition)?.let { ReadBookConfig.durConfig.setCurBg(1, it) ReadBookConfig.upBg() diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt index 99d9285ea..7b4eee738 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt @@ -28,8 +28,6 @@ import io.legado.app.ui.filepicker.FilePicker import io.legado.app.ui.filepicker.FilePickerDialog import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onCheckedChange -import org.jetbrains.anko.sdk27.listeners.onClick import rxhttp.wrapper.param.RxHttp import rxhttp.wrapper.param.toByteArray import java.io.File @@ -110,7 +108,7 @@ class BgTextConfigDialog : BaseDialogFragment(), FilePickerDialog.CallBack { tvName.text = getString(R.string.select_image) ivBg.setImageResource(R.drawable.ic_image) ivBg.setColorFilter(primaryTextColor) - root.onClick { selectImage() } + root.setOnClickListener { selectImage() } } } requireContext().assets.list("bg")?.let { @@ -120,12 +118,12 @@ class BgTextConfigDialog : BaseDialogFragment(), FilePickerDialog.CallBack { @SuppressLint("InflateParams") private fun initEvent() = with(ReadBookConfig.durConfig) { - binding.ivEdit.onClick { + binding.ivEdit.setOnClickListener { alert(R.string.style_name) { val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply { editView.setText(ReadBookConfig.durConfig.name) } - customView = alertBinding.root + customView { alertBinding.root } okButton { alertBinding.editView.text?.toString()?.let { binding.tvName.text = it @@ -135,13 +133,13 @@ class BgTextConfigDialog : BaseDialogFragment(), FilePickerDialog.CallBack { cancelButton() }.show() } - binding.swDarkStatusIcon.onCheckedChange { buttonView, isChecked -> + binding.swDarkStatusIcon.setOnCheckedChangeListener { buttonView, isChecked -> if (buttonView?.isPressed == true) { setCurStatusIconDark(isChecked) (activity as? ReadBookActivity)?.upSystemUiVisibility() } } - binding.tvTextColor.onClick { + binding.tvTextColor.setOnClickListener { ColorPickerDialog.newBuilder() .setColor(curTextColor()) .setShowAlphaSlider(false) @@ -149,7 +147,7 @@ class BgTextConfigDialog : BaseDialogFragment(), FilePickerDialog.CallBack { .setDialogId(TEXT_COLOR) .show(requireActivity()) } - binding.tvBgColor.onClick { + binding.tvBgColor.setOnClickListener { val bgColor = if (curBgType() == 0) Color.parseColor(curBgStr()) else Color.parseColor("#015A86") @@ -160,7 +158,7 @@ class BgTextConfigDialog : BaseDialogFragment(), FilePickerDialog.CallBack { .setDialogId(BG_COLOR) .show(requireActivity()) } - binding.ivImport.onClick { + binding.ivImport.setOnClickListener { val importFormNet = "网络导入" val otherActions = arrayListOf(importFormNet) FilePicker.selectFile( @@ -175,19 +173,19 @@ class BgTextConfigDialog : BaseDialogFragment(), FilePickerDialog.CallBack { } } } - binding.ivExport.onClick { + binding.ivExport.setOnClickListener { FilePicker.selectFolder( this@BgTextConfigDialog, requestCodeExport, title = getString(R.string.export_str) ) } - binding.ivDelete.onClick { + binding.ivDelete.setOnClickListener { if (ReadBookConfig.deleteDur()) { postEvent(EventBus.UP_CONFIG, true) - dismiss() + dismissAllowingStateLoss() } else { - toast("数量已是最少,不能删除.") + toastOnUi("数量已是最少,不能删除.") } } } @@ -201,6 +199,11 @@ class BgTextConfigDialog : BaseDialogFragment(), FilePickerDialog.CallBack { @Suppress("BlockingMethodInNonBlockingContext") private fun exportConfig(uri: Uri) { + val exportFileName = if (ReadBookConfig.config.name.isBlank()) { + configFileName + } else { + "${ReadBookConfig.config.name}.zip" + } execute { val exportFiles = arrayListOf() val configDirPath = FileUtils.getPath(requireContext().eCacheDir, "readConfig") @@ -252,19 +255,19 @@ class BgTextConfigDialog : BaseDialogFragment(), FilePickerDialog.CallBack { if (ZipUtils.zipFiles(exportFiles, File(configZipPath))) { if (uri.isContentScheme()) { DocumentFile.fromTreeUri(requireContext(), uri)?.let { treeDoc -> - treeDoc.findFile(configFileName)?.delete() - treeDoc.createFile("", configFileName) + treeDoc.findFile(exportFileName)?.delete() + treeDoc.createFile("", exportFileName) ?.writeBytes(requireContext(), File(configZipPath).readBytes()) } } else { - val exportPath = FileUtils.getPath(File(uri.path!!), configFileName) + val exportPath = FileUtils.getPath(File(uri.path!!), exportFileName) FileUtils.deleteFile(exportPath) FileUtils.createFileIfNotExist(exportPath) .writeBytes(File(configZipPath).readBytes()) } } }.onSuccess { - toast("导出成功, 文件名为 $configFileName") + toastOnUi("导出成功, 文件名为 $exportFileName") }.onError { it.printStackTrace() longToast("导出失败:${it.localizedMessage}") @@ -275,7 +278,7 @@ class BgTextConfigDialog : BaseDialogFragment(), FilePickerDialog.CallBack { private fun importNetConfigAlert() { alert("输入地址") { val alertBinding = DialogEditTextBinding.inflate(layoutInflater) - customView = alertBinding.root + customView { alertBinding.root } okButton { alertBinding.editView.text?.toString()?.let { url -> importNetConfig(url) @@ -360,7 +363,7 @@ class BgTextConfigDialog : BaseDialogFragment(), FilePickerDialog.CallBack { ReadBookConfig.durConfig = config postEvent(EventBus.UP_CONFIG, true) }.onSuccess { - toast("导入成功") + toastOnUi("导入成功") }.onError { it.printStackTrace() longToast("导入失败:${it.localizedMessage}") @@ -401,7 +404,7 @@ class BgTextConfigDialog : BaseDialogFragment(), FilePickerDialog.CallBack { ReadBookConfig.durConfig.setCurBg(2, file.absolutePath) ReadBookConfig.upBg() postEvent(EventBus.UP_CONFIG, false) - } ?: toast("获取文件出错") + } ?: toastOnUi("获取文件出错") } } else { PermissionsCompat.Builder(this) diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ChineseConverter.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ChineseConverter.kt index dc8f36d67..514e0a350 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ChineseConverter.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ChineseConverter.kt @@ -10,7 +10,7 @@ import io.legado.app.help.AppConfig import io.legado.app.lib.dialogs.alert import io.legado.app.lib.theme.accentColor import io.legado.app.ui.widget.text.StrokeTextView -import org.jetbrains.anko.sdk27.listeners.onClick + class ChineseConverter(context: Context, attrs: AttributeSet?) : StrokeTextView(context, attrs) { @@ -23,7 +23,7 @@ class ChineseConverter(context: Context, attrs: AttributeSet?) : StrokeTextView( if (!isInEditMode) { upUi(AppConfig.chineseConverterType) } - onClick { + setOnClickListener { selectType() } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ClickActionConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ClickActionConfigDialog.kt index cc4a3157b..8ade981b6 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ClickActionConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ClickActionConfigDialog.kt @@ -16,7 +16,7 @@ import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.utils.getCompatColor import io.legado.app.utils.putPrefInt import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onClick + class ClickActionConfigDialog : BaseDialogFragment() { private val binding by viewBinding(DialogClickActionConfigBinding::bind) @@ -68,52 +68,52 @@ class ClickActionConfigDialog : BaseDialogFragment() { } private fun initViewEvent() { - binding.ivClose.onClick { - dismiss() + binding.ivClose.setOnClickListener { + dismissAllowingStateLoss() } - binding.tvTopLeft.onClick { + binding.tvTopLeft.setOnClickListener { selectAction { action -> putPrefInt(PreferKey.clickActionTL, action) (it as? TextView)?.text = actions[action] } } - binding.tvTopCenter.onClick { + binding.tvTopCenter.setOnClickListener { selectAction { action -> putPrefInt(PreferKey.clickActionTC, action) (it as? TextView)?.text = actions[action] } } - binding.tvTopRight.onClick { + binding.tvTopRight.setOnClickListener { selectAction { action -> putPrefInt(PreferKey.clickActionTR, action) (it as? TextView)?.text = actions[action] } } - binding.tvMiddleLeft.onClick { + binding.tvMiddleLeft.setOnClickListener { selectAction { action -> putPrefInt(PreferKey.clickActionML, action) (it as? TextView)?.text = actions[action] } } - binding.tvMiddleRight.onClick { + binding.tvMiddleRight.setOnClickListener { selectAction { action -> putPrefInt(PreferKey.clickActionMR, action) (it as? TextView)?.text = actions[action] } } - binding.tvBottomLeft.onClick { + binding.tvBottomLeft.setOnClickListener { selectAction { action -> putPrefInt(PreferKey.clickActionBL, action) (it as? TextView)?.text = actions[action] } } - binding.tvBottomCenter.onClick { + binding.tvBottomCenter.setOnClickListener { selectAction { action -> putPrefInt(PreferKey.clickActionBC, action) (it as? TextView)?.text = actions[action] } } - binding.tvBottomRight.onClick { + binding.tvBottomRight.setOnClickListener { selectAction { action -> putPrefInt(PreferKey.clickActionBR, action) (it as? TextView)?.text = actions[action] diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt index 8a5f87202..5e4b9cec6 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt @@ -111,7 +111,8 @@ class MoreConfigDialog : DialogFragment() { (activity as? ReadBookActivity)?.setOrientation() } PreferKey.textFullJustify, - PreferKey.textBottomJustify -> { + PreferKey.textBottomJustify, + PreferKey.useZhLayout -> { postEvent(EventBus.UP_CONFIG, true) } PreferKey.showBrightnessView -> { diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/PageKeyDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/PageKeyDialog.kt index 85ec5d31a..092134e77 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/PageKeyDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/PageKeyDialog.kt @@ -10,7 +10,6 @@ import io.legado.app.lib.theme.backgroundColor import io.legado.app.utils.getPrefString import io.legado.app.utils.hideSoftInput import io.legado.app.utils.putPrefString -import org.jetbrains.anko.sdk27.listeners.onClick class PageKeyDialog(context: Context) : Dialog(context, R.style.AppTheme_AlertDialog) { @@ -22,7 +21,7 @@ class PageKeyDialog(context: Context) : Dialog(context, R.style.AppTheme_AlertDi binding.contentView.setBackgroundColor(context.backgroundColor) binding.etPrev.setText(context.getPrefString(PreferKey.prevKeys)) binding.etNext.setText(context.getPrefString(PreferKey.nextKeys)) - binding.tvOk.onClick { + binding.tvOk.setOnClickListener { context.putPrefString(PreferKey.prevKeys, binding.etPrev.text?.toString()) context.putPrefString(PreferKey.nextKeys, binding.etNext.text?.toString()) dismiss() diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt index fe4379dbd..189b7df26 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt @@ -9,11 +9,11 @@ import android.widget.LinearLayout import androidx.fragment.app.DialogFragment import androidx.preference.ListPreference import androidx.preference.Preference -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BasePreferenceFragment import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.backgroundColor import io.legado.app.service.BaseReadAloudService @@ -21,6 +21,7 @@ import io.legado.app.service.help.ReadAloud import io.legado.app.utils.getPrefLong import io.legado.app.utils.getSize import io.legado.app.utils.postEvent +import splitties.init.appCtx class ReadAloudConfigDialog : DialogFragment() { private val readAloudPreferTag = "readAloudPreferTag" @@ -60,8 +61,8 @@ class ReadAloudConfigDialog : DialogFragment() { private val speakEngineSummary: String get() { - val eid = App.INSTANCE.getPrefLong(PreferKey.speakEngine) - val ht = App.db.httpTTSDao.get(eid) + val eid = appCtx.getPrefLong(PreferKey.speakEngine) + val ht = appDb.httpTTSDao.get(eid) return ht?.name ?: getString(R.string.local_tts) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt index 8fb2bbcea..52f7e7d36 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt @@ -21,7 +21,7 @@ import io.legado.app.utils.getPrefBoolean import io.legado.app.utils.observeEvent import io.legado.app.utils.putPrefBoolean import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onClick + class ReadAloudDialog : BaseDialogFragment() { private var callBack: CallBack? = null @@ -122,18 +122,24 @@ class ReadAloudDialog : BaseDialogFragment() { } private fun initEvent() = with(binding) { - llMainMenu.onClick { callBack?.showMenuBar(); dismiss() } - llSetting.onClick { + llMainMenu.setOnClickListener { + callBack?.showMenuBar() + dismissAllowingStateLoss() + } + llSetting.setOnClickListener { ReadAloudConfigDialog().show(childFragmentManager, "readAloudConfigDialog") } - tvPre.onClick { ReadBook.moveToPrevChapter(upContent = true, toLast = false) } - tvNext.onClick { ReadBook.moveToNextChapter(true) } - ivStop.onClick { ReadAloud.stop(requireContext()); dismiss() } - ivPlayPause.onClick { callBack?.onClickReadAloud() } - ivPlayPrev.onClick { ReadAloud.prevParagraph(requireContext()) } - ivPlayNext.onClick { ReadAloud.nextParagraph(requireContext()) } - llCatalog.onClick { callBack?.openChapterList() } - llToBackstage.onClick { callBack?.finish() } + tvPre.setOnClickListener { ReadBook.moveToPrevChapter(upContent = true, toLast = false) } + tvNext.setOnClickListener { ReadBook.moveToNextChapter(true) } + ivStop.setOnClickListener { + ReadAloud.stop(requireContext()) + dismissAllowingStateLoss() + } + ivPlayPause.setOnClickListener { callBack?.onClickReadAloud() } + ivPlayPrev.setOnClickListener { ReadAloud.prevParagraph(requireContext()) } + ivPlayNext.setOnClickListener { ReadAloud.nextParagraph(requireContext()) } + llCatalog.setOnClickListener { callBack?.openChapterList() } + llToBackstage.setOnClickListener { callBack?.finish() } } private fun upPlayState() { diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt index 556545e95..90f4a9b21 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt @@ -24,9 +24,7 @@ import io.legado.app.utils.dp import io.legado.app.utils.getIndexById import io.legado.app.utils.postEvent import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onCheckedChange -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.sdk27.listeners.onLongClick +import splitties.views.onLongClick class ReadStyleDialog : BaseDialogFragment(), FontSelectDialog.CallBack { private val binding by viewBinding(DialogReadBookStyleBinding::bind) @@ -93,7 +91,7 @@ class ReadStyleDialog : BaseDialogFragment(), FontSelectDialog.CallBack { ivStyle.setColorFilter(textColor) ivStyle.borderColor = textColor ivStyle.setImageResource(R.drawable.ic_add) - root.onClick { + root.setOnClickListener { ReadBookConfig.configList.add(ReadBookConfig.Config()) showBgTextConfig(ReadBookConfig.configList.lastIndex) } @@ -114,10 +112,10 @@ class ReadStyleDialog : BaseDialogFragment(), FontSelectDialog.CallBack { textFontWeightConverter.onChanged { postEvent(EventBus.UP_CONFIG, true) } - tvTextFont.onClick { + tvTextFont.setOnClickListener { FontSelectDialog().show(childFragmentManager, "fontSelectDialog") } - tvTextIndent.onClick { + tvTextIndent.setOnClickListener { selector( title = getString(R.string.text_indent), items = resources.getStringArray(R.array.indent).toList() @@ -126,14 +124,14 @@ class ReadStyleDialog : BaseDialogFragment(), FontSelectDialog.CallBack { postEvent(EventBus.UP_CONFIG, true) } } - tvPadding.onClick { - dismiss() + tvPadding.setOnClickListener { + dismissAllowingStateLoss() callBack?.showPaddingConfig() } - tvTip.onClick { + tvTip.setOnClickListener { TipConfigDialog().show(childFragmentManager, "tipConfigDialog") } - rgPageAnim.onCheckedChange { _, checkedId -> + rgPageAnim.setOnCheckedChangeListener { _, checkedId -> ReadBook.book?.setPageAnim(-1) ReadBookConfig.pageAnim = binding.rgPageAnim.getIndexById(checkedId) callBack?.upPageAnim() @@ -176,7 +174,7 @@ class ReadStyleDialog : BaseDialogFragment(), FontSelectDialog.CallBack { } private fun showBgTextConfig(index: Int): Boolean { - dismiss() + dismissAllowingStateLoss() changeBg(index) callBack?.showBgTextConfig() return true @@ -235,16 +233,14 @@ class ReadStyleDialog : BaseDialogFragment(), FontSelectDialog.CallBack { override fun registerListener(holder: ItemViewHolder, binding: ItemReadStyleBinding) { binding.apply { - ivStyle.onClick { + ivStyle.setOnClickListener { if (ivStyle.isInView) { changeBg(holder.layoutPosition) } } - ivStyle.onLongClick { + ivStyle.onLongClick(ivStyle.isInView) { if (ivStyle.isInView) { showBgTextConfig(holder.layoutPosition) - } else { - false } } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt index 2c807a279..fbef2f93e 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt @@ -8,14 +8,15 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar +import androidx.fragment.app.viewModels import androidx.lifecycle.LiveData import androidx.recyclerview.widget.LinearLayoutManager -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.data.entities.HttpTTS import io.legado.app.databinding.DialogHttpTtsEditBinding import io.legado.app.databinding.DialogRecyclerViewBinding @@ -27,14 +28,15 @@ import io.legado.app.service.help.ReadAloud import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onClick +import splitties.init.appCtx + class SpeakEngineDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { private val binding by viewBinding(DialogRecyclerViewBinding::bind) lateinit var adapter: Adapter - lateinit var viewModel: SpeakEngineViewModel + private val viewModel: SpeakEngineViewModel by viewModels() private var httpTTSData: LiveData>? = null - var engineId = App.INSTANCE.getPrefLong(PreferKey.speakEngine) + var engineId = appCtx.getPrefLong(PreferKey.speakEngine) override fun onStart() { super.onStart() @@ -47,7 +49,6 @@ class SpeakEngineDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener container: ViewGroup?, savedInstanceState: Bundle? ): View? { - viewModel = getViewModel(SpeakEngineViewModel::class.java) return inflater.inflate(R.layout.dialog_recycler_view, container) } @@ -66,18 +67,18 @@ class SpeakEngineDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener recyclerView.adapter = adapter tvFooterLeft.setText(R.string.local_tts) tvFooterLeft.visible() - tvFooterLeft.onClick { + tvFooterLeft.setOnClickListener { removePref(PreferKey.speakEngine) - dismiss() + dismissAllowingStateLoss() } tvOk.visible() - tvOk.onClick { + tvOk.setOnClickListener { putPrefLong(PreferKey.speakEngine, engineId) - dismiss() + dismissAllowingStateLoss() } tvCancel.visible() - tvCancel.onClick { - dismiss() + tvCancel.setOnClickListener { + dismissAllowingStateLoss() } } @@ -89,7 +90,7 @@ class SpeakEngineDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener private fun initData() { httpTTSData?.removeObservers(this) - httpTTSData = App.db.httpTTSDao.observeAll() + httpTTSData = appDb.httpTTSDao.observeAll() httpTTSData?.observe(this, { adapter.setItems(it) }) @@ -110,13 +111,13 @@ class SpeakEngineDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener val alertBinding = DialogHttpTtsEditBinding.inflate(layoutInflater) alertBinding.tvName.setText(httpTTS.name) alertBinding.tvUrl.setText(httpTTS.url) - customView = alertBinding.root + customView { alertBinding.root } cancelButton() okButton { alertBinding.apply { httpTTS.name = tvName.text.toString() httpTTS.url = tvUrl.text.toString() - App.db.httpTTSDao.insert(httpTTS) + appDb.httpTTSDao.insert(httpTTS) ReadAloud.upReadAloudClass() } } @@ -150,18 +151,18 @@ class SpeakEngineDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener override fun registerListener(holder: ItemViewHolder, binding: ItemHttpTtsBinding) { binding.apply { - cbName.onClick { + cbName.setOnClickListener { getItem(holder.layoutPosition)?.let { httpTTS -> engineId = httpTTS.id notifyItemRangeChanged(0, itemCount) } } - ivEdit.onClick { + ivEdit.setOnClickListener { editHttpTTS(getItem(holder.layoutPosition)) } - ivMenuDelete.onClick { + ivMenuDelete.setOnClickListener { getItem(holder.layoutPosition)?.let { httpTTS -> - App.db.httpTTSDao.delete(httpTTS) + appDb.httpTTSDao.delete(httpTTS) } } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineViewModel.kt index bfcb8ae2b..3ebaa228d 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineViewModel.kt @@ -1,8 +1,8 @@ package io.legado.app.ui.book.read.config import android.app.Application -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.HttpTTS import io.legado.app.help.DefaultData import io.legado.app.utils.GSON @@ -22,7 +22,7 @@ class SpeakEngineViewModel(application: Application) : BaseViewModel(application execute { RxHttp.get(url).toText("utf-8").await().let { json -> GSON.fromJsonArray(json)?.let { - App.db.httpTTSDao.insert(*it.toTypedArray()) + appDb.httpTTSDao.insert(*it.toTypedArray()) } } }.onSuccess { diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/TextFontWeightConverter.kt b/app/src/main/java/io/legado/app/ui/book/read/config/TextFontWeightConverter.kt index ae240846d..832cff925 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/TextFontWeightConverter.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/TextFontWeightConverter.kt @@ -10,7 +10,7 @@ import io.legado.app.help.ReadBookConfig import io.legado.app.lib.dialogs.alert import io.legado.app.lib.theme.accentColor import io.legado.app.ui.widget.text.StrokeTextView -import org.jetbrains.anko.sdk27.listeners.onClick + class TextFontWeightConverter(context: Context, attrs: AttributeSet?) : StrokeTextView(context, attrs) { @@ -23,7 +23,7 @@ class TextFontWeightConverter(context: Context, attrs: AttributeSet?) : StrokeTe if (!isInEditMode) { upUi(ReadBookConfig.textBold) } - onClick { + setOnClickListener { selectType() } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/TipConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/TipConfigDialog.kt index 7f20e8879..8e0d74b74 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/TipConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/TipConfigDialog.kt @@ -14,8 +14,7 @@ import io.legado.app.help.ReadTipConfig import io.legado.app.lib.dialogs.selector import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onCheckedChange -import org.jetbrains.anko.sdk27.listeners.onClick + class TipConfigDialog : BaseDialogFragment() { @@ -76,7 +75,7 @@ class TipConfigDialog : BaseDialogFragment() { } private fun initEvent() = with(binding) { - rgTitleMode.onCheckedChange { _, checkedId -> + rgTitleMode.setOnCheckedChangeListener { _, checkedId -> ReadBookConfig.titleMode = rgTitleMode.getIndexById(checkedId) postEvent(EventBus.UP_CONFIG, true) } @@ -92,21 +91,21 @@ class TipConfigDialog : BaseDialogFragment() { ReadBookConfig.titleBottomSpacing = it postEvent(EventBus.UP_CONFIG, true) } - llHeaderShow.onClick { + llHeaderShow.setOnClickListener { selector(items = ReadTipConfig.headerModes.values.toList()) { _, i -> ReadTipConfig.headerMode = ReadTipConfig.headerModes.keys.toList()[i] tvHeaderShow.text = ReadTipConfig.headerModes[ReadTipConfig.headerMode] postEvent(EventBus.UP_CONFIG, true) } } - llFooterShow.onClick { + llFooterShow.setOnClickListener { selector(items = ReadTipConfig.footerModes.values.toList()) { _, i -> ReadTipConfig.footerMode = ReadTipConfig.footerModes.keys.toList()[i] tvFooterShow.text = ReadTipConfig.footerModes[ReadTipConfig.footerMode] postEvent(EventBus.UP_CONFIG, true) } } - llHeaderLeft.onClick { + llHeaderLeft.setOnClickListener { selector(items = ReadTipConfig.tips) { _, i -> clearRepeat(i) ReadTipConfig.tipHeaderLeft = i @@ -114,7 +113,7 @@ class TipConfigDialog : BaseDialogFragment() { postEvent(EventBus.UP_CONFIG, true) } } - llHeaderMiddle.onClick { + llHeaderMiddle.setOnClickListener { selector(items = ReadTipConfig.tips) { _, i -> clearRepeat(i) ReadTipConfig.tipHeaderMiddle = i @@ -122,7 +121,7 @@ class TipConfigDialog : BaseDialogFragment() { postEvent(EventBus.UP_CONFIG, true) } } - llHeaderRight.onClick { + llHeaderRight.setOnClickListener { selector(items = ReadTipConfig.tips) { _, i -> clearRepeat(i) ReadTipConfig.tipHeaderRight = i @@ -130,7 +129,7 @@ class TipConfigDialog : BaseDialogFragment() { postEvent(EventBus.UP_CONFIG, true) } } - llFooterLeft.onClick { + llFooterLeft.setOnClickListener { selector(items = ReadTipConfig.tips) { _, i -> clearRepeat(i) ReadTipConfig.tipFooterLeft = i @@ -138,7 +137,7 @@ class TipConfigDialog : BaseDialogFragment() { postEvent(EventBus.UP_CONFIG, true) } } - llFooterMiddle.onClick { + llFooterMiddle.setOnClickListener { selector(items = ReadTipConfig.tips) { _, i -> clearRepeat(i) ReadTipConfig.tipFooterMiddle = i @@ -146,7 +145,7 @@ class TipConfigDialog : BaseDialogFragment() { postEvent(EventBus.UP_CONFIG, true) } } - llFooterRight.onClick { + llFooterRight.setOnClickListener { selector(items = ReadTipConfig.tips) { _, i -> clearRepeat(i) ReadTipConfig.tipFooterRight = i @@ -154,7 +153,7 @@ class TipConfigDialog : BaseDialogFragment() { postEvent(EventBus.UP_CONFIG, true) } } - llTipColor.onClick { + llTipColor.setOnClickListener { selector(items = arrayListOf("跟随正文", "自定义")) { _, i -> when (i) { 0 -> { diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexDialog.kt index 11ee46f6c..55b1a4ec4 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexDialog.kt @@ -9,16 +9,17 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar import androidx.fragment.app.FragmentManager +import androidx.fragment.app.viewModels import androidx.lifecycle.LiveData import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.snackbar.Snackbar -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.data.appDb import io.legado.app.data.entities.TxtTocRule import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogTocRegexBinding @@ -33,17 +34,15 @@ import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch -import org.jetbrains.anko.sdk27.listeners.onClick import java.util.* - class TocRegexDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { private val importTocRuleKey = "tocRuleUrl" private lateinit var adapter: TocRegexAdapter private var tocRegexLiveData: LiveData>? = null var selectedName: String? = null private var durRegex: String? = null - lateinit var viewModel: TocRegexViewModel + private val viewModel: TocRegexViewModel by viewModels() private val binding by viewBinding(DialogTocRegexBinding::bind) override fun onStart() { @@ -57,7 +56,6 @@ class TocRegexDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { container: ViewGroup?, savedInstanceState: Bundle? ): View? { - viewModel = getViewModel(TocRegexViewModel::class.java) return inflater.inflate(R.layout.dialog_toc_regex, container) } @@ -80,16 +78,16 @@ class TocRegexDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { val itemTouchCallback = ItemTouchCallback(adapter) itemTouchCallback.isCanDrag = true ItemTouchHelper(itemTouchCallback).attachToRecyclerView(recyclerView) - tvCancel.onClick { - dismiss() + tvCancel.setOnClickListener { + dismissAllowingStateLoss() } - tvOk.onClick { + tvOk.setOnClickListener { adapter.getItems().forEach { tocRule -> if (selectedName == tocRule.name) { val callBack = activity as? CallBack callBack?.onTocRegexDialogResult(tocRule.rule) - dismiss() - return@onClick + dismissAllowingStateLoss() + return@setOnClickListener } } } @@ -97,7 +95,7 @@ class TocRegexDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { private fun initData() { tocRegexLiveData?.removeObservers(viewLifecycleOwner) - tocRegexLiveData = App.db.txtTocRule.observeAll() + tocRegexLiveData = appDb.txtTocRuleDao.observeAll() tocRegexLiveData?.observe(viewLifecycleOwner, { tocRules -> initSelectedName(tocRules) adapter.setItems(tocRules) @@ -148,7 +146,7 @@ class TocRegexDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { aCache.put(importTocRuleKey, cacheUrls.joinToString(",")) } } - customView = alertBinding.root + customView { alertBinding.root } okButton { val text = alertBinding.editView.text?.toString() text?.let { @@ -176,7 +174,7 @@ class TocRegexDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { tvRuleName.setText(tocRule.name) tvRuleRegex.setText(tocRule.rule) } - customView = alertBinding.root + customView { alertBinding.root } okButton { alertBinding.apply { tocRule.name = tvRuleName.text.toString() @@ -227,18 +225,18 @@ class TocRegexDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { getItem(holder.layoutPosition)?.let { it.enable = isChecked launch(IO) { - App.db.txtTocRule.update(it) + appDb.txtTocRuleDao.update(it) } } } } - ivEdit.onClick { + ivEdit.setOnClickListener { editRule(getItem(holder.layoutPosition)) } - ivDelete.onClick { + ivDelete.setOnClickListener { getItem(holder.layoutPosition)?.let { item -> launch(IO) { - App.db.txtTocRule.delete(item) + appDb.txtTocRuleDao.delete(item) } } } @@ -260,7 +258,7 @@ class TocRegexDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { item.serialNumber = index + 1 } launch(IO) { - App.db.txtTocRule.update(*getItems().toTypedArray()) + appDb.txtTocRuleDao.update(*getItems().toTypedArray()) } } isMoved = false diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexViewModel.kt index aa8ee25fb..6494cf762 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexViewModel.kt @@ -1,8 +1,8 @@ package io.legado.app.ui.book.read.config import android.app.Application -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.TxtTocRule import io.legado.app.help.DefaultData import io.legado.app.utils.GSON @@ -15,9 +15,9 @@ class TocRegexViewModel(application: Application) : BaseViewModel(application) { fun saveRule(rule: TxtTocRule) { execute { if (rule.serialNumber < 0) { - rule.serialNumber = App.db.txtTocRule.lastOrderNum + 1 + rule.serialNumber = appDb.txtTocRuleDao.lastOrderNum + 1 } - App.db.txtTocRule.insert(rule) + appDb.txtTocRuleDao.insert(rule) } } @@ -31,7 +31,7 @@ class TocRegexViewModel(application: Application) : BaseViewModel(application) { execute { RxHttp.get(url).toText("utf-8").await().let { json -> GSON.fromJsonArray(json)?.let { - App.db.txtTocRule.insert(*it.toTypedArray()) + appDb.txtTocRuleDao.insert(*it.toTypedArray()) } } }.onSuccess { diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt index 10a454109..3fba231a4 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt @@ -113,19 +113,15 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at val lineTop = textLine.lineTop + relativeOffset val lineBase = textLine.lineBase + relativeOffset val lineBottom = textLine.lineBottom + relativeOffset - if (textLine.isImage) { - drawImage(canvas, textLine, lineTop, lineBottom) - } else { - drawChars( - canvas, - textLine.textChars, - lineTop, - lineBase, - lineBottom, - isTitle = textLine.isTitle, - isReadAloud = textLine.isReadAloud - ) - } + drawChars( + canvas, + textLine.textChars, + lineTop, + lineBase, + lineBottom, + isTitle = textLine.isTitle, + isReadAloud = textLine.isReadAloud + ) } /** @@ -148,7 +144,11 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at textPaint.color = if (isReadAloud) context.accentColor else ReadBookConfig.textColor textChars.forEach { - canvas.drawText(it.charData, it.start, lineBase, textPaint) + if (it.isImage) { + drawImage(canvas, it, lineTop, lineBottom) + } else { + canvas.drawText(it.charData, it.start, lineBase, textPaint) + } if (it.selected) { canvas.drawRect(it.start, lineTop, it.end, lineBottom, selectedPaint) } @@ -160,18 +160,16 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at */ private fun drawImage( canvas: Canvas, - textLine: TextLine, + textChar: TextChar, lineTop: Float, lineBottom: Float, ) { - textLine.textChars.forEach { textChar -> - ReadBook.book?.let { book -> - val rectF = RectF(textChar.start, lineTop, textChar.end, lineBottom) - ImageProvider.getImage(book, textPage.chapterIndex, textChar.charData, true) - ?.let { - canvas.drawBitmap(it, null, rectF, null) - } - } + ReadBook.book?.let { book -> + val rectF = RectF(textChar.start, lineTop, textChar.end, lineBottom) + ImageProvider.getImage(book, textPage.chapterIndex, textChar.charData, true) + ?.let { + canvas.drawBitmap(it, null, rectF, null) + } } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt index dbecc4b82..7b621735f 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt @@ -20,7 +20,6 @@ import io.legado.app.ui.book.read.page.entities.TextPage import io.legado.app.ui.book.read.page.provider.ChapterProvider import io.legado.app.ui.widget.BatteryView import io.legado.app.utils.* -import org.jetbrains.anko.topPadding import java.util.* /** @@ -97,9 +96,9 @@ class PageView(context: Context) : FrameLayout(context) { /** * 显示状态栏时隐藏header */ - fun upStatusBar() { - binding.vwStatusBar.topPadding = context.statusBarHeight - binding.vwStatusBar.isGone = + fun upStatusBar() = with(binding.vwStatusBar) { + setPadding(paddingLeft, context.statusBarHeight, paddingRight, paddingBottom) + isGone = ReadBookConfig.hideStatusBar || (activity as? BaseActivity<*>)?.isInMultiWindow == true } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt index 2ded3399f..ef53ab14b 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt @@ -242,104 +242,108 @@ class ReadView(context: Context, attrs: AttributeSet) : /** * 长按选择 */ - private fun onLongPress() = with(curPage.textPage) { - curPage.selectText(startX, startY) { relativePage, lineIndex, charIndex -> - isTextSelected = true - firstRelativePage = relativePage - firstLineIndex = lineIndex - firstCharIndex = charIndex - var lineStart = lineIndex - var lineEnd = lineIndex - var start: Int - var end: Int - if (lineIndex - 1 > 0 && lineIndex + 1 < lineSize) { - // 中间行 - val lineText = with(textLines) { - get(lineIndex - 1).text + get(lineIndex).text + get(lineIndex + 1).text - } - boundary.setText(lineText) - start = boundary.first() - end = boundary.next() - val cIndex = textLines[lineIndex - 1].text.length + charIndex - while (end != BreakIterator.DONE) { - if (cIndex in start until end) { - break - } - start = end - end = boundary.next() - } - if (start < textLines[lineIndex - 1].text.length) { - lineStart = lineIndex - 1 - } else { - start -= textLines[lineIndex - 1].text.length - } - if (end > textLines[lineIndex - 1].text.length + textLines[lineIndex].text.length) { - lineEnd = lineIndex + 1 - end = (end - textLines[lineIndex - 1].text.length - - textLines[lineIndex].text.length) - } else { - end = end - textLines[lineIndex - 1].text.length - 1 - } - } else if (lineIndex - 1 > 0) { - // 尾行 - val lineText = with(textLines) { - get(lineIndex - 1).text + get(lineIndex).text - } - boundary.setText(lineText) - start = boundary.first() - end = boundary.next() - val cIndex = textLines[lineIndex - 1].text.length + charIndex - while (end != BreakIterator.DONE) { - if (cIndex in start until end) { - break - } - start = end - end = boundary.next() - } - if (start < textLines[lineIndex - 1].text.length) { - lineStart = lineIndex - 1 - } else { - start -= textLines[lineIndex - 1].text.length - } - end = end - textLines[lineIndex - 1].text.length - 1 - } else if (lineIndex + 1 < lineSize) { - // 首行 - val lineText = with(textLines) { - get(lineIndex).text + get(lineIndex + 1).text - } - boundary.setText(lineText) - start = boundary.first() - end = boundary.next() - while (end != BreakIterator.DONE) { - if (charIndex in start until end) { - break - } - start = end - end = boundary.next() - } - if (end > textLines[lineIndex].text.length) { - lineEnd = lineIndex + 1 - end -= textLines[lineIndex].text.length - } else { - end -= 1 - } - } else { - // 单行 - val lineText = textLines[lineIndex].text - boundary.setText(lineText) - start = boundary.first() - end = boundary.next() - while (end != BreakIterator.DONE) { - if (charIndex in start until end) { - break + private fun onLongPress() { + kotlin.runCatching { + with(curPage.textPage) { + curPage.selectText(startX, startY) { relativePage, lineIndex, charIndex -> + isTextSelected = true + firstRelativePage = relativePage + firstLineIndex = lineIndex + firstCharIndex = charIndex + var lineStart = lineIndex + var lineEnd = lineIndex + var start: Int + var end: Int + if (lineIndex - 1 > 0 && lineIndex + 1 < lineSize) { + // 中间行 + val lineText = with(textLines) { + get(lineIndex - 1).text + get(lineIndex).text + get(lineIndex + 1).text + } + boundary.setText(lineText) + start = boundary.first() + end = boundary.next() + val cIndex = textLines[lineIndex - 1].text.length + charIndex + while (end != BreakIterator.DONE) { + if (cIndex in start until end) { + break + } + start = end + end = boundary.next() + } + if (start < textLines[lineIndex - 1].text.length) { + lineStart = lineIndex - 1 + } else { + start -= textLines[lineIndex - 1].text.length + } + if (end > textLines[lineIndex - 1].text.length + textLines[lineIndex].text.length) { + lineEnd = lineIndex + 1 + end = (end - textLines[lineIndex - 1].text.length + - textLines[lineIndex].text.length) + } else { + end = end - textLines[lineIndex - 1].text.length - 1 + } + } else if (lineIndex - 1 > 0) { + // 尾行 + val lineText = with(textLines) { + get(lineIndex - 1).text + get(lineIndex).text + } + boundary.setText(lineText) + start = boundary.first() + end = boundary.next() + val cIndex = textLines[lineIndex - 1].text.length + charIndex + while (end != BreakIterator.DONE) { + if (cIndex in start until end) { + break + } + start = end + end = boundary.next() + } + if (start < textLines[lineIndex - 1].text.length) { + lineStart = lineIndex - 1 + } else { + start -= textLines[lineIndex - 1].text.length + } + end = end - textLines[lineIndex - 1].text.length - 1 + } else if (lineIndex + 1 < lineSize) { + // 首行 + val lineText = with(textLines) { + get(lineIndex).text + get(lineIndex + 1).text + } + boundary.setText(lineText) + start = boundary.first() + end = boundary.next() + while (end != BreakIterator.DONE) { + if (charIndex in start until end) { + break + } + start = end + end = boundary.next() + } + if (end > textLines[lineIndex].text.length) { + lineEnd = lineIndex + 1 + end -= textLines[lineIndex].text.length + } else { + end -= 1 + } + } else { + // 单行 + val lineText = textLines[lineIndex].text + boundary.setText(lineText) + start = boundary.first() + end = boundary.next() + while (end != BreakIterator.DONE) { + if (charIndex in start until end) { + break + } + start = end + end = boundary.next() + } + end -= 1 } - start = end - end = boundary.next() + curPage.selectStartMoveIndex(firstRelativePage, lineStart, start) + curPage.selectEndMoveIndex(firstRelativePage, lineEnd, end) } - end -= 1 } - curPage.selectStartMoveIndex(firstRelativePage, lineStart, start) - curPage.selectEndMoveIndex(firstRelativePage, lineEnd, end) } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt index 9d73757bb..57006ad8f 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt @@ -12,8 +12,8 @@ data class TextLine( var lineBase: Float = 0f, var lineBottom: Float = 0f, val isTitle: Boolean = false, - val isImage: Boolean = false, - var isReadAloud: Boolean = false + var isReadAloud: Boolean = false, + var isImage: Boolean = false ) { val charSize: Int get() = textChars.size @@ -24,10 +24,6 @@ data class TextLine( lineBase = lineBottom - textPaint.fontMetrics.descent } - fun addTextChar(charData: String, start: Float, end: Float) { - textChars.add(TextChar(charData, start = start, end = end)) - } - fun getTextChar(index: Int): TextChar { return textChars.getOrElse(index) { textChars.last() diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt index ba57dbc48..6108710f7 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt @@ -2,18 +2,18 @@ package io.legado.app.ui.book.read.page.entities import android.text.Layout import android.text.StaticLayout -import io.legado.app.App import io.legado.app.R import io.legado.app.help.ReadBookConfig import io.legado.app.service.help.ReadBook import io.legado.app.ui.book.read.page.provider.ChapterProvider +import splitties.init.appCtx import java.text.DecimalFormat import kotlin.math.min @Suppress("unused") data class TextPage( var index: Int = 0, - var text: String = App.INSTANCE.getString(R.string.data_loading), + var text: String = appCtx.getString(R.string.data_loading), var title: String = "", val textLines: ArrayList = arrayListOf(), var pageSize: Int = 0, @@ -72,7 +72,11 @@ data class TextPage( val char = textLine.text[i].toString() val cw = StaticLayout.getDesiredWidth(char, ChapterProvider.contentPaint) val x1 = x + cw - textLine.addTextChar(charData = char, start = x, end = x1) + textLine.textChars.add( + TextChar( + char, start = x, end = x1 + ) + ) x = x1 } textLines.add(textLine) 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 af7f8ecd8..54fec4b6e 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 @@ -6,7 +6,6 @@ import android.os.Build import android.text.Layout import android.text.StaticLayout import android.text.TextPaint -import io.legado.app.App import io.legado.app.constant.AppPattern import io.legado.app.constant.EventBus import io.legado.app.data.entities.Book @@ -19,6 +18,7 @@ import io.legado.app.ui.book.read.page.entities.TextChar import io.legado.app.ui.book.read.page.entities.TextLine import io.legado.app.ui.book.read.page.entities.TextPage import io.legado.app.utils.* +import splitties.init.appCtx import java.util.* @@ -61,7 +61,7 @@ object ChapterProvider { private var titleBottomSpacing = 0 @JvmStatic - var typeface: Typeface = Typeface.SANS_SERIF + var typeface: Typeface = Typeface.DEFAULT @JvmStatic lateinit var titlePaint: TextPaint @@ -69,6 +69,8 @@ object ChapterProvider { @JvmStatic lateinit var contentPaint: TextPaint + private const val srcReplaceChar = "🖼" + init { upStyle() } @@ -81,29 +83,62 @@ object ChapterProvider { bookChapter: BookChapter, contents: List, chapterSize: Int, - imageStyle: String?, ): TextChapter { val textPages = arrayListOf() val stringBuilder = StringBuilder() var durY = 0f textPages.add(TextPage()) - contents.forEachIndexed { index, text -> - val matcher = AppPattern.imgPattern.matcher(text) - if (matcher.find()) { - matcher.group(1)?.let { - if (!book.isEpub()) { + contents.forEachIndexed { index, content -> + if (book.getImageStyle() == Book.imgStyleText) { + var text = content.replace(srcReplaceChar, "画") + val srcList = LinkedList() + val sb = StringBuffer() + val matcher = AppPattern.imgPattern.matcher(text) + while (matcher.find()) { + matcher.group(1)?.let { it -> val src = NetworkUtils.getAbsoluteURL(bookChapter.url, it) - durY = setTypeImage( - book, bookChapter, src, durY, textPages, imageStyle - ) + srcList.add(src) + ImageProvider.getImage(book, bookChapter.index, src) + matcher.appendReplacement(sb, srcReplaceChar) } } - } else { + matcher.appendTail(sb) + text = sb.toString() val isTitle = index == 0 val textPaint = if (isTitle) titlePaint else contentPaint if (!(isTitle && ReadBookConfig.titleMode == 2)) { - durY = setTypeText(text, durY, textPages, stringBuilder, isTitle, textPaint) + durY = setTypeText( + text, durY, textPages, stringBuilder, + isTitle, textPaint, srcList + ) } + } else if (book.getImageStyle() != Book.imgStyleText) { + content.replace(AppPattern.imgPattern.toRegex(), "\n\$0\n") + .split("\n").forEach { text -> + if (text.isNotBlank()) { + val matcher = AppPattern.imgPattern.matcher(text) + if (matcher.find()) { + matcher.group(1)?.let { it -> + if (!book.isEpub()) { + val src = NetworkUtils.getAbsoluteURL(bookChapter.url, it) + durY = setTypeImage( + book, bookChapter, src, + durY, textPages, book.getImageStyle() + ) + } + } + } else { + val isTitle = index == 0 + val textPaint = if (isTitle) titlePaint else contentPaint + if (!(isTitle && ReadBookConfig.titleMode == 2)) { + durY = setTypeText( + text, durY, textPages, + stringBuilder, isTitle, textPaint + ) + } + } + } + } } } textPages.last().height = durY + 20.dp @@ -142,9 +177,12 @@ object ChapterProvider { var height = it.height var width = it.width when (imageStyle?.toUpperCase(Locale.ROOT)) { - "FULL" -> { + Book.imgStyleFull -> { width = visibleWidth height = it.height * visibleWidth / it.width + } + Book.imgStyleText -> { + } else -> { if (it.width > visibleWidth) { @@ -197,10 +235,13 @@ object ChapterProvider { textPages: ArrayList, stringBuilder: StringBuilder, isTitle: Boolean, - textPaint: TextPaint + textPaint: TextPaint, + srcList: LinkedList? = null ): Float { var durY = if (isTitle) y + titleTopSpacing else y - val layout = StaticLayout( + val layout = if (ReadBookConfig.useZhLayout) { + ZhLayout(text, textPaint, visibleWidth) + } else StaticLayout( text, textPaint, visibleWidth, Layout.Alignment.ALIGN_NORMAL, 0f, 0f, true ) for (lineIndex in 0 until layout.lineCount) { @@ -212,7 +253,13 @@ object ChapterProvider { if (lineIndex == 0 && layout.lineCount > 1 && !isTitle) { //第一行 textLine.text = words - addCharsToLineFirst(textLine, words.toStringArray(), textPaint, desiredWidth) + addCharsToLineFirst( + textLine, + words.toStringArray(), + textPaint, + desiredWidth, + srcList + ) } else if (lineIndex == layout.lineCount - 1) { //最后一行 textLine.text = "$words\n" @@ -220,11 +267,18 @@ object ChapterProvider { val x = if (isTitle && ReadBookConfig.titleMode == 1) (visibleWidth - layout.getLineWidth(lineIndex)) / 2 else 0f - addCharsToLineLast(textLine, words.toStringArray(), textPaint, x) + addCharsToLineLast(textLine, words.toStringArray(), textPaint, x, srcList) } else { //中间行 textLine.text = words - addCharsToLineMiddle(textLine, words.toStringArray(), textPaint, desiredWidth, 0f) + addCharsToLineMiddle( + textLine, + words.toStringArray(), + textPaint, + desiredWidth, + 0f, + srcList + ) } if (durY + textPaint.textHeight > visibleHeight) { //当前页面结束,设置各种值 @@ -255,21 +309,37 @@ object ChapterProvider { words: Array, textPaint: TextPaint, desiredWidth: Float, + srcList: LinkedList? ) { var x = 0f if (!ReadBookConfig.textFullJustify) { - addCharsToLineLast(textLine, words, textPaint, x) + addCharsToLineLast(textLine, words, textPaint, x, srcList) return } val bodyIndent = ReadBookConfig.paragraphIndent val icw = StaticLayout.getDesiredWidth(bodyIndent, textPaint) / bodyIndent.length bodyIndent.toStringArray().forEach { val x1 = x + icw - textLine.addTextChar(charData = it, start = paddingLeft + x, end = paddingLeft + x1) + if (srcList != null && it == srcReplaceChar) { + textLine.textChars.add( + TextChar( + srcList.removeFirst(), + start = paddingLeft + x, + end = paddingLeft + x1, + isImage = true + ) + ) + } else { + textLine.textChars.add( + TextChar( + it, start = paddingLeft + x, end = paddingLeft + x1 + ) + ) + } x = x1 } val words1 = words.copyOfRange(bodyIndent.length, words.size) - addCharsToLineMiddle(textLine, words1, textPaint, desiredWidth, x) + addCharsToLineMiddle(textLine, words1, textPaint, desiredWidth, x, srcList) } /** @@ -281,9 +351,10 @@ object ChapterProvider { textPaint: TextPaint, desiredWidth: Float, startX: Float, + srcList: LinkedList? ) { if (!ReadBookConfig.textFullJustify) { - addCharsToLineLast(textLine, words, textPaint, startX) + addCharsToLineLast(textLine, words, textPaint, startX, srcList) return } val gapCount: Int = words.lastIndex @@ -292,7 +363,22 @@ object ChapterProvider { words.forEachIndexed { index, s -> val cw = StaticLayout.getDesiredWidth(s, textPaint) val x1 = if (index != words.lastIndex) (x + cw + d) else (x + cw) - textLine.addTextChar(charData = s, start = paddingLeft + x, end = paddingLeft + x1) + if (srcList != null && s == srcReplaceChar) { + textLine.textChars.add( + TextChar( + srcList.removeFirst(), + start = paddingLeft + x, + end = paddingLeft + x1, + isImage = true + ) + ) + } else { + textLine.textChars.add( + TextChar( + s, start = paddingLeft + x, end = paddingLeft + x1 + ) + ) + } x = x1 } exceed(textLine, words) @@ -306,12 +392,28 @@ object ChapterProvider { words: Array, textPaint: TextPaint, startX: Float, + srcList: LinkedList? ) { var x = startX words.forEach { val cw = StaticLayout.getDesiredWidth(it, textPaint) val x1 = x + cw - textLine.addTextChar(charData = it, start = paddingLeft + x, end = paddingLeft + x1) + if (srcList != null && it == srcReplaceChar) { + textLine.textChars.add( + TextChar( + srcList.removeFirst(), + start = paddingLeft + x, + end = paddingLeft + x1, + isImage = true + ) + ) + } else { + textLine.textChars.add( + TextChar( + it, start = paddingLeft + x, end = paddingLeft + x1 + ) + ) + } x = x1 } exceed(textLine, words) @@ -355,13 +457,13 @@ object ChapterProvider { return kotlin.runCatching { when { fontPath.isContentScheme() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> { - val fd = App.INSTANCE.contentResolver + val fd = appCtx.contentResolver .openFileDescriptor(Uri.parse(fontPath), "r")!! .fileDescriptor Typeface.Builder(fd).build() } fontPath.isContentScheme() -> { - Typeface.createFromFile(RealPathUtil.getPath(App.INSTANCE, Uri.parse(fontPath))) + Typeface.createFromFile(RealPathUtil.getPath(appCtx, Uri.parse(fontPath))) } fontPath.isNotEmpty() -> Typeface.createFromFile(fontPath) else -> when (AppConfig.systemTypefaces) { diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt index c269a7e55..c124d48a6 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt @@ -61,6 +61,7 @@ object ImageProvider { } } + @Synchronized fun clearAllCache() { cache.forEach { indexCache -> indexCache.value.forEach { @@ -70,6 +71,7 @@ object ImageProvider { cache.clear() } + @Synchronized fun clearOut(chapterIndex: Int) { cache.forEach { indexCache -> if (indexCache.key !in chapterIndex - 1..chapterIndex + 1) { diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ZhLayout.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ZhLayout.kt new file mode 100644 index 000000000..1972f93ef --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ZhLayout.kt @@ -0,0 +1,259 @@ +package io.legado.app.ui.book.read.page.provider + +import android.graphics.Rect +import android.text.Layout +import android.text.StaticLayout +import android.text.TextPaint +import io.legado.app.utils.toStringArray +import kotlin.math.max + +/** + * 针对中文的断行排版处理-by hoodie13 + * 因为StaticLayout对标点处理不符合国人习惯,继承Layout + * */ +@Suppress("MemberVisibilityCanBePrivate", "unused") +class ZhLayout( + text: String, + textPaint: TextPaint, + width: Int +) : Layout(text, textPaint, width, Alignment.ALIGN_NORMAL, 0f, 0f) { + private val defaultCapacity = 10 + var lineStart = IntArray(defaultCapacity) + var lineWidth = FloatArray(defaultCapacity) + private var lineCount = 0 + private val curPaint = textPaint + private val cnCharWitch = getDesiredWidth("我", textPaint) + + enum class BreakMod { NORMAL, BREAK_ONE_CHAR, BREAK_MORE_CHAR, CPS_1, CPS_2, CPS_3, } + class Locate { + var start: Float = 0f + var end: Float = 0f + } + + class Interval { + var total: Float = 0f + var single: Float = 0f + } + + init { + var line = 0 + val words = text.toStringArray() + var lineW = 0f + var cwPre = 0f + + words.forEachIndexed { index, s -> + val cw = getDesiredWidth(s, curPaint) + var breakMod: BreakMod + var breakLine = false + lineW += cw + var offset = 0f + var breakCharCnt = 0 + + if (lineW > width) { + /*禁止在行尾的标点处理*/ + breakMod = if (index >= 1 && isPrePanc(words[index - 1])) { + if (index >= 2 && isPrePanc(words[index - 2])) BreakMod.CPS_2//如果后面还有一个禁首标点则异常 + else BreakMod.BREAK_ONE_CHAR //无异常场景 + } + /*禁止在行首的标点处理*/ + else if (isPostPanc(words[index])) { + if (index >= 1 && isPostPanc(words[index - 1])) BreakMod.CPS_1//如果后面还有一个禁首标点则异常,不过三个连续行尾标点的用法不通用 + else if (index >= 2 && isPrePanc(words[index - 2])) BreakMod.CPS_3//如果后面还有一个禁首标点则异常 + else BreakMod.BREAK_ONE_CHAR //无异常场景 + } else { + BreakMod.NORMAL //无异常场景 + } + + /*判断上述逻辑解决不了的特殊情况*/ + var reCheck = false + var breakIndex = 0 + if (breakMod == BreakMod.CPS_1 && + (inCompressible(words[index]) || inCompressible(words[index - 1])) + ) reCheck = true + if (breakMod == BreakMod.CPS_2 && + (inCompressible(words[index - 1]) || inCompressible(words[index - 2])) + ) reCheck = true + if (breakMod == BreakMod.CPS_3 && + (inCompressible(words[index]) || inCompressible(words[index - 2])) + ) reCheck = true + if (breakMod > BreakMod.BREAK_MORE_CHAR + && index < words.lastIndex && isPostPanc(words[index + 1]) + ) reCheck = true + + /*特殊标点使用难保证显示效果,所以不考虑间隔,直接查找到能满足条件的分割字*/ + if (reCheck && index > 2) { + breakMod = BreakMod.NORMAL + for (i in (index) downTo 1) { + if (i == index) { + breakIndex = 0 + cwPre = 0f + } else { + breakIndex++ + cwPre += StaticLayout.getDesiredWidth(words[i], textPaint) + } + if (!isPostPanc(words[i]) && !isPrePanc(words[i - 1])) { + breakMod = BreakMod.BREAK_MORE_CHAR + break + } + } + } + + when (breakMod) { + BreakMod.NORMAL -> {//模式0 正常断行 + offset = cw + lineStart[line + 1] = index + breakCharCnt = 1 + } + BreakMod.BREAK_ONE_CHAR -> {//模式1 当前行下移一个字 + offset = cw + cwPre + lineStart[line + 1] = index - 1 + breakCharCnt = 2 + } + BreakMod.BREAK_MORE_CHAR -> {//模式2 当前行下移多个字 + offset = cw + cwPre + lineStart[line + 1] = index - breakIndex + breakCharCnt = breakIndex + 1 + } + BreakMod.CPS_1 -> {//模式3 两个后置标点压缩 + offset = 0f + lineStart[line + 1] = index + 1 + breakCharCnt = 0 + } + BreakMod.CPS_2 -> { //模式4 前置标点压缩+前置标点压缩+字 + offset = 0f + lineStart[line + 1] = index + 1 + breakCharCnt = 0 + } + BreakMod.CPS_3 -> {//模式5 前置标点压缩+字+后置标点压缩 + offset = 0f + lineStart[line + 1] = index + 1 + breakCharCnt = 0 + } + } + breakLine = true + } + + /*当前行写满情况下的断行*/ + if (breakLine) { + lineWidth[line] = lineW - offset + lineW = offset + addLineArray(++line) + } + /*已到最后一个字符*/ + if ((words.lastIndex) == index) { + if (!breakLine) { + offset = 0f + lineStart[line + 1] = index + 1 + lineWidth[line] = lineW - offset + lineW = offset + addLineArray(++line) + } + /*写满断行、段落末尾、且需要下移字符,这种特殊情况下要额外多一行*/ + else if (breakCharCnt > 0) { + lineStart[line + 1] = lineStart[line] + breakCharCnt + lineWidth[line] = lineW + addLineArray(++line) + } + } + cwPre = cw + } + + lineCount = line + + } + + private fun addLineArray(line: Int) { + if (lineStart.size <= line + 1) { + lineStart = lineStart.copyOf(line + defaultCapacity) + lineWidth = lineWidth.copyOf(line + defaultCapacity) + } + } + + private fun isPostPanc(string: String): Boolean { + val panc = arrayOf( + ",", "。", ":", "?", "!", "、", "”", "’", ")", "》", "}", + "】", ")", ">", "]", "}", ",", ".", "?", "!", ":", "」", ";", ";" + ) + panc.forEach { + if (it == string) return true + } + return false + } + + private fun isPrePanc(string: String): Boolean { + val panc = arrayOf("“", "(", "《", "【", "‘", "‘", "(", "<", "[", "{", "「") + panc.forEach { + if (it == string) return true + } + return false + } + + private fun inCompressible(string: String): Boolean { + return getDesiredWidth(string, curPaint) < cnCharWitch + } + + private val gap = (cnCharWitch / 12.75).toFloat() + private fun getPostPancOffset(string: String): Float { + val textRect = Rect() + curPaint.getTextBounds(string, 0, 1, textRect) + return max(textRect.left.toFloat() - gap, 0f) + } + + private fun getPrePancOffset(string: String): Float { + val textRect = Rect() + curPaint.getTextBounds(string, 0, 1, textRect) + val d = max(cnCharWitch - textRect.right.toFloat() - gap, 0f) + return cnCharWitch / 2 - d + } + + fun getDesiredWidth(sting: String, paint: TextPaint) = paint.measureText(sting) + + override fun getLineCount(): Int { + return lineCount + } + + override fun getLineTop(line: Int): Int { + return 0 + } + + override fun getLineDescent(line: Int): Int { + return 0 + } + + override fun getLineStart(line: Int): Int { + return lineStart[line] + } + + override fun getParagraphDirection(line: Int): Int { + return 0 + } + + override fun getLineContainsTab(line: Int): Boolean { + return true + } + + override fun getLineDirections(line: Int): Directions? { + return null + } + + override fun getTopPadding(): Int { + return 0 + } + + override fun getBottomPadding(): Int { + return 0 + } + + override fun getLineWidth(line: Int): Float { + return lineWidth[line] + } + + override fun getEllipsisStart(line: Int): Int { + return 0 + } + + override fun getEllipsisCount(line: Int): Int { + return 0 + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/search/BookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/search/BookAdapter.kt index 3f27b52c6..40bcd0ed3 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/BookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/BookAdapter.kt @@ -6,7 +6,7 @@ import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.data.entities.Book import io.legado.app.databinding.ItemFilletTextBinding -import org.jetbrains.anko.sdk27.listeners.onClick + class BookAdapter(context: Context, val callBack: CallBack) : RecyclerAdapter(context) { @@ -28,7 +28,7 @@ class BookAdapter(context: Context, val callBack: CallBack) : override fun registerListener(holder: ItemViewHolder, binding: ItemFilletTextBinding) { holder.itemView.apply { - onClick { + setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.showBookInfo(it) } diff --git a/app/src/main/java/io/legado/app/ui/book/search/HistoryKeyAdapter.kt b/app/src/main/java/io/legado/app/ui/book/search/HistoryKeyAdapter.kt index 15c0695c9..6b377c0ca 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/HistoryKeyAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/HistoryKeyAdapter.kt @@ -1,18 +1,16 @@ package io.legado.app.ui.book.search import android.view.ViewGroup -import io.legado.app.App import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.data.appDb import io.legado.app.data.entities.SearchKeyword import io.legado.app.databinding.ItemFilletTextBinding import io.legado.app.ui.widget.anima.explosion_field.ExplosionField import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.sdk27.listeners.onLongClick - +import splitties.views.onLongClick class HistoryKeyAdapter(activity: SearchActivity, val callBack: CallBack) : RecyclerAdapter(activity) { @@ -36,21 +34,18 @@ class HistoryKeyAdapter(activity: SearchActivity, val callBack: CallBack) : override fun registerListener(holder: ItemViewHolder, binding: ItemFilletTextBinding) { holder.itemView.apply { - onClick { + setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.searchHistory(it.word) } } onLongClick { - it?.let { - explosionField.explode(it, true) - } + explosionField.explode(this, true) getItem(holder.layoutPosition)?.let { GlobalScope.launch(IO) { - App.db.searchKeywordDao.delete(it) + appDb.searchKeywordDao.delete(it) } } - true } } } diff --git a/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt b/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt index 3f1d377bb..fcaa0d1fe 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt @@ -6,16 +6,17 @@ import android.view.Menu import android.view.MenuItem import android.view.View.GONE import android.view.View.VISIBLE +import androidx.activity.viewModels import androidx.appcompat.widget.SearchView import androidx.lifecycle.LiveData import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.flexbox.FlexboxLayoutManager -import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.AppPattern import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.SearchBook import io.legado.app.data.entities.SearchKeyword @@ -28,9 +29,6 @@ import io.legado.app.utils.* import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.startActivity - class SearchActivity : VMBaseActivity(), BookAdapter.CallBack, @@ -38,7 +36,7 @@ class SearchActivity : VMBaseActivity groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) @@ -274,7 +272,7 @@ class SearchActivity : VMBaseActivity searchBook?.let { - startActivity( - Pair("name", it.name), - Pair("author", it.author) - ) + startActivity { + putExtra("name", it.name) + putExtra("author", it.author) + } } } } @@ -345,10 +343,10 @@ class SearchActivity : VMBaseActivity( - Pair("name", book.name), - Pair("author", book.author) - ) + startActivity { + putExtra("name", book.name) + putExtra("author", book.author) + } } /** @@ -360,7 +358,7 @@ class SearchActivity : VMBaseActivity { searchView.setQuery(key, true) } - withContext(IO) { App.db.bookDao.findByName(key).isEmpty() } -> { + withContext(IO) { appDb.bookDao.findByName(key).isEmpty() } -> { searchView.setQuery(key, true) } else -> { diff --git a/app/src/main/java/io/legado/app/ui/book/search/SearchAdapter.kt b/app/src/main/java/io/legado/app/ui/book/search/SearchAdapter.kt index 7ad9d35e0..70de12ac1 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/SearchAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/SearchAdapter.kt @@ -11,7 +11,7 @@ import io.legado.app.data.entities.SearchBook import io.legado.app.databinding.ItemSearchBinding import io.legado.app.utils.gone import io.legado.app.utils.visible -import org.jetbrains.anko.sdk27.listeners.onClick + class SearchAdapter(context: Context, val callBack: CallBack) : DiffRecyclerAdapter(context) { @@ -66,7 +66,7 @@ class SearchAdapter(context: Context, val callBack: CallBack) : } override fun registerListener(holder: ItemViewHolder, binding: ItemSearchBinding) { - binding.root.onClick { + binding.root.setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.showBookInfo(it.name, it.author) } diff --git a/app/src/main/java/io/legado/app/ui/book/search/SearchViewModel.kt b/app/src/main/java/io/legado/app/ui/book/search/SearchViewModel.kt index c6b003613..2eee0dbeb 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/SearchViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/SearchViewModel.kt @@ -4,9 +4,9 @@ import android.app.Application import android.os.Handler import android.os.Looper import androidx.lifecycle.MutableLiveData -import io.legado.app.App import io.legado.app.base.BaseViewModel import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.data.entities.SearchBook import io.legado.app.data.entities.SearchKeyword import io.legado.app.model.webBook.SearchBookModel @@ -63,7 +63,7 @@ class SearchViewModel(application: Application) : BaseViewModel(application), override fun onSearchSuccess(searchBooks: ArrayList) { val precision = context.getPrefBoolean(PreferKey.precisionSearch) - App.db.searchBookDao.insert(*searchBooks.toTypedArray()) + appDb.searchBookDao.insert(*searchBooks.toTypedArray()) mergeItems(this, searchBooks, precision) } @@ -146,7 +146,7 @@ class SearchViewModel(application: Application) : BaseViewModel(application), */ fun getSearchBook(name: String, author: String, success: ((searchBook: SearchBook?) -> Unit)?) { execute { - val searchBook = App.db.searchBookDao.getFirstByNameAuthor(name, author) + val searchBook = appDb.searchBookDao.getFirstByNameAuthor(name, author) success?.invoke(searchBook) } } @@ -156,10 +156,10 @@ class SearchViewModel(application: Application) : BaseViewModel(application), */ fun saveSearchKey(key: String) { execute { - App.db.searchKeywordDao.get(key)?.let { + appDb.searchKeywordDao.get(key)?.let { it.usage = it.usage + 1 - App.db.searchKeywordDao.update(it) - } ?: App.db.searchKeywordDao.insert(SearchKeyword(key, 1)) + appDb.searchKeywordDao.update(it) + } ?: appDb.searchKeywordDao.insert(SearchKeyword(key, 1)) } } @@ -168,7 +168,7 @@ class SearchViewModel(application: Application) : BaseViewModel(application), */ fun clearHistory() { execute { - App.db.searchKeywordDao.deleteAll() + appDb.searchKeywordDao.deleteAll() } } diff --git a/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentActivity.kt b/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentActivity.kt index a111a8cf2..aa433c6c8 100644 --- a/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentActivity.kt @@ -3,12 +3,13 @@ package io.legado.app.ui.book.searchContent import android.annotation.SuppressLint import android.content.Intent import android.os.Bundle +import androidx.activity.viewModels import androidx.appcompat.widget.SearchView import com.hankcs.hanlp.HanLP -import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseActivity 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.databinding.ActivitySearchContentBinding @@ -21,12 +22,10 @@ import io.legado.app.lib.theme.primaryTextColor import io.legado.app.ui.widget.recycler.UpLinearLayoutManager import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.ColorUtils -import io.legado.app.utils.getViewModel import io.legado.app.utils.observeEvent import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.jetbrains.anko.sdk27.listeners.onClick class SearchContentActivity : @@ -34,7 +33,7 @@ class SearchContentActivity : SearchContentAdapter.Callback { override val viewModel: SearchContentViewModel - get() = getViewModel(SearchContentViewModel::class.java) + by viewModels() lateinit var adapter: SearchContentAdapter private lateinit var mLayoutManager: UpLinearLayoutManager private lateinit var searchView: SearchView @@ -93,8 +92,13 @@ class SearchContentActivity : } private fun initView() { - binding.ivSearchContentTop.onClick { mLayoutManager.scrollToPositionWithOffset(0, 0) } - binding.ivSearchContentBottom.onClick { + binding.ivSearchContentTop.setOnClickListener { + mLayoutManager.scrollToPositionWithOffset( + 0, + 0 + ) + } + binding.ivSearchContentBottom.setOnClickListener { if (adapter.itemCount > 0) { mLayoutManager.scrollToPositionWithOffset(adapter.itemCount - 1, 0) } @@ -144,7 +148,7 @@ class SearchContentActivity : viewModel.lastQuery = newText var searchResults = listOf() launch(Dispatchers.Main) { - App.db.bookChapterDao.getChapterList(viewModel.bookUrl).map { chapter -> + appDb.bookChapterDao.getChapterList(viewModel.bookUrl).map { chapter -> withContext(Dispatchers.IO) { if (isLocalBook || adapter.cacheFileNames.contains(chapter.getFileName()) diff --git a/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentAdapter.kt b/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentAdapter.kt index f65042827..10a3502df 100644 --- a/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentAdapter.kt @@ -9,7 +9,7 @@ import io.legado.app.databinding.ItemSearchListBinding import io.legado.app.lib.theme.accentColor import io.legado.app.utils.getCompatColor import io.legado.app.utils.hexString -import org.jetbrains.anko.sdk27.listeners.onClick + class SearchContentAdapter(context: Context, val callback: Callback) : RecyclerAdapter(context) { @@ -38,7 +38,7 @@ class SearchContentAdapter(context: Context, val callback: Callback) : } override fun registerListener(holder: ItemViewHolder, binding: ItemSearchListBinding) { - holder.itemView.onClick { + holder.itemView.setOnClickListener { getItem(holder.layoutPosition)?.let { callback.openSearchResult(it) } diff --git a/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentViewModel.kt b/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentViewModel.kt index a3b996470..94cb50d51 100644 --- a/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentViewModel.kt @@ -2,8 +2,8 @@ package io.legado.app.ui.book.searchContent import android.app.Application -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.help.ContentProcessor @@ -16,7 +16,7 @@ class SearchContentViewModel(application: Application) : BaseViewModel(applicati fun initBook(bookUrl: String, success: () -> Unit) { this.bookUrl = bookUrl execute { - book = App.db.bookDao.getBook(bookUrl) + book = appDb.bookDao.getBook(bookUrl) book?.let { contentProcessor = ContentProcessor(it.name, it.origin) } diff --git a/app/src/main/java/io/legado/app/ui/book/source/debug/BookSourceDebugActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/debug/BookSourceDebugActivity.kt index 42b2e2ccd..fb11c3cfd 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/debug/BookSourceDebugActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/debug/BookSourceDebugActivity.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.os.Bundle import android.view.Menu import android.view.MenuItem +import androidx.activity.viewModels import androidx.appcompat.widget.SearchView import io.legado.app.R import io.legado.app.base.VMBaseActivity @@ -13,15 +14,15 @@ import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.accentColor import io.legado.app.ui.qrcode.QrCodeActivity import io.legado.app.ui.widget.dialog.TextDialog -import io.legado.app.utils.getViewModel +import io.legado.app.utils.startActivityForResult + +import io.legado.app.utils.toastOnUi import kotlinx.coroutines.launch -import org.jetbrains.anko.startActivityForResult -import org.jetbrains.anko.toast class BookSourceDebugActivity : VMBaseActivity() { override val viewModel: BookSourceDebugModel - get() = getViewModel(BookSourceDebugModel::class.java) + by viewModels() private lateinit var adapter: BookSourceDebugAdapter private lateinit var searchView: SearchView @@ -83,7 +84,7 @@ class BookSourceDebugActivity : VMBaseActivity getSource().let { source -> if (checkSource(source)) { viewModel.save(source) { - startActivity(Pair("key", source.bookSourceUrl)) + startActivity { + putExtra("key", source.bookSourceUrl) + } } } } @@ -98,19 +101,20 @@ class BookSourceEditActivity : R.id.menu_qr_code_camera -> startActivityForResult(qrRequestCode) R.id.menu_share_str -> share(GSON.toJson(getSource())) R.id.menu_share_qr -> shareWithQr( - getString(R.string.share_book_source), - GSON.toJson(getSource()) + GSON.toJson(getSource()), + getString(R.string.share_book_source) ) R.id.menu_help -> showRuleHelp() R.id.menu_login -> getSource().let { if (checkSource(it)) { if (it.loginUrl.isNullOrEmpty()) { - toast(R.string.source_no_login) + toastOnUi(R.string.source_no_login) } else { - startActivity( - Pair("sourceUrl", it.bookSourceUrl), - Pair("loginUrl", it.loginUrl) - ) + startActivity { + putExtra("sourceUrl", it.bookSourceUrl) + putExtra("loginUrl", it.loginUrl) + putExtra("userAgent", it.getHeaderMap()[AppConst.UA_NAME]) + } } } } @@ -144,7 +148,7 @@ class BookSourceEditActivity : val source = getSource() if (!source.equal(viewModel.bookSource ?: BookSource())) { alert(R.string.exit) { - messageResource = R.string.exit_no_save + setMessage(R.string.exit_no_save) positiveButton(R.string.yes) negativeButton(R.string.no) { super.finish() @@ -357,7 +361,7 @@ class BookSourceEditActivity : private fun checkSource(source: BookSource): Boolean { if (source.bookSourceUrl.isBlank() || source.bookSourceName.isBlank()) { - toast(R.string.non_null_name_url) + toastOnUi(R.string.non_null_name_url) return false } return true @@ -448,7 +452,7 @@ class BookSourceEditActivity : val rect = Rect() // 获取当前页面窗口的显示范围 window.decorView.getWindowVisibleDisplayFrame(rect) - val screenHeight = this@BookSourceEditActivity.displayMetrics.heightPixels + val screenHeight = this@BookSourceEditActivity.getSize().heightPixels val keyboardHeight = screenHeight - rect.bottom // 输入法的高度 val preShowing = mIsSoftKeyBoardShowing if (abs(keyboardHeight) > screenHeight / 5) { diff --git a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditViewModel.kt b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditViewModel.kt index e1c7d4d2c..52818c97e 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditViewModel.kt @@ -2,8 +2,8 @@ package io.legado.app.ui.book.source.edit import android.app.Application import android.content.Intent -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.help.storage.OldRule import io.legado.app.utils.GSON @@ -21,7 +21,7 @@ class BookSourceEditViewModel(application: Application) : BaseViewModel(applicat val key = intent.getStringExtra("data") var source: BookSource? = null if (key != null) { - source = App.db.bookSourceDao.getBookSource(key) + source = appDb.bookSourceDao.getBookSource(key) } source?.let { oldSourceUrl = it.bookSourceUrl @@ -36,16 +36,17 @@ class BookSourceEditViewModel(application: Application) : BaseViewModel(applicat execute { oldSourceUrl?.let { if (oldSourceUrl != source.bookSourceUrl) { - App.db.bookSourceDao.delete(it) + appDb.bookSourceDao.delete(it) } } oldSourceUrl = source.bookSourceUrl - App.db.bookSourceDao.insert(source) + source.lastUpdateTime = System.currentTimeMillis() + appDb.bookSourceDao.insert(source) bookSource = source }.onSuccess { success?.invoke() }.onError { - toast(it.localizedMessage) + toastOnUi(it.localizedMessage) it.printStackTrace() } } @@ -58,13 +59,13 @@ class BookSourceEditViewModel(application: Application) : BaseViewModel(applicat } source }.onError { - toast(it.localizedMessage) + toastOnUi(it.localizedMessage) it.printStackTrace() }.onSuccess { if (it != null) { onSuccess(it) } else { - toast("格式不对") + toastOnUi("格式不对") } } } @@ -76,7 +77,7 @@ class BookSourceEditViewModel(application: Application) : BaseViewModel(applicat finally.invoke(it) } }.onError { - toast(it.localizedMessage ?: "Error") + toastOnUi(it.localizedMessage ?: "Error") } } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt index aa78e4a5b..f9655fdb8 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt @@ -7,17 +7,18 @@ import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.view.SubMenu +import androidx.activity.viewModels import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.SearchView import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.LiveData import androidx.recyclerview.widget.ItemTouchHelper import com.google.android.material.snackbar.Snackbar -import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.AppPattern import io.legado.app.constant.EventBus +import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.databinding.ActivityBookSourceBinding import io.legado.app.databinding.DialogEditTextBinding @@ -28,6 +29,7 @@ import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.primaryTextColor import io.legado.app.service.help.CheckSource import io.legado.app.ui.association.ImportBookSourceActivity +import io.legado.app.ui.book.source.debug.BookSourceDebugActivity import io.legado.app.ui.book.source.edit.BookSourceEditActivity import io.legado.app.ui.filepicker.FilePicker import io.legado.app.ui.filepicker.FilePickerDialog @@ -38,9 +40,6 @@ import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.* -import org.jetbrains.anko.startActivity -import org.jetbrains.anko.startActivityForResult -import org.jetbrains.anko.toast import java.io.File class BookSourceActivity : VMBaseActivity(), @@ -50,7 +49,7 @@ class BookSourceActivity : VMBaseActivity { - App.db.bookSourceDao.liveDataAll() + appDb.bookSourceDao.liveDataAll() } searchKey == getString(R.string.enabled) -> { - App.db.bookSourceDao.liveDataEnabled() + appDb.bookSourceDao.liveDataEnabled() } searchKey == getString(R.string.disabled) -> { - App.db.bookSourceDao.liveDataDisabled() + appDb.bookSourceDao.liveDataDisabled() } searchKey.startsWith("group:") -> { val key = searchKey.substringAfter("group:") - App.db.bookSourceDao.liveDataGroupSearch("%$key%") + appDb.bookSourceDao.liveDataGroupSearch("%$key%") } else -> { - App.db.bookSourceDao.liveDataSearch("%$searchKey%") + appDb.bookSourceDao.liveDataSearch("%$searchKey%") } }.apply { observe(this@BookSourceActivity, { data -> @@ -247,7 +246,7 @@ class BookSourceActivity : VMBaseActivity groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) @@ -304,7 +303,7 @@ class BookSourceActivity : VMBaseActivity(Pair("source", it)) + startActivity { + putExtra("source", it) + } } } cancelButton() @@ -412,7 +413,7 @@ class BookSourceActivity : VMBaseActivity if (group.contains("失效")) { searchView.setQuery("失效", true) - toast("发现有失效书源,已为您自动筛选!") + toastOnUi("发现有失效书源,已为您自动筛选!") } } } @@ -443,7 +444,9 @@ class BookSourceActivity : VMBaseActivity(Pair("data", bookSource.bookSourceUrl)) + startActivity { + putExtra("data", bookSource.bookSourceUrl) + } } override fun upOrder() { @@ -458,12 +461,20 @@ class BookSourceActivity : VMBaseActivity { + putExtra("key", bookSource.bookSourceUrl) + } + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { qrRequestCode -> if (resultCode == RESULT_OK) { data?.getStringExtra("result")?.let { - startActivity("source" to it) + startActivity { + putExtra("source", it) + } } } importRequestCode -> if (resultCode == Activity.RESULT_OK) { @@ -471,10 +482,12 @@ class BookSourceActivity : VMBaseActivity("dataKey" to dataKey) + startActivity { + putExtra("dataKey", dataKey) + } } } catch (e: Exception) { - toast("readTextError:${e.localizedMessage}") + toastOnUi("readTextError:${e.localizedMessage}") } } } diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt index 1545a3108..7d41628d1 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt @@ -18,9 +18,10 @@ import io.legado.app.databinding.ItemBookSourceBinding import io.legado.app.lib.theme.backgroundColor import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback.Callback +import io.legado.app.utils.ColorUtils import io.legado.app.utils.invisible import io.legado.app.utils.visible -import org.jetbrains.anko.sdk27.listeners.onClick + class BookSourceAdapter(context: Context, val callBack: CallBack) : RecyclerAdapter(context), @@ -86,7 +87,7 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) : with(binding) { val payload = payloads.getOrNull(0) as? Bundle if (payload == null) { - root.setBackgroundColor(context.backgroundColor) + root.setBackgroundColor(ColorUtils.withAlpha(context.backgroundColor, 0.5f)) if (item.bookSourceGroup.isNullOrEmpty()) { cbBookSource.text = item.bookSourceName } else { @@ -132,12 +133,12 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) : } } } - ivEdit.onClick { + ivEdit.setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.edit(it) } } - ivMenuMore.onClick { + ivMenuMore.setOnClickListener { showMenu(ivMenuMore, holder.layoutPosition) } } @@ -165,6 +166,7 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) : when (menuItem.itemId) { R.id.menu_top -> callBack.toTop(source) R.id.menu_bottom -> callBack.toBottom(source) + R.id.menu_debug_source -> callBack.debug(source) R.id.menu_del -> callBack.del(source) R.id.menu_enable_explore -> { callBack.update(source.copy(enabledExplore = !source.enabledExplore)) @@ -279,6 +281,7 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) : fun update(vararg bookSource: BookSource) fun toTop(bookSource: BookSource) fun toBottom(bookSource: BookSource) + fun debug(bookSource: BookSource) fun upOrder() fun upCountView() } diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt index 25094113f..92fb7e4fa 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt @@ -5,52 +5,51 @@ import android.content.Intent import android.text.TextUtils import androidx.core.content.FileProvider import androidx.documentfile.provider.DocumentFile -import io.legado.app.App import io.legado.app.BuildConfig import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppPattern +import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.utils.* -import org.jetbrains.anko.longToast import java.io.File class BookSourceViewModel(application: Application) : BaseViewModel(application) { fun topSource(vararg sources: BookSource) { execute { - val minOrder = App.db.bookSourceDao.minOrder - 1 + val minOrder = appDb.bookSourceDao.minOrder - 1 sources.forEachIndexed { index, bookSource -> bookSource.customOrder = minOrder - index } - App.db.bookSourceDao.update(*sources) + appDb.bookSourceDao.update(*sources) } } fun bottomSource(vararg sources: BookSource) { execute { - val maxOrder = App.db.bookSourceDao.maxOrder + 1 + val maxOrder = appDb.bookSourceDao.maxOrder + 1 sources.forEachIndexed { index, bookSource -> bookSource.customOrder = maxOrder + index } - App.db.bookSourceDao.update(*sources) + appDb.bookSourceDao.update(*sources) } } fun del(bookSource: BookSource) { - execute { App.db.bookSourceDao.delete(bookSource) } + execute { appDb.bookSourceDao.delete(bookSource) } } fun update(vararg bookSource: BookSource) { - execute { App.db.bookSourceDao.update(*bookSource) } + execute { appDb.bookSourceDao.update(*bookSource) } } fun upOrder() { execute { - val sources = App.db.bookSourceDao.all + val sources = appDb.bookSourceDao.all for ((index: Int, source: BookSource) in sources.withIndex()) { source.customOrder = index + 1 } - App.db.bookSourceDao.update(*sources.toTypedArray()) + appDb.bookSourceDao.update(*sources.toTypedArray()) } } @@ -60,7 +59,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) sources.forEach { list.add(it.copy(enabled = true)) } - App.db.bookSourceDao.update(*list.toTypedArray()) + appDb.bookSourceDao.update(*list.toTypedArray()) } } @@ -70,7 +69,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) sources.forEach { list.add(it.copy(enabled = false)) } - App.db.bookSourceDao.update(*list.toTypedArray()) + appDb.bookSourceDao.update(*list.toTypedArray()) } } @@ -80,7 +79,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) sources.forEach { list.add(it.copy(enabledExplore = true)) } - App.db.bookSourceDao.update(*list.toTypedArray()) + appDb.bookSourceDao.update(*list.toTypedArray()) } } @@ -90,7 +89,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) sources.forEach { list.add(it.copy(enabledExplore = false)) } - App.db.bookSourceDao.update(*list.toTypedArray()) + appDb.bookSourceDao.update(*list.toTypedArray()) } } @@ -109,7 +108,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) val newGroup = ArrayList(lh).joinToString(separator = ",") list.add(source.copy(bookSourceGroup = newGroup)) } - App.db.bookSourceDao.update(*list.toTypedArray()) + appDb.bookSourceDao.update(*list.toTypedArray()) } } @@ -128,13 +127,13 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) val newGroup = ArrayList(lh).joinToString(separator = ",") list.add(source.copy(bookSourceGroup = newGroup)) } - App.db.bookSourceDao.update(*list.toTypedArray()) + appDb.bookSourceDao.update(*list.toTypedArray()) } } fun delSelection(sources: List) { execute { - App.db.bookSourceDao.delete(*sources.toTypedArray()) + appDb.bookSourceDao.delete(*sources.toTypedArray()) } } @@ -144,9 +143,9 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) FileUtils.createFileIfNotExist(file, "exportBookSource.json") .writeText(json) }.onSuccess { - context.longToast("成功导出至\n${file.absolutePath}") + context.longToastOnUi("成功导出至\n${file.absolutePath}") }.onError { - context.longToast("导出失败\n${it.localizedMessage}") + context.longToastOnUi("导出失败\n${it.localizedMessage}") } } @@ -157,9 +156,9 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) doc.createFile("", "exportBookSource.json") ?.writeText(context, json) }.onSuccess { - context.longToast("成功导出至\n${doc.uri.path}") + context.longToastOnUi("成功导出至\n${doc.uri.path}") }.onError { - context.longToast("导出失败\n${it.localizedMessage}") + context.longToastOnUi("导出失败\n${it.localizedMessage}") } } @@ -181,23 +180,23 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) }.onSuccess { success.invoke(it) }.onError { - toast(it.msg) + toastOnUi(it.msg) } } fun addGroup(group: String) { execute { - val sources = App.db.bookSourceDao.noGroup + val sources = appDb.bookSourceDao.noGroup sources.map { source -> source.bookSourceGroup = group } - App.db.bookSourceDao.update(*sources.toTypedArray()) + appDb.bookSourceDao.update(*sources.toTypedArray()) } } fun upGroup(oldGroup: String, newGroup: String?) { execute { - val sources = App.db.bookSourceDao.getByGroup(oldGroup) + val sources = appDb.bookSourceDao.getByGroup(oldGroup) sources.map { source -> source.bookSourceGroup?.splitNotBlank(",")?.toHashSet()?.let { it.remove(oldGroup) @@ -206,18 +205,18 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) source.bookSourceGroup = TextUtils.join(",", it) } } - App.db.bookSourceDao.update(*sources.toTypedArray()) + appDb.bookSourceDao.update(*sources.toTypedArray()) } } fun delGroup(group: String) { execute { execute { - val sources = App.db.bookSourceDao.getByGroup(group) + val sources = appDb.bookSourceDao.getByGroup(group) sources.map { source -> source.removeGroup(group) } - App.db.bookSourceDao.update(*sources.toTypedArray()) + appDb.bookSourceDao.update(*sources.toTypedArray()) } } } diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/GroupManageDialog.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/GroupManageDialog.kt index 45e973c8b..c3fab473d 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/GroupManageDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/GroupManageDialog.kt @@ -9,12 +9,13 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar import androidx.fragment.app.DialogFragment +import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.LinearLayoutManager -import io.legado.app.App import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.constant.AppPattern +import io.legado.app.data.appDb import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogRecyclerViewBinding import io.legado.app.databinding.ItemGroupManageBinding @@ -22,12 +23,15 @@ import io.legado.app.lib.dialogs.alert import io.legado.app.lib.theme.backgroundColor import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.widget.recycler.VerticalDivider -import io.legado.app.utils.* +import io.legado.app.utils.applyTint +import io.legado.app.utils.getSize +import io.legado.app.utils.requestInputMethod +import io.legado.app.utils.splitNotBlank import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onClick + class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { - private lateinit var viewModel: BookSourceViewModel + private val viewModel: BookSourceViewModel by activityViewModels() private lateinit var adapter: GroupAdapter private val binding by viewBinding(DialogRecyclerViewBinding::bind) @@ -42,7 +46,6 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { container: ViewGroup?, savedInstanceState: Bundle? ): View? { - viewModel = getViewModelOfActivity(BookSourceViewModel::class.java) return inflater.inflate(R.layout.dialog_recycler_view, container) } @@ -62,7 +65,7 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { } private fun initData() { - App.db.bookSourceDao.liveGroup().observe(viewLifecycleOwner, { + appDb.bookSourceDao.liveGroup().observe(viewLifecycleOwner, { val groups = linkedSetOf() it.map { group -> groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) @@ -83,7 +86,7 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { alert(title = getString(R.string.add_group)) { val alertBinding = DialogEditTextBinding.inflate(layoutInflater) alertBinding.editView.setHint(R.string.group_name) - customView = alertBinding.root + customView { alertBinding.root } yesButton { alertBinding.editView.text?.toString()?.let { if (it.isNotBlank()) { @@ -100,7 +103,8 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { alert(title = getString(R.string.group_edit)) { val alertBinding = DialogEditTextBinding.inflate(layoutInflater) alertBinding.editView.setHint(R.string.group_name) - customView = alertBinding.root + alertBinding.editView.setText(group) + customView { alertBinding.root } yesButton { viewModel.upGroup(group, alertBinding.editView.text?.toString()) } @@ -129,12 +133,12 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { override fun registerListener(holder: ItemViewHolder, binding: ItemGroupManageBinding) { binding.apply { - tvEdit.onClick { + tvEdit.setOnClickListener { getItem(holder.layoutPosition)?.let { editGroup(it) } } - tvDel.onClick { + tvDel.setOnClickListener { getItem(holder.layoutPosition)?.let { viewModel.delGroup(it) } } } diff --git a/app/src/main/java/io/legado/app/ui/book/toc/BookmarkAdapter.kt b/app/src/main/java/io/legado/app/ui/book/toc/BookmarkAdapter.kt index 914414a60..8300aa3da 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/BookmarkAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/BookmarkAdapter.kt @@ -7,9 +7,7 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import io.legado.app.data.entities.Bookmark import io.legado.app.databinding.ItemBookmarkBinding -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.sdk27.listeners.onLongClick - +import splitties.views.onLongClick class BookmarkAdapter(val callback: Callback) : PagedListAdapter(DIFF_CALLBACK) { @@ -46,12 +44,11 @@ class BookmarkAdapter(val callback: Callback) : PagedListAdapter(R.layout.fragment_bookmark), BookmarkAdapter.Callback, ChapterListViewModel.BookmarkCallBack { - override val viewModel: ChapterListViewModel - get() = getViewModelOfActivity(ChapterListViewModel::class.java) + override val viewModel: ChapterListViewModel by activityViewModels() private val binding by viewBinding(FragmentBookmarkBinding::bind) private lateinit var adapter: BookmarkAdapter private var bookmarkLiveData: LiveData>? = null @@ -52,7 +51,7 @@ class BookmarkFragment : VMBaseFragment(R.layout.fragment_ bookmarkLiveData?.removeObservers(viewLifecycleOwner) bookmarkLiveData = LivePagedListBuilder( - App.db.bookmarkDao.observeByBook(book.bookUrl, book.name, book.author), 20 + appDb.bookmarkDao.observeByBook(book.bookUrl, book.name, book.author), 20 ).build() bookmarkLiveData?.observe(viewLifecycleOwner, { adapter.submitList(it) }) } @@ -64,7 +63,7 @@ class BookmarkFragment : VMBaseFragment(R.layout.fragment_ } else { bookmarkLiveData?.removeObservers(viewLifecycleOwner) bookmarkLiveData = LivePagedListBuilder( - App.db.bookmarkDao.liveDataSearch( + appDb.bookmarkDao.liveDataSearch( viewModel.bookUrl, newText ), 20 @@ -85,24 +84,28 @@ class BookmarkFragment : VMBaseFragment(R.layout.fragment_ @SuppressLint("InflateParams") override fun onLongClick(bookmark: Bookmark) { requireContext().alert(R.string.bookmark) { - message = bookmark.chapterName + setMessage(bookmark.chapterName) val alertBinding = DialogBookmarkBinding.inflate(layoutInflater).apply { editBookText.setText(bookmark.bookText) editView.setText(bookmark.content) + editBookText.textSize = 15f + editView.textSize = 15f + editBookText.maxLines= 6 + editView.maxLines= 6 } - customView = alertBinding.root + customView { alertBinding.root } yesButton { alertBinding.apply { Coroutine.async { bookmark.bookText = editBookText.text.toString() bookmark.content = editView.text.toString() - App.db.bookmarkDao.insert(bookmark) + appDb.bookmarkDao.insert(bookmark) } } } noButton() neutralButton(R.string.delete) { - App.db.bookmarkDao.delete(bookmark) + appDb.bookmarkDao.delete(bookmark) } }.show().requestInputMethod() } diff --git a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListActivity.kt b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListActivity.kt index 4fa998b22..dfe49d6e7 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListActivity.kt @@ -2,6 +2,7 @@ package io.legado.app.ui.book.toc import android.os.Bundle import android.view.Menu +import androidx.activity.viewModels import androidx.appcompat.widget.SearchView import androidx.core.view.isGone import androidx.fragment.app.Fragment @@ -14,14 +15,14 @@ import io.legado.app.databinding.ActivityChapterListBinding import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.primaryTextColor -import io.legado.app.utils.getViewModel + import io.legado.app.utils.gone import io.legado.app.utils.visible class ChapterListActivity : VMBaseActivity() { override val viewModel: ChapterListViewModel - get() = getViewModel(ChapterListViewModel::class.java) + by viewModels() private lateinit var tabLayout: TabLayout private var searchView: SearchView? = null diff --git a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt index 13176acae..1af21f922 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt @@ -10,7 +10,7 @@ import io.legado.app.databinding.ItemChapterListBinding import io.legado.app.lib.theme.accentColor import io.legado.app.utils.getCompatColor import io.legado.app.utils.visible -import org.jetbrains.anko.sdk27.listeners.onClick + class ChapterListAdapter(context: Context, val callback: Callback) : RecyclerAdapter(context) { @@ -49,7 +49,7 @@ class ChapterListAdapter(context: Context, val callback: Callback) : } override fun registerListener(holder: ItemViewHolder, binding: ItemChapterListBinding) { - holder.itemView.onClick { + holder.itemView.setOnClickListener { getItem(holder.layoutPosition)?.let { callback.openChapter(it) } diff --git a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt index 0a4b060fb..72bca9746 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt @@ -5,11 +5,12 @@ import android.app.Activity.RESULT_OK import android.content.Intent import android.os.Bundle import android.view.View +import androidx.fragment.app.activityViewModels import androidx.lifecycle.LiveData -import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseFragment 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.databinding.FragmentChapterListBinding @@ -19,21 +20,18 @@ import io.legado.app.lib.theme.getPrimaryTextColor import io.legado.app.ui.widget.recycler.UpLinearLayoutManager import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.ColorUtils -import io.legado.app.utils.getViewModelOfActivity import io.legado.app.utils.observeEvent import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.jetbrains.anko.sdk27.listeners.onClick import kotlin.math.min class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapter_list), ChapterListAdapter.Callback, ChapterListViewModel.ChapterListCallBack { - override val viewModel: ChapterListViewModel - get() = getViewModelOfActivity(ChapterListViewModel::class.java) + override val viewModel: ChapterListViewModel by activityViewModels() private val binding by viewBinding(FragmentChapterListBinding::bind) lateinit var adapter: ChapterListAdapter private var durChapterIndex = 0 @@ -63,13 +61,13 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragme } private fun initView() = with(binding) { - ivChapterTop.onClick { mLayoutManager.scrollToPositionWithOffset(0, 0) } - ivChapterBottom.onClick { + ivChapterTop.setOnClickListener { mLayoutManager.scrollToPositionWithOffset(0, 0) } + ivChapterBottom.setOnClickListener { if (adapter.itemCount > 0) { mLayoutManager.scrollToPositionWithOffset(adapter.itemCount - 1, 0) } } - tvCurrentChapterInfo.onClick { + tvCurrentChapterInfo.setOnClickListener { mLayoutManager.scrollToPositionWithOffset(durChapterIndex, 0) } } @@ -89,7 +87,7 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragme private fun initDoc() { tocLiveData?.removeObservers(this@ChapterListFragment) - tocLiveData = App.db.bookChapterDao.observeByBook(viewModel.bookUrl) + tocLiveData = appDb.bookChapterDao.observeByBook(viewModel.bookUrl) tocLiveData?.observe(viewLifecycleOwner, { adapter.setItems(it) if (!scrollToDurChapter) { @@ -124,7 +122,7 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragme initDoc() } else { tocLiveData?.removeObservers(this) - tocLiveData = App.db.bookChapterDao.liveDataSearch(viewModel.bookUrl, newText) + tocLiveData = appDb.bookChapterDao.liveDataSearch(viewModel.bookUrl, newText) tocLiveData?.observe(viewLifecycleOwner, { adapter.setItems(it) }) diff --git a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListViewModel.kt b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListViewModel.kt index 48682630c..27f6011ae 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListViewModel.kt @@ -2,8 +2,8 @@ package io.legado.app.ui.book.toc import android.app.Application -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.Book class ChapterListViewModel(application: Application) : BaseViewModel(application) { @@ -15,7 +15,7 @@ class ChapterListViewModel(application: Application) : BaseViewModel(application fun initBook(bookUrl: String, success: () -> Unit) { this.bookUrl = bookUrl execute { - book = App.db.bookDao.getBook(bookUrl) + book = appDb.bookDao.getBook(bookUrl) }.onSuccess { success.invoke() } diff --git a/app/src/main/java/io/legado/app/ui/config/BackupRestoreUi.kt b/app/src/main/java/io/legado/app/ui/config/BackupRestoreUi.kt index 794271d3e..d538cc7a8 100644 --- a/app/src/main/java/io/legado/app/ui/config/BackupRestoreUi.kt +++ b/app/src/main/java/io/legado/app/ui/config/BackupRestoreUi.kt @@ -5,7 +5,6 @@ import android.content.Intent import android.net.Uri import androidx.documentfile.provider.DocumentFile import androidx.fragment.app.Fragment -import io.legado.app.App import io.legado.app.R import io.legado.app.constant.PreferKey import io.legado.app.help.AppConfig @@ -20,9 +19,9 @@ import io.legado.app.ui.filepicker.FilePicker import io.legado.app.utils.getPrefString import io.legado.app.utils.isContentScheme import io.legado.app.utils.longToast -import io.legado.app.utils.toast +import io.legado.app.utils.toastOnUi import kotlinx.coroutines.Dispatchers.Main -import org.jetbrains.anko.toast +import splitties.init.appCtx object BackupRestoreUi { private const val selectFolderRequestCode = 21 @@ -42,7 +41,7 @@ object BackupRestoreUi { Coroutine.async { Backup.backup(fragment.requireContext(), backupPath) }.onSuccess { - fragment.toast(R.string.backup_success) + fragment.toastOnUi(R.string.backup_success) } } else { selectBackupFolder(fragment, backupSelectRequestCode) @@ -65,7 +64,7 @@ object BackupRestoreUi { AppConfig.backupPath = path Backup.backup(fragment.requireContext(), path) }.onSuccess { - fragment.toast(R.string.backup_success) + fragment.toastOnUi(R.string.backup_success) } } .request() @@ -126,24 +125,24 @@ object BackupRestoreUi { backupSelectRequestCode -> if (resultCode == RESULT_OK) { data?.data?.let { uri -> if (uri.isContentScheme()) { - App.INSTANCE.contentResolver.takePersistableUriPermission( + appCtx.contentResolver.takePersistableUriPermission( uri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) AppConfig.backupPath = uri.toString() Coroutine.async { - Backup.backup(App.INSTANCE, uri.toString()) + Backup.backup(appCtx, uri.toString()) }.onSuccess { - App.INSTANCE.toast(R.string.backup_success) + appCtx.toastOnUi(R.string.backup_success) } } else { uri.path?.let { path -> AppConfig.backupPath = path Coroutine.async { - Backup.backup(App.INSTANCE, path) + Backup.backup(appCtx, path) }.onSuccess { - App.INSTANCE.toast(R.string.backup_success) + appCtx.toastOnUi(R.string.backup_success) } } } @@ -152,20 +151,20 @@ object BackupRestoreUi { restoreSelectRequestCode -> if (resultCode == RESULT_OK) { data?.data?.let { uri -> if (uri.isContentScheme()) { - App.INSTANCE.contentResolver.takePersistableUriPermission( + appCtx.contentResolver.takePersistableUriPermission( uri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) AppConfig.backupPath = uri.toString() Coroutine.async { - Restore.restore(App.INSTANCE, uri.toString()) + Restore.restore(appCtx, uri.toString()) } } else { uri.path?.let { path -> AppConfig.backupPath = path Coroutine.async { - Restore.restore(App.INSTANCE, path) + Restore.restore(appCtx, path) } } } @@ -174,7 +173,7 @@ object BackupRestoreUi { selectFolderRequestCode -> if (resultCode == RESULT_OK) { data?.data?.let { uri -> if (uri.isContentScheme()) { - App.INSTANCE.contentResolver.takePersistableUriPermission( + appCtx.contentResolver.takePersistableUriPermission( uri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION @@ -187,7 +186,7 @@ object BackupRestoreUi { } oldDataRequestCode -> if (resultCode == RESULT_OK) { data?.data?.let { uri -> - ImportOldData.importUri(App.INSTANCE, uri) + ImportOldData.importUri(appCtx, uri) } } } diff --git a/app/src/main/java/io/legado/app/ui/config/ConfigActivity.kt b/app/src/main/java/io/legado/app/ui/config/ConfigActivity.kt index 8b6c7701c..2d7ab0cbd 100644 --- a/app/src/main/java/io/legado/app/ui/config/ConfigActivity.kt +++ b/app/src/main/java/io/legado/app/ui/config/ConfigActivity.kt @@ -1,16 +1,17 @@ package io.legado.app.ui.config import android.os.Bundle +import androidx.activity.viewModels import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.EventBus import io.legado.app.databinding.ActivityConfigBinding -import io.legado.app.utils.getViewModel + import io.legado.app.utils.observeEvent class ConfigActivity : VMBaseActivity() { override val viewModel: ConfigViewModel - get() = getViewModel(ConfigViewModel::class.java) + by viewModels() override fun getViewBinding(): ActivityConfigBinding { return ActivityConfigBinding.inflate(layoutInflater) diff --git a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt index 42945d48f..b44909711 100644 --- a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt @@ -13,7 +13,6 @@ import android.view.View import androidx.documentfile.provider.DocumentFile import androidx.preference.ListPreference import androidx.preference.Preference -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BasePreferenceFragment import io.legado.app.constant.EventBus @@ -32,6 +31,7 @@ import io.legado.app.ui.main.MainActivity import io.legado.app.ui.widget.image.CoverImageView import io.legado.app.ui.widget.number.NumberPickerDialog import io.legado.app.utils.* +import splitties.init.appCtx import java.io.File @@ -40,9 +40,9 @@ class OtherConfigFragment : BasePreferenceFragment(), private val requestCodeCover = 231 - private val packageManager = App.INSTANCE.packageManager + private val packageManager = appCtx.packageManager private val componentName = ComponentName( - App.INSTANCE, + appCtx, SharedReceiverActivity::class.java.name ) private val webPort get() = getPrefInt(PreferKey.webPort, 1122) @@ -124,10 +124,10 @@ class OtherConfigFragment : BasePreferenceFragment(), key, getPrefString(PreferKey.defaultCover) ) PreferKey.language -> listView.postDelayed({ - LanguageUtils.setConfiguration(App.INSTANCE) - val intent = Intent(App.INSTANCE, MainActivity::class.java) + LanguageUtils.setConfiguration(appCtx) + val intent = Intent(appCtx, MainActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) - App.INSTANCE.startActivity(intent) + appCtx.startActivity(intent) Process.killProcess(Process.myPid()) }, 1000) PreferKey.userAgent -> listView.post { @@ -156,7 +156,7 @@ class OtherConfigFragment : BasePreferenceFragment(), alert("UserAgent") { val alertBinding = DialogEditTextBinding.inflate(layoutInflater) alertBinding.editView.setText(AppConfig.userAgent) - customView = alertBinding.root + customView { alertBinding.root } okButton { val userAgent = alertBinding.editView.text?.toString() if (userAgent.isNullOrBlank()) { @@ -177,7 +177,7 @@ class OtherConfigFragment : BasePreferenceFragment(), okButton { BookHelp.clearCache() FileUtils.deleteFile(requireActivity().cacheDir.absolutePath) - toast(R.string.clear_cache_success) + toastOnUi(R.string.clear_cache_success) } noButton() }.show() @@ -221,7 +221,7 @@ class OtherConfigFragment : BasePreferenceFragment(), file.writeBytes(byteArray) putPrefString(PreferKey.defaultCover, file.absolutePath) CoverImageView.upDefaultCover() - } ?: toast("获取文件出错") + } ?: toastOnUi("获取文件出错") } } else { PermissionsCompat.Builder(this) diff --git a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt index 8248a840a..834e53eb9 100644 --- a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt @@ -13,7 +13,6 @@ import android.view.MenuItem import android.view.View import androidx.documentfile.provider.DocumentFile import androidx.preference.Preference -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BasePreferenceFragment import io.legado.app.constant.AppConst @@ -60,7 +59,7 @@ class ThemeConfigFragment : BasePreferenceFragment(), findPreference(PreferKey.cBackground)?.let { it.onSaveColor = { color -> if (!ColorUtils.isColorLight(color)) { - toast(R.string.day_background_too_dark) + toastOnUi(R.string.day_background_too_dark) true } else { false @@ -70,7 +69,7 @@ class ThemeConfigFragment : BasePreferenceFragment(), findPreference(PreferKey.cNBackground)?.let { it.onSaveColor = { color -> if (ColorUtils.isColorLight(color)) { - toast(R.string.night_background_too_light) + toastOnUi(R.string.night_background_too_light) true } else { false @@ -84,11 +83,11 @@ class ThemeConfigFragment : BasePreferenceFragment(), val textColor = getCompatColor(R.color.primaryText) when { ColorUtils.getColorDifference(color, background) <= 60 -> { - toast(R.string.accent_background_diff) + toastOnUi(R.string.accent_background_diff) true } ColorUtils.getColorDifference(color, textColor) <= 60 -> { - toast(R.string.accent_text_diff) + toastOnUi(R.string.accent_text_diff) true } else -> false @@ -102,11 +101,11 @@ class ThemeConfigFragment : BasePreferenceFragment(), val textColor = getCompatColor(R.color.primaryText) when { ColorUtils.getColorDifference(color, background) <= 60 -> { - toast(R.string.accent_background_diff) + toastOnUi(R.string.accent_background_diff) true } ColorUtils.getColorDifference(color, textColor) <= 60 -> { - toast(R.string.accent_text_diff) + toastOnUi(R.string.accent_text_diff) true } else -> false @@ -140,7 +139,7 @@ class ThemeConfigFragment : BasePreferenceFragment(), when (item.itemId) { R.id.menu_theme_mode -> { AppConfig.isNightTheme = !AppConfig.isNightTheme - App.INSTANCE.applyDayNight() + ThemeConfig.applyDayNight(requireContext()) } } return super.onOptionsItemSelected(item) @@ -192,6 +191,7 @@ class ThemeConfigFragment : BasePreferenceFragment(), selector(items = arrayListOf("删除图片", "选择图片")) { _, i -> if (i == 0) { removePref(PreferKey.bgImage) + upTheme(false) } else { selectImage(requestCodeBgImage) } @@ -203,6 +203,7 @@ class ThemeConfigFragment : BasePreferenceFragment(), selector(items = arrayListOf("删除图片", "选择图片")) { _, i -> if (i == 0) { removePref(PreferKey.bgImageN) + upTheme(true) } else { selectImage(requestCodeBgImageN) } @@ -223,7 +224,7 @@ class ThemeConfigFragment : BasePreferenceFragment(), private fun saveThemeAlert(key: String) { alert(R.string.theme_name) { val alertBinding = DialogEditTextBinding.inflate(layoutInflater) - customView = alertBinding.root + customView { alertBinding.root } okButton { alertBinding.editView.text?.toString()?.let { themeName -> when (key) { @@ -262,7 +263,7 @@ class ThemeConfigFragment : BasePreferenceFragment(), } } - private fun setBgFromUri(uri: Uri, preferenceKey: String) { + private fun setBgFromUri(uri: Uri, preferenceKey: String, success: () -> Unit) { if (uri.isContentScheme()) { val doc = DocumentFile.fromSingleUri(requireContext(), uri) doc?.name?.let { @@ -273,8 +274,9 @@ class ThemeConfigFragment : BasePreferenceFragment(), }.getOrNull()?.let { byteArray -> file.writeBytes(byteArray) putPrefString(preferenceKey, file.absolutePath) - - } ?: toast("获取文件出错") + upPreferenceSummary(preferenceKey, file.absolutePath) + success() + } ?: toastOnUi("获取文件出错") } } else { PermissionsCompat.Builder(this) @@ -291,7 +293,8 @@ class ThemeConfigFragment : BasePreferenceFragment(), file = FileUtils.createFileIfNotExist(file, preferenceKey, imgFile.name) file.writeBytes(imgFile.readBytes()) putPrefString(preferenceKey, file.absolutePath) - + upPreferenceSummary(preferenceKey, file.absolutePath) + success() } } } @@ -304,12 +307,16 @@ class ThemeConfigFragment : BasePreferenceFragment(), when (requestCode) { requestCodeBgImage -> if (resultCode == Activity.RESULT_OK) { data?.data?.let { uri -> - setBgFromUri(uri, PreferKey.bgImage) + setBgFromUri(uri, PreferKey.bgImage) { + upTheme(false) + } } } requestCodeBgImageN -> if (resultCode == Activity.RESULT_OK) { data?.data?.let { uri -> - setBgFromUri(uri, PreferKey.bgImageN) + setBgFromUri(uri, PreferKey.bgImageN) { + upTheme(true) + } } } } diff --git a/app/src/main/java/io/legado/app/ui/config/ThemeListDialog.kt b/app/src/main/java/io/legado/app/ui/config/ThemeListDialog.kt index 974924802..358b16613 100644 --- a/app/src/main/java/io/legado/app/ui/config/ThemeListDialog.kt +++ b/app/src/main/java/io/legado/app/ui/config/ThemeListDialog.kt @@ -19,8 +19,6 @@ import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.share class ThemeListDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { private val binding by viewBinding(DialogRecyclerViewBinding::bind) @@ -72,7 +70,7 @@ class ThemeListDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { if (ThemeConfig.addConfig(it)) { initData() } else { - toast("格式不对,添加失败") + toastOnUi("格式不对,添加失败") } } } @@ -115,13 +113,13 @@ class ThemeListDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { override fun registerListener(holder: ItemViewHolder, binding: ItemThemeConfigBinding) { binding.apply { - root.onClick { + root.setOnClickListener { ThemeConfig.applyConfig(context, ThemeConfig.configList[holder.layoutPosition]) } - ivShare.onClick { + ivShare.setOnClickListener { share(holder.layoutPosition) } - ivDelete.onClick { + ivDelete.setOnClickListener { delete(holder.layoutPosition) } } diff --git a/app/src/main/java/io/legado/app/ui/filepicker/FilePicker.kt b/app/src/main/java/io/legado/app/ui/filepicker/FilePicker.kt index b464c1657..ff099f9ff 100644 --- a/app/src/main/java/io/legado/app/ui/filepicker/FilePicker.kt +++ b/app/src/main/java/io/legado/app/ui/filepicker/FilePicker.kt @@ -230,6 +230,9 @@ object FilePicker { val intent = Intent(Intent.ACTION_GET_CONTENT) intent.addCategory(Intent.CATEGORY_OPENABLE) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) + intent.addFlags(Intent.FLAG_GRANT_PREFIX_URI_PERMISSION) intent.type = "*/*" return intent } @@ -237,6 +240,9 @@ object FilePicker { private fun createSelectDirIntent(): Intent { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) + intent.addFlags(Intent.FLAG_GRANT_PREFIX_URI_PERMISSION) return intent } diff --git a/app/src/main/java/io/legado/app/ui/filepicker/FilePickerDialog.kt b/app/src/main/java/io/legado/app/ui/filepicker/FilePickerDialog.kt index 9c4d1358f..4eaa8aaea 100644 --- a/app/src/main/java/io/legado/app/ui/filepicker/FilePickerDialog.kt +++ b/app/src/main/java/io/legado/app/ui/filepicker/FilePickerDialog.kt @@ -152,12 +152,12 @@ class FilePickerDialog : DialogFragment(), when (item?.itemId) { R.id.menu_ok -> fileAdapter.currentPath?.let { setData(it) - dismiss() + dismissAllowingStateLoss() } else -> item?.title?.let { (parentFragment as? CallBack)?.onMenuClick(it.toString()) (activity as? CallBack)?.onMenuClick(it.toString()) - dismiss() + dismissAllowingStateLoss() } } return true @@ -170,14 +170,14 @@ class FilePickerDialog : DialogFragment(), } else { fileItem?.path?.let { path -> if (mode == DIRECTORY) { - toast("这是文件夹选择,不能选择文件,点击右上角的确定选择文件夹") + toastOnUi("这是文件夹选择,不能选择文件,点击右上角的确定选择文件夹") } else if (allowExtensions.isNullOrEmpty() || allowExtensions?.contains(FileUtils.getExtension(path)) == true ) { setData(path) - dismiss() + dismissAllowingStateLoss() } else { - toast("不能打开此文件") + toastOnUi("不能打开此文件") } } } diff --git a/app/src/main/java/io/legado/app/ui/filepicker/adapter/FileAdapter.kt b/app/src/main/java/io/legado/app/ui/filepicker/adapter/FileAdapter.kt index cdd8301fc..e4bedec58 100644 --- a/app/src/main/java/io/legado/app/ui/filepicker/adapter/FileAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/filepicker/adapter/FileAdapter.kt @@ -13,7 +13,7 @@ import io.legado.app.ui.filepicker.entity.FileItem import io.legado.app.ui.filepicker.utils.ConvertUtils import io.legado.app.ui.filepicker.utils.FilePickerIcon import io.legado.app.utils.FileUtils -import org.jetbrains.anko.sdk27.listeners.onClick + import java.io.File import java.util.* @@ -118,7 +118,7 @@ class FileAdapter(context: Context, val callBack: CallBack) : } override fun registerListener(holder: ItemViewHolder, binding: ItemFileFilepickerBinding) { - holder.itemView.onClick { + holder.itemView.setOnClickListener { callBack.onFileClick(holder.layoutPosition) } } diff --git a/app/src/main/java/io/legado/app/ui/filepicker/adapter/PathAdapter.kt b/app/src/main/java/io/legado/app/ui/filepicker/adapter/PathAdapter.kt index 4ad56534f..60ea3f648 100644 --- a/app/src/main/java/io/legado/app/ui/filepicker/adapter/PathAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/filepicker/adapter/PathAdapter.kt @@ -8,7 +8,7 @@ import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.databinding.ItemPathFilepickerBinding import io.legado.app.ui.filepicker.utils.ConvertUtils import io.legado.app.ui.filepicker.utils.FilePickerIcon -import org.jetbrains.anko.sdk27.listeners.onClick + import java.util.* @@ -61,7 +61,7 @@ class PathAdapter(context: Context, val callBack: CallBack) : } override fun registerListener(holder: ItemViewHolder, binding: ItemPathFilepickerBinding) { - holder.itemView.onClick { + holder.itemView.setOnClickListener { callBack.onPathClick(holder.layoutPosition) } } diff --git a/app/src/main/java/io/legado/app/ui/login/SourceLogin.kt b/app/src/main/java/io/legado/app/ui/login/SourceLogin.kt index d357e9c53..028b85b98 100644 --- a/app/src/main/java/io/legado/app/ui/login/SourceLogin.kt +++ b/app/src/main/java/io/legado/app/ui/login/SourceLogin.kt @@ -19,6 +19,7 @@ class SourceLogin : BaseActivity() { var sourceUrl: String? = null var loginUrl: String? = null + var userAgent: String? = null var checking = false override fun getViewBinding(): ActivitySourceLoginBinding { @@ -28,6 +29,7 @@ class SourceLogin : BaseActivity() { override fun onActivityCreated(savedInstanceState: Bundle?) { sourceUrl = intent.getStringExtra("sourceUrl") loginUrl = intent.getStringExtra("loginUrl") + userAgent = intent.getStringExtra("userAgent") title = getString(R.string.login_source, sourceUrl) initWebView() } @@ -38,6 +40,9 @@ class SourceLogin : BaseActivity() { settings.setSupportZoom(true) settings.builtInZoomControls = true settings.javaScriptEnabled = true + userAgent?.let { + settings.userAgentString = it + } val cookieManager = CookieManager.getInstance() binding.webView.webViewClient = object : WebViewClient() { override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index 4890d22da..1edd9c2bb 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -4,17 +4,18 @@ import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem import android.view.ViewGroup +import androidx.activity.viewModels import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentStatePagerAdapter import androidx.viewpager.widget.ViewPager import com.google.android.material.bottomnavigation.BottomNavigationView -import io.legado.app.App import io.legado.app.BuildConfig import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey +import io.legado.app.constant.appInfo import io.legado.app.databinding.ActivityMainBinding import io.legado.app.help.AppConfig import io.legado.app.help.BookHelp @@ -29,18 +30,16 @@ import io.legado.app.ui.main.explore.ExploreFragment import io.legado.app.ui.main.my.MyFragment import io.legado.app.ui.main.rss.RssFragment import io.legado.app.ui.widget.dialog.TextDialog -import io.legado.app.utils.getViewModel import io.legado.app.utils.hideSoftInput import io.legado.app.utils.observeEvent -import org.jetbrains.anko.toast +import io.legado.app.utils.toastOnUi class MainActivity : VMBaseActivity(), BottomNavigationView.OnNavigationItemSelectedListener, BottomNavigationView.OnNavigationItemReselectedListener, ViewPager.OnPageChangeListener by ViewPager.SimpleOnPageChangeListener() { - override val viewModel: MainViewModel - get() = getViewModel(MainViewModel::class.java) + override val viewModel: MainViewModel by viewModels() private var exitTime: Long = 0 private var bookshelfReselected: Long = 0 private var exploreReselected: Long = 0 @@ -108,8 +107,8 @@ class MainActivity : VMBaseActivity(), } private fun upVersion() { - if (LocalConfig.versionCode != App.versionCode) { - LocalConfig.versionCode = App.versionCode + if (LocalConfig.versionCode != appInfo.versionCode) { + LocalConfig.versionCode = appInfo.versionCode if (LocalConfig.isFirstOpenApp) { val text = String(assets.open("help/appHelp.md").readBytes()) TextDialog.show(supportFragmentManager, text, TextDialog.MD) @@ -144,7 +143,7 @@ class MainActivity : VMBaseActivity(), return true } if (System.currentTimeMillis() - exitTime > 2000) { - toast(R.string.double_click_exit) + toastOnUi(R.string.double_click_exit) exitTime = System.currentTimeMillis() } else { if (BaseReadAloudService.pause) { diff --git a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt index c115e661a..27a140167 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt @@ -1,10 +1,10 @@ package io.legado.app.ui.main import android.app.Application -import io.legado.app.App import io.legado.app.base.BaseViewModel import io.legado.app.constant.BookType import io.legado.app.constant.EventBus +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.help.AppConfig import io.legado.app.help.BookHelp @@ -14,7 +14,6 @@ import io.legado.app.model.webBook.WebBook import io.legado.app.service.help.CacheBook import io.legado.app.utils.FileUtils import io.legado.app.utils.postEvent -import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.delay import java.util.concurrent.ConcurrentHashMap @@ -44,7 +43,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) { fun upAllBookToc() { execute { - upToc(App.db.bookDao.hasUpdateBooks) + upToc(appDb.bookDao.hasUpdateBooks) } } @@ -66,36 +65,38 @@ class MainViewModel(application: Application) : BaseViewModel(application) { @Synchronized private fun updateToc() { + var update = false bookMap.forEach { bookEntry -> if (!updateList.contains(bookEntry.key)) { + update = true val book = bookEntry.value synchronized(this) { updateList.add(book.bookUrl) postEvent(EventBus.UP_BOOK, book.bookUrl) } - App.db.bookSourceDao.getBookSource(book.origin)?.let { bookSource -> - val webBook = WebBook(bookSource) - webBook.getChapterList(this, book, context = upTocPool) - .timeout(300000) - .onSuccess(IO) { - App.db.bookDao.update(book) - App.db.bookChapterDao.delByBook(book.bookUrl) - App.db.bookChapterDao.insert(*it.toTypedArray()) - if (AppConfig.preDownload) { - cacheBook(webBook, book) - } + appDb.bookSourceDao.getBookSource(book.origin)?.let { bookSource -> + execute(context = upTocPool) { + val webBook = WebBook(bookSource) + if (book.tocUrl.isBlank()) { + webBook.getBookInfoAwait(this, book) } - .onError { - it.printStackTrace() + val toc = webBook.getChapterListAwait(this, book) + appDb.bookDao.update(book) + appDb.bookChapterDao.delByBook(book.bookUrl) + appDb.bookChapterDao.insert(*toc.toTypedArray()) + if (AppConfig.preDownload) { + cacheBook(webBook, book) } - .onFinally { - synchronized(this) { - bookMap.remove(bookEntry.key) - updateList.remove(book.bookUrl) - postEvent(EventBus.UP_BOOK, book.bookUrl) - upNext() - } + }.onError { + it.printStackTrace() + }.onFinally { + synchronized(this) { + bookMap.remove(bookEntry.key) + updateList.remove(book.bookUrl) + postEvent(EventBus.UP_BOOK, book.bookUrl) + upNext() } + } } ?: synchronized(this) { bookMap.remove(bookEntry.key) updateList.remove(book.bookUrl) @@ -105,6 +106,9 @@ class MainViewModel(application: Application) : BaseViewModel(application) { return } } + if (!update) { + usePoolCount-- + } } private fun cacheBook(webBook: WebBook, book: Book) { @@ -112,7 +116,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) { if (book.totalChapterNum > book.durChapterIndex) { val downloadToIndex = min(book.totalChapterNum, book.durChapterIndex.plus(10)) for (i in book.durChapterIndex until downloadToIndex) { - App.db.bookChapterDao.getChapter(book.bookUrl, i)?.let { chapter -> + appDb.bookChapterDao.getChapter(book.bookUrl, i)?.let { chapter -> if (!BookHelp.hasContent(book, chapter)) { var addToCache = false while (!addToCache) { @@ -141,9 +145,9 @@ class MainViewModel(application: Application) : BaseViewModel(application) { fun postLoad() { execute { FileUtils.deleteFile(FileUtils.getPath(context.cacheDir, "Fonts")) - if (App.db.httpTTSDao.count == 0) { + if (appDb.httpTTSDao.count == 0) { DefaultData.httpTTS.let { - App.db.httpTTSDao.insert(*it.toTypedArray()) + appDb.httpTTSDao.insert(*it.toTypedArray()) } } } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt index 300ba646d..4ff1e9b50 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt @@ -9,16 +9,14 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.SearchView -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentStatePagerAdapter +import androidx.fragment.app.* import androidx.lifecycle.LiveData import com.google.android.material.tabs.TabLayout -import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseFragment import io.legado.app.constant.AppConst import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.data.entities.BookGroup import io.legado.app.databinding.DialogBookshelfConfigBinding import io.legado.app.databinding.DialogEditTextBinding @@ -37,7 +35,6 @@ import io.legado.app.ui.main.MainViewModel import io.legado.app.ui.main.bookshelf.books.BooksFragment import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.share /** * 书架界面 @@ -49,10 +46,8 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b private val requestCodeImportBookshelf = 312 private val binding by viewBinding(FragmentBookshelfBinding::bind) - override val viewModel: BookshelfViewModel - get() = getViewModel(BookshelfViewModel::class.java) - private val activityViewModel: MainViewModel - get() = getViewModelOfActivity(MainViewModel::class.java) + override val viewModel: BookshelfViewModel by viewModels() + private val activityViewModel: MainViewModel by activityViewModels() private lateinit var adapter: FragmentStatePagerAdapter private lateinit var tabLayout: TabLayout private var bookGroupLiveData: LiveData>? = null @@ -85,14 +80,14 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b .show(childFragmentManager, "groupManageDialog") R.id.menu_add_local -> startActivity() R.id.menu_add_url -> addBookByUrl() - R.id.menu_arrange_bookshelf -> startActivity( - Pair("groupId", selectedGroup.groupId ?: 0), - Pair("groupName", selectedGroup.groupName ?: 0) - ) - R.id.menu_download -> startActivity( - Pair("groupId", selectedGroup.groupId ?: 0), - Pair("groupName", selectedGroup.groupName ?: 0) - ) + R.id.menu_arrange_bookshelf -> startActivity { + putExtra("groupId", selectedGroup.groupId) + putExtra("groupName", selectedGroup.groupName) + } + R.id.menu_download -> startActivity { + putExtra("groupId", selectedGroup.groupId) + putExtra("groupName", selectedGroup.groupName) + } R.id.menu_export_bookshelf -> { val fragment = fragmentMap[selectedGroup.groupId] viewModel.exportBookshelf(fragment?.getBooks()) { @@ -119,7 +114,7 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b private fun initBookGroupData() { bookGroupLiveData?.removeObservers(viewLifecycleOwner) - bookGroupLiveData = App.db.bookGroupDao.liveDataShow().apply { + bookGroupLiveData = appDb.bookGroupDao.liveDataShow().apply { observe(viewLifecycleOwner) { viewModel.checkGroup(it) upGroup(it) @@ -128,7 +123,9 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b } override fun onQueryTextSubmit(query: String?): Boolean { - startActivity(Pair("key", query)) + startActivity { + putExtra("key", query) + } return false } @@ -139,7 +136,7 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b @Synchronized private fun upGroup(data: List) { if (data.isEmpty()) { - App.db.bookGroupDao.enableGroup(AppConst.bookGroupAllId) + appDb.bookGroupDao.enableGroup(AppConst.bookGroupAllId) } else { if (data != bookGroups) { bookGroups.clear() @@ -168,7 +165,7 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b rgLayout.checkByIndex(bookshelfLayout) rgSort.checkByIndex(bookshelfSort) } - customView = alertBinding.root + customView { alertBinding.root } okButton { alertBinding.apply { var changed = false @@ -193,7 +190,7 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b private fun addBookByUrl() { alert(titleResource = R.string.add_book_url) { val alertBinding = DialogEditTextBinding.inflate(layoutInflater) - customView = alertBinding.root + customView { alertBinding.root } okButton { alertBinding.editView.text?.toString()?.let { viewModel.addBookByUrl(it) @@ -205,7 +202,7 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b override fun onTabReselected(tab: TabLayout.Tab) { fragmentMap[selectedGroup.groupId]?.let { - toast("${selectedGroup.groupName}(${it.getBooksCount()})") + toastOnUi("${selectedGroup.groupName}(${it.getBooksCount()})") } } @@ -224,7 +221,7 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply { editView.hint = "url/json" } - customView = alertBinding.root + customView { alertBinding.root } okButton { alertBinding.editView.text?.toString()?.let { viewModel.importBookshelf(it, selectedGroup.groupId) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt index e2e1b50e3..0f937abbc 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt @@ -1,9 +1,9 @@ package io.legado.app.ui.main.bookshelf import android.app.Application -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookGroup import io.legado.app.data.entities.BookSource @@ -25,12 +25,12 @@ class BookshelfViewModel(application: Application) : BaseViewModel(application) for (url in urls) { val bookUrl = url.trim() if (bookUrl.isEmpty()) continue - if (App.db.bookDao.getBook(bookUrl) != null) continue + if (appDb.bookDao.getBook(bookUrl) != null) continue val baseUrl = NetworkUtils.getBaseUrl(bookUrl) ?: continue - var source = App.db.bookSourceDao.getBookSource(baseUrl) + var source = appDb.bookSourceDao.getBookSource(baseUrl) if (source == null) { if (hasBookUrlPattern == null) { - hasBookUrlPattern = App.db.bookSourceDao.hasBookUrlPattern + hasBookUrlPattern = appDb.bookSourceDao.hasBookUrlPattern } hasBookUrlPattern.forEach { bookSource -> if (bookUrl.matches(bookSource.bookUrlPattern!!.toRegex())) { @@ -47,8 +47,8 @@ class BookshelfViewModel(application: Application) : BaseViewModel(application) ) WebBook(bookSource).getBookInfo(this, book) .onSuccess(IO) { - it.order = App.db.bookDao.maxOrder + 1 - App.db.bookDao.insert(it) + it.order = appDb.bookDao.maxOrder + 1 + appDb.bookDao.insert(it) successCount++ }.onError { throw Exception(it.localizedMessage) @@ -57,12 +57,12 @@ class BookshelfViewModel(application: Application) : BaseViewModel(application) } }.onSuccess { if (successCount > 0) { - toast(R.string.success) + toastOnUi(R.string.success) } else { - toast("ERROR") + toastOnUi("ERROR") } }.onError { - toast(it.localizedMessage ?: "ERROR") + toastOnUi(it.localizedMessage ?: "ERROR") } } @@ -98,30 +98,30 @@ class BookshelfViewModel(application: Application) : BaseViewModel(application) } } }.onError { - toast(it.localizedMessage ?: "ERROR") + toastOnUi(it.localizedMessage ?: "ERROR") } } private fun importBookshelfByJson(json: String, groupId: Long) { execute { - val bookSources = App.db.bookSourceDao.allEnabled + val bookSources = appDb.bookSourceDao.allEnabled GSON.fromJsonArray>(json)?.forEach { if (!isActive) return@execute val name = it["name"] ?: "" val author = it["author"] ?: "" - if (name.isNotEmpty() && App.db.bookDao.getBook(name, author) == null) { + if (name.isNotEmpty() && appDb.bookDao.getBook(name, author) == null) { val book = PreciseSearch .searchFirstBook(this, bookSources, name, author) book?.let { if (groupId > 0) { book.group = groupId } - App.db.bookDao.insert(book) + appDb.bookDao.insert(book) } } } }.onFinally { - toast(R.string.success) + toastOnUi(R.string.success) } } @@ -129,13 +129,13 @@ class BookshelfViewModel(application: Application) : BaseViewModel(application) groups.forEach { group -> if (group.groupId >= 0 && group.groupId and (group.groupId - 1) != 0L) { var id = 1L - val idsSum = App.db.bookGroupDao.idsSum + val idsSum = appDb.bookGroupDao.idsSum while (id and idsSum != 0L) { id = id.shl(1) } - App.db.bookGroupDao.delete(group) - App.db.bookGroupDao.insert(group.copy(groupId = id)) - App.db.bookDao.upGroup(group.groupId, id) + appDb.bookGroupDao.delete(group) + appDb.bookGroupDao.insert(group.copy(groupId = id)) + appDb.bookDao.upGroup(group.groupId, id) } } } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt index 27fe663d3..286c13b74 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt @@ -7,10 +7,10 @@ import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.constant.BookType import io.legado.app.data.entities.Book import io.legado.app.databinding.ItemBookshelfGridBinding -import io.legado.app.lib.theme.ATH +import io.legado.app.lib.theme.backgroundColor +import io.legado.app.utils.ColorUtils import io.legado.app.utils.invisible -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.sdk27.listeners.onLongClick +import splitties.views.onLongClick class BooksAdapterGrid(context: Context, private val callBack: CallBack) : BaseBooksAdapter(context) { @@ -24,18 +24,18 @@ class BooksAdapterGrid(context: Context, private val callBack: CallBack) : binding: ItemBookshelfGridBinding, item: Book, payloads: MutableList - ) { + ) = with(binding) { val bundle = payloads.getOrNull(0) as? Bundle if (bundle == null) { - ATH.applyBackgroundTint(binding.root) - binding.tvName.text = item.name - binding.ivCover.load(item.getDisplayCover(), item.name, item.author) + root.setBackgroundColor(ColorUtils.withAlpha(context.backgroundColor, 0.5f)) + tvName.text = item.name + ivCover.load(item.getDisplayCover(), item.name, item.author) upRefresh(binding, item) } else { bundle.keySet().forEach { when (it) { - "name" -> binding.tvName.text = item.name - "cover" -> binding.ivCover.load(item.getDisplayCover(), item.name, item.author) + "name" -> tvName.text = item.name + "cover" -> ivCover.load(item.getDisplayCover(), item.name, item.author) "refresh" -> upRefresh(binding, item) } } @@ -55,7 +55,7 @@ class BooksAdapterGrid(context: Context, private val callBack: CallBack) : override fun registerListener(holder: ItemViewHolder, binding: ItemBookshelfGridBinding) { holder.itemView.apply { - onClick { + setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.open(it) } @@ -65,7 +65,6 @@ class BooksAdapterGrid(context: Context, private val callBack: CallBack) : getItem(holder.layoutPosition)?.let { callBack.openBookInfo(it) } - true } } } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt index 5f3822e01..95d027042 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt @@ -7,10 +7,10 @@ import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.constant.BookType import io.legado.app.data.entities.Book import io.legado.app.databinding.ItemBookshelfListBinding -import io.legado.app.lib.theme.ATH +import io.legado.app.lib.theme.backgroundColor +import io.legado.app.utils.ColorUtils import io.legado.app.utils.invisible -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.sdk27.listeners.onLongClick +import splitties.views.onLongClick class BooksAdapterList(context: Context, private val callBack: CallBack) : BaseBooksAdapter(context) { @@ -24,24 +24,24 @@ class BooksAdapterList(context: Context, private val callBack: CallBack) : binding: ItemBookshelfListBinding, item: Book, payloads: MutableList - ) { + ) = with(binding) { val bundle = payloads.getOrNull(0) as? Bundle if (bundle == null) { - ATH.applyBackgroundTint(binding.root) - binding.tvName.text = item.name - binding.tvAuthor.text = item.author - binding.tvRead.text = item.durChapterTitle - binding.tvLast.text = item.latestChapterTitle - binding.ivCover.load(item.getDisplayCover(), item.name, item.author) + root.setBackgroundColor(ColorUtils.withAlpha(context.backgroundColor, 0.5f)) + tvName.text = item.name + tvAuthor.text = item.author + tvRead.text = item.durChapterTitle + tvLast.text = item.latestChapterTitle + ivCover.load(item.getDisplayCover(), item.name, item.author) upRefresh(binding, item) } else { - binding.tvRead.text = item.durChapterTitle - binding.tvLast.text = item.latestChapterTitle + tvRead.text = item.durChapterTitle + tvLast.text = item.latestChapterTitle bundle.keySet().forEach { when (it) { - "name" -> binding.tvName.text = item.name - "author" -> binding.tvAuthor.text = item.author - "cover" -> binding.ivCover.load(item.getDisplayCover(), item.name, item.author) + "name" -> tvName.text = item.name + "author" -> tvAuthor.text = item.author + "cover" -> ivCover.load(item.getDisplayCover(), item.name, item.author) "refresh" -> upRefresh(binding, item) } } @@ -61,7 +61,7 @@ class BooksAdapterList(context: Context, private val callBack: CallBack) : override fun registerListener(holder: ItemViewHolder, binding: ItemBookshelfListBinding) { holder.itemView.apply { - onClick { + setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.open(it) } @@ -71,7 +71,6 @@ class BooksAdapterList(context: Context, private val callBack: CallBack) : getItem(holder.layoutPosition)?.let { callBack.openBookInfo(it) } - true } } } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksFragment.kt index 6f0990a76..a37a27087 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksFragment.kt @@ -3,17 +3,18 @@ package io.legado.app.ui.main.bookshelf.books import android.os.Bundle import android.view.View import androidx.core.view.isGone +import androidx.fragment.app.activityViewModels import androidx.lifecycle.LiveData import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseFragment import io.legado.app.constant.AppConst import io.legado.app.constant.BookType import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.databinding.FragmentBooksBinding import io.legado.app.help.AppConfig @@ -24,7 +25,10 @@ import io.legado.app.ui.audio.AudioPlayActivity import io.legado.app.ui.book.info.BookInfoActivity import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.main.MainViewModel -import io.legado.app.utils.* +import io.legado.app.utils.cnCompare +import io.legado.app.utils.getPrefInt +import io.legado.app.utils.observeEvent +import io.legado.app.utils.startActivity import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlin.math.max @@ -47,7 +51,7 @@ class BooksFragment : BaseFragment(R.layout.fragment_books), private val binding by viewBinding(FragmentBooksBinding::bind) private val activityViewModel: MainViewModel - get() = getViewModelOfActivity(MainViewModel::class.java) + by activityViewModels() private lateinit var booksAdapter: BaseBooksAdapter<*> private var bookshelfLiveData: LiveData>? = null private var position = 0 @@ -100,11 +104,11 @@ class BooksFragment : BaseFragment(R.layout.fragment_books), private fun upRecyclerData() { bookshelfLiveData?.removeObservers(this) bookshelfLiveData = when (groupId) { - AppConst.bookGroupAllId -> App.db.bookDao.observeAll() - AppConst.bookGroupLocalId -> App.db.bookDao.observeLocal() - AppConst.bookGroupAudioId -> App.db.bookDao.observeAudio() - AppConst.bookGroupNoneId -> App.db.bookDao.observeNoGroup() - else -> App.db.bookDao.observeByGroup(groupId) + AppConst.bookGroupAllId -> appDb.bookDao.observeAll() + AppConst.bookGroupLocalId -> appDb.bookDao.observeLocal() + AppConst.bookGroupAudioId -> appDb.bookDao.observeAudio() + AppConst.bookGroupNoneId -> appDb.bookDao.observeNoGroup() + else -> appDb.bookDao.observeByGroup(groupId) }.apply { observe(viewLifecycleOwner) { list -> binding.tvEmptyMsg.isGone = list.isNotEmpty() @@ -140,19 +144,21 @@ class BooksFragment : BaseFragment(R.layout.fragment_books), override fun open(book: Book) { when (book.type) { BookType.audio -> - startActivity(Pair("bookUrl", book.bookUrl)) - else -> startActivity( - Pair("bookUrl", book.bookUrl), - Pair("key", IntentDataHelp.putData(book)) - ) + startActivity { + putExtra("bookUrl", book.bookUrl) + } + else -> startActivity { + putExtra("bookUrl", book.bookUrl) + putExtra("key", IntentDataHelp.putData(book)) + } } } override fun openBookInfo(book: Book) { - startActivity( - Pair("name", book.name), - Pair("author", book.author) - ) + startActivity { + putExtra("name", book.name) + putExtra("author", book.author) + } } override fun isUpdate(bookUrl: String): Boolean { diff --git a/app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt b/app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt index b0aba869f..0944c2a03 100644 --- a/app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt @@ -5,10 +5,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.PopupMenu -import io.legado.app.App import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.databinding.ItemFilletTextBinding import io.legado.app.databinding.ItemFindBookBinding @@ -19,9 +19,7 @@ import io.legado.app.utils.dp import io.legado.app.utils.gone import io.legado.app.utils.visible import kotlinx.coroutines.CoroutineScope -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.sdk27.listeners.onLongClick - +import splitties.views.onLongClick class ExploreAdapter(context: Context, private val scope: CoroutineScope, val callBack: CallBack) : RecyclerAdapter(context) { @@ -69,7 +67,7 @@ class ExploreAdapter(context: Context, private val scope: CoroutineScope, val ca glChild.addView(tv.root) tv.textView.text = kind.title if (!kind.url.isNullOrEmpty()) { - tv.textView.onClick { + tv.textView.setOnClickListener { callBack.openExplore( item.bookSourceUrl, kind.title, @@ -96,7 +94,7 @@ class ExploreAdapter(context: Context, private val scope: CoroutineScope, val ca override fun registerListener(holder: ItemViewHolder, binding: ItemFindBookBinding) { binding.apply { - llTitle.onClick { + llTitle.setOnClickListener { val position = holder.layoutPosition val oldEx = exIndex exIndex = if (exIndex == position) -1 else position @@ -137,7 +135,7 @@ class ExploreAdapter(context: Context, private val scope: CoroutineScope, val ca notifyItemChanged(position) } R.id.menu_del -> Coroutine.async(scope) { - App.db.bookSourceDao.delete(source) + appDb.bookSourceDao.delete(source) } } true diff --git a/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt b/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt index ff311f503..92e5404da 100644 --- a/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt @@ -7,14 +7,15 @@ import android.view.SubMenu import android.view.View import androidx.appcompat.widget.SearchView import androidx.core.view.isGone +import androidx.fragment.app.viewModels import androidx.lifecycle.LiveData import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseFragment import io.legado.app.constant.AppPattern +import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.databinding.FragmentExploreBinding import io.legado.app.help.AppConfig @@ -23,7 +24,6 @@ import io.legado.app.lib.theme.primaryTextColor import io.legado.app.ui.book.explore.ExploreShowActivity import io.legado.app.ui.book.source.edit.BookSourceEditActivity import io.legado.app.utils.cnCompare -import io.legado.app.utils.getViewModel import io.legado.app.utils.splitNotBlank import io.legado.app.utils.startActivity import io.legado.app.utils.viewbindingdelegate.viewBinding @@ -33,8 +33,7 @@ import io.legado.app.utils.viewbindingdelegate.viewBinding */ class ExploreFragment : VMBaseFragment(R.layout.fragment_explore), ExploreAdapter.CallBack { - override val viewModel: ExploreViewModel - get() = getViewModel(ExploreViewModel::class.java) + override val viewModel: ExploreViewModel by viewModels() private val binding by viewBinding(FragmentExploreBinding::bind) private lateinit var adapter: ExploreAdapter private lateinit var linearLayoutManager: LinearLayoutManager @@ -97,7 +96,7 @@ class ExploreFragment : VMBaseFragment(R.layout.fragment_explo private fun initGroupData() { liveGroup?.removeObservers(viewLifecycleOwner) - liveGroup = App.db.bookSourceDao.liveExploreGroup() + liveGroup = appDb.bookSourceDao.liveExploreGroup() liveGroup?.observe(viewLifecycleOwner, { groups.clear() it.map { group -> @@ -111,14 +110,14 @@ class ExploreFragment : VMBaseFragment(R.layout.fragment_explo liveExplore?.removeObservers(viewLifecycleOwner) liveExplore = when { searchKey.isNullOrBlank() -> { - App.db.bookSourceDao.liveExplore() + appDb.bookSourceDao.liveExplore() } searchKey.startsWith("group:") -> { val key = searchKey.substringAfter("group:") - App.db.bookSourceDao.liveGroupExplore("%$key%") + appDb.bookSourceDao.liveGroupExplore("%$key%") } else -> { - App.db.bookSourceDao.liveExplore("%$searchKey%") + appDb.bookSourceDao.liveExplore("%$searchKey%") } } liveExplore?.observe(viewLifecycleOwner, { @@ -151,15 +150,17 @@ class ExploreFragment : VMBaseFragment(R.layout.fragment_explo } override fun openExplore(sourceUrl: String, title: String, exploreUrl: String) { - startActivity( - Pair("exploreName", title), - Pair("sourceUrl", sourceUrl), - Pair("exploreUrl", exploreUrl) - ) + startActivity { + putExtra("exploreName", title) + putExtra("sourceUrl", sourceUrl) + putExtra("exploreUrl", exploreUrl) + } } override fun editSource(sourceUrl: String) { - startActivity(Pair("data", sourceUrl)) + startActivity { + putExtra("data", sourceUrl) + } } override fun toTop(source: BookSource) { diff --git a/app/src/main/java/io/legado/app/ui/main/explore/ExploreViewModel.kt b/app/src/main/java/io/legado/app/ui/main/explore/ExploreViewModel.kt index 8a9551a57..e6a2cc569 100644 --- a/app/src/main/java/io/legado/app/ui/main/explore/ExploreViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/explore/ExploreViewModel.kt @@ -1,17 +1,17 @@ package io.legado.app.ui.main.explore import android.app.Application -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource class ExploreViewModel(application: Application) : BaseViewModel(application) { fun topSource(bookSource: BookSource) { execute { - val minXh = App.db.bookSourceDao.minOrder + val minXh = appDb.bookSourceDao.minOrder bookSource.customOrder = minXh - 1 - App.db.bookSourceDao.insert(bookSource) + appDb.bookSourceDao.insert(bookSource) } } diff --git a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt index ce6065e27..4ce39781a 100644 --- a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt @@ -7,7 +7,6 @@ import android.view.Menu import android.view.MenuItem import android.view.View import androidx.preference.Preference -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseFragment import io.legado.app.base.BasePreferenceFragment @@ -15,6 +14,7 @@ import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.databinding.FragmentMyConfigBinding import io.legado.app.help.AppConfig +import io.legado.app.help.ThemeConfig import io.legado.app.lib.theme.ATH import io.legado.app.service.WebService import io.legado.app.ui.about.AboutActivity @@ -90,7 +90,7 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config), FilePickerDialog.C } findPreference(PreferKey.themeMode)?.let { it.setOnPreferenceChangeListener { _, _ -> - view?.post { App.INSTANCE.applyDayNight() } + view?.post { ThemeConfig.applyDayNight(requireContext()) } true } } @@ -135,15 +135,15 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config), FilePickerDialog.C when (preference?.key) { "bookSourceManage" -> startActivity() "replaceManage" -> startActivity() - "setting" -> startActivity( - Pair("configType", ConfigViewModel.TYPE_CONFIG) - ) - "web_dav_setting" -> startActivity( - Pair("configType", ConfigViewModel.TYPE_WEB_DAV_CONFIG) - ) - "theme_setting" -> startActivity( - Pair("configType", ConfigViewModel.TYPE_THEME_CONFIG) - ) + "setting" -> startActivity { + putExtra("configType", ConfigViewModel.TYPE_CONFIG) + } + "web_dav_setting" -> startActivity { + putExtra("configType", ConfigViewModel.TYPE_WEB_DAV_CONFIG) + } + "theme_setting" -> startActivity { + putExtra("configType", ConfigViewModel.TYPE_THEME_CONFIG) + } "readRecord" -> startActivity() "donate" -> startActivity() "about" -> startActivity() diff --git a/app/src/main/java/io/legado/app/ui/main/rss/RssAdapter.kt b/app/src/main/java/io/legado/app/ui/main/rss/RssAdapter.kt index 40218e5d3..1af9bdb9b 100644 --- a/app/src/main/java/io/legado/app/ui/main/rss/RssAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/main/rss/RssAdapter.kt @@ -10,8 +10,7 @@ import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.data.entities.RssSource import io.legado.app.databinding.ItemRssBinding import io.legado.app.help.ImageLoader -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.sdk27.listeners.onLongClick +import splitties.views.onLongClick class RssAdapter(context: Context, val callBack: CallBack) : RecyclerAdapter(context) { @@ -38,7 +37,7 @@ class RssAdapter(context: Context, val callBack: CallBack) : override fun registerListener(holder: ItemViewHolder, binding: ItemRssBinding) { binding.apply { - root.onClick { + root.setOnClickListener { getItemByLayoutPosition(holder.layoutPosition)?.let { callBack.openRss(it) } @@ -47,7 +46,6 @@ class RssAdapter(context: Context, val callBack: CallBack) : getItemByLayoutPosition(holder.layoutPosition)?.let { showMenu(ivIcon, it) } - true } } } diff --git a/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt b/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt index daf1dde0d..6441cea91 100644 --- a/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt @@ -6,11 +6,12 @@ import android.view.MenuItem import android.view.SubMenu import android.view.View import androidx.appcompat.widget.SearchView +import androidx.fragment.app.viewModels import androidx.lifecycle.LiveData -import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseFragment import io.legado.app.constant.AppPattern +import io.legado.app.data.appDb import io.legado.app.data.entities.RssSource import io.legado.app.databinding.FragmentRssBinding import io.legado.app.databinding.ItemRssBinding @@ -24,11 +25,11 @@ import io.legado.app.ui.rss.source.manage.RssSourceActivity import io.legado.app.ui.rss.source.manage.RssSourceViewModel import io.legado.app.ui.rss.subscription.RuleSubActivity import io.legado.app.utils.cnCompare -import io.legado.app.utils.getViewModel +import io.legado.app.utils.openUrl import io.legado.app.utils.splitNotBlank import io.legado.app.utils.startActivity import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onClick + /** * 订阅界面 @@ -39,7 +40,7 @@ class RssFragment : VMBaseFragment(R.layout.fragment_rss), private lateinit var adapter: RssAdapter private lateinit var searchView: SearchView override val viewModel: RssSourceViewModel - get() = getViewModel(RssSourceViewModel::class.java) + by viewModels() private var liveRssData: LiveData>? = null private val groups = linkedSetOf() private var liveGroup: LiveData>? = null @@ -106,7 +107,7 @@ class RssFragment : VMBaseFragment(R.layout.fragment_rss), ItemRssBinding.inflate(layoutInflater, it, false).apply { tvName.setText(R.string.rule_subscription) ivIcon.setImageResource(R.drawable.image_legado) - root.onClick { + root.setOnClickListener { startActivity() } } @@ -116,12 +117,12 @@ class RssFragment : VMBaseFragment(R.layout.fragment_rss), private fun initData(searchKey: String? = null) { liveRssData?.removeObservers(this) liveRssData = when { - searchKey.isNullOrEmpty() -> App.db.rssSourceDao.liveEnabled() + searchKey.isNullOrEmpty() -> appDb.rssSourceDao.liveEnabled() searchKey.startsWith("group:") -> { val key = searchKey.substringAfter("group:") - App.db.rssSourceDao.liveEnabledByGroup("%$key%") + appDb.rssSourceDao.liveEnabledByGroup("%$key%") } - else -> App.db.rssSourceDao.liveEnabled("%$searchKey%") + else -> appDb.rssSourceDao.liveEnabled("%$searchKey%") }.apply { observe(viewLifecycleOwner, { adapter.setItems(it) @@ -131,7 +132,7 @@ class RssFragment : VMBaseFragment(R.layout.fragment_rss), private fun initGroupData() { liveGroup?.removeObservers(viewLifecycleOwner) - liveGroup = App.db.rssSourceDao.liveGroup() + liveGroup = appDb.rssSourceDao.liveGroup() liveGroup?.observe(viewLifecycleOwner, { groups.clear() it.map { group -> @@ -143,12 +144,18 @@ class RssFragment : VMBaseFragment(R.layout.fragment_rss), override fun openRss(rssSource: RssSource) { if (rssSource.singleUrl) { - startActivity( - Pair("title", rssSource.sourceName), - Pair("origin", rssSource.sourceUrl) - ) + if (rssSource.sourceUrl.startsWith("http", true)) { + startActivity { + putExtra("title", rssSource.sourceName) + putExtra("origin", rssSource.sourceUrl) + } + } else { + context?.openUrl(rssSource.sourceUrl) + } } else { - startActivity(Pair("url", rssSource.sourceUrl)) + startActivity { + putExtra("url", rssSource.sourceUrl) + } } } @@ -157,7 +164,9 @@ class RssFragment : VMBaseFragment(R.layout.fragment_rss), } override fun edit(rssSource: RssSource) { - startActivity(Pair("data", rssSource.sourceUrl)) + startActivity { + putExtra("data", rssSource.sourceUrl) + } } override fun del(rssSource: RssSource) { diff --git a/app/src/main/java/io/legado/app/ui/qrcode/QrCodeActivity.kt b/app/src/main/java/io/legado/app/ui/qrcode/QrCodeActivity.kt index 2d0ed31e6..72a2f980b 100644 --- a/app/src/main/java/io/legado/app/ui/qrcode/QrCodeActivity.kt +++ b/app/src/main/java/io/legado/app/ui/qrcode/QrCodeActivity.kt @@ -6,36 +6,28 @@ import android.graphics.BitmapFactory import android.os.Bundle import android.view.Menu import android.view.MenuItem -import android.view.View -import cn.bingoogolapple.qrcode.core.QRCodeView +import com.google.zxing.Result +import com.king.zxing.CameraScan.OnScanResultCallback import io.legado.app.R import io.legado.app.base.BaseActivity import io.legado.app.databinding.ActivityQrcodeCaptureBinding -import io.legado.app.help.permission.Permissions -import io.legado.app.help.permission.PermissionsCompat +import io.legado.app.utils.QRCodeUtils import io.legado.app.utils.readBytes -import org.jetbrains.anko.toast -class QrCodeActivity : BaseActivity(), QRCodeView.Delegate { +class QrCodeActivity : BaseActivity(), OnScanResultCallback { private val requestQrImage = 202 - private var flashlightIsOpen: Boolean = false override fun getViewBinding(): ActivityQrcodeCaptureBinding { return ActivityQrcodeCaptureBinding.inflate(layoutInflater) } override fun onActivityCreated(savedInstanceState: Bundle?) { - binding.zXingView.setDelegate(this) - binding.fabFlashlight.setOnClickListener { - if (flashlightIsOpen) { - flashlightIsOpen = false - binding.zXingView.closeFlashlight() - } else { - flashlightIsOpen = true - binding.zXingView.openFlashlight() - } - } + val fTag = "qrCodeFragment" + val qrCodeFragment = QrCodeFragment() + supportFragmentManager.beginTransaction() + .replace(R.id.fl_content, qrCodeFragment, fTag) + .commit() } override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { @@ -55,60 +47,21 @@ class QrCodeActivity : BaseActivity(), QRCodeView. return super.onCompatOptionsItemSelected(item) } - override fun onStart() { - super.onStart() - startCamera() - } - - private fun startCamera() { - PermissionsCompat.Builder(this) - .addPermissions(*Permissions.Group.CAMERA) - .rationale(R.string.qr_per) - .onGranted { - binding.zXingView.visibility = View.VISIBLE - //TODO 显示扫描框,并开始识别 - binding.zXingView.startSpotAndShowRect() - }.request() - } - - override fun onStop() { - //TODO 关闭摄像头预览,并且隐藏扫描框 - binding.zXingView.stopCamera() - super.onStop() - } - - override fun onDestroy() { - //TODO 销毁二维码扫描控件 - binding.zXingView.onDestroy() - super.onDestroy() - } - - override fun onScanQRCodeSuccess(result: String) { + override fun onScanResultCallback(result: Result?): Boolean { val intent = Intent() - intent.putExtra("result", result) + intent.putExtra("result", result?.text) setResult(RESULT_OK, intent) finish() - } - - override fun onCameraAmbientBrightnessChanged(isDark: Boolean) { - - } - - override fun onScanQRCodeOpenCameraError() { - toast("打开相机失败") + return true } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) data?.data?.let { - //TODO 显示扫描框,并开始识别 - binding.zXingView.startSpotAndShowRect() - if (resultCode == Activity.RESULT_OK && requestCode == requestQrImage) { - // 本来就用到 QRCodeView 时可直接调 QRCodeView 的方法,走通用的回调 it.readBytes(this)?.let { bytes -> val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) - binding.zXingView.decodeQRCode(bitmap) + onScanResultCallback(QRCodeUtils.parseCodeResult(bitmap)) } } } diff --git a/app/src/main/java/io/legado/app/ui/qrcode/QrCodeFragment.kt b/app/src/main/java/io/legado/app/ui/qrcode/QrCodeFragment.kt new file mode 100644 index 000000000..d279ca9eb --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/qrcode/QrCodeFragment.kt @@ -0,0 +1,13 @@ +package io.legado.app.ui.qrcode + +import com.google.zxing.Result +import com.king.zxing.CaptureFragment + +class QrCodeFragment : CaptureFragment() { + + override fun onScanResultCallback(result: Result?): Boolean { + (activity as? QrCodeActivity)?.onScanResultCallback(result) + return true + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/replace/GroupManageDialog.kt b/app/src/main/java/io/legado/app/ui/replace/GroupManageDialog.kt index a5e23d96f..5917453cf 100644 --- a/app/src/main/java/io/legado/app/ui/replace/GroupManageDialog.kt +++ b/app/src/main/java/io/legado/app/ui/replace/GroupManageDialog.kt @@ -9,12 +9,13 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar import androidx.fragment.app.DialogFragment +import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.LinearLayoutManager -import io.legado.app.App import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.constant.AppPattern +import io.legado.app.data.appDb import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogRecyclerViewBinding import io.legado.app.databinding.ItemGroupManageBinding @@ -24,10 +25,10 @@ import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onClick + class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { - private lateinit var viewModel: ReplaceRuleViewModel + private val viewModel: ReplaceRuleViewModel by activityViewModels() private lateinit var adapter: GroupAdapter private val binding by viewBinding(DialogRecyclerViewBinding::bind) @@ -42,7 +43,6 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { container: ViewGroup?, savedInstanceState: Bundle? ): View? { - viewModel = getViewModelOfActivity(ReplaceRuleViewModel::class.java) return inflater.inflate(R.layout.dialog_recycler_view, container) } @@ -62,7 +62,7 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { recyclerView.layoutManager = LinearLayoutManager(requireContext()) recyclerView.addItemDecoration(VerticalDivider(requireContext())) recyclerView.adapter = adapter - App.db.replaceRuleDao.liveGroup().observe(viewLifecycleOwner, { + appDb.replaceRuleDao.liveGroup().observe(viewLifecycleOwner, { val groups = linkedSetOf() it.map { group -> groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) @@ -101,11 +101,11 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { @SuppressLint("InflateParams") private fun editGroup(group: String) { alert(title = getString(R.string.group_edit)) { - val alertBinding = DialogEditTextBinding.inflate(layoutInflater) - customView = alertBinding.apply { + val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply { editView.hint = "分组名称" editView.setText(group) - }.root + } + customView { alertBinding.root } yesButton { viewModel.upGroup(group, alertBinding.editView.text?.toString()) } @@ -134,13 +134,13 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { override fun registerListener(holder: ItemViewHolder, binding: ItemGroupManageBinding) { binding.apply { - tvEdit.onClick { + tvEdit.setOnClickListener { getItem(holder.layoutPosition)?.let { editGroup(it) } } - tvDel.onClick { + tvDel.setOnClickListener { getItem(holder.layoutPosition)?.let { viewModel.delGroup(it) } } } diff --git a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt index af44e0c32..9b5926b5f 100644 --- a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt @@ -7,16 +7,17 @@ import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.view.SubMenu +import androidx.activity.viewModels import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.SearchView import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.LiveData import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager -import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.AppPattern +import io.legado.app.data.appDb import io.legado.app.data.entities.ReplaceRule import io.legado.app.databinding.ActivityReplaceRuleBinding import io.legado.app.databinding.DialogEditTextBinding @@ -29,14 +30,14 @@ import io.legado.app.service.help.ReadBook import io.legado.app.ui.association.ImportReplaceRuleActivity import io.legado.app.ui.filepicker.FilePicker import io.legado.app.ui.filepicker.FilePickerDialog +import io.legado.app.ui.qrcode.QrCodeActivity import io.legado.app.ui.replace.edit.ReplaceEditActivity import io.legado.app.ui.widget.SelectActionBar +import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.* -import org.jetbrains.anko.startActivity -import org.jetbrains.anko.toast import java.io.File /** @@ -48,11 +49,11 @@ class ReplaceRuleActivity : VMBaseActivity() @@ -145,14 +146,14 @@ class ReplaceRuleActivity : VMBaseActivity { - App.db.replaceRuleDao.liveDataAll() + appDb.replaceRuleDao.liveDataAll() } searchKey.startsWith("group:") -> { val key = searchKey.substringAfter("group:") - App.db.replaceRuleDao.liveDataGroupSearch("%$key%") + appDb.replaceRuleDao.liveDataGroupSearch("%$key%") } else -> { - App.db.replaceRuleDao.liveDataSearch("%$searchKey%") + appDb.replaceRuleDao.liveDataSearch("%$searchKey%") } }.apply { observe(this@ReplaceRuleActivity, { @@ -166,7 +167,7 @@ class ReplaceRuleActivity : VMBaseActivity groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) @@ -186,6 +187,8 @@ class ReplaceRuleActivity : VMBaseActivity showImportDialog() R.id.menu_import_source_local -> FilePicker .selectFile(this, importRequestCode, allowExtensions = arrayOf("txt", "json")) + R.id.menu_import_source_qr -> startActivityForResult(importRequestCodeQr) + R.id.menu_help -> showHelp() else -> if (item.groupId == R.id.replace_group) { searchView.setQuery("group:${item.title}", true) } @@ -224,7 +227,7 @@ class ReplaceRuleActivity : VMBaseActivity("source" to it) + startActivity { + putExtra("source", it) + } } } cancelButton() }.show() } + private fun showHelp() { + val text = String(assets.open("help/replaceRuleHelp.md").readBytes()) + TextDialog.show(supportFragmentManager, text, TextDialog.MD) + } + override fun onQueryTextChange(newText: String?): Boolean { observeReplaceRuleData(newText) return false @@ -256,10 +266,19 @@ class ReplaceRuleActivity : VMBaseActivity("dataKey" to dataKey) + startActivity { + putExtra("dataKey", dataKey) + } } }.onFailure { - toast("readTextError:${it.localizedMessage}") + toastOnUi("readTextError:${it.localizedMessage}") + } + } + } + importRequestCodeQr -> if (resultCode == Activity.RESULT_OK) { + data?.getStringExtra("result")?.let { + startActivity { + putExtra("source", it) } } } diff --git a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt index c8356bea7..1972674b1 100644 --- a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt @@ -16,7 +16,8 @@ import io.legado.app.databinding.ItemReplaceRuleBinding import io.legado.app.lib.theme.backgroundColor import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback -import org.jetbrains.anko.sdk27.listeners.onClick +import io.legado.app.utils.ColorUtils + import java.util.* @@ -110,7 +111,7 @@ class ReplaceRuleAdapter(context: Context, var callBack: CallBack) : with(binding) { val bundle = payloads.getOrNull(0) as? Bundle if (bundle == null) { - root.setBackgroundColor(context.backgroundColor) + root.setBackgroundColor(ColorUtils.withAlpha(context.backgroundColor, 0.5f)) if (item.group.isNullOrEmpty()) { cbName.text = item.name } else { @@ -147,12 +148,12 @@ class ReplaceRuleAdapter(context: Context, var callBack: CallBack) : } } } - ivEdit.onClick { + ivEdit.setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.edit(it) } } - cbName.onClick { + cbName.setOnClickListener { getItem(holder.layoutPosition)?.let { if (cbName.isChecked) { selected.add(it) @@ -162,7 +163,7 @@ class ReplaceRuleAdapter(context: Context, var callBack: CallBack) : } callBack.upCountView() } - ivMenuMore.onClick { + ivMenuMore.setOnClickListener { showMenu(ivMenuMore, holder.layoutPosition) } } diff --git a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleViewModel.kt b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleViewModel.kt index 33e68f6c1..b0f18067d 100644 --- a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleViewModel.kt @@ -3,51 +3,47 @@ package io.legado.app.ui.replace import android.app.Application import android.text.TextUtils import androidx.documentfile.provider.DocumentFile -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.ReplaceRule -import io.legado.app.utils.FileUtils -import io.legado.app.utils.GSON -import io.legado.app.utils.splitNotBlank -import io.legado.app.utils.writeText -import org.jetbrains.anko.toast +import io.legado.app.utils.* import java.io.File class ReplaceRuleViewModel(application: Application) : BaseViewModel(application) { fun update(vararg rule: ReplaceRule) { execute { - App.db.replaceRuleDao.update(*rule) + appDb.replaceRuleDao.update(*rule) } } fun delete(rule: ReplaceRule) { execute { - App.db.replaceRuleDao.delete(rule) + appDb.replaceRuleDao.delete(rule) } } fun toTop(rule: ReplaceRule) { execute { - rule.order = App.db.replaceRuleDao.minOrder - 1 - App.db.replaceRuleDao.update(rule) + rule.order = appDb.replaceRuleDao.minOrder - 1 + appDb.replaceRuleDao.update(rule) } } fun toBottom(rule: ReplaceRule) { execute { - rule.order = App.db.replaceRuleDao.maxOrder + 1 - App.db.replaceRuleDao.update(rule) + rule.order = appDb.replaceRuleDao.maxOrder + 1 + appDb.replaceRuleDao.update(rule) } } fun upOrder() { execute { - val rules = App.db.replaceRuleDao.all + val rules = appDb.replaceRuleDao.all for ((index, rule) in rules.withIndex()) { rule.order = index + 1 } - App.db.replaceRuleDao.update(*rules.toTypedArray()) + appDb.replaceRuleDao.update(*rules.toTypedArray()) } } @@ -57,7 +53,7 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application rules.forEach { list.add(it.copy(isEnabled = true)) } - App.db.replaceRuleDao.update(*list.toTypedArray()) + appDb.replaceRuleDao.update(*list.toTypedArray()) } } @@ -67,13 +63,13 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application rules.forEach { list.add(it.copy(isEnabled = false)) } - App.db.replaceRuleDao.update(*list.toTypedArray()) + appDb.replaceRuleDao.update(*list.toTypedArray()) } } fun delSelection(rules: LinkedHashSet) { execute { - App.db.replaceRuleDao.delete(*rules.toTypedArray()) + appDb.replaceRuleDao.delete(*rules.toTypedArray()) } } @@ -83,9 +79,9 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application FileUtils.createFileIfNotExist(file, "exportReplaceRule.json") .writeText(json) }.onSuccess { - context.toast("成功导出至\n${file.absolutePath}") + context.toastOnUi("成功导出至\n${file.absolutePath}") }.onError { - context.toast("导出失败\n${it.localizedMessage}") + context.toastOnUi("导出失败\n${it.localizedMessage}") } } @@ -96,25 +92,25 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application doc.createFile("", "exportReplaceRule.json") ?.writeText(context, json) }.onSuccess { - context.toast("成功导出至\n${doc.uri.path}") + context.toastOnUi("成功导出至\n${doc.uri.path}") }.onError { - context.toast("导出失败\n${it.localizedMessage}") + context.toastOnUi("导出失败\n${it.localizedMessage}") } } fun addGroup(group: String) { execute { - val sources = App.db.replaceRuleDao.noGroup + val sources = appDb.replaceRuleDao.noGroup sources.map { source -> source.group = group } - App.db.replaceRuleDao.update(*sources.toTypedArray()) + appDb.replaceRuleDao.update(*sources.toTypedArray()) } } fun upGroup(oldGroup: String, newGroup: String?) { execute { - val sources = App.db.replaceRuleDao.getByGroup(oldGroup) + val sources = appDb.replaceRuleDao.getByGroup(oldGroup) sources.map { source -> source.group?.splitNotBlank(",")?.toHashSet()?.let { it.remove(oldGroup) @@ -123,21 +119,21 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application source.group = TextUtils.join(",", it) } } - App.db.replaceRuleDao.update(*sources.toTypedArray()) + appDb.replaceRuleDao.update(*sources.toTypedArray()) } } fun delGroup(group: String) { execute { execute { - val sources = App.db.replaceRuleDao.getByGroup(group) + val sources = appDb.replaceRuleDao.getByGroup(group) sources.map { source -> source.group?.splitNotBlank(",")?.toHashSet()?.let { it.remove(group) source.group = TextUtils.join(",", it) } } - App.db.replaceRuleDao.update(*sources.toTypedArray()) + appDb.replaceRuleDao.update(*sources.toTypedArray()) } } } 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 9d56d65e4..e4349c296 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 @@ -10,20 +10,20 @@ import android.view.MenuItem import android.view.ViewTreeObserver import android.widget.EditText import android.widget.PopupWindow +import androidx.activity.viewModels import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.AppConst import io.legado.app.constant.EventBus import io.legado.app.data.entities.ReplaceRule import io.legado.app.databinding.ActivityReplaceEditBinding +import io.legado.app.lib.dialogs.selector import io.legado.app.ui.widget.KeyboardToolPop import io.legado.app.ui.widget.dialog.TextDialog -import io.legado.app.utils.getViewModel +import io.legado.app.utils.getSize + import io.legado.app.utils.postEvent -import org.jetbrains.anko.displayMetrics -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.selector -import org.jetbrains.anko.toast +import io.legado.app.utils.toastOnUi import kotlin.math.abs /** @@ -57,7 +57,7 @@ class ReplaceEditActivity : } override val viewModel: ReplaceEditViewModel - get() = getViewModel(ReplaceEditViewModel::class.java) + by viewModels() private var mSoftKeyboardTool: PopupWindow? = null private var mIsSoftKeyBoardShowing = false @@ -68,7 +68,7 @@ class ReplaceEditActivity : viewModel.initData(intent) { upReplaceView(it) } - binding.ivHelp.onClick { + binding.ivHelp.setOnClickListener { showRegexHelp() } } @@ -83,7 +83,7 @@ class ReplaceEditActivity : R.id.menu_save -> { val rule = getReplaceRule() if (!rule.isValid()) { - toast(R.string.replace_rule_invalid) + toastOnUi(R.string.replace_rule_invalid) } else { viewModel.save(rule) { postEvent(EventBus.REPLACE_RULE_SAVE, "") @@ -171,7 +171,7 @@ class ReplaceEditActivity : val rect = Rect() // 获取当前页面窗口的显示范围 window.decorView.getWindowVisibleDisplayFrame(rect) - val screenHeight = this.displayMetrics.heightPixels + val screenHeight = this.getSize().heightPixels val keyboardHeight = screenHeight - rect.bottom // 输入法的高度 val preShowing = mIsSoftKeyBoardShowing if (abs(keyboardHeight) > screenHeight / 5) { diff --git a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditViewModel.kt b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditViewModel.kt index 551c73aeb..fd37bb36d 100644 --- a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditViewModel.kt @@ -2,8 +2,8 @@ package io.legado.app.ui.replace.edit import android.app.Application import android.content.Intent -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.ReplaceRule class ReplaceEditViewModel(application: Application) : BaseViewModel(application) { @@ -14,7 +14,7 @@ class ReplaceEditViewModel(application: Application) : BaseViewModel(application execute { val id = intent.getLongExtra("id", -1) if (id > 0) { - replaceRule = App.db.replaceRuleDao.findById(id) + replaceRule = appDb.replaceRuleDao.findById(id) } else { val pattern = intent.getStringExtra("pattern") ?: "" val isRegex = intent.getBooleanExtra("isRegex", false) @@ -36,9 +36,9 @@ class ReplaceEditViewModel(application: Application) : BaseViewModel(application fun save(replaceRule: ReplaceRule, success: () -> Unit) { execute { if (replaceRule.order == 0) { - replaceRule.order = App.db.replaceRuleDao.maxOrder + 1 + replaceRule.order = appDb.replaceRuleDao.maxOrder + 1 } - App.db.replaceRuleDao.insert(replaceRule) + appDb.replaceRuleDao.insert(replaceRule) }.onSuccess { success() } diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt index b321a9e74..cabd5b51a 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt @@ -12,10 +12,10 @@ import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.data.entities.RssArticle import io.legado.app.databinding.ItemRssArticleBinding import io.legado.app.help.ImageLoader +import io.legado.app.utils.getCompatColor import io.legado.app.utils.gone import io.legado.app.utils.visible -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.textColorResource + class RssArticlesAdapter(context: Context, callBack: CallBack) : BaseRssArticlesAdapter(context, callBack) { @@ -67,15 +67,15 @@ class RssArticlesAdapter(context: Context, callBack: CallBack) : }.into(imageView) } if (item.read) { - tvTitle.textColorResource = R.color.tv_text_summary + tvTitle.setTextColor(context.getCompatColor(R.color.tv_text_summary)) } else { - tvTitle.textColorResource = R.color.primaryText + tvTitle.setTextColor(context.getCompatColor(R.color.primaryText)) } } } override fun registerListener(holder: ItemViewHolder, binding: ItemRssArticleBinding) { - holder.itemView.onClick { + holder.itemView.setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.readRss(it) } diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter1.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter1.kt index 4b77fa6e7..2c8ff0d8f 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter1.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter1.kt @@ -12,10 +12,10 @@ import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.data.entities.RssArticle import io.legado.app.databinding.ItemRssArticle1Binding import io.legado.app.help.ImageLoader +import io.legado.app.utils.getCompatColor import io.legado.app.utils.gone import io.legado.app.utils.visible -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.textColorResource + class RssArticlesAdapter1(context: Context, callBack: CallBack) : BaseRssArticlesAdapter(context, callBack) { @@ -67,15 +67,15 @@ class RssArticlesAdapter1(context: Context, callBack: CallBack) : }.into(imageView) } if (item.read) { - tvTitle.textColorResource = R.color.tv_text_summary + tvTitle.setTextColor(context.getCompatColor(R.color.tv_text_summary)) } else { - tvTitle.textColorResource = R.color.primaryText + tvTitle.setTextColor(context.getCompatColor(R.color.primaryText)) } } } override fun registerListener(holder: ItemViewHolder, binding: ItemRssArticle1Binding) { - holder.itemView.onClick { + holder.itemView.setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.readRss(it) } diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter2.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter2.kt index 44c0df7ed..a82300afe 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter2.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter2.kt @@ -12,10 +12,10 @@ import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.data.entities.RssArticle import io.legado.app.databinding.ItemRssArticle2Binding import io.legado.app.help.ImageLoader +import io.legado.app.utils.getCompatColor import io.legado.app.utils.gone import io.legado.app.utils.visible -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.textColorResource + class RssArticlesAdapter2(context: Context, callBack: CallBack) : BaseRssArticlesAdapter(context, callBack) { @@ -67,15 +67,15 @@ class RssArticlesAdapter2(context: Context, callBack: CallBack) : }.into(imageView) } if (item.read) { - tvTitle.textColorResource = R.color.tv_text_summary + tvTitle.setTextColor(context.getCompatColor(R.color.tv_text_summary)) } else { - tvTitle.textColorResource = R.color.primaryText + tvTitle.setTextColor(context.getCompatColor(R.color.primaryText)) } } } override fun registerListener(holder: ItemViewHolder, binding: ItemRssArticle2Binding) { - holder.itemView.onClick { + holder.itemView.setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.readRss(it) } diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt index 5bda67e44..221b296ae 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt @@ -1,14 +1,17 @@ package io.legado.app.ui.rss.article + import android.os.Bundle import android.view.View +import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels import androidx.lifecycle.LiveData import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseFragment +import io.legado.app.data.appDb import io.legado.app.data.entities.RssArticle import io.legado.app.databinding.FragmentRssArticlesBinding import io.legado.app.databinding.ViewLoadMoreBinding @@ -16,8 +19,6 @@ import io.legado.app.lib.theme.ATH import io.legado.app.ui.rss.read.ReadRssActivity import io.legado.app.ui.widget.recycler.LoadMoreView import io.legado.app.ui.widget.recycler.VerticalDivider -import io.legado.app.utils.getViewModel -import io.legado.app.utils.getViewModelOfActivity import io.legado.app.utils.startActivity import io.legado.app.utils.viewbindingdelegate.viewBinding @@ -37,9 +38,9 @@ class RssArticlesFragment : VMBaseFragment(R.layout.fragme private val binding by viewBinding(FragmentRssArticlesBinding::bind) private val activityViewModel: RssSortViewModel - get() = getViewModelOfActivity(RssSortViewModel::class.java) + by activityViewModels() override val viewModel: RssArticlesViewModel - get() = getViewModel(RssArticlesViewModel::class.java) + by viewModels() lateinit var adapter: BaseRssArticlesAdapter<*> private lateinit var loadMoreView: LoadMoreView private var rssArticlesData: LiveData>? = null @@ -93,7 +94,7 @@ class RssArticlesFragment : VMBaseFragment(R.layout.fragme private fun initData() { activityViewModel.url?.let { rssArticlesData?.removeObservers(this) - rssArticlesData = App.db.rssArticleDao.liveByOriginSort(it, viewModel.sortName) + rssArticlesData = appDb.rssArticleDao.liveByOriginSort(it, viewModel.sortName) rssArticlesData?.observe(viewLifecycleOwner, { list -> adapter.setItems(list) }) @@ -123,10 +124,10 @@ class RssArticlesFragment : VMBaseFragment(R.layout.fragme override fun readRss(rssArticle: RssArticle) { activityViewModel.read(rssArticle) - startActivity( - Pair("title", rssArticle.title), - Pair("origin", rssArticle.origin), - Pair("link", rssArticle.link) - ) + startActivity { + putExtra("title", rssArticle.title) + putExtra("origin", rssArticle.origin) + putExtra("link", rssArticle.link) + } } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesViewModel.kt index 1196e2ebd..1f81c4ba2 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesViewModel.kt @@ -3,8 +3,8 @@ package io.legado.app.ui.rss.article import android.app.Application import android.os.Bundle import androidx.lifecycle.MutableLiveData -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.RssArticle import io.legado.app.data.entities.RssSource import io.legado.app.model.rss.Rss @@ -37,9 +37,9 @@ class RssArticlesViewModel(application: Application) : BaseViewModel(application list.forEach { rssArticle -> rssArticle.order = order-- } - App.db.rssArticleDao.insert(*list.toTypedArray()) + appDb.rssArticleDao.insert(*list.toTypedArray()) if (!rssSource.ruleNextPage.isNullOrEmpty()) { - App.db.rssArticleDao.clearOld(rssSource.sourceUrl, sortName, order) + appDb.rssArticleDao.clearOld(rssSource.sourceUrl, sortName, order) loadFinally.postValue(true) } else { withContext(Dispatchers.Main) { @@ -51,7 +51,7 @@ class RssArticlesViewModel(application: Application) : BaseViewModel(application }.onError { loadFinally.postValue(false) it.printStackTrace() - toast(it.localizedMessage) + toastOnUi(it.localizedMessage) } } @@ -81,7 +81,7 @@ class RssArticlesViewModel(application: Application) : BaseViewModel(application return@let } val firstArticle = list.first() - val dbArticle = App.db.rssArticleDao + val dbArticle = appDb.rssArticleDao .get(firstArticle.origin, firstArticle.link) if (dbArticle != null) { loadFinally.postValue(false) @@ -89,7 +89,7 @@ class RssArticlesViewModel(application: Application) : BaseViewModel(application list.forEach { rssArticle -> rssArticle.order = order-- } - App.db.rssArticleDao.insert(*list.toTypedArray()) + appDb.rssArticleDao.insert(*list.toTypedArray()) } } isLoading = false diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt index 705276072..46d3480d7 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.os.Bundle import android.view.Menu import android.view.MenuItem +import androidx.activity.viewModels import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentStatePagerAdapter @@ -12,15 +13,14 @@ import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.databinding.ActivityRssArtivlesBinding import io.legado.app.ui.rss.source.edit.RssSourceEditActivity -import io.legado.app.utils.getViewModel import io.legado.app.utils.gone +import io.legado.app.utils.startActivityForResult import io.legado.app.utils.visible -import org.jetbrains.anko.startActivityForResult class RssSortActivity : VMBaseActivity() { override val viewModel: RssSortViewModel - get() = getViewModel(RssSortViewModel::class.java) + by viewModels() private val editSource = 12319 private val fragments = linkedMapOf() private lateinit var adapter: TabFragmentPageAdapter @@ -49,7 +49,9 @@ class RssSortActivity : VMBaseActivity viewModel.rssSource?.sourceUrl?.let { - startActivityForResult(editSource, Pair("data", it)) + startActivityForResult(editSource) { + putExtra("data", it) + } } R.id.menu_clear -> { viewModel.url?.let { diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt index a22c3456c..9a3b4be72 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt @@ -3,8 +3,8 @@ package io.legado.app.ui.rss.article import android.app.Application import android.content.Intent import androidx.lifecycle.MutableLiveData -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.RssArticle import io.legado.app.data.entities.RssReadRecord import io.legado.app.data.entities.RssSource @@ -21,7 +21,7 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) { execute { url = intent.getStringExtra("url") url?.let { url -> - rssSource = App.db.rssSourceDao.getByKey(url) + rssSource = appDb.rssSourceDao.getByKey(url) rssSource?.let { titleLiveData.postValue(it.sourceName) } ?: let { @@ -41,21 +41,21 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) { it.articleStyle = 0 } execute { - App.db.rssSourceDao.update(it) + appDb.rssSourceDao.update(it) } } } fun read(rssArticle: RssArticle) { execute { - App.db.rssArticleDao.insertRecord(RssReadRecord(rssArticle.link)) + appDb.rssArticleDao.insertRecord(RssReadRecord(rssArticle.link)) } } fun clearArticles() { execute { url?.let { - App.db.rssArticleDao.delete(it) + appDb.rssArticleDao.delete(it) } order = System.currentTimeMillis() }.onSuccess { diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt index 99d9f47a1..403a06d2e 100644 --- a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt @@ -3,13 +3,13 @@ package io.legado.app.ui.rss.favorites import android.os.Bundle import androidx.lifecycle.LiveData import androidx.recyclerview.widget.LinearLayoutManager -import io.legado.app.App import io.legado.app.base.BaseActivity +import io.legado.app.data.appDb import io.legado.app.data.entities.RssStar import io.legado.app.databinding.ActivityRssFavoritesBinding import io.legado.app.ui.rss.read.ReadRssActivity import io.legado.app.ui.widget.recycler.VerticalDivider -import org.jetbrains.anko.startActivity +import io.legado.app.utils.startActivity class RssFavoritesActivity : BaseActivity(), @@ -38,17 +38,17 @@ class RssFavoritesActivity : BaseActivity(), private fun initData() { liveData?.removeObservers(this) - liveData = App.db.rssStarDao.liveAll() + liveData = appDb.rssStarDao.liveAll() liveData?.observe(this, { adapter.setItems(it) }) } override fun readRss(rssStar: RssStar) { - startActivity( - Pair("title", rssStar.title), - Pair("origin", rssStar.origin), - Pair("link", rssStar.link) - ) + startActivity { + putExtra("title", rssStar.title) + putExtra("origin", rssStar.origin) + putExtra("link", rssStar.link) + } } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt index 775388364..517c4bb27 100644 --- a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt @@ -14,7 +14,7 @@ import io.legado.app.databinding.ItemRssArticleBinding import io.legado.app.help.ImageLoader import io.legado.app.utils.gone import io.legado.app.utils.visible -import org.jetbrains.anko.sdk27.listeners.onClick + class RssFavoritesAdapter(context: Context, val callBack: CallBack) : RecyclerAdapter(context) { @@ -65,7 +65,7 @@ class RssFavoritesAdapter(context: Context, val callBack: CallBack) : } override fun registerListener(holder: ItemViewHolder, binding: ItemRssArticleBinding) { - holder.itemView.onClick { + holder.itemView.setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.readRss(it) } diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index eb211f0eb..42372eaf5 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -10,10 +10,13 @@ import android.os.Bundle import android.os.Environment import android.view.* import android.webkit.* +import androidx.activity.viewModels import androidx.core.view.size import io.legado.app.R import io.legado.app.base.VMBaseActivity +import io.legado.app.constant.AppConst import io.legado.app.databinding.ActivityRssReadBinding +import io.legado.app.help.AppConfig import io.legado.app.lib.theme.DrawableUtils import io.legado.app.lib.theme.primaryTextColor import io.legado.app.service.help.Download @@ -25,9 +28,8 @@ import io.legado.app.ui.filepicker.FilePickerDialog import io.legado.app.utils.* import kotlinx.coroutines.launch import org.apache.commons.text.StringEscapeUtils -import org.jetbrains.anko.downloadManager -import org.jetbrains.anko.share import org.jsoup.Jsoup +import splitties.systemservices.downloadManager class ReadRssActivity : VMBaseActivity(false), @@ -35,7 +37,7 @@ class ReadRssActivity : VMBaseActivity ReadRssViewModel.CallBack { override val viewModel: ReadRssViewModel - get() = getViewModel(ReadRssViewModel::class.java) + by viewModels() private val savePathRequestCode = 132 private val imagePathKey = "" private var starMenuItem: MenuItem? = null @@ -94,79 +96,17 @@ class ReadRssActivity : VMBaseActivity return super.onCompatOptionsItemSelected(item) } + @SuppressLint("SetJavaScriptEnabled") private fun initWebView() { - binding.webView.webChromeClient = object : WebChromeClient() { - override fun onShowCustomView(view: View?, callback: CustomViewCallback?) { - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR - binding.llView.invisible() - binding.customWebView.addView(view) - customWebViewCallback = callback - } - - override fun onHideCustomView() { - binding.customWebView.removeAllViews() - binding.llView.visible() - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED - } - } - binding.webView.webViewClient = object : WebViewClient() { - override fun shouldOverrideUrlLoading( - view: WebView?, - request: WebResourceRequest? - ): Boolean { - request?.let { - if (it.url.scheme == "http" || it.url.scheme == "https") { - return false - } else if (it.url.scheme == "yuedu") { - when (it.url.host) { - "booksource" -> { - val intent = Intent( - this@ReadRssActivity, - ImportBookSourceActivity::class.java - ) - intent.data = it.url - startActivity(intent) - } - "rsssource" -> { - val intent = Intent( - this@ReadRssActivity, - ImportRssSourceActivity::class.java - ) - intent.data = it.url - startActivity(intent) - } - "replace" -> { - val intent = Intent( - this@ReadRssActivity, - ImportReplaceRuleActivity::class.java - ) - intent.data = it.url - startActivity(intent) - } - } - return true - } - openUrl(it.url) - } - return true - } - - @Suppress("DEPRECATION") - override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { - if (url?.startsWith("http", true) == true) { - return false - } - url?.let { - openUrl(it) - } - return true - } - } + binding.webView.webChromeClient = RssWebChromeClient() + binding.webView.webViewClient = RssWebViewClient() binding.webView.settings.apply { mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW domStorageEnabled = true allowContentAccess = true + //javaScriptEnabled = true } + upWebViewTheme() binding.webView.setOnLongClickListener { val hitTestResult = binding.webView.hitTestResult if (hitTestResult.type == WebView.HitTestResult.IMAGE_TYPE || @@ -207,6 +147,7 @@ class ReadRssActivity : VMBaseActivity Download.start(this, downloadId, fileName) } } + } private fun saveImage() { @@ -254,6 +195,13 @@ class ReadRssActivity : VMBaseActivity } } + private fun upWebViewTheme() { + if (AppConfig.isNightTheme) { + binding.webView + .evaluateJavascript(AppConst.darkWebViewJs, null) + } + } + override fun upStarMenu() { if (viewModel.rssStar != null) { starMenuItem?.setIcon(R.drawable.ic_star) @@ -336,4 +284,83 @@ class ReadRssActivity : VMBaseActivity binding.webView.destroy() } + inner class RssWebChromeClient : WebChromeClient() { + override fun onShowCustomView(view: View?, callback: CustomViewCallback?) { + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR + binding.llView.invisible() + binding.customWebView.addView(view) + customWebViewCallback = callback + } + + override fun onHideCustomView() { + binding.customWebView.removeAllViews() + binding.llView.visible() + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED + } + } + + inner class RssWebViewClient : WebViewClient() { + override fun shouldOverrideUrlLoading( + view: WebView?, + request: WebResourceRequest? + ): Boolean { + request?.let { + return shouldOverrideUrlLoading(it.url) + } + return true + } + + @Suppress("DEPRECATION") + override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { + url?.let { + return shouldOverrideUrlLoading(Uri.parse(it)) + } + return true + } + + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + upWebViewTheme() + } + + private fun shouldOverrideUrlLoading(url: Uri): Boolean { + if (url.scheme == "http" || url.scheme == "https") { + return false + } else if (url.scheme == "yuedu") { + when (url.host) { + "booksource" -> { + val intent = Intent( + this@ReadRssActivity, + ImportBookSourceActivity::class.java + ) + intent.data = url + startActivity(intent) + } + "rsssource" -> { + val intent = Intent( + this@ReadRssActivity, + ImportRssSourceActivity::class.java + ) + intent.data = url + startActivity(intent) + } + "replace" -> { + val intent = Intent( + this@ReadRssActivity, + ImportReplaceRuleActivity::class.java + ) + intent.data = url + startActivity(intent) + } + } + return true + } + binding.root.longSnackbar("跳转其它应用", "确认") { + openUrl(url) + } + return true + } + + } + } diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt index 452f8c87f..f4cc85fff 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt @@ -9,10 +9,10 @@ import android.util.Base64 import android.webkit.URLUtil import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.MutableLiveData -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppConst +import io.legado.app.data.appDb import io.legado.app.data.entities.RssArticle import io.legado.app.data.entities.RssSource import io.legado.app.data.entities.RssStar @@ -47,10 +47,10 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application), val origin = intent.getStringExtra("origin") val link = intent.getStringExtra("link") origin?.let { - rssSource = App.db.rssSourceDao.getByKey(origin) + rssSource = appDb.rssSourceDao.getByKey(origin) if (link != null) { - rssStar = App.db.rssStarDao.get(origin, link) - rssArticle = rssStar?.toRssArticle() ?: App.db.rssArticleDao.get(origin, link) + rssStar = appDb.rssStarDao.get(origin, link) + rssArticle = rssStar?.toRssArticle() ?: appDb.rssArticleDao.get(origin, link) rssArticle?.let { rssArticle -> if (!rssArticle.description.isNullOrBlank()) { contentLiveData.postValue(rssArticle.description) @@ -97,10 +97,10 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application), Rss.getContent(this, rssArticle, ruleContent, rssSource) .onSuccess(IO) { body -> rssArticle.description = body - App.db.rssArticleDao.insert(rssArticle) + appDb.rssArticleDao.insert(rssArticle) rssStar?.let { it.description = body - App.db.rssStarDao.insert(it) + appDb.rssStarDao.insert(it) } contentLiveData.postValue(body) } @@ -109,10 +109,10 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application), fun favorite() { execute { rssStar?.let { - App.db.rssStarDao.delete(it.origin, it.link) + appDb.rssStarDao.delete(it.origin, it.link) rssStar = null } ?: rssArticle?.toStar()?.let { - App.db.rssStarDao.insert(it) + appDb.rssStarDao.insert(it) rssStar = it } }.onSuccess { @@ -137,9 +137,9 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application), } } ?: throw Throwable("NULL") }.onError { - toast("保存图片失败:${it.localizedMessage}") + toastOnUi("保存图片失败:${it.localizedMessage}") }.onSuccess { - toast("保存成功") + toastOnUi("保存成功") } } @@ -186,7 +186,7 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application), play() } else { launch { - toast(R.string.tts_init_failed) + toastOnUi(R.string.tts_init_failed) } } } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugActivity.kt index a57afe2a3..e5cb45db4 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugActivity.kt @@ -2,21 +2,22 @@ package io.legado.app.ui.rss.source.debug import android.os.Bundle import android.widget.SearchView +import androidx.activity.viewModels import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.databinding.ActivitySourceDebugBinding import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.accentColor -import io.legado.app.utils.getViewModel + import io.legado.app.utils.gone +import io.legado.app.utils.toastOnUi import kotlinx.coroutines.launch -import org.jetbrains.anko.toast class RssSourceDebugActivity : VMBaseActivity() { override val viewModel: RssSourceDebugModel - get() = getViewModel(RssSourceDebugModel::class.java) + by viewModels() private lateinit var adapter: RssSourceDebugAdapter @@ -56,7 +57,7 @@ class RssSourceDebugActivity : VMBaseActivity Unit) { sourceUrl?.let { execute { - rssSource = App.db.rssSourceDao.getByKey(sourceUrl) + rssSource = appDb.rssSourceDao.getByKey(sourceUrl) }.onFinally { finally() } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt index 2f11ad365..c70525047 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt @@ -10,6 +10,7 @@ import android.view.MenuItem import android.view.ViewTreeObserver import android.widget.EditText import android.widget.PopupWindow +import androidx.activity.viewModels import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.AppConst @@ -17,16 +18,13 @@ import io.legado.app.data.entities.RssSource import io.legado.app.databinding.ActivityRssSourceEditBinding import io.legado.app.help.LocalConfig import io.legado.app.lib.dialogs.alert +import io.legado.app.lib.dialogs.selector import io.legado.app.lib.theme.ATH import io.legado.app.ui.qrcode.QrCodeActivity import io.legado.app.ui.rss.source.debug.RssSourceDebugActivity import io.legado.app.ui.widget.KeyboardToolPop import io.legado.app.ui.widget.dialog.TextDialog -import io.legado.app.utils.GSON -import io.legado.app.utils.getViewModel -import io.legado.app.utils.sendToClip -import io.legado.app.utils.shareWithQr -import org.jetbrains.anko.* +import io.legado.app.utils.* import kotlin.math.abs class RssSourceEditActivity : @@ -45,7 +43,7 @@ class RssSourceEditActivity : } override val viewModel: RssSourceEditViewModel - get() = getViewModel(RssSourceEditViewModel::class.java) + by viewModels() override fun onActivityCreated(savedInstanceState: Bundle?) { initView() @@ -65,7 +63,7 @@ class RssSourceEditActivity : val source = getRssSource() if (!source.equal(viewModel.rssSource)) { alert(R.string.exit) { - messageResource = R.string.exit_no_save + setMessage(R.string.exit_no_save) positiveButton(R.string.yes) negativeButton(R.string.no) { super.finish() @@ -102,7 +100,9 @@ class RssSourceEditActivity : val source = getRssSource() if (checkSource(source)) { viewModel.save(source) { - startActivity(Pair("key", source.sourceUrl)) + startActivity { + putExtra("key", source.sourceUrl) + } } } } @@ -111,8 +111,8 @@ class RssSourceEditActivity : R.id.menu_paste_source -> viewModel.pasteSource { upRecyclerView(it) } R.id.menu_share_str -> share(GSON.toJson(getRssSource())) R.id.menu_share_qr -> shareWithQr( - getString(R.string.share_rss_source), - GSON.toJson(getRssSource()) + GSON.toJson(getRssSource()), + getString(R.string.share_rss_source) ) R.id.menu_help -> showRuleHelp() } @@ -139,6 +139,7 @@ class RssSourceEditActivity : add(EditEntity("sourceUrl", rssSource?.sourceUrl, R.string.source_url)) add(EditEntity("sourceIcon", rssSource?.sourceIcon, R.string.source_icon)) add(EditEntity("sourceGroup", rssSource?.sourceGroup, R.string.source_group)) + add(EditEntity("sourceComment", rssSource?.sourceComment, R.string.comment)) add(EditEntity("sortUrl", rssSource?.sortUrl, R.string.sort_url)) add(EditEntity("ruleArticles", rssSource?.ruleArticles, R.string.r_articles)) add(EditEntity("ruleNextPage", rssSource?.ruleNextPage, R.string.r_next)) @@ -166,6 +167,7 @@ class RssSourceEditActivity : "sourceUrl" -> source.sourceUrl = it.value ?: "" "sourceIcon" -> source.sourceIcon = it.value ?: "" "sourceGroup" -> source.sourceGroup = it.value + "sourceComment" -> source.sourceComment = it.value "sortUrl" -> source.sortUrl = it.value "ruleArticles" -> source.ruleArticles = it.value "ruleNextPage" -> source.ruleNextPage = it.value @@ -184,7 +186,7 @@ class RssSourceEditActivity : private fun checkSource(source: RssSource): Boolean { if (source.sourceName.isBlank() || source.sourceName.isBlank()) { - toast("名称或url不能为空") + toastOnUi("名称或url不能为空") return false } return true @@ -251,7 +253,7 @@ class RssSourceEditActivity : val rect = Rect() // 获取当前页面窗口的显示范围 window.decorView.getWindowVisibleDisplayFrame(rect) - val screenHeight = this@RssSourceEditActivity.displayMetrics.heightPixels + val screenHeight = this@RssSourceEditActivity.getSize().heightPixels val keyboardHeight = screenHeight - rect.bottom // 输入法的高度 val preShowing = mIsSoftKeyBoardShowing if (abs(keyboardHeight) > screenHeight / 5) { diff --git a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditViewModel.kt index 63b48d08a..38ace84df 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditViewModel.kt @@ -2,8 +2,8 @@ package io.legado.app.ui.rss.source.edit import android.app.Application import android.content.Intent -import io.legado.app.App import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.RssSource import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonObject @@ -20,7 +20,7 @@ class RssSourceEditViewModel(application: Application) : BaseViewModel(applicati execute { val key = intent.getStringExtra("data") if (key != null) { - App.db.rssSourceDao.getByKey(key)?.let { + appDb.rssSourceDao.getByKey(key)?.let { rssSource = it } } @@ -33,14 +33,14 @@ class RssSourceEditViewModel(application: Application) : BaseViewModel(applicati fun save(source: RssSource, success: (() -> Unit)) { execute { if (oldSourceUrl != source.sourceUrl) { - App.db.rssSourceDao.delete(oldSourceUrl) + appDb.rssSourceDao.delete(oldSourceUrl) oldSourceUrl = source.sourceUrl } - App.db.rssSourceDao.insert(source) + appDb.rssSourceDao.insert(source) }.onSuccess { success() }.onError { - toast(it.localizedMessage) + toastOnUi(it.localizedMessage) it.printStackTrace() } } @@ -53,12 +53,12 @@ class RssSourceEditViewModel(application: Application) : BaseViewModel(applicati } source }.onError { - toast(it.localizedMessage) + toastOnUi(it.localizedMessage) }.onSuccess { if (it != null) { onSuccess(it) } else { - toast("格式不对") + toastOnUi("格式不对") } } } @@ -70,7 +70,7 @@ class RssSourceEditViewModel(application: Application) : BaseViewModel(applicati finally.invoke(it) } }.onError { - toast(it.msg) + toastOnUi(it.msg) } } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/GroupManageDialog.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/GroupManageDialog.kt index b5444cebe..2b49eea70 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/GroupManageDialog.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/GroupManageDialog.kt @@ -8,13 +8,14 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar +import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.LinearLayoutManager -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.constant.AppPattern +import io.legado.app.data.appDb import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogRecyclerViewBinding import io.legado.app.databinding.ItemGroupManageBinding @@ -24,10 +25,10 @@ import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onClick + class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { - private lateinit var viewModel: RssSourceViewModel + private val viewModel: RssSourceViewModel by activityViewModels() private lateinit var adapter: GroupAdapter private val binding by viewBinding(DialogRecyclerViewBinding::bind) @@ -42,7 +43,6 @@ class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener container: ViewGroup?, savedInstanceState: Bundle? ): View? { - viewModel = getViewModelOfActivity(RssSourceViewModel::class.java) return inflater.inflate(R.layout.dialog_recycler_view, container) } @@ -58,8 +58,10 @@ class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener recyclerView.adapter = adapter tvOk.setTextColor(requireContext().accentColor) tvOk.visible() - tvOk.onClick { dismiss() } - App.db.rssSourceDao.liveGroup().observe(viewLifecycleOwner, { + tvOk.setOnClickListener { + dismissAllowingStateLoss() + } + appDb.rssSourceDao.liveGroup().observe(viewLifecycleOwner, { val groups = linkedSetOf() it.map { group -> groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) @@ -132,13 +134,13 @@ class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener override fun registerListener(holder: ItemViewHolder, binding: ItemGroupManageBinding) { binding.apply { - tvEdit.onClick { + tvEdit.setOnClickListener { getItem(holder.layoutPosition)?.let { editGroup(it) } } - tvDel.onClick { + tvDel.setOnClickListener { getItem(holder.layoutPosition)?.let { viewModel.delGroup(it) } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt index 1e6156391..3a763c87b 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt @@ -7,15 +7,16 @@ import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.view.SubMenu +import androidx.activity.viewModels import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.SearchView import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.LiveData import androidx.recyclerview.widget.ItemTouchHelper -import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.AppPattern +import io.legado.app.data.appDb import io.legado.app.data.entities.RssSource import io.legado.app.databinding.ActivityRssSourceBinding import io.legado.app.databinding.DialogEditTextBinding @@ -34,9 +35,6 @@ import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.* -import org.jetbrains.anko.startActivity -import org.jetbrains.anko.startActivityForResult -import org.jetbrains.anko.toast import java.io.File @@ -47,7 +45,7 @@ class RssSourceActivity : VMBaseActivity groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) @@ -202,14 +200,14 @@ class RssSourceActivity : VMBaseActivity { - App.db.rssSourceDao.liveAll() + appDb.rssSourceDao.liveAll() } searchKey.startsWith("group:") -> { val key = searchKey.substringAfter("group:") - App.db.rssSourceDao.liveGroupSearch("%$key%") + appDb.rssSourceDao.liveGroupSearch("%$key%") } else -> { - App.db.rssSourceDao.liveSearch("%$searchKey%") + appDb.rssSourceDao.liveSearch("%$searchKey%") } }.apply { observe(this@RssSourceActivity, { @@ -245,7 +243,7 @@ class RssSourceActivity : VMBaseActivity("source" to it) + startActivity { + putExtra("source", it) + } } } cancelButton() @@ -268,16 +268,20 @@ class RssSourceActivity : VMBaseActivity("dataKey" to dataKey) + startActivity { + putExtra("dataKey", dataKey) + } } }.onFailure { - toast("readTextError:${it.localizedMessage}") + toastOnUi("readTextError:${it.localizedMessage}") } } } qrRequestCode -> if (resultCode == RESULT_OK) { data?.getStringExtra("result")?.let { - startActivity("source" to it) + startActivity { + putExtra("source", it) + } } } exportRequestCode -> if (resultCode == RESULT_OK) { @@ -301,7 +305,9 @@ class RssSourceActivity : VMBaseActivity(Pair("data", source.sourceUrl)) + startActivity { + putExtra("data", source.sourceUrl) + } } override fun update(vararg source: RssSource) { diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt index fae25cdb5..3cc2db4bb 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt @@ -16,7 +16,8 @@ import io.legado.app.databinding.ItemRssSourceBinding import io.legado.app.lib.theme.backgroundColor import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback -import org.jetbrains.anko.sdk27.listeners.onClick +import io.legado.app.utils.ColorUtils + class RssSourceAdapter(context: Context, val callBack: CallBack) : RecyclerAdapter(context), @@ -68,7 +69,7 @@ class RssSourceAdapter(context: Context, val callBack: CallBack) : with(binding) { val bundle = payloads.getOrNull(0) as? Bundle if (bundle == null) { - root.setBackgroundColor(context.backgroundColor) + root.setBackgroundColor(ColorUtils.withAlpha(context.backgroundColor, 0.5f)) if (item.sourceGroup.isNullOrEmpty()) { cbSource.text = item.sourceName } else { @@ -113,12 +114,12 @@ class RssSourceAdapter(context: Context, val callBack: CallBack) : } } } - ivEdit.onClick { + ivEdit.setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.edit(it) } } - ivMenuMore.onClick { + ivMenuMore.setOnClickListener { showMenu(ivMenuMore, holder.layoutPosition) } } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt index 7ff23307c..a89dc2e7f 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt @@ -5,52 +5,51 @@ import android.content.Intent import android.text.TextUtils import androidx.core.content.FileProvider import androidx.documentfile.provider.DocumentFile -import io.legado.app.App import io.legado.app.BuildConfig import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb import io.legado.app.data.entities.RssSource import io.legado.app.help.DefaultData import io.legado.app.utils.* -import org.jetbrains.anko.toast import java.io.File class RssSourceViewModel(application: Application) : BaseViewModel(application) { fun topSource(vararg sources: RssSource) { execute { - val minOrder = App.db.rssSourceDao.minOrder - 1 + val minOrder = appDb.rssSourceDao.minOrder - 1 sources.forEachIndexed { index, rssSource -> rssSource.customOrder = minOrder - index } - App.db.rssSourceDao.update(*sources) + appDb.rssSourceDao.update(*sources) } } fun bottomSource(vararg sources: RssSource) { execute { - val maxOrder = App.db.rssSourceDao.maxOrder + 1 + val maxOrder = appDb.rssSourceDao.maxOrder + 1 sources.forEachIndexed { index, rssSource -> rssSource.customOrder = maxOrder + index } - App.db.rssSourceDao.update(*sources) + appDb.rssSourceDao.update(*sources) } } fun del(rssSource: RssSource) { - execute { App.db.rssSourceDao.delete(rssSource) } + execute { appDb.rssSourceDao.delete(rssSource) } } fun update(vararg rssSource: RssSource) { - execute { App.db.rssSourceDao.update(*rssSource) } + execute { appDb.rssSourceDao.update(*rssSource) } } fun upOrder() { execute { - val sources = App.db.rssSourceDao.all + val sources = appDb.rssSourceDao.all for ((index: Int, source: RssSource) in sources.withIndex()) { source.customOrder = index + 1 } - App.db.rssSourceDao.update(*sources.toTypedArray()) + appDb.rssSourceDao.update(*sources.toTypedArray()) } } @@ -60,7 +59,7 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application) sources.forEach { list.add(it.copy(enabled = true)) } - App.db.rssSourceDao.update(*list.toTypedArray()) + appDb.rssSourceDao.update(*list.toTypedArray()) } } @@ -70,13 +69,13 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application) sources.forEach { list.add(it.copy(enabled = false)) } - App.db.rssSourceDao.update(*list.toTypedArray()) + appDb.rssSourceDao.update(*list.toTypedArray()) } } fun delSelection(sources: List) { execute { - App.db.rssSourceDao.delete(*sources.toTypedArray()) + appDb.rssSourceDao.delete(*sources.toTypedArray()) } } @@ -86,9 +85,9 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application) FileUtils.createFileIfNotExist(file, "exportRssSource.json") .writeText(json) }.onSuccess { - context.toast("成功导出至\n${file.absolutePath}") + context.toastOnUi("成功导出至\n${file.absolutePath}") }.onError { - context.toast("导出失败\n${it.localizedMessage}") + context.toastOnUi("导出失败\n${it.localizedMessage}") } } @@ -99,9 +98,9 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application) doc.createFile("", "exportRssSource.json") ?.writeText(context, json) }.onSuccess { - context.toast("成功导出至\n${doc.uri.path}") + context.toastOnUi("成功导出至\n${doc.uri.path}") }.onError { - context.toast("导出失败\n${it.localizedMessage}") + context.toastOnUi("导出失败\n${it.localizedMessage}") } } @@ -123,23 +122,23 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application) }.onSuccess { success.invoke(it) }.onError { - toast(it.msg) + toastOnUi(it.msg) } } fun addGroup(group: String) { execute { - val sources = App.db.rssSourceDao.noGroup + val sources = appDb.rssSourceDao.noGroup sources.map { source -> source.sourceGroup = group } - App.db.rssSourceDao.update(*sources.toTypedArray()) + appDb.rssSourceDao.update(*sources.toTypedArray()) } } fun upGroup(oldGroup: String, newGroup: String?) { execute { - val sources = App.db.rssSourceDao.getByGroup(oldGroup) + val sources = appDb.rssSourceDao.getByGroup(oldGroup) sources.map { source -> source.sourceGroup?.splitNotBlank(",")?.toHashSet()?.let { it.remove(oldGroup) @@ -148,21 +147,21 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application) source.sourceGroup = TextUtils.join(",", it) } } - App.db.rssSourceDao.update(*sources.toTypedArray()) + appDb.rssSourceDao.update(*sources.toTypedArray()) } } fun delGroup(group: String) { execute { execute { - val sources = App.db.rssSourceDao.getByGroup(group) + val sources = appDb.rssSourceDao.getByGroup(group) sources.map { source -> source.sourceGroup?.splitNotBlank(",")?.toHashSet()?.let { it.remove(group) source.sourceGroup = TextUtils.join(",", it) } } - App.db.rssSourceDao.update(*sources.toTypedArray()) + appDb.rssSourceDao.update(*sources.toTypedArray()) } } } diff --git a/app/src/main/java/io/legado/app/ui/rss/subscription/RuleSubActivity.kt b/app/src/main/java/io/legado/app/ui/rss/subscription/RuleSubActivity.kt index 67d9cabc2..78aa3d7da 100644 --- a/app/src/main/java/io/legado/app/ui/rss/subscription/RuleSubActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/subscription/RuleSubActivity.kt @@ -6,9 +6,9 @@ import android.view.MenuItem import androidx.core.view.isGone import androidx.lifecycle.LiveData import androidx.recyclerview.widget.ItemTouchHelper -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseActivity +import io.legado.app.data.appDb import io.legado.app.data.entities.RuleSub import io.legado.app.databinding.ActivityRuleSubBinding import io.legado.app.databinding.DialogRuleSubEditBinding @@ -17,9 +17,9 @@ import io.legado.app.ui.association.ImportBookSourceActivity import io.legado.app.ui.association.ImportReplaceRuleActivity import io.legado.app.ui.association.ImportRssSourceActivity import io.legado.app.ui.widget.recycler.ItemTouchCallback +import io.legado.app.utils.startActivity import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch -import org.jetbrains.anko.startActivity /** * 规则订阅界面 @@ -47,7 +47,7 @@ class RuleSubActivity : BaseActivity(), override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.menu_add -> { - val order = App.db.ruleSubDao.maxOrder + 1 + val order = appDb.ruleSubDao.maxOrder + 1 editSubscription(RuleSub(customOrder = order)) } } @@ -64,7 +64,7 @@ class RuleSubActivity : BaseActivity(), private fun initData() { liveData?.removeObservers(this) - liveData = App.db.ruleSubDao.observeAll() + liveData = appDb.ruleSubDao.observeAll() liveData?.observe(this) { binding.tvEmptyMsg.isGone = it.isNotEmpty() adapter.setItems(it) @@ -74,13 +74,19 @@ class RuleSubActivity : BaseActivity(), override fun openSubscription(ruleSub: RuleSub) { when (ruleSub.type) { 0 -> { - startActivity("source" to ruleSub.url) + startActivity { + putExtra("source", ruleSub.url) + } } 1 -> { - startActivity("source" to ruleSub.url) + startActivity { + putExtra("source", ruleSub.url) + } } 2 -> { - startActivity("source" to ruleSub.url) + startActivity { + putExtra("source", ruleSub.url) + } } } } @@ -92,13 +98,13 @@ class RuleSubActivity : BaseActivity(), etName.setText(ruleSub.name) etUrl.setText(ruleSub.url) } - customView = alertBinding.root + customView { alertBinding.root } okButton { ruleSub.type = alertBinding.spType.selectedItemPosition ruleSub.name = alertBinding.etName.text?.toString() ?: "" ruleSub.url = alertBinding.etUrl.text?.toString() ?: "" launch(IO) { - App.db.ruleSubDao.insert(ruleSub) + appDb.ruleSubDao.insert(ruleSub) } } cancelButton() @@ -107,23 +113,23 @@ class RuleSubActivity : BaseActivity(), override fun delSubscription(ruleSub: RuleSub) { launch(IO) { - App.db.ruleSubDao.delete(ruleSub) + appDb.ruleSubDao.delete(ruleSub) } } override fun updateSourceSub(vararg ruleSub: RuleSub) { launch(IO) { - App.db.ruleSubDao.update(*ruleSub) + appDb.ruleSubDao.update(*ruleSub) } } override fun upOrder() { launch(IO) { - val sourceSubs = App.db.ruleSubDao.all + val sourceSubs = appDb.ruleSubDao.all for ((index: Int, ruleSub: RuleSub) in sourceSubs.withIndex()) { ruleSub.customOrder = index + 1 } - App.db.ruleSubDao.update(*sourceSubs.toTypedArray()) + appDb.ruleSubDao.update(*sourceSubs.toTypedArray()) } } diff --git a/app/src/main/java/io/legado/app/ui/rss/subscription/RuleSubAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/subscription/RuleSubAdapter.kt index d8c3c044d..2bb5560be 100644 --- a/app/src/main/java/io/legado/app/ui/rss/subscription/RuleSubAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/rss/subscription/RuleSubAdapter.kt @@ -11,7 +11,7 @@ import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.data.entities.RuleSub import io.legado.app.databinding.ItemRuleSubBinding import io.legado.app.ui.widget.recycler.ItemTouchCallback -import org.jetbrains.anko.sdk27.listeners.onClick + class RuleSubAdapter(context: Context, val callBack: Callback) : RecyclerAdapter(context), @@ -31,13 +31,13 @@ class RuleSubAdapter(context: Context, val callBack: Callback) : } override fun registerListener(holder: ItemViewHolder, binding: ItemRuleSubBinding) { - binding.root.onClick { + binding.root.setOnClickListener { callBack.openSubscription(getItem(holder.layoutPosition)!!) } - binding.ivEdit.onClick { + binding.ivEdit.setOnClickListener { callBack.editSubscription(getItem(holder.layoutPosition)!!) } - binding.ivMenuMore.onClick { + binding.ivMenuMore.setOnClickListener { showMenu(binding.ivMenuMore, holder.layoutPosition) } } diff --git a/app/src/main/java/io/legado/app/ui/welcome/WelcomeActivity.kt b/app/src/main/java/io/legado/app/ui/welcome/WelcomeActivity.kt index 49fd459fd..20526518a 100644 --- a/app/src/main/java/io/legado/app/ui/welcome/WelcomeActivity.kt +++ b/app/src/main/java/io/legado/app/ui/welcome/WelcomeActivity.kt @@ -3,18 +3,18 @@ package io.legado.app.ui.welcome import android.content.Intent import android.os.Bundle import com.hankcs.hanlp.HanLP -import io.legado.app.App -import io.legado.app.R import io.legado.app.base.BaseActivity import io.legado.app.constant.PreferKey +import io.legado.app.data.appDb import io.legado.app.databinding.ActivityWelcomeBinding import io.legado.app.help.AppConfig import io.legado.app.help.coroutine.Coroutine +import io.legado.app.help.storage.BookWebDav import io.legado.app.lib.theme.accentColor import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.main.MainActivity import io.legado.app.utils.getPrefBoolean -import org.jetbrains.anko.startActivity +import io.legado.app.utils.startActivity import java.util.concurrent.TimeUnit open class WelcomeActivity : BaseActivity() { @@ -36,10 +36,27 @@ open class WelcomeActivity : BaseActivity() { private fun init() { Coroutine.async { - App.db.cacheDao.clearDeadline(System.currentTimeMillis()) + val books = appDb.bookDao.all + books.forEach { book -> + BookWebDav.getBookProgress(book)?.let { bookProgress -> + if (bookProgress.durChapterIndex > book.durChapterIndex || + (bookProgress.durChapterIndex == book.durChapterIndex && + bookProgress.durChapterPos > book.durChapterPos) + ) { + book.durChapterIndex = bookProgress.durChapterIndex + book.durChapterPos = bookProgress.durChapterPos + book.durChapterTitle = bookProgress.durChapterTitle + book.durChapterTime = bookProgress.durChapterTime + appDb.bookDao.update(book) + } + } + } + } + Coroutine.async { + appDb.cacheDao.clearDeadline(System.currentTimeMillis()) //清除过期数据 if (getPrefBoolean(PreferKey.autoClearExpired, true)) { - App.db.searchBookDao + appDb.searchBookDao .clearExpired(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1)) } //初始化简繁转换引擎 @@ -54,7 +71,7 @@ open class WelcomeActivity : BaseActivity() { private fun startMainActivity() { startActivity() - if (getPrefBoolean(R.string.pk_default_read)) { + if (getPrefBoolean(PreferKey.defaultToRead)) { startActivity() } finish() diff --git a/app/src/main/java/io/legado/app/ui/widget/DetailSeekBar.kt b/app/src/main/java/io/legado/app/ui/widget/DetailSeekBar.kt index b0a8115da..441a1853b 100644 --- a/app/src/main/java/io/legado/app/ui/widget/DetailSeekBar.kt +++ b/app/src/main/java/io/legado/app/ui/widget/DetailSeekBar.kt @@ -12,7 +12,7 @@ import io.legado.app.lib.theme.getPrimaryTextColor import io.legado.app.ui.widget.seekbar.SeekBarChangeListener import io.legado.app.utils.ColorUtils import io.legado.app.utils.progressAdd -import org.jetbrains.anko.sdk27.listeners.onClick + class DetailSeekBar @JvmOverloads constructor( context: Context, @@ -51,11 +51,11 @@ class DetailSeekBar @JvmOverloads constructor( binding.ivSeekReduce.setColorFilter(textColor) binding.tvSeekValue.setTextColor(textColor) } - binding.ivSeekPlus.onClick { + binding.ivSeekPlus.setOnClickListener { binding.seekBar.progressAdd(1) onChanged?.invoke(binding.seekBar.progress) } - binding.ivSeekReduce.onClick { + binding.ivSeekReduce.setOnClickListener { binding.seekBar.progressAdd(-1) onChanged?.invoke(binding.seekBar.progress) } diff --git a/app/src/main/java/io/legado/app/ui/widget/KeyboardToolPop.kt b/app/src/main/java/io/legado/app/ui/widget/KeyboardToolPop.kt index dbbc10af4..e0fef5da0 100644 --- a/app/src/main/java/io/legado/app/ui/widget/KeyboardToolPop.kt +++ b/app/src/main/java/io/legado/app/ui/widget/KeyboardToolPop.kt @@ -10,7 +10,7 @@ import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.databinding.ItemFilletTextBinding import io.legado.app.databinding.PopupKeyboardToolBinding -import org.jetbrains.anko.sdk27.listeners.onClick + class KeyboardToolPop( @@ -59,7 +59,7 @@ class KeyboardToolPop( override fun registerListener(holder: ItemViewHolder, binding: ItemFilletTextBinding) { holder.itemView.apply { - onClick { + setOnClickListener { getItem(holder.layoutPosition)?.let { callBack?.sendText(it) } diff --git a/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt b/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt index 316f4102c..c95a8e493 100644 --- a/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt +++ b/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt @@ -14,7 +14,7 @@ import io.legado.app.help.AppConfig import io.legado.app.lib.theme.* import io.legado.app.utils.ColorUtils import io.legado.app.utils.visible -import org.jetbrains.anko.sdk27.listeners.onClick + @Suppress("unused") class SelectActionBar @JvmOverloads constructor( @@ -41,9 +41,9 @@ class SelectActionBar @JvmOverloads constructor( callBack?.selectAll(isChecked) } } - binding.btnRevertSelection.onClick { callBack?.revertSelection() } - binding.btnSelectActionMain.onClick { callBack?.onClickMainAction() } - binding.ivMenuMore.onClick { selMenu?.show() } + binding.btnRevertSelection.setOnClickListener { callBack?.revertSelection() } + binding.btnSelectActionMain.setOnClickListener { callBack?.onClickMainAction() } + binding.ivMenuMore.setOnClickListener { selMenu?.show() } } fun setMainActionText(text: String) = with(binding) { diff --git a/app/src/main/java/io/legado/app/ui/widget/TitleBar.kt b/app/src/main/java/io/legado/app/ui/widget/TitleBar.kt index 51a04f97d..593ee4c4c 100644 --- a/app/src/main/java/io/legado/app/ui/widget/TitleBar.kt +++ b/app/src/main/java/io/legado/app/ui/widget/TitleBar.kt @@ -17,9 +17,6 @@ import io.legado.app.lib.theme.primaryColor import io.legado.app.utils.activity import io.legado.app.utils.navigationBarHeight import io.legado.app.utils.statusBarHeight -import org.jetbrains.anko.backgroundColor -import org.jetbrains.anko.bottomPadding -import org.jetbrains.anko.topPadding @Suppress("unused") class TitleBar @JvmOverloads constructor( @@ -144,14 +141,14 @@ class TitleBar @JvmOverloads constructor( if (!isInEditMode) { if (a.getBoolean(R.styleable.TitleBar_fitStatusBar, true)) { - topPadding = context.statusBarHeight + setPadding(paddingLeft, context.statusBarHeight, paddingRight, paddingBottom) } if (a.getBoolean(R.styleable.TitleBar_fitNavigationBar, false)) { - bottomPadding = context.navigationBarHeight + setPadding(paddingLeft, paddingTop, paddingRight, context.navigationBarHeight) } - backgroundColor = context.primaryColor + setBackgroundColor(context.primaryColor) stateListAnimator = null elevation = if (AppConfig.elevation < 0) { @@ -198,11 +195,12 @@ class TitleBar @JvmOverloads constructor( fun transparent() { elevation = 0f - backgroundColor = Color.TRANSPARENT + setBackgroundColor(Color.TRANSPARENT) } fun onMultiWindowModeChanged(isInMultiWindowMode: Boolean, fullScreen: Boolean) { - topPadding = if (!isInMultiWindowMode && fullScreen) context.statusBarHeight else 0 + val topPadding = if (!isInMultiWindowMode && fullScreen) context.statusBarHeight else 0 + setPadding(paddingLeft, topPadding, paddingRight, paddingBottom) } private fun attachToActivity() { diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/WaitDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/WaitDialog.kt new file mode 100644 index 000000000..9e2d9ed2f --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/WaitDialog.kt @@ -0,0 +1,28 @@ +package io.legado.app.ui.widget.dialog + +import android.app.Dialog +import android.content.Context +import io.legado.app.databinding.DialogWaitBinding + + +@Suppress("unused") +class WaitDialog(context: Context) : Dialog(context) { + + val binding = DialogWaitBinding.inflate(layoutInflater) + + init { + setCanceledOnTouchOutside(false) + setContentView(binding.root) + } + + fun setText(text: String): WaitDialog { + binding.tvMsg.text = text + return this + } + + fun setText(res: Int): WaitDialog { + binding.tvMsg.setText(res) + return this + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/widget/font/FontAdapter.kt b/app/src/main/java/io/legado/app/ui/widget/font/FontAdapter.kt index 9f8bb77ca..5e9e5b4a9 100644 --- a/app/src/main/java/io/legado/app/ui/widget/font/FontAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/widget/font/FontAdapter.kt @@ -7,13 +7,9 @@ import android.view.ViewGroup import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.databinding.ItemFontBinding -import io.legado.app.utils.DocItem -import io.legado.app.utils.RealPathUtil -import io.legado.app.utils.invisible -import io.legado.app.utils.visible -import org.jetbrains.anko.sdk27.listeners.onClick -import org.jetbrains.anko.toast +import io.legado.app.utils.* import java.io.File +import java.net.URLDecoder class FontAdapter(context: Context, val callBack: CallBack) : RecyclerAdapter(context) { @@ -46,11 +42,13 @@ class FontAdapter(context: Context, val callBack: CallBack) : tvFont.typeface = typeface }.onFailure { it.printStackTrace() - context.toast("Read ${item.name} Error: ${it.localizedMessage}") + context.toastOnUi("Read ${item.name} Error: ${it.localizedMessage}") } tvFont.text = item.name - root.onClick { callBack.onClick(item) } - if (item.name == callBack.curFilePath.substringAfterLast(File.separator)) { + root.setOnClickListener { callBack.onClick(item) } + if (item.name == URLDecoder.decode(callBack.curFilePath, "utf-8") + .substringAfterLast(File.separator) + ) { ivChecked.visible() } else { ivChecked.invisible() @@ -59,7 +57,7 @@ class FontAdapter(context: Context, val callBack: CallBack) : } override fun registerListener(holder: ItemViewHolder, binding: ItemFontBinding) { - holder.itemView.onClick { + holder.itemView.setOnClickListener { getItem(holder.layoutPosition)?.let { callBack.onClick(it) } diff --git a/app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt b/app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt index 5ddecbe54..004d3204b 100644 --- a/app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt @@ -11,7 +11,6 @@ import android.view.ViewGroup import androidx.appcompat.widget.Toolbar import androidx.documentfile.provider.DocumentFile import androidx.recyclerview.widget.LinearLayoutManager -import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.constant.PreferKey @@ -27,6 +26,7 @@ import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch +import splitties.init.appCtx import java.io.File import java.util.* import kotlin.collections.ArrayList @@ -38,7 +38,7 @@ class FontSelectDialog : BaseDialogFragment(), private val fontFolderRequestCode = 35485 private val fontRegex = Regex(".*\\.[ot]tf") private val fontFolder by lazy { - FileUtils.createFolderIfNotExist(App.INSTANCE.filesDir, "Fonts") + FileUtils.createFolderIfNotExist(appCtx.filesDir, "Fonts") } private var adapter: FontAdapter? = null private val binding by viewBinding(DialogFontSelectBinding::bind) @@ -94,7 +94,7 @@ class FontSelectDialog : BaseDialogFragment(), ) { _, i -> AppConfig.systemTypefaces = i onDefaultFontChange() - dismiss() + dismissAllowingStateLoss() } }.show() } @@ -147,7 +147,7 @@ class FontSelectDialog : BaseDialogFragment(), private fun loadFontFiles(doc: DocumentFile) { execute { val fontItems = arrayListOf() - val docItems = DocumentUtils.listFiles(App.INSTANCE, doc.uri) + val docItems = DocumentUtils.listFiles(appCtx, doc.uri) docItems.forEach { item -> if (item.name.toLowerCase(Locale.getDefault()).matches(fontRegex)) { fontItems.add(item) @@ -157,7 +157,7 @@ class FontSelectDialog : BaseDialogFragment(), }.onSuccess { adapter?.setItems(it) }.onError { - toast("getFontFiles:${it.localizedMessage}") + toastOnUi("getFontFiles:${it.localizedMessage}") } } @@ -192,7 +192,7 @@ class FontSelectDialog : BaseDialogFragment(), }.onSuccess { adapter?.setItems(it) }.onError { - toast("getFontFiles:${it.localizedMessage}") + toastOnUi("getFontFiles:${it.localizedMessage}") } } @@ -223,7 +223,7 @@ class FontSelectDialog : BaseDialogFragment(), FileUtils.deleteFile(fontFolder.absolutePath) callBack?.selectFont(docItem.uri.toString()) }.onSuccess { - dialog?.dismiss() + dismissAllowingStateLoss() } } diff --git a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt index d09eae0dd..24bdd08fd 100644 --- a/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/image/CoverImageView.kt @@ -10,11 +10,11 @@ import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target -import io.legado.app.App import io.legado.app.R import io.legado.app.constant.PreferKey import io.legado.app.help.ImageLoader import io.legado.app.utils.getPrefString +import splitties.init.appCtx /** * 封面 @@ -172,11 +172,11 @@ class CoverImageView @JvmOverloads constructor( @SuppressLint("UseCompatLoadingForDrawables") fun upDefaultCover() { - val path = App.INSTANCE.getPrefString(PreferKey.defaultCover) + val path = appCtx.getPrefString(PreferKey.defaultCover) var dw = Drawable.createFromPath(path) if (dw == null) { showBookName = true - dw = App.INSTANCE.resources.getDrawable(R.drawable.image_cover_default, null) + dw = appCtx.resources.getDrawable(R.drawable.image_cover_default, null) } else { showBookName = false } diff --git a/app/src/main/java/io/legado/app/ui/widget/image/PhotoView.kt b/app/src/main/java/io/legado/app/ui/widget/image/PhotoView.kt index 5d80f087e..b028dd116 100644 --- a/app/src/main/java/io/legado/app/ui/widget/image/PhotoView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/image/PhotoView.kt @@ -881,7 +881,7 @@ class PhotoView @JvmOverloads constructor( ) } - fun getImageViewInfo(imgView: ImageView): Info? { + fun getImageViewInfo(imgView: ImageView): Info { val p = IntArray(2) getLocation(imgView, p) val drawable: Drawable = imgView.drawable diff --git a/app/src/main/java/io/legado/app/ui/widget/prefs/IconListPreference.kt b/app/src/main/java/io/legado/app/ui/widget/prefs/IconListPreference.kt index 673ba1aca..fc5ed7291 100644 --- a/app/src/main/java/io/legado/app/ui/widget/prefs/IconListPreference.kt +++ b/app/src/main/java/io/legado/app/ui/widget/prefs/IconListPreference.kt @@ -23,7 +23,7 @@ import io.legado.app.lib.theme.primaryColor import io.legado.app.utils.getCompatDrawable import io.legado.app.utils.getSize import io.legado.app.utils.viewbindingdelegate.viewBinding -import org.jetbrains.anko.sdk27.listeners.onClick + class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference(context, attrs) { @@ -186,9 +186,9 @@ class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference } } label.isChecked = item.toString() == dialogValue - root.onClick { + root.setOnClickListener { onChanged?.invoke(item.toString()) - this@IconDialog.dismiss() + this@IconDialog.dismissAllowingStateLoss() } } } @@ -197,7 +197,7 @@ class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference holder: ItemViewHolder, binding: ItemIconPreferenceBinding ) { - holder.itemView.onClick { + holder.itemView.setOnClickListener { getItem(holder.layoutPosition)?.let { onChanged?.invoke(it.toString()) } diff --git a/app/src/main/java/io/legado/app/ui/widget/prefs/Preference.kt b/app/src/main/java/io/legado/app/ui/widget/prefs/Preference.kt index 042b03868..baea502b3 100644 --- a/app/src/main/java/io/legado/app/ui/widget/prefs/Preference.kt +++ b/app/src/main/java/io/legado/app/ui/widget/prefs/Preference.kt @@ -17,8 +17,7 @@ import io.legado.app.lib.theme.bottomBackground import io.legado.app.lib.theme.getPrimaryTextColor import io.legado.app.lib.theme.getSecondaryTextColor import io.legado.app.utils.ColorUtils -import org.jetbrains.anko.layoutInflater -import org.jetbrains.anko.sdk27.listeners.onLongClick +import splitties.views.onLongClick import kotlin.math.roundToInt class Preference(context: Context, attrs: AttributeSet) : @@ -77,7 +76,7 @@ class Preference(context: Context, attrs: AttributeSet) : var needRequestLayout = false var v = it.itemView.findViewById(viewId) if (v == null) { - val inflater: LayoutInflater = context.layoutInflater + val inflater: LayoutInflater = LayoutInflater.from(context) val childView = inflater.inflate(weightLayoutRes, null) lay.removeAllViews() lay.addView(childView) @@ -119,7 +118,6 @@ class Preference(context: Context, attrs: AttributeSet) : super.onBindViewHolder(holder) holder?.itemView?.onLongClick { onLongClick?.invoke() - true } } diff --git a/app/src/main/java/io/legado/app/ui/widget/prefs/PreferenceCategory.kt b/app/src/main/java/io/legado/app/ui/widget/prefs/PreferenceCategory.kt index a21d0e1ce..9e168a4a0 100644 --- a/app/src/main/java/io/legado/app/ui/widget/prefs/PreferenceCategory.kt +++ b/app/src/main/java/io/legado/app/ui/widget/prefs/PreferenceCategory.kt @@ -28,15 +28,20 @@ class PreferenceCategory(context: Context, attrs: AttributeSet) : PreferenceCate if (view is TextView) { // && !view.isInEditMode view.text = title if (view.isInEditMode) return - view.setBackgroundColor(context.backgroundColor) view.setTextColor(context.accentColor) view.isVisible = title != null && title.isNotEmpty() val da = it.findViewById(R.id.preference_divider_above) val dividerColor = if (AppConfig.isNightTheme) { - ColorUtils.shiftColor(context.backgroundColor, 1.05f) + ColorUtils.withAlpha( + ColorUtils.shiftColor(context.backgroundColor, 1.05f), + 0.5f + ) } else { - ColorUtils.shiftColor(context.backgroundColor, 0.95f) + ColorUtils.withAlpha( + ColorUtils.shiftColor(context.backgroundColor, 0.95f), + 0.5f + ) } if (da is View) { da.setBackgroundColor(dividerColor) diff --git a/app/src/main/java/io/legado/app/ui/widget/text/AccentTextView.kt b/app/src/main/java/io/legado/app/ui/widget/text/AccentTextView.kt index be3074766..8dee26350 100644 --- a/app/src/main/java/io/legado/app/ui/widget/text/AccentTextView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/text/AccentTextView.kt @@ -5,17 +5,16 @@ import android.util.AttributeSet import androidx.appcompat.widget.AppCompatTextView import io.legado.app.R import io.legado.app.lib.theme.accentColor -import org.jetbrains.anko.textColor -import org.jetbrains.anko.textColorResource +import io.legado.app.utils.getCompatColor class AccentTextView(context: Context, attrs: AttributeSet?) : AppCompatTextView(context, attrs) { init { if (!isInEditMode) { - textColor = context.accentColor + setTextColor(context.accentColor) } else { - textColorResource = R.color.accent + setTextColor(context.getCompatColor(R.color.accent)) } } diff --git a/app/src/main/java/io/legado/app/ui/widget/text/AutoCompleteTextView.kt b/app/src/main/java/io/legado/app/ui/widget/text/AutoCompleteTextView.kt index 9e9153e71..fbf4ac26c 100644 --- a/app/src/main/java/io/legado/app/ui/widget/text/AutoCompleteTextView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/text/AutoCompleteTextView.kt @@ -15,7 +15,7 @@ import io.legado.app.R import io.legado.app.lib.theme.ATH import io.legado.app.utils.gone import io.legado.app.utils.visible -import org.jetbrains.anko.sdk27.listeners.onClick + @Suppress("unused") class AutoCompleteTextView @JvmOverloads constructor( @@ -61,7 +61,7 @@ class AutoCompleteTextView @JvmOverloads constructor( textView.text = getItem(position) val ivDelete = view.findViewById(R.id.iv_delete) if (delCallBack != null) ivDelete.visible() else ivDelete.gone() - ivDelete.onClick { + ivDelete.setOnClickListener { getItem(position)?.let { remove(it) delCallBack?.invoke(it) diff --git a/app/src/main/java/io/legado/app/utils/ACache.kt b/app/src/main/java/io/legado/app/utils/ACache.kt index 6a0a0b9fb..5011a713d 100644 --- a/app/src/main/java/io/legado/app/utils/ACache.kt +++ b/app/src/main/java/io/legado/app/utils/ACache.kt @@ -9,9 +9,9 @@ import android.graphics.PixelFormat import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.util.Log -import io.legado.app.App import org.json.JSONArray import org.json.JSONObject +import splitties.init.appCtx import java.io.* import java.util.* import java.util.concurrent.atomic.AtomicInteger @@ -619,7 +619,7 @@ class ACache private constructor(cacheDir: File, max_size: Long, max_count: Int) fun bitmap2Drawable(bm: Bitmap?): Drawable? { return if (bm == null) { null - } else BitmapDrawable(App.INSTANCE.resources, bm) + } else BitmapDrawable(appCtx.resources, bm) } } diff --git a/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt b/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt index df4bae769..37a46f74c 100644 --- a/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt @@ -1,12 +1,20 @@ package io.legado.app.utils import android.app.Activity +import android.content.Intent import android.os.Build import android.util.DisplayMetrics import android.view.WindowInsets import android.view.WindowMetrics +inline fun Activity.startActivityForResult( + requestCode: Int, + configIntent: Intent.() -> Unit = {} +) { + startActivityForResult(Intent(this, A::class.java).apply(configIntent), requestCode) +} + fun Activity.getSize(): DisplayMetrics { val displayMetrics = DisplayMetrics() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { diff --git a/app/src/main/java/io/legado/app/utils/BitmapUtils.kt b/app/src/main/java/io/legado/app/utils/BitmapUtils.kt index 6be7ea2c3..ddd29063e 100644 --- a/app/src/main/java/io/legado/app/utils/BitmapUtils.kt +++ b/app/src/main/java/io/legado/app/utils/BitmapUtils.kt @@ -1,17 +1,14 @@ package io.legado.app.utils import android.content.Context -import android.graphics.Bitmap +import android.graphics.* import android.graphics.Bitmap.Config -import android.graphics.BitmapFactory -import android.graphics.Canvas -import android.graphics.Color import android.renderscript.Allocation import android.renderscript.Element import android.renderscript.RenderScript import android.renderscript.ScriptIntrinsicBlur import android.view.View -import io.legado.app.App +import splitties.init.appCtx import java.io.IOException import kotlin.math.* @@ -221,12 +218,36 @@ object BitmapUtils { } } + fun changeBitmapSize(bitmap: Bitmap, newWidth: Int, newHeight: Int): Bitmap { + + val width = bitmap.width + val height = bitmap.height + + //计算压缩的比率 + var scaleWidth = newWidth.toFloat() / width + var scaleHeight = newHeight.toFloat() / height + + if (scaleWidth > scaleHeight) { + scaleWidth = scaleHeight + } else { + scaleHeight = scaleWidth + } + + //获取想要缩放的matrix + val matrix = Matrix() + matrix.postScale(scaleWidth, scaleHeight) + + //获取新的bitmap + return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true) + + } + /** * 高斯模糊 */ fun stackBlur(srcBitmap: Bitmap?): Bitmap? { if (srcBitmap == null) return null - val rs = RenderScript.create(App.INSTANCE) + val rs = RenderScript.create(appCtx) val blurredBitmap = srcBitmap.copy(Config.ARGB_8888, true) //分配用于渲染脚本的内存 diff --git a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt index d0f693069..d6644e35a 100644 --- a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt @@ -3,6 +3,8 @@ package io.legado.app.utils import android.annotation.SuppressLint +import android.app.Activity +import android.app.Service import android.content.* import android.content.pm.PackageManager import android.content.res.ColorStateList @@ -12,29 +14,59 @@ import android.graphics.drawable.Drawable import android.net.Uri import android.os.BatteryManager import android.provider.Settings +import android.widget.Toast import androidx.annotation.ColorRes import androidx.annotation.DrawableRes -import androidx.annotation.StringRes import androidx.core.content.ContextCompat import androidx.core.content.FileProvider import androidx.core.content.edit -import cn.bingoogolapple.qrcode.zxing.QRCodeEncoder -import com.google.zxing.EncodeHintType -import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel +import androidx.preference.PreferenceManager import io.legado.app.BuildConfig import io.legado.app.R -import org.jetbrains.anko.defaultSharedPreferences -import org.jetbrains.anko.longToast -import org.jetbrains.anko.toast import java.io.File import java.io.FileOutputStream +inline fun Context.startActivity(configIntent: Intent.() -> Unit = {}) { + val intent = Intent(this, A::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + intent.apply(configIntent) + startActivity(intent) +} + +inline fun Context.startService(configIntent: Intent.() -> Unit = {}) { + startService(Intent(this, T::class.java).apply(configIntent)) +} + +fun Context.toastOnUi(message: Int) { + runOnUI { + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() + } +} + +fun Context.toastOnUi(message: CharSequence?) { + runOnUI { + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() + } +} + +fun Context.longToastOnUi(message: Int) { + runOnUI { + Toast.makeText(this, message, Toast.LENGTH_LONG).show() + } +} + +fun Context.longToastOnUi(message: CharSequence?) { + runOnUI { + Toast.makeText(this, message, Toast.LENGTH_LONG).show() + } +} + +val Context.defaultSharedPreferences: SharedPreferences + get() = PreferenceManager.getDefaultSharedPreferences(this) + fun Context.getPrefBoolean(key: String, defValue: Boolean = false) = defaultSharedPreferences.getBoolean(key, defValue) -fun Context.getPrefBoolean(@StringRes keyId: Int, defValue: Boolean = false) = - defaultSharedPreferences.getBoolean(getString(keyId), defValue) - fun Context.putPrefBoolean(key: String, value: Boolean = false) = defaultSharedPreferences.edit { putBoolean(key, value) } @@ -102,13 +134,22 @@ val Context.navigationBarHeight: Int return resources.getDimensionPixelSize(resourceId) } +fun Context.share(text: String, title: String = getString(R.string.share)) { + kotlin.runCatching { + val intent = Intent(Intent.ACTION_SEND) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + intent.putExtra(Intent.EXTRA_SUBJECT, title) + intent.putExtra(Intent.EXTRA_TEXT, text) + intent.type = "text/plain" + startActivity(Intent.createChooser(intent, title)) + } +} + @SuppressLint("SetWorldReadable") -fun Context.shareWithQr(title: String, text: String) { - QRCodeEncoder.HINTS[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.L - val bitmap = QRCodeEncoder.syncEncodeQRCode(text, 600) - QRCodeEncoder.HINTS[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.H +fun Context.shareWithQr(text: String, title: String = getString(R.string.share)) { + val bitmap = QRCodeUtils.createQRCode(text) if (bitmap == null) { - toast(R.string.text_too_long_qr_error) + toastOnUi(R.string.text_too_long_qr_error) } else { try { val file = File(externalCacheDir, "qr.png") @@ -128,7 +169,7 @@ fun Context.shareWithQr(title: String, text: String) { intent.type = "image/png" startActivity(Intent.createChooser(intent, title)) } catch (e: Exception) { - toast(e.localizedMessage ?: "ERROR") + toastOnUi(e.localizedMessage ?: "ERROR") } } } @@ -139,7 +180,7 @@ fun Context.sendToClip(text: String) { val clipData = ClipData.newPlainText(null, text) clipboard?.let { clipboard.setPrimaryClip(clipData) - longToast(R.string.copy_complete) + longToastOnUi(R.string.copy_complete) } } @@ -160,7 +201,7 @@ fun Context.sendMail(mail: String) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(intent) } catch (e: Exception) { - toast(e.localizedMessage ?: "Error") + toastOnUi(e.localizedMessage ?: "Error") } } @@ -200,13 +241,13 @@ fun Context.openUrl(uri: Uri) { try { startActivity(intent) } catch (e: Exception) { - toast(e.localizedMessage ?: "open url error") + toastOnUi(e.localizedMessage ?: "open url error") } } else { try { startActivity(Intent.createChooser(intent, "请选择浏览器")) } catch (e: Exception) { - toast(e.localizedMessage ?: "open url error") + toastOnUi(e.localizedMessage ?: "open url error") } } } diff --git a/app/src/main/java/io/legado/app/utils/DocumentUtils.kt b/app/src/main/java/io/legado/app/utils/DocumentUtils.kt index 860c25f18..4a4341a0d 100644 --- a/app/src/main/java/io/legado/app/utils/DocumentUtils.kt +++ b/app/src/main/java/io/legado/app/utils/DocumentUtils.kt @@ -5,6 +5,7 @@ import android.database.Cursor import android.net.Uri import android.provider.DocumentsContract import androidx.documentfile.provider.DocumentFile +import java.nio.charset.Charset import java.util.* @@ -16,6 +17,11 @@ object DocumentUtils { return parent.findFile(fileName)?.exists() ?: false } + fun delete(root: DocumentFile, fileName: String, vararg subDirs: String) { + val parent: DocumentFile? = createFolderIfNotExist(root, *subDirs) + parent?.findFile(fileName)?.delete() + } + fun createFileIfNotExist( root: DocumentFile, fileName: String, @@ -47,8 +53,13 @@ object DocumentUtils { @JvmStatic @Throws(Exception::class) - fun writeText(context: Context, data: String, fileUri: Uri): Boolean { - return writeBytes(context, data.toByteArray(), fileUri) + fun writeText( + context: Context, + data: String, + fileUri: Uri, + charset: Charset = Charsets.UTF_8 + ): Boolean { + return writeBytes(context, data.toByteArray(charset), fileUri) } @JvmStatic @@ -143,8 +154,8 @@ data class DocItem( } @Throws(Exception::class) -fun DocumentFile.writeText(context: Context, data: String) { - DocumentUtils.writeText(context, data, this.uri) +fun DocumentFile.writeText(context: Context, data: String, charset: Charset = Charsets.UTF_8) { + DocumentUtils.writeText(context, data, this.uri, charset) } @Throws(Exception::class) diff --git a/app/src/main/java/io/legado/app/utils/FileUtils.kt b/app/src/main/java/io/legado/app/utils/FileUtils.kt index c42f6f7d4..6c88e70e0 100644 --- a/app/src/main/java/io/legado/app/utils/FileUtils.kt +++ b/app/src/main/java/io/legado/app/utils/FileUtils.kt @@ -3,8 +3,8 @@ package io.legado.app.utils import android.os.Environment import android.webkit.MimeTypeMap import androidx.annotation.IntDef -import io.legado.app.App import io.legado.app.ui.filepicker.utils.ConvertUtils +import splitties.init.appCtx import java.io.* import java.nio.charset.Charset import java.text.SimpleDateFormat @@ -105,8 +105,8 @@ object FileUtils { } fun getCachePath(): String { - return App.INSTANCE.externalCacheDir?.absolutePath - ?: App.INSTANCE.cacheDir.absolutePath + return appCtx.externalCacheDir?.absolutePath + ?: appCtx.cacheDir.absolutePath } fun getSdCardPath(): String { diff --git a/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt b/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt index 15787e7fe..5a086cf29 100644 --- a/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt @@ -3,7 +3,6 @@ package io.legado.app.utils import android.app.Activity -import android.app.Service import android.content.Intent import android.content.res.ColorStateList import android.graphics.drawable.Drawable @@ -11,13 +10,10 @@ import androidx.annotation.ColorRes import androidx.annotation.DrawableRes import androidx.core.content.edit import androidx.fragment.app.Fragment -import org.jetbrains.anko.connectivityManager -import org.jetbrains.anko.defaultSharedPreferences -import org.jetbrains.anko.internals.AnkoInternals +import splitties.systemservices.connectivityManager @Suppress("DEPRECATION") -fun Fragment.isOnline() = - requireContext().connectivityManager.activeNetworkInfo?.isConnected == true +fun Fragment.isOnline() = connectivityManager.activeNetworkInfo?.isConnected == true fun Fragment.getPrefBoolean(key: String, defValue: Boolean = false) = requireContext().defaultSharedPreferences.getBoolean(key, defValue) @@ -63,22 +59,15 @@ fun Fragment.getCompatDrawable(@DrawableRes id: Int): Drawable? = fun Fragment.getCompatColorStateList(@ColorRes id: Int): ColorStateList? = requireContext().getCompatColorStateList(id) -inline fun Fragment.startActivity(vararg params: Pair) = - AnkoInternals.internalStartActivity(requireActivity(), T::class.java, params) +inline fun Fragment.startActivity( + configIntent: Intent.() -> Unit = {} +) { + startActivity(Intent(requireContext(), T::class.java).apply(configIntent)) +} inline fun Fragment.startActivityForResult( requestCode: Int, - vararg params: Pair -) = startActivityForResult( - AnkoInternals.createIntent(requireActivity(), T::class.java, params), - requestCode -) - -inline fun Fragment.startService(vararg params: Pair) = - AnkoInternals.internalStartService(requireActivity(), T::class.java, params) - -inline fun Fragment.stopService(vararg params: Pair) = - AnkoInternals.internalStopService(requireActivity(), T::class.java, params) - -inline fun Fragment.intentFor(vararg params: Pair): Intent = - AnkoInternals.createIntent(requireActivity(), T::class.java, params) \ No newline at end of file + configIntent: Intent.() -> Unit = {} +) { + startActivityForResult(Intent(requireContext(), T::class.java).apply(configIntent), requestCode) +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/utils/GsonExtensions.kt b/app/src/main/java/io/legado/app/utils/GsonExtensions.kt index b29b4e2b4..db32ca60a 100644 --- a/app/src/main/java/io/legado/app/utils/GsonExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/GsonExtensions.kt @@ -3,7 +3,6 @@ package io.legado.app.utils import com.google.gson.* import com.google.gson.internal.LinkedTreeMap import com.google.gson.reflect.TypeToken -import org.jetbrains.anko.attempt import java.lang.reflect.ParameterizedType import java.lang.reflect.Type import kotlin.math.ceil @@ -24,17 +23,15 @@ val GSON: Gson by lazy { inline fun genericType(): Type = object : TypeToken() {}.type inline fun Gson.fromJsonObject(json: String?): T? {//可转成任意类型 - return attempt { - val result: T? = fromJson(json, genericType()) - result - }.value + return kotlin.runCatching { + fromJson(json, genericType()) as? T + }.getOrNull() } inline fun Gson.fromJsonArray(json: String?): List? { - return attempt { - val result: List? = fromJson(json, ParameterizedTypeImpl(T::class.java)) - result - }.value + return kotlin.runCatching { + fromJson(json, ParameterizedTypeImpl(T::class.java)) as? List + }.getOrNull() } class ParameterizedTypeImpl(private val clazz: Class<*>) : ParameterizedType { diff --git a/app/src/main/java/io/legado/app/utils/HandlerUtils.kt b/app/src/main/java/io/legado/app/utils/HandlerUtils.kt new file mode 100644 index 000000000..0eacea43b --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/HandlerUtils.kt @@ -0,0 +1,52 @@ +@file:Suppress("unused") + +package io.legado.app.utils + +import android.os.Build.VERSION.SDK_INT +import android.os.Handler +import android.os.Looper +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.launch + +/** This main looper cache avoids synchronization overhead when accessed repeatedly. */ +@JvmField +val mainLooper: Looper = Looper.getMainLooper()!! + +@JvmField +val mainThread: Thread = mainLooper.thread + +val isMainThread: Boolean inline get() = mainThread === Thread.currentThread() + +@PublishedApi +internal val currentThread: Any? + inline get() = Thread.currentThread() + +@JvmField +val mainHandler: Handler = if (SDK_INT >= 28) Handler.createAsync(mainLooper) else try { + Handler::class.java.getDeclaredConstructor( + Looper::class.java, + Handler.Callback::class.java, + Boolean::class.javaPrimitiveType // async + ).newInstance(mainLooper, null, true) +} catch (ignored: NoSuchMethodException) { + Handler(mainLooper) // Hidden constructor absent. Fall back to non-async constructor. +} + +fun runOnUI(function: () -> Unit) { + if (isMainThread) { + function() + } else { + mainHandler.post(function) + } +} + +fun CoroutineScope.runOnIO(function: () -> Unit) { + if (isMainThread) { + launch(IO) { + function() + } + } else { + function() + } +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/utils/JsExtensions.kt b/app/src/main/java/io/legado/app/utils/JsExtensions.kt new file mode 100644 index 000000000..650980863 --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/JsExtensions.kt @@ -0,0 +1,68 @@ +@file:Suppress("unused") + +package io.legado.app.utils + +import org.mozilla.javascript.* + +/** + * 禁止在js里删除文件 + * 参考 https://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ + */ +fun ContextFactory.eval(jsStr: String, scriptObjects: Map): Any { + val ctx = this.enterContext() + ctx.optimizationLevel = -1 + ctx.setClassShutter { + when { + it.startsWith("java.io") -> false + else -> true + } + } + val scope: Scriptable = ctx.initStandardObjects() + for (name in scriptObjects.keys) { + val obj = scriptObjects[name] + if (obj is Boolean) { + scope.put(name, scope, obj) + } else if (obj != null) { + val jsArgs = Context.toObject(obj, scope) + scope.put(name, scope, jsArgs) + } + } + scope.delete("Packages") + return try { + ctx.evaluateString(scope, jsStr, null, 1, null) + } catch (e: RhinoException) { + e.printStackTrace() + e.toString() + } finally { + Context.exit() + } +} + +class SandboxNativeJavaObject(scope: Scriptable?, javaObject: Any?, staticType: Class<*>?) : + NativeJavaObject(scope, javaObject, staticType) { + override fun get(name: String, start: Scriptable): Any { + return when (name) { + "getClass", "delete" -> NOT_FOUND + else -> super.get(name, start) + } + } +} + +class SandboxWrapFactory : WrapFactory() { + override fun wrapAsJavaObject( + cx: Context?, + scope: Scriptable?, + javaObject: Any?, + staticType: Class<*>? + ): Scriptable { + return SandboxNativeJavaObject(scope, javaObject, staticType) + } +} + +class SandboxContextFactory : ContextFactory() { + override fun makeContext(): Context { + val cx = super.makeContext() + cx.wrapFactory = SandboxWrapFactory() + return cx + } +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/utils/LanguageUtils.kt b/app/src/main/java/io/legado/app/utils/LanguageUtils.kt index 7a8572ded..0eed85d6f 100644 --- a/app/src/main/java/io/legado/app/utils/LanguageUtils.kt +++ b/app/src/main/java/io/legado/app/utils/LanguageUtils.kt @@ -19,7 +19,6 @@ object LanguageUtils { val resources: Resources = context.resources val metrics = resources.displayMetrics val configuration: Configuration = resources.configuration - //Log.d("h11128", "set language to ${context.getPrefString(PreferKey.language)}") val targetLocale = getSetLocale(context) configuration.setLocale(targetLocale) configuration.setLocales(LocaleList(targetLocale)) diff --git a/app/src/main/java/io/legado/app/utils/LogUtils.kt b/app/src/main/java/io/legado/app/utils/LogUtils.kt index a96bc7c75..b94274a3b 100644 --- a/app/src/main/java/io/legado/app/utils/LogUtils.kt +++ b/app/src/main/java/io/legado/app/utils/LogUtils.kt @@ -1,11 +1,10 @@ package io.legado.app.utils import android.annotation.SuppressLint -import io.legado.app.App +import splitties.init.appCtx import java.text.SimpleDateFormat import java.util.* import java.util.logging.* -import java.util.logging.Formatter @Suppress("unused") object LogUtils { @@ -30,17 +29,17 @@ object LogUtils { } private val fileHandler by lazy { - val root = App.INSTANCE.externalCacheDir ?: return@lazy null + val root = appCtx.externalCacheDir ?: return@lazy null val logFolder = FileUtils.createFolderIfNotExist(root, "logs") val logPath = FileUtils.getPath(root = logFolder, "appLog") FileHandler(logPath, 10240, 10).apply { - formatter = object : Formatter() { + formatter = object : java.util.logging.Formatter() { override fun format(record: LogRecord): String { // 设置文件输出格式 return (getCurrentDateStr(TIME_PATTERN) + ": " + record.message + "\n") } } - level = if (App.INSTANCE.getPrefBoolean("recordLog")) { + level = if (appCtx.getPrefBoolean("recordLog")) { Level.INFO } else { Level.OFF @@ -49,7 +48,7 @@ object LogUtils { } fun upLevel() { - fileHandler?.level = if (App.INSTANCE.getPrefBoolean("recordLog")) { + fileHandler?.level = if (appCtx.getPrefBoolean("recordLog")) { Level.INFO } else { Level.OFF diff --git a/app/src/main/java/io/legado/app/utils/QRCodeUtils.kt b/app/src/main/java/io/legado/app/utils/QRCodeUtils.kt new file mode 100644 index 000000000..366abfbe3 --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/QRCodeUtils.kt @@ -0,0 +1,467 @@ +package io.legado.app.utils + +import android.graphics.* +import android.text.TextPaint +import android.text.TextUtils +import androidx.annotation.ColorInt +import androidx.annotation.FloatRange +import com.google.zxing.* +import com.google.zxing.common.GlobalHistogramBinarizer +import com.google.zxing.common.HybridBinarizer +import com.google.zxing.qrcode.QRCodeWriter +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel +import com.king.zxing.DecodeFormatManager +import com.king.zxing.util.LogUtils +import java.util.* +import kotlin.math.max + + +@Suppress("MemberVisibilityCanBePrivate", "unused") +object QRCodeUtils { + + const val DEFAULT_REQ_WIDTH = 480 + const val DEFAULT_REQ_HEIGHT = 640 + + /** + * 生成二维码 + * @param content 二维码的内容 + * @param heightPix 二维码的高 + * @param logo 二维码中间的logo + * @param ratio logo所占比例 因为二维码的最大容错率为30%,所以建议ratio的范围小于0.3 + * @return + */ + fun createQRCode( + content: String, + heightPix: Int = DEFAULT_REQ_HEIGHT, + logo: Bitmap? = null, + @FloatRange(from = 0.0, to = 1.0) ratio: Float = 0.2f, + errorCorrectionLevel: ErrorCorrectionLevel = ErrorCorrectionLevel.H + ): Bitmap? { + //配置参数 + val hints: MutableMap = EnumMap(EncodeHintType::class.java) + hints[EncodeHintType.CHARACTER_SET] = "utf-8" + //容错级别 + hints[EncodeHintType.ERROR_CORRECTION] = errorCorrectionLevel + //设置空白边距的宽度 + hints[EncodeHintType.MARGIN] = 1 //default is 4 + return createQRCode(content, heightPix, logo, ratio, hints) + } + + /** + * 生成二维码 + * @param content 二维码的内容 + * @param heightPix 二维码的高 + * @param logo 二维码中间的logo + * @param ratio logo所占比例 因为二维码的最大容错率为30%,所以建议ratio的范围小于0.3 + * @param hints + * @param codeColor 二维码的颜色 + * @return + */ + fun createQRCode( + content: String?, + heightPix: Int, + logo: Bitmap?, + @FloatRange(from = 0.0, to = 1.0) ratio: Float = 0.2f, + hints: Map, + codeColor: Int = Color.BLACK + ): Bitmap? { + try { + // 图像数据转换,使用了矩阵转换 + val bitMatrix = + QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, heightPix, heightPix, hints) + val pixels = IntArray(heightPix * heightPix) + // 下面这里按照二维码的算法,逐个生成二维码的图片, + // 两个for循环是图片横列扫描的结果 + for (y in 0 until heightPix) { + for (x in 0 until heightPix) { + if (bitMatrix[x, y]) { + pixels[y * heightPix + x] = codeColor + } else { + pixels[y * heightPix + x] = Color.WHITE + } + } + } + + // 生成二维码图片的格式 + var bitmap = Bitmap.createBitmap(heightPix, heightPix, Bitmap.Config.ARGB_8888) + bitmap!!.setPixels(pixels, 0, heightPix, 0, 0, heightPix, heightPix) + if (logo != null) { + bitmap = addLogo(bitmap, logo, ratio) + } + return bitmap + } catch (e: WriterException) { + LogUtils.w(e.message) + } + return null + } + + /** + * 在二维码中间添加Logo图案 + * @param src + * @param logo + * @param ratio logo所占比例 因为二维码的最大容错率为30%,所以建议ratio的范围小于0.3 + * @return + */ + private fun addLogo( + src: Bitmap?, + logo: Bitmap?, + @FloatRange(from = 0.0, to = 1.0) ratio: Float + ): Bitmap? { + if (src == null) { + return null + } + if (logo == null) { + return src + } + + //获取图片的宽高 + val srcWidth = src.width + val srcHeight = src.height + val logoWidth = logo.width + val logoHeight = logo.height + if (srcWidth == 0 || srcHeight == 0) { + return null + } + if (logoWidth == 0 || logoHeight == 0) { + return src + } + + //logo大小为二维码整体大小 + val scaleFactor = srcWidth * ratio / logoWidth + var bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888) + try { + val canvas = Canvas(bitmap!!) + canvas.drawBitmap(src, 0f, 0f, null) + canvas.scale( + scaleFactor, + scaleFactor, + (srcWidth / 2).toFloat(), + (srcHeight / 2).toFloat() + ) + canvas.drawBitmap( + logo, + ((srcWidth - logoWidth) / 2).toFloat(), + ((srcHeight - logoHeight) / 2).toFloat(), + null + ) + canvas.save() + canvas.restore() + } catch (e: Exception) { + bitmap = null + LogUtils.w(e.message) + } + return bitmap + } + + /** + * 解析一维码/二维码图片 + * @param bitmap 解析的图片 + * @param hints 解析编码类型 + * @return + */ + fun parseCode( + bitmap: Bitmap, + reqWidth: Int = DEFAULT_REQ_WIDTH, + reqHeight: Int = DEFAULT_REQ_HEIGHT, + hints: Map = DecodeFormatManager.ALL_HINTS + ): String? { + val result = parseCodeResult(bitmap, reqWidth, reqHeight, hints) + return result?.text + } + + /** + * 解析一维码/二维码图片 + * @param bitmap 解析的图片 + * @param hints 解析编码类型 + * @return + */ + fun parseCodeResult( + bitmap: Bitmap, + reqWidth: Int = DEFAULT_REQ_WIDTH, + reqHeight: Int = DEFAULT_REQ_HEIGHT, + hints: Map = DecodeFormatManager.ALL_HINTS + ): Result? { + if (bitmap.width > reqWidth || bitmap.height > reqHeight) { + val bm = BitmapUtils.changeBitmapSize(bitmap, reqWidth, reqHeight) + return parseCodeResult(getRGBLuminanceSource(bm), hints) + } + return parseCodeResult(getRGBLuminanceSource(bitmap), hints) + } + + /** + * 解析一维码/二维码图片 + * @param source + * @param hints + * @return + */ + fun parseCodeResult(source: LuminanceSource?, hints: Map?): Result? { + var result: Result? = null + val reader = MultiFormatReader() + try { + reader.setHints(hints) + if (source != null) { + result = decodeInternal(reader, source) + if (result == null) { + result = decodeInternal(reader, source.invert()) + } + if (result == null && source.isRotateSupported) { + result = decodeInternal(reader, source.rotateCounterClockwise()) + } + } + } catch (e: java.lang.Exception) { + LogUtils.w(e.message) + } finally { + reader.reset() + } + return result + } + + /** + * 解析二维码图片 + * @param bitmapPath 需要解析的图片路径 + * @return + */ + fun parseQRCode(bitmapPath: String?): String? { + val result = parseQRCodeResult(bitmapPath) + return result?.text + } + + /** + * 解析二维码图片 + * @param bitmapPath 需要解析的图片路径 + * @param reqWidth 请求目标宽度,如果实际图片宽度大于此值,会自动进行压缩处理,当 reqWidth 和 reqHeight都小于或等于0时,则不进行压缩处理 + * @param reqHeight 请求目标高度,如果实际图片高度大于此值,会自动进行压缩处理,当 reqWidth 和 reqHeight都小于或等于0时,则不进行压缩处理 + * @return + */ + fun parseQRCodeResult( + bitmapPath: String?, + reqWidth: Int = DEFAULT_REQ_WIDTH, + reqHeight: Int = DEFAULT_REQ_HEIGHT + ): Result? { + return parseCodeResult(bitmapPath, reqWidth, reqHeight, DecodeFormatManager.QR_CODE_HINTS) + } + + /** + * 解析一维码/二维码图片 + * @param bitmapPath 需要解析的图片路径 + * @return + */ + fun parseCode( + bitmapPath: String?, + reqWidth: Int = DEFAULT_REQ_WIDTH, + reqHeight: Int = DEFAULT_REQ_HEIGHT, + hints: Map = DecodeFormatManager.ALL_HINTS + ): String? { + return parseCodeResult(bitmapPath, reqWidth, reqHeight, hints)?.text + } + + /** + * 解析一维码/二维码图片 + * @param bitmapPath 需要解析的图片路径 + * @param reqWidth 请求目标宽度,如果实际图片宽度大于此值,会自动进行压缩处理,当 reqWidth 和 reqHeight都小于或等于0时,则不进行压缩处理 + * @param reqHeight 请求目标高度,如果实际图片高度大于此值,会自动进行压缩处理,当 reqWidth 和 reqHeight都小于或等于0时,则不进行压缩处理 + * @param hints 解析编码类型 + * @return + */ + fun parseCodeResult( + bitmapPath: String?, + reqWidth: Int = DEFAULT_REQ_WIDTH, + reqHeight: Int = DEFAULT_REQ_HEIGHT, + hints: Map = DecodeFormatManager.ALL_HINTS + ): Result? { + var result: Result? = null + val reader = MultiFormatReader() + try { + reader.setHints(hints) + val source = getRGBLuminanceSource(compressBitmap(bitmapPath, reqWidth, reqHeight)) + result = decodeInternal(reader, source) + if (result == null) { + result = decodeInternal(reader, source.invert()) + } + if (result == null && source.isRotateSupported) { + result = decodeInternal(reader, source.rotateCounterClockwise()) + } + } catch (e: Exception) { + LogUtils.w(e.message) + } finally { + reader.reset() + } + return result + } + + private fun decodeInternal(reader: MultiFormatReader, source: LuminanceSource): Result? { + var result: Result? = null + try { + try { + //采用HybridBinarizer解析 + result = reader.decodeWithState(BinaryBitmap(HybridBinarizer(source))) + } catch (e: Exception) { + } + if (result == null) { + //如果没有解析成功,再采用GlobalHistogramBinarizer解析一次 + result = reader.decodeWithState(BinaryBitmap(GlobalHistogramBinarizer(source))) + } + } catch (e: Exception) { + } + return result + } + + + /** + * 压缩图片 + * @param path + * @return + */ + private fun compressBitmap(path: String?, reqWidth: Int, reqHeight: Int): Bitmap { + if (reqWidth > 0 && reqHeight > 0) { //都大于进行判断是否压缩 + val newOpts = BitmapFactory.Options() + // 开始读入图片,此时把options.inJustDecodeBounds 设回true了 + newOpts.inJustDecodeBounds = true //获取原始图片大小 + BitmapFactory.decodeFile(path, newOpts) // 此时返回bm为空 + val width = newOpts.outWidth.toFloat() + val height = newOpts.outHeight.toFloat() + // 缩放比,由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 + var wSize = 1 // wSize=1表示不缩放 + if (width > reqWidth) { // 如果宽度大的话根据宽度固定大小缩放 + wSize = (width / reqWidth).toInt() + } + var hSize = 1 // wSize=1表示不缩放 + if (height > reqHeight) { // 如果高度高的话根据宽度固定大小缩放 + hSize = (height / reqHeight).toInt() + } + var size = max(wSize, hSize) + if (size <= 0) size = 1 + newOpts.inSampleSize = size // 设置缩放比例 + // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了 + newOpts.inJustDecodeBounds = false + return BitmapFactory.decodeFile(path, newOpts) + } + return BitmapFactory.decodeFile(path) + } + + + /** + * 获取RGBLuminanceSource + * @param bitmap + * @return + */ + private fun getRGBLuminanceSource(bitmap: Bitmap): RGBLuminanceSource { + val width = bitmap.width + val height = bitmap.height + val pixels = IntArray(width * height) + bitmap.getPixels(pixels, 0, bitmap.width, 0, 0, bitmap.width, bitmap.height) + return RGBLuminanceSource(width, height, pixels) + } + + /** + * 生成条形码 + * @param content + * @param format + * @param desiredWidth + * @param desiredHeight + * @param hints + * @param isShowText + * @param textSize + * @param codeColor + * @return + */ + fun createBarCode( + content: String?, + desiredWidth: Int, + desiredHeight: Int, + format: BarcodeFormat = BarcodeFormat.CODE_128, + hints: Map? = null, + isShowText: Boolean = true, + textSize: Int = 40, + @ColorInt codeColor: Int = Color.BLACK + ): Bitmap? { + if (TextUtils.isEmpty(content)) { + return null + } + val writer = MultiFormatWriter() + try { + val result = writer.encode( + content, format, desiredWidth, + desiredHeight, hints + ) + val width = result.width + val height = result.height + val pixels = IntArray(width * height) + // All are 0, or black, by default + for (y in 0 until height) { + val offset = y * width + for (x in 0 until width) { + pixels[offset + x] = if (result[x, y]) codeColor else Color.WHITE + } + } + val bitmap = Bitmap.createBitmap( + width, height, + Bitmap.Config.ARGB_8888 + ) + bitmap.setPixels(pixels, 0, width, 0, 0, width, height) + return if (isShowText) { + addCode(bitmap, content, textSize, codeColor, textSize / 2) + } else bitmap + } catch (e: WriterException) { + LogUtils.w(e.message) + } + return null + } + + /** + * 条形码下面添加文本信息 + * @param src + * @param code + * @param textSize + * @param textColor + * @return + */ + private fun addCode( + src: Bitmap?, + code: String?, + textSize: Int, + @ColorInt textColor: Int, + offset: Int + ): Bitmap? { + if (src == null) { + return null + } + if (TextUtils.isEmpty(code)) { + return src + } + + //获取图片的宽高 + val srcWidth = src.width + val srcHeight = src.height + if (srcWidth <= 0 || srcHeight <= 0) { + return null + } + var bitmap = Bitmap.createBitmap( + srcWidth, + srcHeight + textSize + offset * 2, + Bitmap.Config.ARGB_8888 + ) + try { + val canvas = Canvas(bitmap!!) + canvas.drawBitmap(src, 0f, 0f, null) + val paint = TextPaint() + paint.textSize = textSize.toFloat() + paint.color = textColor + paint.textAlign = Paint.Align.CENTER + canvas.drawText( + code!!, + (srcWidth / 2).toFloat(), + (srcHeight + textSize / 2 + offset).toFloat(), + paint + ) + canvas.save() + canvas.restore() + } catch (e: Exception) { + bitmap = null + LogUtils.w(e.message) + } + return bitmap + } + + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/utils/StringExtensions.kt b/app/src/main/java/io/legado/app/utils/StringExtensions.kt index b6a6d23e2..0ca1950d9 100644 --- a/app/src/main/java/io/legado/app/utils/StringExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/StringExtensions.kt @@ -9,7 +9,6 @@ import java.io.File import java.util.* val removeHtmlRegex = "]*>".toRegex() -val imgRegex = "]*>".toRegex() val notImgHtmlRegex = "])[^<>]*>".toRegex() fun String?.safeTrim() = if (this.isNullOrBlank()) null else this.trim() @@ -54,7 +53,6 @@ fun String?.isJsonArray(): Boolean = fun String?.htmlFormat(): String { this ?: return "" return this - .replace(imgRegex, "\n$0\n") .replace(removeHtmlRegex, "\n") .replace(notImgHtmlRegex, "") .replace("\\s*\\n+\\s*".toRegex(), "\n  ") diff --git a/app/src/main/java/io/legado/app/utils/Toasts.kt b/app/src/main/java/io/legado/app/utils/Toasts.kt index 9038c2231..c98f3561c 100644 --- a/app/src/main/java/io/legado/app/utils/Toasts.kt +++ b/app/src/main/java/io/legado/app/utils/Toasts.kt @@ -4,8 +4,6 @@ package io.legado.app.utils import android.widget.Toast import androidx.fragment.app.Fragment -import org.jetbrains.anko.longToast -import org.jetbrains.anko.toast /** @@ -13,25 +11,25 @@ import org.jetbrains.anko.toast * * @param message the message text resource. */ -fun Fragment.toast(message: Int) = requireActivity().toast(message) +fun Fragment.toastOnUi(message: Int) = requireActivity().toastOnUi(message) /** * Display the simple Toast message with the [Toast.LENGTH_SHORT] duration. * * @param message the message text. */ -fun Fragment.toast(message: CharSequence) = requireActivity().toast(message) +fun Fragment.toastOnUi(message: CharSequence) = requireActivity().toastOnUi(message) /** * Display the simple Toast message with the [Toast.LENGTH_LONG] duration. * * @param message the message text resource. */ -fun Fragment.longToast(message: Int) = requireActivity().longToast(message) +fun Fragment.longToast(message: Int) = requireContext().longToastOnUi(message) /** * Display the simple Toast message with the [Toast.LENGTH_LONG] duration. * * @param message the message text. */ -fun Fragment.longToast(message: CharSequence) = requireActivity().longToast(message) +fun Fragment.longToast(message: CharSequence) = requireContext().longToastOnUi(message) diff --git a/app/src/main/java/io/legado/app/utils/ViewExtensions.kt b/app/src/main/java/io/legado/app/utils/ViewExtensions.kt index 988072bb3..3b3f20270 100644 --- a/app/src/main/java/io/legado/app/utils/ViewExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ViewExtensions.kt @@ -14,7 +14,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.menu.MenuPopupHelper import androidx.appcompat.widget.PopupMenu import androidx.core.view.get -import io.legado.app.App +import splitties.init.appCtx import java.lang.reflect.Field @@ -31,7 +31,7 @@ val View.activity: AppCompatActivity? get() = getCompatActivity(context) fun View.hideSoftInput() = run { - val imm = App.INSTANCE.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager + val imm = appCtx.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager imm?.let { imm.hideSoftInputFromWindow(this.windowToken, 0) } diff --git a/app/src/main/java/io/legado/app/utils/ViewModelKt.kt b/app/src/main/java/io/legado/app/utils/ViewModelKt.kt deleted file mode 100644 index 9e1f74f24..000000000 --- a/app/src/main/java/io/legado/app/utils/ViewModelKt.kt +++ /dev/null @@ -1,18 +0,0 @@ -package io.legado.app.utils - -import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider - -fun AppCompatActivity.getViewModel(clazz: Class) = - ViewModelProvider(this).get(clazz) - -fun Fragment.getViewModel(clazz: Class) = - ViewModelProvider(this).get(clazz) - -/** - * 与activity数据同步 - */ -fun Fragment.getViewModelOfActivity(clazz: Class) = - ViewModelProvider(requireActivity()).get(clazz) \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt b/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt index 747a741f5..b5a77e2a3 100644 --- a/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt +++ b/app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt @@ -1,18 +1,19 @@ package io.legado.app.web -import android.os.Looper import fi.iki.elonen.NanoHTTPD import fi.iki.elonen.NanoWSD -import io.legado.app.App import io.legado.app.R +import io.legado.app.data.appDb import io.legado.app.model.Debug import io.legado.app.model.webBook.WebBook import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonObject import io.legado.app.utils.isJson +import io.legado.app.utils.runOnIO import kotlinx.coroutines.* import kotlinx.coroutines.Dispatchers.IO +import splitties.init.appCtx import java.io.IOException @@ -42,19 +43,23 @@ class SourceDebugWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) : } override fun onMessage(message: NanoWSD.WebSocketFrame) { - if (!message.textPayload.isJson()) return launch(IO) { kotlin.runCatching { + if (!message.textPayload.isJson()) { + send("数据必须为Json格式") + close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) + return@launch + } val debugBean = GSON.fromJsonObject>(message.textPayload) if (debugBean != null) { val tag = debugBean["tag"] val key = debugBean["key"] if (tag.isNullOrBlank() || key.isNullOrBlank()) { - send(App.INSTANCE.getString(R.string.cannot_empty)) + send(appCtx.getString(R.string.cannot_empty)) close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) return@launch } - App.db.bookSourceDao.getBookSource(tag)?.let { + appDb.bookSourceDao.getBookSource(tag)?.let { Debug.callback = this@SourceDebugWebSocket Debug.startDebug(this, WebBook(it), key) } @@ -72,19 +77,7 @@ class SourceDebugWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) : } override fun printLog(state: Int, msg: String) { - if (Looper.getMainLooper() == Looper.myLooper()) { - launch(IO) { - runCatching { - send(msg) - if (state == -1 || state == 1000) { - Debug.cancelDebug(true) - close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) - } - }.onFailure { - it.printStackTrace() - } - } - } else { + runOnIO { runCatching { send(msg) if (state == -1 || state == 1000) { diff --git a/app/src/main/java/io/legado/app/web/utils/AssetsWeb.kt b/app/src/main/java/io/legado/app/web/utils/AssetsWeb.kt index 503f7aad5..22e375555 100644 --- a/app/src/main/java/io/legado/app/web/utils/AssetsWeb.kt +++ b/app/src/main/java/io/legado/app/web/utils/AssetsWeb.kt @@ -3,13 +3,13 @@ package io.legado.app.web.utils import android.content.res.AssetManager import android.text.TextUtils import fi.iki.elonen.NanoHTTPD -import io.legado.app.App +import splitties.init.appCtx import java.io.File import java.io.IOException class AssetsWeb(rootPath: String) { - private val assetManager: AssetManager = App.INSTANCE.assets + private val assetManager: AssetManager = appCtx.assets private var rootPath = "web" init { diff --git a/app/src/main/res/layout/activity_qrcode_capture.xml b/app/src/main/res/layout/activity_qrcode_capture.xml index cfc732dd6..379109187 100644 --- a/app/src/main/res/layout/activity_qrcode_capture.xml +++ b/app/src/main/res/layout/activity_qrcode_capture.xml @@ -1,45 +1,9 @@ - - - - + android:layout_height="match_parent" + android:orientation="vertical"> - - - - - - - + android:layout_height="match_parent" /> - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_read_padding.xml b/app/src/main/res/layout/dialog_read_padding.xml index c9be863dd..37153a1f1 100644 --- a/app/src/main/res/layout/dialog_read_padding.xml +++ b/app/src/main/res/layout/dialog_read_padding.xml @@ -84,7 +84,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" app:title="@string/padding_top" - app:max="100" /> + app:max="200" /> diff --git a/app/src/main/res/layout/dialog_wait.xml b/app/src/main/res/layout/dialog_wait.xml new file mode 100644 index 000000000..ccd7d4ccc --- /dev/null +++ b/app/src/main/res/layout/dialog_wait.xml @@ -0,0 +1,25 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_book_group_manage.xml b/app/src/main/res/layout/item_book_group_manage.xml new file mode 100644 index 000000000..7c41898db --- /dev/null +++ b/app/src/main/res/layout/item_book_group_manage.xml @@ -0,0 +1,29 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_group_manage.xml b/app/src/main/res/layout/item_group_manage.xml index 9aa18e82a..763a19acd 100644 --- a/app/src/main/res/layout/item_group_manage.xml +++ b/app/src/main/res/layout/item_group_manage.xml @@ -29,10 +29,4 @@ android:padding="8dp" android:text="@string/delete" /> - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_read_record.xml b/app/src/main/res/layout/item_read_record.xml index 2587d759a..7c6316058 100644 --- a/app/src/main/res/layout/item_read_record.xml +++ b/app/src/main/res/layout/item_read_record.xml @@ -1,36 +1,42 @@ - + android:paddingRight="10dp"> + android:padding="6dp" + android:singleLine="true" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_book_name" + app:layout_constraintRight_toLeftOf="@+id/tv_remove" /> - + android:padding="6dp" + android:text="@string/clear" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="@id/tv_book_name" + app:layout_constraintBottom_toBottomOf="@+id/tv_read_time" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/view_select_action_bar.xml b/app/src/main/res/layout/view_select_action_bar.xml index 70d15f3db..eddfb0fc4 100644 --- a/app/src/main/res/layout/view_select_action_bar.xml +++ b/app/src/main/res/layout/view_select_action_bar.xml @@ -27,7 +27,7 @@ android:layout_margin="5dp" android:padding="5dp" android:gravity="center" - android:minWidth="80dp" + android:minWidth="72dp" android:text="@string/revert_selection" /> diff --git a/app/src/main/res/menu/book_cache.xml b/app/src/main/res/menu/book_cache.xml index 689fc54ae..a0dca539f 100644 --- a/app/src/main/res/menu/book_cache.xml +++ b/app/src/main/res/menu/book_cache.xml @@ -1,14 +1,14 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + tools:ignore="AlwaysShowAction"> + app:showAsAction="always" /> + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/import_source.xml b/app/src/main/res/menu/import_source.xml index 84dae94ca..ead4b715e 100644 --- a/app/src/main/res/menu/import_source.xml +++ b/app/src/main/res/menu/import_source.xml @@ -9,17 +9,6 @@ app:showAsAction="always" tools:ignore="AlwaysShowAction" /> - - - - + + diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index e4336c98a..7f69f09f2 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -212,7 +212,7 @@ 選擇操作 全選 全選 (%1$d/%2$d) - 取消 (%1$d/%2$d) + 取消全選 (%1$d/%2$d) 深色模式 啟動頁 開始下載 @@ -801,5 +801,13 @@ 预先下载10章正文 启用排序 背景图片 + 导出文件夹 + 导出编码 + 导出到WebDav + 反转内容 + 调试 + 崩溃日志 + 使用自定义中文分行 + 图片样式 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 73f4ea493..ab10dc901 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -2,7 +2,7 @@ 閱讀 閱讀·搜尋 - 閱讀需要存取記憶卡權限,請前往“設定”—“應用程式權限”—打開所需權限 + 閱讀需要存取記憶卡權限,請前往「設定」—「應用程式權限」—打開所需權限 Home @@ -214,7 +214,7 @@ 選擇操作 全選 全選(%1$d/%2$d) - 取消(%1$d/%2$d) + 取消全選(%1$d/%2$d) 深色模式 啟動頁 開始下載 @@ -797,13 +797,19 @@ 目前進度超過雲端進度,是否同步? 同步閱讀進度 進入退出閱讀介面時同步閱讀進度 - 创建书签失败 - 单URL - 导出书单 - 导入书单 - 预下载 - 预先下载10章正文 - 启用排序 - 背景图片 + 建立書籤失敗 + 單URL + 匯出書單 + 匯入書單 + 預下載 + 預先下載10章正文 + 啟用排序 + 背景圖片 + 匯出資料夾 + 匯出編碼 + 匯出到WebDav + 反转内容 + 调试 + 图片样式 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 6ff4b0be6..f6bb78f34 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -214,7 +214,7 @@ 选择操作 全选 全选(%1$d/%2$d) - 取消(%1$d/%2$d) + 取消全选(%1$d/%2$d) 深色模式 启动页 开始下载 @@ -805,5 +805,13 @@ 预先下载10章正文 启用排序 背景图片 + 导出文件夹 + 导出编码 + 导出到WebDav + 反转内容 + 调试 + 崩溃日志 + 使用自定义中文分行 + 图片样式 diff --git a/app/src/main/res/values/pref_key_value.xml b/app/src/main/res/values/pref_key_value.xml index ebaac231b..904a4e441 100644 --- a/app/src/main/res/values/pref_key_value.xml +++ b/app/src/main/res/values/pref_key_value.xml @@ -1,8 +1,6 @@ - auto_refresh bookshelf_px - defaultToRead 开源阅读 https://alanskycn.gitee.io/teachme/ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2472dbe3c..0e54cdc00 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -215,7 +215,7 @@ Selection action Select all Select all(%1$d/%2$d) - Cancel(%1$d/%2$d) + Cancel select all(%1$d/%2$d) Dark mode Welcome page Download start @@ -808,5 +808,13 @@ 预先下载10章正文 启用排序 背景图片 + 导出文件夹 + 导出编码 + 导出到WebDav + 反转内容 + 调试 + 崩溃日志 + 使用自定义中文分行 + 图片样式 diff --git a/app/src/main/res/xml/about.xml b/app/src/main/res/xml/about.xml index 69e339435..15a6c1523 100644 --- a/app/src/main/res/xml/about.xml +++ b/app/src/main/res/xml/about.xml @@ -56,7 +56,7 @@ + + - - diff --git a/app/src/main/res/xml/pref_config_read.xml b/app/src/main/res/xml/pref_config_read.xml index 0135feff8..9f240fc63 100644 --- a/app/src/main/res/xml/pref_config_read.xml +++ b/app/src/main/res/xml/pref_config_read.xml @@ -41,6 +41,13 @@ app:iconSpaceReserved="false" app:isBottomBackground="true" /> + + + + + + + + + + + diff --git a/avd11.bat b/avd11.bat new file mode 100644 index 000000000..fef788ee9 --- /dev/null +++ b/avd11.bat @@ -0,0 +1 @@ +emulator -avd android11 -dns-server 8.8.8.8 -no-snapshot-load \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5de0edc73..228c51fa0 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.21' + ext.kotlin_version = '1.4.31' repositories { google() jcenter()