|
@@ -18,31 +18,58 @@ typedef NodeWidgetBuilderF<T extends Node, A extends NodeWidgetBuilder> = A
|
|
|
// typedef NodeBuilder<T extends Node> = T Function(Node node);
|
|
|
|
|
|
class RenderPlugins {
|
|
|
- Map<String, NodeWidgetBuilderF> nodeWidgetBuilders = {};
|
|
|
+ final Map<String, NodeWidgetBuilderF> _nodeWidgetBuilders = {};
|
|
|
// unused
|
|
|
// Map<String, NodeBuilder> nodeBuilders = {};
|
|
|
|
|
|
- /// register plugin to render specified [name].
|
|
|
- /// [name] should be correspond to the [type] in [Node].
|
|
|
+ /// Register plugin to render specified [name].
|
|
|
+ ///
|
|
|
+ /// [name] should be [Node].type
|
|
|
+ /// or [Node].type + '/' + [Node].attributes['subtype'].
|
|
|
+ ///
|
|
|
+ /// e.g. 'text', 'text/with-checkbox', or 'text/with-heading'
|
|
|
+ ///
|
|
|
/// [name] could be empty.
|
|
|
void register(String name, NodeWidgetBuilderF builder) {
|
|
|
- nodeWidgetBuilders[name] = builder;
|
|
|
+ _validatePluginName(name);
|
|
|
+
|
|
|
+ _nodeWidgetBuilders[name] = builder;
|
|
|
}
|
|
|
|
|
|
- /// unRegister plugin with specified [name].
|
|
|
+ /// UnRegister plugin with specified [name].
|
|
|
void unRegister(String name) {
|
|
|
- nodeWidgetBuilders.removeWhere((key, _) => key == name);
|
|
|
+ _validatePluginName(name);
|
|
|
+
|
|
|
+ _nodeWidgetBuilders.removeWhere((key, _) => key == name);
|
|
|
}
|
|
|
|
|
|
- Widget buildWidget(NodeWidgetContext context) {
|
|
|
- final nodeWidgetBuilder = _nodeWidgetBuilder(context.node.type);
|
|
|
+ Widget buildWidget({
|
|
|
+ required NodeWidgetContext context,
|
|
|
+ bool withSubtype = true,
|
|
|
+ }) {
|
|
|
+ /// Find node widget builder
|
|
|
+ /// 1. If node's attributes contains subtype, return.
|
|
|
+ /// 2. If node's attributes do no contains substype, return.
|
|
|
+ final node = context.node;
|
|
|
+ var name = node.type;
|
|
|
+ if (withSubtype && node.subtype != null) {
|
|
|
+ name += '/${node.subtype}';
|
|
|
+ }
|
|
|
+ final nodeWidgetBuilder = _nodeWidgetBuilder(name);
|
|
|
return nodeWidgetBuilder(node: context.node, renderPlugins: this)(
|
|
|
context.buildContext);
|
|
|
}
|
|
|
|
|
|
NodeWidgetBuilderF _nodeWidgetBuilder(String name) {
|
|
|
- assert(nodeWidgetBuilders.containsKey(name),
|
|
|
+ assert(_nodeWidgetBuilders.containsKey(name),
|
|
|
'Could not query the builder with this $name');
|
|
|
- return nodeWidgetBuilders[name]!;
|
|
|
+ return _nodeWidgetBuilders[name]!;
|
|
|
+ }
|
|
|
+
|
|
|
+ void _validatePluginName(String name) {
|
|
|
+ final paths = name.split('/');
|
|
|
+ if (paths.length > 2) {
|
|
|
+ throw Exception('[Name] must contains zero or one slash("/")');
|
|
|
+ }
|
|
|
}
|
|
|
}
|