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}