diff --git a/writer/MoinMoinWriter.py b/writer/MoinMoinWriter.py
new file mode 100644
index 0000000..ea5a590
--- /dev/null
+++ b/writer/MoinMoinWriter.py
@@ -0,0 +1,77 @@
+class MoinMoinWriter():
+ """
+ MoinMoin wiki syntax writer.
+
+ Except for newline, linebreak, hrule, table_row_end and macro all commands don't add a newline at the end.
+
+ Nothing is printed, all is returned.
+ """
+
+ def newline(self):
+ """
+ Prints nothing and appends a newline.
+ """
+ return "\n"
+
+ def linebreak(self):
+ """
+ Print a froced linebreak (
).
+ """
+ return "<
>\n"
+
+ def hrule(self):
+ """
+ Print a horizontal rule.
+ """
+ return "----\n"
+
+ def ulitem(self, text, level=1):
+ """
+ Print a unordered list item with given level.
+ """
+ whitespace = " " * level
+ return f"{whitespace}* {text}"
+
+ def olitem(self, text, level=1):
+ """
+ Print a orderd list item with given level.
+ """
+ whitespace = " " * level
+ return f"{whitespace}1. {text}"
+
+ def text(self, text, bold=False, italics=False):
+ """
+ Just print the given text.
+ """
+ if bold and italics:
+ return f"*****{text}*****"
+ elif bold:
+ return f"***{text}***"
+ elif italics:
+ return f"**{text}**"
+ else:
+ return text
+
+ def link(self, text, url, arguments="", display=False):
+ if display:
+ if arguments:
+ return "{{" + url + f"|{text}|" + arguments + "}}"
+ else:
+ return "{{" + url + f"|{text}" + "}}"
+ else:
+ if arguments:
+ return f"[[{url}|{text}|{arguments}]]"
+ else:
+ return f"[[{url}|{text}]]"
+
+ def macro(self, macro, arguments=""):
+ return f"<<{macro}({arguments})>>"
+
+ def table_cell(self, text, arguments=""):
+ if text:
+ return f"||<{arguments}> {text} "
+ else:
+ return "||"
+
+ def table_row_end(self):
+ return "||\n"