omena-transform-passes 0.2.0

Transform pass registry and DAG planner for Omena CSS
Documentation
use omena_parser::{StyleDialect, lex};
use omena_syntax::SyntaxKind;

use crate::{
    domains::number::{
        parse_reducible_abs_value, parse_reducible_calc_value, parse_reducible_clamp_value,
        parse_reducible_exp_value, parse_reducible_hypot_value, parse_reducible_log_value,
        parse_reducible_max_value, parse_reducible_min_value, parse_reducible_mod_value,
        parse_reducible_pow_value, parse_reducible_rem_value, parse_reducible_round_value,
        parse_reducible_sign_value, parse_reducible_sqrt_value,
    },
    helpers::{
        declarations::{
            collect_simple_declarations_in_block, format_replacement_declaration_like_source,
        },
        source_rewrite::replace_source_ranges,
        tokens::matching_right_brace_index,
        values::substitute_static_css_function_references_in_value_until_stable,
    },
};

pub(crate) fn reduce_css_calc_with_lexer(source: &str, dialect: StyleDialect) -> (String, usize) {
    let lexed = lex(source, dialect);
    let tokens = lexed.tokens();
    let mut replacements = Vec::new();
    let mut index = 0;

    while index < tokens.len() {
        if tokens[index].kind == SyntaxKind::LeftBrace
            && let Some(close_index) = matching_right_brace_index(tokens, index)
        {
            let declarations = collect_simple_declarations_in_block(tokens, index, close_index);
            for declaration in declarations {
                let Some(replacement_value) =
                    substitute_static_css_function_references_in_value_until_stable(
                        &declaration.value,
                        &[
                            ("calc", parse_reducible_calc_value),
                            ("min", parse_reducible_min_value),
                            ("max", parse_reducible_max_value),
                            ("clamp", parse_reducible_clamp_value),
                            ("abs", parse_reducible_abs_value),
                            ("sign", parse_reducible_sign_value),
                            ("round", parse_reducible_round_value),
                            ("mod", parse_reducible_mod_value),
                            ("rem", parse_reducible_rem_value),
                            ("hypot", parse_reducible_hypot_value),
                            ("sqrt", parse_reducible_sqrt_value),
                            ("pow", parse_reducible_pow_value),
                            ("exp", parse_reducible_exp_value),
                            ("log", parse_reducible_log_value),
                        ],
                    )
                else {
                    continue;
                };
                replacements.push((
                    declaration.start,
                    declaration.end,
                    format_replacement_declaration_like_source(
                        source,
                        &declaration,
                        &replacement_value,
                    ),
                ));
            }
            index += 1;
            continue;
        }
        index += 1;
    }

    replace_source_ranges(source, &replacements)
}