Fix issue with deeply indented block scalars.

Fixes #2
This commit is contained in:
Ethiraric 2024-07-14 16:57:26 +02:00
parent 750c992121
commit 11cffc6df8
2 changed files with 31 additions and 1 deletions

View file

@ -1853,7 +1853,10 @@ impl<T: Iterator<Item = char>> Scanner<T> {
while !self.buffer.is_empty() && self.mark.col < indent && self.ch() == ' ' { while !self.buffer.is_empty() && self.mark.col < indent && self.ch() == ' ' {
self.skip_blank(); self.skip_blank();
} }
if !(!self.buffer.is_empty() && self.mark.col < indent && self.ch() == ' ') { // If we reached our indent, we can break. We must also break if we have
// reached content or EOF; that is, the buffer is not empty and the next
// character is not a space.
if self.mark.col == indent || (!self.buffer.is_empty() && self.ch() != ' ') {
break; break;
} }
} }

View file

@ -201,6 +201,33 @@ foobar";
] ]
); );
} }
#[test]
fn test_large_block_scalar_indent() {
// https://github.com/Ethiraric/yaml-rust2/issues/29
// https://github.com/saphyr-rs/saphyr-parser/issues/2
// Tests the `loop` fallback of `skip_block_scalar_indent`. The indent in the YAML string must
// be greater than `BUFFER_LEN - 2`. The second line is further indented with spaces, and the
// resulting string should be "a\n b".
let s = "
a: |-
a
b
";
assert_eq!(
run_parser(s).unwrap(),
[
Event::StreamStart,
Event::DocumentStart,
Event::MappingStart(0, None),
Event::Scalar("a".to_string(), TScalarStyle::Plain, 0, None),
Event::Scalar("a\n b".to_string(), TScalarStyle::Literal, 0, None),
Event::MappingEnd,
Event::DocumentEnd,
Event::StreamEnd,
]
);
}
#[test] #[test]
fn test_bad_docstart() { fn test_bad_docstart() {