diff --git a/src/lib.rs b/src/lib.rs index a3edc39..5f10aed 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,6 +7,33 @@ pub mod mediawiki; pub mod template; use std::env; +use std::error::Error; +use std::io::{Read, Write}; +use std::process::{Command, ExitStatus, Stdio}; + +fn pipe( + program: &str, args: &mut [&str], input: String, +) -> Result<(String, String, ExitStatus), Box> { + let mut cmd = Command::new(program) + .args(args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn()?; + if let Some(mut stdin) = cmd.stdin.take() { + stdin.write_all(input.as_bytes())?; + } + let mut output = String::new(); + if let Some(mut stdout) = cmd.stdout.take() { + stdout.read_to_string(&mut output)?; + } + let mut errmsg = String::new(); + if let Some(mut stderr) = cmd.stderr.take() { + stderr.read_to_string(&mut errmsg)?; + } + let status = cmd.wait()?; + Ok((output, errmsg, status)) +} /// Checks environment variable `DRY_RUN` to see if any external operations /// should *actually* be done. diff --git a/src/mediawiki.rs b/src/mediawiki.rs index c780443..37df128 100644 --- a/src/mediawiki.rs +++ b/src/mediawiki.rs @@ -1,8 +1,5 @@ use std::cell::OnceCell; use std::error::Error; -use std::fs::File; -use std::io::{Read, Write}; -use std::process::{Command, Output, Stdio}; use colored::Colorize; use reqwest::blocking::Client; @@ -10,6 +7,7 @@ use serde::Deserialize; use serde_json::json; use crate::config_spec::{CfgField, CfgGroup}; +use crate::{trace_var, verboseln}; pub const CONFIG: CfgGroup<'static> = CfgGroup { name: "wiki", @@ -204,7 +202,7 @@ impl Mediawiki { pub fn update_plenum_page (&self, new_page_title_to_link_to: &str) -> Result<(), Box> { // 1. Download Plenum page content let page_content = self.get_page_content(&self.plenum_main_page_name)?; - println!("---\nPage Content: {}\n---", page_content.red()); + trace_var!(page_content); let current_year = "2024"; // TODO: Datumslogik einbauen let year_section = format!("=== {} ===\n", current_year); if page_content.contains(&year_section) { @@ -265,16 +263,16 @@ impl Mediawiki { pub fn pad_ins_wiki(old_pad_content: String, wiki: &Mediawiki) -> Result<(), Box> { // Login to Wiki and get required tokens for logging in and writing wiki.get_login_token()?; - eprintln!("AUTH Done"); + verboseln!("Login token acquired."); let login_result = wiki.login()?; - eprintln!("LOGIN Done"); + verboseln!("Login done."); + trace_var!(login_result); wiki.get_csrf_token()?; - eprintln!("CSRF Done"); - eprintln!("---LOGIN RESULT:---\n{:?}\n-----------", login_result); + verboseln!("CSRF token acquired."); // Convert to mediawiki and make new page - let pad_converted = convert_md_to_mediawiki(old_pad_content); - eprintln!("Das kommt ins Wiki: {}", pad_converted); + let pad_converted = pandoc_convert(old_pad_content)?; + trace_var!(pad_converted); let page_title = "Page Test 5"; let page_title = format!("{}/{}", wiki.plenum_main_page_name, page_title); // Example: Plenum/13._August_2024 wiki.new_wiki_page(&page_title, &pad_converted)?; @@ -282,65 +280,18 @@ pub fn pad_ins_wiki(old_pad_content: String, wiki: &Mediawiki) -> Result<(), Box Ok(()) } -/// Converts one file type into another using pandoc and saves the result as a txt file -fn pandoc_convert(old_pad_content: String) -> Result> { - let mut cmd = Command::new("pandoc") - .args(["--from", "markdown", "--to", "mediawiki", "--no-highlight"]) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn()?; - if let Some(mut stdin) = cmd.stdin.take() { - stdin.write_all(old_pad_content.as_bytes())?; - } - let mut output = String::new(); - if let Some(mut stdout) = cmd.stdout.take() { - stdout.read_to_string(&mut output)?; - } - let mut errmsg = String::new(); - if let Some(mut stderr) = cmd.stderr.take() { - stderr.read_to_string(&mut errmsg)?; - } - let status = cmd.wait()?; +/// Takes a String in the Markdown format and returns a String in the mediawiki Format +fn pandoc_convert(markdown: String) -> Result> { + let (output, errors, status) = crate::pipe( + "pandoc", + &mut ["--from", "markdown", "--to", "mediawiki", "--no-highlight"], + markdown, + )?; if status.success() { Ok(output) } else { - Err( format!("Pandoc error, exit {:?}\n{}", status, errmsg).into() ) + Err(format!("Pandoc error, exit code {:?}\n{}", status, errors).into()) } - /* - //Convert Markdown into Mediawiki - // Vanilla pandoc Befehl: pandoc --from markdown --to mediawiki --no-highlight - let mut p = pandoc::new(); - p.set_input(pandoc::InputKind::Pipe(old_pad_content)); - p.set_input_format(input_format, vec![]); - p.set_output(pandoc::OutputKind::Pipe); // File(output_filepath.parse().unwrap())); - p.set_output_format(output_format, vec![]); - let output = p.execute()?; - Ok(output.into()) - */ -} - - -/// Reads a text file from a specified path and returns it as a String -fn read_txt_file(filepath: &str) -> String { - let mut file = File::open(filepath) - .unwrap_or_else(|_| panic!("Fehler beim öffnen der Textdatei mit Pfad {filepath}!")); - let mut contents = String::new(); - file.read_to_string(&mut contents) - .expect("Fehler beim auslesen der MediaWiki-Textdatei!"); - contents -} - -/// Takes a Sting in the Markdown format and returns a String in the mediawiki Format -fn convert_md_to_mediawiki(old_pad_content: String) -> String { - // TODO: use tempfile="3.3", make it a NamedTempFile::new()?; - // or alternatively use piped stdout to avoid files entirely - let output_filepath: &str = "./pandoc_mediawiki.txt"; - pandoc_convert(old_pad_content) - .expect("Fehler beim Umwandeln des und speichern des Pads in eine mediawiki-Textdatei"); - let temp = read_txt_file(output_filepath); - println!("TEMP: {}", temp.purple()); - temp } /*