malva 0.16.0

Configurable, smart and fast CSS, SCSS, Sass and Less formatter.
Documentation
use super::{super::DocGen, helpers};
use crate::{ctx::Ctx, state::State};
use raffia::{Spanned, ast::*};
use tiny_pretty::Doc;

mod color_profile;
mod container;
mod custom_media;
mod custom_selector;
mod document;
mod font_feature_values;
mod import;
mod keyframes;
mod layer;
mod media;
mod namespace;
mod page;
mod scope;
mod supports;

impl<'a, 's: 'a> DocGen<'a, 's> for AtRule<'s> {
    fn doc(&self, ctx: &Ctx<'a, 's>, state: &State) -> Doc<'s> {
        let mut docs = Vec::with_capacity(5);
        let mut pos = self.name.span.end;

        docs.push(Doc::text(format!(
            "@{}",
            self.name.raw.to_ascii_lowercase()
        )));

        if let Some(prelude) = &self.prelude {
            docs.push(Doc::space());
            let span = prelude.span();
            docs.extend(ctx.end_spaced_comments(ctx.get_comments_between(pos, span.start)));
            docs.push(prelude.doc(ctx, state));
            pos = span.end;
        }

        if let Some(block) = &self.block {
            docs.push(helpers::format_space_before_block(
                pos,
                block.span.start,
                ctx,
            ));
            docs.push(block.doc(ctx, state));
        }

        Doc::list(docs)
    }
}

impl<'a, 's: 'a> DocGen<'a, 's> for AtRulePrelude<'s> {
    fn doc(&self, ctx: &Ctx<'a, 's>, state: &State) -> Doc<'s> {
        match self {
            AtRulePrelude::Media(media) => media.doc(ctx, state),
            AtRulePrelude::Charset(charset) => Doc::text(charset.raw),
            AtRulePrelude::ColorProfile(color_profile) => color_profile.doc(ctx, state),
            AtRulePrelude::Container(container) => container.doc(ctx, state),
            AtRulePrelude::CounterStyle(counter_style) => counter_style.doc(ctx, state),
            AtRulePrelude::CustomMedia(custom_media) => custom_media.doc(ctx, state),
            AtRulePrelude::CustomSelector(custom_selector) => custom_selector.doc(ctx, state),
            AtRulePrelude::Document(document) => document.doc(ctx, state),
            AtRulePrelude::FontFeatureValues(font_feature_values) => {
                font_feature_values.doc(ctx, state)
            }
            AtRulePrelude::FontPaletteValues(font_palette_values) => {
                font_palette_values.doc(ctx, state)
            }
            AtRulePrelude::Import(import) => import.doc(ctx, state),
            AtRulePrelude::Keyframes(keyframes) => keyframes.doc(ctx, state),
            AtRulePrelude::Layer(layer) => layer.doc(ctx, state),
            AtRulePrelude::LessImport(less_import) => less_import.doc(ctx, state),
            AtRulePrelude::LessPlugin(less_plugin) => less_plugin.doc(ctx, state),
            AtRulePrelude::Namespace(namespace) => namespace.doc(ctx, state),
            AtRulePrelude::Nest(nest) => nest.doc(ctx, state).group().nest(ctx.indent_width),
            AtRulePrelude::Page(page) => page.doc(ctx, state),
            AtRulePrelude::PositionTry(position_try) => position_try.doc(ctx, state),
            AtRulePrelude::Property(property) => property.doc(ctx, state),
            AtRulePrelude::SassAtRoot(sass_at_root) => sass_at_root.doc(ctx, state),
            AtRulePrelude::SassContent(sass_content) => sass_content.doc(ctx, state),
            AtRulePrelude::SassEach(sass_each) => sass_each.doc(ctx, state),
            AtRulePrelude::SassExpr(sass_expr) => sass_expr.doc(ctx, state),
            AtRulePrelude::SassExtend(sass_extend) => sass_extend.doc(ctx, state),
            AtRulePrelude::SassFor(sass_for) => sass_for.doc(ctx, state),
            AtRulePrelude::SassForward(sass_forward) => sass_forward.doc(ctx, state),
            AtRulePrelude::SassFunction(sass_function) => sass_function.doc(ctx, state),
            AtRulePrelude::SassImport(sass_import) => sass_import.doc(ctx, state),
            AtRulePrelude::SassInclude(sass_include) => sass_include.doc(ctx, state),
            AtRulePrelude::SassMixin(sass_mixin) => sass_mixin.doc(ctx, state),
            AtRulePrelude::SassUse(sass_use) => sass_use.doc(ctx, state),
            AtRulePrelude::Scope(scope) => scope.doc(ctx, state),
            AtRulePrelude::ScrollTimeline(scroll_timeline) => scroll_timeline.doc(ctx, state),
            AtRulePrelude::Supports(supports) => supports.doc(ctx, state),
            AtRulePrelude::Unknown(unknown) => unknown.doc(ctx, state),
        }
    }
}

impl<'a, 's: 'a> DocGen<'a, 's> for UnknownAtRulePrelude<'s> {
    fn doc(&self, ctx: &Ctx<'a, 's>, state: &State) -> Doc<'s> {
        match self {
            UnknownAtRulePrelude::ComponentValue(component_value) => {
                component_value.doc(ctx, state)
            }
            UnknownAtRulePrelude::TokenSeq(token_seq) => {
                token_seq.doc(ctx, state).nest(ctx.indent_width)
            }
        }
    }
}