commonmarker 2.5.0 → 2.6.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.
@@ -1,10 +1,7 @@
1
1
  use std::borrow::Cow;
2
2
 
3
- use comrak::ComrakOptions;
4
-
5
- use magnus::value::ReprValue;
6
3
  use magnus::TryConvert;
7
- use magnus::{r_hash::ForEach, Error, RHash, Symbol, Value};
4
+ use magnus::{r_hash::ForEach, RHash, Symbol, Value};
8
5
 
9
6
  use crate::utils::try_convert_string;
10
7
 
@@ -12,23 +9,29 @@ const PARSE_SMART: &str = "smart";
12
9
  const PARSE_DEFAULT_INFO_STRING: &str = "default_info_string";
13
10
  const PARSE_RELAXED_TASKLIST_MATCHING: &str = "relaxed_tasklist_matching";
14
11
  const PARSE_RELAXED_AUTOLINKS: &str = "relaxed_autolinks";
12
+ const PARSE_LEAVE_FOOTNOTE_DEFINITIONS: &str = "leave_footnote_definitions";
15
13
 
16
- fn iterate_parse_options(comrak_options: &mut ComrakOptions, options_hash: RHash) {
14
+ pub fn iterate_parse_options(comrak_options: &mut comrak::options::Parse, options_hash: RHash) {
17
15
  options_hash
18
16
  .foreach(|key: Symbol, value: Value| {
19
17
  match key.name()? {
20
18
  Cow::Borrowed(PARSE_SMART) => {
21
- comrak_options.parse.smart = TryConvert::try_convert(value)?;
19
+ comrak_options.smart = TryConvert::try_convert(value)?;
22
20
  }
23
21
  Cow::Borrowed(PARSE_DEFAULT_INFO_STRING) => {
24
- comrak_options.parse.default_info_string = try_convert_string(value);
22
+ comrak_options.default_info_string = try_convert_string(value);
25
23
  }
26
24
  Cow::Borrowed(PARSE_RELAXED_TASKLIST_MATCHING) => {
27
- comrak_options.parse.relaxed_tasklist_matching =
28
- TryConvert::try_convert(value)?;
25
+ comrak_options.relaxed_tasklist_matching = TryConvert::try_convert(value)?;
26
+ }
27
+ Cow::Borrowed(RENDER_IGNORE_SETEXT) => {
28
+ comrak_options.ignore_setext = TryConvert::try_convert(value)?;
29
29
  }
30
30
  Cow::Borrowed(PARSE_RELAXED_AUTOLINKS) => {
31
- comrak_options.parse.relaxed_autolinks = TryConvert::try_convert(value)?;
31
+ comrak_options.relaxed_autolinks = TryConvert::try_convert(value)?;
32
+ }
33
+ Cow::Borrowed(PARSE_LEAVE_FOOTNOTE_DEFINITIONS) => {
34
+ comrak_options.leave_footnote_definitions = TryConvert::try_convert(value)?;
32
35
  }
33
36
  _ => {}
34
37
  }
@@ -51,48 +54,45 @@ const RENDER_GFM_QUIRKS: &str = "gfm_quirks";
51
54
  const RENDER_PREFER_FENCED: &str = "prefer_fenced";
52
55
  const RENDER_TASKLIST_CLASSES: &str = "tasklist_classes";
53
56
 
54
- fn iterate_render_options(comrak_options: &mut ComrakOptions, options_hash: RHash) {
57
+ pub fn iterate_render_options(comrak_options: &mut comrak::options::Render, options_hash: RHash) {
55
58
  options_hash
56
59
  .foreach(|key: Symbol, value: Value| {
57
60
  match key.name()? {
58
61
  Cow::Borrowed(RENDER_HARDBREAKS) => {
59
- comrak_options.render.hardbreaks = TryConvert::try_convert(value)?;
62
+ comrak_options.hardbreaks = TryConvert::try_convert(value)?;
60
63
  }
61
64
  Cow::Borrowed(RENDER_GITHUB_PRE_LANG) => {
62
- comrak_options.render.github_pre_lang = TryConvert::try_convert(value)?;
65
+ comrak_options.github_pre_lang = TryConvert::try_convert(value)?;
63
66
  }
64
67
  Cow::Borrowed(RENDER_FULL_INFO_STRING) => {
65
- comrak_options.render.full_info_string = TryConvert::try_convert(value)?;
68
+ comrak_options.full_info_string = TryConvert::try_convert(value)?;
66
69
  }
67
70
  Cow::Borrowed(RENDER_WIDTH) => {
68
- comrak_options.render.width = TryConvert::try_convert(value)?;
71
+ comrak_options.width = TryConvert::try_convert(value)?;
69
72
  }
70
73
  Cow::Borrowed(RENDER_UNSAFE) => {
71
- comrak_options.render.unsafe_ = TryConvert::try_convert(value)?;
74
+ comrak_options.r#unsafe = TryConvert::try_convert(value)?;
72
75
  }
73
76
  Cow::Borrowed(RENDER_ESCAPE) => {
74
- comrak_options.render.escape = TryConvert::try_convert(value)?;
77
+ comrak_options.escape = TryConvert::try_convert(value)?;
75
78
  }
76
79
  Cow::Borrowed(RENDER_SOURCEPOS) => {
77
- comrak_options.render.sourcepos = TryConvert::try_convert(value)?;
80
+ comrak_options.sourcepos = TryConvert::try_convert(value)?;
78
81
  }
79
82
  Cow::Borrowed(RENDER_ESCAPED_CHAR_SPANS) => {
80
- comrak_options.render.escaped_char_spans = TryConvert::try_convert(value)?;
81
- }
82
- Cow::Borrowed(RENDER_IGNORE_SETEXT) => {
83
- comrak_options.render.ignore_setext = TryConvert::try_convert(value)?;
83
+ comrak_options.escaped_char_spans = TryConvert::try_convert(value)?;
84
84
  }
85
85
  Cow::Borrowed(RENDER_IGNORE_EMPTY_LINKS) => {
86
- comrak_options.render.ignore_empty_links = TryConvert::try_convert(value)?;
86
+ comrak_options.ignore_empty_links = TryConvert::try_convert(value)?;
87
87
  }
88
88
  Cow::Borrowed(RENDER_GFM_QUIRKS) => {
89
- comrak_options.render.gfm_quirks = TryConvert::try_convert(value)?;
89
+ comrak_options.gfm_quirks = TryConvert::try_convert(value)?;
90
90
  }
91
91
  Cow::Borrowed(RENDER_PREFER_FENCED) => {
92
- comrak_options.render.prefer_fenced = TryConvert::try_convert(value)?;
92
+ comrak_options.prefer_fenced = TryConvert::try_convert(value)?;
93
93
  }
94
94
  Cow::Borrowed(RENDER_TASKLIST_CLASSES) => {
95
- comrak_options.render.tasklist_classes = TryConvert::try_convert(value)?;
95
+ comrak_options.tasklist_classes = TryConvert::try_convert(value)?;
96
96
  }
97
97
  _ => {}
98
98
  }
@@ -122,89 +122,96 @@ const EXTENSION_UNDERLINE: &str = "underline";
122
122
  const EXTENSION_SPOILER: &str = "spoiler";
123
123
  const EXTENSION_GREENTEXT: &str = "greentext";
124
124
  const EXTENSION_SUBSCRIPT: &str = "subscript";
125
+ const EXTENSION_SUBTEXT: &str = "subtext";
125
126
  const EXTENSION_ALERTS: &str = "alerts";
126
127
  const EXTENSION_CJK_FRIENDLY_EMPHASIS: &str = "cjk_friendly_emphasis";
128
+ const EXTENSION_HIGHLIGHT: &str = "highlight";
127
129
 
128
- fn iterate_extension_options(comrak_options: &mut ComrakOptions, options_hash: RHash) {
130
+ pub fn iterate_extension_options(
131
+ comrak_options: &mut comrak::options::Extension,
132
+ options_hash: RHash,
133
+ ) {
129
134
  options_hash
130
135
  .foreach(|key: Symbol, value: Value| {
131
136
  match key.name()? {
132
137
  Cow::Borrowed(EXTENSION_STRIKETHROUGH) => {
133
- comrak_options.extension.strikethrough = TryConvert::try_convert(value)?;
138
+ comrak_options.strikethrough = TryConvert::try_convert(value)?;
134
139
  }
135
140
  Cow::Borrowed(EXTENSION_TAGFILTER) => {
136
- comrak_options.extension.tagfilter = TryConvert::try_convert(value)?;
141
+ comrak_options.tagfilter = TryConvert::try_convert(value)?;
137
142
  }
138
143
  Cow::Borrowed(EXTENSION_TABLE) => {
139
- comrak_options.extension.table = TryConvert::try_convert(value)?;
144
+ comrak_options.table = TryConvert::try_convert(value)?;
140
145
  }
141
146
  Cow::Borrowed(EXTENSION_AUTOLINK) => {
142
- comrak_options.extension.autolink = TryConvert::try_convert(value)?;
147
+ comrak_options.autolink = TryConvert::try_convert(value)?;
143
148
  }
144
149
  Cow::Borrowed(EXTENSION_TASKLIST) => {
145
- comrak_options.extension.tasklist = TryConvert::try_convert(value)?;
150
+ comrak_options.tasklist = TryConvert::try_convert(value)?;
146
151
  }
147
152
  Cow::Borrowed(EXTENSION_SUPERSCRIPT) => {
148
- comrak_options.extension.superscript = TryConvert::try_convert(value)?;
153
+ comrak_options.superscript = TryConvert::try_convert(value)?;
149
154
  }
150
155
  Cow::Borrowed(EXTENSION_HEADER_IDS) => {
151
- comrak_options.extension.header_ids = try_convert_string(value);
156
+ comrak_options.header_ids = try_convert_string(value);
152
157
  }
153
158
  Cow::Borrowed(EXTENSION_FOOTNOTES) => {
154
- comrak_options.extension.footnotes = TryConvert::try_convert(value)?;
159
+ comrak_options.footnotes = TryConvert::try_convert(value)?;
155
160
  }
156
161
  Cow::Borrowed(EXTENSION_INLINE_FOOTNOTES) => {
157
- comrak_options.extension.inline_footnotes = TryConvert::try_convert(value)?;
162
+ comrak_options.inline_footnotes = TryConvert::try_convert(value)?;
158
163
  }
159
164
  Cow::Borrowed(EXTENSION_DESCRIPTION_LISTS) => {
160
- comrak_options.extension.description_lists = TryConvert::try_convert(value)?;
165
+ comrak_options.description_lists = TryConvert::try_convert(value)?;
161
166
  }
162
167
  Cow::Borrowed(EXTENSION_FRONT_MATTER_DELIMITER) => {
163
168
  if let Some(option) = try_convert_string(value) {
164
169
  if !option.is_empty() {
165
- comrak_options.extension.front_matter_delimiter = Some(option);
170
+ comrak_options.front_matter_delimiter = Some(option);
166
171
  }
167
172
  }
168
173
  }
169
174
  Cow::Borrowed(EXTENSION_MULTILINE_BLOCK_QUOTES) => {
170
- comrak_options.extension.multiline_block_quotes =
171
- TryConvert::try_convert(value)?;
175
+ comrak_options.multiline_block_quotes = TryConvert::try_convert(value)?;
172
176
  }
173
177
  Cow::Borrowed(EXTENSION_MATH_DOLLARS) => {
174
- comrak_options.extension.math_dollars = TryConvert::try_convert(value)?;
178
+ comrak_options.math_dollars = TryConvert::try_convert(value)?;
175
179
  }
176
180
  Cow::Borrowed(EXTENSION_MATH_CODE) => {
177
- comrak_options.extension.math_code = TryConvert::try_convert(value)?;
181
+ comrak_options.math_code = TryConvert::try_convert(value)?;
178
182
  }
179
183
  Cow::Borrowed(EXTENSION_SHORTCODES) => {
180
- comrak_options.extension.shortcodes = TryConvert::try_convert(value)?;
184
+ comrak_options.shortcodes = TryConvert::try_convert(value)?;
181
185
  }
182
186
  Cow::Borrowed(EXTENSION_WIKILINKS_TITLE_AFTER_PIPE) => {
183
- comrak_options.extension.wikilinks_title_after_pipe =
184
- TryConvert::try_convert(value)?;
187
+ comrak_options.wikilinks_title_after_pipe = TryConvert::try_convert(value)?;
185
188
  }
186
189
  Cow::Borrowed(EXTENSION_WIKILINKS_TITLE_BEFORE_PIPE) => {
187
- comrak_options.extension.wikilinks_title_before_pipe =
188
- TryConvert::try_convert(value)?;
190
+ comrak_options.wikilinks_title_before_pipe = TryConvert::try_convert(value)?;
189
191
  }
190
192
  Cow::Borrowed(EXTENSION_UNDERLINE) => {
191
- comrak_options.extension.underline = TryConvert::try_convert(value)?;
193
+ comrak_options.underline = TryConvert::try_convert(value)?;
192
194
  }
193
195
  Cow::Borrowed(EXTENSION_SPOILER) => {
194
- comrak_options.extension.spoiler = TryConvert::try_convert(value)?;
196
+ comrak_options.spoiler = TryConvert::try_convert(value)?;
195
197
  }
196
198
  Cow::Borrowed(EXTENSION_GREENTEXT) => {
197
- comrak_options.extension.greentext = TryConvert::try_convert(value)?;
199
+ comrak_options.greentext = TryConvert::try_convert(value)?;
198
200
  }
199
201
  Cow::Borrowed(EXTENSION_SUBSCRIPT) => {
200
- comrak_options.extension.subscript = TryConvert::try_convert(value)?;
202
+ comrak_options.subscript = TryConvert::try_convert(value)?;
203
+ }
204
+ Cow::Borrowed(EXTENSION_SUBTEXT) => {
205
+ comrak_options.subtext = TryConvert::try_convert(value)?;
201
206
  }
202
207
  Cow::Borrowed(EXTENSION_ALERTS) => {
203
- comrak_options.extension.alerts = TryConvert::try_convert(value)?;
208
+ comrak_options.alerts = TryConvert::try_convert(value)?;
204
209
  }
205
210
  Cow::Borrowed(EXTENSION_CJK_FRIENDLY_EMPHASIS) => {
206
- comrak_options.extension.cjk_friendly_emphasis =
207
- TryConvert::try_convert(value)?;
211
+ comrak_options.cjk_friendly_emphasis = TryConvert::try_convert(value)?;
212
+ }
213
+ Cow::Borrowed(EXTENSION_HIGHLIGHT) => {
214
+ comrak_options.highlight = TryConvert::try_convert(value)?;
208
215
  }
209
216
  _ => {}
210
217
  }
@@ -212,23 +219,3 @@ fn iterate_extension_options(comrak_options: &mut ComrakOptions, options_hash: R
212
219
  })
213
220
  .unwrap();
214
221
  }
215
-
216
- pub fn iterate_options_hash(
217
- comrak_options: &mut ComrakOptions,
218
- key: Symbol,
219
- value: RHash,
220
- ) -> Result<ForEach, Error> {
221
- let ruby = magnus::Ruby::get().unwrap();
222
- assert!(value.is_kind_of(ruby.class_hash()));
223
-
224
- if key.name().unwrap() == "parse" {
225
- iterate_parse_options(comrak_options, value);
226
- }
227
- if key.name().unwrap() == "render" {
228
- iterate_render_options(comrak_options, value);
229
- }
230
- if key.name().unwrap() == "extension" {
231
- iterate_extension_options(comrak_options, value);
232
- }
233
- Ok(ForEach::Continue)
234
- }
@@ -3,21 +3,21 @@ use std::path::PathBuf;
3
3
  use comrak::plugins::syntect::{SyntectAdapter, SyntectAdapterBuilder};
4
4
 
5
5
  use magnus::value::ReprValue;
6
- use magnus::{RHash, TryConvert, Value};
6
+ use magnus::{RHash, Ruby, TryConvert, Value};
7
7
  use syntect::highlighting::ThemeSet;
8
8
 
9
9
  use crate::EMPTY_STR;
10
10
 
11
11
  pub fn construct_syntax_highlighter_from_plugin(
12
+ ruby: &Ruby,
12
13
  rb_plugins: Option<RHash>,
13
14
  ) -> Result<Option<SyntectAdapter>, magnus::Error> {
14
15
  match rb_plugins {
15
16
  None => Ok(None),
16
17
  Some(rb_plugins) => {
17
- let ruby = magnus::Ruby::get_with(rb_plugins);
18
18
  let theme = match rb_plugins.get(ruby.to_symbol(super::SYNTAX_HIGHLIGHTER_PLUGIN)) {
19
19
  Some(syntax_highlighter_options) => {
20
- match fetch_syntax_highlighter_theme(syntax_highlighter_options) {
20
+ match fetch_syntax_highlighter_theme(ruby, syntax_highlighter_options) {
21
21
  Ok(theme) => theme,
22
22
  Err(e) => {
23
23
  return Err(e);
@@ -41,7 +41,7 @@ pub fn construct_syntax_highlighter_from_plugin(
41
41
  .get(ruby.to_symbol(super::SYNTAX_HIGHLIGHTER_PLUGIN))
42
42
  {
43
43
  Some(syntax_highlighter_options) => {
44
- fetch_syntax_highlighter_path(syntax_highlighter_options)?
44
+ fetch_syntax_highlighter_path(ruby, syntax_highlighter_options)?
45
45
  }
46
46
  None => PathBuf::from("".to_string()), // no `syntax_highlighter:` defined
47
47
  };
@@ -102,8 +102,10 @@ pub fn construct_syntax_highlighter_from_plugin(
102
102
  }
103
103
  }
104
104
 
105
- fn fetch_syntax_highlighter_theme(value: Value) -> Result<Option<String>, magnus::Error> {
106
- let ruby = magnus::Ruby::get_with(value);
105
+ fn fetch_syntax_highlighter_theme(
106
+ ruby: &Ruby,
107
+ value: Value,
108
+ ) -> Result<Option<String>, magnus::Error> {
107
109
  if value.is_nil() {
108
110
  // `syntax_highlighter: nil`
109
111
  return Ok(None);
@@ -143,14 +145,13 @@ fn fetch_syntax_highlighter_theme(value: Value) -> Result<Option<String>, magnus
143
145
  }
144
146
  }
145
147
 
146
- fn fetch_syntax_highlighter_path(value: Value) -> Result<PathBuf, magnus::Error> {
148
+ fn fetch_syntax_highlighter_path(ruby: &Ruby, value: Value) -> Result<PathBuf, magnus::Error> {
147
149
  if value.is_nil() {
148
150
  // `syntax_highlighter: nil`
149
151
  return Ok(PathBuf::from(EMPTY_STR));
150
152
  }
151
153
 
152
154
  let syntax_highlighter_plugin: RHash = TryConvert::try_convert(value)?;
153
- let ruby = magnus::Ruby::get_with(value);
154
155
  let path_key = ruby.to_symbol(super::SYNTAX_HIGHLIGHTER_PLUGIN_PATH_KEY);
155
156
 
156
157
  match syntax_highlighter_plugin.get(path_key) {
@@ -10,6 +10,7 @@ module Commonmarker
10
10
  default_info_string: "",
11
11
  relaxed_tasklist_matching: false,
12
12
  relaxed_autolinks: false,
13
+ leave_footnote_definitions: false,
13
14
  }.freeze,
14
15
  render: {
15
16
  hardbreaks: true,
@@ -48,8 +49,10 @@ module Commonmarker
48
49
  spoiler: false,
49
50
  greentext: false,
50
51
  subscript: false,
52
+ subtext: false,
51
53
  alerts: false,
52
54
  cjk_friendly_emphasis: false,
55
+ highlight: false,
53
56
  }.freeze,
54
57
  format: [:html].freeze,
55
58
  }.freeze
@@ -44,7 +44,7 @@ module Commonmarker
44
44
  opts = Config.process_options(options)
45
45
  plugins = Config.process_plugins(plugins)
46
46
 
47
- node_to_html(options: opts, plugins: plugins).force_encoding("utf-8")
47
+ node_to_html(render: opts[:render], parse: opts[:parse], extension: opts[:extension], plugins: plugins).force_encoding("utf-8")
48
48
  end
49
49
 
50
50
  # Public: Convert the node to a CommonMark string.
@@ -59,7 +59,7 @@ module Commonmarker
59
59
  opts = Config.process_options(options)
60
60
  plugins = Config.process_plugins(plugins)
61
61
 
62
- node_to_commonmark(options: opts, plugins: plugins).force_encoding("utf-8")
62
+ node_to_commonmark(render: opts[:render], parse: opts[:parse], extension: opts[:extension], plugins: plugins).force_encoding("utf-8")
63
63
  end
64
64
  end
65
65
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Commonmarker
4
- VERSION = "2.5.0"
4
+ VERSION = "2.6.0"
5
5
  end
data/lib/commonmarker.rb CHANGED
@@ -23,7 +23,7 @@ module Commonmarker
23
23
 
24
24
  opts = Config.process_options(options)
25
25
 
26
- commonmark_parse(text, options: opts)
26
+ commonmark_parse(text, parse: opts.fetch(:parse, {}), render: opts.fetch(:render, {}), extension: opts.fetch(:extension, {}))
27
27
  end
28
28
 
29
29
  # Public: Parses a CommonMark string into an HTML string.
@@ -41,7 +41,7 @@ module Commonmarker
41
41
  opts = Config.process_options(options)
42
42
  plugins = Config.process_plugins(plugins)
43
43
 
44
- commonmark_to_html(text, options: opts, plugins: plugins)
44
+ commonmark_to_html(text, parse: opts.fetch(:parse, {}), render: opts.fetch(:render, {}), extension: opts.fetch(:extension, {}), plugins: plugins)
45
45
  end
46
46
  end
47
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: commonmarker
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.0
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Garen Torikian
8
8
  - Ashe Connor
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-10-14 00:00:00.000000000 Z
11
+ date: 2025-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rb_sys
@@ -94,12 +94,15 @@ require_paths:
94
94
  - lib
95
95
  required_ruby_version: !ruby/object:Gem::Requirement
96
96
  requirements:
97
- - - "~>"
97
+ - - ">="
98
98
  - !ruby/object:Gem::Version
99
99
  version: '3.2'
100
+ - - "<"
101
+ - !ruby/object:Gem::Version
102
+ version: '5'
100
103
  required_rubygems_version: !ruby/object:Gem::Requirement
101
104
  requirements:
102
- - - "~>"
105
+ - - ">="
103
106
  - !ruby/object:Gem::Version
104
107
  version: '3.4'
105
108
  requirements: []