From e3bdc14ab04aafd60e078d52311ca15a53aa8ac6 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 8 Feb 2015 20:58:11 +0000 Subject: Handle unordered lists in markdown writer --- mammoth/writers/markdown.py | 33 +++++++++++++++++++++++++-------- tests/writers/markdown_tests.py | 16 +++++++++++++++- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/mammoth/writers/markdown.py b/mammoth/writers/markdown.py index d355ff3..04b339a 100644 --- a/mammoth/writers/markdown.py +++ b/mammoth/writers/markdown.py @@ -4,19 +4,24 @@ import re class _WriterOutput(object): - def __init__(self, start, end, anchor_position=None): + def __init__(self, start, end, anchor_position=None, markdown_state=None): self.start = start self.end = end self.anchor_position = anchor_position + self.markdown_state = markdown_state class _MarkdownState(object): - def __init__(self): - self.list_state = _MarkdownListState() + def __init__(self, list_state=None): + self.list_state = list_state + + def updated_list_state(self, list_state): + return _MarkdownState(list_state) class _MarkdownListState(object): - def __init__(self): + def __init__(self, ordered): + self.ordered = ordered self.count = 0 @@ -55,7 +60,9 @@ def _image(attributes, markdown_state): def _list(ordered): def call(attributes, markdown_state): - return _WriterOutput("", "\n") + list_state = _MarkdownListState(ordered=ordered) + markdown_state = markdown_state.updated_list_state(list_state) + return _WriterOutput("", "\n", markdown_state=markdown_state) return call @@ -63,7 +70,13 @@ def _list(ordered): def _list_item(attributes, markdown_state): list_state = markdown_state.list_state list_state.count += 1 - return _WriterOutput("{0}. ".format(list_state.count), "\n") + + if list_state.ordered: + bullet = "{0}.".format(list_state.count) + else: + bullet = "-" + + return _WriterOutput(bullet + " ", "\n") def _init_writers(): @@ -75,6 +88,7 @@ def _init_writers(): "a": _hyperlink, "img": _image, "ol": _list(ordered=True), + "ul": _list(ordered=False), "li": _list_item, } @@ -103,6 +117,9 @@ class MarkdownWriter(object): attributes = {} output = _writers.get(name, _default_writer)(attributes, self._markdown_state) + self._element_stack.append((output.end, self._markdown_state)) + if output.markdown_state is not None: + self._markdown_state = output.markdown_state anchor_before_start = output.anchor_position == "before" if anchor_before_start: @@ -113,10 +130,10 @@ class MarkdownWriter(object): if not anchor_before_start: self._write_anchor(attributes) - self._element_stack.append(output.end) + def end(self, name): - end = self._element_stack.pop() + end, markdown_state = self._element_stack.pop() self._fragments.append(end) def self_closing(self, name, attributes=None): diff --git a/tests/writers/markdown_tests.py b/tests/writers/markdown_tests.py index 5a5a2c8..ac00388 100644 --- a/tests/writers/markdown_tests.py +++ b/tests/writers/markdown_tests.py @@ -152,7 +152,21 @@ def ol_element_is_written_as_ordered_list_with_sequential_numbering(): writer.end("li") writer.end("ol") assert_equal("1. Fruit\n2. Condiments\n\n", writer.as_string()) - + + +@istest +def ul_element_is_written_as_unordered_list_using_hyphens_as_bullets(): + writer = _create_writer() + writer.start("ul") + writer.start("li") + writer.text("Fruit") + writer.end("li") + writer.start("li") + writer.text("Condiments") + writer.end("li") + writer.end("ul") + assert_equal("- Fruit\n- Condiments\n\n", writer.as_string()) + def _create_writer(): -- cgit v1.2.3