style/values/specified/
page.rs1use crate::derives::*;
8use crate::parser::{Parse, ParserContext};
9use crate::values::generics::size::Size2D;
10use crate::values::specified::length::NonNegativeLength;
11use crate::values::{generics, CustomIdent};
12use cssparser::{match_ignore_ascii_case, Parser};
13use style_traits::ParseError;
14
15pub use generics::page::PageOrientation;
16pub use generics::page::PageSizeOrientation;
17pub use generics::page::PaperSize;
18pub type PageSize = generics::page::PageSize<Size2D<NonNegativeLength>>;
20
21impl Parse for PageSize {
22 fn parse(context: &ParserContext, input: &mut Parser) -> Result<Self, ParseError> {
23 if let Ok(paper_size) = input.try_parse(PaperSize::parse) {
25 let orientation = input
26 .try_parse(PageSizeOrientation::parse)
27 .unwrap_or(PageSizeOrientation::Portrait);
28 return Ok(PageSize::PaperSize(paper_size, orientation));
29 }
30 if let Ok(orientation) = input.try_parse(PageSizeOrientation::parse) {
32 if let Ok(paper_size) = input.try_parse(PaperSize::parse) {
33 return Ok(PageSize::PaperSize(paper_size, orientation));
34 }
35 return Ok(PageSize::Orientation(orientation));
36 }
37 if let Ok(size) =
39 input.try_parse(|i| Size2D::parse_with(context, i, NonNegativeLength::parse))
40 {
41 return Ok(PageSize::Size(size));
42 }
43 input.expect_ident_matching("auto")?;
45 Ok(PageSize::Auto)
46 }
47}
48
49#[derive(
53 Clone,
54 Debug,
55 MallocSizeOf,
56 PartialEq,
57 SpecifiedValueInfo,
58 ToCss,
59 ToComputedValue,
60 ToResolvedValue,
61 ToShmem,
62 ToTyped,
63)]
64#[repr(C, u8)]
65pub enum PageName {
66 Auto,
68 PageName(CustomIdent),
70}
71
72impl Parse for PageName {
73 fn parse(_context: &ParserContext, input: &mut Parser) -> Result<Self, ParseError> {
74 let ident = input.expect_ident()?;
75 Ok(match_ignore_ascii_case! { ident,
76 "auto" => PageName::auto(),
77 _ => PageName::PageName(CustomIdent::from_ident(ident, &[])?),
78 })
79 }
80}
81
82impl PageName {
83 #[inline]
85 pub fn auto() -> Self {
86 PageName::Auto
87 }
88
89 #[inline]
91 pub fn is_auto(&self) -> bool {
92 matches!(*self, PageName::Auto)
93 }
94}