diff --git a/markdownify/__init__.py b/markdownify/__init__.py
index 7ebbc6d..e126414 100644
--- a/markdownify/__init__.py
+++ b/markdownify/__init__.py
@@ -305,7 +305,7 @@ def process_text(self, el, parent_tags=None):
# escape special characters if we're not inside a preformatted or code element
if '_noformat' not in parent_tags:
- text = self.escape(text)
+ text = self.escape(text, parent_tags)
# remove leading whitespace at the start or just after a
# block-level element; remove traliing whitespace at the end
@@ -347,11 +347,16 @@ def should_convert_tag(self, tag):
else:
return True
- def escape(self, text):
+ def escape(self, text, parent_tags):
if not text:
return ''
if self.options['escape_misc']:
- text = re.sub(r'([]\\&<`[>~=+|])', r'\\\1', text)
+ text = re.sub(r'([\\&<`[>~=+|])', r'\\\1', text)
+
+ if 'a' in parent_tags:
+ # inside tags, also escape closing brackets in link text
+ text = re.sub(r'(])', r'\\\1', text)
+
# A sequence of one or more consecutive '-', preceded and
# followed by whitespace or start/end of fragment, might
# be confused with an underline of a header, or with a
diff --git a/tests/test_escaping.py b/tests/test_escaping.py
index bab4d11..13a4ab0 100644
--- a/tests/test_escaping.py
+++ b/tests/test_escaping.py
@@ -51,7 +51,7 @@ def test_misc():
assert md('-y', escape_misc=True) == '-y'
assert md('+ x\n+ y\n', escape_misc=True) == '\\+ x\n\\+ y\n'
assert md('`x`', escape_misc=True) == r'\`x\`'
- assert md('[text](notalink)', escape_misc=True) == r'\[text\](notalink)'
+ assert md('[text](notalink)', escape_misc=True) == r'\[text](notalink)'
assert md('text]', escape_misc=True) == r'[text\]](link)'
assert md('[text]', escape_misc=True) == r'[\[text\]](link)'
assert md('1. x', escape_misc=True) == r'1\. x'