summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am1
-rw-r--r--po/POTFILES.in1
-rw-r--r--src/filters/color_matrix.rs3
-rw-r--r--src/filters/component_transfer.rs3
-rw-r--r--src/filters/convolve_matrix.rs5
-rw-r--r--src/lib.rs1
-rw-r--r--src/number_list.rs121
-rw-r--r--src/parsers.rs111
-rw-r--r--src/viewbox.rs3
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},
diff --git a/src/lib.rs b/src/lib.rs
index 159c6322..1cff576b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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.