commonmarker 2.10.0 → 2.10.1
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.
- checksums.yaml +4 -4
- data/Cargo.lock +83 -40
- data/README.md +2 -2
- data/ext/commonmarker/Cargo.toml +3 -4
- data/ext/commonmarker/src/lib.rs +12 -2
- data/ext/commonmarker/src/nesting.rs +71 -0
- data/ext/commonmarker/src/node.rs +80 -87
- data/ext/commonmarker/src/options.rs +0 -4
- data/ext/commonmarker/src/plugins/syntax_highlighting.rs +9 -5
- data/ext/commonmarker/src/rctree.rs +841 -0
- data/lib/commonmarker/config.rb +1 -1
- data/lib/commonmarker/errors.rb +7 -0
- data/lib/commonmarker/node.rb +17 -4
- data/lib/commonmarker/version.rb +1 -1
- data/lib/commonmarker.rb +1 -0
- metadata +5 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4d5e959f519ad6befde6dac13c3d66d8df0eb8a5607553466d49544d75fb53dd
|
|
4
|
+
data.tar.gz: c4b1fa07305b5781a5a4ddb94090e474221df13ca946724068407b925d7c7e57
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0e91a96c44c65c948f9e4631ca57f4e0a735f6e23ca5f8eb76e8d5a1ae7f5909b102712501a3a01abc25109e18830333f7557ed676a87bd1b458bdc6f0ed61a3
|
|
7
|
+
data.tar.gz: 858617c6e1444fafaa3fa8b70ee128ed4ad4fe9e5802ff1155adb2102a209cc53d4721ae85c78392fc2f26a7b8c386bcdd6a84cc7e0e38411ddae389bb06e87e
|
data/Cargo.lock
CHANGED
|
@@ -47,7 +47,7 @@ dependencies = [
|
|
|
47
47
|
"regex",
|
|
48
48
|
"rustc-hash",
|
|
49
49
|
"shlex 1.3.0",
|
|
50
|
-
"syn",
|
|
50
|
+
"syn 2.0.118",
|
|
51
51
|
]
|
|
52
52
|
|
|
53
53
|
[[package]]
|
|
@@ -124,23 +124,22 @@ dependencies = [
|
|
|
124
124
|
"magnus",
|
|
125
125
|
"rb-allocator",
|
|
126
126
|
"rb-sys",
|
|
127
|
-
"rctree",
|
|
128
127
|
"syntect",
|
|
129
128
|
"typed-arena",
|
|
130
129
|
]
|
|
131
130
|
|
|
132
131
|
[[package]]
|
|
133
132
|
name = "comrak"
|
|
134
|
-
version = "0.
|
|
133
|
+
version = "0.56.0"
|
|
135
134
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
136
|
-
checksum = "
|
|
135
|
+
checksum = "2544c4d6b6da7d54e95ac2833b464bf3dffa0666237868f2bf4ec5e11c9ba8cc"
|
|
137
136
|
dependencies = [
|
|
138
137
|
"caseless",
|
|
139
138
|
"emojis",
|
|
140
139
|
"entities",
|
|
141
140
|
"finl_unicode",
|
|
142
|
-
"
|
|
143
|
-
"phf",
|
|
141
|
+
"memchr-n",
|
|
142
|
+
"phf 0.14.0",
|
|
144
143
|
"phf_codegen",
|
|
145
144
|
"rustc-hash",
|
|
146
145
|
"smallvec",
|
|
@@ -171,11 +170,11 @@ checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
|
|
|
171
170
|
|
|
172
171
|
[[package]]
|
|
173
172
|
name = "emojis"
|
|
174
|
-
version = "0.
|
|
173
|
+
version = "0.9.0"
|
|
175
174
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
176
|
-
checksum = "
|
|
175
|
+
checksum = "0b1514ced566c94991ed9563258ecf61e311fd773bf0a3f20606830386bf66e3"
|
|
177
176
|
dependencies = [
|
|
178
|
-
"phf",
|
|
177
|
+
"phf 0.13.1",
|
|
179
178
|
]
|
|
180
179
|
|
|
181
180
|
[[package]]
|
|
@@ -207,6 +206,23 @@ version = "2.4.1"
|
|
|
207
206
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
208
207
|
checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"
|
|
209
208
|
|
|
209
|
+
[[package]]
|
|
210
|
+
name = "fearless_simd"
|
|
211
|
+
version = "1.1.0"
|
|
212
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
213
|
+
checksum = "3296eb97d869113eaf148a6bdf01884e90b3828ad7ae2340b0f93362fc158611"
|
|
214
|
+
|
|
215
|
+
[[package]]
|
|
216
|
+
name = "fearless_simd_macros"
|
|
217
|
+
version = "0.1.0"
|
|
218
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
219
|
+
checksum = "3e91d94c6885390b81782d7ee60fd6583b33907333a8b340de25ccf468353315"
|
|
220
|
+
dependencies = [
|
|
221
|
+
"proc-macro2",
|
|
222
|
+
"quote",
|
|
223
|
+
"syn 3.0.9",
|
|
224
|
+
]
|
|
225
|
+
|
|
210
226
|
[[package]]
|
|
211
227
|
name = "find-msvc-tools"
|
|
212
228
|
version = "0.1.9"
|
|
@@ -272,12 +288,6 @@ version = "1.0.18"
|
|
|
272
288
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
273
289
|
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
|
|
274
290
|
|
|
275
|
-
[[package]]
|
|
276
|
-
name = "jetscii"
|
|
277
|
-
version = "0.5.3"
|
|
278
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
279
|
-
checksum = "47f142fe24a9c9944451e8349de0a56af5f3e7226dc46f3ed4d4ecc0b85af75e"
|
|
280
|
-
|
|
281
291
|
[[package]]
|
|
282
292
|
name = "lazy_static"
|
|
283
293
|
version = "1.5.0"
|
|
@@ -308,9 +318,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
|
|
|
308
318
|
|
|
309
319
|
[[package]]
|
|
310
320
|
name = "magnus"
|
|
311
|
-
version = "0.
|
|
321
|
+
version = "0.9.3"
|
|
312
322
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
313
|
-
checksum = "
|
|
323
|
+
checksum = "40ef424404d166cbb71c8b8d19c9c589c748c4547c1afa1928c5504299f6c713"
|
|
314
324
|
dependencies = [
|
|
315
325
|
"magnus-macros",
|
|
316
326
|
"rb-sys",
|
|
@@ -320,13 +330,13 @@ dependencies = [
|
|
|
320
330
|
|
|
321
331
|
[[package]]
|
|
322
332
|
name = "magnus-macros"
|
|
323
|
-
version = "0.
|
|
333
|
+
version = "0.9.1"
|
|
324
334
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
325
|
-
checksum = "
|
|
335
|
+
checksum = "9dafde2eeb66f090e0f326112323eb8324b12cb32b5d1210e541d3df6b0ce77e"
|
|
326
336
|
dependencies = [
|
|
327
337
|
"proc-macro2",
|
|
328
338
|
"quote",
|
|
329
|
-
"syn",
|
|
339
|
+
"syn 2.0.118",
|
|
330
340
|
]
|
|
331
341
|
|
|
332
342
|
[[package]]
|
|
@@ -335,6 +345,16 @@ version = "2.8.3"
|
|
|
335
345
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
336
346
|
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
|
|
337
347
|
|
|
348
|
+
[[package]]
|
|
349
|
+
name = "memchr-n"
|
|
350
|
+
version = "0.1.9"
|
|
351
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
352
|
+
checksum = "1805571b8e7b1284ad43f27c88477840c1c0e5807c150021ac83d2228806540e"
|
|
353
|
+
dependencies = [
|
|
354
|
+
"fearless_simd",
|
|
355
|
+
"fearless_simd_macros",
|
|
356
|
+
]
|
|
357
|
+
|
|
338
358
|
[[package]]
|
|
339
359
|
name = "minimal-lexical"
|
|
340
360
|
version = "0.2.1"
|
|
@@ -401,28 +421,37 @@ version = "0.13.1"
|
|
|
401
421
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
402
422
|
checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf"
|
|
403
423
|
dependencies = [
|
|
404
|
-
"phf_shared",
|
|
424
|
+
"phf_shared 0.13.1",
|
|
425
|
+
]
|
|
426
|
+
|
|
427
|
+
[[package]]
|
|
428
|
+
name = "phf"
|
|
429
|
+
version = "0.14.0"
|
|
430
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
431
|
+
checksum = "010378780309880b08997fae13be7834dba947d36393bd372f2b1556deb2a2f6"
|
|
432
|
+
dependencies = [
|
|
433
|
+
"phf_shared 0.14.0",
|
|
405
434
|
"serde",
|
|
406
435
|
]
|
|
407
436
|
|
|
408
437
|
[[package]]
|
|
409
438
|
name = "phf_codegen"
|
|
410
|
-
version = "0.
|
|
439
|
+
version = "0.14.0"
|
|
411
440
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
412
|
-
checksum = "
|
|
441
|
+
checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe"
|
|
413
442
|
dependencies = [
|
|
414
443
|
"phf_generator",
|
|
415
|
-
"phf_shared",
|
|
444
|
+
"phf_shared 0.14.0",
|
|
416
445
|
]
|
|
417
446
|
|
|
418
447
|
[[package]]
|
|
419
448
|
name = "phf_generator"
|
|
420
|
-
version = "0.
|
|
449
|
+
version = "0.14.0"
|
|
421
450
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
422
|
-
checksum = "
|
|
451
|
+
checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100"
|
|
423
452
|
dependencies = [
|
|
424
453
|
"fastrand",
|
|
425
|
-
"phf_shared",
|
|
454
|
+
"phf_shared 0.14.0",
|
|
426
455
|
]
|
|
427
456
|
|
|
428
457
|
[[package]]
|
|
@@ -434,6 +463,15 @@ dependencies = [
|
|
|
434
463
|
"siphasher",
|
|
435
464
|
]
|
|
436
465
|
|
|
466
|
+
[[package]]
|
|
467
|
+
name = "phf_shared"
|
|
468
|
+
version = "0.14.0"
|
|
469
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
470
|
+
checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89"
|
|
471
|
+
dependencies = [
|
|
472
|
+
"siphasher",
|
|
473
|
+
]
|
|
474
|
+
|
|
437
475
|
[[package]]
|
|
438
476
|
name = "pkg-config"
|
|
439
477
|
version = "0.3.33"
|
|
@@ -497,18 +535,18 @@ dependencies = [
|
|
|
497
535
|
|
|
498
536
|
[[package]]
|
|
499
537
|
name = "rb-sys"
|
|
500
|
-
version = "0.9.
|
|
538
|
+
version = "0.9.130"
|
|
501
539
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
502
|
-
checksum = "
|
|
540
|
+
checksum = "02faf625bb10ba893e3ae620f19c9fb1b5f8fcae0fe4eb86bb3f2230fad75edb"
|
|
503
541
|
dependencies = [
|
|
504
542
|
"rb-sys-build",
|
|
505
543
|
]
|
|
506
544
|
|
|
507
545
|
[[package]]
|
|
508
546
|
name = "rb-sys-build"
|
|
509
|
-
version = "0.9.
|
|
547
|
+
version = "0.9.130"
|
|
510
548
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
511
|
-
checksum = "
|
|
549
|
+
checksum = "05be6f9c86fe5482808162826f6c047d093b3670582296c770de1d94f8066694"
|
|
512
550
|
dependencies = [
|
|
513
551
|
"bindgen",
|
|
514
552
|
"lazy_static",
|
|
@@ -516,7 +554,7 @@ dependencies = [
|
|
|
516
554
|
"quote",
|
|
517
555
|
"regex",
|
|
518
556
|
"shell-words",
|
|
519
|
-
"syn",
|
|
557
|
+
"syn 2.0.118",
|
|
520
558
|
]
|
|
521
559
|
|
|
522
560
|
[[package]]
|
|
@@ -525,12 +563,6 @@ version = "0.2.3"
|
|
|
525
563
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
526
564
|
checksum = "cca7ad6a7e21e72151d56fe2495a259b5670e204c3adac41ee7ef676ea08117a"
|
|
527
565
|
|
|
528
|
-
[[package]]
|
|
529
|
-
name = "rctree"
|
|
530
|
-
version = "0.6.0"
|
|
531
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
532
|
-
checksum = "e03e7866abec1101869ffa8e2c8355c4c2419d0214ece0cc3e428e5b94dea6e9"
|
|
533
|
-
|
|
534
566
|
[[package]]
|
|
535
567
|
name = "regex"
|
|
536
568
|
version = "1.13.0"
|
|
@@ -607,7 +639,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
|
|
|
607
639
|
dependencies = [
|
|
608
640
|
"proc-macro2",
|
|
609
641
|
"quote",
|
|
610
|
-
"syn",
|
|
642
|
+
"syn 2.0.118",
|
|
611
643
|
]
|
|
612
644
|
|
|
613
645
|
[[package]]
|
|
@@ -670,6 +702,17 @@ dependencies = [
|
|
|
670
702
|
"unicode-ident",
|
|
671
703
|
]
|
|
672
704
|
|
|
705
|
+
[[package]]
|
|
706
|
+
name = "syn"
|
|
707
|
+
version = "3.0.9"
|
|
708
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
709
|
+
checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b"
|
|
710
|
+
dependencies = [
|
|
711
|
+
"proc-macro2",
|
|
712
|
+
"quote",
|
|
713
|
+
"unicode-ident",
|
|
714
|
+
]
|
|
715
|
+
|
|
673
716
|
[[package]]
|
|
674
717
|
name = "syntect"
|
|
675
718
|
version = "5.3.0"
|
|
@@ -709,7 +752,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
|
|
709
752
|
dependencies = [
|
|
710
753
|
"proc-macro2",
|
|
711
754
|
"quote",
|
|
712
|
-
"syn",
|
|
755
|
+
"syn 2.0.118",
|
|
713
756
|
]
|
|
714
757
|
|
|
715
758
|
[[package]]
|
data/README.md
CHANGED
|
@@ -5,7 +5,7 @@ Ruby wrapper for Rust's [comrak](https://github.com/kivikakk/comrak) crate.
|
|
|
5
5
|
It passes all of the CommonMark test suite, and is therefore spec-complete. It also includes extensions to the CommonMark spec as documented in the [GitHub Flavored Markdown spec](http://github.github.com/gfm/), such as support for tables, strikethroughs, and autolinking.
|
|
6
6
|
|
|
7
7
|
> [!NOTE]
|
|
8
|
-
> By default, the following extensions are enabled for end user convenience: `strikethrough`, `
|
|
8
|
+
> By default, the following extensions are enabled for end user convenience: `strikethrough`, `table`, `autolink`, `tasklist` (all from the [GFM spec](http://github.github.com/gfm/)), and `shortcodes`. The `syntax_highlighter` plugin is also enabled by default, using the `"base16-ocean.dark"` theme.
|
|
9
9
|
>
|
|
10
10
|
> For more information on the available options and extensions, see [the documentation below](#options-and-plugins).
|
|
11
11
|
|
|
@@ -184,6 +184,7 @@ Note that there is a distinction in comrak for "parse" options and "render" opti
|
|
|
184
184
|
| `leave_footnote_definitions` | Allow footnote definitions to remain in their original positions instead of being moved to the document's end (only affects AST) | `false` |
|
|
185
185
|
| `ignore_setext` | Ignores setext-style headings. | `false` |
|
|
186
186
|
| `sourcepos_chars` | Use character-based column tracking in source positions instead of byte-based. Relevant for multi-byte UTF-8 documents with `sourcepos`. | `false` |
|
|
187
|
+
| `max_nesting_depth` | The deepest a node may nest below the document. Deeper documents raise `Commonmarker::NestingDepthExceededError` instead of being parsed. | `1000` |
|
|
187
188
|
|
|
188
189
|
### Render options
|
|
189
190
|
|
|
@@ -218,7 +219,6 @@ Commonmarker.to_html('"Hi *there*"', options: {
|
|
|
218
219
|
| Name | Description | Default |
|
|
219
220
|
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------- |
|
|
220
221
|
| `strikethrough` | Enables the [strikethrough extension](https://github.github.com/gfm/#strikethrough-extension-) from the GFM spec. | `true` |
|
|
221
|
-
| `tagfilter` | Enables the [tagfilter extension](https://github.github.com/gfm/#disallowed-raw-html-extension-) from the GFM spec. | `true` |
|
|
222
222
|
| `table` | Enables the [table extension](https://github.github.com/gfm/#tables-extension-) from the GFM spec. | `true` |
|
|
223
223
|
| `autolink` | Enables the [autolink extension](https://github.github.com/gfm/#autolinks-extension-) from the GFM spec. | `true` |
|
|
224
224
|
| `tasklist` | Enables the [task list extension](https://github.github.com/gfm/#task-list-items-extension-) from the GFM spec. | `true` |
|
data/ext/commonmarker/Cargo.toml
CHANGED
|
@@ -6,12 +6,11 @@ rust-version = "1.75.0"
|
|
|
6
6
|
publish = false
|
|
7
7
|
|
|
8
8
|
[dependencies]
|
|
9
|
-
magnus = { version = "0.
|
|
9
|
+
magnus = { version = "0.9", features = ["rb-sys"] }
|
|
10
10
|
rb-sys = { version = "*", default-features = false, features = [
|
|
11
11
|
"stable-api-compiled-fallback",
|
|
12
12
|
] }
|
|
13
13
|
typed-arena = "2.0"
|
|
14
|
-
rctree = "0.6"
|
|
15
14
|
rb-allocator = "0.9"
|
|
16
15
|
|
|
17
16
|
syntect = { version = "5.3", default-features = false, features = [
|
|
@@ -21,7 +20,7 @@ syntect = { version = "5.3", default-features = false, features = [
|
|
|
21
20
|
|
|
22
21
|
# Everywhere except Windows: Oniguruma, the faster engine.
|
|
23
22
|
[target.'cfg(not(windows))'.dependencies]
|
|
24
|
-
comrak = { version = "0.
|
|
23
|
+
comrak = { version = "0.56", default-features = false, features = [
|
|
25
24
|
"shortcodes",
|
|
26
25
|
"syntect-onig",
|
|
27
26
|
] }
|
|
@@ -30,7 +29,7 @@ comrak = { version = "0.54", default-features = false, features = [
|
|
|
30
29
|
# linking a second copy (onig_sys) collides at link time and segfaults (xref #467).
|
|
31
30
|
# syntect-fancy swaps in the pure-Rust fancy-regex backend instead.
|
|
32
31
|
[target.'cfg(windows)'.dependencies]
|
|
33
|
-
comrak = { version = "0.
|
|
32
|
+
comrak = { version = "0.56", default-features = false, features = [
|
|
34
33
|
"shortcodes",
|
|
35
34
|
"syntect-fancy",
|
|
36
35
|
] }
|
data/ext/commonmarker/src/lib.rs
CHANGED
|
@@ -16,7 +16,9 @@ use typed_arena::Arena;
|
|
|
16
16
|
|
|
17
17
|
use crate::options::{iterate_extension_options, iterate_parse_options, iterate_render_options};
|
|
18
18
|
|
|
19
|
+
mod nesting;
|
|
19
20
|
mod node;
|
|
21
|
+
mod rctree;
|
|
20
22
|
mod utils;
|
|
21
23
|
|
|
22
24
|
pub const EMPTY_STR: &str = "";
|
|
@@ -55,6 +57,8 @@ fn commonmark_parse(ruby: &Ruby, args: &[Value]) -> Result<CommonmarkerNode, mag
|
|
|
55
57
|
)?;
|
|
56
58
|
let (rb_parse, rb_render, rb_extension) = kwargs.optional;
|
|
57
59
|
|
|
60
|
+
let max_nesting_depth = nesting::max_nesting_depth(ruby, rb_parse)?;
|
|
61
|
+
|
|
58
62
|
let mut comrak_parse_options = comrak::options::Parse::default();
|
|
59
63
|
let mut comrak_render_options = comrak::options::Render::default();
|
|
60
64
|
let mut comrak_extension_options = comrak::options::Extension::default();
|
|
@@ -78,7 +82,7 @@ fn commonmark_parse(ruby: &Ruby, args: &[Value]) -> Result<CommonmarkerNode, mag
|
|
|
78
82
|
let arena = Arena::new();
|
|
79
83
|
let root = parse_document(&arena, commonmark_str, &comrak_options);
|
|
80
84
|
|
|
81
|
-
CommonmarkerNode::new_from_comrak_node(root)
|
|
85
|
+
CommonmarkerNode::new_from_comrak_node(ruby, root, max_nesting_depth)
|
|
82
86
|
}
|
|
83
87
|
|
|
84
88
|
fn commonmark_to_html(ruby: &Ruby, args: &[Value]) -> Result<RString, magnus::Error> {
|
|
@@ -107,6 +111,8 @@ fn commonmark_to_html(ruby: &Ruby, args: &[Value]) -> Result<RString, magnus::Er
|
|
|
107
111
|
)?;
|
|
108
112
|
let (rb_render, rb_parse, rb_extension, rb_plugins) = kwargs.optional;
|
|
109
113
|
|
|
114
|
+
let max_nesting_depth = nesting::max_nesting_depth(ruby, rb_parse)?;
|
|
115
|
+
|
|
110
116
|
let mut comrak_parse_options = comrak::options::Parse::default();
|
|
111
117
|
let mut comrak_render_options = comrak::options::Render::default();
|
|
112
118
|
let mut comrak_extension_options = comrak::options::Extension::default();
|
|
@@ -130,7 +136,9 @@ fn commonmark_to_html(ruby: &Ruby, args: &[Value]) -> Result<RString, magnus::Er
|
|
|
130
136
|
};
|
|
131
137
|
|
|
132
138
|
match syntect_adapter {
|
|
133
|
-
Some(ref adapter) =>
|
|
139
|
+
Some(ref adapter) => {
|
|
140
|
+
comrak_plugins.render.codefence_syntax_highlighter = Some(adapter.as_ref())
|
|
141
|
+
}
|
|
134
142
|
None => comrak_plugins.render.codefence_syntax_highlighter = None,
|
|
135
143
|
}
|
|
136
144
|
|
|
@@ -148,6 +156,8 @@ fn commonmark_to_html(ruby: &Ruby, args: &[Value]) -> Result<RString, magnus::Er
|
|
|
148
156
|
let arena = Arena::new();
|
|
149
157
|
let root = parse_document(&arena, commonmark_str, &comrak_options);
|
|
150
158
|
|
|
159
|
+
nesting::check(ruby, root, max_nesting_depth)?;
|
|
160
|
+
|
|
151
161
|
comrak::html::format_document_with_plugins(root, &comrak_options, &mut writer, &comrak_plugins)
|
|
152
162
|
.map_err(|e| magnus::Error::new(ruby.exception_runtime_error(), e.to_string()))?;
|
|
153
163
|
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
use comrak::arena_tree::NodeEdge;
|
|
2
|
+
use comrak::nodes::AstNode;
|
|
3
|
+
use magnus::value::ReprValue;
|
|
4
|
+
use magnus::{ExceptionClass, Module, RHash, Ruby, TryConvert};
|
|
5
|
+
|
|
6
|
+
/// Default for the `max_nesting_depth` parse option. Mirrors
|
|
7
|
+
/// `Commonmarker::Config::OPTIONS[:parse][:max_nesting_depth]`, and also applies
|
|
8
|
+
/// when the option is passed as `nil`, which `Commonmarker::Config` strips.
|
|
9
|
+
pub const DEFAULT_MAX_NESTING_DEPTH: usize = 1000;
|
|
10
|
+
|
|
11
|
+
const PARSE_MAX_NESTING_DEPTH: &str = "max_nesting_depth";
|
|
12
|
+
|
|
13
|
+
/// Reads the `max_nesting_depth` parse option, falling back to the default.
|
|
14
|
+
pub fn max_nesting_depth(ruby: &Ruby, rb_parse: Option<RHash>) -> Result<usize, magnus::Error> {
|
|
15
|
+
let value = rb_parse.and_then(|options| options.get(ruby.to_symbol(PARSE_MAX_NESTING_DEPTH)));
|
|
16
|
+
|
|
17
|
+
match value {
|
|
18
|
+
Some(value) if !value.is_nil() => {
|
|
19
|
+
let depth: i64 = TryConvert::try_convert(value)?;
|
|
20
|
+
usize::try_from(depth).map_err(|_| {
|
|
21
|
+
magnus::Error::new(
|
|
22
|
+
ruby.exception_arg_error(),
|
|
23
|
+
format!("parse option `:max_nesting_depth` must be a non-negative Integer; got {depth}"),
|
|
24
|
+
)
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
_ => Ok(DEFAULT_MAX_NESTING_DEPTH),
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/// The error raised when a document nests deeper than `max_nesting_depth`.
|
|
32
|
+
pub fn exceeded_error(ruby: &Ruby, max_nesting_depth: usize) -> magnus::Error {
|
|
33
|
+
let class = ruby
|
|
34
|
+
.define_module("Commonmarker")
|
|
35
|
+
.and_then(|module| module.const_get::<_, ExceptionClass>("NestingDepthExceededError"));
|
|
36
|
+
|
|
37
|
+
match class {
|
|
38
|
+
Ok(class) => magnus::Error::new(
|
|
39
|
+
class,
|
|
40
|
+
format!(
|
|
41
|
+
"nesting depth exceeds the max_nesting_depth parse option ({max_nesting_depth})"
|
|
42
|
+
),
|
|
43
|
+
),
|
|
44
|
+
Err(error) => error,
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/// Fails if any node sits more than `max_nesting_depth` levels below the
|
|
49
|
+
/// document root. `traverse` is iterative, so this is safe on arbitrarily deep
|
|
50
|
+
/// trees.
|
|
51
|
+
pub fn check<'a>(
|
|
52
|
+
ruby: &Ruby,
|
|
53
|
+
root: &'a AstNode<'a>,
|
|
54
|
+
max_nesting_depth: usize,
|
|
55
|
+
) -> Result<(), magnus::Error> {
|
|
56
|
+
let mut depth: usize = 0;
|
|
57
|
+
|
|
58
|
+
for edge in root.traverse() {
|
|
59
|
+
match edge {
|
|
60
|
+
NodeEdge::Start(_) => {
|
|
61
|
+
if depth > max_nesting_depth {
|
|
62
|
+
return Err(exceeded_error(ruby, max_nesting_depth));
|
|
63
|
+
}
|
|
64
|
+
depth += 1;
|
|
65
|
+
}
|
|
66
|
+
NodeEdge::End(_) => depth -= 1,
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
Ok(())
|
|
71
|
+
}
|