use crate::cursor::LineCursor;
use crate::cursor::indent_len;
use crate::parse::utils::build_text_block;
use crate::syntax::Parsed;
use crate::syntax::SyntaxElement;
use crate::syntax::SyntaxKind;
use crate::syntax::SyntaxNode;
use crate::text::TextRange;
fn build_content_range(cursor: &LineCursor, first: Option<usize>, last: usize) -> Option<TextRange> {
first.map(|f| {
let first_line = cursor.line_text(f);
let first_col = indent_len(first_line);
let last_line = cursor.line_text(last);
let last_col = indent_len(last_line) + last_line.trim().len();
cursor.make_range(f, first_col, last, last_col)
})
}
pub fn parse_plain(input: &str) -> Parsed {
let mut line_cursor = LineCursor::new(input);
let mut root_children: Vec<SyntaxElement> = Vec::new();
line_cursor.skip_blanks();
if line_cursor.is_eof() {
let mut root = SyntaxNode::new(SyntaxKind::DOCUMENT, line_cursor.full_range(), root_children);
crate::parse::trivia::attach_trivia(&mut root, input);
return Parsed::new(input.to_string(), root, crate::parse::Style::Plain);
}
let mut summary_done = false;
let mut summary_first: Option<usize> = None;
let mut summary_last: usize = 0;
let mut ext_first: Option<usize> = None;
let mut ext_last: usize = 0;
while !line_cursor.is_eof() {
if line_cursor.current_trimmed().is_empty() {
if !summary_done && summary_first.is_some() {
root_children.push(SyntaxElement::Node(build_text_block(
SyntaxKind::SUMMARY,
build_content_range(&line_cursor, summary_first, summary_last).unwrap(),
input,
)));
summary_done = true;
}
line_cursor.advance();
continue;
}
if !summary_done {
if summary_first.is_none() {
summary_first = Some(line_cursor.line);
}
summary_last = line_cursor.line;
} else {
if ext_first.is_none() {
ext_first = Some(line_cursor.line);
}
ext_last = line_cursor.line;
}
line_cursor.advance();
}
if !summary_done && summary_first.is_some() {
root_children.push(SyntaxElement::Node(build_text_block(
SyntaxKind::SUMMARY,
build_content_range(&line_cursor, summary_first, summary_last).unwrap(),
input,
)));
}
if ext_first.is_some() {
root_children.push(SyntaxElement::Node(build_text_block(
SyntaxKind::EXTENDED_SUMMARY,
build_content_range(&line_cursor, ext_first, ext_last).unwrap(),
input,
)));
}
let mut root = SyntaxNode::new(SyntaxKind::DOCUMENT, line_cursor.full_range(), root_children);
crate::parse::trivia::attach_trivia(&mut root, input);
Parsed::new(input.to_string(), root, crate::parse::Style::Plain)
}