Changeset 137 for pyyaml/trunk/lib/yaml/composer.py
- Timestamp:
- 04/16/06 19:45:21 (7 years ago)
- File:
-
- 1 edited
-
pyyaml/trunk/lib/yaml/composer.py (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
pyyaml/trunk/lib/yaml/composer.py
r136 r137 1 1 2 __all__ = [' BaseComposer', 'Composer', 'ComposerError']2 __all__ = ['Composer', 'ComposerError'] 3 3 4 4 from error import MarkedYAMLError … … 9 9 pass 10 10 11 class BaseComposer: 12 13 yaml_resolvers = {} 11 class Composer: 14 12 15 13 def __init__(self): 16 14 self.all_anchors = {} 17 15 self.complete_anchors = {} 18 self.resolver_tags = []19 self.resolver_paths = []20 16 21 17 def check_node(self): … … 43 39 44 40 # Compose the root node. 45 node = self.compose_node( [])41 node = self.compose_node(None, None) 46 42 47 43 # Drop the DOCUMENT-END event. … … 50 46 self.all_anchors = {} 51 47 self.complete_anchors = {} 52 self.resolver_tags = []53 self.resolver_paths = []54 48 return node 55 49 56 def increase_resolver_depth(self, path): 57 depth = len(path) 58 tag = None 59 paths = [] 60 if not depth: 61 for resolver_path in self.yaml_resolvers.keys(): 62 if resolver_path: 63 paths.append(resolver_path) 64 else: 65 tag = self.yaml_resolvers[resolver_path] 66 else: 67 base, index = path[-1] 68 if isinstance(index, ScalarNode) \ 69 and index.tag == self.DEFAULT_SCALAR_TAG: 70 index = index.value 71 elif isinstance(index, Node): 72 index = None 73 for resolver_path in self.resolver_paths[-1]: 74 resolver_index = resolver_path[depth-1] 75 if resolver_index is None or resolver_index == index: 76 if len(resolver_index) > depth: 77 paths.append(resolver_path) 78 else: 79 tag = self.yaml_resolvers[resolver_path] 80 self.resolver_tags.append(tag) 81 self.resolver_paths.append(paths) 82 83 def decrease_resolver_depth(self): 84 del self.resolver_tags[-1] 85 del self.resolver_paths[-1] 86 87 def compose_node(self, path): 50 def compose_node(self, parent, index): 88 51 if self.check_event(AliasEvent): 89 52 event = self.get_event() … … 99 62 event.start_mark) 100 63 return self.complete_anchors[anchor] 101 self.increase_resolver_depth(path)102 64 event = self.peek_event() 103 65 anchor = event.anchor … … 108 70 "second occurence", event.start_mark) 109 71 self.all_anchors[anchor] = event 72 self.descend_resolver(parent, index) 110 73 if self.check_event(ScalarEvent): 111 node = self.compose_scalar_node( path)74 node = self.compose_scalar_node() 112 75 elif self.check_event(SequenceStartEvent): 113 node = self.compose_sequence_node( path)76 node = self.compose_sequence_node() 114 77 elif self.check_event(MappingStartEvent): 115 node = self.compose_mapping_node( path)78 node = self.compose_mapping_node() 116 79 if anchor is not None: 117 80 self.complete_anchors[anchor] = node 118 self. decrease_resolver_depth()81 self.ascend_resolver() 119 82 return node 120 83 121 def compose_scalar_node(self , path):84 def compose_scalar_node(self): 122 85 event = self.get_event() 123 tag = self.resolve_scalar(path, event.tag, event.implicit, event.value) 86 tag = event.tag 87 if tag is None or tag == u'!': 88 tag = self.resolve(ScalarNode, event.value, event.implicit) 124 89 return ScalarNode(tag, event.value, 125 90 event.start_mark, event.end_mark, style=event.style) 126 91 127 def compose_sequence_node(self , path):92 def compose_sequence_node(self): 128 93 start_event = self.get_event() 129 tag = self.resolve_sequence(path, start_event.tag) 94 tag = start_event.tag 95 if tag is None or tag == u'!': 96 tag = self.resolve(SequenceNode, None, start_event.implicit) 130 97 node = SequenceNode(tag, [], 131 98 start_event.start_mark, None, … … 133 100 index = 0 134 101 while not self.check_event(SequenceEndEvent): 135 node.value.append(self.compose_node( path+[(node, index)]))102 node.value.append(self.compose_node(node, index)) 136 103 index += 1 137 104 end_event = self.get_event() … … 139 106 return node 140 107 141 def compose_mapping_node(self , path):108 def compose_mapping_node(self): 142 109 start_event = self.get_event() 143 tag = self.resolve_mapping(path, start_event.tag) 110 tag = start_event.tag 111 if tag is None or tag == u'!': 112 tag = self.resolve(MappingNode, None, start_event.implicit) 144 113 node = MappingNode(tag, {}, 145 114 start_event.start_mark, None, … … 147 116 while not self.check_event(MappingEndEvent): 148 117 key_event = self.peek_event() 149 item_key = self.compose_node(path+[(node, None)]) 150 item_value = self.compose_node(path+[(node, item_key)]) 118 item_key = self.compose_node(node, None) 151 119 if item_key in node.value: 152 120 raise ComposerError("while composing a mapping", start_event.start_mark, 153 121 "found duplicate key", key_event.start_mark) 122 item_value = self.compose_node(node, item_key) 154 123 node.value[item_key] = item_value 155 124 end_event = self.get_event() … … 157 126 return node 158 127 159 def resolve_scalar(self, path, tag, implicit, value):160 if implicit:161 tag = self.detect(value)162 if tag is None and self.resolver_tags[-1]:163 tag = self.resolver_tags[-1]164 if tag is None or tag == u'!':165 tag = self.DEFAULT_SCALAR_TAG166 return tag167 168 def resolve_sequence(self, path, tag):169 if tag is None and self.resolver_tags[-1]:170 tag = self.resolver_tags[-1]171 if tag is None or tag == u'!':172 tag = self.DEFAULT_SEQUENCE_TAG173 return tag174 175 def resolve_mapping(self, path, tag):176 if tag is None and self.resolver_tags[-1]:177 tag = self.resolver_tags[-1]178 if tag is None or tag == u'!':179 tag = self.DEFAULT_MAPPING_TAG180 return tag181 182 def add_resolver(self, tag, path):183 if not 'yaml_resolvers' in cls.__dict__:184 cls.yaml_resolvers = cls.yaml_resolvers.copy()185 cls.yaml_resolvers[tuple(path)] = tag186 add_resolver = classmethod(add_resolver)187 188 class Composer(BaseComposer):189 pass190
Note: See TracChangeset
for help on using the changeset viewer.
