diff options
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | po/POTFILES.in | 1 | ||||
-rw-r--r-- | src/filters/color_matrix.rs | 3 | ||||
-rw-r--r-- | src/filters/component_transfer.rs | 3 | ||||
-rw-r--r-- | src/filters/convolve_matrix.rs | 5 | ||||
-rw-r--r-- | src/lib.rs | 1 | ||||
-rw-r--r-- | src/number_list.rs | 121 | ||||
-rw-r--r-- | src/parsers.rs | 111 | ||||
-rw-r--r-- | src/viewbox.rs | 3 |
9 files changed, 117 insertions, 132 deletions
diff --git a/Makefile.am b/Makefile.am index d9204fd5..376be0f3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -85,7 +85,6 @@ LIBRSVG_SRC = \ src/log.rs \ src/marker.rs \ src/node.rs \ - src/number_list.rs \ src/paint_server.rs \ src/parsers.rs \ src/path_builder.rs \ diff --git a/po/POTFILES.in b/po/POTFILES.in index 2068ce15..ce96f82e 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -56,7 +56,6 @@ src/limits.rs src/log.rs src/marker.rs src/node.rs -src/number_list.rs src/paint_server.rs src/parsers.rs src/path_builder.rs diff --git a/src/filters/color_matrix.rs b/src/filters/color_matrix.rs index c95aa7ec..97b09cf2 100644 --- a/src/filters/color_matrix.rs +++ b/src/filters/color_matrix.rs @@ -8,8 +8,7 @@ use crate::drawing_ctx::DrawingCtx; use crate::element::{ElementResult, SetAttributes}; use crate::error::*; use crate::node::Node; -use crate::number_list::{NumberList, NumberListLength}; -use crate::parsers::{Parse, ParseValue}; +use crate::parsers::{NumberList, NumberListLength, Parse, ParseValue}; use crate::surface_utils::{ iterators::Pixels, shared_surface::ExclusiveImageSurface, ImageSurfaceDataExt, Pixel, }; diff --git a/src/filters/component_transfer.rs b/src/filters/component_transfer.rs index 89e81238..dad54411 100644 --- a/src/filters/component_transfer.rs +++ b/src/filters/component_transfer.rs @@ -9,8 +9,7 @@ use crate::drawing_ctx::DrawingCtx; use crate::element::{Draw, Element, ElementResult, SetAttributes}; use crate::error::*; use crate::node::{Node, NodeBorrow}; -use crate::number_list::{NumberList, NumberListLength}; -use crate::parsers::{Parse, ParseValue}; +use crate::parsers::{NumberList, NumberListLength, Parse, ParseValue}; use crate::surface_utils::{ iterators::Pixels, shared_surface::ExclusiveImageSurface, ImageSurfaceDataExt, Pixel, }; diff --git a/src/filters/convolve_matrix.rs b/src/filters/convolve_matrix.rs index 98366123..10298e73 100644 --- a/src/filters/convolve_matrix.rs +++ b/src/filters/convolve_matrix.rs @@ -8,8 +8,9 @@ use crate::drawing_ctx::DrawingCtx; use crate::element::{ElementResult, SetAttributes}; use crate::error::*; use crate::node::Node; -use crate::number_list::{NumberList, NumberListLength}; -use crate::parsers::{NonNegative, NumberOptionalNumber, Parse, ParseValue}; +use crate::parsers::{ + NonNegative, NumberList, NumberListLength, NumberOptionalNumber, Parse, ParseValue, +}; use crate::rect::IRect; use crate::surface_utils::{ iterators::{PixelRectangle, Pixels}, @@ -116,7 +116,6 @@ mod iri; mod length; mod limits; mod marker; -mod number_list; mod paint_server; mod path_builder; mod path_parser; diff --git a/src/number_list.rs b/src/number_list.rs deleted file mode 100644 index bb142072..00000000 --- a/src/number_list.rs +++ /dev/null @@ -1,121 +0,0 @@ -//! CSS number-list values. - -use cssparser::{Parser, ParserInput}; - -use crate::error::*; -use crate::parsers::{optional_comma, Parse}; - -#[derive(Eq, PartialEq)] -pub enum NumberListLength { - Exact(usize), - Unbounded, -} - -#[derive(Debug, PartialEq)] -pub struct NumberList(pub Vec<f64>); - -impl NumberList { - pub fn parse<'i>( - parser: &mut Parser<'i, '_>, - length: NumberListLength, - ) -> Result<Self, ParseError<'i>> { - let mut v = match length { - NumberListLength::Exact(l) if l > 0 => Vec::<f64>::with_capacity(l), - NumberListLength::Exact(_) => unreachable!("NumberListLength::Exact cannot be 0"), - NumberListLength::Unbounded => Vec::<f64>::new(), - }; - - if parser.is_exhausted() && length == NumberListLength::Unbounded { - return Ok(NumberList(v)); - } - - for i in 0.. { - if i != 0 { - optional_comma(parser); - } - - v.push(f64::parse(parser)?); - - if let NumberListLength::Exact(l) = length { - if i + 1 == l { - break; - } - } - - if parser.is_exhausted() { - match length { - NumberListLength::Exact(l) => { - if i + 1 == l { - break; - } - } - _ => break, - } - } - } - - Ok(NumberList(v)) - } - - pub fn parse_str(s: &str, length: NumberListLength) -> Result<NumberList, ParseError<'_>> { - let mut input = ParserInput::new(s); - let mut parser = Parser::new(&mut input); - - let res = Self::parse(&mut parser, length)?; - parser.expect_exhausted()?; - Ok(res) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn parses_number_list() { - assert_eq!( - NumberList::parse_str("5", NumberListLength::Exact(1)).unwrap(), - NumberList(vec![5.0]) - ); - - assert_eq!( - NumberList::parse_str("1 2 3 4", NumberListLength::Exact(4)).unwrap(), - NumberList(vec![1.0, 2.0, 3.0, 4.0]) - ); - - assert_eq!( - NumberList::parse_str("", NumberListLength::Unbounded).unwrap(), - NumberList(vec![]) - ); - - assert_eq!( - NumberList::parse_str("1, 2, 3.0, 4, 5", NumberListLength::Unbounded).unwrap(), - NumberList(vec![1.0, 2.0, 3.0, 4.0, 5.0]) - ); - } - - #[test] - fn errors_on_invalid_number_list() { - // empty - assert!(NumberList::parse_str("", NumberListLength::Exact(1)).is_err()); - - // garbage - assert!(NumberList::parse_str("foo", NumberListLength::Exact(1)).is_err()); - assert!(NumberList::parse_str("1foo", NumberListLength::Exact(2)).is_err()); - assert!(NumberList::parse_str("1 foo", NumberListLength::Exact(2)).is_err()); - assert!(NumberList::parse_str("1 foo 2", NumberListLength::Exact(2)).is_err()); - assert!(NumberList::parse_str("1,foo", NumberListLength::Exact(2)).is_err()); - - // too many - assert!(NumberList::parse_str("1 2", NumberListLength::Exact(1)).is_err()); - - // extra token - assert!(NumberList::parse_str("1,", NumberListLength::Exact(1)).is_err()); - assert!(NumberList::parse_str("1,", NumberListLength::Exact(1)).is_err()); - assert!(NumberList::parse_str("1,", NumberListLength::Unbounded).is_err()); - - // too few - assert!(NumberList::parse_str("1", NumberListLength::Exact(2)).is_err()); - assert!(NumberList::parse_str("1 2", NumberListLength::Exact(3)).is_err()); - } -} diff --git a/src/parsers.rs b/src/parsers.rs index c0507b93..6b138149 100644 --- a/src/parsers.rs +++ b/src/parsers.rs @@ -131,6 +131,69 @@ impl Parse for u32 { } } +#[derive(Eq, PartialEq)] +pub enum NumberListLength { + Exact(usize), + Unbounded, +} + +#[derive(Debug, PartialEq)] +pub struct NumberList(pub Vec<f64>); + +/// CSS number-list values. +impl NumberList { + pub fn parse<'i>( + parser: &mut Parser<'i, '_>, + length: NumberListLength, + ) -> Result<Self, ParseError<'i>> { + let mut v = match length { + NumberListLength::Exact(l) if l > 0 => Vec::<f64>::with_capacity(l), + NumberListLength::Exact(_) => unreachable!("NumberListLength::Exact cannot be 0"), + NumberListLength::Unbounded => Vec::<f64>::new(), + }; + + if parser.is_exhausted() && length == NumberListLength::Unbounded { + return Ok(NumberList(v)); + } + + for i in 0.. { + if i != 0 { + optional_comma(parser); + } + + v.push(f64::parse(parser)?); + + if let NumberListLength::Exact(l) = length { + if i + 1 == l { + break; + } + } + + if parser.is_exhausted() { + match length { + NumberListLength::Exact(l) => { + if i + 1 == l { + break; + } + } + _ => break, + } + } + } + + Ok(NumberList(v)) + } + + pub fn parse_str(s: &str, length: NumberListLength) -> Result<NumberList, ParseError<'_>> { + let mut input = ParserInput::new(s); + let mut parser = Parser::new(&mut input); + + let res = Self::parse(&mut parser, length)?; + parser.expect_exhausted()?; + Ok(res) + } +} + /// Parses a list of identifiers from a `cssparser::Parser` /// /// # Example @@ -303,6 +366,54 @@ mod tests { } #[test] + fn parses_number_list() { + assert_eq!( + NumberList::parse_str("5", NumberListLength::Exact(1)).unwrap(), + NumberList(vec![5.0]) + ); + + assert_eq!( + NumberList::parse_str("1 2 3 4", NumberListLength::Exact(4)).unwrap(), + NumberList(vec![1.0, 2.0, 3.0, 4.0]) + ); + + assert_eq!( + NumberList::parse_str("", NumberListLength::Unbounded).unwrap(), + NumberList(vec![]) + ); + + assert_eq!( + NumberList::parse_str("1, 2, 3.0, 4, 5", NumberListLength::Unbounded).unwrap(), + NumberList(vec![1.0, 2.0, 3.0, 4.0, 5.0]) + ); + } + + #[test] + fn errors_on_invalid_number_list() { + // empty + assert!(NumberList::parse_str("", NumberListLength::Exact(1)).is_err()); + + // garbage + assert!(NumberList::parse_str("foo", NumberListLength::Exact(1)).is_err()); + assert!(NumberList::parse_str("1foo", NumberListLength::Exact(2)).is_err()); + assert!(NumberList::parse_str("1 foo", NumberListLength::Exact(2)).is_err()); + assert!(NumberList::parse_str("1 foo 2", NumberListLength::Exact(2)).is_err()); + assert!(NumberList::parse_str("1,foo", NumberListLength::Exact(2)).is_err()); + + // too many + assert!(NumberList::parse_str("1 2", NumberListLength::Exact(1)).is_err()); + + // extra token + assert!(NumberList::parse_str("1,", NumberListLength::Exact(1)).is_err()); + assert!(NumberList::parse_str("1,", NumberListLength::Exact(1)).is_err()); + assert!(NumberList::parse_str("1,", NumberListLength::Unbounded).is_err()); + + // too few + assert!(NumberList::parse_str("1", NumberListLength::Exact(2)).is_err()); + assert!(NumberList::parse_str("1 2", NumberListLength::Exact(3)).is_err()); + } + + #[test] fn parses_custom_ident() { assert_eq!( CustomIdent::parse_str("hello").unwrap(), diff --git a/src/viewbox.rs b/src/viewbox.rs index 5c4691e2..b979f216 100644 --- a/src/viewbox.rs +++ b/src/viewbox.rs @@ -4,8 +4,7 @@ use cssparser::Parser; use std::ops::Deref; use crate::error::*; -use crate::number_list::{NumberList, NumberListLength}; -use crate::parsers::Parse; +use crate::parsers::{NumberList, NumberListLength, Parse}; use crate::rect::Rect; /// Newtype around a [`Rect`], used to represent the `viewBox` attribute. |