mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
Auto merge of #8420 - craftytrickster:8371/generic-font-family, r=glennw
Enabled use of FontFamily enum type https://github.com/servo/servo/issues/8371 In addition to replacing loose strings with the FontFamily enum in `font_cache_task.rs`, I also centralized the add_generic_font calls into one single function. If centralizing into one function is not desired or if anything else needs to be changed, please let me know. <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/8420) <!-- Reviewable:end -->
This commit is contained in:
commit
66c8aa8cda
5 changed files with 122 additions and 89 deletions
|
@ -7,14 +7,13 @@ use cssparser::{AtRuleParser, DeclarationListParser, DeclarationParser, Parser};
|
|||
use parser::{ParserContext, log_css_error};
|
||||
use properties::longhands::font_family::parse_one_family;
|
||||
use std::ascii::AsciiExt;
|
||||
use string_cache::Atom;
|
||||
use url::Url;
|
||||
use util::mem::HeapSizeOf;
|
||||
|
||||
#[derive(Clone, Debug, HeapSizeOf, PartialEq, Eq, Deserialize, Serialize)]
|
||||
pub enum Source {
|
||||
Url(UrlSource),
|
||||
Local(Atom),
|
||||
Local(FontFamily),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, HeapSizeOf, PartialEq, Eq, Deserialize, Serialize)]
|
||||
|
@ -25,7 +24,7 @@ pub struct UrlSource {
|
|||
|
||||
#[derive(Debug, HeapSizeOf, PartialEq, Eq)]
|
||||
pub struct FontFaceRule {
|
||||
pub family: Atom,
|
||||
pub family: FontFamily,
|
||||
pub sources: Vec<Source>,
|
||||
}
|
||||
|
||||
|
@ -62,7 +61,7 @@ pub fn parse_font_face_block(context: &ParserContext, input: &mut Parser)
|
|||
}
|
||||
|
||||
enum FontFaceDescriptorDeclaration {
|
||||
Family(Atom),
|
||||
Family(FontFamily),
|
||||
Src(Vec<Source>),
|
||||
}
|
||||
|
||||
|
@ -86,7 +85,7 @@ impl<'a, 'b> DeclarationParser for FontFaceRuleParser<'a, 'b> {
|
|||
match_ignore_ascii_case! { name,
|
||||
"font-family" => {
|
||||
Ok(FontFaceDescriptorDeclaration::Family(try!(
|
||||
parse_one_non_generic_family_name(input))))
|
||||
parse_one_family(input))))
|
||||
},
|
||||
"src" => {
|
||||
Ok(FontFaceDescriptorDeclaration::Src(try!(input.parse_comma_separated(|input| {
|
||||
|
@ -98,17 +97,9 @@ impl<'a, 'b> DeclarationParser for FontFaceRuleParser<'a, 'b> {
|
|||
}
|
||||
}
|
||||
|
||||
fn parse_one_non_generic_family_name(input: &mut Parser) -> Result<Atom, ()> {
|
||||
match parse_one_family(input) {
|
||||
Ok(FontFamily::FamilyName(name)) => Ok(name.clone()),
|
||||
_ => Err(())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fn parse_one_src(context: &ParserContext, input: &mut Parser) -> Result<Source, ()> {
|
||||
if input.try(|input| input.expect_function_matching("local")).is_ok() {
|
||||
return Ok(Source::Local(try!(input.parse_nested_block(parse_one_non_generic_family_name))))
|
||||
return Ok(Source::Local(try!(input.parse_nested_block(parse_one_family))))
|
||||
}
|
||||
let url = try!(input.expect_url());
|
||||
let url = context.base_url.join(&url).unwrap_or_else(
|
||||
|
|
|
@ -1705,35 +1705,60 @@ pub mod longhands {
|
|||
use values::computed::ComputedValueAsSpecified;
|
||||
pub use self::computed_value::T as SpecifiedValue;
|
||||
|
||||
const SERIF: &'static str = "serif";
|
||||
const SANS_SERIF: &'static str = "sans-serif";
|
||||
const CURSIVE: &'static str = "cursive";
|
||||
const FANTASY: &'static str = "fantasy";
|
||||
const MONOSPACE: &'static str = "monospace";
|
||||
|
||||
impl ComputedValueAsSpecified for SpecifiedValue {}
|
||||
pub mod computed_value {
|
||||
use cssparser::ToCss;
|
||||
use std::fmt;
|
||||
use string_cache::Atom;
|
||||
|
||||
#[derive(Debug, PartialEq, Eq, Clone, Hash, HeapSizeOf)]
|
||||
#[derive(Debug, PartialEq, Eq, Clone, Hash, HeapSizeOf, Deserialize, Serialize)]
|
||||
pub enum FontFamily {
|
||||
FamilyName(Atom),
|
||||
// Generic
|
||||
// Serif,
|
||||
// SansSerif,
|
||||
// Cursive,
|
||||
// Fantasy,
|
||||
// Monospace,
|
||||
// Generic,
|
||||
Serif,
|
||||
SansSerif,
|
||||
Cursive,
|
||||
Fantasy,
|
||||
Monospace,
|
||||
}
|
||||
impl FontFamily {
|
||||
#[inline]
|
||||
pub fn name(&self) -> &str {
|
||||
match *self {
|
||||
FontFamily::FamilyName(ref name) => &*name,
|
||||
FontFamily::Serif => super::SERIF,
|
||||
FontFamily::SansSerif => super::SANS_SERIF,
|
||||
FontFamily::Cursive => super::CURSIVE,
|
||||
FontFamily::Fantasy => super::FANTASY,
|
||||
FontFamily::Monospace => super::MONOSPACE
|
||||
}
|
||||
}
|
||||
|
||||
pub fn from_atom(input: Atom) -> FontFamily {
|
||||
let option = match_ignore_ascii_case! { &input,
|
||||
super::SERIF => Some(FontFamily::Serif),
|
||||
super::SANS_SERIF => Some(FontFamily::SansSerif),
|
||||
super::CURSIVE => Some(FontFamily::Cursive),
|
||||
super::FANTASY => Some(FontFamily::Fantasy),
|
||||
super::MONOSPACE => Some(FontFamily::Monospace)
|
||||
_ => None
|
||||
};
|
||||
|
||||
match option {
|
||||
Some(family) => family,
|
||||
None => FontFamily::FamilyName(input)
|
||||
}
|
||||
}
|
||||
}
|
||||
impl ToCss for FontFamily {
|
||||
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
|
||||
match *self {
|
||||
FontFamily::FamilyName(ref name) => dest.write_str(&*name),
|
||||
}
|
||||
dest.write_str(self.name())
|
||||
}
|
||||
}
|
||||
impl ToCss for T {
|
||||
|
@ -1753,7 +1778,7 @@ pub mod longhands {
|
|||
|
||||
#[inline]
|
||||
pub fn get_initial_value() -> computed_value::T {
|
||||
computed_value::T(vec![FontFamily::FamilyName(atom!("serif"))])
|
||||
computed_value::T(vec![FontFamily::Serif])
|
||||
}
|
||||
/// <family-name>#
|
||||
/// <family-name> = <string> | [ <ident>+ ]
|
||||
|
@ -1766,14 +1791,15 @@ pub mod longhands {
|
|||
return Ok(FontFamily::FamilyName(Atom::from(&*value)))
|
||||
}
|
||||
let first_ident = try!(input.expect_ident());
|
||||
// match_ignore_ascii_case! { first_ident,
|
||||
// "serif" => return Ok(Serif),
|
||||
// "sans-serif" => return Ok(SansSerif),
|
||||
// "cursive" => return Ok(Cursive),
|
||||
// "fantasy" => return Ok(Fantasy),
|
||||
// "monospace" => return Ok(Monospace)
|
||||
// _ => {}
|
||||
// }
|
||||
|
||||
match_ignore_ascii_case! { first_ident,
|
||||
SERIF => return Ok(FontFamily::Serif),
|
||||
SANS_SERIF => return Ok(FontFamily::SansSerif),
|
||||
CURSIVE => return Ok(FontFamily::Cursive),
|
||||
FANTASY => return Ok(FontFamily::Fantasy),
|
||||
MONOSPACE => return Ok(FontFamily::Monospace)
|
||||
_ => {}
|
||||
}
|
||||
let mut value = first_ident.into_owned();
|
||||
while let Ok(ident) = input.try(|input| input.expect_ident()) {
|
||||
value.push_str(" ");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue