commonmarker 2.3.1 → 2.4.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.
- checksums.yaml +4 -4
- data/Cargo.lock +238 -189
- data/README.md +2 -1
- data/ext/commonmarker/Cargo.toml +2 -2
- data/ext/commonmarker/src/lib.rs +4 -6
- data/ext/commonmarker/src/node.rs +96 -77
- data/ext/commonmarker/src/options.rs +8 -2
- data/ext/commonmarker/src/plugins/syntax_highlighting.rs +21 -17
- data/lib/commonmarker/config.rb +1 -0
- data/lib/commonmarker/version.rb +1 -1
- metadata +2 -2
data/README.md
CHANGED
@@ -208,12 +208,13 @@ Commonmarker.to_html('"Hi *there*"', options: {
|
|
208
208
|
| `math_dollars`, `math_code` | Enables the math extension. | `false` |
|
209
209
|
| `shortcodes` | Enables the shortcodes extension. | `true` |
|
210
210
|
| `wikilinks_title_before_pipe` | Enables the wikilinks extension, placing the title before the dividing pipe. | `false` |
|
211
|
-
| `wikilinks_title_after_pipe` | Enables the
|
211
|
+
| `wikilinks_title_after_pipe` | Enables the wikilinks extension, placing the title after the dividing pipe. | `false` |
|
212
212
|
| `underline` | Enables the underline extension. | `false` |
|
213
213
|
| `spoiler` | Enables the spoiler extension. | `false` |
|
214
214
|
| `greentext` | Enables the greentext extension. | `false` |
|
215
215
|
| `subscript` | Enables the subscript extension. | `false` |
|
216
216
|
| `alerts` | Enables the alerts extension. | `false` |
|
217
|
+
| `cjk_friendly_emphasis` | Enables the [CJK friendly emphasis](https://github.com/tats-u/markdown-cjk-friendly) extension. | `false` |
|
217
218
|
|
218
219
|
For more information on these options, see [the comrak documentation](https://github.com/kivikakk/comrak#usage).
|
219
220
|
|
data/ext/commonmarker/Cargo.toml
CHANGED
@@ -6,11 +6,11 @@ rust-version = "1.75.0"
|
|
6
6
|
publish = false
|
7
7
|
|
8
8
|
[dependencies]
|
9
|
-
magnus = { version = "0.
|
9
|
+
magnus = { version = "0.8", features = ["rb-sys"] }
|
10
10
|
rb-sys = { version = "*", default-features = false, features = [
|
11
11
|
"stable-api-compiled-fallback",
|
12
12
|
] }
|
13
|
-
comrak = { version = "0.
|
13
|
+
comrak = { version = "0.41", features = ["shortcodes"] }
|
14
14
|
syntect = { version = "5.2", features = ["plist-load"] }
|
15
15
|
typed-arena = "2.0"
|
16
16
|
rctree = "0.6"
|
data/ext/commonmarker/src/lib.rs
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
extern crate core;
|
2
2
|
|
3
3
|
use comrak::{markdown_to_html_with_plugins, parse_document, ComrakOptions};
|
4
|
-
use magnus::{
|
4
|
+
use magnus::{function, r_hash::ForEach, scan_args, Error, RHash, Symbol, Value};
|
5
5
|
use node::CommonmarkerNode;
|
6
6
|
use plugins::syntax_highlighting::construct_syntax_highlighter_from_plugin;
|
7
7
|
|
@@ -51,10 +51,7 @@ fn commonmark_to_html(args: &[Value]) -> Result<String, magnus::Error> {
|
|
51
51
|
)?;
|
52
52
|
let (rb_options, rb_plugins) = kwargs.optional;
|
53
53
|
|
54
|
-
let comrak_options =
|
55
|
-
Ok(options) => options,
|
56
|
-
Err(err) => return Err(err),
|
57
|
-
};
|
54
|
+
let comrak_options = format_options(rb_options)?;
|
58
55
|
|
59
56
|
let mut comrak_plugins = comrak::Plugins::default();
|
60
57
|
|
@@ -91,7 +88,8 @@ fn format_options<'c>(rb_options: Option<RHash>) -> Result<comrak::Options<'c>,
|
|
91
88
|
|
92
89
|
#[magnus::init]
|
93
90
|
fn init() -> Result<(), Error> {
|
94
|
-
let
|
91
|
+
let ruby = magnus::Ruby::get().unwrap();
|
92
|
+
let m_commonmarker = ruby.define_module("Commonmarker")?;
|
95
93
|
|
96
94
|
m_commonmarker.define_module_function("commonmark_parse", function!(commonmark_parse, -1))?;
|
97
95
|
m_commonmarker
|
@@ -33,6 +33,7 @@ unsafe impl Send for CommonmarkerNode {}
|
|
33
33
|
|
34
34
|
impl CommonmarkerNode {
|
35
35
|
pub fn new(args: &[Value]) -> Result<Self, magnus::Error> {
|
36
|
+
let ruby = magnus::Ruby::get().unwrap();
|
36
37
|
let args = scan_args::scan_args::<_, (), (), (), _, ()>(args)?;
|
37
38
|
let (node_type,): (Symbol,) = args.required;
|
38
39
|
|
@@ -91,7 +92,7 @@ impl CommonmarkerNode {
|
|
91
92
|
|
92
93
|
if commonmark_list_type != "bullet" && commonmark_list_type != "ordered" {
|
93
94
|
return Err(magnus::Error::new(
|
94
|
-
|
95
|
+
ruby.exception_arg_error(),
|
95
96
|
"list type must be `bullet` or `ordered`",
|
96
97
|
));
|
97
98
|
}
|
@@ -415,7 +416,7 @@ impl CommonmarkerNode {
|
|
415
416
|
Some(shortcode) => ComrakNodeValue::ShortCode(shortcode),
|
416
417
|
None => {
|
417
418
|
return Err(magnus::Error::new(
|
418
|
-
|
419
|
+
ruby.exception_arg_error(),
|
419
420
|
"could not resolve shortcode",
|
420
421
|
));
|
421
422
|
}
|
@@ -507,7 +508,7 @@ impl CommonmarkerNode {
|
|
507
508
|
"warning" => AlertType::Warning,
|
508
509
|
_ => {
|
509
510
|
return Err(magnus::Error::new(
|
510
|
-
|
511
|
+
ruby.exception_arg_error(),
|
511
512
|
"alert type must be `note`, `tip`, `important`, or `warning`",
|
512
513
|
));
|
513
514
|
}
|
@@ -576,49 +577,50 @@ impl CommonmarkerNode {
|
|
576
577
|
|
577
578
|
fn type_to_symbol(&self) -> Symbol {
|
578
579
|
let node = self.inner.borrow();
|
580
|
+
let ruby = magnus::Ruby::get().unwrap();
|
579
581
|
match node.data.value {
|
580
|
-
ComrakNodeValue::Document =>
|
581
|
-
ComrakNodeValue::BlockQuote =>
|
582
|
-
ComrakNodeValue::FootnoteDefinition(_) =>
|
583
|
-
ComrakNodeValue::List(..) =>
|
584
|
-
ComrakNodeValue::DescriptionList =>
|
585
|
-
ComrakNodeValue::DescriptionItem(_) =>
|
586
|
-
ComrakNodeValue::DescriptionTerm =>
|
587
|
-
ComrakNodeValue::DescriptionDetails =>
|
588
|
-
ComrakNodeValue::Item(..) =>
|
589
|
-
ComrakNodeValue::CodeBlock(..) =>
|
590
|
-
ComrakNodeValue::HtmlBlock(..) =>
|
591
|
-
ComrakNodeValue::Paragraph =>
|
592
|
-
ComrakNodeValue::Heading(..) =>
|
593
|
-
ComrakNodeValue::ThematicBreak =>
|
594
|
-
ComrakNodeValue::Table(..) =>
|
595
|
-
ComrakNodeValue::TableRow(..) =>
|
596
|
-
ComrakNodeValue::TableCell =>
|
597
|
-
ComrakNodeValue::Text(..) =>
|
598
|
-
ComrakNodeValue::SoftBreak =>
|
599
|
-
ComrakNodeValue::LineBreak =>
|
600
|
-
ComrakNodeValue::Image(..) =>
|
601
|
-
ComrakNodeValue::Link(..) =>
|
602
|
-
ComrakNodeValue::Emph =>
|
603
|
-
ComrakNodeValue::Raw(..) =>
|
604
|
-
ComrakNodeValue::Strong =>
|
605
|
-
ComrakNodeValue::Code(..) =>
|
606
|
-
ComrakNodeValue::HtmlInline(..) =>
|
607
|
-
ComrakNodeValue::Strikethrough =>
|
608
|
-
ComrakNodeValue::FrontMatter(_) =>
|
609
|
-
ComrakNodeValue::TaskItem { .. } =>
|
610
|
-
ComrakNodeValue::Superscript =>
|
611
|
-
ComrakNodeValue::FootnoteReference(..) =>
|
612
|
-
ComrakNodeValue::ShortCode(_) =>
|
613
|
-
ComrakNodeValue::MultilineBlockQuote(_) =>
|
614
|
-
ComrakNodeValue::Escaped =>
|
615
|
-
ComrakNodeValue::Math(..) =>
|
616
|
-
ComrakNodeValue::WikiLink(..) =>
|
617
|
-
ComrakNodeValue::Underline =>
|
618
|
-
ComrakNodeValue::Subscript =>
|
619
|
-
ComrakNodeValue::SpoileredText =>
|
620
|
-
ComrakNodeValue::EscapedTag(_) =>
|
621
|
-
ComrakNodeValue::Alert(..) =>
|
582
|
+
ComrakNodeValue::Document => ruby.to_symbol("document"),
|
583
|
+
ComrakNodeValue::BlockQuote => ruby.to_symbol("block_quote"),
|
584
|
+
ComrakNodeValue::FootnoteDefinition(_) => ruby.to_symbol("footnote_definition"),
|
585
|
+
ComrakNodeValue::List(..) => ruby.to_symbol("list"),
|
586
|
+
ComrakNodeValue::DescriptionList => ruby.to_symbol("description_list"),
|
587
|
+
ComrakNodeValue::DescriptionItem(_) => ruby.to_symbol("description_item"),
|
588
|
+
ComrakNodeValue::DescriptionTerm => ruby.to_symbol("description_term"),
|
589
|
+
ComrakNodeValue::DescriptionDetails => ruby.to_symbol("description_details"),
|
590
|
+
ComrakNodeValue::Item(..) => ruby.to_symbol("item"),
|
591
|
+
ComrakNodeValue::CodeBlock(..) => ruby.to_symbol("code_block"),
|
592
|
+
ComrakNodeValue::HtmlBlock(..) => ruby.to_symbol("html_block"),
|
593
|
+
ComrakNodeValue::Paragraph => ruby.to_symbol("paragraph"),
|
594
|
+
ComrakNodeValue::Heading(..) => ruby.to_symbol("heading"),
|
595
|
+
ComrakNodeValue::ThematicBreak => ruby.to_symbol("thematic_break"),
|
596
|
+
ComrakNodeValue::Table(..) => ruby.to_symbol("table"),
|
597
|
+
ComrakNodeValue::TableRow(..) => ruby.to_symbol("table_row"),
|
598
|
+
ComrakNodeValue::TableCell => ruby.to_symbol("table_cell"),
|
599
|
+
ComrakNodeValue::Text(..) => ruby.to_symbol("text"),
|
600
|
+
ComrakNodeValue::SoftBreak => ruby.to_symbol("softbreak"),
|
601
|
+
ComrakNodeValue::LineBreak => ruby.to_symbol("linebreak"),
|
602
|
+
ComrakNodeValue::Image(..) => ruby.to_symbol("image"),
|
603
|
+
ComrakNodeValue::Link(..) => ruby.to_symbol("link"),
|
604
|
+
ComrakNodeValue::Emph => ruby.to_symbol("emph"),
|
605
|
+
ComrakNodeValue::Raw(..) => ruby.to_symbol("raw"),
|
606
|
+
ComrakNodeValue::Strong => ruby.to_symbol("strong"),
|
607
|
+
ComrakNodeValue::Code(..) => ruby.to_symbol("code"),
|
608
|
+
ComrakNodeValue::HtmlInline(..) => ruby.to_symbol("html_inline"),
|
609
|
+
ComrakNodeValue::Strikethrough => ruby.to_symbol("strikethrough"),
|
610
|
+
ComrakNodeValue::FrontMatter(_) => ruby.to_symbol("frontmatter"),
|
611
|
+
ComrakNodeValue::TaskItem { .. } => ruby.to_symbol("taskitem"),
|
612
|
+
ComrakNodeValue::Superscript => ruby.to_symbol("superscript"),
|
613
|
+
ComrakNodeValue::FootnoteReference(..) => ruby.to_symbol("footnote_reference"),
|
614
|
+
ComrakNodeValue::ShortCode(_) => ruby.to_symbol("shortcode"),
|
615
|
+
ComrakNodeValue::MultilineBlockQuote(_) => ruby.to_symbol("multiline_block_quote"),
|
616
|
+
ComrakNodeValue::Escaped => ruby.to_symbol("escaped"),
|
617
|
+
ComrakNodeValue::Math(..) => ruby.to_symbol("math"),
|
618
|
+
ComrakNodeValue::WikiLink(..) => ruby.to_symbol("wikilink"),
|
619
|
+
ComrakNodeValue::Underline => ruby.to_symbol("underline"),
|
620
|
+
ComrakNodeValue::Subscript => ruby.to_symbol("subscript"),
|
621
|
+
ComrakNodeValue::SpoileredText => ruby.to_symbol("spoilered_text"),
|
622
|
+
ComrakNodeValue::EscapedTag(_) => ruby.to_symbol("escaped_tag"),
|
623
|
+
ComrakNodeValue::Alert(..) => ruby.to_symbol("alert"),
|
622
624
|
}
|
623
625
|
}
|
624
626
|
|
@@ -678,14 +680,15 @@ impl CommonmarkerNode {
|
|
678
680
|
fn get_sourcepos(&self) -> Result<RHash, magnus::Error> {
|
679
681
|
let node = self.inner.borrow();
|
680
682
|
|
681
|
-
let
|
682
|
-
result.
|
683
|
+
let ruby = magnus::Ruby::get().unwrap();
|
684
|
+
let result = ruby.hash_new();
|
685
|
+
result.aset(ruby.to_symbol("start_line"), node.data.sourcepos.start.line)?;
|
683
686
|
result.aset(
|
684
|
-
|
687
|
+
ruby.to_symbol("start_column"),
|
685
688
|
node.data.sourcepos.start.column,
|
686
689
|
)?;
|
687
|
-
result.aset(
|
688
|
-
result.aset(
|
690
|
+
result.aset(ruby.to_symbol("end_line"), node.data.sourcepos.end.line)?;
|
691
|
+
result.aset(ruby.to_symbol("end_column"), node.data.sourcepos.end.column)?;
|
689
692
|
|
690
693
|
Ok(result)
|
691
694
|
}
|
@@ -715,19 +718,21 @@ impl CommonmarkerNode {
|
|
715
718
|
}
|
716
719
|
|
717
720
|
fn get_url(&self) -> Result<String, magnus::Error> {
|
721
|
+
let ruby = magnus::Ruby::get().unwrap();
|
718
722
|
let node = self.inner.borrow();
|
719
723
|
|
720
724
|
match &node.data.value {
|
721
725
|
ComrakNodeValue::Link(link) => Ok(link.url.to_string()),
|
722
726
|
ComrakNodeValue::Image(image) => Ok(image.url.to_string()),
|
723
727
|
_ => Err(magnus::Error::new(
|
724
|
-
|
728
|
+
ruby.exception_type_error(),
|
725
729
|
"node is not an image or link node",
|
726
730
|
)),
|
727
731
|
}
|
728
732
|
}
|
729
733
|
|
730
734
|
fn set_url(&self, new_url: String) -> Result<bool, magnus::Error> {
|
735
|
+
let ruby = magnus::Ruby::get().unwrap();
|
731
736
|
let mut node = self.inner.borrow_mut();
|
732
737
|
|
733
738
|
match node.data.value {
|
@@ -740,13 +745,14 @@ impl CommonmarkerNode {
|
|
740
745
|
Ok(true)
|
741
746
|
}
|
742
747
|
_ => Err(magnus::Error::new(
|
743
|
-
|
748
|
+
ruby.exception_type_error(),
|
744
749
|
"node is not an image or link node",
|
745
750
|
)),
|
746
751
|
}
|
747
752
|
}
|
748
753
|
|
749
754
|
fn get_string_content(&self) -> Result<String, magnus::Error> {
|
755
|
+
let ruby = magnus::Ruby::get().unwrap();
|
750
756
|
let node = self.inner.borrow();
|
751
757
|
|
752
758
|
match node.data.value {
|
@@ -760,13 +766,14 @@ impl CommonmarkerNode {
|
|
760
766
|
match node.data.value.text() {
|
761
767
|
Some(s) => Ok(s.to_string()),
|
762
768
|
None => Err(magnus::Error::new(
|
763
|
-
|
769
|
+
ruby.exception_type_error(),
|
764
770
|
"node does not have string content",
|
765
771
|
)),
|
766
772
|
}
|
767
773
|
}
|
768
774
|
|
769
775
|
fn set_string_content(&self, new_content: String) -> Result<bool, magnus::Error> {
|
776
|
+
let ruby = magnus::Ruby::get().unwrap();
|
770
777
|
let mut node = self.inner.borrow_mut();
|
771
778
|
|
772
779
|
match node.data.value {
|
@@ -787,26 +794,28 @@ impl CommonmarkerNode {
|
|
787
794
|
Ok(true)
|
788
795
|
}
|
789
796
|
None => Err(magnus::Error::new(
|
790
|
-
|
797
|
+
ruby.exception_type_error(),
|
791
798
|
"node does not have string content",
|
792
799
|
)),
|
793
800
|
}
|
794
801
|
}
|
795
802
|
|
796
803
|
fn get_title(&self) -> Result<String, magnus::Error> {
|
804
|
+
let ruby = magnus::Ruby::get().unwrap();
|
797
805
|
let node = self.inner.borrow();
|
798
806
|
|
799
807
|
match &node.data.value {
|
800
808
|
ComrakNodeValue::Link(link) => Ok(link.title.to_string()),
|
801
809
|
ComrakNodeValue::Image(image) => Ok(image.title.to_string()),
|
802
810
|
_ => Err(magnus::Error::new(
|
803
|
-
|
811
|
+
ruby.exception_type_error(),
|
804
812
|
"node is not an image or link node",
|
805
813
|
)),
|
806
814
|
}
|
807
815
|
}
|
808
816
|
|
809
817
|
fn set_title(&self, new_title: String) -> Result<bool, magnus::Error> {
|
818
|
+
let ruby = magnus::Ruby::get().unwrap();
|
810
819
|
let mut node = self.inner.borrow_mut();
|
811
820
|
|
812
821
|
match node.data.value {
|
@@ -819,25 +828,27 @@ impl CommonmarkerNode {
|
|
819
828
|
Ok(true)
|
820
829
|
}
|
821
830
|
_ => Err(magnus::Error::new(
|
822
|
-
|
831
|
+
ruby.exception_type_error(),
|
823
832
|
"node is not an image or link node",
|
824
833
|
)),
|
825
834
|
}
|
826
835
|
}
|
827
836
|
|
828
837
|
fn get_header_level(&self) -> Result<u8, magnus::Error> {
|
838
|
+
let ruby = magnus::Ruby::get().unwrap();
|
829
839
|
let node = self.inner.borrow();
|
830
840
|
|
831
841
|
match &node.data.value {
|
832
842
|
ComrakNodeValue::Heading(heading) => Ok(heading.level),
|
833
843
|
_ => Err(magnus::Error::new(
|
834
|
-
|
844
|
+
ruby.exception_type_error(),
|
835
845
|
"node is not a heading node",
|
836
846
|
)),
|
837
847
|
}
|
838
848
|
}
|
839
849
|
|
840
850
|
fn set_header_level(&self, new_level: u8) -> Result<bool, magnus::Error> {
|
851
|
+
let ruby = magnus::Ruby::get().unwrap();
|
841
852
|
let mut node = self.inner.borrow_mut();
|
842
853
|
|
843
854
|
match node.data.value {
|
@@ -846,7 +857,7 @@ impl CommonmarkerNode {
|
|
846
857
|
Ok(true)
|
847
858
|
}
|
848
859
|
_ => Err(magnus::Error::new(
|
849
|
-
|
860
|
+
ruby.exception_type_error(),
|
850
861
|
"node is not a heading node",
|
851
862
|
)),
|
852
863
|
}
|
@@ -854,20 +865,22 @@ impl CommonmarkerNode {
|
|
854
865
|
|
855
866
|
fn get_list_type(&self) -> Result<Symbol, magnus::Error> {
|
856
867
|
let node = self.inner.borrow();
|
868
|
+
let ruby = magnus::Ruby::get().unwrap();
|
857
869
|
|
858
870
|
match &node.data.value {
|
859
871
|
ComrakNodeValue::List(list) => match list.list_type {
|
860
|
-
comrak::nodes::ListType::Bullet => Ok(
|
861
|
-
comrak::nodes::ListType::Ordered => Ok(
|
872
|
+
comrak::nodes::ListType::Bullet => Ok(ruby.to_symbol("bullet")),
|
873
|
+
comrak::nodes::ListType::Ordered => Ok(ruby.to_symbol("ordered")),
|
862
874
|
},
|
863
875
|
_ => Err(magnus::Error::new(
|
864
|
-
|
876
|
+
ruby.exception_type_error(),
|
865
877
|
"node is not a list node",
|
866
878
|
)),
|
867
879
|
}
|
868
880
|
}
|
869
881
|
|
870
882
|
fn set_list_type(&self, new_type: Symbol) -> Result<bool, magnus::Error> {
|
883
|
+
let ruby = magnus::Ruby::get().unwrap();
|
871
884
|
let mut node = self.inner.borrow_mut();
|
872
885
|
|
873
886
|
match node.data.value {
|
@@ -880,25 +893,27 @@ impl CommonmarkerNode {
|
|
880
893
|
Ok(true)
|
881
894
|
}
|
882
895
|
_ => Err(magnus::Error::new(
|
883
|
-
|
896
|
+
ruby.exception_type_error(),
|
884
897
|
"node is not a list node",
|
885
898
|
)),
|
886
899
|
}
|
887
900
|
}
|
888
901
|
|
889
902
|
fn get_list_start(&self) -> Result<usize, magnus::Error> {
|
903
|
+
let ruby = magnus::Ruby::get().unwrap();
|
890
904
|
let node = self.inner.borrow();
|
891
905
|
|
892
906
|
match &node.data.value {
|
893
907
|
ComrakNodeValue::List(list) => Ok(list.start),
|
894
908
|
_ => Err(magnus::Error::new(
|
895
|
-
|
909
|
+
ruby.exception_type_error(),
|
896
910
|
"node is not a list node",
|
897
911
|
)),
|
898
912
|
}
|
899
913
|
}
|
900
914
|
|
901
915
|
fn set_list_start(&self, new_start: usize) -> Result<bool, magnus::Error> {
|
916
|
+
let ruby = magnus::Ruby::get().unwrap();
|
902
917
|
let mut node = self.inner.borrow_mut();
|
903
918
|
|
904
919
|
match node.data.value {
|
@@ -907,25 +922,27 @@ impl CommonmarkerNode {
|
|
907
922
|
Ok(true)
|
908
923
|
}
|
909
924
|
_ => Err(magnus::Error::new(
|
910
|
-
|
925
|
+
ruby.exception_type_error(),
|
911
926
|
"node is not a list node",
|
912
927
|
)),
|
913
928
|
}
|
914
929
|
}
|
915
930
|
|
916
931
|
fn get_list_tight(&self) -> Result<bool, magnus::Error> {
|
932
|
+
let ruby = magnus::Ruby::get().unwrap();
|
917
933
|
let node = self.inner.borrow();
|
918
934
|
|
919
935
|
match &node.data.value {
|
920
936
|
ComrakNodeValue::List(list) => Ok(list.tight),
|
921
937
|
_ => Err(magnus::Error::new(
|
922
|
-
|
938
|
+
ruby.exception_type_error(),
|
923
939
|
"node is not a list node",
|
924
940
|
)),
|
925
941
|
}
|
926
942
|
}
|
927
943
|
|
928
944
|
fn set_list_tight(&self, new_tight: bool) -> Result<bool, magnus::Error> {
|
945
|
+
let ruby = magnus::Ruby::get().unwrap();
|
929
946
|
let mut node = self.inner.borrow_mut();
|
930
947
|
|
931
948
|
match node.data.value {
|
@@ -934,25 +951,27 @@ impl CommonmarkerNode {
|
|
934
951
|
Ok(true)
|
935
952
|
}
|
936
953
|
_ => Err(magnus::Error::new(
|
937
|
-
|
954
|
+
ruby.exception_type_error(),
|
938
955
|
"node is not a list node",
|
939
956
|
)),
|
940
957
|
}
|
941
958
|
}
|
942
959
|
|
943
960
|
fn get_fence_info(&self) -> Result<String, magnus::Error> {
|
961
|
+
let ruby = magnus::Ruby::get().unwrap();
|
944
962
|
let node = self.inner.borrow();
|
945
963
|
|
946
964
|
match &node.data.value {
|
947
965
|
ComrakNodeValue::CodeBlock(code_block) => Ok(code_block.info.to_string()),
|
948
966
|
_ => Err(magnus::Error::new(
|
949
|
-
|
967
|
+
ruby.exception_type_error(),
|
950
968
|
"node is not a code block node",
|
951
969
|
)),
|
952
970
|
}
|
953
971
|
}
|
954
972
|
|
955
973
|
fn set_fence_info(&self, new_info: String) -> Result<bool, magnus::Error> {
|
974
|
+
let ruby = magnus::Ruby::get().unwrap();
|
956
975
|
let mut node = self.inner.borrow_mut();
|
957
976
|
|
958
977
|
match node.data.value {
|
@@ -961,13 +980,14 @@ impl CommonmarkerNode {
|
|
961
980
|
Ok(true)
|
962
981
|
}
|
963
982
|
_ => Err(magnus::Error::new(
|
964
|
-
|
983
|
+
ruby.exception_type_error(),
|
965
984
|
"node is not a code block node",
|
966
985
|
)),
|
967
986
|
}
|
968
987
|
}
|
969
988
|
|
970
989
|
fn to_html(&self, args: &[Value]) -> Result<String, magnus::Error> {
|
990
|
+
let ruby = magnus::Ruby::get().unwrap();
|
971
991
|
let args = scan_args::scan_args::<(), (), (), (), _, ()>(args)?;
|
972
992
|
|
973
993
|
let kwargs = scan_args::get_kwargs::<_, (), (Option<RHash>, Option<RHash>), ()>(
|
@@ -1034,7 +1054,7 @@ impl CommonmarkerNode {
|
|
1034
1054
|
Ok(_) => {}
|
1035
1055
|
Err(e) => {
|
1036
1056
|
return Err(magnus::Error::new(
|
1037
|
-
|
1057
|
+
ruby.exception_runtime_error(),
|
1038
1058
|
format!("cannot convert into html: {}", e),
|
1039
1059
|
));
|
1040
1060
|
}
|
@@ -1043,13 +1063,14 @@ impl CommonmarkerNode {
|
|
1043
1063
|
match std::str::from_utf8(&output) {
|
1044
1064
|
Ok(s) => Ok(s.to_string()),
|
1045
1065
|
Err(_e) => Err(magnus::Error::new(
|
1046
|
-
|
1066
|
+
ruby.exception_runtime_error(),
|
1047
1067
|
"cannot convert into utf-8",
|
1048
1068
|
)),
|
1049
1069
|
}
|
1050
1070
|
}
|
1051
1071
|
|
1052
1072
|
fn to_commonmark(&self, args: &[Value]) -> Result<String, magnus::Error> {
|
1073
|
+
let ruby = magnus::Ruby::get().unwrap();
|
1053
1074
|
let args = scan_args::scan_args::<(), (), (), (), _, ()>(args)?;
|
1054
1075
|
|
1055
1076
|
let kwargs = scan_args::get_kwargs::<_, (), (Option<RHash>, Option<RHash>), ()>(
|
@@ -1060,10 +1081,7 @@ impl CommonmarkerNode {
|
|
1060
1081
|
let (rb_options, rb_plugins) = kwargs.optional;
|
1061
1082
|
|
1062
1083
|
let _comrak_options = format_options(rb_options);
|
1063
|
-
let comrak_options =
|
1064
|
-
Ok(options) => options,
|
1065
|
-
Err(err) => return Err(err),
|
1066
|
-
};
|
1084
|
+
let comrak_options = format_options(rb_options)?;
|
1067
1085
|
|
1068
1086
|
let mut comrak_plugins = comrak::Plugins::default();
|
1069
1087
|
|
@@ -1117,7 +1135,7 @@ impl CommonmarkerNode {
|
|
1117
1135
|
Ok(_) => {}
|
1118
1136
|
Err(e) => {
|
1119
1137
|
return Err(magnus::Error::new(
|
1120
|
-
|
1138
|
+
ruby.exception_runtime_error(),
|
1121
1139
|
format!("cannot convert into html: {}", e),
|
1122
1140
|
));
|
1123
1141
|
}
|
@@ -1126,7 +1144,7 @@ impl CommonmarkerNode {
|
|
1126
1144
|
match std::str::from_utf8(&output) {
|
1127
1145
|
Ok(s) => Ok(s.to_string()),
|
1128
1146
|
Err(_e) => Err(magnus::Error::new(
|
1129
|
-
|
1147
|
+
ruby.exception_runtime_error(),
|
1130
1148
|
"cannot convert into utf-8",
|
1131
1149
|
)),
|
1132
1150
|
}
|
@@ -1134,8 +1152,9 @@ impl CommonmarkerNode {
|
|
1134
1152
|
}
|
1135
1153
|
|
1136
1154
|
pub fn init(m_commonmarker: RModule) -> Result<(), magnus::Error> {
|
1155
|
+
let ruby = magnus::Ruby::get().unwrap();
|
1137
1156
|
let c_node = m_commonmarker
|
1138
|
-
.define_class("Node",
|
1157
|
+
.define_class("Node", ruby.class_object())
|
1139
1158
|
.expect("cannot define class Commonmarker::Node");
|
1140
1159
|
|
1141
1160
|
c_node.define_singleton_method("new", function!(CommonmarkerNode::new, -1))?;
|
@@ -4,7 +4,7 @@ use comrak::ComrakOptions;
|
|
4
4
|
|
5
5
|
use magnus::value::ReprValue;
|
6
6
|
use magnus::TryConvert;
|
7
|
-
use magnus::{
|
7
|
+
use magnus::{r_hash::ForEach, Error, RHash, Symbol, Value};
|
8
8
|
|
9
9
|
use crate::utils::try_convert_string;
|
10
10
|
|
@@ -122,6 +122,7 @@ const EXTENSION_SPOILER: &str = "spoiler";
|
|
122
122
|
const EXTENSION_GREENTEXT: &str = "greentext";
|
123
123
|
const EXTENSION_SUBSCRIPT: &str = "subscript";
|
124
124
|
const EXTENSION_ALERTS: &str = "alerts";
|
125
|
+
const EXTENSION_CJK_FRIENDLY_EMPHASIS: &str = "cjk_friendly_emphasis";
|
125
126
|
|
126
127
|
fn iterate_extension_options(comrak_options: &mut ComrakOptions, options_hash: RHash) {
|
127
128
|
options_hash
|
@@ -197,6 +198,10 @@ fn iterate_extension_options(comrak_options: &mut ComrakOptions, options_hash: R
|
|
197
198
|
Cow::Borrowed(EXTENSION_ALERTS) => {
|
198
199
|
comrak_options.extension.alerts = TryConvert::try_convert(value)?;
|
199
200
|
}
|
201
|
+
Cow::Borrowed(EXTENSION_CJK_FRIENDLY_EMPHASIS) => {
|
202
|
+
comrak_options.extension.cjk_friendly_emphasis =
|
203
|
+
TryConvert::try_convert(value)?;
|
204
|
+
}
|
200
205
|
_ => {}
|
201
206
|
}
|
202
207
|
Ok(ForEach::Continue)
|
@@ -209,7 +214,8 @@ pub fn iterate_options_hash(
|
|
209
214
|
key: Symbol,
|
210
215
|
value: RHash,
|
211
216
|
) -> Result<ForEach, Error> {
|
212
|
-
|
217
|
+
let ruby = magnus::Ruby::get().unwrap();
|
218
|
+
assert!(value.is_kind_of(ruby.class_hash()));
|
213
219
|
|
214
220
|
if key.name().unwrap() == "parse" {
|
215
221
|
iterate_parse_options(comrak_options, value);
|