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.
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 shortcodes extension, placing the title after the dividing pipe. | `false` |
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
 
@@ -6,11 +6,11 @@ rust-version = "1.75.0"
6
6
  publish = false
7
7
 
8
8
  [dependencies]
9
- magnus = { version = "0.7", features = ["rb-sys"] }
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.39", features = ["shortcodes"] }
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"
@@ -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::{define_module, function, r_hash::ForEach, scan_args, Error, RHash, Symbol, Value};
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 = match format_options(rb_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 m_commonmarker = define_module("Commonmarker")?;
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
- magnus::exception::arg_error(),
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
- magnus::exception::arg_error(),
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
- magnus::exception::arg_error(),
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 => Symbol::new("document"),
581
- ComrakNodeValue::BlockQuote => Symbol::new("block_quote"),
582
- ComrakNodeValue::FootnoteDefinition(_) => Symbol::new("footnote_definition"),
583
- ComrakNodeValue::List(..) => Symbol::new("list"),
584
- ComrakNodeValue::DescriptionList => Symbol::new("description_list"),
585
- ComrakNodeValue::DescriptionItem(_) => Symbol::new("description_item"),
586
- ComrakNodeValue::DescriptionTerm => Symbol::new("description_term"),
587
- ComrakNodeValue::DescriptionDetails => Symbol::new("description_details"),
588
- ComrakNodeValue::Item(..) => Symbol::new("item"),
589
- ComrakNodeValue::CodeBlock(..) => Symbol::new("code_block"),
590
- ComrakNodeValue::HtmlBlock(..) => Symbol::new("html_block"),
591
- ComrakNodeValue::Paragraph => Symbol::new("paragraph"),
592
- ComrakNodeValue::Heading(..) => Symbol::new("heading"),
593
- ComrakNodeValue::ThematicBreak => Symbol::new("thematic_break"),
594
- ComrakNodeValue::Table(..) => Symbol::new("table"),
595
- ComrakNodeValue::TableRow(..) => Symbol::new("table_row"),
596
- ComrakNodeValue::TableCell => Symbol::new("table_cell"),
597
- ComrakNodeValue::Text(..) => Symbol::new("text"),
598
- ComrakNodeValue::SoftBreak => Symbol::new("softbreak"),
599
- ComrakNodeValue::LineBreak => Symbol::new("linebreak"),
600
- ComrakNodeValue::Image(..) => Symbol::new("image"),
601
- ComrakNodeValue::Link(..) => Symbol::new("link"),
602
- ComrakNodeValue::Emph => Symbol::new("emph"),
603
- ComrakNodeValue::Raw(..) => Symbol::new("raw"),
604
- ComrakNodeValue::Strong => Symbol::new("strong"),
605
- ComrakNodeValue::Code(..) => Symbol::new("code"),
606
- ComrakNodeValue::HtmlInline(..) => Symbol::new("html_inline"),
607
- ComrakNodeValue::Strikethrough => Symbol::new("strikethrough"),
608
- ComrakNodeValue::FrontMatter(_) => Symbol::new("frontmatter"),
609
- ComrakNodeValue::TaskItem { .. } => Symbol::new("taskitem"),
610
- ComrakNodeValue::Superscript => Symbol::new("superscript"),
611
- ComrakNodeValue::FootnoteReference(..) => Symbol::new("footnote_reference"),
612
- ComrakNodeValue::ShortCode(_) => Symbol::new("shortcode"),
613
- ComrakNodeValue::MultilineBlockQuote(_) => Symbol::new("multiline_block_quote"),
614
- ComrakNodeValue::Escaped => Symbol::new("escaped"),
615
- ComrakNodeValue::Math(..) => Symbol::new("math"),
616
- ComrakNodeValue::WikiLink(..) => Symbol::new("wikilink"),
617
- ComrakNodeValue::Underline => Symbol::new("underline"),
618
- ComrakNodeValue::Subscript => Symbol::new("subscript"),
619
- ComrakNodeValue::SpoileredText => Symbol::new("spoilered_text"),
620
- ComrakNodeValue::EscapedTag(_) => Symbol::new("escaped_tag"),
621
- ComrakNodeValue::Alert(..) => Symbol::new("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 result = RHash::new();
682
- result.aset(Symbol::new("start_line"), node.data.sourcepos.start.line)?;
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
- Symbol::new("start_column"),
687
+ ruby.to_symbol("start_column"),
685
688
  node.data.sourcepos.start.column,
686
689
  )?;
687
- result.aset(Symbol::new("end_line"), node.data.sourcepos.end.line)?;
688
- result.aset(Symbol::new("end_column"), node.data.sourcepos.end.column)?;
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
- magnus::exception::type_error(),
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
- magnus::exception::type_error(),
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
- magnus::exception::type_error(),
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
- magnus::exception::type_error(),
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
- magnus::exception::type_error(),
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
- magnus::exception::type_error(),
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
- magnus::exception::type_error(),
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
- magnus::exception::type_error(),
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(Symbol::new("bullet")),
861
- comrak::nodes::ListType::Ordered => Ok(Symbol::new("ordered")),
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
- magnus::exception::type_error(),
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
- magnus::exception::type_error(),
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
- magnus::exception::type_error(),
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
- magnus::exception::type_error(),
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
- magnus::exception::type_error(),
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
- magnus::exception::type_error(),
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
- magnus::exception::type_error(),
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
- magnus::exception::type_error(),
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
- magnus::exception::runtime_error(),
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
- magnus::exception::runtime_error(),
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 = match format_options(rb_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
- magnus::exception::runtime_error(),
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
- magnus::exception::runtime_error(),
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", magnus::class::object())
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::{class, r_hash::ForEach, Error, RHash, Symbol, Value};
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
- assert!(value.is_kind_of(class::hash()));
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);