Changeset 127
- Timestamp:
- 03/26/06 17:57:23 (3 years ago)
- Files:
-
- pyyaml/branches/working-on-emitter/lib/yaml/emitter.py (modified) (1 diff)
- pyyaml/branches/working-on-emitter/lib/yaml/events.py (modified) (4 diffs)
- pyyaml/branches/working-on-emitter/lib/yaml/parser.py (modified) (10 diffs)
- pyyaml/branches/working-on-emitter/lib/yaml/reader.py (modified) (2 diffs)
- pyyaml/branches/working-on-emitter/lib/yaml/scanner.py (modified) (12 diffs)
- pyyaml/branches/working-on-emitter/lib/yaml/tokens.py (modified) (4 diffs)
- pyyaml/branches/working-on-emitter/tests/data/spec-08-12.canonical (modified) (1 diff)
- pyyaml/branches/working-on-emitter/tests/data/spec-08-12.data (modified) (1 diff)
- pyyaml/branches/working-on-emitter/tests/test_emitter.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
pyyaml/branches/working-on-emitter/lib/yaml/emitter.py
r122 r127 176 176 177 177 def write_indent(self): 178 self.writer.write("\n"+" "*(self.level* 4))178 self.writer.write("\n"+" "*(self.level*2)) 179 179 self.soft_space = False 180 180 pyyaml/branches/working-on-emitter/lib/yaml/events.py
r122 r127 21 21 22 22 class ScalarEvent(NodeEvent): 23 def __init__(self, anchor, tag, value, start_mark=None, end_mark=None): 23 def __init__(self, anchor, tag, value, start_mark=None, end_mark=None, 24 implicit=None, style=None): 24 25 self.anchor = anchor 25 26 self.tag = tag … … 27 28 self.start_mark = start_mark 28 29 self.end_mark = end_mark 30 self.implicit = implicit 31 self.style = style 29 32 30 33 class CollectionEvent(NodeEvent): 31 def __init__(self, anchor, tag, start_mark=None, end_mark=None): 34 def __init__(self, anchor, tag, start_mark=None, end_mark=None, 35 flow=None, compact=None): 32 36 self.anchor = anchor 33 37 self.tag = tag 34 38 self.start_mark = start_mark 35 39 self.end_mark = end_mark 40 self.flow = flow 41 self.compact = compact 36 42 37 43 class SequenceEvent(CollectionEvent): … … 45 51 46 52 class DocumentStartEvent(Event): 47 pass 53 def __init__(self, start_mark=None, end_mark=None, 54 indent=None, implicit=None, version=None, tags=None, 55 canonical=None): 56 self.start_mark = start_mark 57 self.end_mark = end_mark 58 self.indent = indent 59 self.implicit = implicit 60 self.version = version 61 self.tags = tags 62 self.canonical = canonical 48 63 49 64 class DocumentEndEvent(Event): … … 51 66 52 67 class StreamStartEvent(Event): 53 pass 68 def __init__(self, start_mark=None, end_mark=None, 69 encoding=None): 70 self.start_mark = start_mark 71 self.end_mark = end_mark 72 self.encoding = encoding 54 73 55 74 class StreamEndEvent(Event): pyyaml/branches/working-on-emitter/lib/yaml/parser.py
r121 r127 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, implicit=True) 142 143 for event in self.parse_block_node(): 143 144 yield event … … 153 154 token = self.scanner.peek() 154 155 start_mark = token.start_mark 155 self.process_directives()156 version, tags = self.process_directives() 156 157 if not self.scanner.check(DocumentStartToken): 157 158 raise ParserError(None, None, … … 161 162 token = self.scanner.get() 162 163 end_mark = token.end_mark 163 yield DocumentStartEvent(start_mark, end_mark) 164 yield DocumentStartEvent(start_mark, end_mark, 165 implicit=False, version=version, tags=tags) 164 166 if self.scanner.check(DirectiveToken, 165 167 DocumentStartToken, DocumentEndToken, StreamEndToken): … … 202 204 token.start_mark) 203 205 self.tag_handles[handle] = prefix 206 version_value = self.yaml_version 207 tags_value = None 208 if self.tag_handles: 209 tags_value = self.tag_handles.copy() 204 210 for key in self.DEFAULT_TAGS: 205 211 if key not in self.tag_handles: 206 212 self.tag_handles[key] = self.DEFAULT_TAGS[key] 213 return version_value, tags_value 207 214 208 215 def parse_block_node(self): … … 233 240 if self.scanner.check(AnchorToken): 234 241 token = self.scanner.get() 235 start_mark = end_mark = token.start_mark 242 start_mark = token.start_mark 243 end_mark = token.end_mark 236 244 anchor = token.value 237 245 if self.scanner.check(TagToken): 238 246 token = self.scanner.get() 239 end_mark = tag_mark = token.start_mark 247 tag_mark = token.start_mark 248 end_mark = token.end_mark 240 249 tag = token.value 241 250 elif self.scanner.check(TagToken): 242 251 token = self.scanner.get() 243 start_mark = end_mark = tag_mark = token.start_mark 252 start_mark = tag_mark = token.start_mark 253 end_mark = token.end_mark 244 254 tag = token.value 245 255 if self.scanner.check(AnchorToken): 246 256 token = self.scanner.get() 247 end_mark = token. start_mark257 end_mark = token.end_mark 248 258 anchor = token.value 249 259 if tag is not None: … … 262 272 tag = u'!' 263 273 if start_mark is None: 264 start_mark = self.scanner.peek().start_mark274 start_mark = end_mark = self.scanner.peek().start_mark 265 275 event = None 266 276 collection_events = None 267 277 if indentless_sequence and self.scanner.check(BlockEntryToken): 268 278 end_mark = self.scanner.peek().end_mark 269 event = SequenceEvent(anchor, tag, start_mark, end_mark) 279 event = SequenceEvent(anchor, tag, start_mark, end_mark, 280 flow=False, compact=False) 270 281 collection_events = self.parse_indentless_sequence() 271 282 else: … … 274 285 end_mark = token.end_mark 275 286 event = ScalarEvent(anchor, tag, token.value, 276 start_mark, end_mark) 287 start_mark, end_mark, 288 implicit=(tag is None), style=token.style) 277 289 elif self.scanner.check(FlowSequenceStartToken): 278 290 end_mark = self.scanner.peek().end_mark 279 event = SequenceEvent(anchor, tag, start_mark, end_mark) 291 event = SequenceEvent(anchor, tag, start_mark, end_mark, 292 flow=True) 280 293 collection_events = self.parse_flow_sequence() 281 294 elif self.scanner.check(FlowMappingStartToken): 282 295 end_mark = self.scanner.peek().end_mark 283 event = MappingEvent(anchor, tag, start_mark, end_mark) 296 event = MappingEvent(anchor, tag, start_mark, end_mark, 297 flow=True) 284 298 collection_events = self.parse_flow_mapping() 285 299 elif block and self.scanner.check(BlockSequenceStartToken): 286 300 end_mark = self.scanner.peek().start_mark 287 event = SequenceEvent(anchor, tag, start_mark, end_mark) 301 compact = self.scanner.peek().inline 302 event = SequenceEvent(anchor, tag, start_mark, end_mark, 303 flow=False, compact=compact) 288 304 collection_events = self.parse_block_sequence() 289 305 elif block and self.scanner.check(BlockMappingStartToken): 290 306 end_mark = self.scanner.peek().start_mark 291 event = MappingEvent(anchor, tag, start_mark, end_mark) 307 compact = self.scanner.peek().inline 308 event = MappingEvent(anchor, tag, start_mark, end_mark, 309 flow=False, compact=compact) 292 310 collection_events = self.parse_block_mapping() 311 elif anchor is not None or tag is not None: 312 # Empty scalars are allowed even if a tag or an anchor is 313 # specified. 314 event = ScalarEvent(anchor, tag, u'', start_mark, end_mark, 315 implicit=False, style='') 293 316 else: 294 317 if block: … … 385 408 token = self.scanner.get() 386 409 yield MappingEvent(None, u'!', 387 token.start_mark, token.end_mark) 410 token.start_mark, token.end_mark, 411 flow=True, compact=True) 388 412 if not self.scanner.check(ValueToken, 389 413 FlowEntryToken, FlowSequenceEndToken): … … 461 485 462 486 def process_empty_scalar(self, mark): 463 return ScalarEvent(None, None, u'', mark, mark )464 487 return ScalarEvent(None, None, u'', mark, mark, implicit=True) 488 pyyaml/branches/working-on-emitter/lib/yaml/reader.py
r121 r127 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/branches/working-on-emitter/lib/yaml/scanner.py
r121 r127 36 36 # See below simple keys treatment. 37 37 38 def __init__(self, token_number, required, index, line, column, mark): 38 def __init__(self, token_number, required, index, line, column, mark=None, 39 inline=None): 39 40 self.token_number = token_number 40 41 self.required = required … … 43 44 self.column = column 44 45 self.mark = mark 46 self.inline = inline 45 47 46 48 class Scanner: … … 81 83 # Past indentation levels. 82 84 self.indents = [] 85 86 # Used for providing style information to the parser. 87 self.current_line = self.previous_line = self.reader.line 88 self.current_column = self.previus_column = self.reader.column 83 89 84 90 # Variables related to simple keys treatment. … … 322 328 column = self.reader.column 323 329 mark = self.reader.get_mark() 330 inline = (self.current_line == self.previous_line) 324 331 key = SimpleKey(token_number, required, 325 index, line, column, mark )332 index, line, column, mark, inline) 326 333 self.possible_simple_keys[self.flow_level] = key 327 334 … … 381 388 382 389 # Add STREAM-END. 383 self.tokens.append(StreamStartToken(mark, mark ))384 390 self.tokens.append(StreamStartToken(mark, mark, 391 encoding=self.reader.encoding)) 385 392 386 393 def fetch_stream_end(self): … … 510 517 if self.add_indent(self.reader.column): 511 518 mark = self.reader.get_mark() 512 self.tokens.append(BlockSequenceStartToken(mark, mark)) 519 inline = (self.current_line == self.previous_line) 520 self.tokens.append(BlockSequenceStartToken(mark, mark, inline)) 513 521 514 522 # It's an error for the block entry to occur in the flow context, … … 543 551 if self.add_indent(self.reader.column): 544 552 mark = self.reader.get_mark() 545 self.tokens.append(BlockMappingStartToken(mark, mark)) 553 inline = (self.current_line == self.previous_line) 554 self.tokens.append(BlockMappingStartToken(mark, mark, inline)) 546 555 547 556 # Simple keys are allowed after '?' in the block context. … … 573 582 if self.add_indent(key.column): 574 583 self.tokens.insert(key.token_number-self.tokens_taken, 575 BlockMappingStartToken(key.mark, key.mark)) 584 BlockMappingStartToken(key.mark, key.mark, 585 key.inline)) 576 586 577 587 # There cannot be two simple keys one after another. … … 791 801 else: 792 802 found = True 803 804 self.previous_line = self.current_line 805 self.previous_column = self.current_column 806 self.current_line = self.reader.line 807 self.current_column = self.reader.column 793 808 794 809 def scan_directive(self): … … 1054 1069 1055 1070 # We are done. 1056 return ScalarToken(u''.join(chunks), False, start_mark, end_mark) 1071 if folded: 1072 style = '>' 1073 else: 1074 style = '|' 1075 return ScalarToken(u''.join(chunks), False, start_mark, end_mark, 1076 style) 1057 1077 1058 1078 def scan_block_scalar_indicators(self, start_mark): … … 1155 1175 self.reader.forward() 1156 1176 end_mark = self.reader.get_mark() 1157 return ScalarToken(u''.join(chunks), False, start_mark, end_mark) 1177 if double: 1178 style = '"' 1179 else: 1180 style = '\'' 1181 return ScalarToken(u''.join(chunks), False, start_mark, end_mark, 1182 style) 1158 1183 1159 1184 ESCAPE_REPLACEMENTS = { … … 1306 1331 or (not self.flow_level and self.reader.column < indent): 1307 1332 break 1308 return ScalarToken(u''.join(chunks), True, start_mark, end_mark )1333 return ScalarToken(u''.join(chunks), True, start_mark, end_mark, '') 1309 1334 1310 1335 def scan_plain_spaces(self, indent, start_mark): pyyaml/branches/working-on-emitter/lib/yaml/tokens.py
r122 r127 25 25 class DocumentStartToken(Token): 26 26 id = '<document start>' 27 def __init__(self, name, value, start_mark=None, end_mark=None): 28 self.name = name 29 self.value = value 30 self.start_mark = start_mark 31 self.end_mark = end_mark 27 32 28 33 class DocumentEndToken(Token): … … 31 36 class StreamStartToken(Token): 32 37 id = '<stream start>' 38 def __init__(self, start_mark=None, end_mark=None, 39 encoding=None): 40 self.start_mark = start_mark 41 self.end_mark = end_mark 42 self.encoding = encoding 33 43 34 44 class StreamEndToken(Token): … … 37 47 class BlockSequenceStartToken(Token): 38 48 id = '<block sequence start>' 49 def __init__(self, start_mark=None, end_mark=None, 50 inline=None): 51 self.start_mark = start_mark 52 self.end_mark = end_mark 53 self.inline = inline 39 54 40 55 class BlockMappingStartToken(Token): 41 56 id = '<block mapping start>' 57 def __init__(self, start_mark=None, end_mark=None, 58 inline=None): 59 self.start_mark = start_mark 60 self.end_mark = end_mark 61 self.inline = inline 42 62 43 63 class BlockEndToken(Token): … … 91 111 class ScalarToken(Token): 92 112 id = '<scalar>' 93 def __init__(self, value, plain, start_mark=None, end_mark=None): 113 def __init__(self, value, plain, start_mark=None, end_mark=None, 114 style=None): 94 115 self.value = value 95 116 self.plain = plain 96 117 self.start_mark = start_mark 97 118 self.end_mark = end_mark 119 self.style = style 98 120 pyyaml/branches/working-on-emitter/tests/data/spec-08-12.canonical
r38 r127 7 7 *A, 8 8 !!str "", 9 !!str "", 9 10 ] pyyaml/branches/working-on-emitter/tests/data/spec-08-12.data
r44 r127 4 4 !!str 'Tagged', 5 5 *anchor, # Alias node 6 # !!str,# Empty plain scalar6 !!str , # Empty plain scalar 7 7 '', # Empty plain scalar 8 8 ] pyyaml/branches/working-on-emitter/tests/test_emitter.py
r122 r127 1 1 2 import test_appliance, sys 2 import test_appliance, sys, StringIO 3 3 4 4 from yaml import * … … 8 8 def _testEmitterOnCanonical(self, test_name, canonical_filename): 9 9 events = list(iter(Parser(Scanner(Reader(file(canonical_filename, 'rb')))))) 10 writer = sys.stdout 10 #writer = sys.stdout 11 writer = StringIO.StringIO() 11 12 emitter = Emitter(writer) 12 print "-"*3013 print "ORIGINAL DATA:"14 print file(canonical_filename, 'rb').read()13 #print "-"*30 14 #print "ORIGINAL DATA:" 15 #print file(canonical_filename, 'rb').read() 15 16 for event in events: 16 17 emitter.emit(event)
