From 4ef4951d039c8eb53a1f2cfe1030d861734e8ff7 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Tue, 30 Apr 2024 12:55:57 -0700 Subject: [PATCH] Add `escaped_char_spans` --- README.md | 17 +++++++++-------- ext/commonmarker/src/options.rs | 4 ++++ lib/commonmarker/config.rb | 1 + test/escaped_char_spans_test.rb | 19 +++++++++++++++++++ test/node/creation_test.rb | 33 --------------------------------- 5 files changed, 33 insertions(+), 41 deletions(-) create mode 100644 test/escaped_char_spans_test.rb diff --git a/README.md b/README.md index 28942313..07acb052 100644 --- a/README.md +++ b/README.md @@ -158,14 +158,15 @@ Note that there is a distinction in comrak for "parse" options and "render" opti ### Render options -| Name | Description | Default | -| ----------------- | ------------------------------------------------------------------------------------------------------ | ------- | -| `hardbreaks` | [Soft line breaks](http://spec.commonmark.org/0.27/#soft-line-breaks) translate into hard line breaks. | `true` | -| `github_pre_lang` | GitHub-style `
` is used for fenced code blocks with info tags.                         | `true`  |
-| `width`           | The wrap column when outputting CommonMark.                                                            | `80`    |
-| `unsafe`          | Allow rendering of raw HTML and potentially dangerous links.                                           | `false` |
-| `escape`          | Escape raw HTML instead of clobbering it.                                                              | `false` |
-| `sourcepos`       | Include source position attribute in HTML and XML output.                                              | `false` |
+| Name                 | Description                                                                                            | Default |
+| -------------------- | ------------------------------------------------------------------------------------------------------ | ------- |
+| `hardbreaks`         | [Soft line breaks](http://spec.commonmark.org/0.27/#soft-line-breaks) translate into hard line breaks. | `true`  |
+| `github_pre_lang`    | GitHub-style `
` is used for fenced code blocks with info tags.                         | `true`  |
+| `width`              | The wrap column when outputting CommonMark.                                                            | `80`    |
+| `unsafe`             | Allow rendering of raw HTML and potentially dangerous links.                                           | `false` |
+| `escape`             | Escape raw HTML instead of clobbering it.                                                              | `false` |
+| `sourcepos`          | Include source position attribute in HTML and XML output.                                              | `false` |
+| `escaped_char_spans` | Wrap escaped characters in span tags                                                                   | `true`  |
 
 As well, there are several extensions which you can toggle in the same manner:
 
diff --git a/ext/commonmarker/src/options.rs b/ext/commonmarker/src/options.rs
index 09044328..8b2d4c11 100644
--- a/ext/commonmarker/src/options.rs
+++ b/ext/commonmarker/src/options.rs
@@ -34,6 +34,7 @@ const RENDER_WIDTH: &str = "width";
 const RENDER_UNSAFE: &str = "unsafe";
 const RENDER_ESCAPE: &str = "escape";
 const RENDER_SOURCEPOS: &str = "sourcepos";
+const RENDER_ESCAPED_CHAR_SPANS: &str = "escaped_char_spans";
 
 fn iterate_render_options(comrak_options: &mut ComrakOptions, options_hash: RHash) {
     options_hash
@@ -57,6 +58,9 @@ fn iterate_render_options(comrak_options: &mut ComrakOptions, options_hash: RHas
                 Ok(Cow::Borrowed(RENDER_SOURCEPOS)) => {
                     comrak_options.render.sourcepos = TryConvert::try_convert(value)?;
                 }
+                Ok(Cow::Borrowed(RENDER_ESCAPED_CHAR_SPANS)) => {
+                    comrak_options.render.escaped_char_spans = TryConvert::try_convert(value)?;
+                }
                 _ => {}
             }
             Ok(ForEach::Continue)
diff --git a/lib/commonmarker/config.rb b/lib/commonmarker/config.rb
index ad38bdf6..b3882e12 100644
--- a/lib/commonmarker/config.rb
+++ b/lib/commonmarker/config.rb
@@ -16,6 +16,7 @@ module Config
         unsafe: false,
         escape: false,
         sourcepos: false,
+        escaped_char_spans: true,
       }.freeze,
       extension: {
         strikethrough: true,
diff --git a/test/escaped_char_spans_test.rb b/test/escaped_char_spans_test.rb
new file mode 100644
index 00000000..fd067b43
--- /dev/null
+++ b/test/escaped_char_spans_test.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require "test_helper"
+
+class EscapeCharSpansTest < Minitest::Test
+  def test_to_html
+    md = <<~MARKDOWN
+      Hello \\@user
+
+      Hey, @user!
+    MARKDOWN
+    expected = <<~HTML
+      

Hello @user

+

Hey, @user!

+ HTML + + assert_equal(expected, Commonmarker.to_html(md, options: { render: { escaped_char_spans: true } })) + end +end diff --git a/test/node/creation_test.rb b/test/node/creation_test.rb index 7fc72113..dd898efd 100644 --- a/test/node/creation_test.rb +++ b/test/node/creation_test.rb @@ -66,36 +66,3 @@ def test_errors_reported end end end - -# ComrakNodeValue::List(..) => Symbol::new("list"), -# ComrakNodeValue::DescriptionList => Symbol::new("description_list"), -# ComrakNodeValue::DescriptionItem(_) => Symbol::new("description_item"), -# ComrakNodeValue::DescriptionTerm => Symbol::new("description_term"), -# ComrakNodeValue::DescriptionDetails => Symbol::new("description_details"), -# ComrakNodeValue::Item(..) => Symbol::new("item"), -# ComrakNodeValue::CodeBlock(..) => Symbol::new("code_block"), -# ComrakNodeValue::HtmlBlock(..) => Symbol::new("html_block"), -# ComrakNodeValue::Paragraph => Symbol::new("paragraph"), -# ComrakNodeValue::Heading(..) => Symbol::new("heading"), -# ComrakNodeValue::ThematicBreak => Symbol::new("thematic_break"), -# ComrakNodeValue::Table(..) => Symbol::new("table"), -# ComrakNodeValue::TableRow(..) => Symbol::new("table_row"), -# ComrakNodeValue::TableCell => Symbol::new("table_cell"), -# ComrakNodeValue::Text(..) => Symbol::new("text"), -# ComrakNodeValue::SoftBreak => Symbol::new("softbreak"), -# ComrakNodeValue::LineBreak => Symbol::new("linebreak"), -# ComrakNodeValue::Image(..) => Symbol::new("image"), -# ComrakNodeValue::Link(..) => Symbol::new("link"), -# ComrakNodeValue::Emph => Symbol::new("emph"), -# ComrakNodeValue::Strong => Symbol::new("strong"), -# ComrakNodeValue::Code(..) => Symbol::new("code"), -# ComrakNodeValue::HtmlInline(..) => Symbol::new("html_inline"), -# ComrakNodeValue::Strikethrough => Symbol::new("strikethrough"), -# ComrakNodeValue::FrontMatter(_) => Symbol::new("frontmatter"), -# ComrakNodeValue::TaskItem { .. } => Symbol::new("taskitem"), -# ComrakNodeValue::Superscript => Symbol::new("superscript"), -# ComrakNodeValue::FootnoteReference(..) => Symbol::new("footnote_reference"), -# ComrakNodeValue::ShortCode(_) => Symbol::new("shortcode"), -# ComrakNodeValue::MultilineBlockQuote(_) => Symbol::new("multiline_block_quote"), -# ComrakNodeValue::Escaped => Symbol::new("escaped"), -# ComrakNodeValue::Math(..) => Symbol::new("math"),