Changeset 130 for pyyaml/trunk/lib/yaml
- Timestamp:
- 04/03/06 14:20:25 (6 years ago)
- Location:
- pyyaml/trunk/lib/yaml
- Files:
-
- 6 modified
Legend:
- Unmodified
- Added
- Removed
-
pyyaml/trunk/lib/yaml/composer.py
r118 r130 72 72 if self.parser.check(ScalarEvent): 73 73 node = self.compose_scalar_node() 74 elif self.parser.check(Sequence Event):74 elif self.parser.check(SequenceStartEvent): 75 75 node = self.compose_sequence_node() 76 elif self.parser.check(Mapping Event):76 elif self.parser.check(MappingStartEvent): 77 77 node = self.compose_mapping_node() 78 78 if anchor is not None: … … 88 88 start_event = self.parser.get() 89 89 value = [] 90 while not self.parser.check( CollectionEndEvent):90 while not self.parser.check(SequenceEndEvent): 91 91 value.append(self.compose_node()) 92 92 end_event = self.parser.get() … … 97 97 start_event = self.parser.get() 98 98 value = {} 99 while not self.parser.check( CollectionEndEvent):99 while not self.parser.check(MappingEndEvent): 100 100 key_event = self.parser.peek() 101 101 item_key = self.compose_node() -
pyyaml/trunk/lib/yaml/events.py
r118 r130 1 2 # Abstract classes. 1 3 2 4 class Event: 3 def __init__(self, start_mark , end_mark):5 def __init__(self, start_mark=None, end_mark=None): 4 6 self.start_mark = start_mark 5 7 self.end_mark = end_mark 6 8 def __repr__(self): 7 attributes = [key for key in self.__dict__ 8 if not key.endswith('_mark')] 9 attributes.sort() 9 attributes = [key for key in ['anchor', 'tag', 'value'] 10 if hasattr(self, key)] 10 11 arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) 11 12 for key in attributes]) … … 13 14 14 15 class NodeEvent(Event): 15 def __init__(self, anchor, start_mark , end_mark):16 def __init__(self, anchor, start_mark=None, end_mark=None): 16 17 self.anchor = anchor 17 18 self.start_mark = start_mark 18 19 self.end_mark = end_mark 20 21 class CollectionStartEvent(NodeEvent): 22 def __init__(self, anchor, tag, start_mark=None, end_mark=None, 23 flow_style=None): 24 self.anchor = anchor 25 self.tag = tag 26 self.start_mark = start_mark 27 self.end_mark = end_mark 28 self.flow_style = flow_style 29 30 class CollectionEndEvent(Event): 31 pass 32 33 # Implementations. 34 35 class StreamStartEvent(Event): 36 def __init__(self, start_mark=None, end_mark=None, 37 encoding=None, canonical=None, indent=None, width=None): 38 self.start_mark = start_mark 39 self.end_mark = end_mark 40 self.encoding = encoding 41 self.canonical = canonical 42 self.indent = indent 43 self.width = width 44 45 class StreamEndEvent(Event): 46 pass 47 48 class DocumentStartEvent(Event): 49 def __init__(self, start_mark=None, end_mark=None, 50 implicit=None, version=None, tags=None): 51 self.start_mark = start_mark 52 self.end_mark = end_mark 53 self.implicit = implicit 54 self.version = version 55 self.tags = tags 56 57 class DocumentEndEvent(Event): 58 def __init__(self, start_mark=None, end_mark=None, 59 implicit=None): 60 self.start_mark = start_mark 61 self.end_mark = end_mark 62 self.implicit = implicit 19 63 20 64 class AliasEvent(NodeEvent): … … 22 66 23 67 class ScalarEvent(NodeEvent): 24 def __init__(self, anchor, tag, value, start_mark, end_mark): 68 def __init__(self, anchor, tag, value, start_mark=None, end_mark=None, 69 implicit=None, style=None): 25 70 self.anchor = anchor 26 71 self.tag = tag … … 28 73 self.start_mark = start_mark 29 74 self.end_mark = end_mark 75 self.implicit = implicit 76 self.style = style 30 77 31 class CollectionEvent(NodeEvent): 32 def __init__(self, anchor, tag, start_mark, end_mark): 33 self.anchor = anchor 34 self.tag = tag 35 self.start_mark = start_mark 36 self.end_mark = end_mark 37 38 class SequenceEvent(CollectionEvent): 78 class SequenceStartEvent(CollectionStartEvent): 39 79 pass 40 80 41 class MappingEvent(CollectionEvent):81 class SequenceEndEvent(CollectionEndEvent): 42 82 pass 43 83 44 class CollectionEndEvent(Event):84 class MappingStartEvent(CollectionStartEvent): 45 85 pass 46 86 47 class DocumentStartEvent(Event):87 class MappingEndEvent(CollectionEndEvent): 48 88 pass 49 89 50 class DocumentEndEvent(Event):51 pass52 53 class StreamStartEvent(Event):54 pass55 56 class StreamEndEvent(Event):57 pass58 -
pyyaml/trunk/lib/yaml/parser.py
r118 r130 131 131 # Parse start of stream. 132 132 token = self.scanner.get() 133 yield StreamStartEvent(token.start_mark, token.end_mark) 133 yield StreamStartEvent(token.start_mark, token.end_mark, 134 encoding=token.encoding) 134 135 135 136 # Parse implicit document. … … 139 140 token = self.scanner.peek() 140 141 start_mark = end_mark = token.start_mark 141 yield DocumentStartEvent(start_mark, end_mark) 142 yield DocumentStartEvent(start_mark, end_mark, 143 implicit=True) 142 144 for event in self.parse_block_node(): 143 145 yield event 144 146 token = self.scanner.peek() 145 147 start_mark = end_mark = token.start_mark 148 implicit = True 146 149 while self.scanner.check(DocumentEndToken): 147 150 token = self.scanner.get() 148 151 end_mark = token.end_mark 149 yield DocumentEndEvent(start_mark, end_mark) 152 implicit = True 153 yield DocumentEndEvent(start_mark, end_mark, 154 implicit=implicit) 150 155 151 156 # Parse explicit documents. … … 153 158 token = self.scanner.peek() 154 159 start_mark = token.start_mark 155 self.process_directives()160 version, tags = self.process_directives() 156 161 if not self.scanner.check(DocumentStartToken): 157 162 raise ParserError(None, None, … … 161 166 token = self.scanner.get() 162 167 end_mark = token.end_mark 163 yield DocumentStartEvent(start_mark, end_mark) 168 yield DocumentStartEvent(start_mark, end_mark, 169 implicit=False, version=version, tags=tags) 164 170 if self.scanner.check(DirectiveToken, 165 171 DocumentStartToken, DocumentEndToken, StreamEndToken): … … 170 176 token = self.scanner.peek() 171 177 start_mark = end_mark = token.start_mark 178 implicit=True 172 179 while self.scanner.check(DocumentEndToken): 173 180 token = self.scanner.get() 174 181 end_mark = token.end_mark 175 yield DocumentEndEvent(start_mark, end_mark) 182 implicit=False 183 yield DocumentEndEvent(start_mark, end_mark, 184 implicit=implicit) 176 185 177 186 # Parse end of stream. … … 202 211 token.start_mark) 203 212 self.tag_handles[handle] = prefix 213 if self.tag_handles: 214 value = self.yaml_version, self.tag_handles.copy() 215 else: 216 value = self.yaml_version, None 204 217 for key in self.DEFAULT_TAGS: 205 218 if key not in self.tag_handles: 206 219 self.tag_handles[key] = self.DEFAULT_TAGS[key] 220 return value 207 221 208 222 def parse_block_node(self): … … 233 247 if self.scanner.check(AnchorToken): 234 248 token = self.scanner.get() 235 start_mark = end_mark = token.start_mark 249 start_mark = token.start_mark 250 end_mark = token.end_mark 236 251 anchor = token.value 237 252 if self.scanner.check(TagToken): 238 253 token = self.scanner.get() 239 end_mark = tag_mark = token.start_mark 254 tag_mark = token.start_mark 255 end_mark = token.end_mark 240 256 tag = token.value 241 257 elif self.scanner.check(TagToken): 242 258 token = self.scanner.get() 243 start_mark = end_mark = tag_mark = token.start_mark 259 start_mark = tag_mark = token.start_mark 260 end_mark = token.end_mark 244 261 tag = token.value 245 262 if self.scanner.check(AnchorToken): 246 263 token = self.scanner.get() 247 end_mark = token. start_mark264 end_mark = token.end_mark 248 265 anchor = token.value 249 266 if tag is not None: … … 259 276 if tag is None: 260 277 if not (self.scanner.check(ScalarToken) and 261 self.scanner.peek(). plain):278 self.scanner.peek().implicit): 262 279 tag = u'!' 263 280 if start_mark is None: 264 start_mark = self.scanner.peek().start_mark281 start_mark = end_mark = self.scanner.peek().start_mark 265 282 event = None 266 283 collection_events = None 267 284 if indentless_sequence and self.scanner.check(BlockEntryToken): 268 285 end_mark = self.scanner.peek().end_mark 269 event = Sequence Event(anchor, tag, start_mark, end_mark)286 event = SequenceStartEvent(anchor, tag, start_mark, end_mark) 270 287 collection_events = self.parse_indentless_sequence() 271 288 else: … … 274 291 end_mark = token.end_mark 275 292 event = ScalarEvent(anchor, tag, token.value, 276 start_mark, end_mark) 293 start_mark, end_mark, 294 implicit=token.implicit, style=token.style) 277 295 elif self.scanner.check(FlowSequenceStartToken): 278 296 end_mark = self.scanner.peek().end_mark 279 event = SequenceEvent(anchor, tag, start_mark, end_mark) 297 event = SequenceStartEvent(anchor, tag, start_mark, end_mark, 298 flow_style=True) 280 299 collection_events = self.parse_flow_sequence() 281 300 elif self.scanner.check(FlowMappingStartToken): 282 301 end_mark = self.scanner.peek().end_mark 283 event = MappingEvent(anchor, tag, start_mark, end_mark) 302 event = MappingStartEvent(anchor, tag, start_mark, end_mark, 303 flow_style=True) 284 304 collection_events = self.parse_flow_mapping() 285 305 elif block and self.scanner.check(BlockSequenceStartToken): 286 306 end_mark = self.scanner.peek().start_mark 287 event = SequenceEvent(anchor, tag, start_mark, end_mark) 307 event = SequenceStartEvent(anchor, tag, start_mark, end_mark, 308 flow_style=False) 288 309 collection_events = self.parse_block_sequence() 289 310 elif block and self.scanner.check(BlockMappingStartToken): 290 311 end_mark = self.scanner.peek().start_mark 291 event = MappingEvent(anchor, tag, start_mark, end_mark) 312 event = MappingStartEvent(anchor, tag, start_mark, end_mark, 313 flow_style=False) 292 314 collection_events = self.parse_block_mapping() 315 elif anchor is not None or tag is not None: 316 # Empty scalars are allowed even if a tag or an anchor is 317 # specified. 318 event = ScalarEvent(anchor, tag, u'', start_mark, end_mark, 319 implicit=True) 293 320 else: 294 321 if block: … … 321 348 "expected <block end>, but found %r" % token.id, token.start_mark) 322 349 token = self.scanner.get() 323 yield CollectionEndEvent(token.start_mark, token.end_mark)350 yield SequenceEndEvent(token.start_mark, token.end_mark) 324 351 325 352 def parse_indentless_sequence(self): … … 334 361 yield self.process_empty_scalar(token.end_mark) 335 362 token = self.scanner.peek() 336 yield CollectionEndEvent(token.start_mark, token.start_mark)363 yield SequenceEndEvent(token.start_mark, token.start_mark) 337 364 338 365 def parse_block_mapping(self): … … 366 393 "expected <block end>, but found %r" % token.id, token.start_mark) 367 394 token = self.scanner.get() 368 yield CollectionEndEvent(token.start_mark, token.end_mark)395 yield MappingEndEvent(token.start_mark, token.end_mark) 369 396 370 397 def parse_flow_sequence(self): … … 384 411 if self.scanner.check(KeyToken): 385 412 token = self.scanner.get() 386 yield MappingEvent(None, u'!', 387 token.start_mark, token.end_mark) 413 yield MappingStartEvent(None, u'!', 414 token.start_mark, token.end_mark, 415 flow_style=True) 388 416 if not self.scanner.check(ValueToken, 389 417 FlowEntryToken, FlowSequenceEndToken): … … 403 431 yield self.process_empty_scalar(token.start_mark) 404 432 token = self.scanner.peek() 405 yield CollectionEndEvent(token.start_mark, token.start_mark)433 yield MappingEndEvent(token.start_mark, token.start_mark) 406 434 else: 407 435 for event in self.parse_flow_node(): … … 414 442 self.scanner.get() 415 443 token = self.scanner.get() 416 yield CollectionEndEvent(token.start_mark, token.end_mark)444 yield SequenceEndEvent(token.start_mark, token.end_mark) 417 445 418 446 def parse_flow_mapping(self): … … 458 486 "expected '}', but found %r" % token.id, token.start_mark) 459 487 token = self.scanner.get() 460 yield CollectionEndEvent(token.start_mark, token.end_mark)488 yield MappingEndEvent(token.start_mark, token.end_mark) 461 489 462 490 def process_empty_scalar(self, mark): 463 return ScalarEvent(None, None, u'', mark, mark) 464 491 return ScalarEvent(None, None, u'', mark, mark, 492 implicit=True) 493 -
pyyaml/trunk/lib/yaml/reader.py
r119 r130 101 101 self.raw_buffer = None 102 102 self.raw_decode = None 103 self.encoding = None 103 104 self.index = 0 104 105 self.line = 0 … … 157 158 if self.raw_buffer.startswith(codecs.BOM_UTF16_LE): 158 159 self.raw_decode = utf_16_le_decode 160 self.encoding = 'utf-16-le' 159 161 elif self.raw_buffer.startswith(codecs.BOM_UTF16_BE): 160 162 self.raw_decode = utf_16_be_decode 163 self.encoding = 'utf-16-be' 161 164 else: 162 165 self.raw_decode = utf_8_decode 166 self.encoding = 'utf-8' 163 167 self.update(1) 164 168 -
pyyaml/trunk/lib/yaml/scanner.py
r118 r130 380 380 mark = self.reader.get_mark() 381 381 382 # Add STREAM-END. 383 self.tokens.append(StreamStartToken(mark, mark)) 382 # Add STREAM-START. 383 self.tokens.append(StreamStartToken(mark, mark, 384 encoding=self.reader.encoding)) 384 385 385 386 … … 639 640 640 641 def fetch_literal(self): 641 self.fetch_block_scalar( folded=False)642 self.fetch_block_scalar(style='|') 642 643 643 644 def fetch_folded(self): 644 self.fetch_block_scalar( folded=True)645 646 def fetch_block_scalar(self, folded):645 self.fetch_block_scalar(style='>') 646 647 def fetch_block_scalar(self, style): 647 648 648 649 # A simple key may follow a block scalar. … … 653 654 654 655 # Scan and add SCALAR. 655 self.tokens.append(self.scan_block_scalar( folded))656 self.tokens.append(self.scan_block_scalar(style)) 656 657 657 658 def fetch_single(self): 658 self.fetch_flow_scalar( double=False)659 self.fetch_flow_scalar(style='\'') 659 660 660 661 def fetch_double(self): 661 self.fetch_flow_scalar( double=True)662 663 def fetch_flow_scalar(self, double):662 self.fetch_flow_scalar(style='"') 663 664 def fetch_flow_scalar(self, style): 664 665 665 666 # A flow scalar could be a simple key. … … 670 671 671 672 # Scan and add SCALAR. 672 self.tokens.append(self.scan_flow_scalar( double))673 self.tokens.append(self.scan_flow_scalar(style)) 673 674 674 675 def fetch_plain(self): … … 987 988 return TagToken(value, start_mark, end_mark) 988 989 989 def scan_block_scalar(self, folded): 990 # See the specification for details. 990 def scan_block_scalar(self, style): 991 # See the specification for details. 992 993 if style == '>': 994 folded = True 995 else: 996 folded = False 991 997 992 998 chunks = [] … … 1022 1028 breaks, end_mark = self.scan_block_scalar_breaks(indent) 1023 1029 if self.reader.column == indent and self.reader.peek() != u'\0': 1030 1024 1031 # Unfortunately, folding rules are ambiguous. 1025 1032 # … … 1054 1061 1055 1062 # We are done. 1056 return ScalarToken(u''.join(chunks), False, start_mark, end_mark) 1063 return ScalarToken(u''.join(chunks), False, start_mark, end_mark, 1064 style) 1057 1065 1058 1066 def scan_block_scalar_indicators(self, start_mark): … … 1138 1146 return chunks, end_mark 1139 1147 1140 def scan_flow_scalar(self, double):1148 def scan_flow_scalar(self, style): 1141 1149 # See the specification for details. 1142 1150 # Note that we loose indentation rules for quoted scalars. Quoted … … 1145 1153 # restrictive then the specification requires. We only need to check 1146 1154 # that document separators are not included in scalars. 1155 if style == '"': 1156 double = True 1157 else: 1158 double = False 1147 1159 chunks = [] 1148 1160 start_mark = self.reader.get_mark() … … 1155 1167 self.reader.forward() 1156 1168 end_mark = self.reader.get_mark() 1157 return ScalarToken(u''.join(chunks), False, start_mark, end_mark) 1169 return ScalarToken(u''.join(chunks), False, start_mark, end_mark, 1170 style) 1158 1171 1159 1172 ESCAPE_REPLACEMENTS = { -
pyyaml/trunk/lib/yaml/tokens.py
r118 r130 31 31 class StreamStartToken(Token): 32 32 id = '<stream start>' 33 def __init__(self, start_mark=None, end_mark=None, 34 encoding=None): 35 self.start_mark = start_mark 36 self.end_mark = end_mark 37 self.encoding = encoding 33 38 34 39 class StreamEndToken(Token): … … 91 96 class ScalarToken(Token): 92 97 id = '<scalar>' 93 def __init__(self, value, plain, start_mark, end_mark):98 def __init__(self, value, implicit, start_mark, end_mark, style=None): 94 99 self.value = value 95 self. plain = plain100 self.implicit = implicit 96 101 self.start_mark = start_mark 97 102 self.end_mark = end_mark 103 self.style = style 98 104
