aboutsummaryrefslogtreecommitdiff
path: root/mammoth
diff options
context:
space:
mode:
Diffstat (limited to 'mammoth')
-rw-r--r--mammoth/html_generation.py36
-rw-r--r--mammoth/writers/__init__.py1
-rw-r--r--mammoth/writers/html.py42
3 files changed, 53 insertions, 26 deletions
diff --git a/mammoth/html_generation.py b/mammoth/html_generation.py
index 13b0fc6..9f7930f 100644
--- a/mammoth/html_generation.py
+++ b/mammoth/html_generation.py
@@ -1,17 +1,17 @@
from __future__ import unicode_literals
-import cgi
+from .writers.html import HtmlWriter
class HtmlGenerator(object):
def __init__(self):
self._stack = []
- self._fragments = []
+ self._writer = HtmlWriter()
def text(self, text):
if text:
self._write_all()
- self._fragments.append(_escape_html(text))
+ self._writer.text(text)
def start(self, name, attributes=None, always_write=False):
self._stack.append(_Element(name, attributes))
@@ -22,15 +22,14 @@ class HtmlGenerator(object):
def end(self):
element = self._stack.pop()
if element.written:
- self._fragments.append("</{0}>".format(element.name))
+ self._writer.end(element.name)
def end_all(self):
while self._stack:
self.end()
def self_closing(self, name, attributes=None):
- attribute_string = _generate_attribute_string(attributes)
- self._fragments.append("<{0}{1} />".format(name, attribute_string))
+ self._writer.self_closing(name, attributes)
def _write_all(self):
for element in self._stack:
@@ -39,17 +38,16 @@ class HtmlGenerator(object):
self._write_element(element)
def _write_element(self, element):
- attribute_string = _generate_attribute_string(element.attributes)
- self._fragments.append("<{0}{1}>".format(element.name, attribute_string))
+ self._writer.start(element.name, element.attributes)
def append(self, other):
- if other._fragments:
+ other_string = other.html_string()
+ if other_string:
self._write_all()
- for fragment in other._fragments:
- self._fragments.append(fragment)
+ self._writer.append(other_string)
def html_string(self):
- return "".join(self._fragments)
+ return self._writer.as_string()
class _Element(object):
@@ -62,20 +60,6 @@ class _Element(object):
self.written = False
-def _escape_html(text):
- return cgi.escape(text, quote=True)
-
-
-def _generate_attribute_string(attributes):
- if attributes is None:
- return ""
- else:
- return "".join(
- ' {0}="{1}"'.format(key, _escape_html(attributes[key]))
- for key in sorted(attributes)
- )
-
-
def satisfy_html_path(generator, path):
first_unsatisfied_index = _find_first_unsatisfied_index(generator, path)
while len(generator._stack) > first_unsatisfied_index:
diff --git a/mammoth/writers/__init__.py b/mammoth/writers/__init__.py
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/mammoth/writers/__init__.py
@@ -0,0 +1 @@
+
diff --git a/mammoth/writers/html.py b/mammoth/writers/html.py
new file mode 100644
index 0000000..cf936cd
--- /dev/null
+++ b/mammoth/writers/html.py
@@ -0,0 +1,42 @@
+from __future__ import unicode_literals
+
+import cgi
+
+
+class HtmlWriter(object):
+ def __init__(self):
+ self._fragments = []
+
+ def text(self, text):
+ self._fragments.append(_escape_html(text))
+
+ def start(self, name, attributes=None):
+ attribute_string = _generate_attribute_string(attributes)
+ self._fragments.append("<{0}{1}>".format(name, attribute_string))
+
+ def end(self, name):
+ self._fragments.append("</{0}>".format(name))
+
+ def self_closing(self, name, attributes=None):
+ attribute_string = _generate_attribute_string(attributes)
+ self._fragments.append("<{0}{1} />".format(name, attribute_string))
+
+ def append(self, html):
+ self._fragments.append(html)
+
+ def as_string(self):
+ return "".join(self._fragments)
+
+
+def _escape_html(text):
+ return cgi.escape(text, quote=True)
+
+
+def _generate_attribute_string(attributes):
+ if attributes is None:
+ return ""
+ else:
+ return "".join(
+ ' {0}="{1}"'.format(key, _escape_html(attributes[key]))
+ for key in sorted(attributes)
+ )