diff --git a/brood/src/commands/reexport.rs b/brood/src/commands/reexport.rs index 18d56a6..1125fb0 100644 --- a/brood/src/commands/reexport.rs +++ b/brood/src/commands/reexport.rs @@ -2,16 +2,44 @@ use std::fs::File; use std::io::{self, BufReader, BufWriter}; use std::path::Path; +use crate::data::adjacency_list::AdjacencyList; use crate::data::store; -pub fn reexport(from: &Path, to: &Path) -> io::Result<()> { +pub fn reexport( + from: &Path, + to: &Path, + in_parens: Option, + in_structure: Option, +) -> io::Result<()> { eprintln!(">> Import"); let mut from = BufReader::new(File::open(from)?); - let data = store::read_adjacency_list(&mut from)?; + let mut data = store::read_adjacency_list(&mut from)?; eprintln!(">> Consistency check"); data.check_consistency(); + if in_parens.is_some() || in_structure.is_some() { + eprintln!(">> Filtering"); + + let mut data2 = AdjacencyList::default(); + for (page_idx, page) in data.pages() { + data2.push_page(page.data.clone()); + for (_, link) in data.links(page_idx) { + if in_parens.is_some_and(|v| v != link.data.in_parens()) { + continue; + } + + if in_structure.is_some_and(|v| v != link.data.in_structure()) { + continue; + } + + data2.push_link(link.to, link.data); + } + } + + data = data2; + } + eprintln!(">> Export"); let mut to = BufWriter::new(File::create(to)?); store::write_adjacency_list(&data, &mut to)?; diff --git a/brood/src/main.rs b/brood/src/main.rs index d97d617..0e74645 100644 --- a/brood/src/main.rs +++ b/brood/src/main.rs @@ -12,7 +12,13 @@ enum Command { /// Read sift data on stdin and output brood data. Ingest, /// Read and reexport brood data. - Reexport { to: PathBuf }, + Reexport { + to: PathBuf, + #[arg(long, short = 'P')] + in_parens: Option, + #[arg(long, short = 'S')] + in_structure: Option, + }, /// Find a path from one article to another. Path { from: String, @@ -38,7 +44,11 @@ fn main() -> io::Result<()> { let args = Args::parse(); match args.command { Command::Ingest => commands::ingest::ingest(&args.datafile), - Command::Reexport { to } => commands::reexport::reexport(&args.datafile, &to), + Command::Reexport { + to, + in_parens, + in_structure, + } => commands::reexport::reexport(&args.datafile, &to, in_parens, in_structure), Command::Path { from, to, flip } => { if flip { commands::path::path(&args.datafile, &to, &from)