filter sections via heading

This commit is contained in:
Andrei Stoica 2023-06-15 20:54:33 -04:00
parent 35d5467d03
commit 0dce3e8ab9
1 changed files with 39 additions and 5 deletions

View File

@ -3,11 +3,12 @@ mod todo_file;
use crate::todo_file::TodoFile; use crate::todo_file::TodoFile;
use chrono::naive::NaiveDate; use chrono::naive::NaiveDate;
use chrono::{Datelike, Local}; use chrono::{Datelike, Local};
use comrak::nodes::AstNode; use comrak::nodes::{AstNode, NodeValue};
use comrak::{ use comrak::{
format_commonmark, parse_document, Arena, ComrakExtensionOptions, ComrakOptions, format_commonmark, parse_document, Arena, ComrakExtensionOptions, ComrakOptions,
ComrakParseOptions, ComrakParseOptions,
}; };
use std::borrow::Borrow;
use std::env; use std::env;
use std::fs::{copy, read, read_dir, File}; use std::fs::{copy, read, read_dir, File};
use std::io::Write; use std::io::Write;
@ -45,12 +46,12 @@ fn main() {
let arena = Arena::new(); let arena = Arena::new();
let root = parse_todo_file(&latest_file, &arena); let root = parse_todo_file(&latest_file, &arena);
//copy(latest_file.file.path(), today_file_path.clone()).unwrap(); cleanup_sections(&root, &["Hello world!", "Hi there"], 2);
let mut new_doc = vec![];
format_commonmark(root, &ComrakOptions::default(), &mut new_doc);
let mut new_doc = vec![];
format_commonmark(root, &ComrakOptions::default(), &mut new_doc).unwrap();
let mut new_file = File::create(today_file_path.clone()).unwrap(); let mut new_file = File::create(today_file_path.clone()).unwrap();
new_file.write_all(&new_doc); new_file.write_all(&new_doc).unwrap();
editor editor
.args([today_file_path]) .args([today_file_path])
@ -86,6 +87,39 @@ fn parse_todo_file<'a>(file: &TodoFile, arena: &'a Arena<AstNode<'a>>) -> &'a As
parse_document(arena, str::from_utf8(&contents).unwrap(), options) parse_document(arena, str::from_utf8(&contents).unwrap(), options)
} }
fn cleanup_sections<'a>(
root: &'a AstNode<'a>,
sections: &[&str],
target_level: u8,
) -> &'a AstNode<'a> {
for node in root.children() {
match &node.data.borrow().value {
NodeValue::Heading(heading) if heading.level == target_level => {
if let NodeValue::Text(title) =
&node.first_child().borrow().unwrap().data.borrow().value
{
if !sections.contains(&title.as_str()) {
let level = heading.level;
let mut following = node.following_siblings();
following.next(); // Skip self
for node in following {
// remove everthing under this heading
match &node.data.borrow().value {
NodeValue::Heading(heading) if heading.level <= level => break,
_ => node.detach(),
}
}
node.detach(); // remove heading as well
};
};
}
_ => (),
}
}
root
}
fn get_editor(fallback: String) -> String { fn get_editor(fallback: String) -> String {
match env::var("EDITOR") { match env::var("EDITOR") {
Ok(editor) => editor, Ok(editor) => editor,