malva/doc_gen/at_rule/
mod.rs

1use super::{super::DocGen, helpers};
2use crate::{ctx::Ctx, state::State};
3use raffia::{Spanned, ast::*};
4use tiny_pretty::Doc;
5
6mod color_profile;
7mod container;
8mod custom_media;
9mod custom_selector;
10mod document;
11mod font_feature_values;
12mod import;
13mod keyframes;
14mod layer;
15mod media;
16mod namespace;
17mod page;
18mod scope;
19mod supports;
20
21impl<'s> DocGen<'s> for AtRule<'s> {
22    fn doc(&self, ctx: &Ctx<'_, 's>, state: &State) -> Doc<'s> {
23        let mut docs = Vec::with_capacity(5);
24        let mut pos = self.name.span.end;
25
26        docs.push(Doc::text(format!(
27            "@{}",
28            self.name.raw.to_ascii_lowercase()
29        )));
30
31        if let Some(prelude) = &self.prelude {
32            docs.push(Doc::space());
33            let span = prelude.span();
34            docs.extend(ctx.end_spaced_comments(ctx.get_comments_between(pos, span.start)));
35            docs.push(prelude.doc(ctx, state));
36            pos = span.end;
37        }
38
39        if let Some(block) = &self.block {
40            docs.push(helpers::format_space_before_block(
41                pos,
42                block.span.start,
43                ctx,
44            ));
45            docs.push(block.doc(ctx, state));
46        }
47
48        Doc::list(docs)
49    }
50}
51
52impl<'s> DocGen<'s> for AtRulePrelude<'s> {
53    fn doc(&self, ctx: &Ctx<'_, 's>, state: &State) -> Doc<'s> {
54        match self {
55            AtRulePrelude::Media(media) => media.doc(ctx, state),
56            AtRulePrelude::Charset(charset) => Doc::text(charset.raw),
57            AtRulePrelude::ColorProfile(color_profile) => color_profile.doc(ctx, state),
58            AtRulePrelude::Container(container) => container.doc(ctx, state),
59            AtRulePrelude::CounterStyle(counter_style) => counter_style.doc(ctx, state),
60            AtRulePrelude::CustomMedia(custom_media) => custom_media.doc(ctx, state),
61            AtRulePrelude::CustomSelector(custom_selector) => custom_selector.doc(ctx, state),
62            AtRulePrelude::Document(document) => document.doc(ctx, state),
63            AtRulePrelude::FontFeatureValues(font_feature_values) => {
64                font_feature_values.doc(ctx, state)
65            }
66            AtRulePrelude::FontPaletteValues(font_palette_values) => {
67                font_palette_values.doc(ctx, state)
68            }
69            AtRulePrelude::Import(import) => import.doc(ctx, state),
70            AtRulePrelude::Keyframes(keyframes) => keyframes.doc(ctx, state),
71            AtRulePrelude::Layer(layer) => layer.doc(ctx, state),
72            AtRulePrelude::LessImport(less_import) => less_import.doc(ctx, state),
73            AtRulePrelude::LessPlugin(less_plugin) => less_plugin.doc(ctx, state),
74            AtRulePrelude::Namespace(namespace) => namespace.doc(ctx, state),
75            AtRulePrelude::Nest(nest) => nest.doc(ctx, state).group().nest(ctx.indent_width),
76            AtRulePrelude::Page(page) => page.doc(ctx, state),
77            AtRulePrelude::PositionTry(position_try) => position_try.doc(ctx, state),
78            AtRulePrelude::Property(property) => property.doc(ctx, state),
79            AtRulePrelude::SassAtRoot(sass_at_root) => sass_at_root.doc(ctx, state),
80            AtRulePrelude::SassContent(sass_content) => sass_content.doc(ctx, state),
81            AtRulePrelude::SassEach(sass_each) => sass_each.doc(ctx, state),
82            AtRulePrelude::SassExpr(sass_expr) => sass_expr.doc(ctx, state),
83            AtRulePrelude::SassExtend(sass_extend) => sass_extend.doc(ctx, state),
84            AtRulePrelude::SassFor(sass_for) => sass_for.doc(ctx, state),
85            AtRulePrelude::SassForward(sass_forward) => sass_forward.doc(ctx, state),
86            AtRulePrelude::SassFunction(sass_function) => sass_function.doc(ctx, state),
87            AtRulePrelude::SassImport(sass_import) => sass_import.doc(ctx, state),
88            AtRulePrelude::SassInclude(sass_include) => sass_include.doc(ctx, state),
89            AtRulePrelude::SassMixin(sass_mixin) => sass_mixin.doc(ctx, state),
90            AtRulePrelude::SassUse(sass_use) => sass_use.doc(ctx, state),
91            AtRulePrelude::Scope(scope) => scope.doc(ctx, state),
92            AtRulePrelude::ScrollTimeline(scroll_timeline) => scroll_timeline.doc(ctx, state),
93            AtRulePrelude::Supports(supports) => supports.doc(ctx, state),
94            AtRulePrelude::Unknown(unknown) => unknown.doc(ctx, state),
95        }
96    }
97}
98
99impl<'s> DocGen<'s> for UnknownAtRulePrelude<'s> {
100    fn doc(&self, ctx: &Ctx<'_, 's>, state: &State) -> Doc<'s> {
101        match self {
102            UnknownAtRulePrelude::ComponentValue(component_value) => {
103                component_value.doc(ctx, state)
104            }
105            UnknownAtRulePrelude::TokenSeq(token_seq) => {
106                token_seq.doc(ctx, state).nest(ctx.indent_width)
107            }
108        }
109    }
110}