diff fontaine/renderer.py @ 1:74b83e3d921e

Add more states, add more tests.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 02 Jan 2017 21:54:59 -0800
parents
children 6019eee799bf
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fontaine/renderer.py	Mon Jan 02 21:54:59 2017 -0800
@@ -0,0 +1,49 @@
+import re
+
+
+RE_ITALICS = re.compile(
+    r"(?P<before>^|\s)(?P<esc>\\)?\*(?P<text>.*[^\s\*])\*(?=[^a-zA-Z0-9\*]|$)")
+RE_BOLD = re.compile(
+    r"(?P<before>^|\s)(?P<esc>\\)?\*\*(?P<text>.*[^\s])\*\*(?=[^a-zA-Z0-9]|$)")
+RE_UNDERLINE = re.compile(
+    r"(?P<before>^|\s)(?P<esc>\\)?_(?P<text>.*[^\s])_(?=[^a-zA-Z0-9]|$)")
+
+
+class BaseRenderer:
+    def render_text(self, text):
+        # Replace bold stuff to catch double asterisks.
+        text = RE_BOLD.sub(self._do_write_bold, text)
+        text = RE_ITALICS.sub(self._do_write_italics, text)
+        text = RE_UNDERLINE.sub(self._do_write_underline, text)
+
+        return text
+
+    def _do_write_italics(self, m):
+        if m.group('esc'):
+            return m.group('before') + '*' + m.group('text') + '*'
+        return (
+            m.group('before') +
+            self.write_italics(m.group('text')))
+
+    def _do_write_bold(self, m):
+        if m.group('esc'):
+            return m.group('before') + '**' + m.group('text') + '**'
+        return (
+            m.group('before') +
+            self.write_bold(m.group('text')))
+
+    def _do_write_underline(self, m):
+        if m.group('esc'):
+            return m.group('before') + '_' + m.group('text') + '_'
+        return (
+            m.group('before') +
+            self.write_underline(m.group('text')))
+
+    def write_italics(self, text):
+        raise NotImplementedError()
+
+    def write_bold(self, text):
+        raise NotImplementedError()
+
+    def write_underline(self, text):
+        raise NotImplementedError()