MoinLight

Annotated moinformat/serialisers/moin/moin.py

85:15c19a3d61e9
2018-07-24 Paul Boddie Introduced families of serialisers for each output format, with parser-specific serialisers retaining knowledge of how their document tree nodes are to be serialised. Introduced a get_serialiser function as a convenience to replace general access to the all_serialisers dictionary. Changed the dynamic import mechanism to qualify identified module names using package name information.
paul@38 1
#!/usr/bin/env python
paul@38 2
paul@38 3
"""
paul@38 4
Moin wiki text serialiser.
paul@38 5
paul@47 6
Copyright (C) 2017, 2018 Paul Boddie <paul@boddie.org.uk>
paul@38 7
paul@38 8
This program is free software; you can redistribute it and/or modify it under
paul@38 9
the terms of the GNU General Public License as published by the Free Software
paul@38 10
Foundation; either version 3 of the License, or (at your option) any later
paul@38 11
version.
paul@38 12
paul@38 13
This program is distributed in the hope that it will be useful, but WITHOUT
paul@38 14
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
paul@38 15
FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
paul@38 16
details.
paul@38 17
paul@38 18
You should have received a copy of the GNU General Public License along with
paul@38 19
this program.  If not, see <http://www.gnu.org/licenses/>.
paul@38 20
"""
paul@38 21
paul@38 22
from moinformat.serialisers.common import escape_attr, escape_text, Serialiser
paul@38 23
paul@38 24
class MoinSerialiser(Serialiser):
paul@38 25
paul@38 26
    "Serialisation of the page."
paul@38 27
paul@85 28
    format = "moin"
paul@85 29
paul@67 30
    def start_region(self, level, indent, type, extra):
paul@38 31
        out = self.out
paul@38 32
        if level:
paul@38 33
            out(" " * indent + "{" * level)
paul@52 34
paul@52 35
        # Produce a header for regions within a top-level region.
paul@52 36
paul@52 37
        if type and type != "inline" and level:
paul@38 38
            out("#!%s\n" % type)
paul@38 39
paul@67 40
    def end_region(self, level, indent, type, extra):
paul@38 41
        out = self.out
paul@38 42
        if level:
paul@67 43
            out("%s%s" % ("}" * level, extra or ""))
paul@38 44
paul@38 45
    def start_block(self):
paul@38 46
        pass
paul@38 47
paul@38 48
    def end_block(self):
paul@38 49
        pass
paul@38 50
paul@38 51
    def start_defitem(self, pad, extra):
paul@38 52
        self.out((extra and "\n" + extra + "::" or "") + pad)
paul@38 53
paul@38 54
    def end_defitem(self, pad, extra):
paul@38 55
        pass
paul@38 56
paul@38 57
    def start_defterm(self, pad):
paul@38 58
        self.out(pad)
paul@38 59
paul@38 60
    def end_defterm(self, pad):
paul@38 61
        self.out("::")
paul@38 62
paul@38 63
    def start_emphasis(self):
paul@38 64
        self.out("''")
paul@38 65
paul@38 66
    def end_emphasis(self):
paul@38 67
        self.out("''")
paul@38 68
paul@38 69
    def start_heading(self, level, extra, pad):
paul@38 70
        self.out(extra + "=" * level + pad)
paul@38 71
paul@38 72
    def end_heading(self, level, pad, extra):
paul@38 73
        self.out(pad + "=" * level + extra)
paul@38 74
paul@38 75
    def start_larger(self):
paul@38 76
        self.out("~+")
paul@38 77
paul@38 78
    def end_larger(self):
paul@38 79
        self.out("+~")
paul@38 80
paul@47 81
    def start_link(self, target):
paul@47 82
        self.out("[[%s" % target)
paul@47 83
paul@47 84
    def end_link(self):
paul@47 85
        self.out("]]")
paul@47 86
paul@47 87
    def start_linktext(self):
paul@47 88
        self.out("|")
paul@47 89
paul@47 90
    def end_linktext(self):
paul@47 91
        pass
paul@47 92
paul@51 93
    def start_list(self, indent, marker, num):
paul@43 94
        pass
paul@43 95
paul@51 96
    def end_list(self, indent, marker, num):
paul@43 97
        pass
