Skip to main content

css_ast/functions/
font_feature_functions.rs

1use super::prelude::*;
2use crate::{CustomIdent, Value};
3
4/// <https://drafts.csswg.org/css-fonts-5/#font-variant-alternates-prop>
5///
6/// ```text,ignore
7/// stylistic() = stylistic( <font-feature-value-name> )
8/// ```
9#[node]
10#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
11#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
12#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
13#[derive(csskit_derives::NodeWithMetadata)]
14pub struct StylisticFunction<'a> {
15	#[atom(CssAtomSet::Stylistic)]
16	pub name: T![Function],
17	pub params: Value<'a, CustomIdent>,
18	#[semantic_eq(skip)]
19	pub close: T![')'],
20}
21
22/// <https://drafts.csswg.org/css-fonts-5/#font-variant-alternates-prop>
23///
24/// ```text,ignore
25/// styleset() = styleset( <font-feature-value-name># )
26/// ```
27#[node]
28#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
29#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
30#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
31#[derive(csskit_derives::NodeWithMetadata)]
32pub struct StylesetFunction<'a> {
33	#[atom(CssAtomSet::Styleset)]
34	pub name: T![Function],
35	pub params: CommaSeparated<'a, Value<'a, CustomIdent>>,
36	#[semantic_eq(skip)]
37	pub close: T![')'],
38}
39
40/// <https://drafts.csswg.org/css-fonts-5/#font-variant-alternates-prop>
41///
42/// ```text,ignore
43/// character-variant() = character-variant( <font-feature-value-name># )
44/// ```
45#[node]
46#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
47#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
48#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
49#[derive(csskit_derives::NodeWithMetadata)]
50pub struct CharacterVariantFunction<'a> {
51	#[atom(CssAtomSet::CharacterVariant)]
52	pub name: T![Function],
53	pub params: CommaSeparated<'a, Value<'a, CustomIdent>>,
54	#[semantic_eq(skip)]
55	pub close: T![')'],
56}
57
58/// <https://drafts.csswg.org/css-fonts-5/#font-variant-alternates-prop>
59///
60/// ```text,ignore
61/// swash() = swash( <font-feature-value-name> )
62/// ```
63#[node]
64#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
65#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
66#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
67#[derive(csskit_derives::NodeWithMetadata)]
68pub struct SwashFunction<'a> {
69	#[atom(CssAtomSet::Swash)]
70	pub name: T![Function],
71	pub params: Value<'a, CustomIdent>,
72	#[semantic_eq(skip)]
73	pub close: T![')'],
74}
75
76/// <https://drafts.csswg.org/css-fonts-5/#font-variant-alternates-prop>
77///
78/// ```text,ignore
79/// ornaments() = ornaments( <font-feature-value-name> )
80/// ```
81#[node]
82#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
83#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
84#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
85#[derive(csskit_derives::NodeWithMetadata)]
86pub struct OrnamentsFunction<'a> {
87	#[atom(CssAtomSet::Ornaments)]
88	pub name: T![Function],
89	pub params: Value<'a, CustomIdent>,
90	#[semantic_eq(skip)]
91	pub close: T![')'],
92}
93
94/// <https://drafts.csswg.org/css-fonts-5/#font-variant-alternates-prop>
95///
96/// ```text,ignore
97/// annotation() = annotation( <font-feature-value-name> )
98/// ```
99#[node]
100#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
101#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
102#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
103#[derive(csskit_derives::NodeWithMetadata)]
104pub struct AnnotationFunction<'a> {
105	#[atom(CssAtomSet::Annotation)]
106	pub name: T![Function],
107	pub params: Value<'a, CustomIdent>,
108	#[semantic_eq(skip)]
109	pub close: T![')'],
110}
111
112#[cfg(test)]
113mod tests {
114	use super::*;
115	use crate::CssAtomSet;
116	use css_parse::{assert_parse, assert_parse_error};
117
118	#[test]
119	fn test_writes() {
120		assert_parse!(CssAtomSet::ATOMS, StylisticFunction, "stylistic(foo)");
121		assert_parse!(CssAtomSet::ATOMS, SwashFunction, "swash(fancy)");
122		assert_parse!(CssAtomSet::ATOMS, OrnamentsFunction, "ornaments(bullets)");
123		assert_parse!(CssAtomSet::ATOMS, AnnotationFunction, "annotation(circled)");
124		assert_parse!(CssAtomSet::ATOMS, StylesetFunction, "styleset(foo)");
125		assert_parse!(CssAtomSet::ATOMS, StylesetFunction, "styleset(foo,bar)");
126		assert_parse!(CssAtomSet::ATOMS, CharacterVariantFunction, "character-variant(foo,bar)");
127	}
128
129	#[test]
130	fn test_errors() {
131		assert_parse_error!(CssAtomSet::ATOMS, StylisticFunction, "stylistic()");
132		assert_parse_error!(CssAtomSet::ATOMS, StylisticFunction, "stylistic(foo,bar)");
133		assert_parse_error!(CssAtomSet::ATOMS, SwashFunction, "swash(1)");
134		assert_parse_error!(CssAtomSet::ATOMS, StylesetFunction, "styleset()");
135	}
136}