ruwex 0.1.0

Fast Rust rewrite of wikiextractor: extract and clean text from Wikimedia XML dumps
Documentation
//! Drop-in replacement for wikiextractor's `extractPage` command:
//! extracts a single page (raw XML) from a Wikipedia dump file.

use std::fs::File;
use std::io::{self, BufRead, BufReader, Write};

use anyhow::Context;
use bzip2::read::MultiBzDecoder;
use clap::Parser;

use ruwex::tools::extract_page::extract_page;

#[derive(Parser, Debug)]
#[command(
    name = "extractPage",
    about = "Wikipedia Page Extractor: extracts a single page from a Wikipedia dump file.",
    disable_version_flag = true
)]
struct Args {
    /// XML wiki dump file
    input: Option<String>,

    /// article number
    #[arg(long, default_value = "1")]
    id: String,

    /// whether article is a template
    #[arg(long)]
    template: bool,

    /// print program version
    #[arg(short = 'v', long = "version")]
    version: bool,
}

fn main() {
    if let Err(error) = run() {
        eprintln!("error: {error:#}");
        std::process::exit(1);
    }
}

fn run() -> anyhow::Result<()> {
    let args = Args::parse();
    if args.version {
        println!("extractPage {} (ruwex)", env!("CARGO_PKG_VERSION"));
        return Ok(());
    }
    let input = args
        .input
        .context("the following arguments are required: input")?;

    let file = File::open(&input).with_context(|| format!("cannot open {input}"))?;
    let reader: Box<dyn BufRead> = if input.to_lowercase().ends_with(".bz2") {
        Box::new(BufReader::new(MultiBzDecoder::new(BufReader::new(file))))
    } else {
        Box::new(BufReader::new(file))
    };

    let stdout = io::stdout();
    let mut out = io::BufWriter::new(stdout.lock());
    extract_page(reader, &mut out, &args.id, args.template)?;
    out.flush()?;
    Ok(())
}