Skip to content

Commit 8d1e90c

Browse files
authored
Merge pull request #508 from kivikakk/push-muqwvlutrkol
Detect ending front matter delimiter at EOF
2 parents f403247 + 4b90053 commit 8d1e90c

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

src/strings.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,11 +299,16 @@ pub fn split_off_front_matter<'s>(mut s: &'s str, delimiter: &str) -> Option<(&'
299299
start += match s[start..]
300300
.find(&("\n".to_string() + delimiter + "\r\n"))
301301
.or_else(|| s[start..].find(&("\n".to_string() + delimiter + "\n")))
302+
.or_else(|| s[start..].find(&("\n".to_string() + delimiter))) // delimiter followed by EOF
302303
{
303304
Some(n) => n + 1 + delimiter.len(),
304305
None => return None,
305306
};
306307

308+
if start == s.len() {
309+
return Some((s, ""));
310+
}
311+
307312
start += if s[start..].starts_with('\n') {
308313
1
309314
} else if s[start..].starts_with("\r\n") {

src/tests/front_matter.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,3 +179,37 @@ fn second_line() {
179179

180180
assert!(found.is_none(), "no FrontMatter expected");
181181
}
182+
183+
#[test]
184+
fn fm_only_with_trailing_newline() {
185+
let input = "---\nfoo: bar\n---\n";
186+
187+
let mut options = Options::default();
188+
options.extension.front_matter_delimiter = Some("---".to_owned());
189+
let arena = Arena::new();
190+
let root = parse_document(&arena, input, &options);
191+
192+
let found = root
193+
.descendants()
194+
.filter(|n| matches!(n.data.borrow().value, NodeValue::FrontMatter(..)))
195+
.next();
196+
197+
assert!(found.is_some(), "front matter expected");
198+
}
199+
200+
#[test]
201+
fn fm_only_without_trailing_newline() {
202+
let input = "---\nfoo: bar\n---";
203+
204+
let mut options = Options::default();
205+
options.extension.front_matter_delimiter = Some("---".to_owned());
206+
let arena = Arena::new();
207+
let root = parse_document(&arena, input, &options);
208+
209+
let found = root
210+
.descendants()
211+
.filter(|n| matches!(n.data.borrow().value, NodeValue::FrontMatter(..)))
212+
.next();
213+
214+
assert!(found.is_some(), "front matter expected");
215+
}

0 commit comments

Comments
 (0)