1.1 --- a/moinformat/tree/moin.py Tue Jun 20 18:58:47 2023 +0200
1.2 +++ b/moinformat/tree/moin.py Wed Jun 28 16:12:26 2023 +0200
1.3 @@ -3,7 +3,8 @@
1.4 """
1.5 Moin wiki format document tree nodes.
1.6
1.7 -Copyright (C) 2017, 2018, 2019, 2020, 2021, 2022 Paul Boddie <paul@boddie.org.uk>
1.8 +Copyright (C) 2017, 2018, 2019, 2020, 2021, 2022,
1.9 + 2023 Paul Boddie <paul@boddie.org.uk>
1.10
1.11 This program is free software; you can redistribute it and/or modify it under
1.12 the terms of the GNU General Public License as published by the Free Software
1.13 @@ -182,10 +183,6 @@
1.14 l.append(node.prettyprint(indent + " "))
1.15 return "\n".join(l)
1.16
1.17 - def _to_string(self, out):
1.18 - for node in self.nodes:
1.19 - node.to_string(out)
1.20 -
1.21 class Region(Container):
1.22
1.23 "A region of the page."
1.24 @@ -221,23 +218,8 @@
1.25 self.level, self.indent, self.type, self.args, self.extra)]
1.26 return self._prettyprint(l, indent)
1.27
1.28 - def to_string(self, out):
1.29 - out.start_region(self.level, self.indent, self.type, self.args, self.extra)
1.30 -
1.31 - # Obtain a serialiser for the region from the same format family.
1.32 - # Retain the same serialiser if no appropriate serialiser could be
1.33 - # obtained.
1.34 -
1.35 - serialiser_name = "%s.%s" % (out.formats[0], self.type)
1.36 - serialiser = out.get_serialiser(serialiser_name)
1.37 -
1.38 - # Serialise the region.
1.39 -
1.40 - self._to_string(serialiser)
1.41 -
1.42 - # End the region with the previous serialiser.
1.43 -
1.44 - out.end_region(self.level, self.indent, self.type, self.args, self.extra)
1.45 + def visit(self, visitor):
1.46 + visitor.region(self)
1.47
1.48
1.49
1.50 @@ -254,10 +236,8 @@
1.51 l = ["%sBlock" % indent]
1.52 return self._prettyprint(l, indent)
1.53
1.54 - def to_string(self, out):
1.55 - out.start_block()
1.56 - self._to_string(out)
1.57 - out.end_block()
1.58 + def visit(self, visitor):
1.59 + visitor.block(self)
1.60
1.61 class DefItem(Container):
1.62
1.63 @@ -275,10 +255,8 @@
1.64 l = ["%sDefItem: pad=%r extra=%r" % (indent, self.pad, self.extra)]
1.65 return self._prettyprint(l, indent)
1.66
1.67 - def to_string(self, out):
1.68 - out.start_defitem(self.pad, self.extra)
1.69 - self._to_string(out)
1.70 - out.end_defitem(self.pad, self.extra)
1.71 + def visit(self, visitor):
1.72 + visitor.defitem(self)
1.73
1.74 class DefTerm(Container):
1.75
1.76 @@ -296,10 +274,8 @@
1.77 l = ["%sDefTerm: pad=%r extra=%r" % (indent, self.pad, self.extra)]
1.78 return self._prettyprint(l, indent)
1.79
1.80 - def to_string(self, out):
1.81 - out.start_defterm(self.pad, self.extra)
1.82 - self._to_string(out)
1.83 - out.end_defterm(self.pad, self.extra)
1.84 + def visit(self, visitor):
1.85 + visitor.defterm(self)
1.86
1.87 class FontStyle(Container):
1.88
1.89 @@ -331,16 +307,8 @@
1.90 l = ["%sFontStyle: emphasis=%r strong=%r" % (indent, self.emphasis, self.strong)]
1.91 return self._prettyprint(l, indent)
1.92
1.93 - def to_string(self, out):
1.94 - if self.emphasis:
1.95 - out.start_emphasis()
1.96 - elif self.strong:
1.97 - out.start_strong()
1.98 - self._to_string(out)
1.99 - if self.emphasis:
1.100 - out.end_emphasis()
1.101 - elif self.strong:
1.102 - out.end_strong()
1.103 + def visit(self, visitor):
1.104 + visitor.fontstyle(self)
1.105
1.106 class Heading(Container):
1.107
1.108 @@ -368,10 +336,8 @@
1.109 self.end_extra, self.identifier)]
1.110 return self._prettyprint(l, indent)
1.111
1.112 - def to_string(self, out):
1.113 - out.start_heading(self.level, self.start_extra, self.start_pad, self.identifier)
1.114 - self._to_string(out)
1.115 - out.end_heading(self.level, self.end_pad, self.end_extra)
1.116 + def visit(self, visitor):
1.117 + visitor.heading(self)
1.118
1.119 class LinkLabel(Container):
1.120
1.121 @@ -384,8 +350,8 @@
1.122 l = ["%sLinkLabel" % indent]
1.123 return self._prettyprint(l, indent)
1.124
1.125 - def to_string(self, out):
1.126 - out.link_label(self.nodes)
1.127 + def visit(self, visitor):
1.128 + visitor.link_label(self)
1.129
1.130 class LinkParameter(Container):
1.131
1.132 @@ -398,10 +364,8 @@
1.133 l = ["%sLinkParameter" % indent]
1.134 return self._prettyprint(l, indent)
1.135
1.136 - def to_string(self, out):
1.137 - s = self.text_content()
1.138 - t = s.split("=", 1)
1.139 - out.link_parameter(t)
1.140 + def visit(self, visitor):
1.141 + visitor.link_parameter(self)
1.142
1.143 class List(Container):
1.144
1.145 @@ -426,12 +390,10 @@
1.146 l = ["%sList: indent=%r marker=%r num=%r" % (indent, self.indent, self.marker, self.num)]
1.147 return self._prettyprint(l, indent)
1.148
1.149 - def to_string(self, out):
1.150 + def visit(self, visitor):
1.151 if not self.first:
1.152 self.init()
1.153 - out.start_list(self.indent, self.marker, self.num)
1.154 - self._to_string(out)
1.155 - out.end_list(self.indent, self.marker, self.num)
1.156 + visitor.list(self)
1.157
1.158 class ListItem(Container):
1.159
1.160 @@ -455,10 +417,8 @@
1.161 l = ["%sListItem: indent=%d marker=%r space=%r num=%r" % (indent, self.indent, self.marker, self.space, self.num)]
1.162 return self._prettyprint(l, indent)
1.163
1.164 - def to_string(self, out):
1.165 - out.start_listitem(self.indent, self.marker, self.space, self.num)
1.166 - self._to_string(out)
1.167 - out.end_listitem(self.indent, self.marker, self.space, self.num)
1.168 + def visit(self, visitor):
1.169 + visitor.listitem(self)
1.170
1.171 class TableAttrs(Container):
1.172
1.173 @@ -480,11 +440,8 @@
1.174 l = ["%sTableAttrs:" % indent]
1.175 return self._prettyprint(l, indent)
1.176
1.177 - def to_string(self, out):
1.178 - out.start_table_attrs()
1.179 - out.table_attrs(self.nodes)
1.180 - if not self.incomplete:
1.181 - out.end_table_attrs()
1.182 + def visit(self, visitor):
1.183 + visitor.table_attrs(self)
1.184
1.185 class Table(Container):
1.186
1.187 @@ -497,10 +454,8 @@
1.188 l = ["%sTable:" % indent]
1.189 return self._prettyprint(l, indent)
1.190
1.191 - def to_string(self, out):
1.192 - out.start_table()
1.193 - self._to_string(out)
1.194 - out.end_table()
1.195 + def visit(self, visitor):
1.196 + visitor.table(self)
1.197
1.198 class TableCell(Container):
1.199
1.200 @@ -521,10 +476,8 @@
1.201 self.padding)]
1.202 return self._prettyprint(l, indent)
1.203
1.204 - def to_string(self, out):
1.205 - out.start_table_cell(self.attrs, self.leading, self.padding)
1.206 - self._to_string(out)
1.207 - out.end_table_cell()
1.208 + def visit(self, visitor):
1.209 + visitor.table_cell(self)
1.210
1.211 class TableRow(Container):
1.212
1.213 @@ -545,10 +498,8 @@
1.214 indent, self.trailing, self.leading, self.padding)]
1.215 return self._prettyprint(l, indent)
1.216
1.217 - def to_string(self, out):
1.218 - out.start_table_row(self.leading, self.padding)
1.219 - self._to_string(out)
1.220 - out.end_table_row(self.trailing)
1.221 + def visit(self, visitor):
1.222 + visitor.table_row(self)
1.223
1.224
1.225
1.226 @@ -569,10 +520,8 @@
1.227
1.228 "Larger text."
1.229
1.230 - def to_string(self, out):
1.231 - out.start_larger()
1.232 - self._to_string(out)
1.233 - out.end_larger()
1.234 + def visit(self, visitor):
1.235 + visitor.larger(self)
1.236
1.237 class Link(Container):
1.238
1.239 @@ -589,8 +538,8 @@
1.240 l = ["%sLink: target=%r" % (indent, self.target)]
1.241 return self._prettyprint(l, indent)
1.242
1.243 - def to_string(self, out):
1.244 - out.link(self.target, self.nodes)
1.245 + def visit(self, visitor):
1.246 + visitor.link(self)
1.247
1.248 class Macro(Container):
1.249
1.250 @@ -613,56 +562,43 @@
1.251 l = ["%sMacro: name=%r args=%r" % (indent, self.name, self.args)]
1.252 return self._prettyprint(l, indent)
1.253
1.254 - def to_string(self, out):
1.255 - out.start_macro(self.name, self.args, self.nodes, self.inline)
1.256 - if self.nodes:
1.257 - self._to_string(out)
1.258 - out.end_macro(self.inline)
1.259 + def visit(self, visitor):
1.260 + visitor.macro(self)
1.261
1.262 class Monospace(Inline):
1.263
1.264 "Monospaced text."
1.265
1.266 - def to_string(self, out):
1.267 - out.start_monospace()
1.268 - self._to_string(out)
1.269 - out.end_monospace()
1.270 + def visit(self, visitor):
1.271 + visitor.monospace(self)
1.272
1.273 class Smaller(Inline):
1.274
1.275 "Smaller text."
1.276
1.277 - def to_string(self, out):
1.278 - out.start_smaller()
1.279 - self._to_string(out)
1.280 - out.end_smaller()
1.281 + def visit(self, visitor):
1.282 + visitor.smaller(self)
1.283
1.284 class Strikethrough(Inline):
1.285
1.286 - "Crossed-out text."
1.287 + "Crossed-visitor text."
1.288
1.289 - def to_string(self, out):
1.290 - out.start_strikethrough()
1.291 - self._to_string(out)
1.292 - out.end_strikethrough()
1.293 + def visit(self, visitor):
1.294 + visitor.strikethrough(self)
1.295
1.296 class Subscript(Inline):
1.297
1.298 "Subscripted text."
1.299
1.300 - def to_string(self, out):
1.301 - out.start_subscript()
1.302 - self._to_string(out)
1.303 - out.end_subscript()
1.304 + def visit(self, visitor):
1.305 + visitor.subscript(self)
1.306
1.307 class Superscript(Inline):
1.308
1.309 "Superscripted text."
1.310
1.311 - def to_string(self, out):
1.312 - out.start_superscript()
1.313 - self._to_string(out)
1.314 - out.end_superscript()
1.315 + def visit(self, visitor):
1.316 + visitor.superscript(self)
1.317
1.318 class Transclusion(Container):
1.319
1.320 @@ -679,17 +615,15 @@
1.321 l = ["%sTransclusion: target=%r" % (indent, self.target)]
1.322 return self._prettyprint(l, indent)
1.323
1.324 - def to_string(self, out):
1.325 - out.transclusion(self.target, self.nodes)
1.326 + def visit(self, visitor):
1.327 + visitor.transclusion(self)
1.328
1.329 class Underline(Inline):
1.330
1.331 "Underlined text."
1.332
1.333 - def to_string(self, out):
1.334 - out.start_underline()
1.335 - self._to_string(out)
1.336 - out.end_underline()
1.337 + def visit(self, visitor):
1.338 + visitor.underline(self)
1.339
1.340
1.341
1.342 @@ -715,8 +649,8 @@
1.343 def prettyprint(self, indent=""):
1.344 return "%sAnchor: target=%r" % (indent, self.target)
1.345
1.346 - def to_string(self, out):
1.347 - out.anchor(self.target)
1.348 + def visit(self, visitor):
1.349 + visitor.anchor(self)
1.350
1.351 class Break(Node):
1.352
1.353 @@ -728,8 +662,8 @@
1.354 def prettyprint(self, indent=""):
1.355 return "%sBreak" % indent
1.356
1.357 - def to_string(self, out):
1.358 - out.break_()
1.359 + def visit(self, visitor):
1.360 + visitor.break_(self)
1.361
1.362 class Comment(Node):
1.363
1.364 @@ -745,8 +679,8 @@
1.365 def prettyprint(self, indent=""):
1.366 return "%sComment: comment=%r extra=%r" % (indent, self.comment, self.extra)
1.367
1.368 - def to_string(self, out):
1.369 - out.comment(self.comment, self.extra)
1.370 + def visit(self, visitor):
1.371 + visitor.comment(self)
1.372
1.373 class Directive(Node):
1.374
1.375 @@ -762,8 +696,8 @@
1.376 def prettyprint(self, indent=""):
1.377 return "%sDirective: directive=%r extra=%r" % (indent, self.directive, self.extra)
1.378
1.379 - def to_string(self, out):
1.380 - out.directive(self.directive, self.extra)
1.381 + def visit(self, visitor):
1.382 + visitor.directive(self)
1.383
1.384 class LineBreak(Node):
1.385
1.386 @@ -775,8 +709,8 @@
1.387 def prettyprint(self, indent=""):
1.388 return "%sLineBreak" % indent
1.389
1.390 - def to_string(self, out):
1.391 - out.linebreak()
1.392 + def visit(self, visitor):
1.393 + visitor.linebreak(self)
1.394
1.395 class NonBreakingSpace(Node):
1.396
1.397 @@ -788,8 +722,8 @@
1.398 def prettyprint(self, indent=""):
1.399 return "%sNonBreakingSpace" % indent
1.400
1.401 - def to_string(self, out):
1.402 - out.nbsp()
1.403 + def visit(self, visitor):
1.404 + visitor.nbsp(self)
1.405
1.406 class Rule(Node):
1.407
1.408 @@ -804,8 +738,8 @@
1.409 def prettyprint(self, indent=""):
1.410 return "%sRule: height=%d" % (indent, self.height)
1.411
1.412 - def to_string(self, out):
1.413 - out.rule(self.height)
1.414 + def visit(self, visitor):
1.415 + visitor.rule(self)
1.416
1.417 class TableAttr(Node):
1.418
1.419 @@ -823,8 +757,8 @@
1.420 def prettyprint(self, indent=""):
1.421 return "%sTableAttr: name=%r value=%r concise=%r quote=%r" % (indent, self.name, self.value, self.concise, self.quote)
1.422
1.423 - def to_string(self, out):
1.424 - out.table_attr(self.name, self.value, self.concise, self.quote)
1.425 + def visit(self, visitor):
1.426 + visitor.table_attr(self)
1.427
1.428 class Text(Node):
1.429
1.430 @@ -848,8 +782,8 @@
1.431 def prettyprint(self, indent=""):
1.432 return "%sText: %r" % (indent, self.s)
1.433
1.434 - def to_string(self, out):
1.435 - out.text(self.s)
1.436 + def visit(self, visitor):
1.437 + visitor.text(self)
1.438
1.439 class Verbatim(Node):
1.440
1.441 @@ -864,7 +798,7 @@
1.442 def prettyprint(self, indent=""):
1.443 return "%sVerbatim: text=%r" % (indent, self.text)
1.444
1.445 - def to_string(self, out):
1.446 - out.verbatim(self.text)
1.447 + def visit(self, visitor):
1.448 + visitor.verbatim(self)
1.449
1.450 # vim: tabstop=4 expandtab shiftwidth=4