paul@43 98
paul@51 99
    def start_listitem(self, indent, marker, space, num):
paul@55 100
        self.out("%s%s%s%s" % (indent * " ", marker, num and "#%s" % num or "", space))
paul@38 101
paul@51 102
    def end_listitem(self, indent, marker, space, num):
paul@38 103
        pass
paul@38 104
paul@38 105
    def start_monospace(self):
paul@38 106
        self.out("`")
paul@38 107
paul@38 108
    def end_monospace(self):
paul@38 109
        self.out("`")
paul@38 110
paul@38 111
    def start_smaller(self):
paul@38 112
        self.out("~-")
paul@38 113
paul@38 114
    def end_smaller(self):
paul@38 115
        self.out("-~")
paul@38 116
paul@38 117
    def start_strong(self):
paul@38 118
        self.out("'''")
paul@38 119
paul@38 120
    def end_strong(self):
paul@38 121
        self.out("'''")
paul@38 122
paul@48 123
    def start_strikethrough(self):
paul@48 124
        self.out("--(")
paul@48 125
paul@48 126
    def end_strikethrough(self):
paul@48 127
        self.out(")--")
paul@48 128
paul@38 129
    def start_subscript(self):
paul@38 130
        self.out(",,")
paul@38 131
paul@38 132
    def end_subscript(self):
paul@38 133
        self.out(",,")
paul@38 134
paul@38 135
    def start_superscript(self):
paul@38 136
        self.out("^")
paul@38 137
paul@38 138
    def end_superscript(self):
paul@38 139
        self.out("^")
paul@38 140
paul@38 141
    def start_table(self):
paul@38 142
        pass
paul@38 143
paul@38 144
    def end_table(self):
paul@38 145
        pass
paul@38 146
paul@38 147
    def start_table_attrs(self):
paul@38 148
        self.out("<")
paul@38 149
paul@38 150
    def end_table_attrs(self):
paul@38 151
        self.out(">")
paul@38 152
paul@38 153
    def start_table_cell(self, attrs):
paul@38 154
        self.out("||")
paul@38 155
        if attrs and not attrs.empty():
paul@38 156
            attrs.to_string(self)
paul@38 157
paul@38 158
    def end_table_cell(self):
paul@38 159
        pass
paul@38 160
paul@38 161
    def start_table_row(self):
paul@38 162
        pass
paul@38 163
paul@38 164
    def end_table_row(self, trailing):
paul@38 165
        self.out("||")
paul@38 166
        self.out(trailing)
paul@38 167
paul@38 168
    def start_underline(self):
paul@38 169
        self.out("__")
paul@38 170
paul@38 171
    def end_underline(self):
paul@38 172
        self.out("__")
paul@38 173
paul@38 174
    def break_(self):
paul@38 175
        self.out("\n")
paul@38 176
paul@72 177
    def continuation(self, text):
paul@72 178
        self.out(text)
paul@72 179
paul@77 180
    def macro(self, name, args):
paul@77 181
        self.out("<<%s%s>>" % (name, args and "(%s)" % ",".join(args) or ""))
paul@77 182
paul@38 183
    def rule(self, length):
paul@38 184
        self.out("-" * length)
paul@38 185
paul@38 186
    def table_attr(self, name, value, concise, quote):
paul@38 187
        if concise:
paul@38 188
            if name == "colour": self.out(value)
paul@38 189
            elif name == "colspan": self.out("-%s" % value)
paul@38 190
            elif name == "halign" : self.out(value == "left" and "(" or value == "right" and ")" or ":")
paul@38 191
            elif name == "rowspan": self.out("|%s" % value)
paul@38 192
            elif name == "valign" : self.out(value == "top" and "^" or "v")
paul@38 193
            elif name == "width" : self.out(value)
paul@38 194
        else:
paul@38 195
            self.out("%s%s" % (escape_text(name), value is not None and
paul@38 196
                               "=%s%s%s" % (quote or '"', escape_attr(value), quote or '"') or ""))
paul@38 197
paul@38 198
    def text(self, s):
paul@38 199
        self.out(s)
paul@38 200
paul@39 201
serialiser = MoinSerialiser
paul@39 202
paul@38 203
# vim: tabstop=4 expandtab shiftwidth=4