From 890877be1b218170d10b571ef1c1a2b3791b413f Mon Sep 17 00:00:00 2001 From: Celeter <48249130+Celeter@users.noreply.github.com> Date: Wed, 23 Dec 2020 09:35:28 +0800 Subject: [PATCH 1/3] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 58845533d..7d790cfa6 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,15 @@ # legado -[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) +[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) ![Build Action](https://github.com/gedoor/legado/workflows/Android%20CI/badge.svg) ## 阅读3.0 * [书源规则](https://alanskycn.gitee.io/teachme/) * [更新日志](/app/src/main/assets/updateLog.md) * [帮助文档](/app/src/main/assets/help/appHelp.md) +## 下载 +Google Play or CoolApk or [Releases](https://github.com/gedoor/legado/releases/latest) + ### 阅读API 阅读3.0 提供了2种方式的API:`Web方式`和`Content Provider方式`。您可以在[这里](api.md)根据需要自行调用。 From 6d565bd9fe5bb8edfca43b128ab230a1cc9f01cf Mon Sep 17 00:00:00 2001 From: Celeter <48249130+Celeter@users.noreply.github.com> Date: Wed, 23 Dec 2020 11:13:49 +0800 Subject: [PATCH 2/3] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d790cfa6..82994a452 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # legado -[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) ![Build Action](https://github.com/gedoor/legado/workflows/Android%20CI/badge.svg) +[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) [![Build Action](https://github.com/gedoor/legado/workflows/Android%20CI/badge.svg)](https://github.com/gedoor/legado/actions) ## 阅读3.0 * [书源规则](https://alanskycn.gitee.io/teachme/) From 22501e74da10fd4ba1052f443d5e7154a6bcd38e Mon Sep 17 00:00:00 2001 From: SplitGemini <764402868@qq.com> Date: Thu, 24 Dec 2020 23:38:46 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=87=80=E5=8C=96=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E5=B8=AE=E5=8A=A9markdown=E6=98=BE=E7=A4=BA=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 + app/src/main/assets/help/regexHelp.md | 175 +++--------------- .../legado/app/ui/widget/dialog/TextDialog.kt | 4 + 3 files changed, 33 insertions(+), 149 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 46101a548..7e1977da9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -97,6 +97,7 @@ android { kotlinOptions { jvmTarget = "1.8" } + buildToolsVersion '30.0.3' } resourcePlaceholders { @@ -195,6 +196,8 @@ dependencies { //MarkDown implementation 'io.noties.markwon:core:4.6.0' implementation 'io.noties.markwon:image-glide:4.6.0' + implementation 'io.noties.markwon:ext-tables:4.6.0' + implementation 'io.noties.markwon:html:4.6.0' //转换繁体 implementation 'com.hankcs:hanlp:portable-1.7.8' diff --git a/app/src/main/assets/help/regexHelp.md b/app/src/main/assets/help/regexHelp.md index a2e9b2502..8598c718a 100644 --- a/app/src/main/assets/help/regexHelp.md +++ b/app/src/main/assets/help/regexHelp.md @@ -30,18 +30,10 @@ ## 1. 基本匹配 -正则表达式只是我们用于在文本中检索字母和数字的模式。例如正则表达式 `cat`,表示: 字母 `c` 后面跟着一个字母 `a`,再后面跟着一个字母 `t`。 - -
-"cat" => The cat sat on the mat
-
+正则表达式只是我们用于在文本中检索字母和数字的模式。例如正则表达式 `cat`,表示: 字母 `c` 后面跟着一个字母 `a`,再后面跟着一个字母 `t`。
"cat" => The cat sat on the mat
正则表达式 `123` 会匹配字符串 "123"。通过将正则表达式中的每个字符逐个与要匹配的字符串中的每个字符进行比较,来完成正则匹配。 -正则表达式通常区分大小写,因此正则表达式 `Cat` 与字符串 "cat" 不匹配。 - -
-"Cat" => The cat sat on the Cat
-
+正则表达式通常区分大小写,因此正则表达式 `Cat` 与字符串 "cat" 不匹配。
"Cat" => The cat sat on the Cat
## 2. 元字符 @@ -66,35 +58,19 @@ ## 2.1 英文句号 英文句号 `.` 是元字符的最简单的例子。元字符 `.` 可以匹配任意单个字符。它不会匹配换行符和新行的字符。例如正则表达式 `.ar`,表示: 任意字符后面跟着一个字母 `a`, -再后面跟着一个字母 `r`。 - -
-".ar" => The car parked in the garage.
-
+再后面跟着一个字母 `r`。
".ar" => The car parked in the garage.
## 2.2 字符集 字符集也称为字符类。方括号被用于指定字符集。使用字符集内的连字符来指定字符范围。方括号内的字符范围的顺序并不重要。 -例如正则表达式 `[Tt]he`,表示: 大写 `T` 或小写 `t` ,后跟字母 `h`,再后跟字母 `e`。 - -
-"[Tt]he" => The car parked in the garage.
-
+例如正则表达式 `[Tt]he`,表示: 大写 `T` 或小写 `t` ,后跟字母 `h`,再后跟字母 `e`。
"[Tt]he" => The car parked in the garage.
-然而,字符集中的英文句号表示它字面的含义。正则表达式 `ar[.]`,表示小写字母 `a`,后面跟着一个字母 `r`,再后面跟着一个英文句号 `.` 字符。 - -
-"ar[.]" => A garage is a good place to park a car.
-
+然而,字符集中的英文句号表示它字面的含义。正则表达式 `ar[.]`,表示小写字母 `a`,后面跟着一个字母 `r`,再后面跟着一个英文句号 `.` 字符。
"ar[.]" => A garage is a good place to park a car.
### 2.2.1 否定字符集 一般来说插入字符 `^` 表示一个字符串的开始,但是当它在方括号内出现时,它会取消字符集。例如正则表达式 `[^c]ar`,表示: 除了字母 `c` 以外的任意字符,后面跟着字符 `a`, -再后面跟着一个字母 `r`。 - -
-"[^c]ar" => The car parked in the garage.
-
+再后面跟着一个字母 `r`。
"[^c]ar" => The car parked in the garage.
## 2.3 重复 @@ -103,85 +79,42 @@ ### 2.3.1 星号 该符号 `*` 表示匹配上一个匹配规则的零次或多次。正则表达式 `a*` 表示小写字母 `a` 可以重复零次或者多次。但是它如果出现在字符集或者字符类之后,它表示整个字符集的重复。 -例如正则表达式 `[a-z]*`,表示: 一行中可以包含任意数量的小写字母。 - -
-"[a-z]*" => The car parked in the garage #21.
-
+例如正则表达式 `[a-z]*`,表示: 一行中可以包含任意数量的小写字母。
"[a-z]*" => The car parked in the garage #21.
该 `*` 符号可以与元符号 `.` 用在一起,用来匹配任意字符串 `.*`。该 `*` 符号可以与空格符 `\s` 一起使用,用来匹配一串空格字符。 -例如正则表达式 `\s*cat\s*`,表示: 零个或多个空格,后面跟小写字母 `c`,再后面跟小写字母 `a`,再再后面跟小写字母 `t`,后面再跟零个或多个空格。 - -
-"\s*cat\s*" => The fat cat sat on the cat.
-
+例如正则表达式 `\s*cat\s*`,表示: 零个或多个空格,后面跟小写字母 `c`,再后面跟小写字母 `a`,再再后面跟小写字母 `t`,后面再跟零个或多个空格。
"\s*cat\s*" => The fat cat sat on the cat.
### 2.3.2 加号 -该符号 `+` 匹配上一个字符的一次或多次。例如正则表达式 `c.+t`,表示: 一个小写字母 `c`,后跟任意数量的字符,后跟小写字母 `t`。 - -
-"c.+t" => The fat cat sat on the mat.
-
+该符号 `+` 匹配上一个字符的一次或多次。例如正则表达式 `c.+t`,表示: 一个小写字母 `c`,后跟任意数量的字符,后跟小写字母 `t`。
"c.+t" => The fat cat sat on the mat.
### 2.3.3 问号 在正则表达式中,元字符 `?` 用来表示前一个字符是可选的。该符号匹配前一个字符的零次或一次。 -例如正则表达式 `[T]?he`,表示: 可选的大写字母 `T`,后面跟小写字母 `h`,后跟小写字母 `e`。 - -
-"[T]he" => The car is parked in the garage.
-
-
-"[T]?he" => The car is parked in the garage.
-
+例如正则表达式 `[T]?he`,表示: 可选的大写字母 `T`,后面跟小写字母 `h`,后跟小写字母 `e`。
"[T]he" => The car is parked in the garage.
"[T]?he" => The car is parked in the garage.
## 2.4 花括号 -在正则表达式中花括号(也被称为量词 ?)用于指定字符或一组字符可以重复的次数。例如正则表达式 `[0-9]{2,3}`,表示: 匹配至少2位数字但不超过3位(0到9范围内的字符)。 - -
-"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
-
- -我们可以省略第二个数字。例如正则表达式 `[0-9]{2,}`,表示: 匹配2个或更多个数字。如果我们也删除逗号,则正则表达式 `[0-9]{2}`,表示: 匹配正好为2位数的数字。 +在正则表达式中花括号(也被称为量词 ?)用于指定字符或一组字符可以重复的次数。例如正则表达式 `[0-9]{2,3}`,表示: 匹配至少2位数字但不超过3位(0到9范围内的字符)。
"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
-
-"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
-
- -
-"[0-9]{2}" => The number was 9.9997 but we rounded it off to 10.0.
-
+我们可以省略第二个数字。例如正则表达式 `[0-9]{2,}`,表示: 匹配2个或更多个数字。如果我们也删除逗号,则正则表达式 `[0-9]{2}`,表示: 匹配正好为2位数的数字。
"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
"[0-9]{2}" => The number was 9.9997 but we rounded it off to 10.0.
## 2.5 字符组 字符组是一组写在圆括号内的子模式 `(...)`。正如我们在正则表达式中讨论的那样,如果我们把一个量词放在一个字符之后,它会重复前一个字符。 但是,如果我们把量词放在一个字符组之后,它会重复整个字符组。 -例如正则表达式 `(ab)*` 表示匹配零个或多个的字符串 "ab"。我们还可以在字符组中使用元字符 `|`。例如正则表达式 `(c|g|p)ar`,表示: 小写字母 `c`、`g` 或 `p` 后面跟字母 `a`,后跟字母 `r`。 - -
-"(c|g|p)ar" => The car is parked in the garage.
-
+例如正则表达式 `(ab)*` 表示匹配零个或多个的字符串 "ab"。我们还可以在字符组中使用元字符 `|`。例如正则表达式 `(c|g|p)ar`,表示: 小写字母 `c`、`g` 或 `p` 后面跟字母 `a`,后跟字母 `r`。
"(c|g|p)ar" => The car is parked in the garage.
## 2.6 分支结构 在正则表达式中垂直条 `|` 用来定义分支结构,分支结构就像多个表达式之间的条件。现在你可能认为这个字符集和分支机构的工作方式一样。 但是字符集和分支结构巨大的区别是字符集只在字符级别上有作用,然而分支结构在表达式级别上依然可以使用。 -例如正则表达式 `(T|t)he|car`,表示: 大写字母 `T` 或小写字母 `t`,后面跟小写字母 `h`,后跟小写字母 `e` 或小写字母 `c`,后跟小写字母 `a`,后跟小写字母 `r`。 - -
-"(T|t)he|car" => The car is parked in the garage.
-
+例如正则表达式 `(T|t)he|car`,表示: 大写字母 `T` 或小写字母 `t`,后面跟小写字母 `h`,后跟小写字母 `e` 或小写字母 `c`,后跟小写字母 `a`,后跟小写字母 `r`。
"(T|t)he|car" => The car is parked in the garage.
## 2.7 转义特殊字符 正则表达式中使用反斜杠 `\` 来转义下一个字符。这将允许你使用保留字符来作为匹配字符 `{ } [ ] / \ + * . $ ^ | ?`。在特殊字符前面加 `\`,就可以使用它来做匹配字符。 -例如正则表达式 `.` 是用来匹配除了换行符以外的任意字符。现在要在输入字符串中匹配 `.` 字符,正则表达式 `(f|c|m)at\.?`,表示: 小写字母 `f`、`c` 或者 `m` 后跟小写字母 `a`,后跟小写字母 `t`,后跟可选的 `.` 字符。 - -
-"(f|c|m)at\.?" => The fat cat sat on the mat.
-
+例如正则表达式 `.` 是用来匹配除了换行符以外的任意字符。现在要在输入字符串中匹配 `.` 字符,正则表达式 `(f|c|m)at\.?`,表示: 小写字母 `f`、`c` 或者 `m` 后跟小写字母 `a`,后跟小写字母 `t`,后跟可选的 `.` 字符。
"(f|c|m)at\.?" => The fat cat sat on the mat.
## 2.8 定位符 @@ -192,27 +125,11 @@ 插入符号 `^` 符号用于检查匹配字符是否是输入字符串的第一个字符。如果我们使用正则表达式 `^a` (如果a是起始符号)匹配字符串 `abc`,它会匹配到 `a`。 但是如果我们使用正则表达式 `^b`,它是匹配不到任何东西的,因为在字符串 `abc` 中 "b" 不是起始字符。 -让我们来看看另一个正则表达式 `^(T|t)he`,这表示: 大写字母 `T` 或小写字母 `t` 是输入字符串的起始符号,后面跟着小写字母 `h`,后跟小写字母 `e`。 - -
-"(T|t)he" => The car is parked in the garage.
-
- -
-"^(T|t)he" => The car is parked in the garage.
-
+让我们来看看另一个正则表达式 `^(T|t)he`,这表示: 大写字母 `T` 或小写字母 `t` 是输入字符串的起始符号,后面跟着小写字母 `h`,后跟小写字母 `e`。
"(T|t)he" => The car is parked in the garage.
"^(T|t)he" => The car is parked in the garage.
### 2.8.2 美元符号 -美元 `$` 符号用于检查匹配字符是否是输入字符串的最后一个字符。例如正则表达式 `(at\.)$`,表示: 小写字母 `a`,后跟小写字母 `t`,后跟一个 `.` 字符,且这个匹配器必须是字符串的结尾。 - -
-"(at\.)" => The fat cat. sat. on the mat.
-
- -
-"(at\.)$" => The fat cat sat on the mat.
-
+美元 `$` 符号用于检查匹配字符是否是输入字符串的最后一个字符。例如正则表达式 `(at\.)$`,表示: 小写字母 `a`,后跟小写字母 `t`,后跟一个 `.` 字符,且这个匹配器必须是字符串的结尾。
"(at\.)" => The fat cat. sat. on the mat.
"(at\.)$" => The fat cat sat on the mat.
## 3. 简写字符集 @@ -246,37 +163,21 @@ 正向先行断言认为第一部分的表达式必须是先行断言表达式。返回的匹配结果仅包含与第一部分表达式匹配的文本。 要在一个括号内定义一个正向先行断言,在括号中问号和等号是这样使用的 `(?=...)`。先行断言表达式写在括号中的等号后面。 例如正则表达式 `(T|t)he(?=\sfat)`,表示: 匹配大写字母 `T` 或小写字母 `t`,后面跟字母 `h`,后跟字母 `e`。 -在括号中,我们定义了正向先行断言,它会引导正则表达式引擎匹配 `The` 或 `the` 后面跟着 `fat`。 - -
-"(T|t)he(?=\sfat)" => The fat cat sat on the mat.
-
+在括号中,我们定义了正向先行断言,它会引导正则表达式引擎匹配 `The` 或 `the` 后面跟着 `fat`。
"(T|t)he(?=\sfat)" => The fat cat sat on the mat.
### 4.2 负向先行断言 当我们需要从输入字符串中获取不匹配表达式的内容时,使用负向先行断言。负向先行断言的定义跟我们定义的正向先行断言一样, 唯一的区别是不是等号 `=`,我们使用否定符号 `!`,例如 `(?!...)`。 -我们来看看下面的正则表达式 `(T|t)he(?!\sfat)`,表示: 从输入字符串中获取全部 `The` 或者 `the` 且不匹配 `fat` 前面加上一个空格字符。 - -
-"(T|t)he(?!\sfat)" => The fat cat sat on the mat.
-
+我们来看看下面的正则表达式 `(T|t)he(?!\sfat)`,表示: 从输入字符串中获取全部 `The` 或者 `the` 且不匹配 `fat` 前面加上一个空格字符。
"(T|t)he(?!\sfat)" => The fat cat sat on the mat.
### 4.3 正向后行断言 -正向后行断言是用于获取在特定模式之前的所有匹配内容。正向后行断言表示为 `(?<=...)`。例如正则表达式 `(?<=(T|t)he\s)(fat|mat)`,表示: 从输入字符串中获取在单词 `The` 或 `the` 之后的所有 `fat` 和 `mat` 单词。 - -
-"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.
-
+正向后行断言是用于获取在特定模式之前的所有匹配内容。正向后行断言表示为 `(?<=...)`。例如正则表达式 `(?<=(T|t)he\s)(fat|mat)`,表示: 从输入字符串中获取在单词 `The` 或 `the` 之后的所有 `fat` 和 `mat` 单词。
"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.
### 4.4 负向后行断言 -负向后行断言是用于获取不在特定模式之前的所有匹配的内容。负向后行断言表示为 `(? -"(?<!(T|t)he\s)(cat)" => The cat sat on cat. - +负向后行断言是用于获取不在特定模式之前的所有匹配的内容。负向后行断言表示为 `(?"(?<!(T|t)he\s)(cat)" => The cat sat on cat. ## 5. 标记 @@ -291,46 +192,22 @@ ### 5.1 不区分大小写 `i` 修饰符用于执行不区分大小写匹配。例如正则表达式 `/The/gi`,表示: 大写字母 `T`,后跟小写字母 `h`,后跟字母 `e`。 -但是在正则匹配结束时 `i` 标记会告诉正则表达式引擎忽略这种情况。正如你所看到的,我们还使用了 `g` 标记,因为我们要在整个输入字符串中搜索匹配。 - -
-"The" => The fat cat sat on the mat.
-
- -
-"/The/gi" => The fat cat sat on the mat.
-
+但是在正则匹配结束时 `i` 标记会告诉正则表达式引擎忽略这种情况。正如你所看到的,我们还使用了 `g` 标记,因为我们要在整个输入字符串中搜索匹配。
"The" => The fat cat sat on the mat.
"/The/gi" => The fat cat sat on the mat.
### 5.2 全局搜索 `g` 修饰符用于执行全局匹配 (会查找所有匹配,不会在查找到第一个匹配时就停止)。 例如正则表达式 `/.(at)/g`,表示: 除换行符之外的任意字符,后跟小写字母 `a`,后跟小写字母 `t`。 -因为我们在正则表达式的末尾使用了 `g` 标记,它会从整个输入字符串中找到每个匹配项。 - -
-".(at)" => The fat cat sat on the mat.
-
- -
-"/.(at)/g" => The fat cat sat on the mat.
-
+因为我们在正则表达式的末尾使用了 `g` 标记,它会从整个输入字符串中找到每个匹配项。
".(at)" => The fat cat sat on the mat.
"/.(at)/g" => The fat cat sat on the mat.
### 5.3 多行匹配 `m` 修饰符被用来执行多行的匹配。正如我们前面讨论过的 `(^, $)`,使用定位符来检查匹配字符是输入字符串开始或者结束。但是我们希望每一行都使用定位符,所以我们就使用 `m` 修饰符。 -例如正则表达式 `/at(.)?$/gm`,表示: 小写字母 `a`,后跟小写字母 `t`,匹配除了换行符以外任意字符零次或一次。而且因为 `m` 标记,现在正则表达式引擎匹配字符串中每一行的末尾。 - -
-"/.at(.)?$/" => The fat
+例如正则表达式 `/at(.)?$/gm`,表示: 小写字母 `a`,后跟小写字母 `t`,匹配除了换行符以外任意字符零次或一次。而且因为 `m` 标记,现在正则表达式引擎匹配字符串中每一行的末尾。
"/.at(.)?$/" => The fat
                 cat sat
-                on the mat.
-
- -
-"/.at(.)?$/gm" => The fat
+                on the mat.
"/.at(.)?$/gm" => The fat
                   cat sat
-                  on the mat.
-
+ on the mat.
## 常用正则表达式 diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt index ea4330039..3c8133c8a 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt @@ -12,6 +12,8 @@ import io.legado.app.utils.getSize import io.legado.app.utils.viewbindingdelegate.viewBinding import io.noties.markwon.Markwon import io.noties.markwon.image.glide.GlideImagesPlugin +import io.noties.markwon.ext.tables.TablePlugin +import io.noties.markwon.html.HtmlPlugin import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -66,6 +68,8 @@ class TextDialog : BaseDialogFragment() { MD -> binding.textView.post { Markwon.builder(requireContext()) .usePlugin(GlideImagesPlugin.create(requireContext())) + .usePlugin(HtmlPlugin.create()) + .usePlugin(TablePlugin.create(requireContext())) .build() .setMarkdown(binding.textView, content) }