use anyhow::{anyhow, Context, Result};
use lightningcss::stylesheet::{ParserOptions, PrinterOptions, StyleSheet};
use std::fs;
use std::path::PathBuf;
pub fn create(source: PathBuf, output: PathBuf) -> Result<()> {
let source = transform(fs::read_to_string(source)?);
let stylesheet = StyleSheet::parse(&source, ParserOptions::default())
.map_err(|err| anyhow!("{err}"))
.with_context(|| "failed to parse stylesheet")?;
let css = stylesheet.to_css(PrinterOptions::default())?;
fs::write(output, css.code)?;
Ok(())
}
fn transform<C: AsRef<str>>(css: C) -> String {
let css = css.as_ref();
let mut result = String::with_capacity(css.len());
let mut dark_colors = String::from("\n\n[class~=manatsu-dark] {\n");
macro_rules! push {
($string:expr, $slice:expr) => {
$string.push_str($slice);
$string.push('\n');
};
}
let skip = [
"color-surface-tint",
];
'lines: for line in css.lines() {
if !line.contains("--md") {
push!(result, line);
continue;
}
for s in &skip {
if line.contains(s) {
continue 'lines;
}
}
if line.contains("--md-sys-color") {
let line = line.replace("md-sys", "m");
if line.contains("-light") {
let line = line.replace("-light", "");
push!(result, &line);
continue;
}
if line.contains("-dark") && !line.contains("fixed") {
let line = line.replace("-dark", "");
push!(dark_colors, &line);
continue;
}
}
}
dark_colors.push_str("}\n");
result.push_str(&dark_colors);
result.shrink_to_fit();
result
}