Repository: Python-Markdown/markdown (python)

Issue:
Regression in unescaping backslash in attribute
Regression in 3.4 - c0f6e5a31ea8e7fe98910a0523144c2a96fa9bf1 is the first bad commit

Reproduction code:
```python
import markdown

s = r'''
<img src="..\..\foo.png">
'''
print(repr(markdown.markdown(s)))
```

Output before vs after:
```python
'<p><img src="..\\..\\foo.png"></p>'
```
```python
'<p><img src="..\\\x0246\x03.\\foo.png"></p>'
```


Pull request description:
Unescape any backslash escaped inline raw HTML
Fixes #1358.

Patch:
diff --git a/docs/change_log/index.md b/docs/change_log/index.md
index ee2445c..75242d6 100644
--- a/docs/change_log/index.md
+++ b/docs/change_log/index.md
@@ -6,6 +6,7 @@ Python-Markdown Change Log
 *under development*: version 3.4.4 (a bug-fix release).
 
 * Add a special case for initial 's to smarty extension (#1305).
+* Unescape any backslash escaped inline raw HTML (#1358).
 
 March 23, 2023: version 3.4.3 (a bug-fix release).
 
diff --git a/markdown/inlinepatterns.py b/markdown/inlinepatterns.py
index bb55c4b..ee7722e 100644
--- a/markdown/inlinepatterns.py
+++ b/markdown/inlinepatterns.py
@@ -416,7 +416,7 @@ class DoubleTagInlineProcessor(SimpleTagInlineProcessor):
 class HtmlInlineProcessor(InlineProcessor):
     """ Store raw inline html and return a placeholder. """
     def handleMatch(self, m, data):
-        rawhtml = self.unescape(m.group(1))
+        rawhtml = self.backslash_unescape(self.unescape(m.group(1)))
         place_holder = self.md.htmlStash.store(rawhtml)
         return place_holder, m.start(0), m.end(0)
 
@@ -438,6 +438,18 @@ class HtmlInlineProcessor(InlineProcessor):
 
         return util.INLINE_PLACEHOLDER_RE.sub(get_stash, text)
 
+    def backslash_unescape(self, text):
+        """ Return text with backslash escapes undone (backslashes are restored). """
+        try:
+            RE = self.md.treeprocessors['unescape'].RE
+        except KeyError:  # pragma: no cover
+            return text
+
+        def _unescape(m):
+            return chr(int(m.group(1)))
+
+        return RE.sub(_unescape, text)
+
 
 class AsteriskProcessor(InlineProcessor):
     """Emphasis processor for handling strong and em matches inside asterisks."""


Test patch:
diff --git a/tests/test_syntax/inline/test_raw_html.py b/tests/test_syntax/inline/test_raw_html.py
index a9c4857..f75a616 100644
--- a/tests/test_syntax/inline/test_raw_html.py
+++ b/tests/test_syntax/inline/test_raw_html.py
@@ -28,3 +28,6 @@ class TestRawHtml(TestCase):
         self.assertMarkdownRenders("<span>e>c</span>", "<p><span>e&gt;c</span></p>")
         self.assertMarkdownRenders("<span>e < c</span>", "<p><span>e &lt; c</span></p>")
         self.assertMarkdownRenders("<span>e > c</span>", "<p><span>e &gt; c</span></p>")
+
+    def test_inline_html_backslashes(self):
+        self.assertMarkdownRenders('<img src="..\\..\\foo.png">', '<p><img src="..\\..\\foo.png"></p>')