From 0c50a5ab9b87683aeff226df09e416f2172152c5 Mon Sep 17 00:00:00 2001 From: Joplin Bot Date: Sat, 18 Jun 2022 06:18:17 +0000 Subject: [PATCH 01/38] Doc: Auto-update documentation Auto-updated using release-website.sh --- readme/stats.md | 316 ++++++++++++++++++++++++------------------------ 1 file changed, 158 insertions(+), 158 deletions(-) diff --git a/readme/stats.md b/readme/stats.md index ebb6e44c61..64e23f7f98 100644 --- a/readme/stats.md +++ b/readme/stats.md @@ -1,14 +1,14 @@ --- -updated: 2022-05-19T06:17:18Z +updated: 2022-06-18T06:18:07Z --- # Joplin statistics | Name | Value | | ----- | ----- | -| Total Windows downloads | 2,431,848 | -| Total macOs downloads | 955,091 | -| Total Linux downloads | 764,024 | +| Total Windows downloads | 2,449,909 | +| Total macOs downloads | 962,603 | +| Total Linux downloads | 769,002 | | Windows % | 59% | | macOS % | 23% | | Linux % | 18% | @@ -17,174 +17,174 @@ updated: 2022-05-19T06:17:18Z | Version | Date | Windows | macOS | Linux | Total | | ----- | ----- | ----- | ----- | ----- | ----- | -| [v2.8.8](https://github.com/laurent22/joplin/releases/tag/v2.8.8) (p) | 2022-05-17T14:48:06Z | 608 | 152 | 85 | 845 | -| [v2.8.7](https://github.com/laurent22/joplin/releases/tag/v2.8.7) (p) | 2022-05-06T11:34:27Z | 1,349 | 313 | 345 | 2,007 | -| [v2.8.4](https://github.com/laurent22/joplin/releases/tag/v2.8.4) (p) | 2022-04-19T18:00:09Z | 1,456 | 520 | 298 | 2,274 | -| [v2.8.2](https://github.com/laurent22/joplin/releases/tag/v2.8.2) (p) | 2022-04-14T11:35:45Z | 1,017 | 244 | 236 | 1,497 | -| [v2.7.15](https://github.com/laurent22/joplin/releases/tag/v2.7.15) | 2022-03-17T13:03:23Z | 125,891 | 48,546 | 40,404 | 214,841 | -| [v2.7.14](https://github.com/laurent22/joplin/releases/tag/v2.7.14) | 2022-02-27T11:30:53Z | 31,007 | 16,719 | 4,748 | 52,474 | -| [v2.7.13](https://github.com/laurent22/joplin/releases/tag/v2.7.13) | 2022-02-24T17:42:12Z | 51,702 | 25,668 | 11,663 | 89,033 | -| [v2.7.12](https://github.com/laurent22/joplin/releases/tag/v2.7.12) (p) | 2022-02-14T15:06:14Z | 1,989 | 441 | 434 | 2,864 | -| [v2.7.11](https://github.com/laurent22/joplin/releases/tag/v2.7.11) (p) | 2022-02-12T13:00:02Z | 1,173 | 177 | 140 | 1,490 | -| [v2.7.10](https://github.com/laurent22/joplin/releases/tag/v2.7.10) (p) | 2022-02-11T18:19:09Z | 799 | 103 | 61 | 963 | -| [v2.7.8](https://github.com/laurent22/joplin/releases/tag/v2.7.8) (p) | 2022-01-19T09:35:27Z | 3,089 | 749 | 797 | 4,635 | -| [v2.7.7](https://github.com/laurent22/joplin/releases/tag/v2.7.7) (p) | 2022-01-18T14:05:07Z | 1,026 | 136 | 111 | 1,273 | -| [v2.7.6](https://github.com/laurent22/joplin/releases/tag/v2.7.6) (p) | 2022-01-17T17:08:28Z | 1,094 | 161 | 91 | 1,346 | -| [v2.6.10](https://github.com/laurent22/joplin/releases/tag/v2.6.10) | 2021-12-19T11:31:16Z | 131,179 | 51,100 | 49,043 | 231,322 | -| [v2.6.9](https://github.com/laurent22/joplin/releases/tag/v2.6.9) | 2021-12-17T11:57:32Z | 16,076 | 9,454 | 3,145 | 28,675 | -| [v2.6.7](https://github.com/laurent22/joplin/releases/tag/v2.6.7) (p) | 2021-12-16T10:47:23Z | 1,218 | 142 | 78 | 1,438 | -| [v2.6.6](https://github.com/laurent22/joplin/releases/tag/v2.6.6) (p) | 2021-12-13T12:31:43Z | 1,279 | 232 | 144 | 1,655 | -| [v2.6.5](https://github.com/laurent22/joplin/releases/tag/v2.6.5) (p) | 2021-12-13T10:07:04Z | 580 | 32 | 13 | 625 | -| [v2.6.4](https://github.com/laurent22/joplin/releases/tag/v2.6.4) (p) | 2021-12-09T19:53:43Z | 1,355 | 267 | 177 | 1,799 | -| [v2.6.2](https://github.com/laurent22/joplin/releases/tag/v2.6.2) (p) | 2021-11-18T12:19:12Z | 3,023 | 774 | 673 | 4,470 | -| [v2.5.12](https://github.com/laurent22/joplin/releases/tag/v2.5.12) | 2021-11-08T11:07:11Z | 78,868 | 32,421 | 25,160 | 136,449 | -| [v2.5.10](https://github.com/laurent22/joplin/releases/tag/v2.5.10) | 2021-11-01T08:22:42Z | 43,970 | 18,975 | 10,029 | 72,974 | -| [v2.5.8](https://github.com/laurent22/joplin/releases/tag/v2.5.8) | 2021-10-31T11:38:03Z | 13,005 | 6,535 | 2,286 | 21,826 | -| [v2.5.7](https://github.com/laurent22/joplin/releases/tag/v2.5.7) (p) | 2021-10-29T14:47:33Z | 947 | 188 | 138 | 1,273 | -| [v2.5.6](https://github.com/laurent22/joplin/releases/tag/v2.5.6) (p) | 2021-10-28T22:03:09Z | 903 | 156 | 88 | 1,147 | -| [v2.5.4](https://github.com/laurent22/joplin/releases/tag/v2.5.4) (p) | 2021-10-19T10:10:54Z | 2,204 | 552 | 551 | 3,307 | -| [v2.4.12](https://github.com/laurent22/joplin/releases/tag/v2.4.12) | 2021-10-13T17:24:34Z | 43,545 | 19,934 | 9,749 | 73,228 | -| [v2.4.9](https://github.com/laurent22/joplin/releases/tag/v2.4.9) | 2021-09-29T19:08:58Z | 56,000 | 23,190 | 15,807 | 94,997 | -| [v2.4.8](https://github.com/laurent22/joplin/releases/tag/v2.4.8) (p) | 2021-09-22T19:01:46Z | 7,249 | 1,753 | 511 | 9,513 | -| [v2.4.6](https://github.com/laurent22/joplin/releases/tag/v2.4.6) (p) | 2021-09-09T18:57:17Z | 1,977 | 442 | 498 | 2,917 | -| [v2.4.9](https://github.com/laurent22/joplin/releases/tag/v2.4.9) | 2021-09-29T19:08:58Z | 56,000 | 23,190 | 15,807 | 94,997 | -| [v2.4.8](https://github.com/laurent22/joplin/releases/tag/v2.4.8) (p) | 2021-09-22T19:01:46Z | 7,249 | 1,753 | 511 | 9,513 | -| [v2.4.7](https://github.com/laurent22/joplin/releases/tag/v2.4.7) (p) | 2021-09-19T12:53:22Z | 1,296 | 235 | 185 | 1,716 | -| [v2.4.6](https://github.com/laurent22/joplin/releases/tag/v2.4.6) (p) | 2021-09-09T18:57:17Z | 1,977 | 442 | 498 | 2,917 | -| [v2.4.5](https://github.com/laurent22/joplin/releases/tag/v2.4.5) (p) | 2021-09-06T18:03:28Z | 1,363 | 251 | 207 | 1,821 | -| [v2.4.4](https://github.com/laurent22/joplin/releases/tag/v2.4.4) (p) | 2021-08-30T16:02:51Z | 1,637 | 360 | 341 | 2,338 | -| [v2.4.3](https://github.com/laurent22/joplin/releases/tag/v2.4.3) (p) | 2021-08-28T15:27:32Z | 1,154 | 186 | 153 | 1,493 | -| [v2.4.2](https://github.com/laurent22/joplin/releases/tag/v2.4.2) (p) | 2021-08-27T17:13:21Z | 859 | 131 | 75 | 1,065 | -| [v2.4.1](https://github.com/laurent22/joplin/releases/tag/v2.4.1) (p) | 2021-08-21T11:52:30Z | 1,747 | 355 | 318 | 2,420 | -| [v2.3.5](https://github.com/laurent22/joplin/releases/tag/v2.3.5) | 2021-08-17T06:43:30Z | 81,236 | 31,355 | 33,063 | 145,654 | -| [v2.3.3](https://github.com/laurent22/joplin/releases/tag/v2.3.3) | 2021-08-14T09:19:40Z | 14,684 | 6,856 | 4,036 | 25,576 | -| [v2.2.7](https://github.com/laurent22/joplin/releases/tag/v2.2.7) | 2021-08-11T11:03:26Z | 15,093 | 7,489 | 2,572 | 25,154 | -| [v2.2.6](https://github.com/laurent22/joplin/releases/tag/v2.2.6) (p) | 2021-08-09T19:29:20Z | 7,850 | 4,603 | 940 | 13,393 | -| [v2.2.5](https://github.com/laurent22/joplin/releases/tag/v2.2.5) (p) | 2021-08-07T10:35:24Z | 1,458 | 259 | 189 | 1,906 | -| [v2.2.4](https://github.com/laurent22/joplin/releases/tag/v2.2.4) (p) | 2021-08-05T16:42:48Z | 1,173 | 191 | 116 | 1,480 | -| [v2.2.2](https://github.com/laurent22/joplin/releases/tag/v2.2.2) (p) | 2021-07-19T10:28:35Z | 3,075 | 719 | 629 | 4,423 | -| [v2.1.9](https://github.com/laurent22/joplin/releases/tag/v2.1.9) | 2021-07-19T10:28:43Z | 46,166 | 18,767 | 16,686 | 81,619 | -| [v2.2.1](https://github.com/laurent22/joplin/releases/tag/v2.2.1) (p) | 2021-07-09T17:38:25Z | 2,512 | 399 | 375 | 3,286 | -| [v2.1.8](https://github.com/laurent22/joplin/releases/tag/v2.1.8) | 2021-07-03T08:25:16Z | 30,077 | 12,166 | 12,704 | 54,947 | -| [v2.1.7](https://github.com/laurent22/joplin/releases/tag/v2.1.7) | 2021-06-26T19:48:55Z | 13,910 | 6,382 | 3,607 | 23,899 | -| [v2.1.5](https://github.com/laurent22/joplin/releases/tag/v2.1.5) (p) | 2021-06-23T15:08:52Z | 1,494 | 229 | 179 | 1,902 | -| [v2.1.3](https://github.com/laurent22/joplin/releases/tag/v2.1.3) (p) | 2021-06-19T16:32:51Z | 1,644 | 290 | 196 | 2,130 | -| [v2.0.11](https://github.com/laurent22/joplin/releases/tag/v2.0.11) | 2021-06-16T17:55:49Z | 23,232 | 9,226 | 9,802 | 42,260 | -| [v2.0.10](https://github.com/laurent22/joplin/releases/tag/v2.0.10) | 2021-06-16T07:58:29Z | 2,484 | 913 | 368 | 3,765 | -| [v2.0.9](https://github.com/laurent22/joplin/releases/tag/v2.0.9) (p) | 2021-06-12T09:30:30Z | 1,551 | 288 | 874 | 2,713 | -| [v2.0.8](https://github.com/laurent22/joplin/releases/tag/v2.0.8) (p) | 2021-06-10T16:15:08Z | 1,150 | 224 | 571 | 1,945 | -| [v2.0.4](https://github.com/laurent22/joplin/releases/tag/v2.0.4) (p) | 2021-06-02T12:54:17Z | 1,479 | 387 | 371 | 2,237 | -| [v2.0.2](https://github.com/laurent22/joplin/releases/tag/v2.0.2) (p) | 2021-05-21T18:07:48Z | 2,686 | 485 | 1,662 | 4,833 | -| [v2.0.1](https://github.com/laurent22/joplin/releases/tag/v2.0.1) (p) | 2021-05-15T13:22:58Z | 856 | 266 | 1,017 | 2,139 | -| [v1.8.5](https://github.com/laurent22/joplin/releases/tag/v1.8.5) | 2021-05-10T11:58:14Z | 37,921 | 16,255 | 19,387 | 73,563 | -| [v1.8.4](https://github.com/laurent22/joplin/releases/tag/v1.8.4) (p) | 2021-05-09T18:05:05Z | 1,190 | 132 | 452 | 1,774 | -| [v1.8.3](https://github.com/laurent22/joplin/releases/tag/v1.8.3) (p) | 2021-05-04T10:38:16Z | 1,957 | 303 | 934 | 3,194 | -| [v1.8.2](https://github.com/laurent22/joplin/releases/tag/v1.8.2) (p) | 2021-04-25T10:50:51Z | 2,281 | 433 | 1,282 | 3,996 | -| [v1.8.1](https://github.com/laurent22/joplin/releases/tag/v1.8.1) (p) | 2021-03-29T10:46:41Z | 3,493 | 823 | 2,447 | 6,763 | -| [v1.7.11](https://github.com/laurent22/joplin/releases/tag/v1.7.11) | 2021-02-03T12:50:01Z | 116,306 | 42,769 | 64,279 | 223,354 | -| [v1.7.10](https://github.com/laurent22/joplin/releases/tag/v1.7.10) | 2021-01-30T13:25:29Z | 14,089 | 4,853 | 4,480 | 23,422 | +| [v2.8.8](https://github.com/laurent22/joplin/releases/tag/v2.8.8) | 2022-05-17T14:48:06Z | 48,622 | 23,748 | 9,980 | 82,350 | +| [v2.8.7](https://github.com/laurent22/joplin/releases/tag/v2.8.7) (p) | 2022-05-06T11:34:27Z | 1,505 | 321 | 359 | 2,185 | +| [v2.8.6](https://github.com/laurent22/joplin/releases/tag/v2.8.6) (p) | 2022-05-03T10:08:25Z | 1,227 | 375 | 301 | 1,903 | +| [v2.8.5](https://github.com/laurent22/joplin/releases/tag/v2.8.5) (p) | 2022-04-27T13:51:50Z | 1,175 | 330 | 317 | 1,822 | +| [v2.8.4](https://github.com/laurent22/joplin/releases/tag/v2.8.4) (p) | 2022-04-19T18:00:09Z | 1,610 | 524 | 298 | 2,432 | +| [v2.8.2](https://github.com/laurent22/joplin/releases/tag/v2.8.2) (p) | 2022-04-14T11:35:45Z | 1,137 | 245 | 236 | 1,618 | +| [v2.7.15](https://github.com/laurent22/joplin/releases/tag/v2.7.15) | 2022-03-17T13:03:23Z | 150,421 | 56,095 | 50,564 | 257,080 | +| [v2.7.14](https://github.com/laurent22/joplin/releases/tag/v2.7.14) | 2022-02-27T11:30:53Z | 31,169 | 16,723 | 4,754 | 52,646 | +| [v2.7.13](https://github.com/laurent22/joplin/releases/tag/v2.7.13) | 2022-02-24T17:42:12Z | 51,840 | 25,672 | 11,665 | 89,177 | +| [v2.7.12](https://github.com/laurent22/joplin/releases/tag/v2.7.12) (p) | 2022-02-14T15:06:14Z | 2,106 | 441 | 434 | 2,981 | +| [v2.7.11](https://github.com/laurent22/joplin/releases/tag/v2.7.11) (p) | 2022-02-12T13:00:02Z | 1,207 | 177 | 140 | 1,524 | +| [v2.7.10](https://github.com/laurent22/joplin/releases/tag/v2.7.10) (p) | 2022-02-11T18:19:09Z | 831 | 103 | 61 | 995 | +| [v2.7.8](https://github.com/laurent22/joplin/releases/tag/v2.7.8) (p) | 2022-01-19T09:35:27Z | 3,122 | 749 | 797 | 4,668 | +| [v2.7.7](https://github.com/laurent22/joplin/releases/tag/v2.7.7) (p) | 2022-01-18T14:05:07Z | 1,061 | 136 | 111 | 1,308 | +| [v2.7.6](https://github.com/laurent22/joplin/releases/tag/v2.7.6) (p) | 2022-01-17T17:08:28Z | 1,128 | 161 | 91 | 1,380 | +| [v2.6.10](https://github.com/laurent22/joplin/releases/tag/v2.6.10) | 2021-12-19T11:31:16Z | 131,284 | 51,115 | 49,096 | 231,495 | +| [v2.6.9](https://github.com/laurent22/joplin/releases/tag/v2.6.9) | 2021-12-17T11:57:32Z | 16,122 | 9,458 | 3,148 | 28,728 | +| [v2.6.7](https://github.com/laurent22/joplin/releases/tag/v2.6.7) (p) | 2021-12-16T10:47:23Z | 1,252 | 143 | 79 | 1,474 | +| [v2.6.6](https://github.com/laurent22/joplin/releases/tag/v2.6.6) (p) | 2021-12-13T12:31:43Z | 1,313 | 235 | 145 | 1,693 | +| [v2.6.5](https://github.com/laurent22/joplin/releases/tag/v2.6.5) (p) | 2021-12-13T10:07:04Z | 612 | 32 | 13 | 657 | +| [v2.6.4](https://github.com/laurent22/joplin/releases/tag/v2.6.4) (p) | 2021-12-09T19:53:43Z | 1,389 | 268 | 178 | 1,835 | +| [v2.6.2](https://github.com/laurent22/joplin/releases/tag/v2.6.2) (p) | 2021-11-18T12:19:12Z | 3,056 | 774 | 673 | 4,503 | +| [v2.5.12](https://github.com/laurent22/joplin/releases/tag/v2.5.12) | 2021-11-08T11:07:11Z | 78,952 | 32,428 | 25,162 | 136,542 | +| [v2.5.10](https://github.com/laurent22/joplin/releases/tag/v2.5.10) | 2021-11-01T08:22:42Z | 44,034 | 18,978 | 10,032 | 73,044 | +| [v2.5.8](https://github.com/laurent22/joplin/releases/tag/v2.5.8) | 2021-10-31T11:38:03Z | 13,057 | 6,536 | 2,286 | 21,879 | +| [v2.5.7](https://github.com/laurent22/joplin/releases/tag/v2.5.7) (p) | 2021-10-29T14:47:33Z | 980 | 188 | 142 | 1,310 | +| [v2.5.6](https://github.com/laurent22/joplin/releases/tag/v2.5.6) (p) | 2021-10-28T22:03:09Z | 937 | 156 | 88 | 1,181 | +| [v2.5.4](https://github.com/laurent22/joplin/releases/tag/v2.5.4) (p) | 2021-10-19T10:10:54Z | 2,244 | 552 | 551 | 3,347 | +| [v2.4.12](https://github.com/laurent22/joplin/releases/tag/v2.4.12) | 2021-10-13T17:24:34Z | 43,624 | 19,938 | 9,753 | 73,315 | +| [v2.5.1](https://github.com/laurent22/joplin/releases/tag/v2.5.1) (p) | 2021-10-02T09:51:58Z | 3,369 | 883 | 922 | 5,174 | +| [v2.4.9](https://github.com/laurent22/joplin/releases/tag/v2.4.9) | 2021-09-29T19:08:58Z | 56,068 | 23,192 | 15,810 | 95,070 | +| [v2.4.8](https://github.com/laurent22/joplin/releases/tag/v2.4.8) (p) | 2021-09-22T19:01:46Z | 7,281 | 1,753 | 511 | 9,545 | +| [v2.4.7](https://github.com/laurent22/joplin/releases/tag/v2.4.7) (p) | 2021-09-19T12:53:22Z | 1,328 | 236 | 185 | 1,749 | +| [v2.4.6](https://github.com/laurent22/joplin/releases/tag/v2.4.6) (p) | 2021-09-09T18:57:17Z | 2,018 | 442 | 498 | 2,958 | +| [v2.4.5](https://github.com/laurent22/joplin/releases/tag/v2.4.5) (p) | 2021-09-06T18:03:28Z | 1,395 | 252 | 207 | 1,854 | +| [v2.4.4](https://github.com/laurent22/joplin/releases/tag/v2.4.4) (p) | 2021-08-30T16:02:51Z | 1,669 | 360 | 341 | 2,370 | +| [v2.4.3](https://github.com/laurent22/joplin/releases/tag/v2.4.3) (p) | 2021-08-28T15:27:32Z | 1,186 | 186 | 154 | 1,526 | +| [v2.4.2](https://github.com/laurent22/joplin/releases/tag/v2.4.2) (p) | 2021-08-27T17:13:21Z | 891 | 131 | 75 | 1,097 | +| [v2.4.1](https://github.com/laurent22/joplin/releases/tag/v2.4.1) (p) | 2021-08-21T11:52:30Z | 1,780 | 355 | 318 | 2,453 | +| [v2.3.5](https://github.com/laurent22/joplin/releases/tag/v2.3.5) | 2021-08-17T06:43:30Z | 81,338 | 31,363 | 33,071 | 145,772 | +| [v2.3.3](https://github.com/laurent22/joplin/releases/tag/v2.3.3) | 2021-08-14T09:19:40Z | 14,753 | 6,856 | 4,036 | 25,645 | +| [v2.2.7](https://github.com/laurent22/joplin/releases/tag/v2.2.7) | 2021-08-11T11:03:26Z | 15,154 | 7,489 | 2,572 | 25,215 | +| [v2.2.6](https://github.com/laurent22/joplin/releases/tag/v2.2.6) (p) | 2021-08-09T19:29:20Z | 7,903 | 4,603 | 940 | 13,446 | +| [v2.2.5](https://github.com/laurent22/joplin/releases/tag/v2.2.5) (p) | 2021-08-07T10:35:24Z | 1,490 | 259 | 189 | 1,938 | +| [v2.2.4](https://github.com/laurent22/joplin/releases/tag/v2.2.4) (p) | 2021-08-05T16:42:48Z | 1,205 | 191 | 116 | 1,512 | +| [v2.2.2](https://github.com/laurent22/joplin/releases/tag/v2.2.2) (p) | 2021-07-19T10:28:35Z | 3,107 | 719 | 629 | 4,455 | +| [v2.1.9](https://github.com/laurent22/joplin/releases/tag/v2.1.9) | 2021-07-19T10:28:43Z | 46,236 | 18,767 | 16,686 | 81,689 | +| [v2.2.1](https://github.com/laurent22/joplin/releases/tag/v2.2.1) (p) | 2021-07-09T17:38:25Z | 2,550 | 399 | 375 | 3,324 | +| [v2.1.8](https://github.com/laurent22/joplin/releases/tag/v2.1.8) | 2021-07-03T08:25:16Z | 30,144 | 12,168 | 12,706 | 55,018 | +| [v2.1.7](https://github.com/laurent22/joplin/releases/tag/v2.1.7) | 2021-06-26T19:48:55Z | 13,962 | 6,382 | 3,607 | 23,951 | +| [v2.1.5](https://github.com/laurent22/joplin/releases/tag/v2.1.5) (p) | 2021-06-23T15:08:52Z | 1,526 | 229 | 179 | 1,934 | +| [v2.1.3](https://github.com/laurent22/joplin/releases/tag/v2.1.3) (p) | 2021-06-19T16:32:51Z | 1,676 | 290 | 196 | 2,162 | +| [v2.0.11](https://github.com/laurent22/joplin/releases/tag/v2.0.11) | 2021-06-16T17:55:49Z | 23,315 | 9,227 | 9,804 | 42,346 | +| [v2.0.10](https://github.com/laurent22/joplin/releases/tag/v2.0.10) | 2021-06-16T07:58:29Z | 2,535 | 913 | 368 | 3,816 | +| [v2.0.9](https://github.com/laurent22/joplin/releases/tag/v2.0.9) (p) | 2021-06-12T09:30:30Z | 1,590 | 288 | 874 | 2,752 | +| [v2.0.8](https://github.com/laurent22/joplin/releases/tag/v2.0.8) (p) | 2021-06-10T16:15:08Z | 1,182 | 224 | 571 | 1,977 | +| [v2.0.4](https://github.com/laurent22/joplin/releases/tag/v2.0.4) (p) | 2021-06-02T12:54:17Z | 1,487 | 387 | 371 | 2,245 | +| [v2.0.2](https://github.com/laurent22/joplin/releases/tag/v2.0.2) (p) | 2021-05-21T18:07:48Z | 2,729 | 485 | 1,662 | 4,876 | +| [v2.0.1](https://github.com/laurent22/joplin/releases/tag/v2.0.1) (p) | 2021-05-15T13:22:58Z | 857 | 266 | 1,017 | 2,140 | +| [v1.8.5](https://github.com/laurent22/joplin/releases/tag/v1.8.5) | 2021-05-10T11:58:14Z | 38,000 | 16,257 | 19,389 | 73,646 | +| [v1.8.4](https://github.com/laurent22/joplin/releases/tag/v1.8.4) (p) | 2021-05-09T18:05:05Z | 1,222 | 132 | 452 | 1,806 | +| [v1.8.3](https://github.com/laurent22/joplin/releases/tag/v1.8.3) (p) | 2021-05-04T10:38:16Z | 1,997 | 303 | 934 | 3,234 | +| [v1.8.2](https://github.com/laurent22/joplin/releases/tag/v1.8.2) (p) | 2021-04-25T10:50:51Z | 2,342 | 433 | 1,282 | 4,057 | +| [v1.8.1](https://github.com/laurent22/joplin/releases/tag/v1.8.1) (p) | 2021-03-29T10:46:41Z | 3,524 | 823 | 2,447 | 6,794 | +| [v1.7.11](https://github.com/laurent22/joplin/releases/tag/v1.7.11) | 2021-02-03T12:50:01Z | 116,452 | 42,777 | 64,286 | 223,515 | +| [v1.7.10](https://github.com/laurent22/joplin/releases/tag/v1.7.10) | 2021-01-30T13:25:29Z | 14,105 | 4,853 | 4,482 | 23,440 | | [v1.7.9](https://github.com/laurent22/joplin/releases/tag/v1.7.9) (p) | 2021-01-28T09:50:21Z | 502 | 133 | 498 | 1,133 | | [v1.7.6](https://github.com/laurent22/joplin/releases/tag/v1.7.6) (p) | 2021-01-27T10:36:05Z | 310 | 93 | 287 | 690 | | [v1.7.5](https://github.com/laurent22/joplin/releases/tag/v1.7.5) (p) | 2021-01-26T09:53:05Z | 388 | 204 | 454 | 1,046 | | [v1.7.4](https://github.com/laurent22/joplin/releases/tag/v1.7.4) (p) | 2021-01-22T17:58:38Z | 693 | 204 | 625 | 1,522 | -| [v1.6.8](https://github.com/laurent22/joplin/releases/tag/v1.6.8) | 2021-01-20T18:11:34Z | 19,542 | 7,691 | 7,599 | 34,832 | +| [v1.6.8](https://github.com/laurent22/joplin/releases/tag/v1.6.8) | 2021-01-20T18:11:34Z | 19,635 | 7,692 | 7,601 | 34,928 | | [v1.7.3](https://github.com/laurent22/joplin/releases/tag/v1.7.3) (p) | 2021-01-20T11:23:50Z | 345 | 76 | 442 | 863 | -| [v1.6.7](https://github.com/laurent22/joplin/releases/tag/v1.6.7) | 2021-01-11T23:20:33Z | 11,428 | 4,634 | 4,542 | 20,604 | -| [v1.6.6](https://github.com/laurent22/joplin/releases/tag/v1.6.6) | 2021-01-09T16:15:31Z | 12,577 | 3,417 | 4,793 | 20,787 | -| [v1.6.5](https://github.com/laurent22/joplin/releases/tag/v1.6.5) (p) | 2021-01-09T01:24:32Z | 1,349 | 72 | 308 | 1,729 | -| [v1.6.4](https://github.com/laurent22/joplin/releases/tag/v1.6.4) (p) | 2021-01-07T19:11:32Z | 391 | 78 | 203 | 672 | +| [v1.6.7](https://github.com/laurent22/joplin/releases/tag/v1.6.7) | 2021-01-11T23:20:33Z | 11,512 | 4,634 | 4,542 | 20,688 | +| [v1.6.6](https://github.com/laurent22/joplin/releases/tag/v1.6.6) | 2021-01-09T16:15:31Z | 12,588 | 3,417 | 4,793 | 20,798 | +| [v1.6.5](https://github.com/laurent22/joplin/releases/tag/v1.6.5) (p) | 2021-01-09T01:24:32Z | 1,410 | 72 | 308 | 1,790 | +| [v1.6.4](https://github.com/laurent22/joplin/releases/tag/v1.6.4) (p) | 2021-01-07T19:11:32Z | 392 | 78 | 203 | 673 | | [v1.6.2](https://github.com/laurent22/joplin/releases/tag/v1.6.2) (p) | 2021-01-04T22:34:55Z | 673 | 228 | 590 | 1,491 | -| [v1.5.14](https://github.com/laurent22/joplin/releases/tag/v1.5.14) | 2020-12-30T01:48:46Z | 11,897 | 5,203 | 5,526 | 22,626 | +| [v1.5.14](https://github.com/laurent22/joplin/releases/tag/v1.5.14) | 2020-12-30T01:48:46Z | 11,984 | 5,203 | 5,526 | 22,713 | | [v1.6.1](https://github.com/laurent22/joplin/releases/tag/v1.6.1) (p) | 2020-12-29T19:37:45Z | 171 | 36 | 168 | 375 | | [v1.5.13](https://github.com/laurent22/joplin/releases/tag/v1.5.13) | 2020-12-29T18:29:15Z | 629 | 218 | 200 | 1,047 | -| [v1.5.12](https://github.com/laurent22/joplin/releases/tag/v1.5.12) | 2020-12-28T15:14:08Z | 2,409 | 1,769 | 923 | 5,101 | +| [v1.5.12](https://github.com/laurent22/joplin/releases/tag/v1.5.12) | 2020-12-28T15:14:08Z | 2,410 | 1,769 | 923 | 5,102 | | [v1.5.11](https://github.com/laurent22/joplin/releases/tag/v1.5.11) | 2020-12-27T19:54:07Z | 14,166 | 4,625 | 4,275 | 23,066 | | [v1.5.10](https://github.com/laurent22/joplin/releases/tag/v1.5.10) (p) | 2020-12-26T12:35:36Z | 294 | 107 | 269 | 670 | | [v1.5.9](https://github.com/laurent22/joplin/releases/tag/v1.5.9) (p) | 2020-12-23T18:01:08Z | 327 | 372 | 410 | 1,109 | | [v1.5.8](https://github.com/laurent22/joplin/releases/tag/v1.5.8) (p) | 2020-12-20T09:45:19Z | 566 | 165 | 642 | 1,373 | | [v1.5.7](https://github.com/laurent22/joplin/releases/tag/v1.5.7) (p) | 2020-12-10T12:58:33Z | 889 | 254 | 993 | 2,136 | -| [v1.5.4](https://github.com/laurent22/joplin/releases/tag/v1.5.4) (p) | 2020-12-05T12:07:49Z | 692 | 166 | 634 | 1,492 | -| [v1.4.19](https://github.com/laurent22/joplin/releases/tag/v1.4.19) | 2020-12-01T11:11:16Z | 26,660 | 13,465 | 11,679 | 51,804 | -| [v1.4.18](https://github.com/laurent22/joplin/releases/tag/v1.4.18) | 2020-11-28T12:21:41Z | 11,398 | 3,879 | 3,138 | 18,415 | +| [v1.5.4](https://github.com/laurent22/joplin/releases/tag/v1.5.4) (p) | 2020-12-05T12:07:49Z | 693 | 166 | 635 | 1,494 | +| [v1.4.19](https://github.com/laurent22/joplin/releases/tag/v1.4.19) | 2020-12-01T11:11:16Z | 26,752 | 13,475 | 11,679 | 51,906 | +| [v1.4.18](https://github.com/laurent22/joplin/releases/tag/v1.4.18) | 2020-11-28T12:21:41Z | 11,415 | 3,879 | 3,138 | 18,432 | | [v1.4.16](https://github.com/laurent22/joplin/releases/tag/v1.4.16) | 2020-11-27T19:40:16Z | 1,481 | 829 | 597 | 2,907 | -| [v1.4.15](https://github.com/laurent22/joplin/releases/tag/v1.4.15) | 2020-11-27T13:25:43Z | 898 | 486 | 274 | 1,658 | -| [v1.4.12](https://github.com/laurent22/joplin/releases/tag/v1.4.12) | 2020-11-23T18:58:07Z | 3,032 | 1,327 | 1,304 | 5,663 | -| [v1.4.11](https://github.com/laurent22/joplin/releases/tag/v1.4.11) (p) | 2020-11-19T23:06:51Z | 1,908 | 160 | 593 | 2,661 | -| [v1.4.10](https://github.com/laurent22/joplin/releases/tag/v1.4.10) (p) | 2020-11-14T09:53:15Z | 631 | 198 | 686 | 1,515 | -| [v1.4.9](https://github.com/laurent22/joplin/releases/tag/v1.4.9) (p) | 2020-11-11T14:23:17Z | 722 | 144 | 404 | 1,270 | +| [v1.4.15](https://github.com/laurent22/joplin/releases/tag/v1.4.15) | 2020-11-27T13:25:43Z | 899 | 486 | 274 | 1,659 | +| [v1.4.12](https://github.com/laurent22/joplin/releases/tag/v1.4.12) | 2020-11-23T18:58:07Z | 3,032 | 1,328 | 1,304 | 5,664 | +| [v1.4.11](https://github.com/laurent22/joplin/releases/tag/v1.4.11) (p) | 2020-11-19T23:06:51Z | 1,976 | 160 | 593 | 2,729 | +| [v1.4.10](https://github.com/laurent22/joplin/releases/tag/v1.4.10) (p) | 2020-11-14T09:53:15Z | 636 | 198 | 686 | 1,520 | +| [v1.4.9](https://github.com/laurent22/joplin/releases/tag/v1.4.9) (p) | 2020-11-11T14:23:17Z | 726 | 144 | 404 | 1,274 | | [v1.4.7](https://github.com/laurent22/joplin/releases/tag/v1.4.7) (p) | 2020-11-07T18:23:29Z | 520 | 175 | 516 | 1,211 | -| [v1.3.18](https://github.com/laurent22/joplin/releases/tag/v1.3.18) | 2020-11-06T12:07:02Z | 31,926 | 11,337 | 10,516 | 53,779 | +| [v1.3.18](https://github.com/laurent22/joplin/releases/tag/v1.3.18) | 2020-11-06T12:07:02Z | 32,017 | 11,337 | 10,518 | 53,872 | | [v1.3.17](https://github.com/laurent22/joplin/releases/tag/v1.3.17) (p) | 2020-11-06T11:35:15Z | 50 | 27 | 25 | 102 | -| [v1.4.6](https://github.com/laurent22/joplin/releases/tag/v1.4.6) (p) | 2020-11-05T22:44:12Z | 551 | 95 | 55 | 701 | -| [v1.3.15](https://github.com/laurent22/joplin/releases/tag/v1.3.15) | 2020-11-04T12:22:50Z | 2,456 | 1,301 | 848 | 4,605 | -| [v1.3.11](https://github.com/laurent22/joplin/releases/tag/v1.3.11) (p) | 2020-10-31T13:22:20Z | 699 | 189 | 484 | 1,372 | +| [v1.4.6](https://github.com/laurent22/joplin/releases/tag/v1.4.6) (p) | 2020-11-05T22:44:12Z | 561 | 95 | 55 | 711 | +| [v1.3.15](https://github.com/laurent22/joplin/releases/tag/v1.3.15) | 2020-11-04T12:22:50Z | 2,462 | 1,301 | 848 | 4,611 | +| [v1.3.11](https://github.com/laurent22/joplin/releases/tag/v1.3.11) (p) | 2020-10-31T13:22:20Z | 701 | 189 | 484 | 1,374 | | [v1.3.10](https://github.com/laurent22/joplin/releases/tag/v1.3.10) (p) | 2020-10-29T13:27:14Z | 378 | 118 | 319 | 815 | | [v1.3.9](https://github.com/laurent22/joplin/releases/tag/v1.3.9) (p) | 2020-10-23T16:04:26Z | 840 | 246 | 636 | 1,722 | | [v1.3.8](https://github.com/laurent22/joplin/releases/tag/v1.3.8) (p) | 2020-10-21T18:46:29Z | 519 | 120 | 333 | 972 | | [v1.3.7](https://github.com/laurent22/joplin/releases/tag/v1.3.7) (p) | 2020-10-20T11:35:55Z | 297 | 88 | 345 | 730 | | [v1.3.5](https://github.com/laurent22/joplin/releases/tag/v1.3.5) (p) | 2020-10-17T14:26:35Z | 473 | 137 | 409 | 1,019 | -| [v1.3.3](https://github.com/laurent22/joplin/releases/tag/v1.3.3) (p) | 2020-10-17T10:56:57Z | 121 | 49 | 36 | 206 | +| [v1.3.3](https://github.com/laurent22/joplin/releases/tag/v1.3.3) (p) | 2020-10-17T10:56:57Z | 122 | 49 | 36 | 207 | | [v1.3.2](https://github.com/laurent22/joplin/releases/tag/v1.3.2) (p) | 2020-10-11T20:39:49Z | 667 | 185 | 568 | 1,420 | | [v1.3.1](https://github.com/laurent22/joplin/releases/tag/v1.3.1) (p) | 2020-10-11T15:10:18Z | 85 | 54 | 46 | 185 | -| [v1.2.6](https://github.com/laurent22/joplin/releases/tag/v1.2.6) | 2020-10-09T13:56:59Z | 45,576 | 17,741 | 14,047 | 77,364 | -| [v1.2.4](https://github.com/laurent22/joplin/releases/tag/v1.2.4) (p) | 2020-09-30T07:34:29Z | 816 | 250 | 800 | 1,866 | +| [v1.2.6](https://github.com/laurent22/joplin/releases/tag/v1.2.6) | 2020-10-09T13:56:59Z | 45,679 | 17,741 | 14,047 | 77,467 | +| [v1.2.4](https://github.com/laurent22/joplin/releases/tag/v1.2.4) (p) | 2020-09-30T07:34:29Z | 817 | 250 | 800 | 1,867 | | [v1.2.3](https://github.com/laurent22/joplin/releases/tag/v1.2.3) (p) | 2020-09-29T15:13:02Z | 220 | 68 | 82 | 370 | -| [v1.2.2](https://github.com/laurent22/joplin/releases/tag/v1.2.2) (p) | 2020-09-22T20:31:55Z | 997 | 210 | 642 | 1,849 | -| [v1.1.4](https://github.com/laurent22/joplin/releases/tag/v1.1.4) | 2020-09-21T11:20:09Z | 27,854 | 13,511 | 7,756 | 49,121 | +| [v1.2.2](https://github.com/laurent22/joplin/releases/tag/v1.2.2) (p) | 2020-09-22T20:31:55Z | 1,004 | 210 | 642 | 1,856 | +| [v1.1.4](https://github.com/laurent22/joplin/releases/tag/v1.1.4) | 2020-09-21T11:20:09Z | 27,867 | 13,511 | 7,756 | 49,134 | | [v1.1.3](https://github.com/laurent22/joplin/releases/tag/v1.1.3) (p) | 2020-09-17T10:30:37Z | 568 | 155 | 467 | 1,190 | -| [v1.1.2](https://github.com/laurent22/joplin/releases/tag/v1.1.2) (p) | 2020-09-15T12:58:38Z | 380 | 121 | 254 | 755 | -| [v1.1.1](https://github.com/laurent22/joplin/releases/tag/v1.1.1) (p) | 2020-09-11T23:32:47Z | 536 | 202 | 353 | 1,091 | -| [v1.0.245](https://github.com/laurent22/joplin/releases/tag/v1.0.245) | 2020-09-09T12:56:10Z | 21,865 | 10,013 | 5,647 | 37,525 | -| [v1.0.242](https://github.com/laurent22/joplin/releases/tag/v1.0.242) | 2020-09-04T22:00:34Z | 12,695 | 6,426 | 3,022 | 22,143 | -| [v1.0.241](https://github.com/laurent22/joplin/releases/tag/v1.0.241) | 2020-09-04T18:06:00Z | 25,419 | 5,888 | 5,088 | 36,395 | -| [v1.0.239](https://github.com/laurent22/joplin/releases/tag/v1.0.239) (p) | 2020-09-01T21:56:36Z | 807 | 234 | 407 | 1,448 | +| [v1.1.2](https://github.com/laurent22/joplin/releases/tag/v1.1.2) (p) | 2020-09-15T12:58:38Z | 381 | 121 | 254 | 756 | +| [v1.1.1](https://github.com/laurent22/joplin/releases/tag/v1.1.1) (p) | 2020-09-11T23:32:47Z | 538 | 202 | 353 | 1,093 | +| [v1.0.245](https://github.com/laurent22/joplin/releases/tag/v1.0.245) | 2020-09-09T12:56:10Z | 21,917 | 10,014 | 5,647 | 37,578 | +| [v1.0.242](https://github.com/laurent22/joplin/releases/tag/v1.0.242) | 2020-09-04T22:00:34Z | 12,703 | 6,426 | 3,023 | 22,152 | +| [v1.0.241](https://github.com/laurent22/joplin/releases/tag/v1.0.241) | 2020-09-04T18:06:00Z | 25,577 | 5,900 | 5,090 | 36,567 | +| [v1.0.239](https://github.com/laurent22/joplin/releases/tag/v1.0.239) (p) | 2020-09-01T21:56:36Z | 814 | 234 | 407 | 1,455 | | [v1.0.237](https://github.com/laurent22/joplin/releases/tag/v1.0.237) (p) | 2020-08-29T15:38:04Z | 596 | 932 | 345 | 1,873 | | [v1.0.236](https://github.com/laurent22/joplin/releases/tag/v1.0.236) (p) | 2020-08-28T09:16:54Z | 321 | 119 | 110 | 550 | -| [v1.0.235](https://github.com/laurent22/joplin/releases/tag/v1.0.235) (p) | 2020-08-18T22:08:01Z | 1,880 | 498 | 928 | 3,306 | -| [v1.0.234](https://github.com/laurent22/joplin/releases/tag/v1.0.234) (p) | 2020-08-17T23:13:02Z | 585 | 133 | 107 | 825 | -| [v1.0.233](https://github.com/laurent22/joplin/releases/tag/v1.0.233) | 2020-08-01T14:51:15Z | 44,456 | 18,202 | 12,367 | 75,025 | +| [v1.0.235](https://github.com/laurent22/joplin/releases/tag/v1.0.235) (p) | 2020-08-18T22:08:01Z | 1,891 | 498 | 928 | 3,317 | +| [v1.0.234](https://github.com/laurent22/joplin/releases/tag/v1.0.234) (p) | 2020-08-17T23:13:02Z | 587 | 133 | 107 | 827 | +| [v1.0.233](https://github.com/laurent22/joplin/releases/tag/v1.0.233) | 2020-08-01T14:51:15Z | 44,564 | 18,202 | 12,367 | 75,133 | | [v1.0.232](https://github.com/laurent22/joplin/releases/tag/v1.0.232) (p) | 2020-07-28T22:34:40Z | 660 | 231 | 186 | 1,077 | -| [v1.0.227](https://github.com/laurent22/joplin/releases/tag/v1.0.227) | 2020-07-07T20:44:54Z | 40,976 | 15,289 | 9,643 | 65,908 | +| [v1.0.227](https://github.com/laurent22/joplin/releases/tag/v1.0.227) | 2020-07-07T20:44:54Z | 41,011 | 15,289 | 9,643 | 65,943 | | [v1.0.226](https://github.com/laurent22/joplin/releases/tag/v1.0.226) (p) | 2020-07-04T10:21:26Z | 4,922 | 2,261 | 694 | 7,877 | -| [v1.0.224](https://github.com/laurent22/joplin/releases/tag/v1.0.224) | 2020-06-20T22:26:08Z | 24,826 | 11,015 | 6,013 | 41,854 | -| [v1.0.223](https://github.com/laurent22/joplin/releases/tag/v1.0.223) (p) | 2020-06-20T11:51:27Z | 194 | 120 | 84 | 398 | +| [v1.0.224](https://github.com/laurent22/joplin/releases/tag/v1.0.224) | 2020-06-20T22:26:08Z | 24,839 | 11,015 | 6,013 | 41,867 | +| [v1.0.223](https://github.com/laurent22/joplin/releases/tag/v1.0.223) (p) | 2020-06-20T11:51:27Z | 194 | 121 | 84 | 399 | | [v1.0.221](https://github.com/laurent22/joplin/releases/tag/v1.0.221) (p) | 2020-06-20T01:44:20Z | 862 | 214 | 216 | 1,292 | -| [v1.0.220](https://github.com/laurent22/joplin/releases/tag/v1.0.220) | 2020-06-13T18:26:22Z | 32,241 | 9,930 | 6,421 | 48,592 | -| [v1.0.218](https://github.com/laurent22/joplin/releases/tag/v1.0.218) | 2020-06-07T10:43:34Z | 14,552 | 6,977 | 2,962 | 24,491 | +| [v1.0.220](https://github.com/laurent22/joplin/releases/tag/v1.0.220) | 2020-06-13T18:26:22Z | 32,282 | 9,930 | 6,421 | 48,633 | +| [v1.0.218](https://github.com/laurent22/joplin/releases/tag/v1.0.218) | 2020-06-07T10:43:34Z | 14,552 | 6,978 | 2,962 | 24,492 | | [v1.0.217](https://github.com/laurent22/joplin/releases/tag/v1.0.217) (p) | 2020-06-06T15:17:27Z | 232 | 102 | 60 | 394 | -| [v1.0.216](https://github.com/laurent22/joplin/releases/tag/v1.0.216) | 2020-05-24T14:21:01Z | 38,264 | 14,299 | 10,188 | 62,751 | -| [v1.0.214](https://github.com/laurent22/joplin/releases/tag/v1.0.214) (p) | 2020-05-21T17:15:15Z | 6,579 | 3,476 | 768 | 10,823 | +| [v1.0.216](https://github.com/laurent22/joplin/releases/tag/v1.0.216) | 2020-05-24T14:21:01Z | 38,357 | 14,299 | 10,188 | 62,844 | +| [v1.0.214](https://github.com/laurent22/joplin/releases/tag/v1.0.214) (p) | 2020-05-21T17:15:15Z | 6,593 | 3,476 | 768 | 10,837 | | [v1.0.212](https://github.com/laurent22/joplin/releases/tag/v1.0.212) (p) | 2020-05-21T07:48:39Z | 218 | 76 | 53 | 347 | | [v1.0.211](https://github.com/laurent22/joplin/releases/tag/v1.0.211) (p) | 2020-05-20T08:59:16Z | 307 | 140 | 93 | 540 | | [v1.0.209](https://github.com/laurent22/joplin/releases/tag/v1.0.209) (p) | 2020-05-17T18:32:51Z | 1,399 | 860 | 153 | 2,412 | -| [v1.0.207](https://github.com/laurent22/joplin/releases/tag/v1.0.207) (p) | 2020-05-10T16:37:35Z | 1,201 | 271 | 1,022 | 2,494 | -| [v1.0.201](https://github.com/laurent22/joplin/releases/tag/v1.0.201) | 2020-04-15T22:55:13Z | 54,191 | 20,056 | 18,184 | 92,431 | +| [v1.0.207](https://github.com/laurent22/joplin/releases/tag/v1.0.207) (p) | 2020-05-10T16:37:35Z | 1,202 | 271 | 1,022 | 2,495 | +| [v1.0.201](https://github.com/laurent22/joplin/releases/tag/v1.0.201) | 2020-04-15T22:55:13Z | 54,231 | 20,056 | 18,184 | 92,471 | | [v1.0.200](https://github.com/laurent22/joplin/releases/tag/v1.0.200) | 2020-04-12T12:17:46Z | 9,566 | 4,897 | 1,908 | 16,371 | -| [v1.0.199](https://github.com/laurent22/joplin/releases/tag/v1.0.199) | 2020-04-10T18:41:58Z | 19,527 | 5,894 | 3,794 | 29,215 | -| [v1.0.197](https://github.com/laurent22/joplin/releases/tag/v1.0.197) | 2020-03-30T17:21:22Z | 22,677 | 9,620 | 6,008 | 38,305 | -| [v1.0.195](https://github.com/laurent22/joplin/releases/tag/v1.0.195) | 2020-03-22T19:56:12Z | 19,087 | 7,954 | 4,510 | 31,551 | +| [v1.0.199](https://github.com/laurent22/joplin/releases/tag/v1.0.199) | 2020-04-10T18:41:58Z | 19,539 | 5,894 | 3,794 | 29,227 | +| [v1.0.197](https://github.com/laurent22/joplin/releases/tag/v1.0.197) | 2020-03-30T17:21:22Z | 22,715 | 9,629 | 6,028 | 38,372 | +| [v1.0.195](https://github.com/laurent22/joplin/releases/tag/v1.0.195) | 2020-03-22T19:56:12Z | 19,088 | 7,954 | 4,510 | 31,552 | | [v1.0.194](https://github.com/laurent22/joplin/releases/tag/v1.0.194) (p) | 2020-03-14T00:00:32Z | 1,290 | 1,389 | 522 | 3,201 | -| [v1.0.193](https://github.com/laurent22/joplin/releases/tag/v1.0.193) | 2020-03-08T08:58:53Z | 28,700 | 10,916 | 7,404 | 47,020 | +| [v1.0.193](https://github.com/laurent22/joplin/releases/tag/v1.0.193) | 2020-03-08T08:58:53Z | 28,705 | 10,918 | 7,408 | 47,031 | | [v1.0.192](https://github.com/laurent22/joplin/releases/tag/v1.0.192) (p) | 2020-03-06T23:27:52Z | 484 | 127 | 94 | 705 | -| [v1.0.190](https://github.com/laurent22/joplin/releases/tag/v1.0.190) (p) | 2020-03-06T01:22:22Z | 383 | 96 | 89 | 568 | +| [v1.0.190](https://github.com/laurent22/joplin/releases/tag/v1.0.190) (p) | 2020-03-06T01:22:22Z | 384 | 96 | 89 | 569 | | [v1.0.189](https://github.com/laurent22/joplin/releases/tag/v1.0.189) (p) | 2020-03-04T17:27:15Z | 356 | 101 | 99 | 556 | -| [v1.0.187](https://github.com/laurent22/joplin/releases/tag/v1.0.187) (p) | 2020-03-01T12:31:06Z | 926 | 235 | 273 | 1,434 | -| [v1.0.179](https://github.com/laurent22/joplin/releases/tag/v1.0.179) | 2020-01-24T22:42:41Z | 71,349 | 28,679 | 22,562 | 122,590 | -| [v1.0.178](https://github.com/laurent22/joplin/releases/tag/v1.0.178) | 2020-01-20T19:06:45Z | 17,595 | 5,968 | 2,592 | 26,155 | +| [v1.0.187](https://github.com/laurent22/joplin/releases/tag/v1.0.187) (p) | 2020-03-01T12:31:06Z | 926 | 236 | 274 | 1,436 | +| [v1.0.179](https://github.com/laurent22/joplin/releases/tag/v1.0.179) | 2020-01-24T22:42:41Z | 71,364 | 28,690 | 22,564 | 122,618 | +| [v1.0.178](https://github.com/laurent22/joplin/releases/tag/v1.0.178) | 2020-01-20T19:06:45Z | 17,596 | 5,968 | 2,593 | 26,157 | | [v1.0.177](https://github.com/laurent22/joplin/releases/tag/v1.0.177) (p) | 2019-12-30T14:40:40Z | 1,954 | 443 | 709 | 3,106 | | [v1.0.176](https://github.com/laurent22/joplin/releases/tag/v1.0.176) (p) | 2019-12-14T10:36:44Z | 3,128 | 2,539 | 472 | 6,139 | -| [v1.0.175](https://github.com/laurent22/joplin/releases/tag/v1.0.175) | 2019-12-08T11:48:47Z | 73,341 | 16,963 | 16,566 | 106,870 | -| [v1.0.174](https://github.com/laurent22/joplin/releases/tag/v1.0.174) | 2019-11-12T18:20:58Z | 30,522 | 11,743 | 8,227 | 50,492 | +| [v1.0.175](https://github.com/laurent22/joplin/releases/tag/v1.0.175) | 2019-12-08T11:48:47Z | 73,359 | 16,963 | 16,568 | 106,890 | +| [v1.0.174](https://github.com/laurent22/joplin/releases/tag/v1.0.174) | 2019-11-12T18:20:58Z | 30,533 | 11,743 | 8,229 | 50,505 | | [v1.0.173](https://github.com/laurent22/joplin/releases/tag/v1.0.173) | 2019-11-11T08:33:35Z | 5,103 | 2,084 | 750 | 7,937 | -| [v1.0.170](https://github.com/laurent22/joplin/releases/tag/v1.0.170) | 2019-10-13T22:13:04Z | 27,620 | 8,772 | 7,682 | 44,074 | -| [v1.0.169](https://github.com/laurent22/joplin/releases/tag/v1.0.169) | 2019-09-27T18:35:13Z | 17,167 | 5,926 | 3,758 | 26,851 | +| [v1.0.170](https://github.com/laurent22/joplin/releases/tag/v1.0.170) | 2019-10-13T22:13:04Z | 27,625 | 8,772 | 7,683 | 44,080 | +| [v1.0.169](https://github.com/laurent22/joplin/releases/tag/v1.0.169) | 2019-09-27T18:35:13Z | 17,170 | 5,926 | 3,758 | 26,854 | | [v1.0.168](https://github.com/laurent22/joplin/releases/tag/v1.0.168) | 2019-09-25T21:21:38Z | 5,336 | 2,278 | 722 | 8,336 | -| [v1.0.167](https://github.com/laurent22/joplin/releases/tag/v1.0.167) | 2019-09-10T08:48:37Z | 16,825 | 5,709 | 3,707 | 26,241 | +| [v1.0.167](https://github.com/laurent22/joplin/releases/tag/v1.0.167) | 2019-09-10T08:48:37Z | 16,826 | 5,709 | 3,707 | 26,242 | | [v1.0.166](https://github.com/laurent22/joplin/releases/tag/v1.0.166) | 2019-09-09T17:35:54Z | 1,962 | 566 | 240 | 2,768 | -| [v1.0.165](https://github.com/laurent22/joplin/releases/tag/v1.0.165) | 2019-08-14T21:46:29Z | 19,007 | 6,980 | 5,468 | 31,455 | -| [v1.0.161](https://github.com/laurent22/joplin/releases/tag/v1.0.161) | 2019-07-13T18:30:00Z | 19,308 | 6,357 | 4,140 | 29,805 | -| [v1.0.160](https://github.com/laurent22/joplin/releases/tag/v1.0.160) | 2019-06-15T00:21:40Z | 30,637 | 7,753 | 8,108 | 46,498 | -| [v1.0.159](https://github.com/laurent22/joplin/releases/tag/v1.0.159) | 2019-06-08T00:00:19Z | 5,200 | 2,183 | 1,122 | 8,505 | +| [v1.0.165](https://github.com/laurent22/joplin/releases/tag/v1.0.165) | 2019-08-14T21:46:29Z | 19,012 | 6,980 | 5,470 | 31,462 | +| [v1.0.161](https://github.com/laurent22/joplin/releases/tag/v1.0.161) | 2019-07-13T18:30:00Z | 19,309 | 6,357 | 4,140 | 29,806 | +| [v1.0.160](https://github.com/laurent22/joplin/releases/tag/v1.0.160) | 2019-06-15T00:21:40Z | 30,644 | 7,755 | 8,109 | 46,508 | +| [v1.0.159](https://github.com/laurent22/joplin/releases/tag/v1.0.159) | 2019-06-08T00:00:19Z | 5,200 | 2,183 | 1,123 | 8,506 | | [v1.0.158](https://github.com/laurent22/joplin/releases/tag/v1.0.158) | 2019-05-27T19:01:18Z | 9,820 | 3,548 | 1,940 | 15,308 | | [v1.0.157](https://github.com/laurent22/joplin/releases/tag/v1.0.157) | 2019-05-26T17:55:53Z | 2,183 | 849 | 295 | 3,327 | | [v1.0.153](https://github.com/laurent22/joplin/releases/tag/v1.0.153) (p) | 2019-05-15T06:27:29Z | 855 | 107 | 110 | 1,072 | @@ -193,62 +193,62 @@ updated: 2022-05-19T06:17:18Z | [v1.0.150](https://github.com/laurent22/joplin/releases/tag/v1.0.150) | 2019-05-12T11:27:48Z | 428 | 141 | 72 | 641 | | [v1.0.148](https://github.com/laurent22/joplin/releases/tag/v1.0.148) (p) | 2019-05-08T19:12:24Z | 135 | 61 | 99 | 295 | | [v1.0.145](https://github.com/laurent22/joplin/releases/tag/v1.0.145) | 2019-05-03T09:16:53Z | 7,012 | 2,866 | 1,441 | 11,319 | -| [v1.0.143](https://github.com/laurent22/joplin/releases/tag/v1.0.143) | 2019-04-22T10:51:38Z | 11,923 | 3,555 | 2,784 | 18,262 | -| [v1.0.142](https://github.com/laurent22/joplin/releases/tag/v1.0.142) | 2019-04-02T16:44:51Z | 14,727 | 4,570 | 4,731 | 24,028 | -| [v1.0.140](https://github.com/laurent22/joplin/releases/tag/v1.0.140) | 2019-03-10T20:59:58Z | 13,636 | 4,176 | 3,336 | 21,148 | +| [v1.0.143](https://github.com/laurent22/joplin/releases/tag/v1.0.143) | 2019-04-22T10:51:38Z | 11,923 | 3,555 | 2,785 | 18,263 | +| [v1.0.142](https://github.com/laurent22/joplin/releases/tag/v1.0.142) | 2019-04-02T16:44:51Z | 14,735 | 4,571 | 4,731 | 24,037 | +| [v1.0.140](https://github.com/laurent22/joplin/releases/tag/v1.0.140) | 2019-03-10T20:59:58Z | 13,637 | 4,177 | 3,340 | 21,154 | | [v1.0.139](https://github.com/laurent22/joplin/releases/tag/v1.0.139) (p) | 2019-03-09T10:06:48Z | 128 | 68 | 50 | 246 | | [v1.0.138](https://github.com/laurent22/joplin/releases/tag/v1.0.138) (p) | 2019-03-03T17:23:00Z | 156 | 94 | 88 | 338 | | [v1.0.137](https://github.com/laurent22/joplin/releases/tag/v1.0.137) (p) | 2019-03-03T01:12:51Z | 596 | 63 | 87 | 746 | -| [v1.0.135](https://github.com/laurent22/joplin/releases/tag/v1.0.135) | 2019-02-27T23:36:57Z | 12,581 | 3,964 | 4,082 | 20,627 | +| [v1.0.135](https://github.com/laurent22/joplin/releases/tag/v1.0.135) | 2019-02-27T23:36:57Z | 12,594 | 3,964 | 4,082 | 20,640 | | [v1.0.134](https://github.com/laurent22/joplin/releases/tag/v1.0.134) | 2019-02-27T10:21:44Z | 1,472 | 574 | 223 | 2,269 | | [v1.0.132](https://github.com/laurent22/joplin/releases/tag/v1.0.132) | 2019-02-26T23:02:05Z | 1,092 | 457 | 100 | 1,649 | -| [v1.0.127](https://github.com/laurent22/joplin/releases/tag/v1.0.127) | 2019-02-14T23:12:48Z | 9,846 | 3,177 | 2,934 | 15,957 | +| [v1.0.127](https://github.com/laurent22/joplin/releases/tag/v1.0.127) | 2019-02-14T23:12:48Z | 9,852 | 3,177 | 2,934 | 15,963 | | [v1.0.126](https://github.com/laurent22/joplin/releases/tag/v1.0.126) (p) | 2019-02-09T19:46:16Z | 938 | 79 | 121 | 1,138 | -| [v1.0.125](https://github.com/laurent22/joplin/releases/tag/v1.0.125) | 2019-01-26T18:14:33Z | 10,278 | 3,564 | 1,707 | 15,549 | -| [v1.0.120](https://github.com/laurent22/joplin/releases/tag/v1.0.120) | 2019-01-10T21:42:53Z | 15,610 | 5,208 | 6,522 | 27,340 | +| [v1.0.125](https://github.com/laurent22/joplin/releases/tag/v1.0.125) | 2019-01-26T18:14:33Z | 10,279 | 3,564 | 1,707 | 15,550 | +| [v1.0.120](https://github.com/laurent22/joplin/releases/tag/v1.0.120) | 2019-01-10T21:42:53Z | 15,611 | 5,209 | 6,523 | 27,343 | | [v1.0.119](https://github.com/laurent22/joplin/releases/tag/v1.0.119) | 2018-12-18T12:40:22Z | 8,911 | 3,267 | 2,018 | 14,196 | | [v1.0.118](https://github.com/laurent22/joplin/releases/tag/v1.0.118) | 2019-01-11T08:34:13Z | 722 | 253 | 93 | 1,068 | -| [v1.0.117](https://github.com/laurent22/joplin/releases/tag/v1.0.117) | 2018-11-24T12:05:24Z | 16,266 | 4,902 | 6,385 | 27,553 | -| [v1.0.116](https://github.com/laurent22/joplin/releases/tag/v1.0.116) | 2018-11-20T19:09:24Z | 3,564 | 1,129 | 718 | 5,411 | +| [v1.0.117](https://github.com/laurent22/joplin/releases/tag/v1.0.117) | 2018-11-24T12:05:24Z | 16,268 | 4,902 | 6,386 | 27,556 | +| [v1.0.116](https://github.com/laurent22/joplin/releases/tag/v1.0.116) | 2018-11-20T19:09:24Z | 3,597 | 1,129 | 718 | 5,444 | | [v1.0.115](https://github.com/laurent22/joplin/releases/tag/v1.0.115) | 2018-11-16T16:52:02Z | 3,662 | 1,308 | 805 | 5,775 | | [v1.0.114](https://github.com/laurent22/joplin/releases/tag/v1.0.114) | 2018-10-24T20:14:10Z | 11,401 | 3,507 | 3,834 | 18,742 | -| [v1.0.111](https://github.com/laurent22/joplin/releases/tag/v1.0.111) | 2018-09-30T20:15:09Z | 12,109 | 3,320 | 3,687 | 19,116 | +| [v1.0.111](https://github.com/laurent22/joplin/releases/tag/v1.0.111) | 2018-09-30T20:15:09Z | 12,110 | 3,320 | 3,687 | 19,117 | | [v1.0.110](https://github.com/laurent22/joplin/releases/tag/v1.0.110) | 2018-09-29T12:29:21Z | 966 | 414 | 122 | 1,502 | -| [v1.0.109](https://github.com/laurent22/joplin/releases/tag/v1.0.109) | 2018-09-27T18:01:41Z | 2,108 | 710 | 332 | 3,150 | +| [v1.0.109](https://github.com/laurent22/joplin/releases/tag/v1.0.109) | 2018-09-27T18:01:41Z | 2,108 | 710 | 333 | 3,151 | | [v1.0.108](https://github.com/laurent22/joplin/releases/tag/v1.0.108) (p) | 2018-09-29T18:49:29Z | 35 | 27 | 18 | 80 | | [v1.0.107](https://github.com/laurent22/joplin/releases/tag/v1.0.107) | 2018-09-16T19:51:07Z | 7,155 | 2,142 | 1,713 | 11,010 | | [v1.0.106](https://github.com/laurent22/joplin/releases/tag/v1.0.106) | 2018-09-08T15:23:40Z | 4,563 | 1,463 | 322 | 6,348 | -| [v1.0.105](https://github.com/laurent22/joplin/releases/tag/v1.0.105) | 2018-09-05T11:29:36Z | 4,661 | 1,595 | 1,461 | 7,717 | -| [v1.0.104](https://github.com/laurent22/joplin/releases/tag/v1.0.104) | 2018-06-28T20:25:36Z | 15,064 | 4,706 | 7,366 | 27,136 | +| [v1.0.105](https://github.com/laurent22/joplin/releases/tag/v1.0.105) | 2018-09-05T11:29:36Z | 4,661 | 1,595 | 1,462 | 7,718 | +| [v1.0.104](https://github.com/laurent22/joplin/releases/tag/v1.0.104) | 2018-06-28T20:25:36Z | 15,064 | 4,708 | 7,366 | 27,138 | | [v1.0.103](https://github.com/laurent22/joplin/releases/tag/v1.0.103) | 2018-06-21T19:38:13Z | 2,059 | 893 | 684 | 3,636 | | [v1.0.101](https://github.com/laurent22/joplin/releases/tag/v1.0.101) | 2018-06-17T18:35:11Z | 1,315 | 613 | 413 | 2,341 | -| [v1.0.100](https://github.com/laurent22/joplin/releases/tag/v1.0.100) | 2018-06-14T17:41:43Z | 890 | 440 | 250 | 1,580 | -| [v1.0.99](https://github.com/laurent22/joplin/releases/tag/v1.0.99) | 2018-06-10T13:18:23Z | 1,260 | 603 | 385 | 2,248 | -| [v1.0.97](https://github.com/laurent22/joplin/releases/tag/v1.0.97) | 2018-06-09T19:23:34Z | 317 | 162 | 65 | 544 | +| [v1.0.100](https://github.com/laurent22/joplin/releases/tag/v1.0.100) | 2018-06-14T17:41:43Z | 891 | 440 | 250 | 1,581 | +| [v1.0.99](https://github.com/laurent22/joplin/releases/tag/v1.0.99) | 2018-06-10T13:18:23Z | 1,260 | 604 | 385 | 2,249 | +| [v1.0.97](https://github.com/laurent22/joplin/releases/tag/v1.0.97) | 2018-06-09T19:23:34Z | 318 | 162 | 65 | 545 | | [v1.0.96](https://github.com/laurent22/joplin/releases/tag/v1.0.96) | 2018-05-26T16:36:39Z | 2,726 | 1,231 | 1,707 | 5,664 | | [v1.0.95](https://github.com/laurent22/joplin/releases/tag/v1.0.95) | 2018-05-25T13:04:30Z | 424 | 225 | 129 | 778 | | [v1.0.94](https://github.com/laurent22/joplin/releases/tag/v1.0.94) | 2018-05-21T20:52:59Z | 1,138 | 591 | 404 | 2,133 | -| [v1.0.93](https://github.com/laurent22/joplin/releases/tag/v1.0.93) | 2018-05-14T11:36:01Z | 1,796 | 1,219 | 766 | 3,781 | +| [v1.0.93](https://github.com/laurent22/joplin/releases/tag/v1.0.93) | 2018-05-14T11:36:01Z | 1,796 | 1,225 | 766 | 3,787 | | [v1.0.91](https://github.com/laurent22/joplin/releases/tag/v1.0.91) | 2018-05-10T14:48:04Z | 832 | 558 | 317 | 1,707 | -| [v1.0.89](https://github.com/laurent22/joplin/releases/tag/v1.0.89) | 2018-05-09T13:05:05Z | 500 | 238 | 118 | 856 | +| [v1.0.89](https://github.com/laurent22/joplin/releases/tag/v1.0.89) | 2018-05-09T13:05:05Z | 500 | 239 | 119 | 858 | | [v1.0.85](https://github.com/laurent22/joplin/releases/tag/v1.0.85) | 2018-05-01T21:08:24Z | 1,657 | 957 | 641 | 3,255 | -| [v1.0.83](https://github.com/laurent22/joplin/releases/tag/v1.0.83) | 2018-04-04T19:43:58Z | 5,263 | 2,538 | 2,665 | 10,466 | +| [v1.0.83](https://github.com/laurent22/joplin/releases/tag/v1.0.83) | 2018-04-04T19:43:58Z | 5,293 | 2,538 | 2,665 | 10,496 | | [v1.0.82](https://github.com/laurent22/joplin/releases/tag/v1.0.82) | 2018-03-31T19:16:31Z | 696 | 412 | 129 | 1,237 | | [v1.0.81](https://github.com/laurent22/joplin/releases/tag/v1.0.81) | 2018-03-28T08:13:58Z | 1,003 | 603 | 790 | 2,396 | | [v1.0.79](https://github.com/laurent22/joplin/releases/tag/v1.0.79) | 2018-03-23T18:00:11Z | 934 | 545 | 389 | 1,868 | | [v1.0.78](https://github.com/laurent22/joplin/releases/tag/v1.0.78) | 2018-03-17T15:27:18Z | 1,315 | 900 | 879 | 3,094 | | [v1.0.77](https://github.com/laurent22/joplin/releases/tag/v1.0.77) | 2018-03-16T15:12:35Z | 182 | 111 | 53 | 346 | | [v1.0.72](https://github.com/laurent22/joplin/releases/tag/v1.0.72) | 2018-03-14T09:44:35Z | 411 | 263 | 65 | 739 | -| [v1.0.70](https://github.com/laurent22/joplin/releases/tag/v1.0.70) | 2018-02-28T20:04:30Z | 1,858 | 1,057 | 1,262 | 4,177 | -| [v1.0.67](https://github.com/laurent22/joplin/releases/tag/v1.0.67) | 2018-02-19T22:51:08Z | 1,818 | 611 | 0 | 2,429 | -| [v1.0.66](https://github.com/laurent22/joplin/releases/tag/v1.0.66) | 2018-02-18T23:09:09Z | 331 | 141 | 90 | 562 | -| [v1.0.65](https://github.com/laurent22/joplin/releases/tag/v1.0.65) | 2018-02-17T20:02:25Z | 197 | 135 | 138 | 470 | +| [v1.0.70](https://github.com/laurent22/joplin/releases/tag/v1.0.70) | 2018-02-28T20:04:30Z | 1,858 | 1,058 | 1,262 | 4,178 | +| [v1.0.67](https://github.com/laurent22/joplin/releases/tag/v1.0.67) | 2018-02-19T22:51:08Z | 1,818 | 612 | 0 | 2,430 | +| [v1.0.66](https://github.com/laurent22/joplin/releases/tag/v1.0.66) | 2018-02-18T23:09:09Z | 332 | 141 | 90 | 563 | +| [v1.0.65](https://github.com/laurent22/joplin/releases/tag/v1.0.65) | 2018-02-17T20:02:25Z | 197 | 135 | 139 | 471 | | [v1.0.64](https://github.com/laurent22/joplin/releases/tag/v1.0.64) | 2018-02-16T00:58:20Z | 1,088 | 550 | 1,128 | 2,766 | | [v1.0.63](https://github.com/laurent22/joplin/releases/tag/v1.0.63) | 2018-02-14T19:40:36Z | 305 | 167 | 98 | 570 | | [v1.0.62](https://github.com/laurent22/joplin/releases/tag/v1.0.62) | 2018-02-12T20:19:58Z | 566 | 307 | 373 | 1,246 | | [v0.10.61](https://github.com/laurent22/joplin/releases/tag/v0.10.61) | 2018-02-08T18:27:39Z | 975 | 641 | 969 | 2,585 | | [v0.10.60](https://github.com/laurent22/joplin/releases/tag/v0.10.60) | 2018-02-06T13:09:56Z | 725 | 527 | 557 | 1,809 | -| [v0.10.54](https://github.com/laurent22/joplin/releases/tag/v0.10.54) | 2018-01-31T20:21:30Z | 1,824 | 1,466 | 328 | 3,618 | +| [v0.10.54](https://github.com/laurent22/joplin/releases/tag/v0.10.54) | 2018-01-31T20:21:30Z | 1,824 | 1,466 | 329 | 3,619 | | [v0.10.52](https://github.com/laurent22/joplin/releases/tag/v0.10.52) | 2018-01-31T19:25:18Z | 50 | 640 | 21 | 711 | | [v0.10.51](https://github.com/laurent22/joplin/releases/tag/v0.10.51) | 2018-01-28T18:47:02Z | 1,332 | 1,605 | 332 | 3,269 | | [v0.10.48](https://github.com/laurent22/joplin/releases/tag/v0.10.48) | 2018-01-23T11:19:51Z | 1,968 | 1,758 | 36 | 3,762 | @@ -256,7 +256,7 @@ updated: 2022-05-19T06:17:18Z | [v0.10.43](https://github.com/laurent22/joplin/releases/tag/v0.10.43) | 2018-01-08T10:12:10Z | 3,445 | 2,362 | 1,213 | 7,020 | | [v0.10.41](https://github.com/laurent22/joplin/releases/tag/v0.10.41) | 2018-01-05T20:38:12Z | 1,040 | 1,555 | 247 | 2,842 | | [v0.10.40](https://github.com/laurent22/joplin/releases/tag/v0.10.40) | 2018-01-02T23:16:57Z | 1,599 | 1,795 | 344 | 3,738 | -| [v0.10.39](https://github.com/laurent22/joplin/releases/tag/v0.10.39) | 2017-12-11T21:19:44Z | 5,847 | 4,320 | 3,218 | 13,385 | +| [v0.10.39](https://github.com/laurent22/joplin/releases/tag/v0.10.39) | 2017-12-11T21:19:44Z | 5,858 | 4,331 | 3,228 | 13,417 | | [v0.10.38](https://github.com/laurent22/joplin/releases/tag/v0.10.38) | 2017-12-08T10:12:06Z | 1,054 | 1,240 | 313 | 2,607 | | [v0.10.37](https://github.com/laurent22/joplin/releases/tag/v0.10.37) | 2017-12-07T19:38:05Z | 270 | 855 | 90 | 1,215 | | [v0.10.36](https://github.com/laurent22/joplin/releases/tag/v0.10.36) | 2017-12-05T09:34:40Z | 1,020 | 1,367 | 446 | 2,833 | @@ -265,11 +265,11 @@ updated: 2022-05-19T06:17:18Z | [v0.10.33](https://github.com/laurent22/joplin/releases/tag/v0.10.33) | 2017-12-02T13:20:39Z | 67 | 670 | 31 | 768 | | [v0.10.31](https://github.com/laurent22/joplin/releases/tag/v0.10.31) | 2017-12-01T09:56:44Z | 898 | 1,462 | 415 | 2,775 | | [v0.10.30](https://github.com/laurent22/joplin/releases/tag/v0.10.30) | 2017-11-30T20:28:16Z | 728 | 1,380 | 428 | 2,536 | -| [v0.10.28](https://github.com/laurent22/joplin/releases/tag/v0.10.28) | 2017-11-30T01:07:46Z | 1,356 | 1,713 | 884 | 3,953 | +| [v0.10.28](https://github.com/laurent22/joplin/releases/tag/v0.10.28) | 2017-11-30T01:07:46Z | 1,358 | 1,713 | 884 | 3,955 | | [v0.10.26](https://github.com/laurent22/joplin/releases/tag/v0.10.26) | 2017-11-29T16:02:17Z | 195 | 712 | 269 | 1,176 | -| [v0.10.25](https://github.com/laurent22/joplin/releases/tag/v0.10.25) | 2017-11-24T14:27:49Z | 154 | 708 | 6,578 | 7,440 | +| [v0.10.25](https://github.com/laurent22/joplin/releases/tag/v0.10.25) | 2017-11-24T14:27:49Z | 154 | 708 | 6,589 | 7,451 | | [v0.10.23](https://github.com/laurent22/joplin/releases/tag/v0.10.23) | 2017-11-21T19:38:41Z | 142 | 672 | 44 | 858 | | [v0.10.22](https://github.com/laurent22/joplin/releases/tag/v0.10.22) | 2017-11-20T21:45:57Z | 92 | 658 | 30 | 780 | -| [v0.10.21](https://github.com/laurent22/joplin/releases/tag/v0.10.21) | 2017-11-18T00:53:15Z | 59 | 651 | 24 | 734 | +| [v0.10.21](https://github.com/laurent22/joplin/releases/tag/v0.10.21) | 2017-11-18T00:53:15Z | 60 | 652 | 24 | 736 | | [v0.10.20](https://github.com/laurent22/joplin/releases/tag/v0.10.20) | 2017-11-17T17:18:25Z | 42 | 662 | 32 | 736 | -| [v0.10.19](https://github.com/laurent22/joplin/releases/tag/v0.10.19) | 2017-11-20T18:59:48Z | 31 | 661 | 28 | 720 | \ No newline at end of file +| [v0.10.19](https://github.com/laurent22/joplin/releases/tag/v0.10.19) | 2017-11-20T18:59:48Z | 33 | 661 | 28 | 722 | \ No newline at end of file From c0bc4c38c341410f78ddff3417402cda6489faa5 Mon Sep 17 00:00:00 2001 From: asrient <44570278+asrient@users.noreply.github.com> Date: Mon, 20 Jun 2022 18:26:54 +0530 Subject: [PATCH 02/38] Clipper: Resolves #6247: Clipper unable to pull and store PDFs (#6384) --- packages/app-clipper/content_scripts/index.js | 34 ++++++++ packages/lib/HtmlToMd.ts | 33 ++++++- packages/lib/htmlUtils.ts | 29 +++++++ packages/lib/markdownUtils.ts | 16 +++- packages/lib/markupLanguageUtils.ts | 11 +++ packages/lib/services/rest/Api.test.ts | 43 ++++++++++ packages/lib/services/rest/routes/notes.ts | 86 ++++++++++++------- 7 files changed, 217 insertions(+), 35 deletions(-) diff --git a/packages/app-clipper/content_scripts/index.js b/packages/app-clipper/content_scripts/index.js index 052b9130e4..3ccc01b1f5 100644 --- a/packages/app-clipper/content_scripts/index.js +++ b/packages/app-clipper/content_scripts/index.js @@ -32,6 +32,15 @@ } } + function escapeHtml(s) { + return s + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } + function pageTitle() { const titleElements = document.getElementsByTagName('title'); if (titleElements.length) return titleElements[0].text.trim(); @@ -204,6 +213,16 @@ } } + if (nodeName === 'embed') { + const src = absoluteUrl(node.src); + node.setAttribute('src', src); + } + + if (nodeName === 'object') { + const data = absoluteUrl(node.data); + node.setAttribute('data', data); + } + cleanUpElement(convertToMarkup, node, imageSizes, imageIndexes); } } @@ -317,6 +336,9 @@ } function readabilityProcess() { + + if (isPagePdf()) throw new Error('Could not parse PDF document with Readability'); + // eslint-disable-next-line no-undef const readability = new Readability(documentForReadability()); const article = readability.parse(); @@ -329,6 +351,14 @@ }; } + function isPagePdf() { + return document.contentType == 'application/pdf'; + } + + function embedPageUrl() { + return ``; + } + async function prepareCommandResponse(command) { console.info(`Got command: ${command.name}`); const shouldSendToJoplin = !!command.shouldSendToJoplin; @@ -375,6 +405,10 @@ } else if (command.name === 'completePageHtml') { + if (isPagePdf()) { + return clippedContentResponse(pageTitle(), embedPageUrl(), getImageSizes(document), getAnchorNames(document)); + } + hardcodePreStyles(document); addSvgClass(document); preProcessDocument(document); diff --git a/packages/lib/HtmlToMd.ts b/packages/lib/HtmlToMd.ts index e38f0d090d..0c7361aefe 100644 --- a/packages/lib/HtmlToMd.ts +++ b/packages/lib/HtmlToMd.ts @@ -2,17 +2,20 @@ const TurndownService = require('@joplin/turndown'); const turndownPluginGfm = require('@joplin/turndown-plugin-gfm').gfm; import markdownUtils from './markdownUtils'; +const pdfUrlRegex = /[\s\S]*?\.pdf$/i; + export interface ParseOptions { anchorNames?: string[]; preserveImageTagsWithSize?: boolean; baseUrl?: string; disableEscapeContent?: boolean; + convertEmbeddedPdfsToLinks?: boolean; } export default class HtmlToMd { public parse(html: string, options: ParseOptions = {}) { - const turndown = new TurndownService({ + const turndownOpts: any = { headingStyle: 'atx', anchorNames: options.anchorNames ? options.anchorNames.map(n => n.trim().toLowerCase()) : [], codeBlockStyle: 'fenced', @@ -22,10 +25,36 @@ export default class HtmlToMd { strongDelimiter: '**', br: '', disableEscapeContent: 'disableEscapeContent' in options ? options.disableEscapeContent : false, - }); + }; + if (options.convertEmbeddedPdfsToLinks) { + // Turndown ignores empty tags, so we need to handle this case seperately + // https://github.com/mixmark-io/turndown/issues/293#issuecomment-588984202 + turndownOpts.blankReplacement = (content: string, node: any) => { + if (node.matches('object')) { + return pdfRule.replacement(content, node, {}); + } + return '\n\n'; + }; + } + const turndown = new TurndownService(turndownOpts); turndown.use(turndownPluginGfm); turndown.remove('script'); turndown.remove('style'); + const pdfRule = { + filter: ['embed', 'object'], + replacement: function(_content: string, node: any, _options: any) { + // We are setting embedded_pdf as name so that we can later distingish them from normal links and create resources for them. + if (node.matches('embed') && node.getAttribute('src') && pdfUrlRegex.test(node.getAttribute('src'))) { + return `[embedded_pdf](${node.getAttribute('src')})`; + } else if (node.matches('object') && node.getAttribute('data') && pdfUrlRegex.test(node.getAttribute('data'))) { + return `[embedded_pdf](${node.getAttribute('data')})`; + } + return ''; + }, + }; + if (options.convertEmbeddedPdfsToLinks) { + turndown.addRule('pdf', pdfRule); + } let md = turndown.turndown(html); if (options.baseUrl) md = markdownUtils.prependBaseUrl(md, options.baseUrl); return md; diff --git a/packages/lib/htmlUtils.ts b/packages/lib/htmlUtils.ts index fff72e3eca..c5bcf66a64 100644 --- a/packages/lib/htmlUtils.ts +++ b/packages/lib/htmlUtils.ts @@ -7,6 +7,9 @@ const { escapeHtml } = require('./string-utils.js'); // https://stackoverflow.com/a/16119722/561309 const imageRegex = //gi; const anchorRegex = //gi; +const embedRegex = //gi; +const objectRegex = //gi; +const pdfUrlRegex = /[\s\S]*?\.pdf$/i; const selfClosingElements = [ 'area', @@ -61,6 +64,11 @@ class HtmlUtils { return this.extractUrls(imageRegex, html); } + // Returns the **encoded** URLs, so to be useful they should be decoded again before use. + public extractPdfUrls(html: string) { + return [...this.extractUrls(embedRegex, html), ...this.extractUrls(objectRegex, html)].filter(url => pdfUrlRegex.test(url)); + } + // Returns the **encoded** URLs, so to be useful they should be decoded again before use. public extractAnchorUrls(html: string) { return this.extractUrls(anchorRegex, html); @@ -87,6 +95,27 @@ class HtmlUtils { }); } + public replaceEmbedUrls(html: string, callback: Function) { + if (!html) return ''; + // We are adding the link as since joplin disabled , tags due to security reasons. + // See: CVE-2020-15930 + html = html.replace(embedRegex, (_v: string, _before: string, src: string, _after: string) => { + const link = callback(src); + return `${escapeHtml(src)}`; + }); + html = html.replace(objectRegex, (_v: string, _before: string, src: string, _after: string) => { + const link = callback(src); + return `${escapeHtml(src)}`; + }); + return html; + } + + public replaceMediaUrls(html: string, callback: Function) { + html = this.replaceImageUrls(html, callback); + html = this.replaceEmbedUrls(html, callback); + return html; + } + // Note that the URLs provided by this function are URL-encoded, which is // usually what you want for web URLs. But if they are file:// URLs and the // file path is going to be used, it will need to be unescaped first. The diff --git a/packages/lib/markdownUtils.ts b/packages/lib/markdownUtils.ts index d13c9bee8a..48cfafe2f5 100644 --- a/packages/lib/markdownUtils.ts +++ b/packages/lib/markdownUtils.ts @@ -69,7 +69,7 @@ const markdownUtils = { }, // Returns the **encoded** URLs, so to be useful they should be decoded again before use. - extractFileUrls(md: string, onlyImage: boolean = false): Array { + extractFileUrls(md: string, onlyType: string = null): Array { const markdownIt = new MarkdownIt(); markdownIt.validateLink = validateLinks; // Necessary to support file:/// links @@ -77,10 +77,16 @@ const markdownUtils = { const tokens = markdownIt.parse(md, env); const output: string[] = []; + let linkType = onlyType; + if (linkType === 'pdf') linkType = 'link_open'; + const searchUrls = (tokens: any[]) => { for (let i = 0; i < tokens.length; i++) { const token = tokens[i]; - if ((onlyImage === true && token.type === 'image') || (onlyImage === false && (token.type === 'image' || token.type === 'link_open'))) { + if ((!onlyType && (token.type === 'link_open' || token.type === 'image')) || (!!onlyType && token.type === onlyType) || (onlyType == 'pdf' && token.type === 'link_open')) { + // Pdf embeds are a special case, they are represented as 'link_open' tokens but are marked with 'embedded_pdf' as link name by the parser + // We are making sure if its in the proper pdf link format, only then we add it to the list + if (onlyType === 'pdf' && !(tokens.length > i + 1 && tokens[i + 1].type === 'text' && tokens[i + 1].content === 'embedded_pdf')) continue; for (let j = 0; j < token.attrs.length; j++) { const a = token.attrs[j]; if ((a[0] === 'src' || a[0] === 'href') && a.length >= 2 && a[1]) { @@ -107,7 +113,11 @@ const markdownUtils = { }, extractImageUrls(md: string) { - return markdownUtils.extractFileUrls(md,true); + return markdownUtils.extractFileUrls(md, 'image'); + }, + + extractPdfUrls(md: string) { + return markdownUtils.extractFileUrls(md, 'pdf'); }, // The match results has 5 items diff --git a/packages/lib/markupLanguageUtils.ts b/packages/lib/markupLanguageUtils.ts index 55f2409c78..b68eb05138 100644 --- a/packages/lib/markupLanguageUtils.ts +++ b/packages/lib/markupLanguageUtils.ts @@ -28,6 +28,17 @@ export class MarkupLanguageUtils { return urls; } + public extractPdfUrls(language: MarkupLanguage, text: string): string[] { + let urls: string[] = []; + if (language === MarkupLanguage.Any) { + urls = urls.concat(this.lib_(MarkupLanguage.Markdown).extractPdfUrls(text)); + urls = urls.concat(this.lib_(MarkupLanguage.Html).extractPdfUrls(text)); + } else { + urls = this.lib_(language).extractPdfUrls(text); + } + return urls; + } + // Create a new MarkupToHtml instance while injecting options specific to Joplin // desktop and mobile applications. public newMarkupToHtml(_plugins: PluginStates = null, options: Options = null) { diff --git a/packages/lib/services/rest/Api.test.ts b/packages/lib/services/rest/Api.test.ts index b962f1df9a..f56d761005 100644 --- a/packages/lib/services/rest/Api.test.ts +++ b/packages/lib/services/rest/Api.test.ts @@ -1,5 +1,6 @@ import { PaginationOrderDir } from '../../models/utils/types'; import Api, { RequestMethod } from '../../services/rest/Api'; +import { extractMediaUrls } from './routes/notes'; import shim from '../../shim'; import { setupDatabaseAndSynchronizer, switchClient, checkThrowAsync, db, msleep, supportDir } from '../../testing/test-utils'; import Folder from '../../models/Folder'; @@ -9,6 +10,7 @@ import Tag from '../../models/Tag'; import NoteTag from '../../models/NoteTag'; import ResourceService from '../../services/ResourceService'; import SearchEngine from '../../services/searchengine/SearchEngine'; +const { MarkupToHtml } = require('@joplin/renderer'); import { ResourceEntity } from '../database/types'; const createFolderForPagination = async (num: number, time: number) => { @@ -452,6 +454,47 @@ describe('services_rest_Api', function() { expect(response.body).toBe('**Bold text**'); })); + it('should extract media urls from body', (() => { + const tests = [ + { + language: MarkupToHtml.MARKUP_LANGUAGE_HTML, + body: '
', + result: ['https://example.com/img.png', 'https://example.com/sample.pdf', 'https://example.com/file.PDF'], + }, + { + language: MarkupToHtml.MARKUP_LANGUAGE_MARKDOWN, + body: 'test text \n ![img 1](https://example.com/img1.png) [embedded_pdf](https://example.com/sample1.pdf) [embedded_pdf](https://example.com/file.PDF)', + result: ['https://example.com/img1.png', 'https://example.com/sample1.pdf', 'https://example.com/file.PDF'], + }, + { + language: MarkupToHtml.MARKUP_LANGUAGE_HTML, + body: '', + result: [], + }, + ]; + tests.forEach((test) => { + const urls = extractMediaUrls(test.language, test.body); + expect(urls).toEqual(test.result); + }); + })); + + it('should create notes with pdf embeds', (async () => { + let response = null; + const f = await Folder.save({ title: 'pdf test1' }); + + response = await api.route(RequestMethod.POST, 'notes', null, JSON.stringify({ + title: 'testing PDF embeds', + parent_id: f.id, + body_html: `
`, + })); + + const resources = await Resource.all(); + expect(resources.length).toBe(1); + + const resource = resources[0]; + expect(response.body.indexOf(resource.id) >= 0).toBe(true); + })); + it('should handle tokens', (async () => { api = new Api('mytoken'); diff --git a/packages/lib/services/rest/routes/notes.ts b/packages/lib/services/rest/routes/notes.ts index 426ad69c92..2a8f4def40 100644 --- a/packages/lib/services/rest/routes/notes.ts +++ b/packages/lib/services/rest/routes/notes.ts @@ -89,6 +89,7 @@ async function requestNoteToNote(requestNote: any) { output.body = await htmlToMdParser().parse(`
${requestNote.body_html}
`, { baseUrl: baseUrl, anchorNames: requestNote.anchor_names ? requestNote.anchor_names : [], + convertEmbeddedPdfsToLinks: true, }); output.markup_language = MarkupToHtml.MARKUP_LANGUAGE_MARKDOWN; } @@ -143,19 +144,20 @@ async function buildNoteStyleSheet(stylesheets: any[]) { return output; } -async function tryToGuessImageExtFromMimeType(response: any, imagePath: string) { +async function tryToGuessExtFromMimeType(response: any, mediaPath: string) { const mimeType = mimeTypeFromHeaders(response.headers); - if (!mimeType) return imagePath; + if (!mimeType) return mediaPath; const newExt = mimeUtils.toFileExtension(mimeType); - if (!newExt) return imagePath; + if (!newExt) return mediaPath; - const newImagePath = `${imagePath}.${newExt}`; - await shim.fsDriver().move(imagePath, newImagePath); - return newImagePath; + const newMediaPath = `${mediaPath}.${newExt}`; + await shim.fsDriver().move(mediaPath, newMediaPath); + return newMediaPath; } -async function downloadImage(url: string /* , allowFileProtocolImages */) { +async function downloadMediaFile(url: string /* , allowFileProtocolImages */) { + const tempDir = Setting.value('tempDir'); // The URL we get to download have been extracted from the Markdown document @@ -163,6 +165,12 @@ async function downloadImage(url: string /* , allowFileProtocolImages */) { const isDataUrl = url && url.toLowerCase().indexOf('data:') === 0; + // PDFs and other heavy resoucres are often served as seperate files insted of data urls, its very unlikely to encounter a pdf as a data url + if (isDataUrl && !url.toLowerCase().startsWith('data:image/')) { + reg.logger().warn(`Resources in data URL format is only supported for images ${url}`); + return ''; + } + const name = isDataUrl ? md5(`${Math.random()}_${Date.now()}`) : filename(url); let fileExt = isDataUrl ? mimeUtils.toFileExtension(mimeUtils.fromDataUrl(url)) : safeFileExtension(fileExtension(url).toLowerCase()); if (!mimeUtils.fromFileExtension(fileExt)) fileExt = ''; // If the file extension is unknown - clear it. @@ -170,38 +178,38 @@ async function downloadImage(url: string /* , allowFileProtocolImages */) { // Append a UUID because simply checking if the file exists is not enough since // multiple resources can be downloaded at the same time (race condition). - let imagePath = `${tempDir}/${safeFilename(name)}_${uuid.create()}${fileExt}`; + let mediaPath = `${tempDir}/${safeFilename(name)}_${uuid.create()}${fileExt}`; try { if (isDataUrl) { - await shim.imageFromDataUrl(url, imagePath); + await shim.imageFromDataUrl(url, mediaPath); } else if (urlUtils.urlProtocol(url).toLowerCase() === 'file:') { // Can't think of any reason to disallow this at this point // if (!allowFileProtocolImages) throw new Error('For security reasons, this URL with file:// protocol cannot be downloaded'); const localPath = fileUriToPath(url); - await shim.fsDriver().copy(localPath, imagePath); + await shim.fsDriver().copy(localPath, mediaPath); } else { - const response = await shim.fetchBlob(url, { path: imagePath, maxRetry: 1 }); + const response = await shim.fetchBlob(url, { path: mediaPath, maxRetry: 1 }); // If we could not find the file extension from the URL, try to get it // now based on the Content-Type header. - if (!fileExt) imagePath = await tryToGuessImageExtFromMimeType(response, imagePath); + if (!fileExt) mediaPath = await tryToGuessExtFromMimeType(response, mediaPath); } - return imagePath; + return mediaPath; } catch (error) { reg.logger().warn(`Cannot download image at ${url}`, error); return ''; } } -async function downloadImages(urls: string[] /* , allowFileProtocolImages:boolean */) { +async function downloadMediaFiles(urls: string[] /* , allowFileProtocolImages:boolean */) { const PromisePool = require('es6-promise-pool'); const output: any = {}; const downloadOne = async (url: string) => { - const imagePath = await downloadImage(url); // , allowFileProtocolImages); - if (imagePath) output[url] = { path: imagePath, originalUrl: url }; + const mediaPath = await downloadMediaFile(url); // , allowFileProtocolImages); + if (mediaPath) output[url] = { path: mediaPath, originalUrl: url }; }; let urlIndex = 0; @@ -245,27 +253,38 @@ async function removeTempFiles(urls: string[]) { } } -function replaceImageUrlsByResources(markupLanguage: number, md: string, urls: any, imageSizes: any) { +function replaceUrlsByResources(markupLanguage: number, md: string, urls: any, imageSizes: any) { const imageSizesIndexes: any = {}; if (markupLanguage === MarkupToHtml.MARKUP_LANGUAGE_HTML) { - return htmlUtils.replaceImageUrls(md, (imageUrl: string) => { - const urlInfo: any = urls[imageUrl]; - if (!urlInfo || !urlInfo.resource) return imageUrl; + return htmlUtils.replaceMediaUrls(md, (url: string) => { + const urlInfo: any = urls[url]; + if (!urlInfo || !urlInfo.resource) return url; return Resource.internalUrl(urlInfo.resource); }); } else { // eslint-disable-next-line no-useless-escape - return md.replace(/(!\[.*?\]\()([^\s\)]+)(.*?\))/g, (_match: any, before: string, imageUrl: string, after: string) => { - const urlInfo = urls[imageUrl]; - if (!urlInfo || !urlInfo.resource) return before + imageUrl + after; - if (!(urlInfo.originalUrl in imageSizesIndexes)) imageSizesIndexes[urlInfo.originalUrl] = 0; + return md.replace(/(!?\[.*?\]\()([^\s\)]+)(.*?\))/g, (_match: any, before: string, url: string, after: string) => { + let type = 'link'; + if (before.startsWith('[embedded_pdf]')) { + type = 'pdf'; + } else if (before.startsWith('![')) { + type = 'image'; + } + + const urlInfo = urls[url]; + if (type === 'link' || !urlInfo || !urlInfo.resource) return before + url + after; const resourceUrl = Resource.internalUrl(urlInfo.resource); - const imageSizesCollection = imageSizes[urlInfo.originalUrl]; + if (type === 'pdf') { + return `[${markdownUtils.escapeLinkUrl(url)}](${resourceUrl}${after}`; + } + if (!(urlInfo.originalUrl in imageSizesIndexes)) imageSizesIndexes[urlInfo.originalUrl] = 0; + const imageSizesCollection = imageSizes[urlInfo.originalUrl]; if (!imageSizesCollection) { - // In some cases, we won't find the image size information for that particular URL. Normally + // Either its not an image or we don't know the size of the image + // In some cases, we won't find the image size information for that particular image URL. Normally // it will only happen when using the "Clip simplified page" feature, which can modify the // image URLs (for example it will select a smaller size resolution). In that case, it's // fine to return the image as-is because it has already good dimensions. @@ -284,6 +303,13 @@ function replaceImageUrlsByResources(markupLanguage: number, md: string, urls: a } } +export function extractMediaUrls(markupLanguage: number, text: string): string[] { + const urls: string[] = []; + urls.push(...ArrayUtils.unique(markupLanguageUtils.extractImageUrls(markupLanguage, text))); + urls.push(...ArrayUtils.unique(markupLanguageUtils.extractPdfUrls(markupLanguage, text))); + return urls; +} + // Note must have been saved first async function attachImageFromDataUrl(note: any, imageDataUrl: string, cropRect: any) { const tempDir = Setting.value('tempDir'); @@ -328,17 +354,17 @@ export default async function(request: Request, id: string = null, link: string let note: any = await requestNoteToNote(requestNote); - const imageUrls = ArrayUtils.unique(markupLanguageUtils.extractImageUrls(note.markup_language, note.body)); + const mediaUrls = extractMediaUrls(note.markup_language, note.body); - reg.logger().info(`Request (${requestId}): Downloading images: ${imageUrls.length}`); + reg.logger().info(`Request (${requestId}): Downloading media files: ${mediaUrls.length}`); - let result = await downloadImages(imageUrls); // , allowFileProtocolImages); + let result = await downloadMediaFiles(mediaUrls); // , allowFileProtocolImages); reg.logger().info(`Request (${requestId}): Creating resources from paths: ${Object.getOwnPropertyNames(result).length}`); result = await createResourcesFromPaths(result); await removeTempFiles(result); - note.body = replaceImageUrlsByResources(note.markup_language, note.body, result, imageSizes); + note.body = replaceUrlsByResources(note.markup_language, note.body, result, imageSizes); reg.logger().info(`Request (${requestId}): Saving note...`); From c8b6122a656f7051dd378c8b5e3d9ec88e3788be Mon Sep 17 00:00:00 2001 From: SFulpius <36622934+SFulpius@users.noreply.github.com> Date: Mon, 20 Jun 2022 15:29:32 +0200 Subject: [PATCH 03/38] Desktop: Resolves #6172: Checkbox don't function while checkbox format button hidden from toolbar (#6567) --- .../TinyMCE/JoplinLists/src/main/ts/Plugin.ts | 2 ++ .../JoplinLists/src/main/ts/core/Mouse.ts | 26 ++++++++++++++++ .../JoplinLists/src/main/ts/ui/Buttons.ts | 30 ++----------------- .../NoteBody/TinyMCE/plugins/lists.js | 25 ++++++++-------- 4 files changed, 42 insertions(+), 41 deletions(-) create mode 100644 Assets/TinyMCE/JoplinLists/src/main/ts/core/Mouse.ts diff --git a/Assets/TinyMCE/JoplinLists/src/main/ts/Plugin.ts b/Assets/TinyMCE/JoplinLists/src/main/ts/Plugin.ts index 265b95f9dd..f8ac3b4117 100644 --- a/Assets/TinyMCE/JoplinLists/src/main/ts/Plugin.ts +++ b/Assets/TinyMCE/JoplinLists/src/main/ts/Plugin.ts @@ -9,11 +9,13 @@ import PluginManager from 'tinymce/core/api/PluginManager'; import * as Api from './api/Api'; import * as Commands from './api/Commands'; import * as Keyboard from './core/Keyboard'; +import * as Mouse from './core/Mouse' import * as Buttons from './ui/Buttons'; export default function () { PluginManager.add('joplinLists', function (editor) { Keyboard.setup(editor); + Mouse.setup(editor); Buttons.register(editor); Commands.register(editor); diff --git a/Assets/TinyMCE/JoplinLists/src/main/ts/core/Mouse.ts b/Assets/TinyMCE/JoplinLists/src/main/ts/core/Mouse.ts new file mode 100644 index 0000000000..3f1859f21b --- /dev/null +++ b/Assets/TinyMCE/JoplinLists/src/main/ts/core/Mouse.ts @@ -0,0 +1,26 @@ +import { isJoplinChecklistItem } from '../listModel/JoplinListUtil'; + + +const setup = function (editor) { + const editorClickHandler = (event) => { + if (!isJoplinChecklistItem(event.target)) return; + + // We only process the click if it's within the checkbox itself (and not the label). + // That checkbox, based on + // the current styling is in the negative margin, so offsetX is negative when clicking + // on the checkbox itself, and positive when clicking on the label. This is strongly + // dependent on how the checkbox is styled, so if the style is changed, this might need + // to be updated too. + // For the styling, see: + // packages/renderer/MdToHtml/rules/checkbox.ts + // + // The previous solution was to use "pointer-event: none", which mostly work, however + // it means that links are no longer clickable when they are within the checkbox label. + if (event.offsetX >= 0) return; + + editor.execCommand('ToggleJoplinChecklistItem', false, { element: event.target }); + } + editor.on('click', editorClickHandler); +}; + +export { setup }; \ No newline at end of file diff --git a/Assets/TinyMCE/JoplinLists/src/main/ts/ui/Buttons.ts b/Assets/TinyMCE/JoplinLists/src/main/ts/ui/Buttons.ts index 1f0558e7f3..1e48b38324 100644 --- a/Assets/TinyMCE/JoplinLists/src/main/ts/ui/Buttons.ts +++ b/Assets/TinyMCE/JoplinLists/src/main/ts/ui/Buttons.ts @@ -10,7 +10,7 @@ import * as Settings from '../api/Settings'; import * as NodeType from '../core/NodeType'; import Editor from 'tinymce/core/api/Editor'; import { isCustomList } from '../core/Util'; -import { findContainerListTypeFromEvent, isJoplinChecklistItem } from '../listModel/JoplinListUtil'; +import { findContainerListTypeFromEvent } from '../listModel/JoplinListUtil'; const findIndex = function (list, predicate) { for (let index = 0; index < list.length; index++) { @@ -38,37 +38,11 @@ const listState = function (editor: Editor, listName, options:any = {}) { buttonApi.setActive(listType === options.listType && lists.length > 0 && lists[0].nodeName === listName && !isCustomList(lists[0])); }; - const editorClickHandler = (event) => { - if (!isJoplinChecklistItem(event.target)) return; - - // We only process the click if it's within the checkbox itself (and not the label). - // That checkbox, based on - // the current styling is in the negative margin, so offsetX is negative when clicking - // on the checkbox itself, and positive when clicking on the label. This is strongly - // dependent on how the checkbox is styled, so if the style is changed, this might need - // to be updated too. - // For the styling, see: - // packages/renderer/MdToHtml/rules/checkbox.ts - // - // The previous solution was to use "pointer-event: none", which mostly work, however - // it means that links are no longer clickable when they are within the checkbox label. - if (event.offsetX >= 0) return; - - editor.execCommand('ToggleJoplinChecklistItem', false, { element: event.target }); - } - - if (options.listType === 'joplinChecklist') { - editor.on('click', editorClickHandler); - } - editor.on('NodeChange', nodeChangeHandler); return () => { - if (options.listType === 'joplinChecklist') { - editor.off('click', editorClickHandler); - } editor.off('NodeChange', nodeChangeHandler); - } + } }; }; diff --git a/packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/plugins/lists.js b/packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/plugins/lists.js index e4ac5685b1..880abdf6fd 100644 --- a/packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/plugins/lists.js +++ b/packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/plugins/lists.js @@ -2078,6 +2078,17 @@ setup(editor); }; + var setup$2 = function (editor) { + var editorClickHandler = function (event) { + if (!isJoplinChecklistItem(event.target)) + return; + if (event.offsetX >= 0) + return; + editor.execCommand('ToggleJoplinChecklistItem', false, { element: event.target }); + }; + editor.on('click', editorClickHandler); + }; + var findIndex = function (list, predicate) { for (var index = 0; index < list.length; index++) { var element = list[index]; @@ -2100,21 +2111,8 @@ var listType = findContainerListTypeFromEvent(e); buttonApi.setActive(listType === options.listType && lists.length > 0 && lists[0].nodeName === listName && !isCustomList(lists[0])); }; - var editorClickHandler = function (event) { - if (!isJoplinChecklistItem(event.target)) - return; - if (event.offsetX >= 0) - return; - editor.execCommand('ToggleJoplinChecklistItem', false, { element: event.target }); - }; - if (options.listType === 'joplinChecklist') { - editor.on('click', editorClickHandler); - } editor.on('NodeChange', nodeChangeHandler); return function () { - if (options.listType === 'joplinChecklist') { - editor.off('click', editorClickHandler); - } editor.off('NodeChange', nodeChangeHandler); }; }; @@ -2158,6 +2156,7 @@ function Plugin () { PluginManager.add('joplinLists', function (editor) { setup$1(editor); + setup$2(editor); register$1(editor); register(editor); return get(editor); From 21b6564301f799f02398136794aaebb0fd8f8725 Mon Sep 17 00:00:00 2001 From: Henry Heino <46334387+personalizedrefrigerator@users.noreply.github.com> Date: Mon, 20 Jun 2022 06:31:30 -0700 Subject: [PATCH 04/38] Mobile: Fixes #6576: Fix checklist continuation in beta editor (#6577) --- .../components/NoteEditor/CodeMirror.ts | 31 +- packages/app-mobile/package.json | 11 +- yarn.lock | 393 ++++++++---------- 3 files changed, 203 insertions(+), 232 deletions(-) diff --git a/packages/app-mobile/components/NoteEditor/CodeMirror.ts b/packages/app-mobile/components/NoteEditor/CodeMirror.ts index 292a8854cb..60bfedd5cd 100644 --- a/packages/app-mobile/components/NoteEditor/CodeMirror.ts +++ b/packages/app-mobile/components/NoteEditor/CodeMirror.ts @@ -10,10 +10,15 @@ // from NoteEditor.tsx. import { EditorState, Extension } from '@codemirror/state'; -import { EditorView, drawSelection, highlightSpecialChars, ViewUpdate } from '@codemirror/view'; import { markdown } from '@codemirror/lang-markdown'; -import { defaultHighlightStyle, HighlightStyle, tags } from '@codemirror/highlight'; -import { undo, redo, history, undoDepth, redoDepth } from '@codemirror/history'; +import { defaultHighlightStyle, syntaxHighlighting, HighlightStyle } from '@codemirror/language'; +import { tags } from '@lezer/highlight'; +import { EditorView, drawSelection, highlightSpecialChars, ViewUpdate } from '@codemirror/view'; +import { undo, redo, history, undoDepth, redoDepth } from '@codemirror/commands'; + +import { keymap } from '@codemirror/view'; +import { indentOnInput } from '@codemirror/language'; +import { historyKeymap, defaultKeymap } from '@codemirror/commands'; interface CodeMirrorResult { editor: EditorView; @@ -46,7 +51,7 @@ function logMessage(...msg: any[]) { // the app is running. It seems that what appears as ".ͼ1" in the CSS is the // equivalent of "&" in the theme object. So to target ".ͼ1.cm-focused", you'd // use '&.cm-focused' in the theme. -const createTheme = (theme: any): Extension => { +const createTheme = (theme: any): Extension[] => { const isDarkTheme = theme.appearance === 'dark'; const baseGlobalStyle: Record = { @@ -91,7 +96,7 @@ const createTheme = (theme: any): Extension => { fontFamily: theme.fontFamily, }; - const syntaxHighlighting = HighlightStyle.define([ + const highlightingStyle = HighlightStyle.define([ { tag: tags.strong, fontWeight: 'bold', @@ -140,7 +145,11 @@ const createTheme = (theme: any): Extension => { return [ baseTheme, appearanceTheme, - syntaxHighlighting, + syntaxHighlighting(highlightingStyle), + + // If we haven't defined highlighting for tags, fall back + // to the default. + syntaxHighlighting(defaultHighlightStyle, { fallback: true }), ]; }; @@ -168,15 +177,18 @@ export function initCodeMirror(parentElement: any, initialText: string, theme: a const editor = new EditorView({ state: EditorState.create({ + // See https://github.com/codemirror/basic-setup/blob/main/src/codemirror.ts + // for a sample configuration. extensions: [ markdown(), - createTheme(theme), + ...createTheme(theme), history(), drawSelection(), highlightSpecialChars(), + indentOnInput(), + EditorView.lineWrapping, EditorView.contentAttributes.of({ autocapitalize: 'sentence' }), - defaultHighlightStyle.fallback, EditorView.updateListener.of((viewUpdate: ViewUpdate) => { if (viewUpdate.docChanged) { postMessage('onChange', { value: editor.state.doc.toString() }); @@ -190,6 +202,9 @@ export function initCodeMirror(parentElement: any, initialText: string, theme: a postMessage('onSelectionChange', { selection: { start: selStart, end: selEnd } }); } }), + keymap.of([ + ...defaultKeymap, ...historyKeymap, + ]), ], doc: initialText, }), diff --git a/packages/app-mobile/package.json b/packages/app-mobile/package.json index dd7f1f915d..63937e7a1e 100644 --- a/packages/app-mobile/package.json +++ b/packages/app-mobile/package.json @@ -70,12 +70,13 @@ "devDependencies": { "@babel/core": "^7.12.9", "@babel/runtime": "^7.12.5", - "@codemirror/highlight": "^0.18.4", - "@codemirror/history": "^0.18.1", - "@codemirror/lang-markdown": "^0.18.4", - "@codemirror/state": "^0.18.7", - "@codemirror/view": "^0.18.19", + "@codemirror/commands": "^6.0.0", + "@codemirror/lang-markdown": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", "@joplin/tools": "~2.8", + "@lezer/highlight": "^1.0.0", "@rollup/plugin-node-resolve": "^13.0.0", "@rollup/plugin-typescript": "^8.2.1", "@types/node": "^14.14.6", diff --git a/yarn.lock b/yarn.lock index 65af220871..5b3b26e34d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2084,184 +2084,126 @@ __metadata: languageName: node linkType: hard -"@codemirror/autocomplete@npm:^0.18.0": - version: 0.18.8 - resolution: "@codemirror/autocomplete@npm:0.18.8" +"@codemirror/autocomplete@npm:^6.0.0": + version: 6.0.1 + resolution: "@codemirror/autocomplete@npm:6.0.1" dependencies: - "@codemirror/language": ^0.18.0 - "@codemirror/state": ^0.18.0 - "@codemirror/text": ^0.18.0 - "@codemirror/tooltip": ^0.18.4 - "@codemirror/view": ^0.18.0 - lezer-tree: ^0.13.0 - checksum: d4a1dae7f0c29714d916de7474bf7e58059b91d3cceebff67095478dff85af7b72d28f303abf8ca15b531763a516823c091cb6390f9120b5e74c2ecd6e85a1df + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + checksum: 2181ceb416461e6fdd0e1fa882b8b80db63002d32318946e116c3dd982b4e6aa461e4d0e33d336fb872acd66783988109043293ba95021ef6300eadc79c8ddd5 languageName: node linkType: hard -"@codemirror/highlight@npm:^0.18.0, @codemirror/highlight@npm:^0.18.4": - version: 0.18.4 - resolution: "@codemirror/highlight@npm:0.18.4" +"@codemirror/commands@npm:^6.0.0": + version: 6.0.0 + resolution: "@codemirror/commands@npm:6.0.0" dependencies: - "@codemirror/language": ^0.18.0 - "@codemirror/rangeset": ^0.18.0 - "@codemirror/state": ^0.18.0 - "@codemirror/view": ^0.18.0 - lezer-tree: ^0.13.0 + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + checksum: 5b3bac420635316f9fb324e38b76a281a4d1425f80e6a5e66a34cf1508414e5d182f494e3c30936b27f86aa67403c1af4137bca5df0f0e53b2a4baa49a25caf2 + languageName: node + linkType: hard + +"@codemirror/lang-css@npm:^6.0.0": + version: 6.0.0 + resolution: "@codemirror/lang-css@npm:6.0.0" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@lezer/css": ^1.0.0 + checksum: 855a040ec2e22cf074fe1ef433488911b6f628878cdaf94c6deaa30df188860bfbf0f629ca339b56ad66549f00c8011df81d570245266c86ad8311367a448f92 + languageName: node + linkType: hard + +"@codemirror/lang-html@npm:^6.0.0": + version: 6.0.0 + resolution: "@codemirror/lang-html@npm:6.0.0" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/lang-css": ^6.0.0 + "@codemirror/lang-javascript": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@lezer/common": ^1.0.0 + "@lezer/html": ^1.0.0 + checksum: 1cb0aa2ed481d2ef644a23afc8a706f745201c67a22da6f214cdaff1b2c7173e8933dfb9f3b60522b777cdcdd74cb5f88786ef4df61e6a640439eb155cc1c777 + languageName: node + linkType: hard + +"@codemirror/lang-javascript@npm:^6.0.0": + version: 6.0.0 + resolution: "@codemirror/lang-javascript@npm:6.0.0" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/lint": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + "@lezer/javascript": ^1.0.0 + checksum: 6ec2f286c685b8e6556e207fb278637b8918a763344504c8e13c8a00bef06bc05e744858df9c21fbd47cb01bb7a4cbeb7bb5ef6ba2608eb57dfe1b8192d6736e + languageName: node + linkType: hard + +"@codemirror/lang-markdown@npm:^6.0.0": + version: 6.0.0 + resolution: "@codemirror/lang-markdown@npm:6.0.0" + dependencies: + "@codemirror/lang-html": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + "@lezer/markdown": ^1.0.0 + checksum: 5cb9ee7053e758745e9376b67d4b22011329f3f74d8642870567d307018a0e823be8d8f59dac2002704f04908e329cb1bd206bcbcfd8111572e0a7e7819cb890 + languageName: node + linkType: hard + +"@codemirror/language@npm:^6.0.0": + version: 6.0.0 + resolution: "@codemirror/language@npm:6.0.0" + dependencies: + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 style-mod: ^4.0.0 - checksum: b2fc61bae12e74fa901ac06bf43907be80f01e3594d786bbb382b250aa4626e77cbd7ef8f15deba6d8770eb8731bf5bdd5ebf4b9556f44f0f10ee9fecf537769 + checksum: b98844f221ef5a1f8fb4ef1c74891056b7a4c063d1373a45cfb4ac0add080decc4f5a90650fad0112fe91f969f535008351b1d6c440826e80ccee0c7aaeeb0f8 languageName: node linkType: hard -"@codemirror/history@npm:^0.18.1": - version: 0.18.1 - resolution: "@codemirror/history@npm:0.18.1" +"@codemirror/lint@npm:^6.0.0": + version: 6.0.0 + resolution: "@codemirror/lint@npm:6.0.0" dependencies: - "@codemirror/state": ^0.18.3 - "@codemirror/view": ^0.18.0 - checksum: 8e1909dbfd32ee3706d688f1b8a05e382f1426c09829c25c51c53858d0357ae9ceffac49996c716d0c381e5b3af47085ba815597a54368232dabd8966f66c718 - languageName: node - linkType: hard - -"@codemirror/lang-css@npm:^0.18.0": - version: 0.18.0 - resolution: "@codemirror/lang-css@npm:0.18.0" - dependencies: - "@codemirror/autocomplete": ^0.18.0 - "@codemirror/highlight": ^0.18.0 - "@codemirror/language": ^0.18.0 - "@codemirror/state": ^0.18.0 - lezer-css: ^0.13.0 - checksum: d04fbde9383aeaaa428bbdd6957e8d3e564fc82ffa67ecdbcb42199becac6f7f169edc2950104c9e41e00879b2371e3fc27383dfa48a5b19e9ab2547fd8517c6 - languageName: node - linkType: hard - -"@codemirror/lang-html@npm:^0.18.0": - version: 0.18.1 - resolution: "@codemirror/lang-html@npm:0.18.1" - dependencies: - "@codemirror/autocomplete": ^0.18.0 - "@codemirror/highlight": ^0.18.0 - "@codemirror/lang-css": ^0.18.0 - "@codemirror/lang-javascript": ^0.18.0 - "@codemirror/language": ^0.18.0 - "@codemirror/state": ^0.18.0 - lezer-html: ^0.13.5 - lezer-tree: ^0.13.0 - checksum: 3b58629480593325add02ec312f350bd4b25f53edf279fe63123336445791f73617157dbbb5b9ff427d37810dabac4ae18151766e70c512f22d767b1fa161a80 - languageName: node - linkType: hard - -"@codemirror/lang-javascript@npm:^0.18.0": - version: 0.18.0 - resolution: "@codemirror/lang-javascript@npm:0.18.0" - dependencies: - "@codemirror/autocomplete": ^0.18.0 - "@codemirror/highlight": ^0.18.0 - "@codemirror/language": ^0.18.0 - "@codemirror/lint": ^0.18.0 - "@codemirror/state": ^0.18.0 - "@codemirror/view": ^0.18.0 - lezer-javascript: ^0.13.0 - checksum: b05487726fde3c96aeafdb7d9ed2e51401cd8582c4370b86bcbf67b4212099e28649f0284b7d094730bfd252eb1a046208e51dcc8ae6ce3a2487d103149adb90 - languageName: node - linkType: hard - -"@codemirror/lang-markdown@npm:^0.18.4": - version: 0.18.4 - resolution: "@codemirror/lang-markdown@npm:0.18.4" - dependencies: - "@codemirror/highlight": ^0.18.4 - "@codemirror/lang-html": ^0.18.0 - "@codemirror/language": ^0.18.1 - "@codemirror/state": ^0.18.0 - "@codemirror/view": ^0.18.0 - lezer-markdown: ^0.14.3 - lezer-tree: ^0.13.0 - checksum: 85d50205339bd9c0fb0a6488e26f57b60273f506dde440b39b5d5e1700105a6bb82e55aae17f2e14dad2f31a79fd605b7c004eaa6194a6e490fec62b14657163 - languageName: node - linkType: hard - -"@codemirror/language@npm:^0.18.0, @codemirror/language@npm:^0.18.1": - version: 0.18.2 - resolution: "@codemirror/language@npm:0.18.2" - dependencies: - "@codemirror/state": ^0.18.0 - "@codemirror/text": ^0.18.0 - "@codemirror/view": ^0.18.0 - lezer: ^0.13.4 - lezer-tree: ^0.13.0 - checksum: 15532dee7a18dacc03e0b50943fbee1c3b6d9cbdfa242af7e89842ce716ea30bcce4e3b85ba79274dbdc7925c06ae6ef64e55878d5c3829e2fa14471d8dd297c - languageName: node - linkType: hard - -"@codemirror/lint@npm:^0.18.0": - version: 0.18.6 - resolution: "@codemirror/lint@npm:0.18.6" - dependencies: - "@codemirror/panel": ^0.18.1 - "@codemirror/state": ^0.18.0 - "@codemirror/tooltip": ^0.18.4 - "@codemirror/view": ^0.18.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 crelt: ^1.0.5 - checksum: bf4246210fd9c953028cda35447e86f4ad7e89d721e600aa3dff526e3be89dadba3761a9701c4cb75e7428a73039ecebf5bc28b3b174ffe67cfea6eeaa5ae7d3 + checksum: e1da165ad3a60c70e99c2d26a3ae3beb8392600a9147d15502c740d9259ef3d866c78f7dd2b5b1389153bf015c9c2bc115026d5c9f4433ca647679a1f095cc40 languageName: node linkType: hard -"@codemirror/panel@npm:^0.18.1": - version: 0.18.2 - resolution: "@codemirror/panel@npm:0.18.2" +"@codemirror/state@npm:^6.0.0": + version: 6.0.0 + resolution: "@codemirror/state@npm:6.0.0" + checksum: 7f6286d8e8b8c5e7018f9ee81943b35324150fd15ccc77ae220b904a73e10fa480ab51a89663d956a9c2fae70b13d754da0bf535092759158cc3707743aa236f + languageName: node + linkType: hard + +"@codemirror/view@npm:^6.0.0": + version: 6.0.0 + resolution: "@codemirror/view@npm:6.0.0" dependencies: - "@codemirror/state": ^0.18.0 - "@codemirror/view": ^0.18.0 - checksum: 0ad48039e663e5671d10f1f7c4c0679e5db113b3ecb3ce92c78471a7b957a1a0b8eb594539aea731d007bf4896e2519ea814d992253fb9cafe8bf24d7e582802 - languageName: node - linkType: hard - -"@codemirror/rangeset@npm:^0.18.0, @codemirror/rangeset@npm:^0.18.2": - version: 0.18.5 - resolution: "@codemirror/rangeset@npm:0.18.5" - dependencies: - "@codemirror/state": ^0.18.0 - checksum: 26c0ff4d49e1910180862f311ea735cb0bca360e2fdfd6a57d15ee045ce2fa11e5fa969425e735a7292bace7af79f1a4534a04a2c95c0649fc5d2ccc334e56cb - languageName: node - linkType: hard - -"@codemirror/state@npm:^0.18.0, @codemirror/state@npm:^0.18.3, @codemirror/state@npm:^0.18.7": - version: 0.18.7 - resolution: "@codemirror/state@npm:0.18.7" - dependencies: - "@codemirror/text": ^0.18.0 - checksum: d01d70527691483d2ec59f90556215311e56d25977c8c79d472392128bb1ae935a89e674ff80d457155f61def1e14e565b7850ec38282c0d94f4c0d4c201d6c2 - languageName: node - linkType: hard - -"@codemirror/text@npm:^0.18.0, @codemirror/text@npm:^0.18.1": - version: 0.18.1 - resolution: "@codemirror/text@npm:0.18.1" - checksum: 988c060bb8d399a55e23f4109edb4236da148a3a189a63b455c18ecd79b1a8f21059e1031d51ce8c43fa2597e980865837b2e04b6043835811fdde6917c5e27d - languageName: node - linkType: hard - -"@codemirror/tooltip@npm:^0.18.4": - version: 0.18.4 - resolution: "@codemirror/tooltip@npm:0.18.4" - dependencies: - "@codemirror/state": ^0.18.0 - "@codemirror/view": ^0.18.0 - checksum: 345960ff24f169dd950d8c7f9273e9b3e1c3c130cd424bc5cd73e109118539b22ff89912337518ced54bde6c4b0064e6b0ff086e7f763303c9aae9b80b0a91f8 - languageName: node - linkType: hard - -"@codemirror/view@npm:^0.18.0, @codemirror/view@npm:^0.18.19": - version: 0.18.19 - resolution: "@codemirror/view@npm:0.18.19" - dependencies: - "@codemirror/rangeset": ^0.18.2 - "@codemirror/state": ^0.18.0 - "@codemirror/text": ^0.18.1 + "@codemirror/state": ^6.0.0 style-mod: ^4.0.0 w3c-keyname: ^2.2.4 - checksum: 9fb720b8342383c6498f057893e75fb1dcd48749f1731f5da3494843f162bf67201bb00f0c53492041382e9bd2a5e1ed714472392f80f43422737cd751ff6073 + checksum: 1029fbf3d249ca0f2425dfba6a1db517e77ca06274a0b8886903bf88456d6b6f25df1b2029e7824775b71709617a83623daeb8afd329a8ee3f60ca4f704a50fa languageName: node linkType: hard @@ -3316,14 +3258,15 @@ __metadata: dependencies: "@babel/core": ^7.12.9 "@babel/runtime": ^7.12.5 - "@codemirror/highlight": ^0.18.4 - "@codemirror/history": ^0.18.1 - "@codemirror/lang-markdown": ^0.18.4 - "@codemirror/state": ^0.18.7 - "@codemirror/view": ^0.18.19 + "@codemirror/commands": ^6.0.0 + "@codemirror/lang-markdown": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 "@joplin/lib": ~2.8 "@joplin/renderer": ~2.8 "@joplin/tools": ~2.8 + "@lezer/highlight": ^1.0.0 "@react-native-community/clipboard": ^1.5.0 "@react-native-community/datetimepicker": ^3.0.3 "@react-native-community/geolocation": ^2.0.2 @@ -4530,6 +4473,71 @@ __metadata: languageName: node linkType: hard +"@lezer/common@npm:^1.0.0": + version: 1.0.0 + resolution: "@lezer/common@npm:1.0.0" + checksum: 0ba652b39f9ff073a6a8a3376a74279f2c2d2ccdd4d2bb57c7b607341dbdbf64baf9c23a196314f09349d175623bc73a6a0b6a0eeb2cc63f3a1190fd631f7c31 + languageName: node + linkType: hard + +"@lezer/css@npm:^1.0.0": + version: 1.0.0 + resolution: "@lezer/css@npm:1.0.0" + dependencies: + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 094b178254c509b3236d0e3a5c21831d5cfe00884328a6990dcb8aa913f5096ad37ed1b4adce9d7cc2d8a1b14bac1f7b8e6455a23249d9a5fbd9ee6c094f75a2 + languageName: node + linkType: hard + +"@lezer/highlight@npm:^1.0.0": + version: 1.0.0 + resolution: "@lezer/highlight@npm:1.0.0" + dependencies: + "@lezer/common": ^1.0.0 + checksum: 9ce6c4ea041598e2500f11610e74163eba0361954df8dbf5d12b96dc8b5ab5da8af2defda7ff5728ca460d49f053a7502f2840361bcd8dcf30e8a23f7c30672a + languageName: node + linkType: hard + +"@lezer/html@npm:^1.0.0": + version: 1.0.0 + resolution: "@lezer/html@npm:1.0.0" + dependencies: + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 91e2716ec2850d62238b01c1af4170c1102ecec7c8726fc658182a44de524aa376d2743ee147a8d455d1dde51f0c2255c1993f5a393d6e3aa9e3ac41cc109a2c + languageName: node + linkType: hard + +"@lezer/javascript@npm:^1.0.0": + version: 1.0.0 + resolution: "@lezer/javascript@npm:1.0.0" + dependencies: + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: f6e104791f124e592f7343e4405224cd4a793b688db378b7e7878ddaa1b78525873fadb895fda10b1959fe83a01b498f4c48571eb827c4510b9e1f87f2327970 + languageName: node + linkType: hard + +"@lezer/lr@npm:^1.0.0": + version: 1.0.0 + resolution: "@lezer/lr@npm:1.0.0" + dependencies: + "@lezer/common": ^1.0.0 + checksum: 1365a2d1fa0a40815a03a635506a0215475b778d8b8907d274b8ee4b0732fcb7266799b50db7c4517254da1d245c153c348fd0d7b1db93b7d66926b9c538ee43 + languageName: node + linkType: hard + +"@lezer/markdown@npm:^1.0.0": + version: 1.0.0 + resolution: "@lezer/markdown@npm:1.0.0" + dependencies: + "@lezer/common": ^1.0.0 + "@lezer/highlight": ^1.0.0 + checksum: 6d5ff7df69c720d7d25e7b7e527c678a0958948a4c4e004b1c5d737353d21f4b42a8ce7e02c05ac747b51afe8ca16d6a7f58916110c5d3af511d3752e87f0a02 + languageName: node + linkType: hard + "@malept/cross-spawn-promise@npm:^1.1.0": version: 1.1.1 resolution: "@malept/cross-spawn-promise@npm:1.1.1" @@ -20043,59 +20051,6 @@ __metadata: languageName: node linkType: hard -"lezer-css@npm:^0.13.0": - version: 0.13.1 - resolution: "lezer-css@npm:0.13.1" - dependencies: - lezer: ^0.13.0 - checksum: dd076b0e2da1d086164f266bc5dd8418b0217075bac49d813b56be7c07d12ed6f00f6b36f9bba470dcb05f96328863576b504388f876671c7e8abef08933a703 - languageName: node - linkType: hard - -"lezer-html@npm:^0.13.0, lezer-html@npm:^0.13.5": - version: 0.13.6 - resolution: "lezer-html@npm:0.13.6" - dependencies: - lezer: ^0.13.3 - checksum: 55e5400b9b92fe1febbb91c0bb9804d1bd74350bc737622a90ce8df61a932027317de8808ada15e83f8f80ac9b40288159c13abe00a92c11b9dafa6d778d3a48 - languageName: node - linkType: hard - -"lezer-javascript@npm:^0.13.0": - version: 0.13.4 - resolution: "lezer-javascript@npm:0.13.4" - dependencies: - lezer: ^0.13.0 - checksum: d7fccf15dfb75a055df46adcfd45e96baae68d222221bb8288e504c950a9a17a0fa766d76c9bb227531cf3e50637bd240d3ef9ab9c3f3a99115747d05f7d0642 - languageName: node - linkType: hard - -"lezer-markdown@npm:^0.14.3": - version: 0.14.5 - resolution: "lezer-markdown@npm:0.14.5" - dependencies: - lezer-html: ^0.13.0 - lezer-tree: ^0.13.0 - checksum: 2be06bbc659c1daa938823246105d93ad7a39c43e955ccee1276437630f8807a5af222c0941bd421f7b788c499404e4efc68bd3cc593bccd678884cc872e967a - languageName: node - linkType: hard - -"lezer-tree@npm:^0.13.0, lezer-tree@npm:^0.13.2": - version: 0.13.2 - resolution: "lezer-tree@npm:0.13.2" - checksum: b8be213c780191e0669c7f440aa563218ada762d2cf399b94e755a563cc7da8951929fa3ee65df9ef6586a81223c55cd662e1ec5b49060d892acca4198cf3596 - languageName: node - linkType: hard - -"lezer@npm:^0.13.0, lezer@npm:^0.13.3, lezer@npm:^0.13.4": - version: 0.13.5 - resolution: "lezer@npm:0.13.5" - dependencies: - lezer-tree: ^0.13.2 - checksum: a5c3aa01c539aba3377a927063bcd63b311737a7abfd71ad2c2229ed4e48b7858f2e8e11e925f8f5286c2629251f77dfabf7505ea6c707499cd9917ca90934c8 - languageName: node - linkType: hard - "liftoff@npm:^3.1.0": version: 3.1.0 resolution: "liftoff@npm:3.1.0" From 19f41394703dd5276d89d06636c429d65fdbdff4 Mon Sep 17 00:00:00 2001 From: Jonatan <84130654+reportxx@users.noreply.github.com> Date: Mon, 20 Jun 2022 13:33:28 +0000 Subject: [PATCH 05/38] Update Swedish translation (#6589) --- packages/tools/locales/sv.po | 40 +++++++++++++++--------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/packages/tools/locales/sv.po b/packages/tools/locales/sv.po index f083adb7e0..2ba07445d0 100644 --- a/packages/tools/locales/sv.po +++ b/packages/tools/locales/sv.po @@ -15,6 +15,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" #: packages/app-mobile/components/screens/ConfigScreen.tsx:560 msgid "- Camera: to allow taking a picture and attaching it to a note." @@ -299,9 +301,8 @@ msgid "Also displays unset and hidden config variables." msgstr "Visar även inte inställda och dolda konfigurationsvariabler." #: packages/app-desktop/gui/ShareNoteDialog.tsx:203 -#, fuzzy msgid "Also publish linked notes" -msgstr "Sluta publisera anteckningen" +msgstr "Publicera även länkade anteckningar" #: packages/lib/models/Setting.ts:713 msgid "Always" @@ -874,18 +875,16 @@ msgstr "" "avbryter. Försök igen när du är ansluten till internet." #: packages/app-desktop/gui/PromptDialog.min.js:235 -#, fuzzy msgid "Create" -msgstr "Skapad" +msgstr "Skapa" #: packages/app-mobile/components/note-list.js:101 msgid "Create a notebook" msgstr "Skapar en anteckningsbok" #: packages/app-desktop/gui/MainScreen/commands/addProfile.ts:9 -#, fuzzy msgid "Create new profile..." -msgstr "Skapar en ny anteckning." +msgstr "Skapa ny profil..." #: packages/app-desktop/gui/EditFolderDialog/Dialog.tsx:161 msgid "Create notebook" @@ -1334,7 +1333,7 @@ msgstr "Redigera anteckningsbok" #: packages/app-desktop/commands/editProfileConfig.ts:9 msgid "Edit profile configuration..." -msgstr "" +msgstr "Redigera profilkonfiguration..." #: packages/app-desktop/gui/NoteContentPropertiesDialog.tsx:138 #: packages/lib/models/Setting.ts:876 packages/lib/models/Setting.ts:877 @@ -1364,9 +1363,8 @@ msgstr "Redigerarens monospace teckensnittsfamilj" #: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:100 #: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:96 -#, fuzzy msgid "Editor: %s" -msgstr "Redigerare" +msgstr "Redigerare: %s" #: packages/app-cli/app/command-ls.js:31 msgid "Either \"text\" or \"json\"" @@ -1680,9 +1678,8 @@ msgid "File system" msgstr "Filsystem" #: packages/app-mobile/components/screens/NoteTagsDialog.js:190 -#, fuzzy msgid "Filter tags" -msgstr "Nya taggar:" +msgstr "Filtrera taggar" #: packages/app-desktop/gui/ExtensionBadge.min.js:10 msgid "Firefox Extension" @@ -2807,6 +2804,8 @@ msgid "" "Please click on \"%s\" to proceed, or set the passwords in the \"%s\" list " "below." msgstr "" +"Klicka på \"%s\" för att fortsätta, eller ställ in lösenorden i listan \"%s" +"\" nedan." #: packages/lib/components/EncryptionConfigScreen/utils.ts:65 msgid "" @@ -2965,9 +2964,8 @@ msgid "Profile" msgstr "Profil" #: packages/app-desktop/gui/MainScreen/commands/addProfile.ts:17 -#, fuzzy msgid "Profile name:" -msgstr "Profil" +msgstr "Profilnamn:" #: packages/lib/versionInfo.ts:26 msgid "Profile Version: %s" @@ -3195,9 +3193,8 @@ msgstr "Spara alarm" #: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:100 #: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:93 -#, fuzzy msgid "Save as %s" -msgstr "Spara som..." +msgstr "Spara som %s" #: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:80 msgid "Save as..." @@ -3568,9 +3565,8 @@ msgid "Switch between note and to-do type" msgstr "Växla mellan antecknings- och att-göra-typ" #: packages/app-desktop/gui/MenuBar.tsx:437 -#, fuzzy msgid "Switch profile" -msgstr "Exportera profil" +msgstr "Byt profil" #: packages/app-desktop/gui/utils/NoteListUtils.ts:105 msgid "Switch to note type" @@ -3579,9 +3575,8 @@ msgstr "Byt till anteckningstyp" #: packages/app-desktop/commands/switchProfile1.ts:7 #: packages/app-desktop/commands/switchProfile2.ts:7 #: packages/app-desktop/commands/switchProfile3.ts:7 -#, fuzzy msgid "Switch to profile %d" -msgstr "Byt till anteckningstyp" +msgstr "Byt till profilen %d" #: packages/app-desktop/gui/utils/NoteListUtils.ts:114 msgid "Switch to to-do type" @@ -3678,7 +3673,7 @@ msgstr "Tabloid" #: packages/app-mobile/components/screens/NoteTagsDialog.js:179 msgid "tag1, tag2, ..." -msgstr "" +msgstr "tagg1, tagg2, ..." #: packages/app-cli/app/command-import.js:52 #: packages/app-desktop/gui/ImportScreen.min.js:73 @@ -3719,7 +3714,7 @@ msgstr "Appen kommer nu att stängas. Starta om den för att slutföra processen #: packages/app-desktop/app.ts:332 msgid "" "The application did not close properly. Would you like to start in safe mode?" -msgstr "" +msgstr "Programmet stängdes inte ordentligt. Vill du starta i säkert läge?" #: packages/lib/onedrive-api-node-utils.js:86 msgid "" @@ -4568,9 +4563,8 @@ msgid "Your data is going to be re-encrypted and synced again." msgstr "Dina data kommer att omkrypteras och synkroniseras igen." #: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:271 -#, fuzzy msgid "Your password is needed to decrypt some of your data." -msgstr "Ditt huvudlösenord behövs för att dekryptera några av dina data." +msgstr "Ditt lösenord behövs för att dekryptera en del av dina data." #: packages/app-cli/app/command-sync.ts:242 msgid "" From 124ce342d887290da928c7dae27fb8bccfa44b42 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Wed, 15 Jun 2022 12:49:23 +0100 Subject: [PATCH 06/38] Chore: Fixed database type generation script --- packages/tools/generate-database-types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tools/generate-database-types.ts b/packages/tools/generate-database-types.ts index 9b3bd958dd..443f392709 100644 --- a/packages/tools/generate-database-types.ts +++ b/packages/tools/generate-database-types.ts @@ -6,7 +6,7 @@ const fs = require('fs-extra'); async function main() { // Run the CLI app once so as to generate the database file process.chdir(`${rootDir}/packages/app-cli`); - await execCommand2('yarn start -- version'); + await execCommand2('yarn start version'); const sqlTsConfig = { 'client': 'sqlite3', From 429a49b07eba35833e83db278974c18e857a56dc Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Wed, 15 Jun 2022 12:54:00 +0100 Subject: [PATCH 07/38] Chore: Fixed database type generation script --- packages/tools/generate-database-types.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/tools/generate-database-types.ts b/packages/tools/generate-database-types.ts index 443f392709..fe7def500e 100644 --- a/packages/tools/generate-database-types.ts +++ b/packages/tools/generate-database-types.ts @@ -42,6 +42,17 @@ async function main() { return t; }); + definitions.tables = definitions.tables.map((table: any) => { + table.columns = table.columns.map((column: any) => { + return { + ...column, + optional: true, + }; + }); + + return table; + }); + const tsString = sqlts.fromObject(definitions, sqlTsConfig) .replace(/": /g, '"?: '); const header = `// AUTO-GENERATED BY ${__filename.substr(rootDir.length + 1)}`; From d7663212cf03415020302fb1783e6ff7c9da2229 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Tue, 21 Jun 2022 11:49:38 +0100 Subject: [PATCH 08/38] Revert "Chore: Fixed mobile dropbown regression" This reverts commit 671077e1bbe735edb07e0ceb4dbeca33207aedde. https://github.com/laurent22/joplin/pull/6306#issuecomment-1161575676 --- packages/app-mobile/components/Dropdown.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/app-mobile/components/Dropdown.js b/packages/app-mobile/components/Dropdown.js index 3609a87e84..248a49dbe7 100644 --- a/packages/app-mobile/components/Dropdown.js +++ b/packages/app-mobile/components/Dropdown.js @@ -86,7 +86,7 @@ class Dropdown extends React.Component { if (this.props.labelTransform && this.props.labelTransform === 'trim') headerLabel = headerLabel.trim(); const closeList = () => { - if (this.props.onClose) this.props.onClose(); + if (this.props.onClose()) this.props.onClose(); this.setState({ listVisible: false }); }; @@ -116,7 +116,7 @@ class Dropdown extends React.Component { onPress={() => { this.updateHeaderCoordinates(); this.setState({ listVisible: true }); - if (this.props.onOpen) this.props.onOpen(); + if (this.props.onOpen()) this.props.onOpen(); }} > From d7af060564cc815d81574b40707cac0326fac7c2 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Tue, 21 Jun 2022 11:50:10 +0100 Subject: [PATCH 09/38] Revert "Mobile: Fixes #3564: "Move Note" dropdown menu can be very narrow (#6306)" This reverts commit cffea3ea1e983f4fcc916d30ccd8e3b501b1c7e1. https://github.com/laurent22/joplin/pull/6306#issuecomment-1161575676 --- packages/app-mobile/components/Dropdown.js | 5 ++--- packages/app-mobile/components/screen-header.js | 14 +------------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/packages/app-mobile/components/Dropdown.js b/packages/app-mobile/components/Dropdown.js index 248a49dbe7..5413692a88 100644 --- a/packages/app-mobile/components/Dropdown.js +++ b/packages/app-mobile/components/Dropdown.js @@ -38,9 +38,10 @@ class Dropdown extends React.Component { const listTop = Math.min(maxListTop, this.state.headerSize.y + this.state.headerSize.height); const wrapperStyle = { + width: this.state.headerSize.width, height: listHeight + 2, // +2 for the border (otherwise it makes the scrollbar appear) marginTop: listTop, - alignSelf: 'center', + marginLeft: this.state.headerSize.x, }; const itemListStyle = Object.assign({}, this.props.itemListStyle ? this.props.itemListStyle : {}, { @@ -86,7 +87,6 @@ class Dropdown extends React.Component { if (this.props.labelTransform && this.props.labelTransform === 'trim') headerLabel = headerLabel.trim(); const closeList = () => { - if (this.props.onClose()) this.props.onClose(); this.setState({ listVisible: false }); }; @@ -116,7 +116,6 @@ class Dropdown extends React.Component { onPress={() => { this.updateHeaderCoordinates(); this.setState({ listVisible: true }); - if (this.props.onOpen()) this.props.onOpen(); }} > diff --git a/packages/app-mobile/components/screen-header.js b/packages/app-mobile/components/screen-header.js index aec99b78e2..f194d0698f 100644 --- a/packages/app-mobile/components/screen-header.js +++ b/packages/app-mobile/components/screen-header.js @@ -29,10 +29,8 @@ class ScreenHeaderComponent extends React.PureComponent { constructor() { super(); this.styles_ = {}; - this.state = { showUndoRedoButtons: true }; } - styles() { const themeId = Setting.value('theme'); if (this.styles_[themeId]) return this.styles_[themeId]; @@ -258,7 +256,7 @@ class ScreenHeaderComponent extends React.PureComponent { } const renderTopButton = (options) => { - if (!options.visible || !this.state.showUndoRedoButtons) return null; + if (!options.visible) return null; const icon = ; const viewStyle = options.disabled ? this.styles().iconButtonDisabled : this.styles().iconButton; @@ -424,16 +422,6 @@ class ScreenHeaderComponent extends React.PureComponent { color: theme.color, fontSize: theme.fontSize, }} - onOpen={() => { - this.setState({ - showUndoRedoButtons: false, - }); - }} - onClose={() => { - this.setState({ - showUndoRedoButtons: true, - }); - }} onValueChange={async (folderId, itemIndex) => { // If onValueChange is specified, use this as a callback, otherwise do the default // which is to take the selectedNoteIds from the state and move them to the From 20a7cd2323029c2a5ddfd2a3b3092ddedb077d45 Mon Sep 17 00:00:00 2001 From: Joplin Bot Date: Fri, 24 Jun 2022 00:42:18 +0000 Subject: [PATCH 10/38] Doc: Auto-update documentation Auto-updated using release-website.sh --- readme/changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme/changelog.md b/readme/changelog.md index 1560d2d76f..afba26bc18 100644 --- a/readme/changelog.md +++ b/readme/changelog.md @@ -512,7 +512,7 @@ Attention: The default font size has been changed in the Markdown editor. You ca ## [v1.8.5](https://github.com/laurent22/joplin/releases/tag/v1.8.5) - 2021-05-10T11:58:14Z - Fixed: Fixed pasting of text and images from Word on Windows ([#4916](https://github.com/laurent22/joplin/issues/4916)) -- Security: Filter out NOSCRIPT tags that could be used to cause an XSS (found by [Jubair Rehman Yousafzai](https://twitter.com/jubairfolder)) ([9c20d59](https://github.com/laurent22/joplin/commit/9c20d59)) +- Security: Filter out NOSCRIPT tags that could be used to cause an XSS (CVE-2021-33295) (found by [Jubair Rehman Yousafzai](https://twitter.com/newfolderj)) ([9c20d59](https://github.com/laurent22/joplin/commit/9c20d59)) ## [v1.8.4](https://github.com/laurent22/joplin/releases/tag/v1.8.4) (Pre-release) - 2021-05-09T18:05:05Z From aaa610d5f458215b0244db16a3f9b065cc4076c5 Mon Sep 17 00:00:00 2001 From: Henry Heino <46334387+personalizedrefrigerator@users.noreply.github.com> Date: Fri, 24 Jun 2022 02:56:59 -0700 Subject: [PATCH 11/38] Mobile: Ctrl+F search support in beta editor (#6587) --- .../app-mobile/components/NoteEditor/CodeMirror.ts | 6 +++++- packages/app-mobile/package.json | 1 + yarn.lock | 12 ++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/app-mobile/components/NoteEditor/CodeMirror.ts b/packages/app-mobile/components/NoteEditor/CodeMirror.ts index 60bfedd5cd..4c2ed5e71c 100644 --- a/packages/app-mobile/components/NoteEditor/CodeMirror.ts +++ b/packages/app-mobile/components/NoteEditor/CodeMirror.ts @@ -11,6 +11,7 @@ import { EditorState, Extension } from '@codemirror/state'; import { markdown } from '@codemirror/lang-markdown'; +import { highlightSelectionMatches, search } from '@codemirror/search'; import { defaultHighlightStyle, syntaxHighlighting, HighlightStyle } from '@codemirror/language'; import { tags } from '@lezer/highlight'; import { EditorView, drawSelection, highlightSpecialChars, ViewUpdate } from '@codemirror/view'; @@ -18,6 +19,7 @@ import { undo, redo, history, undoDepth, redoDepth } from '@codemirror/commands' import { keymap } from '@codemirror/view'; import { indentOnInput } from '@codemirror/language'; +import { searchKeymap } from '@codemirror/search'; import { historyKeymap, defaultKeymap } from '@codemirror/commands'; interface CodeMirrorResult { @@ -183,8 +185,10 @@ export function initCodeMirror(parentElement: any, initialText: string, theme: a markdown(), ...createTheme(theme), history(), + search(), drawSelection(), highlightSpecialChars(), + highlightSelectionMatches(), indentOnInput(), EditorView.lineWrapping, @@ -203,7 +207,7 @@ export function initCodeMirror(parentElement: any, initialText: string, theme: a } }), keymap.of([ - ...defaultKeymap, ...historyKeymap, + ...defaultKeymap, ...historyKeymap, ...searchKeymap, ]), ], doc: initialText, diff --git a/packages/app-mobile/package.json b/packages/app-mobile/package.json index 63937e7a1e..1c8f670e21 100644 --- a/packages/app-mobile/package.json +++ b/packages/app-mobile/package.json @@ -73,6 +73,7 @@ "@codemirror/commands": "^6.0.0", "@codemirror/lang-markdown": "^6.0.0", "@codemirror/language": "^6.0.0", + "@codemirror/search": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@joplin/tools": "~2.8", diff --git a/yarn.lock b/yarn.lock index 5b3b26e34d..d3fd170fd5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2189,6 +2189,17 @@ __metadata: languageName: node linkType: hard +"@codemirror/search@npm:^6.0.0": + version: 6.0.0 + resolution: "@codemirror/search@npm:6.0.0" + dependencies: + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + crelt: ^1.0.5 + checksum: e40b55f1ff1287a8b5b321f633bff638c9d4a411ada524b36b275344a13f9f4a66b7c5176d8a142a6a7761d1591d18dc535c88897f30b9885508a2890162fc72 + languageName: node + linkType: hard + "@codemirror/state@npm:^6.0.0": version: 6.0.0 resolution: "@codemirror/state@npm:6.0.0" @@ -3261,6 +3272,7 @@ __metadata: "@codemirror/commands": ^6.0.0 "@codemirror/lang-markdown": ^6.0.0 "@codemirror/language": ^6.0.0 + "@codemirror/search": ^6.0.0 "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 "@joplin/lib": ~2.8 From d293474402403f9f9af271b0947bebc571984295 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Fri, 24 Jun 2022 13:42:57 +0100 Subject: [PATCH 12/38] Doc: Disable a-b test --- Assets/WebsiteAssets/templates/partials/gaOptimize.mustache | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Assets/WebsiteAssets/templates/partials/gaOptimize.mustache b/Assets/WebsiteAssets/templates/partials/gaOptimize.mustache index 3e84e01be7..d098ce45cd 100644 --- a/Assets/WebsiteAssets/templates/partials/gaOptimize.mustache +++ b/Assets/WebsiteAssets/templates/partials/gaOptimize.mustache @@ -1,5 +1,7 @@ +