[librsvg] Move CustomIdent to the parsers module
- From: Paolo Borelli <pborelli src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg] Move CustomIdent to the parsers module
- Date: Sun, 12 Apr 2020 16:34:30 +0000 (UTC)
commit 4b4251273553128c5f80206d936956480fd855ef
Author: Paolo Borelli <pborelli gnome org>
Date: Sun Apr 12 18:26:00 2020 +0200
Move CustomIdent to the parsers module
Makefile.am | 1 -
po/POTFILES.in | 1 -
rsvg_internals/src/filters/blend.rs | 3 +-
rsvg_internals/src/filters/composite.rs | 3 +-
rsvg_internals/src/filters/context.rs | 3 +-
rsvg_internals/src/filters/input.rs | 86 ---------------------------------
rsvg_internals/src/filters/merge.rs | 3 +-
rsvg_internals/src/filters/mod.rs | 44 ++++++++++++++---
rsvg_internals/src/parsers.rs | 47 +++++++++++++++++-
9 files changed, 87 insertions(+), 104 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index 0b1e2aa3..98e4cbf2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -55,7 +55,6 @@ LIBRSVG_INTERNALS_SRC = \
rsvg_internals/src/filters/merge.rs \
rsvg_internals/src/filters/morphology.rs \
rsvg_internals/src/filters/mod.rs \
- rsvg_internals/src/filters/input.rs \
rsvg_internals/src/filters/offset.rs \
rsvg_internals/src/filters/tile.rs \
rsvg_internals/src/filters/turbulence.rs \
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 52aefded..8f992fb3 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -37,7 +37,6 @@ rsvg_internals/src/filters/error.rs
rsvg_internals/src/filters/flood.rs
rsvg_internals/src/filters/gaussian_blur.rs
rsvg_internals/src/filters/image.rs
-rsvg_internals/src/filters/input.rs
rsvg_internals/src/filters/light/light_source.rs
rsvg_internals/src/filters/light/lighting.rs
rsvg_internals/src/filters/light/mod.rs
diff --git a/rsvg_internals/src/filters/blend.rs b/rsvg_internals/src/filters/blend.rs
index 20f8f71f..2038b9ee 100755
--- a/rsvg_internals/src/filters/blend.rs
+++ b/rsvg_internals/src/filters/blend.rs
@@ -10,8 +10,7 @@ use crate::parsers::{Parse, ParseValue};
use crate::property_bag::PropertyBag;
use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::input::Input;
-use super::{FilterEffect, FilterError, PrimitiveWithInput};
+use super::{FilterEffect, FilterError, Input, PrimitiveWithInput};
/// Enumeration of the possible blending modes.
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
diff --git a/rsvg_internals/src/filters/composite.rs b/rsvg_internals/src/filters/composite.rs
index 2aad6232..aa1ae921 100644
--- a/rsvg_internals/src/filters/composite.rs
+++ b/rsvg_internals/src/filters/composite.rs
@@ -10,8 +10,7 @@ use crate::parsers::{Parse, ParseValue};
use crate::property_bag::PropertyBag;
use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::input::Input;
-use super::{FilterEffect, FilterError, PrimitiveWithInput};
+use super::{FilterEffect, FilterError, Input, PrimitiveWithInput};
/// Enumeration of the possible compositing operations.
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
diff --git a/rsvg_internals/src/filters/context.rs b/rsvg_internals/src/filters/context.rs
index d1cb737e..a14033d4 100644
--- a/rsvg_internals/src/filters/context.rs
+++ b/rsvg_internals/src/filters/context.rs
@@ -9,6 +9,7 @@ use crate::drawing_ctx::{DrawingCtx, ViewParams};
use crate::filter::Filter;
use crate::node::{Node, NodeBorrow};
use crate::paint_server::PaintServer;
+use crate::parsers::CustomIdent;
use crate::properties::ComputedValues;
use crate::rect::IRect;
use crate::surface_utils::shared_surface::{
@@ -18,7 +19,7 @@ use crate::transform::Transform;
use crate::unit_interval::UnitInterval;
use super::error::FilterError;
-use super::input::{CustomIdent, Input};
+use super::Input;
/// A filter primitive output.
#[derive(Debug, Clone)]
diff --git a/rsvg_internals/src/filters/input.rs b/rsvg_internals/src/filters/input.rs
index 55bb69bf..e69de29b 100644
--- a/rsvg_internals/src/filters/input.rs
+++ b/rsvg_internals/src/filters/input.rs
@@ -1,86 +0,0 @@
-use cssparser::{BasicParseError, Parser, Token};
-
-use crate::error::*;
-use crate::parsers::Parse;
-
-/// An enumeration of possible inputs for a filter primitive.
-#[derive(Debug, Clone, Eq, PartialEq, Hash)]
-pub enum Input {
- SourceGraphic,
- SourceAlpha,
- BackgroundImage,
- BackgroundAlpha,
- FillPaint,
- StrokePaint,
- FilterOutput(CustomIdent),
-}
-
-/// https://www.w3.org/TR/css-values-4/#custom-idents
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct CustomIdent(String);
-
-impl Parse for Input {
- fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
- parser
- .try_parse(|p| {
- Ok(parse_identifiers!(
- p,
- "SourceGraphic" => Input::SourceGraphic,
- "SourceAlpha" => Input::SourceAlpha,
- "BackgroundImage" => Input::BackgroundImage,
- "BackgroundAlpha" => Input::BackgroundAlpha,
- "FillPaint" => Input::FillPaint,
- "StrokePaint" => Input::StrokePaint,
- )?)
- })
- .or_else(|_: BasicParseError| {
- let ident = CustomIdent::parse(parser)?;
- Ok(Input::FilterOutput(ident))
- })
- }
-}
-
-impl Parse for CustomIdent {
- fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
- let loc = parser.current_source_location();
- let token = parser.next()?;
-
- match token {
- // CSS-wide keywords and "default" are errors here
- // https://www.w3.org/TR/css-values-4/#css-wide-keywords
- Token::Ident(ref cow) => {
- for s in &["initial", "inherit", "unset", "default"] {
- if cow.eq_ignore_ascii_case(s) {
- Err(loc.new_basic_unexpected_token_error(token.clone()))?
- }
- }
-
- Ok(CustomIdent(cow.as_ref().to_string()))
- }
-
- _ => Err(loc.new_basic_unexpected_token_error(token.clone()))?,
- }
- }
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn parses_custom_ident() {
- assert_eq!(
- CustomIdent::parse_str("hello"),
- Ok(CustomIdent("hello".to_string()))
- );
- }
-
- #[test]
- fn invalid_custom_ident_yields_error() {
- assert!(CustomIdent::parse_str("initial").is_err());
- assert!(CustomIdent::parse_str("inherit").is_err());
- assert!(CustomIdent::parse_str("unset").is_err());
- assert!(CustomIdent::parse_str("default").is_err());
- assert!(CustomIdent::parse_str("").is_err());
- }
-}
diff --git a/rsvg_internals/src/filters/merge.rs b/rsvg_internals/src/filters/merge.rs
index d7124f48..b255c854 100644
--- a/rsvg_internals/src/filters/merge.rs
+++ b/rsvg_internals/src/filters/merge.rs
@@ -10,8 +10,7 @@ use crate::rect::IRect;
use crate::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::input::Input;
-use super::{FilterEffect, FilterError, Primitive};
+use super::{FilterEffect, FilterError, Input, Primitive};
/// The `feMerge` filter primitive.
pub struct FeMerge {
diff --git a/rsvg_internals/src/filters/mod.rs b/rsvg_internals/src/filters/mod.rs
index c161df56..7ad2da82 100644
--- a/rsvg_internals/src/filters/mod.rs
+++ b/rsvg_internals/src/filters/mod.rs
@@ -1,20 +1,20 @@
//! Entry point for the CSS filters infrastructure.
+use cssparser::{BasicParseError, Parser};
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
use std::ops::Deref;
use std::time::Instant;
-use markup5ever::{expanded_name, local_name, namespace_url, ns};
-
use crate::bbox::BoundingBox;
use crate::coord_units::CoordUnits;
use crate::document::AcquiredNodes;
use crate::drawing_ctx::DrawingCtx;
use crate::element::{ElementResult, ElementTrait, ElementType};
-use crate::error::RenderingError;
+use crate::error::{ParseError, RenderingError};
use crate::filter::Filter;
use crate::length::*;
use crate::node::{CascadedValues, Node, NodeBorrow};
-use crate::parsers::ParseValue;
+use crate::parsers::{CustomIdent, Parse, ParseValue};
use crate::properties::ComputedValues;
use crate::property_bag::PropertyBag;
use crate::property_defs::ColorInterpolationFilters;
@@ -29,9 +29,6 @@ use self::context::{FilterContext, FilterInput, FilterResult};
mod error;
use self::error::FilterError;
-mod input;
-use self::input::{CustomIdent, Input};
-
/// A filter primitive interface.
pub trait FilterEffect: ElementTrait {
/// Renders this filter primitive.
@@ -87,6 +84,39 @@ struct Primitive {
result: Option<CustomIdent>,
}
+/// An enumeration of possible inputs for a filter primitive.
+#[derive(Debug, Clone, Eq, PartialEq, Hash)]
+pub enum Input {
+ SourceGraphic,
+ SourceAlpha,
+ BackgroundImage,
+ BackgroundAlpha,
+ FillPaint,
+ StrokePaint,
+ FilterOutput(CustomIdent),
+}
+
+impl Parse for Input {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ parser
+ .try_parse(|p| {
+ Ok(parse_identifiers!(
+ p,
+ "SourceGraphic" => Input::SourceGraphic,
+ "SourceAlpha" => Input::SourceAlpha,
+ "BackgroundImage" => Input::BackgroundImage,
+ "BackgroundAlpha" => Input::BackgroundAlpha,
+ "FillPaint" => Input::FillPaint,
+ "StrokePaint" => Input::StrokePaint,
+ )?)
+ })
+ .or_else(|_: BasicParseError| {
+ let ident = CustomIdent::parse(parser)?;
+ Ok(Input::FilterOutput(ident))
+ })
+ }
+}
+
/// The base node for filter primitives which accept input.
struct PrimitiveWithInput {
base: Primitive,
diff --git a/rsvg_internals/src/parsers.rs b/rsvg_internals/src/parsers.rs
index b64b6d89..db0b1107 100644
--- a/rsvg_internals/src/parsers.rs
+++ b/rsvg_internals/src/parsers.rs
@@ -1,8 +1,7 @@
//! The `Parse` trait for CSS properties, and utilities for parsers.
-use cssparser::{Parser, ParserInput};
+use cssparser::{Parser, ParserInput, Token};
use markup5ever::QualName;
-
use std::str;
use crate::error::*;
@@ -147,6 +146,33 @@ macro_rules! parse_identifiers {
};
}
+/// https://www.w3.org/TR/css-values-4/#custom-idents
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct CustomIdent(String);
+
+impl Parse for CustomIdent {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ let loc = parser.current_source_location();
+ let token = parser.next()?;
+
+ match token {
+ // CSS-wide keywords and "default" are errors here
+ // https://www.w3.org/TR/css-values-4/#css-wide-keywords
+ Token::Ident(ref cow) => {
+ for s in &["initial", "inherit", "unset", "default"] {
+ if cow.eq_ignore_ascii_case(s) {
+ Err(loc.new_basic_unexpected_token_error(token.clone()))?
+ }
+ }
+
+ Ok(CustomIdent(cow.as_ref().to_string()))
+ }
+
+ _ => Err(loc.new_basic_unexpected_token_error(token.clone()))?,
+ }
+ }
+}
+
#[cfg(test)]
mod tests {
use super::*;
@@ -246,4 +272,21 @@ mod tests {
assert!(NumberOptionalNumber::<i32>::parse_str("1 2.5").is_err());
assert!(NumberOptionalNumber::<i32>::parse_str("1, 2.5").is_err());
}
+
+ #[test]
+ fn parses_custom_ident() {
+ assert_eq!(
+ CustomIdent::parse_str("hello"),
+ Ok(CustomIdent("hello".to_string()))
+ );
+ }
+
+ #[test]
+ fn invalid_custom_ident_yields_error() {
+ assert!(CustomIdent::parse_str("initial").is_err());
+ assert!(CustomIdent::parse_str("inherit").is_err());
+ assert!(CustomIdent::parse_str("unset").is_err());
+ assert!(CustomIdent::parse_str("default").is_err());
+ assert!(CustomIdent::parse_str("").is_err());
+ }
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]