Skip to main content

css_ast/selector/
moz.rs

1use super::prelude::*;
2
3use crate::DirValue;
4use css_parse::syntax::CommaSeparated;
5
6pseudo_element!(
7	/// https://developer.mozilla.org/en-US/docs/Web/CSS/Mozilla_Extensions#pseudo-elements_and_pseudo-classes
8	#[node]
9	#[derive(ToCursors, ToSpan, SemanticEq, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
10	#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
11	#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
12#[derive(csskit_derives::NodeWithMetadata)]
13	pub enum MozPseudoElement {
14		AnonymousBlock: CssAtomSet::_MozAnonymousBlock,
15		AnonymousItem: CssAtomSet::_MozAnonymousItem,
16		AnonymousPositionedBlock: CssAtomSet::_MozAnonymousPositionedBlock,
17		BlockInsideInlineWrapper: CssAtomSet::_MozBlockInsideInlineWrapper,
18		BlockRubyContent: CssAtomSet::_MozBlockRubyContent,
19		ButtonContent: CssAtomSet::_MozButtonContent,
20		Canvas: CssAtomSet::_MozCanvas,
21		CellContent: CssAtomSet::_MozCellContent,
22		ColorSwatch: CssAtomSet::_MozColorSwatch,
23		ColumnContent: CssAtomSet::_MozColumnContent,
24		ColumnSet: CssAtomSet::_MozColumnSet,
25		ColumnSpanWrapper: CssAtomSet::_MozColumnSpanWrapper,
26		DropdownList: CssAtomSet::_MozDropdownList,
27		FieldsetContent: CssAtomSet::_MozFieldsetContent,
28		FileContent: CssAtomSet::_MozFileContent,
29		FirstLetterContinuation: CssAtomSet::_MozFirstLetterContinuation,
30		FocusInner: CssAtomSet::_MozFocusInner,
31		FocusOuter: CssAtomSet::_MozFocusOuter,
32		FramesetBlank: CssAtomSet::_MozFramesetBlank,
33		HframesetBorder: CssAtomSet::_MozHframesetBorder,
34		HtmlCanvasContent: CssAtomSet::_MozHtmlCanvasContent,
35		InlineTable: CssAtomSet::_MozInlineTable,
36		LineFrame: CssAtomSet::_MozLineFrame,
37		ListBullet: CssAtomSet::_MozListBullet,
38		ListNumber: CssAtomSet::_MozListNumber,
39		MathmlAnonymousBlock: CssAtomSet::_MozMathmlAnonymousBlock,
40		MeterBar: CssAtomSet::_MozMeterBar,
41		NumberSpinBox: CssAtomSet::_MozNumberSpinBox,
42		NumberSpinDown: CssAtomSet::_MozNumberSpinDown,
43		NumberSpinUp: CssAtomSet::_MozNumberSpinUp,
44		OofPlaceholder: CssAtomSet::_MozOofPlaceholder,
45		Page: CssAtomSet::_MozPage,
46		PageBreak: CssAtomSet::_MozPageBreak,
47		PageContent: CssAtomSet::_MozPageContent,
48		PageSequence: CssAtomSet::_MozPageSequence,
49		Pagebreak: CssAtomSet::_MozPagebreak,
50		Pagecontent: CssAtomSet::_MozPagecontent,
51		Placeholder: CssAtomSet::_MozPlaceholder,
52		PrintedSheet: CssAtomSet::_MozPrintedSheet,
53		ProgressBar: CssAtomSet::_MozProgressBar,
54		RangeProgress: CssAtomSet::_MozRangeProgress,
55		RangeThumb: CssAtomSet::_MozRangeThumb,
56		RangeTrack: CssAtomSet::_MozRangeTrack,
57		Reveal: CssAtomSet::_MozReveal,
58		Ruby: CssAtomSet::_MozRuby,
59		RubyBase: CssAtomSet::_MozRubyBase,
60		RubyBaseContainer: CssAtomSet::_MozRubyBaseContainer,
61		RubyText: CssAtomSet::_MozRubyText,
62		RubyTextContainer: CssAtomSet::_MozRubyTextContainer,
63		ScrolledCanvas: CssAtomSet::_MozScrolledCanvas,
64		ScrolledContent: CssAtomSet::_MozScrolledContent,
65		ScrolledPageSequence: CssAtomSet::_MozScrolledPageSequence,
66		SearchClearButton: CssAtomSet::_MozSearchClearButton,
67		SelectContent: CssAtomSet::_MozSelectContent,
68		Selection: CssAtomSet::_MozSelection,
69		SnapshotContainingBlock: CssAtomSet::_MozSnapshotContainingBlock,
70		SvgForeignContent: CssAtomSet::_MozSvgForeignContent,
71		SvgMarkerAnonChild: CssAtomSet::_MozSvgMarkerAnonChild,
72		SvgOuterSvgAnonChild: CssAtomSet::_MozSvgOuterSvgAnonChild,
73		SvgText: CssAtomSet::_MozSvgText,
74		Table: CssAtomSet::_MozTable,
75		TableCell: CssAtomSet::_MozTableCell,
76		TableColumn: CssAtomSet::_MozTableColumn,
77		TableColumnGroup: CssAtomSet::_MozTableColumnGroup,
78		TableOuter: CssAtomSet::_MozTableOuter,
79		TableRow: CssAtomSet::_MozTableRow,
80		TableRowGroup: CssAtomSet::_MozTableRowGroup,
81		TableWrapper: CssAtomSet::_MozTableWrapper,
82		Text: CssAtomSet::_MozText,
83		TextControlEditingRoot: CssAtomSet::_MozTextControlEditingRoot,
84		TextControlPreview: CssAtomSet::_MozTextControlPreview,
85		TreeCell: CssAtomSet::_MozTreeCell,
86		TreeCheckbox: CssAtomSet::_MozTreeCheckbox,
87		TreeSeparator: CssAtomSet::_MozTreeSeparator,
88		VframesetBorder: CssAtomSet::_MozVframesetBorder,
89		Viewport: CssAtomSet::_MozViewport,
90		ViewportScroll: CssAtomSet::_MozViewportScroll,
91	}
92);
93
94#[node]
95#[derive(Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
96#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
97#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
98#[derive(csskit_derives::NodeWithMetadata)]
99pub enum MozFunctionalPseudoElement<'a> {
100	TreeCell(
101		T![::],
102		#[atom(CssAtomSet::TreeCell)] T![Function],
103		CommaSeparated<'a, T![Ident]>,
104		#[semantic_eq(skip)] T![')'],
105	),
106	TreeCellText(
107		T![::],
108		#[atom(CssAtomSet::TreeCellText)] T![Function],
109		CommaSeparated<'a, T![Ident]>,
110		#[semantic_eq(skip)] T![')'],
111	),
112	TreeCheckbox(
113		T![::],
114		#[atom(CssAtomSet::TreeCheckbox)] T![Function],
115		CommaSeparated<'a, T![Ident]>,
116		#[semantic_eq(skip)] T![')'],
117	),
118	TreeColumn(
119		T![::],
120		#[atom(CssAtomSet::TreeColumn)] T![Function],
121		CommaSeparated<'a, T![Ident]>,
122		#[semantic_eq(skip)] T![')'],
123	),
124	TreeDropFeedback(
125		T![::],
126		#[atom(CssAtomSet::TreeDropFeedback)] T![Function],
127		CommaSeparated<'a, T![Ident]>,
128		#[semantic_eq(skip)] T![')'],
129	),
130	TreeImage(
131		T![::],
132		#[atom(CssAtomSet::TreeImage)] T![Function],
133		CommaSeparated<'a, T![Ident]>,
134		#[semantic_eq(skip)] T![')'],
135	),
136	TreeIndentation(
137		T![::],
138		#[atom(CssAtomSet::TreeIndentation)] T![Function],
139		CommaSeparated<'a, T![Ident]>,
140		#[semantic_eq(skip)] T![')'],
141	),
142	TreeLine(
143		T![::],
144		#[atom(CssAtomSet::TreeLine)] T![Function],
145		CommaSeparated<'a, T![Ident]>,
146		#[semantic_eq(skip)] T![')'],
147	),
148	TreeRow(
149		T![::],
150		#[atom(CssAtomSet::TreeRow)] T![Function],
151		CommaSeparated<'a, T![Ident]>,
152		#[semantic_eq(skip)] T![')'],
153	),
154	TreeSeparator(
155		T![::],
156		#[atom(CssAtomSet::TreeSeparator)] T![Function],
157		CommaSeparated<'a, T![Ident]>,
158		#[semantic_eq(skip)] T![')'],
159	),
160	TreeTwisty(
161		T![::],
162		#[atom(CssAtomSet::TreeTwisty)] T![Function],
163		CommaSeparated<'a, T![Ident]>,
164		#[semantic_eq(skip)] T![')'],
165	),
166}
167
168#[node]
169#[derive(Parse, Peek, ToCursors, ToSpan, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
170#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
171#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(skip))]
172#[derive(csskit_derives::NodeWithMetadata)]
173pub enum MozFunctionalPseudoElementKeyword {
174	#[atom(CssAtomSet::_MozTreeCell)]
175	TreeCell(T![Function]),
176	#[atom(CssAtomSet::_MozTreeCellText)]
177	TreeCellText(T![Function]),
178	#[atom(CssAtomSet::_MozTreeCheckbox)]
179	TreeCheckbox(T![Function]),
180	#[atom(CssAtomSet::_MozTreeColumn)]
181	TreeColumn(T![Function]),
182	#[atom(CssAtomSet::_MozTreeDropFeedback)]
183	TreeDropFeedback(T![Function]),
184	#[atom(CssAtomSet::_MozTreeImage)]
185	TreeImage(T![Function]),
186	#[atom(CssAtomSet::_MozTreeIndentation)]
187	TreeIndentation(T![Function]),
188	#[atom(CssAtomSet::_MozTreeLine)]
189	TreeLine(T![Function]),
190	#[atom(CssAtomSet::_MozTreeRow)]
191	TreeRow(T![Function]),
192	#[atom(CssAtomSet::_MozTreeSeparator)]
193	TreeSeparator(T![Function]),
194	#[atom(CssAtomSet::_MozTreeTwisty)]
195	TreeTwisty(T![Function]),
196}
197impl<'a> Parse<'a> for MozFunctionalPseudoElement<'a> {
198	fn parse<I>(p: &mut Parser<'a, I>) -> ParserResult<Self>
199	where
200		I: Iterator<Item = Cursor> + Clone,
201	{
202		let colons = p.parse::<T![::]>()?;
203		let keyword = p.parse::<MozFunctionalPseudoElementKeyword>()?;
204		let items = p.parse::<CommaSeparated<'a, T![Ident]>>()?;
205		let close = p.parse::<T![')']>()?;
206		Ok(match keyword {
207			MozFunctionalPseudoElementKeyword::TreeCell(function) => Self::TreeCell(colons, function, items, close),
208			MozFunctionalPseudoElementKeyword::TreeCellText(function) => {
209				Self::TreeCellText(colons, function, items, close)
210			}
211			MozFunctionalPseudoElementKeyword::TreeCheckbox(function) => {
212				Self::TreeCheckbox(colons, function, items, close)
213			}
214			MozFunctionalPseudoElementKeyword::TreeColumn(function) => Self::TreeColumn(colons, function, items, close),
215			MozFunctionalPseudoElementKeyword::TreeDropFeedback(function) => {
216				Self::TreeDropFeedback(colons, function, items, close)
217			}
218			MozFunctionalPseudoElementKeyword::TreeImage(function) => Self::TreeImage(colons, function, items, close),
219			MozFunctionalPseudoElementKeyword::TreeIndentation(function) => {
220				Self::TreeIndentation(colons, function, items, close)
221			}
222			MozFunctionalPseudoElementKeyword::TreeLine(function) => Self::TreeLine(colons, function, items, close),
223			MozFunctionalPseudoElementKeyword::TreeRow(function) => Self::TreeRow(colons, function, items, close),
224			MozFunctionalPseudoElementKeyword::TreeSeparator(function) => {
225				Self::TreeSeparator(colons, function, items, close)
226			}
227			MozFunctionalPseudoElementKeyword::TreeTwisty(function) => Self::TreeTwisty(colons, function, items, close),
228		})
229	}
230}
231
232pseudo_class!(
233	#[node]
234	/// <https://developer.mozilla.org/en-US/docs/Web/CSS/Mozilla_Extensions#pseudo-elements_and_pseudo-classes>
235	#[derive(ToCursors, ToSpan, SemanticEq, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
236	#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
237	#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
238#[derive(csskit_derives::NodeWithMetadata)]
239	pub enum MozPseudoClass {
240		Any: CssAtomSet::_MozAny,
241		AnyLink: CssAtomSet::_MozAnyLink,
242		AutofillPreview: CssAtomSet::_MozAutofillPreview,
243		Broken: CssAtomSet::_MozBroken,
244		DevtoolsHighlighted: CssAtomSet::_MozDevtoolsHighlighted,
245		DirAttrLikeAuto: CssAtomSet::_MozDirAttrLikeAuto,
246		DirAttrLtr: CssAtomSet::_MozDirAttrLtr,
247		DirAttrRtl: CssAtomSet::_MozDirAttrRtl,
248		DragOver: CssAtomSet::_MozDragOver,
249		FirstNode: CssAtomSet::_MozFirstNode,
250		FocusRing: CssAtomSet::_MozFocusring,
251		FullScreen: CssAtomSet::_MozFullScreen,
252		FullScreenAncestor: CssAtomSet::_MozFullScreenAncestor,
253		HandlerBlocked: CssAtomSet::_MozHandlerBlocked,
254		HandlerCrashed: CssAtomSet::_MozHandlerCrashed,
255		HandlerDisabled: CssAtomSet::_MozHandlerDisabled,
256		HasDirAttr: CssAtomSet::_MozHasDirAttr,
257		Inert: CssAtomSet::_MozInert,
258		IsHtml: CssAtomSet::_MozIsHtml,
259		LastNode: CssAtomSet::_MozLastNode,
260		Loading: CssAtomSet::_MozLoading,
261		LwTheme: CssAtomSet::_MozLwtheme,
262		LwThemeBrighttext: CssAtomSet::_MozLwthemeBrighttext,
263		LwThemeDarktext: CssAtomSet::_MozLwthemeDarktext,
264		MathIncrementScriptLevel: CssAtomSet::_MozMathIncrementScriptLevel,
265		MeterOptimum: CssAtomSet::_MozMeterOptimum,
266		MeterSubOptimum: CssAtomSet::_MozMeterSubOptimum,
267		MeterSubSubOptimum: CssAtomSet::_MozMeterSubSubOptimum,
268		NativeAnonymous: CssAtomSet::_MozNativeAnonymous,
269		OnlyWhitespace: CssAtomSet::_MozOnlyWhitespace,
270		Placeholder: CssAtomSet::_MozPlaceholder,
271		PlaceholderShown: CssAtomSet::_MozPlaceholderShown,
272		ReadOnly: CssAtomSet::_MozReadOnly,
273		ReadWrite: CssAtomSet::_MozReadWrite,
274		Revealed: CssAtomSet::_MozRevealed,
275		SelectListBox: CssAtomSet::_MozSelectListBox,
276		SubmitInvalid: CssAtomSet::_MozSubmitInvalid,
277		StyleeditorTransitioning: CssAtomSet::_MozStyleeditorTransitioning,
278		Suppressed: CssAtomSet::_MozSuppressed,
279		SuppressForPrintSelection: CssAtomSet::_MozSuppressForPrintSelection,
280		TableBorderNonzero: CssAtomSet::_MozTableBorderNonzero,
281		TopmostModal: CssAtomSet::_MozTopmostModal,
282		UiInvalid: CssAtomSet::_MozUiInvalid,
283		UiValid: CssAtomSet::_MozUiValid,
284		UserDisabled: CssAtomSet::_MozUserDisabled,
285		ValueEmpty: CssAtomSet::_MozValueEmpty,
286		WindowInactive: CssAtomSet::_MozWindowInactive,
287	}
288);
289#[node]
290#[derive(ToCursors, ToSpan, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
291#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
292#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit)]
293#[derive(csskit_derives::NodeWithMetadata)]
294pub enum MozFunctionalPseudoClass {
295	LocaleDir(MozLocaleDirFunctionalPseudoClass),
296}
297
298impl<'a> Parse<'a> for MozFunctionalPseudoClass {
299	fn parse<I>(p: &mut Parser<'a, I>) -> ParserResult<Self>
300	where
301		I: Iterator<Item = Cursor> + Clone,
302	{
303		let colon = p.parse::<T![:]>()?;
304		let function = p.parse::<T![Function]>()?;
305		let c: Cursor = function.into();
306		if p.equals_atom(c, &CssAtomSet::_MozLocaleDir) {
307			let value = p.parse::<DirValue>()?;
308			let close = p.parse_if_peek::<T![')']>()?;
309			Ok(Self::LocaleDir(MozLocaleDirFunctionalPseudoClass { colon, function, value, close }))
310		} else {
311			Err(Diagnostic::new(c, Diagnostic::unexpected_function))?
312		}
313	}
314}
315
316#[node]
317#[derive(ToCursors, ToSpan, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
318#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
319#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
320#[derive(csskit_derives::NodeWithMetadata)]
321pub struct MozLocaleDirFunctionalPseudoClass {
322	pub colon: T![:],
323	pub function: T![Function],
324	pub value: DirValue,
325	pub close: Option<T![')']>,
326}
327
328#[cfg(test)]
329mod tests {
330	use super::*;
331	use crate::CssAtomSet;
332	use css_parse::assert_parse;
333
334	#[test]
335	fn test_writes() {
336		assert_parse!(CssAtomSet::ATOMS, MozPseudoElement, "::-moz-anonymous-block");
337		assert_parse!(CssAtomSet::ATOMS, MozPseudoElement, "::-moz-meter-bar");
338		assert_parse!(CssAtomSet::ATOMS, MozPseudoElement, "::-moz-file-content");
339		assert_parse!(CssAtomSet::ATOMS, MozPseudoElement, "::-moz-svg-outer-svg-anon-child");
340		assert_parse!(CssAtomSet::ATOMS, MozFunctionalPseudoElement, "::-moz-tree-twisty(selected,focus)");
341		assert_parse!(CssAtomSet::ATOMS, MozFunctionalPseudoElement, "::-moz-tree-drop-feedback(selected)");
342		assert_parse!(CssAtomSet::ATOMS, MozFunctionalPseudoElement, "::-moz-tree-indentation(selected)");
343		assert_parse!(CssAtomSet::ATOMS, MozPseudoClass, ":-moz-meter-optimum");
344		assert_parse!(CssAtomSet::ATOMS, MozPseudoClass, ":-moz-meter-sub-optimum");
345		assert_parse!(CssAtomSet::ATOMS, MozPseudoClass, ":-moz-meter-sub-sub-optimum");
346		assert_parse!(CssAtomSet::ATOMS, MozPseudoClass, ":-moz-placeholder");
347		assert_parse!(CssAtomSet::ATOMS, MozPseudoClass, ":-moz-autofill-preview");
348	}
349}