escape HTML (#23)

diff --git a/migration/src/jira_util.py b/migration/src/jira_util.py
index ac26278..3237899 100644
--- a/migration/src/jira_util.py
+++ b/migration/src/jira_util.py
@@ -10,7 +10,7 @@
 from jira2markdown.markup.text_breaks import Ruler
 
 from markup.lists import UnorderedTweakedList, OrderedTweakedList
-from markup.text_effects import TweakedBlockQuote, TweakedQuote, TweakedMonospaced
+from markup.text_effects import EscapeHtml, TweakedBlockQuote, TweakedQuote, TweakedMonospaced
 from markup.text_breaks import LongRuler
 
 
@@ -212,6 +212,7 @@
     elements.replace(Quote, TweakedQuote)
     elements.replace(Monospaced, TweakedMonospaced)
     elements.insert_after(Ruler, LongRuler)
+    elements.append(EscapeHtml)
     text = jira2markdown.convert(text, elements=elements)
 
     # markup @ mentions with ``
diff --git a/migration/src/markup/text_effects.py b/migration/src/markup/text_effects.py
index f180370..3a4e87a 100644
--- a/migration/src/markup/text_effects.py
+++ b/migration/src/markup/text_effects.py
@@ -9,8 +9,8 @@
     Literal,
     LineEnd,
     Combine,
+    Literal,
     replaceWith,
-
 )
 
 from jira2markdown.markup.base import AbstractMarkup
@@ -57,3 +57,13 @@
     @property
     def expr(self) -> ParserElement:
         return QuotedString("{{", endQuoteChar="}}").setParseAction(self.action)
+
+
+class EscapeHtml(AbstractMarkup):
+    """
+    Escapes HTML characters that are not a part of any expression grammar
+    """
+
+    @property
+    def expr(self) -> ParserElement:
+        return Literal("<").setParseAction(replaceWith("&lt;")) ^ Literal(">").setParseAction(replaceWith("&gt;")) ^ Literal("&").setParseAction(replaceWith("&amp;"))