1.1 --- a/moinformat/metadata.py Fri Jun 30 00:37:36 2023 +0200
1.2 +++ b/moinformat/metadata.py Fri Jun 30 00:40:39 2023 +0200
1.3 @@ -3,7 +3,7 @@
1.4 """
1.5 Metadata for document conversion.
1.6
1.7 -Copyright (C) 2018, 2019, 2021 Paul Boddie <paul@boddie.org.uk>
1.8 +Copyright (C) 2018, 2019, 2021, 2023 Paul Boddie <paul@boddie.org.uk>
1.9
1.10 This program is free software; you can redistribute it and/or modify it under
1.11 the terms of the GNU General Public License as published by the Free Software
1.12 @@ -43,13 +43,13 @@
1.13 }
1.14
1.15 effects = {
1.16 - "input_context" : "input",
1.17 - "input_format" : "parser",
1.18 - "input_separator" : "input",
1.19 - "link_format" : "linker",
1.20 - "output_context" : "output",
1.21 - "output_format" : "serialiser",
1.22 - "theme_name" : "theme",
1.23 + "input_context" : ["input"],
1.24 + "input_format" : ["parser", "serialiser"],
1.25 + "input_separator" : ["input"],
1.26 + "link_format" : ["linker"],
1.27 + "output_context" : ["output"],
1.28 + "output_format" : ["serialiser"],
1.29 + "theme_name" : ["theme"],
1.30 }
1.31
1.32 def __init__(self, parameters=None):
1.33 @@ -92,12 +92,14 @@
1.34
1.35 self.parameters[name] = value
1.36
1.37 - # Invalidate any affected setting.
1.38 + # Invalidate any affected settings.
1.39
1.40 affected = self.effects.get(name)
1.41
1.42 - if affected and self.has_key(affected):
1.43 - del self.parameters[affected]
1.44 + if affected:
1.45 + for affected_name in affected:
1.46 + if self.has_key(affected_name):
1.47 + del self.parameters[affected_name]
1.48
1.49 # Set any default values.
1.50
1.51 @@ -106,36 +108,43 @@
1.52 if affected and not self.get(affected):
1.53 self.set(affected, value)
1.54
1.55 - def make_object(self, name, fn, typename, typevalue=None):
1.56 + def get_update(self, name, value=None):
1.57
1.58 """
1.59 - Make an object to be stored in the setting 'name', using 'fn' to
1.60 - acquire the object class, with the object type being retrieved from the
1.61 - 'typename' setting, this being overwritten by 'typevalue' if specified.
1.62 - Return None if no class is obtained.
1.63 + Obtain the 'name' setting, this being overwritten by 'value' if
1.64 + specified. Return the updated setting.
1.65 """
1.66
1.67 - # Return any existing object if not reset.
1.68 + # Overwrite any existing setting.
1.69
1.70 - if not typevalue:
1.71 - obj = self.get(name)
1.72 - if obj:
1.73 - return obj
1.74 + if value:
1.75 + self.set(name, value)
1.76 + return value
1.77 + else:
1.78 + return self.get(name)
1.79 +
1.80 + def make_object(self, name, cls):
1.81
1.82 - # Overwrite any existing typename setting.
1.83 + """
1.84 + Make an object to be stored in the setting 'name', using 'cls' as the
1.85 + object class.
1.86 + """
1.87
1.88 - else:
1.89 - self.set(typename, typevalue)
1.90 + # Return any existing, preserved object. Since updates to various
1.91 + # properties will discard objects, any preserved object should still be
1.92 + # applicable.
1.93
1.94 - # Obtain the class.
1.95 + obj = self.get(name)
1.96 + if obj:
1.97 + return obj
1.98
1.99 - cls = fn(self.get(typename))
1.100 + # Without any object class, return None.
1.101
1.102 if not cls:
1.103 self.set(name, None)
1.104 return None
1.105
1.106 - # Instantiate the class.
1.107 + # Instantiate the class and record the object.
1.108
1.109 obj = cls(self)
1.110 self.set(name, obj)
1.111 @@ -148,7 +157,9 @@
1.112 "input_context" setting which will be replaced by any given 'name'.
1.113 """
1.114
1.115 - return self.make_object("input", get_input, "input_context", name)
1.116 + cls = get_input(self.get_update("input_context", name))
1.117 +
1.118 + return self.make_object("input", cls)
1.119
1.120 def get_linker(self, name=None):
1.121
1.122 @@ -157,7 +168,9 @@
1.123 "link_format" setting which will be replaced by any given 'name'.
1.124 """
1.125
1.126 - return self.make_object("linker", get_linker, "link_format", name)
1.127 + cls = get_linker(self.get_update("link_format", name))
1.128 +
1.129 + return self.make_object("linker", cls)
1.130
1.131 def get_output(self, name=None):
1.132
1.133 @@ -166,7 +179,9 @@
1.134 "output_context" setting which will be replaced by any given 'name'.
1.135 """
1.136
1.137 - return self.make_object("output", get_output, "output_context", name)
1.138 + cls = get_output(self.get_update("output_context", name))
1.139 +
1.140 + return self.make_object("output", cls)
1.141
1.142 def get_parser(self, name=None):
1.143
1.144 @@ -175,7 +190,9 @@
1.145 "input_format" setting which will be replaced by any given 'name'.
1.146 """
1.147
1.148 - parser = self.make_object("parser", get_parser, "input_format", name)
1.149 + cls = get_parser(self.get_update("input_format", name))
1.150 +
1.151 + parser = self.make_object("parser", cls)
1.152 parser.parsers = parsers
1.153 return parser
1.154
1.155 @@ -186,8 +203,10 @@
1.156 "output_format" setting which will be replaced by any given 'name'.
1.157 """
1.158
1.159 - serialiser = self.make_object("serialiser", get_serialiser,
1.160 - "output_format", name)
1.161 + cls = get_serialiser(self.get_update("output_format", name),
1.162 + self.get("input_format"))
1.163 +
1.164 + serialiser = self.make_object("serialiser", cls)
1.165 serialiser.serialisers = serialisers
1.166 return serialiser
1.167
1.168 @@ -198,6 +217,8 @@
1.169 setting which will be replaced by any given 'name'.
1.170 """
1.171
1.172 - return self.make_object("theme", get_theme, "theme_name", name)
1.173 + cls = get_theme(self.get_update("theme_name", name))
1.174 +
1.175 + return self.make_object("theme", cls)
1.176
1.177 # vim: tabstop=4 expandtab shiftwidth=4