summaryrefslogtreecommitdiff
path: root/lib/yaml/scanner.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/yaml/scanner.py')
-rw-r--r--lib/yaml/scanner.py45
1 files changed, 35 insertions, 10 deletions
diff --git a/lib/yaml/scanner.py b/lib/yaml/scanner.py
index 9c536b4..a665da9 100644
--- a/lib/yaml/scanner.py
+++ b/lib/yaml/scanner.py
@@ -35,13 +35,15 @@ class ScannerError(MarkedYAMLError):
class SimpleKey:
# See below simple keys treatment.
- def __init__(self, token_number, required, index, line, column, mark):
+ def __init__(self, token_number, required, index, line, column, mark=None,
+ inline=None):
self.token_number = token_number
self.required = required
self.index = index
self.line = line
self.column = column
self.mark = mark
+ self.inline = inline
class Scanner:
@@ -81,6 +83,10 @@ class Scanner:
# Past indentation levels.
self.indents = []
+ # Used for providing style information to the parser.
+ self.current_line = self.previous_line = self.reader.line
+ self.current_column = self.previus_column = self.reader.column
+
# Variables related to simple keys treatment.
# A simple key is a key that is not denoted by the '?' indicator.
@@ -321,8 +327,9 @@ class Scanner:
line = self.reader.line
column = self.reader.column
mark = self.reader.get_mark()
+ inline = (self.current_line == self.previous_line)
key = SimpleKey(token_number, required,
- index, line, column, mark)
+ index, line, column, mark, inline)
self.possible_simple_keys[self.flow_level] = key
def remove_possible_simple_key(self):
@@ -380,8 +387,8 @@ class Scanner:
mark = self.reader.get_mark()
# Add STREAM-END.
- self.tokens.append(StreamStartToken(mark, mark))
-
+ self.tokens.append(StreamStartToken(mark, mark,
+ encoding=self.reader.encoding))
def fetch_stream_end(self):
@@ -509,7 +516,8 @@ class Scanner:
# We may need to add BLOCK-SEQUENCE-START.
if self.add_indent(self.reader.column):
mark = self.reader.get_mark()
- self.tokens.append(BlockSequenceStartToken(mark, mark))
+ inline = (self.current_line == self.previous_line)
+ self.tokens.append(BlockSequenceStartToken(mark, mark, inline))
# It's an error for the block entry to occur in the flow context,
# but we let the parser detect this.
@@ -542,7 +550,8 @@ class Scanner:
# We may need to add BLOCK-MAPPING-START.
if self.add_indent(self.reader.column):
mark = self.reader.get_mark()
- self.tokens.append(BlockMappingStartToken(mark, mark))
+ inline = (self.current_line == self.previous_line)
+ self.tokens.append(BlockMappingStartToken(mark, mark, inline))
# Simple keys are allowed after '?' in the block context.
self.allow_simple_key = not self.flow_level
@@ -572,7 +581,8 @@ class Scanner:
if not self.flow_level:
if self.add_indent(key.column):
self.tokens.insert(key.token_number-self.tokens_taken,
- BlockMappingStartToken(key.mark, key.mark))
+ BlockMappingStartToken(key.mark, key.mark,
+ key.inline))
# There cannot be two simple keys one after another.
self.allow_simple_key = False
@@ -791,6 +801,11 @@ class Scanner:
else:
found = True
+ self.previous_line = self.current_line
+ self.previous_column = self.current_column
+ self.current_line = self.reader.line
+ self.current_column = self.reader.column
+
def scan_directive(self):
# See the specification for details.
start_mark = self.reader.get_mark()
@@ -1053,7 +1068,12 @@ class Scanner:
chunks.extend(breaks)
# We are done.
- return ScalarToken(u''.join(chunks), False, start_mark, end_mark)
+ if folded:
+ style = '>'
+ else:
+ style = '|'
+ return ScalarToken(u''.join(chunks), False, start_mark, end_mark,
+ style)
def scan_block_scalar_indicators(self, start_mark):
# See the specification for details.
@@ -1154,7 +1174,12 @@ class Scanner:
chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark))
self.reader.forward()
end_mark = self.reader.get_mark()
- return ScalarToken(u''.join(chunks), False, start_mark, end_mark)
+ if double:
+ style = '"'
+ else:
+ style = '\''
+ return ScalarToken(u''.join(chunks), False, start_mark, end_mark,
+ style)
ESCAPE_REPLACEMENTS = {
u'0': u'\0',
@@ -1305,7 +1330,7 @@ class Scanner:
if not spaces or self.reader.peek() == u'#' \
or (not self.flow_level and self.reader.column < indent):
break
- return ScalarToken(u''.join(chunks), True, start_mark, end_mark)
+ return ScalarToken(u''.join(chunks), True, start_mark, end_mark, '')
def scan_plain_spaces(self, indent, start_mark):
# See the specification for details.