consolidate implementations of rgb and rgba
This commit is contained in:
parent
2d0a9abb13
commit
b5a0931e45
@ -12,7 +12,13 @@ use crate::selector::Selector;
|
|||||||
use crate::unit::Unit;
|
use crate::unit::Unit;
|
||||||
use crate::value::{Number, Value};
|
use crate::value::{Number, Value};
|
||||||
|
|
||||||
fn rgb(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
|
/// name: Either `rgb` or `rgba` depending on the caller
|
||||||
|
fn inner_rgb(
|
||||||
|
name: &'static str,
|
||||||
|
mut args: CallArgs,
|
||||||
|
scope: &Scope,
|
||||||
|
super_selector: &Selector,
|
||||||
|
) -> SassResult<Value> {
|
||||||
if args.is_empty() {
|
if args.is_empty() {
|
||||||
return Err(("Missing argument $channels.", args.span()).into());
|
return Err(("Missing argument $channels.", args.span()).into());
|
||||||
}
|
}
|
||||||
@ -42,7 +48,8 @@ fn rgb(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResu
|
|||||||
let red = channels.pop().unwrap();
|
let red = channels.pop().unwrap();
|
||||||
return Ok(Value::Ident(
|
return Ok(Value::Ident(
|
||||||
format!(
|
format!(
|
||||||
"rgb({}, {}, {})",
|
"{}({}, {}, {})",
|
||||||
|
name,
|
||||||
red.to_css_string(args.span())?,
|
red.to_css_string(args.span())?,
|
||||||
green.to_css_string(args.span())?,
|
green.to_css_string(args.span())?,
|
||||||
v.to_css_string(args.span())?
|
v.to_css_string(args.span())?
|
||||||
@ -66,12 +73,13 @@ fn rgb(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResu
|
|||||||
Some(v) if v.is_special_function() => {
|
Some(v) if v.is_special_function() => {
|
||||||
let string = match channels.pop() {
|
let string = match channels.pop() {
|
||||||
Some(red) => format!(
|
Some(red) => format!(
|
||||||
"rgb({}, {}, {})",
|
"{}({}, {}, {})",
|
||||||
|
name,
|
||||||
red.to_css_string(args.span())?,
|
red.to_css_string(args.span())?,
|
||||||
v.to_css_string(args.span())?,
|
v.to_css_string(args.span())?,
|
||||||
blue
|
blue
|
||||||
),
|
),
|
||||||
None => format!("rgb({} {})", v.to_css_string(args.span())?, blue),
|
None => format!("{}({} {})", name, v.to_css_string(args.span())?, blue),
|
||||||
};
|
};
|
||||||
return Ok(Value::Ident(string, QuoteKind::None));
|
return Ok(Value::Ident(string, QuoteKind::None));
|
||||||
}
|
}
|
||||||
@ -91,7 +99,8 @@ fn rgb(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResu
|
|||||||
Some(v) if v.is_special_function() => {
|
Some(v) if v.is_special_function() => {
|
||||||
return Ok(Value::Ident(
|
return Ok(Value::Ident(
|
||||||
format!(
|
format!(
|
||||||
"rgb({}, {}, {})",
|
"{}({}, {}, {})",
|
||||||
|
name,
|
||||||
v.to_css_string(args.span())?,
|
v.to_css_string(args.span())?,
|
||||||
green,
|
green,
|
||||||
blue
|
blue
|
||||||
@ -119,7 +128,8 @@ fn rgb(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResu
|
|||||||
let alpha = arg!(args, scope, super_selector, 1, "alpha");
|
let alpha = arg!(args, scope, super_selector, 1, "alpha");
|
||||||
return Ok(Value::Ident(
|
return Ok(Value::Ident(
|
||||||
format!(
|
format!(
|
||||||
"rgb({}, {})",
|
"{}({}, {})",
|
||||||
|
name,
|
||||||
v.to_css_string(args.span())?,
|
v.to_css_string(args.span())?,
|
||||||
alpha.to_css_string(args.span())?
|
alpha.to_css_string(args.span())?
|
||||||
),
|
),
|
||||||
@ -150,7 +160,8 @@ fn rgb(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResu
|
|||||||
v if v.is_special_function() => {
|
v if v.is_special_function() => {
|
||||||
return Ok(Value::Ident(
|
return Ok(Value::Ident(
|
||||||
format!(
|
format!(
|
||||||
"rgb({}, {}, {}, {})",
|
"{}({}, {}, {}, {})",
|
||||||
|
name,
|
||||||
color.red(),
|
color.red(),
|
||||||
color.green(),
|
color.green(),
|
||||||
color.blue(),
|
color.blue(),
|
||||||
@ -186,7 +197,8 @@ fn rgb(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResu
|
|||||||
let green = arg!(args, scope, super_selector, 1, "green");
|
let green = arg!(args, scope, super_selector, 1, "green");
|
||||||
let blue = arg!(args, scope, super_selector, 2, "blue");
|
let blue = arg!(args, scope, super_selector, 2, "blue");
|
||||||
let mut string = format!(
|
let mut string = format!(
|
||||||
"rgb({}, {}, {}",
|
"{}({}, {}, {}",
|
||||||
|
name,
|
||||||
v.to_css_string(args.span())?,
|
v.to_css_string(args.span())?,
|
||||||
green.to_css_string(args.span())?,
|
green.to_css_string(args.span())?,
|
||||||
blue.to_css_string(args.span())?
|
blue.to_css_string(args.span())?
|
||||||
@ -225,7 +237,8 @@ fn rgb(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResu
|
|||||||
v if v.is_special_function() => {
|
v if v.is_special_function() => {
|
||||||
let blue = arg!(args, scope, super_selector, 2, "blue");
|
let blue = arg!(args, scope, super_selector, 2, "blue");
|
||||||
let mut string = format!(
|
let mut string = format!(
|
||||||
"rgb({}, {}, {}",
|
"{}({}, {}, {}",
|
||||||
|
name,
|
||||||
red,
|
red,
|
||||||
v.to_css_string(args.span())?,
|
v.to_css_string(args.span())?,
|
||||||
blue.to_css_string(args.span())?
|
blue.to_css_string(args.span())?
|
||||||
@ -262,8 +275,13 @@ fn rgb(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResu
|
|||||||
.into())
|
.into())
|
||||||
}
|
}
|
||||||
v if v.is_special_function() => {
|
v if v.is_special_function() => {
|
||||||
let mut string =
|
let mut string = format!(
|
||||||
format!("rgb({}, {}, {}", red, green, v.to_css_string(args.span())?);
|
"{}({}, {}, {}",
|
||||||
|
name,
|
||||||
|
red,
|
||||||
|
green,
|
||||||
|
v.to_css_string(args.span())?
|
||||||
|
);
|
||||||
if !args.is_empty() {
|
if !args.is_empty() {
|
||||||
string.push_str(", ");
|
string.push_str(", ");
|
||||||
string.push_str(
|
string.push_str(
|
||||||
@ -303,7 +321,8 @@ fn rgb(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResu
|
|||||||
}
|
}
|
||||||
v if v.is_special_function() => {
|
v if v.is_special_function() => {
|
||||||
let string = format!(
|
let string = format!(
|
||||||
"rgb({}, {}, {}, {})",
|
"{}({}, {}, {}, {})",
|
||||||
|
name,
|
||||||
red,
|
red,
|
||||||
green,
|
green,
|
||||||
blue,
|
blue,
|
||||||
@ -325,317 +344,12 @@ fn rgb(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rgba(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
|
fn rgb(args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
|
||||||
if args.is_empty() {
|
inner_rgb("rgb", args, scope, super_selector)
|
||||||
return Err(("Missing argument $channels.", args.span()).into());
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if args.len() == 1 {
|
fn rgba(args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
|
||||||
let mut channels = match arg!(args, scope, super_selector, 0, "channels") {
|
inner_rgb("rgba", args, scope, super_selector)
|
||||||
Value::List(v, ..) => v,
|
|
||||||
_ => return Err(("Missing argument $channels.", args.span()).into()),
|
|
||||||
};
|
|
||||||
|
|
||||||
if channels.len() > 3 {
|
|
||||||
return Err((
|
|
||||||
format!(
|
|
||||||
"Only 3 elements allowed, but {} were passed.",
|
|
||||||
channels.len()
|
|
||||||
),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into());
|
|
||||||
}
|
|
||||||
|
|
||||||
let blue = match channels.pop() {
|
|
||||||
Some(Value::Dimension(n, Unit::None)) => n,
|
|
||||||
Some(Value::Dimension(n, Unit::Percent)) => (n / Number::from(100)) * Number::from(255),
|
|
||||||
Some(v) if v.is_special_function() => {
|
|
||||||
let green = channels.pop().unwrap();
|
|
||||||
let red = channels.pop().unwrap();
|
|
||||||
return Ok(Value::Ident(
|
|
||||||
format!(
|
|
||||||
"rgba({}, {}, {})",
|
|
||||||
red.to_css_string(args.span())?,
|
|
||||||
green.to_css_string(args.span())?,
|
|
||||||
v.to_css_string(args.span())?
|
|
||||||
),
|
|
||||||
QuoteKind::None,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
Some(v) => {
|
|
||||||
return Err((
|
|
||||||
format!("$blue: {} is not a number.", v.to_css_string(args.span())?),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into())
|
|
||||||
}
|
|
||||||
None => return Err(("Missing element $blue.", args.span()).into()),
|
|
||||||
};
|
|
||||||
|
|
||||||
let green = match channels.pop() {
|
|
||||||
Some(Value::Dimension(n, Unit::None)) => n,
|
|
||||||
Some(Value::Dimension(n, Unit::Percent)) => (n / Number::from(100)) * Number::from(255),
|
|
||||||
Some(v) if v.is_special_function() => {
|
|
||||||
let string = match channels.pop() {
|
|
||||||
Some(red) => format!(
|
|
||||||
"rgba({}, {}, {})",
|
|
||||||
red.to_css_string(args.span())?,
|
|
||||||
v.to_css_string(args.span())?,
|
|
||||||
blue
|
|
||||||
),
|
|
||||||
None => format!("rgba({} {})", v.to_css_string(args.span())?, blue),
|
|
||||||
};
|
|
||||||
return Ok(Value::Ident(string, QuoteKind::None));
|
|
||||||
}
|
|
||||||
Some(v) => {
|
|
||||||
return Err((
|
|
||||||
format!("$green: {} is not a number.", v.to_css_string(args.span())?),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into())
|
|
||||||
}
|
|
||||||
None => return Err(("Missing element $green.", args.span()).into()),
|
|
||||||
};
|
|
||||||
|
|
||||||
let red = match channels.pop() {
|
|
||||||
Some(Value::Dimension(n, Unit::None)) => n,
|
|
||||||
Some(Value::Dimension(n, Unit::Percent)) => (n / Number::from(100)) * Number::from(255),
|
|
||||||
Some(v) if v.is_special_function() => {
|
|
||||||
return Ok(Value::Ident(
|
|
||||||
format!(
|
|
||||||
"rgba({}, {}, {})",
|
|
||||||
v.to_css_string(args.span())?,
|
|
||||||
green,
|
|
||||||
blue
|
|
||||||
),
|
|
||||||
QuoteKind::None,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
Some(v) => {
|
|
||||||
return Err((
|
|
||||||
format!("$red: {} is not a number.", v.to_css_string(args.span())?),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into())
|
|
||||||
}
|
|
||||||
None => return Err(("Missing element $red.", args.span()).into()),
|
|
||||||
};
|
|
||||||
|
|
||||||
let color = Color::from_rgba(red, green, blue, Number::one());
|
|
||||||
|
|
||||||
Ok(Value::Color(Box::new(color)))
|
|
||||||
} else if args.len() == 2 {
|
|
||||||
let color = match arg!(args, scope, super_selector, 0, "color") {
|
|
||||||
Value::Color(c) => c,
|
|
||||||
v if v.is_special_function() => {
|
|
||||||
let alpha = arg!(args, scope, super_selector, 1, "alpha");
|
|
||||||
return Ok(Value::Ident(
|
|
||||||
format!(
|
|
||||||
"rgba({}, {})",
|
|
||||||
v.to_css_string(args.span())?,
|
|
||||||
alpha.to_css_string(args.span())?
|
|
||||||
),
|
|
||||||
QuoteKind::None,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
v => {
|
|
||||||
return Err((
|
|
||||||
format!("$color: {} is not a color.", v.to_css_string(args.span())?),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into())
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let alpha = match arg!(args, scope, super_selector, 1, "alpha") {
|
|
||||||
Value::Dimension(n, Unit::None) => n,
|
|
||||||
Value::Dimension(n, Unit::Percent) => n / Number::from(100),
|
|
||||||
v @ Value::Dimension(..) => {
|
|
||||||
return Err((
|
|
||||||
format!(
|
|
||||||
"$alpha: Expected {} to have no units or \"%\".",
|
|
||||||
v.to_css_string(args.span())?
|
|
||||||
),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into())
|
|
||||||
}
|
|
||||||
v if v.is_special_function() => {
|
|
||||||
return Ok(Value::Ident(
|
|
||||||
format!(
|
|
||||||
"rgba({}, {}, {}, {})",
|
|
||||||
color.red(),
|
|
||||||
color.green(),
|
|
||||||
color.blue(),
|
|
||||||
v.to_css_string(args.span())?
|
|
||||||
),
|
|
||||||
QuoteKind::None,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
v => {
|
|
||||||
return Err((
|
|
||||||
format!("$alpha: {} is not a number.", v.to_css_string(args.span())?),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into())
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Ok(Value::Color(Box::new(color.with_alpha(alpha))))
|
|
||||||
} else {
|
|
||||||
let red = match arg!(args, scope, super_selector, 0, "red") {
|
|
||||||
Value::Dimension(n, Unit::None) => n,
|
|
||||||
Value::Dimension(n, Unit::Percent) => (n / Number::from(100)) * Number::from(255),
|
|
||||||
v @ Value::Dimension(..) => {
|
|
||||||
return Err((
|
|
||||||
format!(
|
|
||||||
"$red: Expected {} to have no units or \"%\".",
|
|
||||||
v.to_css_string(args.span())?
|
|
||||||
),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into())
|
|
||||||
}
|
|
||||||
v if v.is_special_function() => {
|
|
||||||
let green = arg!(args, scope, super_selector, 1, "green");
|
|
||||||
let blue = arg!(args, scope, super_selector, 2, "blue");
|
|
||||||
let mut string = format!(
|
|
||||||
"rgba({}, {}, {}",
|
|
||||||
v.to_css_string(args.span())?,
|
|
||||||
green.to_css_string(args.span())?,
|
|
||||||
blue.to_css_string(args.span())?
|
|
||||||
);
|
|
||||||
if !args.is_empty() {
|
|
||||||
string.push_str(", ");
|
|
||||||
string.push_str(
|
|
||||||
&arg!(args, scope, super_selector, 3, "alpha")
|
|
||||||
.to_css_string(args.span())?,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
string.push(')');
|
|
||||||
return Ok(Value::Ident(string, QuoteKind::None));
|
|
||||||
}
|
|
||||||
v => {
|
|
||||||
return Err((
|
|
||||||
format!("$red: {} is not a number.", v.to_css_string(args.span())?),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into())
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let green = match arg!(args, scope, super_selector, 1, "green") {
|
|
||||||
Value::Dimension(n, Unit::None) => n,
|
|
||||||
Value::Dimension(n, Unit::Percent) => (n / Number::from(100)) * Number::from(255),
|
|
||||||
v @ Value::Dimension(..) => {
|
|
||||||
return Err((
|
|
||||||
format!(
|
|
||||||
"$green: Expected {} to have no units or \"%\".",
|
|
||||||
v.to_css_string(args.span())?
|
|
||||||
),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into())
|
|
||||||
}
|
|
||||||
v if v.is_special_function() => {
|
|
||||||
let blue = arg!(args, scope, super_selector, 2, "blue");
|
|
||||||
let mut string = format!(
|
|
||||||
"rgba({}, {}, {}",
|
|
||||||
red,
|
|
||||||
v.to_css_string(args.span())?,
|
|
||||||
blue.to_css_string(args.span())?
|
|
||||||
);
|
|
||||||
if !args.is_empty() {
|
|
||||||
string.push_str(", ");
|
|
||||||
string.push_str(
|
|
||||||
&arg!(args, scope, super_selector, 3, "alpha")
|
|
||||||
.to_css_string(args.span())?,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
string.push(')');
|
|
||||||
return Ok(Value::Ident(string, QuoteKind::None));
|
|
||||||
}
|
|
||||||
v => {
|
|
||||||
return Err((
|
|
||||||
format!("$green: {} is not a number.", v.to_css_string(args.span())?),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into())
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let blue = match arg!(args, scope, super_selector, 2, "blue") {
|
|
||||||
Value::Dimension(n, Unit::None) => n,
|
|
||||||
Value::Dimension(n, Unit::Percent) => (n / Number::from(100)) * Number::from(255),
|
|
||||||
v @ Value::Dimension(..) => {
|
|
||||||
return Err((
|
|
||||||
format!(
|
|
||||||
"$blue: Expected {} to have no units or \"%\".",
|
|
||||||
v.to_css_string(args.span())?
|
|
||||||
),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into())
|
|
||||||
}
|
|
||||||
v if v.is_special_function() => {
|
|
||||||
let mut string =
|
|
||||||
format!("rgba({}, {}, {}", red, green, v.to_css_string(args.span())?);
|
|
||||||
if !args.is_empty() {
|
|
||||||
string.push_str(", ");
|
|
||||||
string.push_str(
|
|
||||||
&arg!(args, scope, super_selector, 3, "alpha")
|
|
||||||
.to_css_string(args.span())?,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
string.push(')');
|
|
||||||
return Ok(Value::Ident(string, QuoteKind::None));
|
|
||||||
}
|
|
||||||
v => {
|
|
||||||
return Err((
|
|
||||||
format!("$blue: {} is not a number.", v.to_css_string(args.span())?),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into())
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let alpha = match arg!(
|
|
||||||
args,
|
|
||||||
scope,
|
|
||||||
super_selector,
|
|
||||||
3,
|
|
||||||
"alpha" = Value::Dimension(Number::one(), Unit::None)
|
|
||||||
) {
|
|
||||||
Value::Dimension(n, Unit::None) => n,
|
|
||||||
Value::Dimension(n, Unit::Percent) => n / Number::from(100),
|
|
||||||
v @ Value::Dimension(..) => {
|
|
||||||
return Err((
|
|
||||||
format!(
|
|
||||||
"$alpha: Expected {} to have no units or \"%\".",
|
|
||||||
v.to_css_string(args.span())?
|
|
||||||
),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into())
|
|
||||||
}
|
|
||||||
v if v.is_special_function() => {
|
|
||||||
let string = format!(
|
|
||||||
"rgba({}, {}, {}, {})",
|
|
||||||
red,
|
|
||||||
green,
|
|
||||||
blue,
|
|
||||||
v.to_css_string(args.span())?
|
|
||||||
);
|
|
||||||
return Ok(Value::Ident(string, QuoteKind::None));
|
|
||||||
}
|
|
||||||
v => {
|
|
||||||
return Err((
|
|
||||||
format!("$alpha: {} is not a number.", v.to_css_string(args.span())?),
|
|
||||||
args.span(),
|
|
||||||
)
|
|
||||||
.into())
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Ok(Value::Color(Box::new(Color::from_rgba(
|
|
||||||
red, green, blue, alpha,
|
|
||||||
))))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn red(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
|
fn red(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user