securemark 0.222.0 → 0.225.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -1
- package/dist/securemark.js +219 -249
- package/package-lock.json +63 -71
- package/package.json +7 -7
- package/src/parser/api/parse.test.ts +0 -11
- package/src/parser/inline/annotation.test.ts +2 -2
- package/src/parser/inline/annotation.ts +4 -4
- package/src/parser/inline/deletion.test.ts +0 -2
- package/src/parser/inline/deletion.ts +2 -2
- package/src/parser/inline/emphasis.test.ts +4 -4
- package/src/parser/inline/emphasis.ts +3 -3
- package/src/parser/inline/emstrong.ts +11 -11
- package/src/parser/inline/extension/index.ts +2 -2
- package/src/parser/inline/html.test.ts +2 -2
- package/src/parser/inline/html.ts +8 -8
- package/src/parser/inline/insertion.test.ts +0 -2
- package/src/parser/inline/insertion.ts +2 -2
- package/src/parser/inline/link.test.ts +45 -24
- package/src/parser/inline/link.ts +23 -25
- package/src/parser/inline/mark.test.ts +4 -5
- package/src/parser/inline/mark.ts +3 -3
- package/src/parser/inline/math.test.ts +7 -2
- package/src/parser/inline/math.ts +2 -2
- package/src/parser/inline/media.test.ts +27 -16
- package/src/parser/inline/media.ts +33 -22
- package/src/parser/inline/reference.test.ts +2 -2
- package/src/parser/inline/reference.ts +6 -6
- package/src/parser/inline/ruby.ts +2 -2
- package/src/parser/inline/strong.test.ts +5 -5
- package/src/parser/inline/strong.ts +3 -3
- package/src/parser/inline.test.ts +4 -6
- package/src/parser/util.ts +51 -16
- package/src/renderer/render.ts +1 -2
package/package-lock.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "securemark",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.225.0",
|
|
4
4
|
"lockfileVersion": 1,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"dependencies": {
|
|
@@ -399,9 +399,9 @@
|
|
|
399
399
|
}
|
|
400
400
|
},
|
|
401
401
|
"@npmcli/fs": {
|
|
402
|
-
"version": "1.
|
|
403
|
-
"resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.
|
|
404
|
-
"integrity": "sha512-
|
|
402
|
+
"version": "1.1.0",
|
|
403
|
+
"resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.0.tgz",
|
|
404
|
+
"integrity": "sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA==",
|
|
405
405
|
"dev": true,
|
|
406
406
|
"requires": {
|
|
407
407
|
"@gar/promisify": "^1.0.1",
|
|
@@ -522,9 +522,9 @@
|
|
|
522
522
|
"dev": true
|
|
523
523
|
},
|
|
524
524
|
"@types/dompurify": {
|
|
525
|
-
"version": "2.3.
|
|
526
|
-
"resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.3.
|
|
527
|
-
"integrity": "sha512-
|
|
525
|
+
"version": "2.3.2",
|
|
526
|
+
"resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.3.2.tgz",
|
|
527
|
+
"integrity": "sha512-iht/O0jie/hDur39Z1NzjfOT/O9Kn2aWY99aqOn7lwsjSttEoMyGWvZIuAzZy0cNvAZdjmqySp7Z4d3GfBEGQw==",
|
|
528
528
|
"dev": true,
|
|
529
529
|
"requires": {
|
|
530
530
|
"@types/trusted-types": "*"
|
|
@@ -547,9 +547,9 @@
|
|
|
547
547
|
"dev": true
|
|
548
548
|
},
|
|
549
549
|
"@types/jquery": {
|
|
550
|
-
"version": "3.5.
|
|
551
|
-
"resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.
|
|
552
|
-
"integrity": "sha512-
|
|
550
|
+
"version": "3.5.10",
|
|
551
|
+
"resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.10.tgz",
|
|
552
|
+
"integrity": "sha512-w2qT5DFikh5TXrW/aOaCvCP8g2MMAfPXo3oeHR9v7dRuAZhu38PUWEkYrL4e9VRTcgZE4yER21AHndgpq2QPTQ==",
|
|
553
553
|
"dev": true,
|
|
554
554
|
"requires": {
|
|
555
555
|
"@types/sizzle": "*"
|
|
@@ -1338,21 +1338,21 @@
|
|
|
1338
1338
|
"dev": true
|
|
1339
1339
|
},
|
|
1340
1340
|
"body-parser": {
|
|
1341
|
-
"version": "1.19.
|
|
1342
|
-
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.
|
|
1343
|
-
"integrity": "sha512-
|
|
1341
|
+
"version": "1.19.1",
|
|
1342
|
+
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz",
|
|
1343
|
+
"integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==",
|
|
1344
1344
|
"dev": true,
|
|
1345
1345
|
"requires": {
|
|
1346
|
-
"bytes": "3.1.
|
|
1346
|
+
"bytes": "3.1.1",
|
|
1347
1347
|
"content-type": "~1.0.4",
|
|
1348
1348
|
"debug": "2.6.9",
|
|
1349
1349
|
"depd": "~1.1.2",
|
|
1350
|
-
"http-errors": "1.
|
|
1350
|
+
"http-errors": "1.8.1",
|
|
1351
1351
|
"iconv-lite": "0.4.24",
|
|
1352
1352
|
"on-finished": "~2.3.0",
|
|
1353
|
-
"qs": "6.
|
|
1354
|
-
"raw-body": "2.4.
|
|
1355
|
-
"type-is": "~1.6.
|
|
1353
|
+
"qs": "6.9.6",
|
|
1354
|
+
"raw-body": "2.4.2",
|
|
1355
|
+
"type-is": "~1.6.18"
|
|
1356
1356
|
}
|
|
1357
1357
|
},
|
|
1358
1358
|
"boxen": {
|
|
@@ -1672,9 +1672,9 @@
|
|
|
1672
1672
|
"dev": true
|
|
1673
1673
|
},
|
|
1674
1674
|
"bytes": {
|
|
1675
|
-
"version": "3.1.
|
|
1676
|
-
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.
|
|
1677
|
-
"integrity": "sha512-
|
|
1675
|
+
"version": "3.1.1",
|
|
1676
|
+
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
|
|
1677
|
+
"integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==",
|
|
1678
1678
|
"dev": true
|
|
1679
1679
|
},
|
|
1680
1680
|
"cacache": {
|
|
@@ -2887,9 +2887,9 @@
|
|
|
2887
2887
|
"dev": true
|
|
2888
2888
|
},
|
|
2889
2889
|
"electron-to-chromium": {
|
|
2890
|
-
"version": "1.4.
|
|
2891
|
-
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.
|
|
2892
|
-
"integrity": "sha512-
|
|
2890
|
+
"version": "1.4.16",
|
|
2891
|
+
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.16.tgz",
|
|
2892
|
+
"integrity": "sha512-BQb7FgYwnu6haWLU63/CdVW+9xhmHls3RCQUFiV4lvw3wimEHTVcUk2hkuZo76QhR8nnDdfZE7evJIZqijwPdA==",
|
|
2893
2893
|
"dev": true
|
|
2894
2894
|
},
|
|
2895
2895
|
"elliptic": {
|
|
@@ -5153,24 +5153,16 @@
|
|
|
5153
5153
|
"dev": true
|
|
5154
5154
|
},
|
|
5155
5155
|
"http-errors": {
|
|
5156
|
-
"version": "1.
|
|
5157
|
-
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.
|
|
5158
|
-
"integrity": "sha512-
|
|
5156
|
+
"version": "1.8.1",
|
|
5157
|
+
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
|
|
5158
|
+
"integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
|
|
5159
5159
|
"dev": true,
|
|
5160
5160
|
"requires": {
|
|
5161
5161
|
"depd": "~1.1.2",
|
|
5162
|
-
"inherits": "2.0.
|
|
5163
|
-
"setprototypeof": "1.
|
|
5162
|
+
"inherits": "2.0.4",
|
|
5163
|
+
"setprototypeof": "1.2.0",
|
|
5164
5164
|
"statuses": ">= 1.5.0 < 2",
|
|
5165
|
-
"toidentifier": "1.0.
|
|
5166
|
-
},
|
|
5167
|
-
"dependencies": {
|
|
5168
|
-
"inherits": {
|
|
5169
|
-
"version": "2.0.3",
|
|
5170
|
-
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
|
5171
|
-
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
|
|
5172
|
-
"dev": true
|
|
5173
|
-
}
|
|
5165
|
+
"toidentifier": "1.0.1"
|
|
5174
5166
|
}
|
|
5175
5167
|
},
|
|
5176
5168
|
"http-proxy": {
|
|
@@ -5621,9 +5613,9 @@
|
|
|
5621
5613
|
"dev": true
|
|
5622
5614
|
},
|
|
5623
5615
|
"is-negative-zero": {
|
|
5624
|
-
"version": "2.0.
|
|
5625
|
-
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.
|
|
5626
|
-
"integrity": "sha512-
|
|
5616
|
+
"version": "2.0.2",
|
|
5617
|
+
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
|
|
5618
|
+
"integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
|
|
5627
5619
|
"dev": true
|
|
5628
5620
|
},
|
|
5629
5621
|
"is-npm": {
|
|
@@ -5782,12 +5774,12 @@
|
|
|
5782
5774
|
"dev": true
|
|
5783
5775
|
},
|
|
5784
5776
|
"is-weakref": {
|
|
5785
|
-
"version": "1.0.
|
|
5786
|
-
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.
|
|
5787
|
-
"integrity": "sha512-
|
|
5777
|
+
"version": "1.0.2",
|
|
5778
|
+
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
|
|
5779
|
+
"integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
|
|
5788
5780
|
"dev": true,
|
|
5789
5781
|
"requires": {
|
|
5790
|
-
"call-bind": "^1.0.
|
|
5782
|
+
"call-bind": "^1.0.2"
|
|
5791
5783
|
}
|
|
5792
5784
|
},
|
|
5793
5785
|
"is-windows": {
|
|
@@ -6854,9 +6846,9 @@
|
|
|
6854
6846
|
"dev": true
|
|
6855
6847
|
},
|
|
6856
6848
|
"minipass": {
|
|
6857
|
-
"version": "3.1.
|
|
6858
|
-
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.
|
|
6859
|
-
"integrity": "sha512
|
|
6849
|
+
"version": "3.1.6",
|
|
6850
|
+
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz",
|
|
6851
|
+
"integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==",
|
|
6860
6852
|
"dev": true,
|
|
6861
6853
|
"requires": {
|
|
6862
6854
|
"yallist": "^4.0.0"
|
|
@@ -8367,9 +8359,9 @@
|
|
|
8367
8359
|
"dev": true
|
|
8368
8360
|
},
|
|
8369
8361
|
"qs": {
|
|
8370
|
-
"version": "6.
|
|
8371
|
-
"resolved": "https://registry.npmjs.org/qs/-/qs-6.
|
|
8372
|
-
"integrity": "sha512-
|
|
8362
|
+
"version": "6.9.6",
|
|
8363
|
+
"resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz",
|
|
8364
|
+
"integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==",
|
|
8373
8365
|
"dev": true
|
|
8374
8366
|
},
|
|
8375
8367
|
"querystring": {
|
|
@@ -8416,13 +8408,13 @@
|
|
|
8416
8408
|
"dev": true
|
|
8417
8409
|
},
|
|
8418
8410
|
"raw-body": {
|
|
8419
|
-
"version": "2.4.
|
|
8420
|
-
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.
|
|
8421
|
-
"integrity": "sha512-
|
|
8411
|
+
"version": "2.4.2",
|
|
8412
|
+
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz",
|
|
8413
|
+
"integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==",
|
|
8422
8414
|
"dev": true,
|
|
8423
8415
|
"requires": {
|
|
8424
|
-
"bytes": "3.1.
|
|
8425
|
-
"http-errors": "1.
|
|
8416
|
+
"bytes": "3.1.1",
|
|
8417
|
+
"http-errors": "1.8.1",
|
|
8426
8418
|
"iconv-lite": "0.4.24",
|
|
8427
8419
|
"unpipe": "1.0.0"
|
|
8428
8420
|
}
|
|
@@ -9067,9 +9059,9 @@
|
|
|
9067
9059
|
}
|
|
9068
9060
|
},
|
|
9069
9061
|
"setprototypeof": {
|
|
9070
|
-
"version": "1.
|
|
9071
|
-
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.
|
|
9072
|
-
"integrity": "sha512-
|
|
9062
|
+
"version": "1.2.0",
|
|
9063
|
+
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
|
|
9064
|
+
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
|
|
9073
9065
|
"dev": true
|
|
9074
9066
|
},
|
|
9075
9067
|
"sha.js": {
|
|
@@ -9457,9 +9449,9 @@
|
|
|
9457
9449
|
"dev": true
|
|
9458
9450
|
},
|
|
9459
9451
|
"spica": {
|
|
9460
|
-
"version": "0.0.
|
|
9461
|
-
"resolved": "https://registry.npmjs.org/spica/-/spica-0.0.
|
|
9462
|
-
"integrity": "sha512-
|
|
9452
|
+
"version": "0.0.494",
|
|
9453
|
+
"resolved": "https://registry.npmjs.org/spica/-/spica-0.0.494.tgz",
|
|
9454
|
+
"integrity": "sha512-QWdBjWGvCfHocwx2RDurOhhDDxs/HfRP33eLRVFoJCWx0UYS12NZhVZfCgD5NosuiOrZrwsIZ1/ppNXxEMlNaQ==",
|
|
9463
9455
|
"dev": true
|
|
9464
9456
|
},
|
|
9465
9457
|
"split-string": {
|
|
@@ -9888,9 +9880,9 @@
|
|
|
9888
9880
|
}
|
|
9889
9881
|
},
|
|
9890
9882
|
"toidentifier": {
|
|
9891
|
-
"version": "1.0.
|
|
9892
|
-
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.
|
|
9893
|
-
"integrity": "sha512-
|
|
9883
|
+
"version": "1.0.1",
|
|
9884
|
+
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
|
|
9885
|
+
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
|
|
9894
9886
|
"dev": true
|
|
9895
9887
|
},
|
|
9896
9888
|
"transformify": {
|
|
@@ -10032,9 +10024,9 @@
|
|
|
10032
10024
|
"dev": true
|
|
10033
10025
|
},
|
|
10034
10026
|
"typed-dom": {
|
|
10035
|
-
"version": "0.0.
|
|
10036
|
-
"resolved": "https://registry.npmjs.org/typed-dom/-/typed-dom-0.0.
|
|
10037
|
-
"integrity": "sha512-
|
|
10027
|
+
"version": "0.0.248",
|
|
10028
|
+
"resolved": "https://registry.npmjs.org/typed-dom/-/typed-dom-0.0.248.tgz",
|
|
10029
|
+
"integrity": "sha512-iwOQlPwma7lQipzbsG6wkc0Z8lM2L0pApdRLe8k4/oVPEIT4y5TWyZb+NB14lcXWqL90Hph0dTASuJL/SB31fg==",
|
|
10038
10030
|
"dev": true
|
|
10039
10031
|
},
|
|
10040
10032
|
"typedarray": {
|
|
@@ -10053,9 +10045,9 @@
|
|
|
10053
10045
|
}
|
|
10054
10046
|
},
|
|
10055
10047
|
"typescript": {
|
|
10056
|
-
"version": "4.5.
|
|
10057
|
-
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.
|
|
10058
|
-
"integrity": "sha512-
|
|
10048
|
+
"version": "4.5.3",
|
|
10049
|
+
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.3.tgz",
|
|
10050
|
+
"integrity": "sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ==",
|
|
10059
10051
|
"dev": true
|
|
10060
10052
|
},
|
|
10061
10053
|
"ua-parser-js": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "securemark",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.225.0",
|
|
4
4
|
"description": "Secure markdown renderer working on browsers for user input data.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"homepage": "https://github.com/falsandtru/securemark",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"dompurify": "global:DOMPurify"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@types/dompurify": "2.3.
|
|
34
|
-
"@types/jquery": "3.5.
|
|
33
|
+
"@types/dompurify": "2.3.2",
|
|
34
|
+
"@types/jquery": "3.5.10",
|
|
35
35
|
"@types/mathjax": "0.0.37",
|
|
36
36
|
"@types/mocha": "9.0.0",
|
|
37
37
|
"@types/power-assert": "1.5.8",
|
|
@@ -56,13 +56,13 @@
|
|
|
56
56
|
"karma-firefox-launcher": "^2.1.2",
|
|
57
57
|
"karma-mocha": "^2.0.1",
|
|
58
58
|
"mocha": "^9.1.3",
|
|
59
|
-
"npm-check-updates": "^12.0.
|
|
59
|
+
"npm-check-updates": "^12.0.3",
|
|
60
60
|
"power-assert": "^1.6.1",
|
|
61
61
|
"semver": "^7.3.5",
|
|
62
|
-
"spica": "0.0.
|
|
62
|
+
"spica": "0.0.494",
|
|
63
63
|
"tsify": "^5.0.4",
|
|
64
|
-
"typed-dom": "0.0.
|
|
65
|
-
"typescript": "4.5.
|
|
64
|
+
"typed-dom": "0.0.248",
|
|
65
|
+
"typescript": "4.5.3",
|
|
66
66
|
"vinyl-buffer": "^1.0.1",
|
|
67
67
|
"vinyl-source-stream": "^2.0.0"
|
|
68
68
|
},
|
|
@@ -60,9 +60,6 @@ describe('Unit: parser/api/parse', () => {
|
|
|
60
60
|
});
|
|
61
61
|
|
|
62
62
|
it('linebreak', () => {
|
|
63
|
-
assert.deepStrictEqual(
|
|
64
|
-
[...parse('*a\n*\nb').children].map(el => el.outerHTML),
|
|
65
|
-
['<p><em>a</em><br>b</p>']);
|
|
66
63
|
assert.deepStrictEqual(
|
|
67
64
|
[...parse('\\ ').children].map(el => el.outerHTML),
|
|
68
65
|
['<p>\\</p>']);
|
|
@@ -104,10 +101,6 @@ describe('Unit: parser/api/parse', () => {
|
|
|
104
101
|
'{a}',
|
|
105
102
|
'{/a}',
|
|
106
103
|
'{^/a}',
|
|
107
|
-
'{^/a/..}',
|
|
108
|
-
'{^/a/../}',
|
|
109
|
-
'{^/a?/../}',
|
|
110
|
-
'{^/a#/../}',
|
|
111
104
|
'{./a}',
|
|
112
105
|
'{../a}',
|
|
113
106
|
'{../../a}',
|
|
@@ -131,10 +124,6 @@ describe('Unit: parser/api/parse', () => {
|
|
|
131
124
|
'<p><a href="https://source/x/a" target="_blank">a</a></p>',
|
|
132
125
|
'<p><a href="https://source/a" target="_blank">/a</a></p>',
|
|
133
126
|
'<p><a href="/z/a">^/a</a></p>',
|
|
134
|
-
'<p><a href="/z/a/..">^/a/..</a></p>',
|
|
135
|
-
'<p><a href="/z/a/../">^/a/../</a></p>',
|
|
136
|
-
'<p><a href="/z/a?/../">^/a?/../</a></p>',
|
|
137
|
-
'<p><a href="/z/a#/../">^/a#/../</a></p>',
|
|
138
127
|
'<p><a href="https://source/x/a" target="_blank">./a</a></p>',
|
|
139
128
|
'<p><a href="https://source/a" target="_blank">../a</a></p>',
|
|
140
129
|
'<p><a href="https://source/a" target="_blank">../../a</a></p>',
|
|
@@ -14,8 +14,6 @@ describe('Unit: parser/inline/annotation', () => {
|
|
|
14
14
|
assert.deepStrictEqual(inspect(parser('(())')), undefined);
|
|
15
15
|
assert.deepStrictEqual(inspect(parser('(()))')), undefined);
|
|
16
16
|
assert.deepStrictEqual(inspect(parser('(( ))')), undefined);
|
|
17
|
-
assert.deepStrictEqual(inspect(parser('(( a))')), undefined);
|
|
18
|
-
assert.deepStrictEqual(inspect(parser('(( a ))')), undefined);
|
|
19
17
|
assert.deepStrictEqual(inspect(parser('((\n))')), undefined);
|
|
20
18
|
assert.deepStrictEqual(inspect(parser('((\na))')), undefined);
|
|
21
19
|
assert.deepStrictEqual(inspect(parser('((\\ a))')), undefined);
|
|
@@ -34,6 +32,8 @@ describe('Unit: parser/inline/annotation', () => {
|
|
|
34
32
|
});
|
|
35
33
|
|
|
36
34
|
it('basic', () => {
|
|
35
|
+
assert.deepStrictEqual(inspect(parser('(( a))')), [['<sup class="annotation">a</sup>'], '']);
|
|
36
|
+
assert.deepStrictEqual(inspect(parser('(( a ))')), [['<sup class="annotation">a</sup>'], '']);
|
|
37
37
|
assert.deepStrictEqual(inspect(parser('((a))')), [['<sup class="annotation">a</sup>'], '']);
|
|
38
38
|
assert.deepStrictEqual(inspect(parser('((a ))')), [['<sup class="annotation">a</sup>'], '']);
|
|
39
39
|
assert.deepStrictEqual(inspect(parser('((a ))')), [['<sup class="annotation">a</sup>'], '']);
|
|
@@ -2,13 +2,13 @@ import { undefined } from 'spica/global';
|
|
|
2
2
|
import { AnnotationParser } from '../inline';
|
|
3
3
|
import { union, some, validate, guard, context, creator, surround, lazy, fmap } from '../../combinator';
|
|
4
4
|
import { inline } from '../inline';
|
|
5
|
-
import {
|
|
5
|
+
import { startLoose, trimNode } from '../util';
|
|
6
6
|
import { html, defrag } from 'typed-dom';
|
|
7
7
|
|
|
8
8
|
export const annotation: AnnotationParser = lazy(() => creator(validate('((', '))', '\n', fmap(surround(
|
|
9
9
|
'((',
|
|
10
10
|
guard(context => context.syntax?.inline?.annotation ?? true,
|
|
11
|
-
|
|
11
|
+
startLoose(
|
|
12
12
|
context({ syntax: { inline: {
|
|
13
13
|
annotation: false,
|
|
14
14
|
// Redundant
|
|
@@ -20,6 +20,6 @@ export const annotation: AnnotationParser = lazy(() => creator(validate('((', ')
|
|
|
20
20
|
//link: true,
|
|
21
21
|
//autolink: true,
|
|
22
22
|
}}, state: undefined },
|
|
23
|
-
union([some(inline, ')', /^\\?\n/)])))),
|
|
23
|
+
union([some(inline, ')', /^\\?\n/)])), '))')),
|
|
24
24
|
'))'),
|
|
25
|
-
ns => [html('sup', { class: 'annotation' },
|
|
25
|
+
ns => [html('sup', { class: 'annotation' }, trimNode(defrag(ns)))]))));
|
|
@@ -32,8 +32,6 @@ describe('Unit: parser/inline/deletion', () => {
|
|
|
32
32
|
assert.deepStrictEqual(inspect(parser('~~a\\\nb~~')), [['<del>a<span class="linebreak"> </span>b</del>'], '']);
|
|
33
33
|
assert.deepStrictEqual(inspect(parser('~~\\~~~')), [['<del>~</del>'], '']);
|
|
34
34
|
assert.deepStrictEqual(inspect(parser('~~a~~~')), [['<del>a</del>'], '~']);
|
|
35
|
-
assert.deepStrictEqual(inspect(parser('~~~a~~')), [['<del>~a</del>'], '']);
|
|
36
|
-
assert.deepStrictEqual(inspect(parser('~~~a~~~')), [['<del>~a</del>'], '~']);
|
|
37
35
|
});
|
|
38
36
|
|
|
39
37
|
it('nest', () => {
|
|
@@ -2,7 +2,7 @@ import { DeletionParser } from '../inline';
|
|
|
2
2
|
import { union, some, creator, surround, lazy } from '../../combinator';
|
|
3
3
|
import { inline } from '../inline';
|
|
4
4
|
import { str } from '../source';
|
|
5
|
-
import {
|
|
5
|
+
import { trimNodeEndBR } from '../util';
|
|
6
6
|
import { html, defrag } from 'typed-dom';
|
|
7
7
|
import { unshift } from 'spica/array';
|
|
8
8
|
|
|
@@ -10,5 +10,5 @@ export const deletion: DeletionParser = lazy(() => creator(surround(
|
|
|
10
10
|
str('~~'),
|
|
11
11
|
union([some(inline, '~~')]),
|
|
12
12
|
str('~~'), false,
|
|
13
|
-
([, bs], rest) => [[html('del', defrag(
|
|
13
|
+
([, bs], rest) => [[html('del', defrag(trimNodeEndBR(bs)))], rest],
|
|
14
14
|
([as, bs], rest) => [unshift(as, bs), rest])));
|
|
@@ -9,7 +9,10 @@ describe('Unit: parser/inline/emphasis', () => {
|
|
|
9
9
|
it('invalid', () => {
|
|
10
10
|
assert.deepStrictEqual(inspect(parser('*')), undefined);
|
|
11
11
|
assert.deepStrictEqual(inspect(parser('*a')), [['*', 'a'], '']);
|
|
12
|
-
assert.deepStrictEqual(inspect(parser('*a
|
|
12
|
+
assert.deepStrictEqual(inspect(parser('*a *')), [['*', 'a', ' '], '*']);
|
|
13
|
+
assert.deepStrictEqual(inspect(parser('*a\n*')), [['*', 'a', '<br>'], '*']);
|
|
14
|
+
assert.deepStrictEqual(inspect(parser('*a\\ *')), [['*', 'a', ' '], '*']);
|
|
15
|
+
assert.deepStrictEqual(inspect(parser('*a\\\n*')), [['*', 'a', '<span class="linebreak"> </span>'], '*']);
|
|
13
16
|
assert.deepStrictEqual(inspect(parser('*a**b')), [['*', 'a', '**', 'b'], '']);
|
|
14
17
|
assert.deepStrictEqual(inspect(parser('*a**b*')), [['*', 'a', '**', 'b', '*'], '']);
|
|
15
18
|
assert.deepStrictEqual(inspect(parser('* *')), undefined);
|
|
@@ -28,9 +31,6 @@ describe('Unit: parser/inline/emphasis', () => {
|
|
|
28
31
|
|
|
29
32
|
it('basic', () => {
|
|
30
33
|
assert.deepStrictEqual(inspect(parser('*a*')), [['<em>a</em>'], '']);
|
|
31
|
-
assert.deepStrictEqual(inspect(parser('*a *')), [['<em>a </em>'], '']);
|
|
32
|
-
assert.deepStrictEqual(inspect(parser('*a\n*')), [['<em>a</em>'], '']);
|
|
33
|
-
assert.deepStrictEqual(inspect(parser('*a\\\n*')), [['<em>a<span class="linebreak"> </span></em>'], '']);
|
|
34
34
|
assert.deepStrictEqual(inspect(parser('*ab*')), [['<em>ab</em>'], '']);
|
|
35
35
|
assert.deepStrictEqual(inspect(parser('*a\nb*')), [['<em>a<br>b</em>'], '']);
|
|
36
36
|
assert.deepStrictEqual(inspect(parser('*a\\\nb*')), [['<em>a<span class="linebreak"> </span>b</em>'], '']);
|
|
@@ -3,7 +3,7 @@ import { union, some, creator, surround, close, lazy } from '../../combinator';
|
|
|
3
3
|
import { inline } from '../inline';
|
|
4
4
|
import { strong } from './strong';
|
|
5
5
|
import { str } from '../source';
|
|
6
|
-
import { startTight,
|
|
6
|
+
import { startTight, isEndTightNodes } from '../util';
|
|
7
7
|
import { html, defrag } from 'typed-dom';
|
|
8
8
|
import { unshift } from 'spica/array';
|
|
9
9
|
|
|
@@ -12,7 +12,7 @@ export const emphasis: EmphasisParser = lazy(() => creator(surround(close(
|
|
|
12
12
|
startTight(some(union([strong, some(inline, '*')]))),
|
|
13
13
|
str('*'), false,
|
|
14
14
|
([as, bs, cs], rest) =>
|
|
15
|
-
|
|
16
|
-
? [[html('em', defrag(
|
|
15
|
+
isEndTightNodes(bs)
|
|
16
|
+
? [[html('em', defrag(bs))], rest]
|
|
17
17
|
: [unshift(as, bs), cs[0] + rest],
|
|
18
18
|
([as, bs], rest) => [unshift(as, bs), rest])));
|
|
@@ -2,7 +2,7 @@ import { EmStrongParser } from '../inline';
|
|
|
2
2
|
import { union, some, creator, surround, lazy, bind } from '../../combinator';
|
|
3
3
|
import { inline } from '../inline';
|
|
4
4
|
import { str } from '../source';
|
|
5
|
-
import { startTight,
|
|
5
|
+
import { startTight, isEndTightNodes } from '../util';
|
|
6
6
|
import { html, defrag } from 'typed-dom';
|
|
7
7
|
import { unshift } from 'spica/array';
|
|
8
8
|
|
|
@@ -11,26 +11,26 @@ export const emstrong: EmStrongParser = lazy(() => creator(surround(
|
|
|
11
11
|
startTight(union([some(inline, '*')])),
|
|
12
12
|
str(/^\*{1,3}/), false,
|
|
13
13
|
([as, bs, cs], rest, context) => {
|
|
14
|
-
if (!
|
|
14
|
+
if (!isEndTightNodes(bs)) return [unshift(as, bs), cs[0] + rest];
|
|
15
15
|
switch (cs[0]) {
|
|
16
16
|
case '*':
|
|
17
17
|
return bind<EmStrongParser>(
|
|
18
18
|
union([some(inline, '**')]),
|
|
19
19
|
(ds, rest) =>
|
|
20
|
-
rest.slice(0, 2) === '**' &&
|
|
21
|
-
? [[html('strong', unshift([html('em', defrag(
|
|
22
|
-
: [unshift(['**', html('em', defrag(
|
|
23
|
-
(rest, context) ?? [['**', html('em', defrag(
|
|
20
|
+
rest.slice(0, 2) === '**' && isEndTightNodes(ds)
|
|
21
|
+
? [[html('strong', unshift([html('em', defrag(bs))], defrag(ds)))], rest.slice(2)]
|
|
22
|
+
: [unshift(['**', html('em', defrag(bs))], ds), rest])
|
|
23
|
+
(rest, context) ?? [['**', html('em', defrag(bs))], rest];
|
|
24
24
|
case '**':
|
|
25
25
|
return bind<EmStrongParser>(
|
|
26
26
|
union([some(inline, '*')]),
|
|
27
27
|
(ds, rest) =>
|
|
28
|
-
rest.slice(0, 1) === '*' &&
|
|
29
|
-
? [[html('em', unshift([html('strong', defrag(
|
|
30
|
-
: [unshift(['*', html('strong', defrag(
|
|
31
|
-
(rest, context) ?? [['*', html('strong', defrag(
|
|
28
|
+
rest.slice(0, 1) === '*' && isEndTightNodes(ds)
|
|
29
|
+
? [[html('em', unshift([html('strong', defrag(bs))], defrag(ds)))], rest.slice(1)]
|
|
30
|
+
: [unshift(['*', html('strong', defrag(bs))], ds), rest])
|
|
31
|
+
(rest, context) ?? [['*', html('strong', defrag(bs))], rest];
|
|
32
32
|
case '***':
|
|
33
|
-
return [[html('em', [html('strong', defrag(
|
|
33
|
+
return [[html('em', [html('strong', defrag(bs))])], rest];
|
|
34
34
|
}
|
|
35
35
|
assert(false);
|
|
36
36
|
},
|
|
@@ -4,7 +4,7 @@ import { union, some, validate, guard, context, creator, surround, open, lazy, f
|
|
|
4
4
|
import { inline } from '../../inline';
|
|
5
5
|
import { indexee, identify } from './indexee';
|
|
6
6
|
import { txt, str } from '../../source';
|
|
7
|
-
import { startTight,
|
|
7
|
+
import { startTight, trimNodeEnd } from '../../util';
|
|
8
8
|
import { html, define, defrag } from 'typed-dom';
|
|
9
9
|
import { join } from 'spica/array';
|
|
10
10
|
|
|
@@ -29,7 +29,7 @@ export const index: IndexParser = lazy(() => creator(validate('[#', ']', '\n', f
|
|
|
29
29
|
inline,
|
|
30
30
|
]), ']', /^\\?\n/), true)))),
|
|
31
31
|
']'),
|
|
32
|
-
ns => [html('a',
|
|
32
|
+
ns => [html('a', trimNodeEnd(defrag(ns)))])),
|
|
33
33
|
([el]: [HTMLAnchorElement]) => [
|
|
34
34
|
define(el,
|
|
35
35
|
{
|
|
@@ -29,8 +29,6 @@ describe('Unit: parser/inline/html', () => {
|
|
|
29
29
|
assert.deepStrictEqual(inspect(parser('<small>z')), undefined);
|
|
30
30
|
assert.deepStrictEqual(inspect(parser('<small></small>')), undefined);
|
|
31
31
|
assert.deepStrictEqual(inspect(parser('<small> </small>')), undefined);
|
|
32
|
-
assert.deepStrictEqual(inspect(parser('<small> a</small>')), undefined);
|
|
33
|
-
assert.deepStrictEqual(inspect(parser('<small> a </small>')), undefined);
|
|
34
32
|
assert.deepStrictEqual(inspect(parser('<small>\n</small>')), undefined);
|
|
35
33
|
assert.deepStrictEqual(inspect(parser('<small>\na</small>')), undefined);
|
|
36
34
|
assert.deepStrictEqual(inspect(parser('<small>\\ a</small>')), undefined);
|
|
@@ -59,6 +57,8 @@ describe('Unit: parser/inline/html', () => {
|
|
|
59
57
|
});
|
|
60
58
|
|
|
61
59
|
it('basic', () => {
|
|
60
|
+
assert.deepStrictEqual(inspect(parser('<small> a</small>')), [['<small> a</small>'], '']);
|
|
61
|
+
assert.deepStrictEqual(inspect(parser('<small> a </small>')), [['<small> a </small>'], '']);
|
|
62
62
|
assert.deepStrictEqual(inspect(parser('<small>a</small>')), [['<small>a</small>'], '']);
|
|
63
63
|
assert.deepStrictEqual(inspect(parser('<small>a</small>a')), [['<small>a</small>'], 'a']);
|
|
64
64
|
assert.deepStrictEqual(inspect(parser('<small>a </small>')), [['<small>a </small>'], '']);
|
|
@@ -5,7 +5,7 @@ import { HTMLParser } from '../inline';
|
|
|
5
5
|
import { union, some, validate, context, creator, surround, match, lazy } from '../../combinator';
|
|
6
6
|
import { inline } from '../inline';
|
|
7
7
|
import { str } from '../source';
|
|
8
|
-
import {
|
|
8
|
+
import { startLoose, trimNodeEndBR } from '../util';
|
|
9
9
|
import { html as h, defrag } from 'typed-dom';
|
|
10
10
|
import { memoize } from 'spica/memoize';
|
|
11
11
|
import { Cache } from 'spica/cache';
|
|
@@ -39,7 +39,7 @@ export const html: HTMLParser = lazy(() => creator(validate('<', '>', '\n', vali
|
|
|
39
39
|
validate(`<${tag}`, `</${tag}>`,
|
|
40
40
|
surround<HTMLParser.TagParser, string>(surround(
|
|
41
41
|
str(`<${tag}`), some(attribute), str('>'), true),
|
|
42
|
-
|
|
42
|
+
startLoose(
|
|
43
43
|
context((() => {
|
|
44
44
|
switch (tag) {
|
|
45
45
|
case 'sup':
|
|
@@ -63,10 +63,10 @@ export const html: HTMLParser = lazy(() => creator(validate('<', '>', '\n', vali
|
|
|
63
63
|
return {};
|
|
64
64
|
}
|
|
65
65
|
})(),
|
|
66
|
-
some(union([inline]), `</${tag}>`))),
|
|
66
|
+
some(union([inline]), `</${tag}>`)), `</${tag}>`),
|
|
67
67
|
str(`</${tag}>`), false,
|
|
68
68
|
([as, bs, cs], rest, context) =>
|
|
69
|
-
[[elem(tag, as,
|
|
69
|
+
[[elem(tag, as, trimNodeEndBR(defrag(bs)), cs, context)], rest])),
|
|
70
70
|
([, tag]) => tag)),
|
|
71
71
|
match(
|
|
72
72
|
/^(?=<([a-z]+)(?=[^\S\n]|>))/,
|
|
@@ -75,10 +75,10 @@ export const html: HTMLParser = lazy(() => creator(validate('<', '>', '\n', vali
|
|
|
75
75
|
validate(`<${tag}`, `</${tag}>`,
|
|
76
76
|
surround<HTMLParser.TagParser, string>(surround(
|
|
77
77
|
str(`<${tag}`), some(attribute), str('>'), true),
|
|
78
|
-
|
|
78
|
+
startLoose(some(union([inline]), `</${tag}>`), `</${tag}>`),
|
|
79
79
|
str(`</${tag}>`), false,
|
|
80
80
|
([as, bs, cs], rest) =>
|
|
81
|
-
[[elem(tag, as,
|
|
81
|
+
[[elem(tag, as, trimNodeEndBR(defrag(bs)), cs, {})], rest],
|
|
82
82
|
([as, bs], rest) =>
|
|
83
83
|
as.length === 1
|
|
84
84
|
? [unshift(as, bs), rest]
|
|
@@ -99,14 +99,14 @@ function elem(tag: string, as: (HTMLElement | string)[], bs: (HTMLElement | stri
|
|
|
99
99
|
case 'sub':
|
|
100
100
|
switch (true) {
|
|
101
101
|
case context.state?.in?.supsub:
|
|
102
|
-
return invalid('nest', `<${tag}> HTML tag cannot be used in <sup
|
|
102
|
+
return invalid('nest', `<${tag}> HTML tag cannot be used in <sup> or <sub> HTML tag.`, as, bs, cs);
|
|
103
103
|
}
|
|
104
104
|
break;
|
|
105
105
|
case 'small':
|
|
106
106
|
switch (true) {
|
|
107
107
|
case context.state?.in?.supsub:
|
|
108
108
|
case context.state?.in?.small:
|
|
109
|
-
return invalid('nest', `<${tag}> HTML tag cannot be used in <sup
|
|
109
|
+
return invalid('nest', `<${tag}> HTML tag cannot be used in <sup>, <sub>, or <small> HTML tag.`, as, bs, cs);
|
|
110
110
|
}
|
|
111
111
|
break;
|
|
112
112
|
}
|
|
@@ -32,8 +32,6 @@ describe('Unit: parser/inline/insertion', () => {
|
|
|
32
32
|
assert.deepStrictEqual(inspect(parser('++a\\\nb++')), [['<ins>a<span class="linebreak"> </span>b</ins>'], '']);
|
|
33
33
|
assert.deepStrictEqual(inspect(parser('++\\+++')), [['<ins>+</ins>'], '']);
|
|
34
34
|
assert.deepStrictEqual(inspect(parser('++a+++')), [['<ins>a</ins>'], '+']);
|
|
35
|
-
assert.deepStrictEqual(inspect(parser('+++a++')), [['<ins>+a</ins>'], '']);
|
|
36
|
-
assert.deepStrictEqual(inspect(parser('+++a+++')), [['<ins>+a</ins>'], '+']);
|
|
37
35
|
});
|
|
38
36
|
|
|
39
37
|
it('nest', () => {
|
|
@@ -2,7 +2,7 @@ import { InsertionParser } from '../inline';
|
|
|
2
2
|
import { union, some, creator, surround, lazy } from '../../combinator';
|
|
3
3
|
import { inline } from '../inline';
|
|
4
4
|
import { str } from '../source';
|
|
5
|
-
import {
|
|
5
|
+
import { trimNodeEndBR } from '../util';
|
|
6
6
|
import { html, defrag } from 'typed-dom';
|
|
7
7
|
import { unshift } from 'spica/array';
|
|
8
8
|
|
|
@@ -10,5 +10,5 @@ export const insertion: InsertionParser = lazy(() => creator(surround(
|
|
|
10
10
|
str('++'),
|
|
11
11
|
union([some(inline, '++')]),
|
|
12
12
|
str('++'), false,
|
|
13
|
-
([, bs], rest) => [[html('ins', defrag(
|
|
13
|
+
([, bs], rest) => [[html('ins', defrag(trimNodeEndBR(bs)))], rest],
|
|
14
14
|
([as, bs], rest) => [unshift(as, bs), rest])));
|