From 10827f160ba43f6b66e859325fca07db242f1d7d Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 8 Aug 2013 17:10:51 +0100 Subject: [PATCH 01/29] Initial pass at a stylesheet and selector parser --- .gitignore | 8 +++ Makefile.in | 32 +++++++++++ configure | 4 ++ properties.rs | 12 ++++ selectors.rs | 151 +++++++++++++++++++++++++++++++++++++++++++++++++ servo-style.rc | 25 ++++++++ stylesheets.rs | 58 +++++++++++++++++++ 7 files changed, 290 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile.in create mode 100755 configure create mode 100644 properties.rs create mode 100644 selectors.rs create mode 100644 servo-style.rc create mode 100644 stylesheets.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000000..504bab8100a --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +*.o +*.a +*.so +*.dylib +*.dll +*.dummy +*-test +Makefile diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 00000000000..ba8c321ade9 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,32 @@ +VPATH=%VPATH% + +CC ?= gcc +CXX ?= g++ +CXXFLAGS ?= +AR ?= ar +RUSTC ?= rustc +RUSTFLAGS ?= + +RUST_SRC=$(shell find $(VPATH)/. -type f -name '*.rs') + +.PHONY: all +all: libservo-style.dummy + +libservo-style.dummy: servo-style.rc $(RUST_SRC) + $(RUSTC) $(RUSTFLAGS) $< + touch $@ + +servo-style-test: servo-style.rc $(RUST_SRC) + $(RUSTC) $(RUSTFLAGS) $< -o $@ --test + +.PHONY: check +check: servo-style-test + ./servo-style-test + +.PHONY: check-debug +check-debug: servo-style-tests + echo -e "start\n break upcall_fail\n continue\n where\n continue" | gdb -q ./servo-style-tests + +.PHONY: clean +clean: + rm -f *.o *.a *.so *.dylib *.dll *.dummy *-test diff --git a/configure b/configure new file mode 100755 index 00000000000..62a0f4cd3e6 --- /dev/null +++ b/configure @@ -0,0 +1,4 @@ +#!/bin/bash + +SRCDIR="$(cd $(dirname $0) && pwd)" +sed "s#%VPATH%#${SRCDIR}#" ${SRCDIR}/Makefile.in > Makefile diff --git a/properties.rs b/properties.rs new file mode 100644 index 00000000000..f10e8870de9 --- /dev/null +++ b/properties.rs @@ -0,0 +1,12 @@ +use cssparser::*; + + +pub struct PropertyDeclaration; // TODO + + +pub fn parse_property_declaration_list(input: &[Node]) -> ~[PropertyDeclaration] { + let _ = input; + ~[] +} + + diff --git a/selectors.rs b/selectors.rs new file mode 100644 index 00000000000..8407d61eb20 --- /dev/null +++ b/selectors.rs @@ -0,0 +1,151 @@ +use cssparser::*; + + +pub struct Selector { + compound_selectors: CompoundSelector, + pseudo_element: PseudoElement, + specificity: u32, +} + +pub enum PseudoElement { + Element, // No pseudo-element + Before, + After, + FirstLine, + FirstLetter, +} + + +pub struct CompoundSelector { + simple_selectors: ~[SimpleSelector], + next: Option<(~CompoundSelector, Combinator)>, // c.next is left of c +} + +pub enum Combinator { + Child, // > + Descendant, // space + NextSibling, // + + LaterSibling, // ~ +} + +pub enum SimpleSelector { + IDSelector(~str), + ClassSelector(~str), + LocalNameSelector{lowercase_name: ~str, cased_name: ~str}, +// NamespaceSelector(Namespace) + + // Attribute selectors + AttrExists(AttrSelector), // [foo] + AttrEqual(AttrSelector, ~str), // [foo=bar] + AttrIncludes(AttrSelector, ~str), // [foo~=bar] + AttrDashMatch(AttrSelector, ~str), // [foo|=bar] + AttrPrefixMatch(AttrSelector, ~str), // [foo^=bar] + AttrSubstringMatch(AttrSelector, ~str), // [foo*=bar] + AttrSuffixMatch(AttrSelector, ~str), // [foo$=bar] + + // Pseudo-classes +// Empty, +// Root, +// Lang(~str), +// NthChild(u32, u32), +// NthLastChild(u32, u32), +// NthOfType(u32, u32), +// NthLastOfType(u32, u32), +// Lang(~str), +// Negation(~Selector), + // ... +} + +pub struct AttrSelector { + lowercase_name: ~str, + cased_name: ~str, +// namespace: Option<~str>, +} + + +pub fn parse_selector_list(input: &[ComponentValue]) -> Option<~[Selector]> { + let len = input.len(); + let (first, pos) = match parse_selector(input, 0) { + None => return None, + Some(result) => result + }; + let mut results = ~[first]; + let mut pos = pos; + + loop { + pos = skip_whitespace(input, pos); + if pos >= len { break } // EOF + if input[pos] != Comma { return None } + pos = skip_whitespace(input, pos); + match parse_selector(input, pos) { + None => return None, + Some((selector, next_pos)) => { + results.push(selector); + pos = next_pos; + } + } + } + Some(results) +} + + +fn parse_selector(input: &[ComponentValue], pos: uint) -> Option<(Selector, uint)> { + let len = input.len(); + let (first, pos) = match parse_simple_selectors(input, pos) { + None => return None, + Some(result) => result + }; + let mut compound = CompoundSelector{ simple_selectors: first, next: None }; + let mut pos = pos; + + loop { + let pre_whitespace_pos = pos; + pos = skip_whitespace(input, pos); + if pos >= len { break } // EOF + let combinator = match input[pos] { + Delim('>') => { pos += 1; Child }, + Delim('+') => { pos += 1; NextSibling }, + Delim('~') => { pos += 1; LaterSibling }, + _ => { + if pos > pre_whitespace_pos { Descendant } + else { return None } + } + }; + pos = skip_whitespace(input, pos); + match parse_simple_selectors(input, pos) { + None => return None, + Some((simple_selectors, next_pos)) => { + compound = CompoundSelector { + simple_selectors: simple_selectors, + next: Some((~compound, combinator)) + }; + pos = next_pos; + } + } + } + let selector = Selector{ + compound_selectors: compound, + pseudo_element: Element, + specificity: 0, // TODO + }; + Some((selector, pos)) +} + + +fn parse_simple_selectors(input: &[ComponentValue], pos: uint) + -> Option<(~[SimpleSelector], uint)> { + let _ = input; + let _ = pos; + None // TODO +} + + +#[inline] +fn skip_whitespace(input: &[ComponentValue], mut pos: uint) -> uint { + let len = input.len(); + while pos < len { + if input[pos] == WhiteSpace { break } + pos += 1; + } + pos +} diff --git a/servo-style.rc b/servo-style.rc new file mode 100644 index 00000000000..60cf87b0e8f --- /dev/null +++ b/servo-style.rc @@ -0,0 +1,25 @@ +#[link(name = "servo-style", vers = "0.1")]; +#[crate_type = "lib"]; + +extern mod extra; + +#[path = "../rust-cssparser/ast.rs"] +mod ast; +#[path = "../rust-cssparser/tokenizer.rs"] +mod tokenizer; +#[path = "../rust-cssparser/parser.rs"] +mod syntax; +#[path = "../rust-cssparser/color.rs"] +mod color; + + +mod cssparser { + pub use super::ast::*; + pub use super::tokenizer::*; + pub use super::syntax::*; +} + + +pub mod stylesheets; +pub mod selectors; +pub mod properties; diff --git a/stylesheets.rs b/stylesheets.rs new file mode 100644 index 00000000000..7f27be155bd --- /dev/null +++ b/stylesheets.rs @@ -0,0 +1,58 @@ +use std::iterator::Iterator; +use cssparser::*; +use selectors; +use properties; + + +struct Stylesheet { + style_rules: ~[StyleRule], +} + + +struct StyleRule { + selectors: ~[selectors::Selector], + declarations: ~[properties::PropertyDeclaration], +} + + +fn parse_stylesheet(css: &str) -> Stylesheet { + let mut rules = ~[]; + for rule in ErrorLogger(parse_stylesheet_rules(tokenize(css))) { + match rule { + AtRule(rule) => { + log_css_error(fmt!("Unsupported at-rule: @%s", rule.name)) + }, + QualifiedRule(rule) => { + match selectors::parse_selector_list(rule.prelude) { + Some(selectors) => rules.push(StyleRule{ + selectors: selectors, + declarations: properties::parse_property_declaration_list(rule.block) + }), + None => log_css_error("Unsupported CSS selector."), + } + }, + } + } + Stylesheet{ style_rules: rules } +} + + +struct ErrorLogger(I); + +impl>> Iterator for ErrorLogger { + fn next(&mut self) -> Option { + for result in **self { + match result { + Ok(v) => return Some(v), + Err(e) => log_css_error(fmt!("%?", e)) + } + } + None + } +} + + +fn log_css_error(message: &str) { + // TODO eventually this will got into a "web console" or something. + info!(message) +} From 9512d13cbba00173d3e36b9c0b16e4167d354024 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 8 Aug 2013 18:08:14 +0100 Subject: [PATCH 02/29] Parse @namespace rules. --- selectors.rs | 18 +++++---- stylesheets.rs | 105 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 106 insertions(+), 17 deletions(-) diff --git a/selectors.rs b/selectors.rs index 8407d61eb20..b13bd30e5db 100644 --- a/selectors.rs +++ b/selectors.rs @@ -1,4 +1,5 @@ use cssparser::*; +use stylesheets::NamespaceMap; pub struct Selector { @@ -63,9 +64,10 @@ pub struct AttrSelector { } -pub fn parse_selector_list(input: &[ComponentValue]) -> Option<~[Selector]> { +pub fn parse_selector_list(input: &[ComponentValue], namespaces: &NamespaceMap) + -> Option<~[Selector]> { let len = input.len(); - let (first, pos) = match parse_selector(input, 0) { + let (first, pos) = match parse_selector(input, 0, namespaces) { None => return None, Some(result) => result }; @@ -77,7 +79,7 @@ pub fn parse_selector_list(input: &[ComponentValue]) -> Option<~[Selector]> { if pos >= len { break } // EOF if input[pos] != Comma { return None } pos = skip_whitespace(input, pos); - match parse_selector(input, pos) { + match parse_selector(input, pos, namespaces) { None => return None, Some((selector, next_pos)) => { results.push(selector); @@ -89,9 +91,10 @@ pub fn parse_selector_list(input: &[ComponentValue]) -> Option<~[Selector]> { } -fn parse_selector(input: &[ComponentValue], pos: uint) -> Option<(Selector, uint)> { +fn parse_selector(input: &[ComponentValue], pos: uint, namespaces: &NamespaceMap) + -> Option<(Selector, uint)> { let len = input.len(); - let (first, pos) = match parse_simple_selectors(input, pos) { + let (first, pos) = match parse_simple_selectors(input, pos, namespaces) { None => return None, Some(result) => result }; @@ -112,7 +115,7 @@ fn parse_selector(input: &[ComponentValue], pos: uint) -> Option<(Selector, uint } }; pos = skip_whitespace(input, pos); - match parse_simple_selectors(input, pos) { + match parse_simple_selectors(input, pos, namespaces) { None => return None, Some((simple_selectors, next_pos)) => { compound = CompoundSelector { @@ -132,10 +135,11 @@ fn parse_selector(input: &[ComponentValue], pos: uint) -> Option<(Selector, uint } -fn parse_simple_selectors(input: &[ComponentValue], pos: uint) +fn parse_simple_selectors(input: &[ComponentValue], pos: uint, namespaces: &NamespaceMap) -> Option<(~[SimpleSelector], uint)> { let _ = input; let _ = pos; + let _ = namespaces; None // TODO } diff --git a/stylesheets.rs b/stylesheets.rs index 7f27be155bd..fefc4acff3b 100644 --- a/stylesheets.rs +++ b/stylesheets.rs @@ -1,50 +1,135 @@ use std::iterator::Iterator; +use std::hashmap::HashMap; +use std::ascii::to_ascii_lower; use cssparser::*; use selectors; use properties; -struct Stylesheet { +pub struct Stylesheet { style_rules: ~[StyleRule], + namespaces: NamespaceMap, } -struct StyleRule { +pub struct StyleRule { selectors: ~[selectors::Selector], declarations: ~[properties::PropertyDeclaration], } +pub struct NamespaceMap { + default: Option<~str>, // Optional URL + prefix_map: HashMap<~str, ~str>, // prefix -> URL +} + fn parse_stylesheet(css: &str) -> Stylesheet { + static STATE_CHARSET: uint = 1; + static STATE_IMPORTS: uint = 2; + static STATE_NAMESPACES: uint = 3; + static STATE_BODY: uint = 4; + let mut state: uint = STATE_CHARSET; + let mut rules = ~[]; + let mut namespaces = NamespaceMap { default: None, prefix_map: HashMap::new() }; + for rule in ErrorLogger(parse_stylesheet_rules(tokenize(css))) { match rule { AtRule(rule) => { - log_css_error(fmt!("Unsupported at-rule: @%s", rule.name)) + let name = to_ascii_lower(rule.name); + if "charset" == name { + if state > STATE_CHARSET { log_css_error(rule.location, + "@charset must be the first rule") } + // Valid @charset rules are just ignored + loop; + } + if "import" == name { + if state > STATE_IMPORTS { log_css_error( + rule.location, "@import must be before any rule but @charset") } + else { + state = STATE_IMPORTS; + log_css_error(rule.location, "@import is not supported yet") // TODO + } + loop; + } + if "namespace" == name { + if state > STATE_NAMESPACES { log_css_error(rule.location, + "@namespace must be before any rule but @charset and @import") } + else { + state = STATE_NAMESPACES; + let location = rule.location; + if !parse_namespace_rule(rule, &mut namespaces) { + log_css_error(location, "Invalid @namespace rule") + } + } + loop; + } + state = STATE_BODY; + log_css_error(rule.location, fmt!("Unsupported at-rule: @%s", name)) }, QualifiedRule(rule) => { - match selectors::parse_selector_list(rule.prelude) { + state = STATE_BODY; + match selectors::parse_selector_list(rule.prelude, &namespaces) { Some(selectors) => rules.push(StyleRule{ selectors: selectors, declarations: properties::parse_property_declaration_list(rule.block) }), - None => log_css_error("Unsupported CSS selector."), + None => log_css_error(rule.location, "Unsupported CSS selector."), } }, } } - Stylesheet{ style_rules: rules } + Stylesheet{ style_rules: rules, namespaces: namespaces } +} + + +fn parse_namespace_rule(rule: AtRule, namespaces: &mut NamespaceMap) -> bool { + if rule.block.is_some() { return false } + let location = rule.location; + let mut prefix: Option<~str> = None; + let mut url: Option<~str> = None; + let mut iter = rule.prelude.consume_skip_whitespace(); + for component_value in iter { + match component_value { + Ident(value) => { + if prefix.is_some() { return false } + prefix = Some(value); + }, + URL(value) | String(value) => { + if url.is_some() { return false } + url = Some(value); + break + }, + _ => return false, + } + } + if iter.next().is_some() { return false } + match (prefix, url) { + (Some(prefix), Some(url)) => { + if namespaces.prefix_map.swap(prefix, url).is_some() { + log_css_error(location, "Duplicate @namespace rule"); + } + }, + (None, Some(url)) => { + if namespaces.default.is_some() { + log_css_error(location, "Duplicate @namespace rule"); + } + namespaces.default = Some(url); + }, + _ => return false + } + return true } struct ErrorLogger(I); -impl>> Iterator for ErrorLogger { +impl>> Iterator for ErrorLogger { fn next(&mut self) -> Option { for result in **self { match result { Ok(v) => return Some(v), - Err(e) => log_css_error(fmt!("%?", e)) + Err(error) => log_css_error(error.location, fmt!("%?", error.reason)) } } None @@ -52,7 +137,7 @@ impl>> Iterator for ErrorLogger { } -fn log_css_error(message: &str) { +fn log_css_error(location: SourceLocation, message: &str) { // TODO eventually this will got into a "web console" or something. - info!(message) + info!("%u:%u %s", location.line, location.column, message) } From 3f6a557578b681f8b3d6441f74dc11fe10ac3d5f Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 8 Aug 2013 23:33:15 +0100 Subject: [PATCH 03/29] Mostly complete, untested selector parser. --- selectors.rs | 388 +++++++++++++++++++++++++++++++++++++++++-------- stylesheets.rs | 8 +- 2 files changed, 335 insertions(+), 61 deletions(-) diff --git a/selectors.rs b/selectors.rs index b13bd30e5db..006a439f8cb 100644 --- a/selectors.rs +++ b/selectors.rs @@ -1,15 +1,16 @@ +use std::{vec, iterator}; +use std::ascii::to_ascii_lower; use cssparser::*; use stylesheets::NamespaceMap; pub struct Selector { compound_selectors: CompoundSelector, - pseudo_element: PseudoElement, - specificity: u32, + pseudo_element: Option, +// specificity: u32, } pub enum PseudoElement { - Element, // No pseudo-element Before, After, FirstLine, @@ -33,7 +34,7 @@ pub enum SimpleSelector { IDSelector(~str), ClassSelector(~str), LocalNameSelector{lowercase_name: ~str, cased_name: ~str}, -// NamespaceSelector(Namespace) + NamespaceSelector(~str), // Attribute selectors AttrExists(AttrSelector), // [foo] @@ -45,111 +46,384 @@ pub enum SimpleSelector { AttrSuffixMatch(AttrSelector, ~str), // [foo$=bar] // Pseudo-classes -// Empty, -// Root, -// Lang(~str), + Empty, + Root, + Lang(~str), // NthChild(u32, u32), // NthLastChild(u32, u32), // NthOfType(u32, u32), // NthLastOfType(u32, u32), -// Lang(~str), -// Negation(~Selector), + Negation(~[SimpleSelector]), // ... } pub struct AttrSelector { lowercase_name: ~str, cased_name: ~str, -// namespace: Option<~str>, + namespace: Option<~str>, } -pub fn parse_selector_list(input: &[ComponentValue], namespaces: &NamespaceMap) +type Iter = iterator::PeekableIterator>; + + +// None means invalid selector +pub fn parse_selector_list(input: ~[ComponentValue], namespaces: &NamespaceMap) -> Option<~[Selector]> { - let len = input.len(); - let (first, pos) = match parse_selector(input, 0, namespaces) { + let iter = &mut input.consume_iter().peekable(); + let first = match parse_selector(iter, namespaces) { None => return None, Some(result) => result }; let mut results = ~[first]; - let mut pos = pos; loop { - pos = skip_whitespace(input, pos); - if pos >= len { break } // EOF - if input[pos] != Comma { return None } - pos = skip_whitespace(input, pos); - match parse_selector(input, pos, namespaces) { + skip_whitespace(iter); + match iter.peek() { + None => break, // EOF + Some(&Comma) => (), + _ => return None, + } + match parse_selector(iter, namespaces) { + Some(selector) => results.push(selector), None => return None, - Some((selector, next_pos)) => { - results.push(selector); - pos = next_pos; - } } } Some(results) } -fn parse_selector(input: &[ComponentValue], pos: uint, namespaces: &NamespaceMap) - -> Option<(Selector, uint)> { - let len = input.len(); - let (first, pos) = match parse_simple_selectors(input, pos, namespaces) { +// None means invalid selector +fn parse_selector(iter: &mut Iter, namespaces: &NamespaceMap) + -> Option { + let (first, pseudo_element) = match parse_simple_selectors(iter, namespaces) { None => return None, Some(result) => result }; let mut compound = CompoundSelector{ simple_selectors: first, next: None }; - let mut pos = pos; + let mut pseudo_element = pseudo_element; - loop { - let pre_whitespace_pos = pos; - pos = skip_whitespace(input, pos); - if pos >= len { break } // EOF - let combinator = match input[pos] { - Delim('>') => { pos += 1; Child }, - Delim('+') => { pos += 1; NextSibling }, - Delim('~') => { pos += 1; LaterSibling }, - _ => { - if pos > pre_whitespace_pos { Descendant } + while pseudo_element.is_none() { + let any_whitespace = skip_whitespace(iter); + let combinator = match iter.peek() { + None => break, // EOF + Some(&Delim('>')) => { iter.next(); Child }, + Some(&Delim('+')) => { iter.next(); NextSibling }, + Some(&Delim('~')) => { iter.next(); LaterSibling }, + Some(_) => { + if any_whitespace { Descendant } else { return None } } }; - pos = skip_whitespace(input, pos); - match parse_simple_selectors(input, pos, namespaces) { + match parse_simple_selectors(iter, namespaces) { None => return None, - Some((simple_selectors, next_pos)) => { + Some((simple_selectors, pseudo)) => { compound = CompoundSelector { simple_selectors: simple_selectors, next: Some((~compound, combinator)) }; - pos = next_pos; + pseudo_element = pseudo; } } } let selector = Selector{ compound_selectors: compound, - pseudo_element: Element, - specificity: 0, // TODO + pseudo_element: pseudo_element, }; - Some((selector, pos)) + Some(selector) } -fn parse_simple_selectors(input: &[ComponentValue], pos: uint, namespaces: &NamespaceMap) - -> Option<(~[SimpleSelector], uint)> { - let _ = input; - let _ = pos; - let _ = namespaces; - None // TODO +// None means invalid selector +fn parse_simple_selectors(iter: &mut Iter, namespaces: &NamespaceMap) + -> Option<(~[SimpleSelector], Option)> { + let mut empty = true; + let mut simple_selectors = match parse_type_selector(iter, namespaces) { + None => return None, // invalid selector + Some(None) => ~[], + Some(Some(s)) => { empty = false; s } + }; + + let mut pseudo_element = None; + loop { + match parse_one_simple_selector(iter, namespaces, /* inside_negation = */ false) { + None => return None, // invalid selector + Some(None) => break, + Some(Some(Left(s))) => simple_selectors.push(s), + Some(Some(Right(p))) => { pseudo_element = Some(p); break }, + } + } + if empty { None } // An empty selector is invalid + else { Some((simple_selectors, pseudo_element)) } +} + + +// None means invalid selector +// Some(None) means no type selector +// Some(Some([...])) is a type selector. Might be empty for *|* +fn parse_type_selector(iter: &mut Iter, namespaces: &NamespaceMap) + -> Option> { + skip_whitespace(iter); + match parse_qualified_name(iter, /* allow_universal = */ true, namespaces) { + None => None, // invalid selector + Some(None) => Some(None), + Some(Some((namespace, local_name))) => { + let mut simple_selectors = ~[]; + match namespace { + Some(url) => simple_selectors.push(NamespaceSelector(url)), + None => (), + } + match local_name { + Some(name) => simple_selectors.push(LocalNameSelector{ + lowercase_name: to_ascii_lower(name), + cased_name: name, + }), + None => (), + } + Some(Some(simple_selectors)) + } + } +} + + +// Parse a simple selector other than a type selector +fn parse_one_simple_selector(iter: &mut Iter, namespaces: &NamespaceMap, inside_negation: bool) + -> Option>> { + match iter.peek() { + Some(&IDHash(_)) => match iter.next() { + Some(IDHash(id)) => Some(Some(Left(IDSelector(id)))), + _ => fail!("Implementation error, this should not happen."), + }, + Some(&Delim('.')) => { + iter.next(); + match iter.next() { + Some(Ident(class)) => Some(Some(Left(ClassSelector(class)))), + _ => None, // invalid selector + } + } + Some(&SquareBracketBlock(_)) => match iter.next() { + Some(SquareBracketBlock(content)) + => match parse_attribute_selector(content, namespaces) { + None => None, + Some(simple_selector) => Some(Some(Left(simple_selector))), + }, + _ => fail!("Implementation error, this should not happen."), + }, + Some(&Delim(':')) => { + iter.next(); + match iter.next() { + Some(Ident(name)) => match parse_simple_pseudo_class(name) { + None => None, + Some(result) => Some(Some(result)), + }, + Some(Function(name, arguments)) => match parse_functional_pseudo_class( + name, arguments, namespaces, inside_negation) { + None => None, + Some(simple_selector) => Some(Some(Left(simple_selector))), + }, + Some(Delim(':')) => { + match iter.next() { + Some(Ident(name)) => match parse_pseudo_element(name) { + Some(pseudo_element) => Some(Some(Right(pseudo_element))), + _ => None, + }, + _ => None, + } + } + _ => None, + } + } + _ => Some(None), + } +} + +// None means invalid selector +// Some(None) means not a qualified name +// Some(Some((None, None)) means *|* +// Some(Some((Some(url), None)) means prefix|* +// Some(Some((None, Some(name)) means *|name +// Some(Some((Some(url), Some(name))) means prefix|name +// ... or equivalent +fn parse_qualified_name(iter: &mut Iter, allow_universal: bool, namespaces: &NamespaceMap) + -> Option, Option<~str>)>> { + #[inline] + fn default_namespace(namespaces: &NamespaceMap, local_name: Option<~str>) + -> Option, Option<~str>)>> { + match namespaces.default { + None => Some(Some((None, local_name))), + Some(ref url) => Some(Some((Some(url.to_owned()), local_name))), + } + } + + #[inline] + fn explicit_namespace(iter: &mut Iter, allow_universal: bool, namespace_url: Option<~str>) + -> Option, Option<~str>)>> { + assert!(iter.next() == Some(Delim('|'))); + match iter.peek() { + Some(&Delim('*')) if allow_universal => { + iter.next(); + Some(Some((namespace_url, None))) + }, + Some(&Ident(_)) => { + let local_name = get_next_ident(iter); + Some(Some((namespace_url, Some(local_name)))) + }, + _ => None, // invalid selector + } + } + + match iter.peek() { + Some(&Ident(_)) => { + let value = get_next_ident(iter); + match iter.peek() { + Some(&Delim('|')) => default_namespace(namespaces, Some(value)), + _ => { + let namespace_url = match namespaces.prefix_map.find(&value) { + None => return None, // Undeclared namespace prefix: invalid selector + Some(ref url) => url.to_owned(), + }; + explicit_namespace(iter, allow_universal, Some(namespace_url)) + }, + } + }, + Some(&Delim('*')) => { + iter.next(); // Consume '*' + match iter.peek() { + Some(&Delim('|')) => { + if allow_universal { default_namespace(namespaces, None) } + else { None } + }, + _ => explicit_namespace(iter, allow_universal, None), + } + }, + Some(&Delim('|')) => explicit_namespace(iter, allow_universal, Some(~"")), + _ => return None, + } +} + + +fn parse_attribute_selector(content: ~[ComponentValue], namespaces: &NamespaceMap) + -> Option { + let iter = &mut content.consume_iter().peekable(); + let attr = match parse_qualified_name(iter, /* allow_universal = */ false, namespaces) { + None => return None, // invalid selector + Some(None) => return None, + Some(Some((_, None))) => fail!("Implementation error, this should not happen."), + Some(Some((namespace, Some(local_name)))) => AttrSelector { + namespace: namespace, + lowercase_name: to_ascii_lower(local_name), + cased_name: local_name, + }, + }; + skip_whitespace(iter); + macro_rules! get_value( () => {{ + skip_whitespace(iter); + match iter.next() { + Some(Ident(value)) | Some(String(value)) => value, + _ => return None, + } + }};) + let result = match iter.next() { + None => AttrExists(attr), // [foo] + Some(Delim('=')) => AttrEqual(attr, get_value!()), // [foo=bar] + Some(IncludeMatch) => AttrIncludes(attr, get_value!()), // [foo~=bar] + Some(DashMatch) => AttrDashMatch(attr, get_value!()), // [foo|=bar] + Some(PrefixMatch) => AttrPrefixMatch(attr, get_value!()), // [foo^=bar] + Some(SubstringMatch) => AttrSubstringMatch(attr, get_value!()), // [foo*=bar] + Some(SuffixMatch) => AttrSuffixMatch(attr, get_value!()), // [foo$=bar] + _ => return None + }; + skip_whitespace(iter); + if iter.next().is_none() { Some(result) } else { None } +} + + +fn parse_simple_pseudo_class(name: ~str) -> Option> { + let lower_name: &str = to_ascii_lower(name); + match lower_name { + "root" => Some(Left(Root)), + "empty" => Some(Left(Empty)), + + // Supported CSS 2.1 pseudo-elements only. + "before" => Some(Right(Before)), + "after" => Some(Right(After)), + "first-line" => Some(Right(FirstLine)), + "first-letter" => Some(Right(FirstLetter)), + _ => None + } +} + + +fn parse_functional_pseudo_class(name: ~str, arguments: ~[ComponentValue], + namespaces: &NamespaceMap, inside_negation: bool) + -> Option { + let lower_name: &str = to_ascii_lower(name); + match lower_name { + "lang" => parse_lang(arguments), + "not" => if inside_negation { None } else { parse_negation(arguments, namespaces) }, + _ => None + } +} + + +fn parse_pseudo_element(name: ~str) -> Option { + let lower_name: &str = to_ascii_lower(name); + match lower_name { + // All supported pseudo-elements + "before" => Some(Before), + "after" => Some(After), + "first-line" => Some(FirstLine), + "first-letter" => Some(FirstLetter), + _ => None + } +} + + +fn parse_lang(arguments: ~[ComponentValue]) -> Option { + let mut iter = arguments.consume_skip_whitespace(); + match iter.next() { + Some(Ident(value)) => { + if "" == value || iter.next().is_some() { None } + else { Some(Lang(value)) } + }, + _ => None, + } +} + + +// Level 3: Parse ONE simple_selector +fn parse_negation(arguments: ~[ComponentValue], namespaces: &NamespaceMap) + -> Option { + let iter = &mut arguments.consume_iter().peekable(); + Some(Negation(match parse_type_selector(iter, namespaces) { + None => return None, // invalid selector + Some(Some(s)) => s, + Some(None) => { + match parse_one_simple_selector(iter, namespaces, /* inside_negation = */ true) { + Some(Some(Left(s))) => ~[s], + _ => return None + } + }, + })) +} + + +/// Assuming the next token is an ident, consume it and return its value +#[inline] +fn get_next_ident(iter: &mut Iter) -> ~str { + match iter.next() { + Some(Ident(value)) => value, + _ => fail!("Implementation error, this should not happen."), + } } #[inline] -fn skip_whitespace(input: &[ComponentValue], mut pos: uint) -> uint { - let len = input.len(); - while pos < len { - if input[pos] == WhiteSpace { break } - pos += 1; +fn skip_whitespace(iter: &mut Iter) -> bool { + let mut any_whitespace = false; + loop { + if iter.peek() != Some(&WhiteSpace) { return any_whitespace } + any_whitespace = true; + iter.next(); } - pos } diff --git a/stylesheets.rs b/stylesheets.rs index fefc4acff3b..9c80ead8f47 100644 --- a/stylesheets.rs +++ b/stylesheets.rs @@ -67,14 +67,14 @@ fn parse_stylesheet(css: &str) -> Stylesheet { state = STATE_BODY; log_css_error(rule.location, fmt!("Unsupported at-rule: @%s", name)) }, - QualifiedRule(rule) => { + QualifiedRule(QualifiedRule{location: location, prelude: prelude, block: block}) => { state = STATE_BODY; - match selectors::parse_selector_list(rule.prelude, &namespaces) { + match selectors::parse_selector_list(prelude, &namespaces) { Some(selectors) => rules.push(StyleRule{ selectors: selectors, - declarations: properties::parse_property_declaration_list(rule.block) + declarations: properties::parse_property_declaration_list(block) }), - None => log_css_error(rule.location, "Unsupported CSS selector."), + None => log_css_error(location, "Unsupported CSS selector."), } }, } From af2f90fe74e54ed5a5ab27213256b2eff89fe053 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 9 Aug 2013 11:52:14 +0100 Subject: [PATCH 04/29] Stop the madness and use cssparser as an external lib / crate. See mozilla-servo/rust-cssparser@bb35329bd6afc5e592645d8e163b5d6d0e0d6f7f and mozilla/rust#7899 --- servo-style.rc | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/servo-style.rc b/servo-style.rc index 60cf87b0e8f..658c47c83bc 100644 --- a/servo-style.rc +++ b/servo-style.rc @@ -2,23 +2,7 @@ #[crate_type = "lib"]; extern mod extra; - -#[path = "../rust-cssparser/ast.rs"] -mod ast; -#[path = "../rust-cssparser/tokenizer.rs"] -mod tokenizer; -#[path = "../rust-cssparser/parser.rs"] -mod syntax; -#[path = "../rust-cssparser/color.rs"] -mod color; - - -mod cssparser { - pub use super::ast::*; - pub use super::tokenizer::*; - pub use super::syntax::*; -} - +extern mod cssparser; pub mod stylesheets; pub mod selectors; From cc302053edaad4b8cfbbe46e84e8ef1356de2a92 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 9 Aug 2013 11:54:29 +0100 Subject: [PATCH 05/29] Add selector specificity. --- selectors.rs | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/selectors.rs b/selectors.rs index 006a439f8cb..e28132364c5 100644 --- a/selectors.rs +++ b/selectors.rs @@ -7,9 +7,12 @@ use stylesheets::NamespaceMap; pub struct Selector { compound_selectors: CompoundSelector, pseudo_element: Option, -// specificity: u32, + specificity: u32, } +pub static STYLE_ATTRIBUTE_SPECIFICITY: u32 = 1 << 31; + + pub enum PseudoElement { Before, After, @@ -127,6 +130,7 @@ fn parse_selector(iter: &mut Iter, namespaces: &NamespaceMap) } } let selector = Selector{ + specificity: compute_specificity(&compound, &pseudo_element), compound_selectors: compound, pseudo_element: pseudo_element, }; @@ -134,6 +138,56 @@ fn parse_selector(iter: &mut Iter, namespaces: &NamespaceMap) } +fn compute_specificity(mut selector: &CompoundSelector, + pseudo_element: &Option) -> u32 { + struct Specificity { + id_selectors: u32, + class_like_selectors: u32, + element_selectors: u32, + } + let mut specificity = Specificity { + id_selectors: 0, + class_like_selectors: 0, + element_selectors: 0, + }; + if pseudo_element.is_some() { specificity.element_selectors += 1 } + + simple_selectors_specificity(selector.simple_selectors, &mut specificity); + loop { + match selector.next { + None => break, + Some((ref next_selector, _)) => { + selector = &**next_selector; + simple_selectors_specificity(selector.simple_selectors, &mut specificity) + } + } + } + + fn simple_selectors_specificity(simple_selectors: &[SimpleSelector], + specificity: &mut Specificity) { + for simple_selector in simple_selectors.iter() { + match simple_selector { + &LocalNameSelector{_} => specificity.element_selectors += 1, + &IDSelector(_) => specificity.id_selectors += 1, + &ClassSelector(_) + | &AttrExists(_) | &AttrEqual(_, _) | &AttrIncludes(_, _) | &AttrDashMatch(_, _) + | &AttrPrefixMatch(_, _) | &AttrSubstringMatch(_, _) | &AttrSuffixMatch(_, _) + | &Empty | &Root | &Lang(_) + => specificity.class_like_selectors += 1, + &NamespaceSelector(_) => (), + &Negation(ref negated) + => simple_selectors_specificity(negated.as_slice(), specificity), + } + } + } + + static MAX_10BIT: u32 = (1u32 << 10) - 1; + specificity.id_selectors.min(&MAX_10BIT) << 20 + | specificity.class_like_selectors.min(&MAX_10BIT) << 10 + | specificity.id_selectors.min(&MAX_10BIT) +} + + // None means invalid selector fn parse_simple_selectors(iter: &mut Iter, namespaces: &NamespaceMap) -> Option<(~[SimpleSelector], Option)> { From 1195759e7930359d35eaec3d598bc7f0b009ac50 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 9 Aug 2013 16:17:50 +0100 Subject: [PATCH 06/29] Makefile: rebuild when rust-cssparser changes. --- Makefile.in | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile.in b/Makefile.in index ba8c321ade9..f19332bac2d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,13 +1,15 @@ VPATH=%VPATH% +CSSPARSER_DIR ?= ../rust-cssparser CC ?= gcc CXX ?= g++ CXXFLAGS ?= AR ?= ar RUSTC ?= rustc -RUSTFLAGS ?= +RUSTFLAGS ?= -L $(CSSPARSER_DIR) -RUST_SRC=$(shell find $(VPATH)/. -type f -name '*.rs') + +RUST_SRC=$(shell find $(VPATH)/. -type f -name '*.rs') $(CSSPARSER_DIR)/libcssparser.dummy .PHONY: all all: libservo-style.dummy From bde1fcc7e98e94c2c2367a1f8fbd9b61ea1a2915 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 9 Aug 2013 16:21:28 +0100 Subject: [PATCH 07/29] Parse :nth-child() using an+b parsing from rust-cssparser. --- selectors.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/selectors.rs b/selectors.rs index e28132364c5..4e984124b64 100644 --- a/selectors.rs +++ b/selectors.rs @@ -52,10 +52,7 @@ pub enum SimpleSelector { Empty, Root, Lang(~str), -// NthChild(u32, u32), -// NthLastChild(u32, u32), -// NthOfType(u32, u32), -// NthLastOfType(u32, u32), + NthChild(i32, i32), Negation(~[SimpleSelector]), // ... } @@ -168,13 +165,13 @@ fn compute_specificity(mut selector: &CompoundSelector, for simple_selector in simple_selectors.iter() { match simple_selector { &LocalNameSelector{_} => specificity.element_selectors += 1, - &IDSelector(_) => specificity.id_selectors += 1, - &ClassSelector(_) - | &AttrExists(_) | &AttrEqual(_, _) | &AttrIncludes(_, _) | &AttrDashMatch(_, _) - | &AttrPrefixMatch(_, _) | &AttrSubstringMatch(_, _) | &AttrSuffixMatch(_, _) - | &Empty | &Root | &Lang(_) + &IDSelector(*) => specificity.id_selectors += 1, + &ClassSelector(*) + | &AttrExists(*) | &AttrEqual(*) | &AttrIncludes(*) | &AttrDashMatch(*) + | &AttrPrefixMatch(*) | &AttrSubstringMatch(*) | &AttrSuffixMatch(*) + | &Empty | &Root | &Lang(*) | &NthChild(*) => specificity.class_like_selectors += 1, - &NamespaceSelector(_) => (), + &NamespaceSelector(*) => (), &Negation(ref negated) => simple_selectors_specificity(negated.as_slice(), specificity), } @@ -414,6 +411,7 @@ fn parse_functional_pseudo_class(name: ~str, arguments: ~[ComponentValue], let lower_name: &str = to_ascii_lower(name); match lower_name { "lang" => parse_lang(arguments), + "nth-child" => parse_nth(arguments).map(|&(a, b)| NthChild(a, b)), "not" => if inside_negation { None } else { parse_negation(arguments, namespaces) }, _ => None } From ff1f4e62ec99100eaba7c048fcc37b70b42284de Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 9 Aug 2013 16:41:42 +0100 Subject: [PATCH 08/29] Add a license (MPL2) and readme. --- LICENSE | 373 +++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 10 ++ properties.rs | 6 +- selectors.rs | 4 + servo-style.rc | 4 + stylesheets.rs | 4 + 6 files changed, 399 insertions(+), 2 deletions(-) create mode 100644 LICENSE create mode 100644 README.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000000..14e2f777f6c --- /dev/null +++ b/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/README.md b/README.md new file mode 100644 index 00000000000..d03b333a0c9 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +servo-style +=========== + +Prototype replacement style system for Servo, +based on [rust-cssparser](https://github.com/mozilla-servo/rust-cssparser) +instead of [NetSurf’s libcss](https://github.com/mozilla-servo/libcss). + +This is meant to go into Servo’s `src/components/script/style` directory, +but is maintained here for now because I’m using a patched Rust. +(See [pull request](https://github.com/mozilla/rust/pull/8396).) diff --git a/properties.rs b/properties.rs index f10e8870de9..6c9bc62b67c 100644 --- a/properties.rs +++ b/properties.rs @@ -1,3 +1,7 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + use cssparser::*; @@ -8,5 +12,3 @@ pub fn parse_property_declaration_list(input: &[Node]) -> ~[PropertyDeclaration] let _ = input; ~[] } - - diff --git a/selectors.rs b/selectors.rs index 4e984124b64..ac7b859cc99 100644 --- a/selectors.rs +++ b/selectors.rs @@ -1,3 +1,7 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + use std::{vec, iterator}; use std::ascii::to_ascii_lower; use cssparser::*; diff --git a/servo-style.rc b/servo-style.rc index 658c47c83bc..c05eb1211c5 100644 --- a/servo-style.rc +++ b/servo-style.rc @@ -1,3 +1,7 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + #[link(name = "servo-style", vers = "0.1")]; #[crate_type = "lib"]; diff --git a/stylesheets.rs b/stylesheets.rs index 9c80ead8f47..fa04fc2843d 100644 --- a/stylesheets.rs +++ b/stylesheets.rs @@ -1,3 +1,7 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + use std::iterator::Iterator; use std::hashmap::HashMap; use std::ascii::to_ascii_lower; From 9b22acf2f3f6d6764f6a195834bc848c1a2e01af Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Sat, 10 Aug 2013 13:02:41 +0100 Subject: [PATCH 09/29] Factor out parsing of various types of rules. --- errors.rs | 26 ++++++++ namespaces.rs | 63 +++++++++++++++++++ selectors.rs | 4 +- servo-style.rc | 2 + stylesheets.rs | 161 ++++++++++++++++++------------------------------- 5 files changed, 152 insertions(+), 104 deletions(-) create mode 100644 errors.rs create mode 100644 namespaces.rs diff --git a/errors.rs b/errors.rs new file mode 100644 index 00000000000..7a64d0192dd --- /dev/null +++ b/errors.rs @@ -0,0 +1,26 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use cssparser::{SyntaxError, SourceLocation}; + + +pub struct ErrorLoggerIterator(I); + +impl>> Iterator for ErrorLoggerIterator { + pub fn next(&mut self) -> Option { + for result in **self { + match result { + Ok(v) => return Some(v), + Err(error) => log_css_error(error.location, fmt!("%?", error.reason)) + } + } + None + } +} + + +pub fn log_css_error(location: SourceLocation, message: &str) { + // TODO eventually this will got into a "web console" or something. + info!("%u:%u %s", location.line, location.column, message) +} diff --git a/namespaces.rs b/namespaces.rs new file mode 100644 index 00000000000..e9105abc7dc --- /dev/null +++ b/namespaces.rs @@ -0,0 +1,63 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use std::hashmap::HashMap; +use cssparser::*; +use errors::log_css_error; + +pub struct NamespaceMap { + default: Option<~str>, // Optional URL + prefix_map: HashMap<~str, ~str>, // prefix -> URL +} + + +impl NamespaceMap { + pub fn new() -> NamespaceMap { + NamespaceMap { default: None, prefix_map: HashMap::new() } + } +} + + +pub fn parse_namespace_rule(rule: AtRule, namespaces: &mut NamespaceMap) { + let location = rule.location; + macro_rules! syntax_error( + () => {{ + log_css_error(location, "Invalid @namespace rule"); + return + }}; + ); + if rule.block.is_some() { syntax_error!() } + let mut prefix: Option<~str> = None; + let mut url: Option<~str> = None; + let mut iter = rule.prelude.consume_skip_whitespace(); + for component_value in iter { + match component_value { + Ident(value) => { + if prefix.is_some() { syntax_error!() } + prefix = Some(value); + }, + URL(value) | String(value) => { + if url.is_some() { syntax_error!() } + url = Some(value); + break + }, + _ => syntax_error!(), + } + } + if iter.next().is_some() { syntax_error!() } + match (prefix, url) { + (Some(prefix), Some(url)) => { + if namespaces.prefix_map.swap(prefix, url).is_some() { + log_css_error(location, "Duplicate @namespace rule"); + } + }, + (None, Some(url)) => { + if namespaces.default.is_some() { + log_css_error(location, "Duplicate @namespace rule"); + } + namespaces.default = Some(url); + }, + _ => syntax_error!() + } +} diff --git a/selectors.rs b/selectors.rs index ac7b859cc99..2f6e86d5492 100644 --- a/selectors.rs +++ b/selectors.rs @@ -5,7 +5,7 @@ use std::{vec, iterator}; use std::ascii::to_ascii_lower; use cssparser::*; -use stylesheets::NamespaceMap; +use namespaces::NamespaceMap; pub struct Selector { @@ -68,7 +68,7 @@ pub struct AttrSelector { } -type Iter = iterator::PeekableIterator>; +type Iter = iterator::Peekable>; // None means invalid selector diff --git a/servo-style.rc b/servo-style.rc index c05eb1211c5..8c229f35c8c 100644 --- a/servo-style.rc +++ b/servo-style.rc @@ -9,5 +9,7 @@ extern mod extra; extern mod cssparser; pub mod stylesheets; +pub mod errors; pub mod selectors; pub mod properties; +pub mod namespaces; diff --git a/stylesheets.rs b/stylesheets.rs index fa04fc2843d..0ed968c3b02 100644 --- a/stylesheets.rs +++ b/stylesheets.rs @@ -3,29 +3,31 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use std::iterator::Iterator; -use std::hashmap::HashMap; use std::ascii::to_ascii_lower; use cssparser::*; use selectors; use properties; +use errors::{ErrorLoggerIterator, log_css_error}; +use namespaces::{NamespaceMap, parse_namespace_rule}; pub struct Stylesheet { - style_rules: ~[StyleRule], + style_rules: ~[CSSRule], namespaces: NamespaceMap, } +pub enum CSSRule { + CSSStyleRule(StyleRule), +// CSSMediaRule(MediaRule), +} + + pub struct StyleRule { selectors: ~[selectors::Selector], declarations: ~[properties::PropertyDeclaration], } -pub struct NamespaceMap { - default: Option<~str>, // Optional URL - prefix_map: HashMap<~str, ~str>, // prefix -> URL -} - fn parse_stylesheet(css: &str) -> Stylesheet { static STATE_CHARSET: uint = 1; @@ -35,113 +37,68 @@ fn parse_stylesheet(css: &str) -> Stylesheet { let mut state: uint = STATE_CHARSET; let mut rules = ~[]; - let mut namespaces = NamespaceMap { default: None, prefix_map: HashMap::new() }; + let mut namespaces = NamespaceMap::new(); - for rule in ErrorLogger(parse_stylesheet_rules(tokenize(css))) { + for rule in ErrorLoggerIterator(parse_stylesheet_rules(tokenize(css))) { + let next_state; // Unitialized to force each branch to set it. match rule { AtRule(rule) => { - let name = to_ascii_lower(rule.name); - if "charset" == name { - if state > STATE_CHARSET { log_css_error(rule.location, - "@charset must be the first rule") } - // Valid @charset rules are just ignored - loop; - } - if "import" == name { - if state > STATE_IMPORTS { log_css_error( - rule.location, "@import must be before any rule but @charset") } - else { - state = STATE_IMPORTS; - log_css_error(rule.location, "@import is not supported yet") // TODO - } - loop; - } - if "namespace" == name { - if state > STATE_NAMESPACES { log_css_error(rule.location, - "@namespace must be before any rule but @charset and @import") } - else { - state = STATE_NAMESPACES; - let location = rule.location; - if !parse_namespace_rule(rule, &mut namespaces) { - log_css_error(location, "Invalid @namespace rule") + let name: &str = to_ascii_lower(rule.name); + match name { + "charset" => { + if state > STATE_CHARSET { + log_css_error(rule.location, "@charset must be the first rule") } - } - loop; + // Valid @charset rules are just ignored + next_state = state; + }, + "import" => { + if state > STATE_IMPORTS { + next_state = state; + log_css_error(rule.location, + "@import must be before any rule but @charset") + } else { + next_state = STATE_IMPORTS; + log_css_error(rule.location, "@import is not supported yet") // TODO + } + }, + "namespace" => { + if state > STATE_NAMESPACES { + next_state = state; + log_css_error( + rule.location, + "@namespace must be before any rule but @charset and @import" + ) + } else { + next_state = STATE_NAMESPACES; + parse_namespace_rule(rule, &mut namespaces) + } + }, + _ => { + next_state = STATE_BODY; + log_css_error(rule.location, fmt!("Unsupported at-rule: @%s", name)) + }, } - state = STATE_BODY; - log_css_error(rule.location, fmt!("Unsupported at-rule: @%s", name)) }, - QualifiedRule(QualifiedRule{location: location, prelude: prelude, block: block}) => { - state = STATE_BODY; - match selectors::parse_selector_list(prelude, &namespaces) { - Some(selectors) => rules.push(StyleRule{ - selectors: selectors, - declarations: properties::parse_property_declaration_list(block) - }), - None => log_css_error(location, "Unsupported CSS selector."), - } + QualifiedRule(rule) => { + next_state = STATE_BODY; + parse_style_rule(rule, &mut rules, &namespaces) }, } + state = next_state; } Stylesheet{ style_rules: rules, namespaces: namespaces } } -fn parse_namespace_rule(rule: AtRule, namespaces: &mut NamespaceMap) -> bool { - if rule.block.is_some() { return false } - let location = rule.location; - let mut prefix: Option<~str> = None; - let mut url: Option<~str> = None; - let mut iter = rule.prelude.consume_skip_whitespace(); - for component_value in iter { - match component_value { - Ident(value) => { - if prefix.is_some() { return false } - prefix = Some(value); - }, - URL(value) | String(value) => { - if url.is_some() { return false } - url = Some(value); - break - }, - _ => return false, - } - } - if iter.next().is_some() { return false } - match (prefix, url) { - (Some(prefix), Some(url)) => { - if namespaces.prefix_map.swap(prefix, url).is_some() { - log_css_error(location, "Duplicate @namespace rule"); - } - }, - (None, Some(url)) => { - if namespaces.default.is_some() { - log_css_error(location, "Duplicate @namespace rule"); - } - namespaces.default = Some(url); - }, - _ => return false - } - return true -} - - -struct ErrorLogger(I); - -impl>> Iterator for ErrorLogger { - fn next(&mut self) -> Option { - for result in **self { - match result { - Ok(v) => return Some(v), - Err(error) => log_css_error(error.location, fmt!("%?", error.reason)) - } - } - None +fn parse_style_rule(rule: QualifiedRule, rule_list: &mut ~[CSSRule], + namespaces: &NamespaceMap) { + let QualifiedRule{location: location, prelude: prelude, block: block} = rule; + match selectors::parse_selector_list(prelude, namespaces) { + Some(selectors) => rule_list.push(CSSStyleRule(StyleRule{ + selectors: selectors, + declarations: properties::parse_property_declaration_list(block) + })), + None => log_css_error(location, "Unsupported CSS selector."), } } - - -fn log_css_error(location: SourceLocation, message: &str) { - // TODO eventually this will got into a "web console" or something. - info!("%u:%u %s", location.line, location.column, message) -} From 5758c31df776b25470cf79c34346b9e1107b35a6 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Sat, 10 Aug 2013 15:22:38 +0100 Subject: [PATCH 10/29] Add @media and media type parsing (no Media Queries yet.) --- media_queries.rs | 125 +++++++++++++++++++++++++++++++++++++++++++++++ servo-style.rc | 1 + stylesheets.rs | 33 ++++++++----- 3 files changed, 148 insertions(+), 11 deletions(-) create mode 100644 media_queries.rs diff --git a/media_queries.rs b/media_queries.rs new file mode 100644 index 00000000000..5729ec6c4b4 --- /dev/null +++ b/media_queries.rs @@ -0,0 +1,125 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use std::ascii::to_ascii_lower; +use cssparser::*; +use errors::{ErrorLoggerIterator, log_css_error}; +use stylesheets::{CSSRule, CSSMediaRule, parse_style_rule, parse_nested_at_rule}; +use namespaces::NamespaceMap; + + +pub struct MediaRule { + media_queries: MediaQueryList, + rules: ~[CSSRule], +} + + +pub struct MediaQueryList { + // "not all" is omitted from the list. + // An empty list never matches. + media_queries: ~[MediaQuery] +} + +// For now, this is a "Level 2 MQ", ie. a media type. +struct MediaQuery { + media_type: MediaQueryType, + // TODO: Level 3 MQ expressions +} + + +enum MediaQueryType { + All, // Always true + MediaType(MediaType), +} + +#[deriving(Eq)] +pub enum MediaType { + Screen, + Print, +} + +pub struct Device { + media_type: MediaType, + // TODO: Level 3 MQ data: viewport size, etc. +} + + +pub fn parse_media_rule(rule: AtRule, parent_rules: &mut ~[CSSRule], + namespaces: &NamespaceMap) { + let media_queries = parse_media_query_list(rule.prelude); + let block = match rule.block { + Some(block) => block, + None => { + log_css_error(rule.location, "Invalid @media rule"); + return + } + }; + let mut rules = ~[]; + for rule in ErrorLoggerIterator(parse_rule_list(block.consume_iter())) { + match rule { + QualifiedRule(rule) => parse_style_rule(rule, &mut rules, namespaces), + AtRule(rule) => parse_nested_at_rule( + to_ascii_lower(rule.name), rule, &mut rules, namespaces), + } + } + parent_rules.push(CSSMediaRule(MediaRule { + media_queries: media_queries, + rules: rules, + })) +} + + +pub fn parse_media_query_list(input: &[ComponentValue]) -> MediaQueryList { + let iter = &mut input.skip_whitespace(); + let mut next = iter.next(); + if next.is_none() { + return MediaQueryList{ media_queries: ~[MediaQuery{media_type: All}] } + } + let mut queries = ~[]; + loop { + let mq = match next { + Some(&Ident(ref value)) => { + let media_type: &str = to_ascii_lower(value.as_slice()); + match media_type { + "screen" => Some(MediaQuery{ media_type: MediaType(Screen) }), + "print" => Some(MediaQuery{ media_type: MediaType(Print) }), + "all" => Some(MediaQuery{ media_type: All }), + _ => None + } + }, + _ => None + }; + match iter.next() { + None => { + mq.map_move(|mq| queries.push(mq)); + return MediaQueryList{ media_queries: queries } + }, + Some(&Comma) => { + mq.map_move(|mq| queries.push(mq)); + }, + // Ingnore this comma-separated part + _ => loop { + match iter.next() { + Some(&Comma) => break, + None => return MediaQueryList{ media_queries: queries }, + _ => (), + } + }, + } + next = iter.next(); + } +} + + +impl MediaQueryList { + pub fn evaluate(&self, device: &Device) -> bool { + do self.media_queries.iter().any |mq| { + match mq.media_type { + MediaType(media_type) => media_type == device.media_type, + All => true, + } + // TODO: match Level 3 expressions + } + } +} diff --git a/servo-style.rc b/servo-style.rc index 8c229f35c8c..8425b53c8df 100644 --- a/servo-style.rc +++ b/servo-style.rc @@ -13,3 +13,4 @@ pub mod errors; pub mod selectors; pub mod properties; pub mod namespaces; +pub mod media_queries; diff --git a/stylesheets.rs b/stylesheets.rs index 0ed968c3b02..0f7f275ef01 100644 --- a/stylesheets.rs +++ b/stylesheets.rs @@ -9,6 +9,7 @@ use selectors; use properties; use errors::{ErrorLoggerIterator, log_css_error}; use namespaces::{NamespaceMap, parse_namespace_rule}; +use media_queries::{MediaRule, parse_media_rule}; pub struct Stylesheet { @@ -19,7 +20,7 @@ pub struct Stylesheet { pub enum CSSRule { CSSStyleRule(StyleRule), -// CSSMediaRule(MediaRule), + CSSMediaRule(MediaRule), } @@ -42,9 +43,13 @@ fn parse_stylesheet(css: &str) -> Stylesheet { for rule in ErrorLoggerIterator(parse_stylesheet_rules(tokenize(css))) { let next_state; // Unitialized to force each branch to set it. match rule { + QualifiedRule(rule) => { + next_state = STATE_BODY; + parse_style_rule(rule, &mut rules, &namespaces) + }, AtRule(rule) => { - let name: &str = to_ascii_lower(rule.name); - match name { + let lower_name: &str = to_ascii_lower(rule.name); + match lower_name { "charset" => { if state > STATE_CHARSET { log_css_error(rule.location, "@charset must be the first rule") @@ -76,14 +81,10 @@ fn parse_stylesheet(css: &str) -> Stylesheet { }, _ => { next_state = STATE_BODY; - log_css_error(rule.location, fmt!("Unsupported at-rule: @%s", name)) + parse_nested_at_rule(lower_name, rule, &mut rules, &namespaces) }, } }, - QualifiedRule(rule) => { - next_state = STATE_BODY; - parse_style_rule(rule, &mut rules, &namespaces) - }, } state = next_state; } @@ -91,14 +92,24 @@ fn parse_stylesheet(css: &str) -> Stylesheet { } -fn parse_style_rule(rule: QualifiedRule, rule_list: &mut ~[CSSRule], - namespaces: &NamespaceMap) { +pub fn parse_style_rule(rule: QualifiedRule, parent_rules: &mut ~[CSSRule], + namespaces: &NamespaceMap) { let QualifiedRule{location: location, prelude: prelude, block: block} = rule; match selectors::parse_selector_list(prelude, namespaces) { - Some(selectors) => rule_list.push(CSSStyleRule(StyleRule{ + Some(selectors) => parent_rules.push(CSSStyleRule(StyleRule{ selectors: selectors, declarations: properties::parse_property_declaration_list(block) })), None => log_css_error(location, "Unsupported CSS selector."), } } + + +// lower_name is passed explicitly to avoid computing it twice. +pub fn parse_nested_at_rule(lower_name: &str, rule: AtRule, + parent_rules: &mut ~[CSSRule], namespaces: &NamespaceMap) { + match lower_name { + "media" => parse_media_rule(rule, parent_rules, namespaces), + _ => log_css_error(rule.location, fmt!("Unsupported at-rule: @%s", lower_name)) + } +} From e1bde72c59a1653b1bbde8b98cf2d8d400a138a4 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Sat, 10 Aug 2013 16:27:28 +0100 Subject: [PATCH 11/29] Add a recursive style rule iterator for stylesheets. --- stylesheets.rs | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/stylesheets.rs b/stylesheets.rs index 0f7f275ef01..12d71ecc525 100644 --- a/stylesheets.rs +++ b/stylesheets.rs @@ -10,10 +10,11 @@ use properties; use errors::{ErrorLoggerIterator, log_css_error}; use namespaces::{NamespaceMap, parse_namespace_rule}; use media_queries::{MediaRule, parse_media_rule}; +use media_queries; pub struct Stylesheet { - style_rules: ~[CSSRule], + rules: ~[CSSRule], namespaces: NamespaceMap, } @@ -88,7 +89,7 @@ fn parse_stylesheet(css: &str) -> Stylesheet { } state = next_state; } - Stylesheet{ style_rules: rules, namespaces: namespaces } + Stylesheet{ rules: rules, namespaces: namespaces } } @@ -113,3 +114,39 @@ pub fn parse_nested_at_rule(lower_name: &str, rule: AtRule, _ => log_css_error(rule.location, fmt!("Unsupported at-rule: @%s", lower_name)) } } + + +impl Stylesheet { + fn iter_style_rules<'a>(&'a self, device: media_queries::Device) -> StyleRuleIterator<'a> { + StyleRuleIterator { device: device, stack: ~[(self.rules.as_slice(), 0)] } + } +} + +struct StyleRuleIterator<'self> { + device: media_queries::Device, + // FIXME: I couldn’t get this to borrow-check with a stack of VecIterator + stack: ~[(&'self [CSSRule], uint)], +} + +impl<'self> Iterator<&'self StyleRule> for StyleRuleIterator<'self> { + fn next(&mut self) -> Option<&'self StyleRule> { + loop { + match self.stack.pop_opt() { + None => return None, + Some((rule_list, i)) => { + if i + 1 < rule_list.len() { + self.stack.push((rule_list, i + 1)) + } + match rule_list[i] { + CSSStyleRule(ref rule) => return Some(rule), + CSSMediaRule(ref rule) => { + if rule.media_queries.evaluate(&self.device) { + self.stack.push((rule.rules.as_slice(), 0)) + } + } + } + } + } + } + } +} From 70c281fc25f233bdec991e3d471d45b77ec981f3 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Sat, 10 Aug 2013 16:46:41 +0100 Subject: [PATCH 12/29] Use a borrowed "device" for Media Queries matching. --- stylesheets.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stylesheets.rs b/stylesheets.rs index 12d71ecc525..5eb6eeefd34 100644 --- a/stylesheets.rs +++ b/stylesheets.rs @@ -117,13 +117,13 @@ pub fn parse_nested_at_rule(lower_name: &str, rule: AtRule, impl Stylesheet { - fn iter_style_rules<'a>(&'a self, device: media_queries::Device) -> StyleRuleIterator<'a> { + fn iter_style_rules<'a>(&'a self, device: &'a media_queries::Device) -> StyleRuleIterator<'a> { StyleRuleIterator { device: device, stack: ~[(self.rules.as_slice(), 0)] } } } struct StyleRuleIterator<'self> { - device: media_queries::Device, + device: &'self media_queries::Device, // FIXME: I couldn’t get this to borrow-check with a stack of VecIterator stack: ~[(&'self [CSSRule], uint)], } @@ -140,7 +140,7 @@ impl<'self> Iterator<&'self StyleRule> for StyleRuleIterator<'self> { match rule_list[i] { CSSStyleRule(ref rule) => return Some(rule), CSSMediaRule(ref rule) => { - if rule.media_queries.evaluate(&self.device) { + if rule.media_queries.evaluate(self.device) { self.stack.push((rule.rules.as_slice(), 0)) } } From c1b7e157b7a1bf5d1abd8d25e6807283ae23364d Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Mon, 12 Aug 2013 16:46:30 +0100 Subject: [PATCH 13/29] Update to rustc 0.8-pre (ecfc9a8 2013-08-12 04:29:11 -0700) --- README.md | 4 ++-- media_queries.rs | 2 +- namespaces.rs | 2 +- properties.rs | 32 +++++++++++++++++++++++++++++--- selectors.rs | 10 +++++----- stylesheets.rs | 2 +- 6 files changed, 39 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index d03b333a0c9..fd3bb045639 100644 --- a/README.md +++ b/README.md @@ -6,5 +6,5 @@ based on [rust-cssparser](https://github.com/mozilla-servo/rust-cssparser) instead of [NetSurf’s libcss](https://github.com/mozilla-servo/libcss). This is meant to go into Servo’s `src/components/script/style` directory, -but is maintained here for now because I’m using a patched Rust. -(See [pull request](https://github.com/mozilla/rust/pull/8396).) +but is maintained here for now because it requires at least +Rust ecfc9a8 (2013-08-12). diff --git a/media_queries.rs b/media_queries.rs index 5729ec6c4b4..c32642d18b1 100644 --- a/media_queries.rs +++ b/media_queries.rs @@ -56,7 +56,7 @@ pub fn parse_media_rule(rule: AtRule, parent_rules: &mut ~[CSSRule], } }; let mut rules = ~[]; - for rule in ErrorLoggerIterator(parse_rule_list(block.consume_iter())) { + for rule in ErrorLoggerIterator(parse_rule_list(block.move_iter())) { match rule { QualifiedRule(rule) => parse_style_rule(rule, &mut rules, namespaces), AtRule(rule) => parse_nested_at_rule( diff --git a/namespaces.rs b/namespaces.rs index e9105abc7dc..3c94ec3b3ea 100644 --- a/namespaces.rs +++ b/namespaces.rs @@ -30,7 +30,7 @@ pub fn parse_namespace_rule(rule: AtRule, namespaces: &mut NamespaceMap) { if rule.block.is_some() { syntax_error!() } let mut prefix: Option<~str> = None; let mut url: Option<~str> = None; - let mut iter = rule.prelude.consume_skip_whitespace(); + let mut iter = rule.prelude.move_skip_whitespace(); for component_value in iter { match component_value { Ident(value) => { diff --git a/properties.rs b/properties.rs index 6c9bc62b67c..81f947129ab 100644 --- a/properties.rs +++ b/properties.rs @@ -2,13 +2,39 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +use std::ascii::to_ascii_lower; use cssparser::*; +use errors::{ErrorLoggerIterator, log_css_error}; +pub struct PropertyDeclarationBlock { + important: ~[PropertyDeclaration], + normal: ~[PropertyDeclaration], +} + pub struct PropertyDeclaration; // TODO -pub fn parse_property_declaration_list(input: &[Node]) -> ~[PropertyDeclaration] { - let _ = input; - ~[] +pub fn parse_property_declaration_list(input: ~[Node]) -> PropertyDeclarationBlock { + let mut important = ~[]; + let mut normal = ~[]; + for item in ErrorLoggerIterator(parse_declaration_list(input.move_iter())) { + match item { + Decl_AtRule(rule) => log_css_error( + rule.location, fmt!("Unsupported at-rule in declaration list: @%s", rule.name)), + Declaration(Declaration{ location: l, name: n, value: v, important: i}) => { + let list = if i { &mut important } else { &mut normal }; + if !parse_one_property_declaration(to_ascii_lower(n), v, list) { + log_css_error(l, "Invalid property declaration") + } + } + } + } + PropertyDeclarationBlock { important: important, normal: normal } +} + + +fn parse_one_property_declaration(name: &str, value: ~[ComponentValue], + result_list: &mut ~[PropertyDeclaration]) -> bool { + false } diff --git a/selectors.rs b/selectors.rs index 2f6e86d5492..8fbe6a67024 100644 --- a/selectors.rs +++ b/selectors.rs @@ -68,13 +68,13 @@ pub struct AttrSelector { } -type Iter = iterator::Peekable>; +type Iter = iterator::Peekable>; // None means invalid selector pub fn parse_selector_list(input: ~[ComponentValue], namespaces: &NamespaceMap) -> Option<~[Selector]> { - let iter = &mut input.consume_iter().peekable(); + let iter = &mut input.move_iter().peekable(); let first = match parse_selector(iter, namespaces) { None => return None, Some(result) => result @@ -359,7 +359,7 @@ fn parse_qualified_name(iter: &mut Iter, allow_universal: bool, namespaces: &Nam fn parse_attribute_selector(content: ~[ComponentValue], namespaces: &NamespaceMap) -> Option { - let iter = &mut content.consume_iter().peekable(); + let iter = &mut content.move_iter().peekable(); let attr = match parse_qualified_name(iter, /* allow_universal = */ false, namespaces) { None => return None, // invalid selector Some(None) => return None, @@ -436,7 +436,7 @@ fn parse_pseudo_element(name: ~str) -> Option { fn parse_lang(arguments: ~[ComponentValue]) -> Option { - let mut iter = arguments.consume_skip_whitespace(); + let mut iter = arguments.move_skip_whitespace(); match iter.next() { Some(Ident(value)) => { if "" == value || iter.next().is_some() { None } @@ -450,7 +450,7 @@ fn parse_lang(arguments: ~[ComponentValue]) -> Option { // Level 3: Parse ONE simple_selector fn parse_negation(arguments: ~[ComponentValue], namespaces: &NamespaceMap) -> Option { - let iter = &mut arguments.consume_iter().peekable(); + let iter = &mut arguments.move_iter().peekable(); Some(Negation(match parse_type_selector(iter, namespaces) { None => return None, // invalid selector Some(Some(s)) => s, diff --git a/stylesheets.rs b/stylesheets.rs index 5eb6eeefd34..84ba98f33ab 100644 --- a/stylesheets.rs +++ b/stylesheets.rs @@ -27,7 +27,7 @@ pub enum CSSRule { pub struct StyleRule { selectors: ~[selectors::Selector], - declarations: ~[properties::PropertyDeclaration], + declarations: properties::PropertyDeclarationBlock, } From 9ea09f9d0d94b534fcbb204d2c412a11e5f358f2 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Tue, 13 Aug 2013 20:17:08 +0100 Subject: [PATCH 14/29] Parse all longhand properties that Servo seems to support. --- parsing_utils.rs | 21 ++ properties/common_types.rs | 138 ++++++++++++ properties/longhands.rs | 346 +++++++++++++++++++++++++++++ properties.rs => properties/mod.rs | 7 + servo-style.rc | 1 + 5 files changed, 513 insertions(+) create mode 100644 parsing_utils.rs create mode 100644 properties/common_types.rs create mode 100644 properties/longhands.rs rename properties.rs => properties/mod.rs (93%) diff --git a/parsing_utils.rs b/parsing_utils.rs new file mode 100644 index 00000000000..9f3cfddcab0 --- /dev/null +++ b/parsing_utils.rs @@ -0,0 +1,21 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + +use std::ascii::to_ascii_lower; +use cssparser::*; + + +pub fn one_component_value<'a>(input: &'a [ComponentValue]) -> Option<&'a ComponentValue> { + let mut iter = input.skip_whitespace(); + iter.next().filtered(|_| iter.next().is_none()) +} + + +pub fn get_ident_lower(component_value: &ComponentValue) -> Option<~str> { + match component_value { + &Ident(ref value) => Some(to_ascii_lower(value.as_slice())), + _ => None, + } +} diff --git a/properties/common_types.rs b/properties/common_types.rs new file mode 100644 index 00000000000..16cdc1cbe7d --- /dev/null +++ b/properties/common_types.rs @@ -0,0 +1,138 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + +pub type Float = f64; +pub type Integer = i64; + + +pub mod specified { + use std::ascii::{to_ascii_lower, eq_ignore_ascii_case}; + use cssparser::*; + use super::{Integer, Float}; + + pub enum Length { + Au(Integer), // application units + Em(Float), + Ex(Float), +// Ch(Float), +// Rem(Float), +// Vw(Float), +// Vh(Float), +// Vmin(Float), +// Vmax(Float), + } + static AU_PER_PX: Float = 60.; + static AU_PER_IN: Float = AU_PER_PX * 96.; + static AU_PER_CM: Float = AU_PER_IN / 2.54; + static AU_PER_MM: Float = AU_PER_IN / 25.4; + static AU_PER_PT: Float = AU_PER_IN / 72.; + static AU_PER_PC: Float = AU_PER_PT * 12.; + impl Length { + #[inline] + fn parse_internal(input: &ComponentValue, negative_ok: bool) -> Option { + match input { + &Dimension(ref value, ref unit) if negative_ok || value.value >= 0. + => Length::parse_dimension(value.value, unit.as_slice()), + &Number(ref value) if value.value == 0. => Some(Au(0)), + _ => None + } + } + pub fn parse(input: &ComponentValue) -> Option { + Length::parse_internal(input, /* negative_ok = */ true) + } + pub fn parse_non_negative(input: &ComponentValue) -> Option { + Length::parse_internal(input, /* negative_ok = */ false) + } + pub fn parse_dimension(value: Float, unit: &str) -> Option { + match to_ascii_lower(unit).as_slice() { + "px" => Some(Length::from_px(value)), + "in" => Some(Au((value * AU_PER_IN) as Integer)), + "cm" => Some(Au((value * AU_PER_CM) as Integer)), + "mm" => Some(Au((value * AU_PER_MM) as Integer)), + "pt" => Some(Au((value * AU_PER_PT) as Integer)), + "pc" => Some(Au((value * AU_PER_PC) as Integer)), + "em" => Some(Em(value)), + "ex" => Some(Ex(value)), + _ => None + } + } + #[inline] + pub fn from_px(px_value: Float) -> Length { + Au((px_value * AU_PER_PX) as Integer) + } + } + + pub enum LengthOrPercentage { + Length(Length), + Percentage(Float), + } + impl LengthOrPercentage { + fn parse_internal(input: &ComponentValue, negative_ok: bool) + -> Option { + match input { + &Dimension(ref value, ref unit) if negative_ok || value.value >= 0. + => Length::parse_dimension(value.value, unit.as_slice()).map_move(Length), + &ast::Percentage(ref value) if negative_ok || value.value >= 0. + => Some(Percentage(value.value)), + &Number(ref value) if value.value == 0. => Some(Length(Au(0))), + _ => None + } + } + pub fn parse(input: &ComponentValue) -> Option { + LengthOrPercentage::parse_internal(input, /* negative_ok = */ true) + } + pub fn parse_non_negative(input: &ComponentValue) -> Option { + LengthOrPercentage::parse_internal(input, /* negative_ok = */ false) + } + } + + pub enum LengthOrPercentageOrAuto { + Length_(Length), + Percentage_(Float), + Auto, + } + impl LengthOrPercentageOrAuto { + #[inline] + fn parse_internal(input: &ComponentValue, negative_ok: bool) + -> Option { + match input { + &Dimension(ref value, ref unit) if negative_ok || value.value >= 0. + => Length::parse_dimension(value.value, unit.as_slice()).map_move(Length_), + &ast::Percentage(ref value) if negative_ok || value.value >= 0. + => Some(Percentage_(value.value)), + &Number(ref value) if value.value == 0. => Some(Length_(Au(0))), + &Ident(ref value) if eq_ignore_ascii_case(value.as_slice(), "auto") => Some(Auto), + _ => None + } + } + pub fn parse(input: &ComponentValue) -> Option { + LengthOrPercentageOrAuto::parse_internal(input, /* negative_ok = */ true) + } + pub fn parse_non_negative(input: &ComponentValue) -> Option { + LengthOrPercentageOrAuto::parse_internal(input, /* negative_ok = */ false) + } + } +} + +pub mod computed { + use super::*; + struct Length(Integer); // in application units + impl Length { + fn times(self, factor: Float) -> Length { + Length(((*self as Float) * factor) as Integer) + } + + pub fn compute(parent_font_size: Length, value: specified::Length) -> Length { + match value { + specified::Au(value) => Length(value), + specified::Em(value) => parent_font_size.times(value), + specified::Ex(value) => { + let x_height = 0.5; // TODO: find that form the font + parent_font_size.times(value * x_height) + }, + } + } + } +} diff --git a/properties/longhands.rs b/properties/longhands.rs new file mode 100644 index 00000000000..3335b0d6ec3 --- /dev/null +++ b/properties/longhands.rs @@ -0,0 +1,346 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + +pub use std::ascii::{to_ascii_lower, eq_ignore_ascii_case}; +pub use std::option; +pub use cssparser::*; +pub use CSSColor = cssparser::Color; +pub use parsing_utils::*; +pub use super::common_types::specified; +pub use super::common_types; + + +macro_rules! single_keyword( + ($property_name: ident, $( $lower_case_keyword_string: pat => $variant: ident ),+ ) => { + mod $property_name { + use super::*; + enum SpecifiedValue { + $( $variant ),+ + } + fn parse(input: &[ComponentValue]) -> option::Option { + do one_component_value(input).chain(get_ident_lower).chain |keyword| { + match keyword.as_slice() { + $( $lower_case_keyword_string => option::Some($variant) ),+ , + _ => option::None, + } + } + } + } + }; +) + + +macro_rules! single_type( + ($property_name: ident, $type_: ident) => { + single_type!($property_name, $type_, $type_::parse) + }; + ($property_name: ident, $type_: ty, $parse_function: expr) => { + mod $property_name { + use super::*; + type SpecifiedValue = $type_; + fn parse(input: &[ComponentValue]) -> Option { + one_component_value(input).chain($parse_function) + } + } + }; +) + + + +// CSS 2.1, Section 8 - Box model + +single_type!(margin_top, specified::LengthOrPercentageOrAuto, + specified::LengthOrPercentageOrAuto::parse_non_negative) +single_type!(margin_right, specified::LengthOrPercentageOrAuto, + specified::LengthOrPercentageOrAuto::parse_non_negative) +single_type!(margin_bottom, specified::LengthOrPercentageOrAuto, + specified::LengthOrPercentageOrAuto::parse_non_negative) +single_type!(margin_left, specified::LengthOrPercentageOrAuto, + specified::LengthOrPercentageOrAuto::parse_non_negative) + +single_type!(padding_top, specified::LengthOrPercentage, + specified::LengthOrPercentage::parse_non_negative) +single_type!(padding_right, specified::LengthOrPercentage, + specified::LengthOrPercentage::parse_non_negative) +single_type!(padding_bottom, specified::LengthOrPercentage, + specified::LengthOrPercentage::parse_non_negative) +single_type!(padding_left, specified::LengthOrPercentage, + specified::LengthOrPercentage::parse_non_negative) + +single_type!(border_top_color, CSSColor) +single_type!(border_right_color, CSSColor) +single_type!(border_bottom_color, CSSColor) +single_type!(border_left_color, CSSColor) + +pub fn parse_border_width(component_value: &ComponentValue) -> Option { + match component_value { + &Ident(ref value) => match to_ascii_lower(value.as_slice()).as_slice() { + "thin" => Some(specified::Length::from_px(1.)), + "medium" => Some(specified::Length::from_px(3.)), + "thick" => Some(specified::Length::from_px(5.)), + _ => None + }, + _ => specified::Length::parse_non_negative(component_value) + } +} + +single_type!(border_top_width, specified::Length, parse_border_width) +single_type!(border_right_width, specified::Length, parse_border_width) +single_type!(border_bottom_width, specified::Length, parse_border_width) +single_type!(border_left_width, specified::Length, parse_border_width) + +// CSS 2.1, Section 9 - Visual formatting model + +// TODO: don’t parse values we don’t support +single_keyword!(display, + "inline" => Inline, + "block" => Block, + "list-item" => ListItem, + "inline-block" => InlineBlock, + "table" => Table, + "inline-table" => InlineTable, + "table-row-group" => TableRowGroup, + "table-header-group" => TableHeaderGroup, + "table-footer-group" => TableFooterGroup, + "table-row" => TableRow, + "table-column-group" => TableColumnGroup, + "table-column" => TableColumn, + "table-cell" => TableCell, + "table-caption" => TableCaption, + "none" => None +) + +single_keyword!(position, + "static" => Static, "absolute" => Absolute, "relative" => Relative, "fixed" => Fixed) +single_keyword!(float, "left" => Left, "right" => Right, "none" => None) +single_keyword!(clear, "left" => Left, "right" => Right, "none" => None, "both" => Both) + + +// CSS 2.1, Section 10 - Visual formatting model details + +single_type!(width, specified::Length, specified::Length::parse_non_negative) +single_type!(height, specified::Length, specified::Length::parse_non_negative) + +mod line_height { + use super::*; + enum SpecifiedValue { + Normal, + Length(specified::Length), + Percentage(common_types::Float), + Number(common_types::Float), + } + /// normal | | | + fn parse(input: &[ComponentValue]) -> Option { + match one_component_value(input) { + Some(&ast::Number(ref value)) if value.value >= 0. + => Some(Number(value.value)), + Some(&ast::Percentage(ref value)) if value.value >= 0. + => Some(Percentage(value.value)), + Some(&Dimension(ref value, ref unit)) if value.value >= 0. + => specified::Length::parse_dimension(value.value, unit.as_slice()).map_move(Length), + Some(&Ident(ref value)) if eq_ignore_ascii_case(value.as_slice(), "auto") + => Some(Normal), + _ => None, + } + } +} + + +// CSS 2.1, Section 11 - Visual effects + +// CSS 2.1, Section 12 - Generated content, automatic numbering, and lists + +// CSS 2.1, Section 13 - Paged media + +// CSS 2.1, Section 14 - Colors and Backgrounds + +single_type!(background_color, CSSColor) +single_type!(color, CSSColor) + +// CSS 2.1, Section 15 - Fonts + +mod font_family { + use super::*; + enum FontFamily { + FamilyName(~str), + // Generic + Serif, + SansSerif, + Cursive, + Fantasy, + Monospace, + } + type SpecifiedValue = ~[FontFamily]; + /// # + /// = | [ + ] + /// TODO: + fn parse(input: &[ComponentValue]) -> Option { + let mut result = ~[]; + let mut iter = input.skip_whitespace(); + macro_rules! add( + ($value: expr) => { + { + result.push($value); + match iter.next() { + Some(&Comma) => (), + None => break 'outer, + _ => return None, + } + } + } + ) + 'outer: loop { + match iter.next() { + // TODO: avoid copying strings? + Some(&String(ref value)) => add!(FamilyName(value.to_owned())), + Some(&Ident(ref value)) => { + let value = value.as_slice(); + match to_ascii_lower(value).as_slice() { + "serif" => add!(Serif), + "sans-serif" => add!(SansSerif), + "cursive" => add!(Cursive), + "fantasy" => add!(Fantasy), + "monospace" => add!(Monospace), + _ => { + let mut idents = ~[value]; + loop { + match iter.next() { + Some(&Ident(ref value)) => idents.push(value.as_slice()), + Some(&Comma) => { + result.push(FamilyName(idents.connect(" "))); + break + }, + None => { + result.push(FamilyName(idents.connect(" "))); + break 'outer + }, + _ => return None, + } + } + } + } + } + _ => return None, + } + } + Some(result) + } +} + +single_keyword!(font_style, "normal" => Normal, "italic" => Italic, "oblique" => Oblique) +single_keyword!(font_variant, "normal" => Normal, "small-caps" => SmallCaps) + +mod font_weight { + use super::*; + enum SpecifiedValue { + Bolder, + Lighther, + Weight100, + Weight200, + Weight300, + Weight400, + Weight500, + Weight600, + Weight700, + Weight800, + Weight900, + } + /// normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 + fn parse(input: &[ComponentValue]) -> Option { + match one_component_value(input) { + Some(&Ident(ref value)) => match to_ascii_lower(value.as_slice()).as_slice() { + "bold" => Some(Weight700), + "normal" => Some(Weight400), + "bolder" => Some(Bolder), + "lighter" => Some(Lighther), + _ => None, + }, + Some(&Number(ref value)) => match value.int_value { + Some(100) => Some(Weight100), + Some(200) => Some(Weight200), + Some(300) => Some(Weight300), + Some(400) => Some(Weight400), + Some(500) => Some(Weight500), + Some(600) => Some(Weight600), + Some(700) => Some(Weight700), + Some(800) => Some(Weight800), + Some(900) => Some(Weight800), + _ => None, + }, + _ => None + } + } +} + +mod font_size { + use super::*; + type SpecifiedValue = specified::Length; // Percentages are the same as em. + /// | + /// TODO: support and + fn parse(input: &[ComponentValue]) -> Option { + do one_component_value(input).chain(specified::LengthOrPercentage::parse_non_negative) + .map_move |value| { + match value { + specified::Length(value) => value, + specified::Percentage(value) => specified::Em(value), + } + } + } +} + +// CSS 2.1, Section 16 - Text + +single_keyword!(text_align, "left" => Left, "right" => Right, + "center" => Center, "justify" => Justify) + +mod text_decoration { + use super::*; + struct SpecifiedValue { + underline: bool, + overline: bool, + line_through: bool, + // 'blink' is accepted in the parser but ignored. + // Just not blinking the text is a conforming implementation per CSS 2.1. + } + /// none | [ underline || overline || line-through || blink ] + fn parse(input: &[ComponentValue]) -> Option { + let mut result = SpecifiedValue { + underline: false, overline: false, line_through: false, + }; + let mut blink = false; + let mut empty = true; + macro_rules! found( + ($flag: expr) => ( + { + if $flag { return None } + empty = false; + $flag = true; + } + ); + ) + for component_value in input.skip_whitespace() { + match get_ident_lower(component_value) { + None => return None, + Some(keyword) => match keyword.as_slice() { + "underline" => if result.underline { return None } + else { empty = false; result.underline = true }, + "overline" => if result.overline { return None } + else { empty = false; result.overline = true }, + "line-through" => if result.line_through { return None } + else { empty = false; result.line_through = true }, + "blink" => if blink { return None } + else { empty = false; blink = true }, + "none" => return if empty { Some(result) } else { None }, + _ => return None, + } + } + } + if !empty { Some(result) } else { None } + } +} + +// CSS 2.1, Section 17 - Tables + +// CSS 2.1, Section 18 - User interface diff --git a/properties.rs b/properties/mod.rs similarity index 93% rename from properties.rs rename to properties/mod.rs index 81f947129ab..393fb66bea2 100644 --- a/properties.rs +++ b/properties/mod.rs @@ -6,6 +6,9 @@ use std::ascii::to_ascii_lower; use cssparser::*; use errors::{ErrorLoggerIterator, log_css_error}; +pub mod longhands; +pub mod common_types; + pub struct PropertyDeclarationBlock { important: ~[PropertyDeclaration], @@ -36,5 +39,9 @@ pub fn parse_property_declaration_list(input: ~[Node]) -> PropertyDeclarationBlo fn parse_one_property_declaration(name: &str, value: ~[ComponentValue], result_list: &mut ~[PropertyDeclaration]) -> bool { + + let _ = name; + let _ = value; + let _ = result_list; false } diff --git a/servo-style.rc b/servo-style.rc index 8425b53c8df..c4b891dd2d7 100644 --- a/servo-style.rc +++ b/servo-style.rc @@ -14,3 +14,4 @@ pub mod selectors; pub mod properties; pub mod namespaces; pub mod media_queries; +pub mod parsing_utils; From 3343de55e60e0f7a7923a13760e1bcbbbc9c9b3c Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Tue, 13 Aug 2013 21:13:08 +0100 Subject: [PATCH 15/29] Logic fixes in CSS longhand properties parsing. --- properties/longhands.rs | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/properties/longhands.rs b/properties/longhands.rs index 3335b0d6ec3..06c193b7616 100644 --- a/properties/longhands.rs +++ b/properties/longhands.rs @@ -52,13 +52,13 @@ macro_rules! single_type( // CSS 2.1, Section 8 - Box model single_type!(margin_top, specified::LengthOrPercentageOrAuto, - specified::LengthOrPercentageOrAuto::parse_non_negative) + specified::LengthOrPercentageOrAuto::parse) single_type!(margin_right, specified::LengthOrPercentageOrAuto, - specified::LengthOrPercentageOrAuto::parse_non_negative) + specified::LengthOrPercentageOrAuto::parse) single_type!(margin_bottom, specified::LengthOrPercentageOrAuto, - specified::LengthOrPercentageOrAuto::parse_non_negative) + specified::LengthOrPercentageOrAuto::parse) single_type!(margin_left, specified::LengthOrPercentageOrAuto, - specified::LengthOrPercentageOrAuto::parse_non_negative) + specified::LengthOrPercentageOrAuto::parse) single_type!(padding_top, specified::LengthOrPercentage, specified::LengthOrPercentage::parse_non_negative) @@ -120,8 +120,10 @@ single_keyword!(clear, "left" => Left, "right" => Right, "none" => None, "both" // CSS 2.1, Section 10 - Visual formatting model details -single_type!(width, specified::Length, specified::Length::parse_non_negative) -single_type!(height, specified::Length, specified::Length::parse_non_negative) +single_type!(width, specified::LengthOrPercentageOrAuto, + specified::LengthOrPercentageOrAuto::parse_non_negative) +single_type!(height, specified::LengthOrPercentageOrAuto, + specified::LengthOrPercentageOrAuto::parse_non_negative) mod line_height { use super::*; @@ -266,7 +268,7 @@ mod font_weight { Some(600) => Some(Weight600), Some(700) => Some(Weight700), Some(800) => Some(Weight800), - Some(900) => Some(Weight800), + Some(900) => Some(Weight900), _ => None, }, _ => None @@ -311,15 +313,6 @@ mod text_decoration { }; let mut blink = false; let mut empty = true; - macro_rules! found( - ($flag: expr) => ( - { - if $flag { return None } - empty = false; - $flag = true; - } - ); - ) for component_value in input.skip_whitespace() { match get_ident_lower(component_value) { None => return None, From 449683565fc64a81aa03a3c99221a5bc2ba73d06 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Tue, 13 Aug 2013 23:43:42 +0100 Subject: [PATCH 16/29] Add parsing of supported shorthand properties. --- properties/common_types.rs | 31 ++++ properties/longhands.rs | 99 ++++++++----- properties/mod.rs | 3 +- properties/shorthands.rs | 286 +++++++++++++++++++++++++++++++++++++ 4 files changed, 381 insertions(+), 38 deletions(-) create mode 100644 properties/shorthands.rs diff --git a/properties/common_types.rs b/properties/common_types.rs index 16cdc1cbe7d..53b30dde27c 100644 --- a/properties/common_types.rs +++ b/properties/common_types.rs @@ -3,6 +3,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +use cssparser::*; +use parsing_utils::*; + pub type Float = f64; pub type Integer = i64; @@ -16,6 +19,7 @@ pub mod specified { Au(Integer), // application units Em(Float), Ex(Float), + // XXX uncomment when supported: // Ch(Float), // Rem(Float), // Vw(Float), @@ -136,3 +140,30 @@ pub mod computed { } } } + + +pub enum BorderStyle { + BorderStyleSolid, + // Uncomment when supported +// BorderStyleDotted, +// BorderStyleDashed, +// BorderStyleDouble, +// BorderStyleGroove, +// BorderStyleRidge, +// BorderStyleInset, +// BorderStyleOutset, +// BorderStyleHidden, + BorderStyleNone, +} +impl BorderStyle { + pub fn parse(input: &ComponentValue) -> Option { + do get_ident_lower(input).chain |keyword| { + match keyword.as_slice() { + "solid" => Some(BorderStyleSolid), + "none" => Some(BorderStyleNone), + _ => None, + } + } + } +} + diff --git a/properties/longhands.rs b/properties/longhands.rs index 06c193b7616..26aee4c2acb 100644 --- a/properties/longhands.rs +++ b/properties/longhands.rs @@ -4,23 +4,26 @@ pub use std::ascii::{to_ascii_lower, eq_ignore_ascii_case}; +pub use std::iterator; pub use std::option; pub use cssparser::*; pub use CSSColor = cssparser::Color; pub use parsing_utils::*; -pub use super::common_types::specified; -pub use super::common_types; +pub use super::common_types::*; macro_rules! single_keyword( ($property_name: ident, $( $lower_case_keyword_string: pat => $variant: ident ),+ ) => { - mod $property_name { + pub mod $property_name { use super::*; - enum SpecifiedValue { + pub enum SpecifiedValue { $( $variant ),+ } - fn parse(input: &[ComponentValue]) -> option::Option { - do one_component_value(input).chain(get_ident_lower).chain |keyword| { + pub fn parse(input: &[ComponentValue]) -> option::Option { + one_component_value(input).chain(from_component_value) + } + pub fn from_component_value(v: &ComponentValue) -> option::Option { + do get_ident_lower(v).chain |keyword| { match keyword.as_slice() { $( $lower_case_keyword_string => option::Some($variant) ),+ , _ => option::None, @@ -37,10 +40,10 @@ macro_rules! single_type( single_type!($property_name, $type_, $type_::parse) }; ($property_name: ident, $type_: ty, $parse_function: expr) => { - mod $property_name { + pub mod $property_name { use super::*; - type SpecifiedValue = $type_; - fn parse(input: &[ComponentValue]) -> Option { + pub type SpecifiedValue = $type_; + pub fn parse(input: &[ComponentValue]) -> Option { one_component_value(input).chain($parse_function) } } @@ -74,6 +77,11 @@ single_type!(border_right_color, CSSColor) single_type!(border_bottom_color, CSSColor) single_type!(border_left_color, CSSColor) +single_type!(border_top_style, BorderStyle) +single_type!(border_right_style, BorderStyle) +single_type!(border_bottom_style, BorderStyle) +single_type!(border_left_style, BorderStyle) + pub fn parse_border_width(component_value: &ComponentValue) -> Option { match component_value { &Ident(ref value) => match to_ascii_lower(value.as_slice()).as_slice() { @@ -91,6 +99,7 @@ single_type!(border_right_width, specified::Length, parse_border_width) single_type!(border_bottom_width, specified::Length, parse_border_width) single_type!(border_left_width, specified::Length, parse_border_width) + // CSS 2.1, Section 9 - Visual formatting model // TODO: don’t parse values we don’t support @@ -125,24 +134,27 @@ single_type!(width, specified::LengthOrPercentageOrAuto, single_type!(height, specified::LengthOrPercentageOrAuto, specified::LengthOrPercentageOrAuto::parse_non_negative) -mod line_height { +pub mod line_height { use super::*; - enum SpecifiedValue { + pub enum SpecifiedValue { Normal, Length(specified::Length), - Percentage(common_types::Float), - Number(common_types::Float), + Percentage(Float), + Number(Float), } /// normal | | | - fn parse(input: &[ComponentValue]) -> Option { - match one_component_value(input) { - Some(&ast::Number(ref value)) if value.value >= 0. + pub fn parse(input: &[ComponentValue]) -> Option { + one_component_value(input).chain(from_component_value) + } + pub fn from_component_value(input: &ComponentValue) -> Option { + match input { + &ast::Number(ref value) if value.value >= 0. => Some(Number(value.value)), - Some(&ast::Percentage(ref value)) if value.value >= 0. + &ast::Percentage(ref value) if value.value >= 0. => Some(Percentage(value.value)), - Some(&Dimension(ref value, ref unit)) if value.value >= 0. + &Dimension(ref value, ref unit) if value.value >= 0. => specified::Length::parse_dimension(value.value, unit.as_slice()).map_move(Length), - Some(&Ident(ref value)) if eq_ignore_ascii_case(value.as_slice(), "auto") + &Ident(ref value) if eq_ignore_ascii_case(value.as_slice(), "auto") => Some(Normal), _ => None, } @@ -163,7 +175,7 @@ single_type!(color, CSSColor) // CSS 2.1, Section 15 - Fonts -mod font_family { +pub mod font_family { use super::*; enum FontFamily { FamilyName(~str), @@ -174,13 +186,17 @@ mod font_family { Fantasy, Monospace, } - type SpecifiedValue = ~[FontFamily]; + pub type SpecifiedValue = ~[FontFamily]; /// # /// = | [ + ] /// TODO: - fn parse(input: &[ComponentValue]) -> Option { + pub fn parse(input: &[ComponentValue]) -> Option { + // XXX Using peekable() for compat with parsing of the 'font' shorthand. + from_iter(input.skip_whitespace().peekable()) + } + type Iter<'self> = iterator::Peekable<&'self ComponentValue, SkipWhitespaceIterator<'self>>; + pub fn from_iter(mut iter: Iter) -> Option { let mut result = ~[]; - let mut iter = input.skip_whitespace(); macro_rules! add( ($value: expr) => { { @@ -232,11 +248,15 @@ mod font_family { } single_keyword!(font_style, "normal" => Normal, "italic" => Italic, "oblique" => Oblique) -single_keyword!(font_variant, "normal" => Normal, "small-caps" => SmallCaps) +single_keyword!(font_variant, + // Uncomment when supported + //"small-caps" => SmallCaps, + "normal" => Normal +) -mod font_weight { +pub mod font_weight { use super::*; - enum SpecifiedValue { + pub enum SpecifiedValue { Bolder, Lighther, Weight100, @@ -250,16 +270,19 @@ mod font_weight { Weight900, } /// normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 - fn parse(input: &[ComponentValue]) -> Option { - match one_component_value(input) { - Some(&Ident(ref value)) => match to_ascii_lower(value.as_slice()).as_slice() { + pub fn parse(input: &[ComponentValue]) -> Option { + one_component_value(input).chain(from_component_value) + } + pub fn from_component_value(input: &ComponentValue) -> Option { + match input { + &Ident(ref value) => match to_ascii_lower(value.as_slice()).as_slice() { "bold" => Some(Weight700), "normal" => Some(Weight400), "bolder" => Some(Bolder), "lighter" => Some(Lighther), _ => None, }, - Some(&Number(ref value)) => match value.int_value { + &Number(ref value) => match value.int_value { Some(100) => Some(Weight100), Some(200) => Some(Weight200), Some(300) => Some(Weight300), @@ -276,14 +299,16 @@ mod font_weight { } } -mod font_size { +pub mod font_size { use super::*; - type SpecifiedValue = specified::Length; // Percentages are the same as em. + pub type SpecifiedValue = specified::Length; // Percentages are the same as em. /// | /// TODO: support and - fn parse(input: &[ComponentValue]) -> Option { - do one_component_value(input).chain(specified::LengthOrPercentage::parse_non_negative) - .map_move |value| { + pub fn parse(input: &[ComponentValue]) -> Option { + one_component_value(input).chain(from_component_value) + } + pub fn from_component_value(input: &ComponentValue) -> Option { + do specified::LengthOrPercentage::parse_non_negative(input).map_move |value| { match value { specified::Length(value) => value, specified::Percentage(value) => specified::Em(value), @@ -297,9 +322,9 @@ mod font_size { single_keyword!(text_align, "left" => Left, "right" => Right, "center" => Center, "justify" => Justify) -mod text_decoration { +pub mod text_decoration { use super::*; - struct SpecifiedValue { + pub struct SpecifiedValue { underline: bool, overline: bool, line_through: bool, diff --git a/properties/mod.rs b/properties/mod.rs index 393fb66bea2..73a8716a828 100644 --- a/properties/mod.rs +++ b/properties/mod.rs @@ -6,8 +6,9 @@ use std::ascii::to_ascii_lower; use cssparser::*; use errors::{ErrorLoggerIterator, log_css_error}; -pub mod longhands; pub mod common_types; +pub mod longhands; +pub mod shorthands; pub struct PropertyDeclarationBlock { diff --git a/properties/shorthands.rs b/properties/shorthands.rs new file mode 100644 index 00000000000..014969b6b7f --- /dev/null +++ b/properties/shorthands.rs @@ -0,0 +1,286 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +pub use super::longhands::*; + + +macro_rules! shorthand( + ($name: ident[$($longhand: ident),+] |input| $parser: expr) => { + pub mod $name { + use super::*; + struct Longhands { + $( $longhand: Option<$longhand::SpecifiedValue> ),+ + } + fn parse(input: &[ComponentValue]) -> Option { $parser } + } + }; +) + + +// The value of each longhand is the same as the value of the shorthand +macro_rules! duplicating_shorthand( + ($name: ident, $parser_function: expr, $($longhand: ident),+) => { + shorthand!($name [$($longhand),+] |input| { + do $parser_function(input).map_move |value| { + Longhands { $( $longhand: Some(value) ),+ } + } + }) + }; +) + + +macro_rules! four_side_shorthand( + ($name: ident, $parser_function: expr, + $top: ident, $right: ident, $bottom: ident, $left: ident) => { + shorthand!($name [$top, $right, $bottom, $left] |input| { + let mut iter = input.skip_whitespace().map($parser_function); + // zero or more than four values is invalid. + // one value sets them all + // two values set (top, bottom) and (left, right) + // three values set top, (left, right) and bottom + // four values set them in order + let top = iter.next().unwrap_or_default(None); + let right = iter.next().unwrap_or_default(top); + let bottom = iter.next().unwrap_or_default(top); + let left = iter.next().unwrap_or_default(right); + if top.is_some() && right.is_some() && bottom.is_some() && left.is_some() + && iter.next().is_none() { + Some(Longhands { $top: top, $right: right, $bottom: bottom, $left: left }) + } else { + None + } + }) + }; +) + + +// TODO: other background-* properties +shorthand!(background [ + background_color +] |input| { + do one_component_value(input).chain(CSSColor::parse).map_move |color| { + Longhands { background_color: Some(color) } + } +}) + + +duplicating_shorthand!(border_color, border_top_color::parse, + border_top_color, + border_right_color, + border_bottom_color, + border_left_color +) + +duplicating_shorthand!(border_width, border_top_width::parse, + border_top_width, + border_right_width, + border_bottom_width, + border_left_width +) + +duplicating_shorthand!(border_style, border_top_style::parse, + border_top_style, + border_right_style, + border_bottom_style, + border_left_style +) + + +pub fn parse_border(input: &[ComponentValue]) -> Option<(Option, Option, + Option)> { + let mut color = None; + let mut style = None; + let mut width = None; + let mut any = false; + for component_value in input.skip_whitespace() { + if color.is_none() { + match CSSColor::parse(component_value) { + Some(c) => { color = Some(c); any = true; loop }, + None => () + } + } + if style.is_none() { + match BorderStyle::parse(component_value) { + Some(s) => { style = Some(s); any = true; loop }, + None => () + } + } + if width.is_none() { + match parse_border_width(component_value) { + Some(w) => { width = Some(w); any = true; loop }, + None => () + } + } + return None + } + if any { Some((color, style, width)) } else { None } +} + + +shorthand!(border_top [ + border_top_color, + border_top_width, + border_top_style +] |input| { + do parse_border(input).map_move |(color, style, width)| { + Longhands { border_top_color: color, border_top_style: style, + border_top_width: width } + } +}) + +shorthand!(border_right [ + border_right_color, + border_right_width, + border_right_style +] |input| { + do parse_border(input).map_move |(color, style, width)| { + Longhands { border_right_color: color, border_right_style: style, + border_right_width: width } + } +}) + +shorthand!(border_bottom [ + border_bottom_color, + border_bottom_width, + border_bottom_style +] |input| { + do parse_border(input).map_move |(color, style, width)| { + Longhands { border_bottom_color: color, border_bottom_style: style, + border_bottom_width: width } + } +}) + +shorthand!(border_left [ + border_left_color, + border_left_width, + border_left_style +] |input| { + do parse_border(input).map_move |(color, style, width)| { + Longhands { border_left_color: color, border_left_style: style, + border_left_width: width } + } +}) + +shorthand!(border [ + border_top_color, + border_top_width, + border_top_style, + border_right_color, + border_right_width, + border_right_style, + border_bottom_color, + border_bottom_width, + border_bottom_style, + border_left_color, + border_left_width, + border_left_style +] |input| { + do parse_border(input).map_move |(color, style, width)| { + Longhands { + border_top_color: color, border_top_style: style, border_top_width: width, + border_right_color: color, border_right_style: style, border_right_width: width, + border_bottom_color: color, border_bottom_style: style, border_bottom_width: width, + border_left_color: color, border_left_style: style, border_left_width: width, + } + } +}) + + +// TODO: system fonts +shorthand!(font [ + font_style, + font_variant, + font_weight, + font_size, + line_height, + font_family +] |input| { + let mut iter = input.skip_whitespace(); + let mut nb_normals = 0u; + let mut style = None; + let mut variant = None; + let mut weight = None; + let mut size = None; + let mut line_height = None; + for component_value in iter { + // Special-case 'normal' because it is valid in each of + // font-style, font-weight and font-variant. + // Leaves the values to None, 'normal' is the initial value for each of them. + if get_ident_lower(component_value).filtered( + |v| eq_ignore_ascii_case(v.as_slice(), "normal")).is_some() { + nb_normals += 1; + loop; + } + if style.is_none() { + match font_style::from_component_value(component_value) { + Some(s) => { style = Some(s); loop }, + None => () + } + } + if weight.is_none() { + match font_weight::from_component_value(component_value) { + Some(w) => { weight = Some(w); loop }, + None => () + } + } + if variant.is_none() { + match font_variant::from_component_value(component_value) { + Some(v) => { variant = Some(v); loop }, + None => () + } + } + match font_size::from_component_value(component_value) { + Some(s) => { size = Some(s); break }, + None => return None + } + } + #[inline] + fn count(opt: &Option) -> uint { + match opt { + &Some(_) => 1, + &None => 0, + } + } + if size.is_none() || (count(&style) + count(&weight) + count(&variant) + nb_normals) > 3 { + return None + } + let mut iter = iter.peekable(); + match iter.peek() { + Some(& &Delim('/')) => { + iter.next(); + line_height = match iter.next() { + Some(v) => line_height::from_component_value(v), + _ => return None, + }; + if line_height.is_none() { return None } + } + _ => () + } + let family = font_family::from_iter(iter); + if family.is_none() { return None } + Some(Longhands{ + font_style: style, + font_variant: variant, + font_weight: weight, + font_size: size, + line_height: line_height, + font_family: family + }) +}) + + +four_side_shorthand!(margin, specified::LengthOrPercentageOrAuto::parse, + margin_top, + margin_right, + margin_bottom, + margin_left +) + + +four_side_shorthand!(padding, specified::LengthOrPercentage::parse, + padding_top, + padding_right, + padding_bottom, + padding_left +) From be51f4fb8f3bb894aa97bd60abce8345b18af45d Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Wed, 14 Aug 2013 00:30:31 +0100 Subject: [PATCH 17/29] Remove the peekable() overhead in font-family parsing. --- properties/longhands.rs | 6 ++---- properties/shorthands.rs | 8 ++++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/properties/longhands.rs b/properties/longhands.rs index 26aee4c2acb..64c859869a0 100644 --- a/properties/longhands.rs +++ b/properties/longhands.rs @@ -191,11 +191,9 @@ pub mod font_family { /// = | [ + ] /// TODO: pub fn parse(input: &[ComponentValue]) -> Option { - // XXX Using peekable() for compat with parsing of the 'font' shorthand. - from_iter(input.skip_whitespace().peekable()) + from_iter(input.skip_whitespace()) } - type Iter<'self> = iterator::Peekable<&'self ComponentValue, SkipWhitespaceIterator<'self>>; - pub fn from_iter(mut iter: Iter) -> Option { + pub fn from_iter<'a>(mut iter: SkipWhitespaceIterator<'a>) -> Option { let mut result = ~[]; macro_rules! add( ($value: expr) => { diff --git a/properties/shorthands.rs b/properties/shorthands.rs index 014969b6b7f..b4358883813 100644 --- a/properties/shorthands.rs +++ b/properties/shorthands.rs @@ -245,10 +245,10 @@ shorthand!(font [ if size.is_none() || (count(&style) + count(&weight) + count(&variant) + nb_normals) > 3 { return None } - let mut iter = iter.peekable(); - match iter.peek() { - Some(& &Delim('/')) => { - iter.next(); + let mut copied_iter = iter.clone(); + match copied_iter.next() { + Some(&Delim('/')) => { + iter = copied_iter; line_height = match iter.next() { Some(v) => line_height::from_component_value(v), _ => return None, From b5860f407f83c90fed6ee5a8ba08acca5dc37e82 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Wed, 14 Aug 2013 14:17:33 +0100 Subject: [PATCH 18/29] Only allow one @charset rule. --- stylesheets.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stylesheets.rs b/stylesheets.rs index 84ba98f33ab..46ae1a953f6 100644 --- a/stylesheets.rs +++ b/stylesheets.rs @@ -56,7 +56,7 @@ fn parse_stylesheet(css: &str) -> Stylesheet { log_css_error(rule.location, "@charset must be the first rule") } // Valid @charset rules are just ignored - next_state = state; + next_state = STATE_IMPORTS; }, "import" => { if state > STATE_IMPORTS { From 8fec26174be9f0125a24dc0923f81880f75bc03e Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 16 Aug 2013 14:48:52 +0100 Subject: [PATCH 19/29] Upgrade to rustc 0.8-pre (0a677bc 2013-08-14 10:35:12 -0700) --- errors.rs | 2 +- media_queries.rs | 7 +++---- parsing_utils.rs | 4 ++-- properties/common_types.rs | 8 ++++---- properties/longhands.rs | 10 +++++----- properties/mod.rs | 4 ++-- properties/shorthands.rs | 2 +- selectors.rs | 15 ++++++--------- stylesheets.rs | 6 +++--- 9 files changed, 27 insertions(+), 31 deletions(-) diff --git a/errors.rs b/errors.rs index 7a64d0192dd..2a60f66dca8 100644 --- a/errors.rs +++ b/errors.rs @@ -8,7 +8,7 @@ use cssparser::{SyntaxError, SourceLocation}; pub struct ErrorLoggerIterator(I); impl>> Iterator for ErrorLoggerIterator { - pub fn next(&mut self) -> Option { + fn next(&mut self) -> Option { for result in **self { match result { Ok(v) => return Some(v), diff --git a/media_queries.rs b/media_queries.rs index c32642d18b1..3266130fcf1 100644 --- a/media_queries.rs +++ b/media_queries.rs @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use std::ascii::to_ascii_lower; +use std::ascii::StrAsciiExt; use cssparser::*; use errors::{ErrorLoggerIterator, log_css_error}; use stylesheets::{CSSRule, CSSMediaRule, parse_style_rule, parse_nested_at_rule}; @@ -60,7 +60,7 @@ pub fn parse_media_rule(rule: AtRule, parent_rules: &mut ~[CSSRule], match rule { QualifiedRule(rule) => parse_style_rule(rule, &mut rules, namespaces), AtRule(rule) => parse_nested_at_rule( - to_ascii_lower(rule.name), rule, &mut rules, namespaces), + rule.name.to_ascii_lower(), rule, &mut rules, namespaces), } } parent_rules.push(CSSMediaRule(MediaRule { @@ -80,8 +80,7 @@ pub fn parse_media_query_list(input: &[ComponentValue]) -> MediaQueryList { loop { let mq = match next { Some(&Ident(ref value)) => { - let media_type: &str = to_ascii_lower(value.as_slice()); - match media_type { + match value.to_ascii_lower().as_slice() { "screen" => Some(MediaQuery{ media_type: MediaType(Screen) }), "print" => Some(MediaQuery{ media_type: MediaType(Print) }), "all" => Some(MediaQuery{ media_type: All }), diff --git a/parsing_utils.rs b/parsing_utils.rs index 9f3cfddcab0..062e4f5a6ae 100644 --- a/parsing_utils.rs +++ b/parsing_utils.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use std::ascii::to_ascii_lower; +use std::ascii::StrAsciiExt; use cssparser::*; @@ -15,7 +15,7 @@ pub fn one_component_value<'a>(input: &'a [ComponentValue]) -> Option<&'a Compon pub fn get_ident_lower(component_value: &ComponentValue) -> Option<~str> { match component_value { - &Ident(ref value) => Some(to_ascii_lower(value.as_slice())), + &Ident(ref value) => Some(value.to_ascii_lower()), _ => None, } } diff --git a/properties/common_types.rs b/properties/common_types.rs index 53b30dde27c..80304ff7fe0 100644 --- a/properties/common_types.rs +++ b/properties/common_types.rs @@ -11,7 +11,7 @@ pub type Integer = i64; pub mod specified { - use std::ascii::{to_ascii_lower, eq_ignore_ascii_case}; + use std::ascii::StrAsciiExt; use cssparser::*; use super::{Integer, Float}; @@ -50,7 +50,7 @@ pub mod specified { Length::parse_internal(input, /* negative_ok = */ false) } pub fn parse_dimension(value: Float, unit: &str) -> Option { - match to_ascii_lower(unit).as_slice() { + match unit.to_ascii_lower().as_slice() { "px" => Some(Length::from_px(value)), "in" => Some(Au((value * AU_PER_IN) as Integer)), "cm" => Some(Au((value * AU_PER_CM) as Integer)), @@ -106,8 +106,8 @@ pub mod specified { => Length::parse_dimension(value.value, unit.as_slice()).map_move(Length_), &ast::Percentage(ref value) if negative_ok || value.value >= 0. => Some(Percentage_(value.value)), - &Number(ref value) if value.value == 0. => Some(Length_(Au(0))), - &Ident(ref value) if eq_ignore_ascii_case(value.as_slice(), "auto") => Some(Auto), + &Number(ref value) if value.value == 0. => Some(Length_(Au(0))), + &Ident(ref value) if value.eq_ignore_ascii_case("auto") => Some(Auto), _ => None } } diff --git a/properties/longhands.rs b/properties/longhands.rs index 64c859869a0..e0bc102f8f2 100644 --- a/properties/longhands.rs +++ b/properties/longhands.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -pub use std::ascii::{to_ascii_lower, eq_ignore_ascii_case}; +use std::ascii::StrAsciiExt; pub use std::iterator; pub use std::option; pub use cssparser::*; @@ -84,7 +84,7 @@ single_type!(border_left_style, BorderStyle) pub fn parse_border_width(component_value: &ComponentValue) -> Option { match component_value { - &Ident(ref value) => match to_ascii_lower(value.as_slice()).as_slice() { + &Ident(ref value) => match value.to_ascii_lower().as_slice() { "thin" => Some(specified::Length::from_px(1.)), "medium" => Some(specified::Length::from_px(3.)), "thick" => Some(specified::Length::from_px(5.)), @@ -154,7 +154,7 @@ pub mod line_height { => Some(Percentage(value.value)), &Dimension(ref value, ref unit) if value.value >= 0. => specified::Length::parse_dimension(value.value, unit.as_slice()).map_move(Length), - &Ident(ref value) if eq_ignore_ascii_case(value.as_slice(), "auto") + &Ident(ref value) if value.eq_ignore_ascii_case("auto") => Some(Normal), _ => None, } @@ -213,7 +213,7 @@ pub mod font_family { Some(&String(ref value)) => add!(FamilyName(value.to_owned())), Some(&Ident(ref value)) => { let value = value.as_slice(); - match to_ascii_lower(value).as_slice() { + match value.to_ascii_lower().as_slice() { "serif" => add!(Serif), "sans-serif" => add!(SansSerif), "cursive" => add!(Cursive), @@ -273,7 +273,7 @@ pub mod font_weight { } pub fn from_component_value(input: &ComponentValue) -> Option { match input { - &Ident(ref value) => match to_ascii_lower(value.as_slice()).as_slice() { + &Ident(ref value) => match value.to_ascii_lower().as_slice() { "bold" => Some(Weight700), "normal" => Some(Weight400), "bolder" => Some(Bolder), diff --git a/properties/mod.rs b/properties/mod.rs index 73a8716a828..fc1bd46d7f2 100644 --- a/properties/mod.rs +++ b/properties/mod.rs @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use std::ascii::to_ascii_lower; +use std::ascii::StrAsciiExt; use cssparser::*; use errors::{ErrorLoggerIterator, log_css_error}; @@ -28,7 +28,7 @@ pub fn parse_property_declaration_list(input: ~[Node]) -> PropertyDeclarationBlo rule.location, fmt!("Unsupported at-rule in declaration list: @%s", rule.name)), Declaration(Declaration{ location: l, name: n, value: v, important: i}) => { let list = if i { &mut important } else { &mut normal }; - if !parse_one_property_declaration(to_ascii_lower(n), v, list) { + if !parse_one_property_declaration(n.to_ascii_lower(), v, list) { log_css_error(l, "Invalid property declaration") } } diff --git a/properties/shorthands.rs b/properties/shorthands.rs index b4358883813..178d6bfbe8b 100644 --- a/properties/shorthands.rs +++ b/properties/shorthands.rs @@ -208,7 +208,7 @@ shorthand!(font [ // font-style, font-weight and font-variant. // Leaves the values to None, 'normal' is the initial value for each of them. if get_ident_lower(component_value).filtered( - |v| eq_ignore_ascii_case(v.as_slice(), "normal")).is_some() { + |v| v.eq_ignore_ascii_case("normal")).is_some() { nb_normals += 1; loop; } diff --git a/selectors.rs b/selectors.rs index 8fbe6a67024..2cacb177b54 100644 --- a/selectors.rs +++ b/selectors.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use std::{vec, iterator}; -use std::ascii::to_ascii_lower; +use std::ascii::StrAsciiExt; use cssparser::*; use namespaces::NamespaceMap; @@ -230,7 +230,7 @@ fn parse_type_selector(iter: &mut Iter, namespaces: &NamespaceMap) } match local_name { Some(name) => simple_selectors.push(LocalNameSelector{ - lowercase_name: to_ascii_lower(name), + lowercase_name: name.to_ascii_lower(), cased_name: name, }), None => (), @@ -366,7 +366,7 @@ fn parse_attribute_selector(content: ~[ComponentValue], namespaces: &NamespaceMa Some(Some((_, None))) => fail!("Implementation error, this should not happen."), Some(Some((namespace, Some(local_name)))) => AttrSelector { namespace: namespace, - lowercase_name: to_ascii_lower(local_name), + lowercase_name: local_name.to_ascii_lower(), cased_name: local_name, }, }; @@ -394,8 +394,7 @@ fn parse_attribute_selector(content: ~[ComponentValue], namespaces: &NamespaceMa fn parse_simple_pseudo_class(name: ~str) -> Option> { - let lower_name: &str = to_ascii_lower(name); - match lower_name { + match name.to_ascii_lower().as_slice() { "root" => Some(Left(Root)), "empty" => Some(Left(Empty)), @@ -412,8 +411,7 @@ fn parse_simple_pseudo_class(name: ~str) -> Option Option { - let lower_name: &str = to_ascii_lower(name); - match lower_name { + match name.to_ascii_lower().as_slice() { "lang" => parse_lang(arguments), "nth-child" => parse_nth(arguments).map(|&(a, b)| NthChild(a, b)), "not" => if inside_negation { None } else { parse_negation(arguments, namespaces) }, @@ -423,8 +421,7 @@ fn parse_functional_pseudo_class(name: ~str, arguments: ~[ComponentValue], fn parse_pseudo_element(name: ~str) -> Option { - let lower_name: &str = to_ascii_lower(name); - match lower_name { + match name.to_ascii_lower().as_slice() { // All supported pseudo-elements "before" => Some(Before), "after" => Some(After), diff --git a/stylesheets.rs b/stylesheets.rs index 46ae1a953f6..5d9d5a2a9fa 100644 --- a/stylesheets.rs +++ b/stylesheets.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use std::iterator::Iterator; -use std::ascii::to_ascii_lower; +use std::ascii::StrAsciiExt; use cssparser::*; use selectors; use properties; @@ -49,8 +49,8 @@ fn parse_stylesheet(css: &str) -> Stylesheet { parse_style_rule(rule, &mut rules, &namespaces) }, AtRule(rule) => { - let lower_name: &str = to_ascii_lower(rule.name); - match lower_name { + let lower_name = rule.name.to_ascii_lower(); + match lower_name.as_slice() { "charset" => { if state > STATE_CHARSET { log_css_error(rule.location, "@charset must be the first rule") From 622bc5705cdbb17daa147cdfc1a98edd528681b3 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 22 Aug 2013 15:37:49 +0100 Subject: [PATCH 20/29] Add PropertyDeclaration, refactor property parsing to use a Mako template. --- .gitignore | 2 + Makefile.in | 7 +- Mako-0.8.1.zip | Bin 0 -> 481842 bytes properties/common_types.rs | 30 -- properties/longhands.rs | 362 --------------------- properties/mod.rs | 48 --- properties/mod.rs.mako | 639 +++++++++++++++++++++++++++++++++++++ properties/shorthands.rs | 286 ----------------- 8 files changed, 647 insertions(+), 727 deletions(-) create mode 100644 Mako-0.8.1.zip delete mode 100644 properties/longhands.rs delete mode 100644 properties/mod.rs create mode 100644 properties/mod.rs.mako delete mode 100644 properties/shorthands.rs diff --git a/.gitignore b/.gitignore index 504bab8100a..55369470c0c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,7 @@ *.dylib *.dll *.dummy +*.pyc *-test Makefile +properties/mod.rs diff --git a/Makefile.in b/Makefile.in index f19332bac2d..585705efd53 100644 --- a/Makefile.in +++ b/Makefile.in @@ -9,7 +9,8 @@ RUSTC ?= rustc RUSTFLAGS ?= -L $(CSSPARSER_DIR) -RUST_SRC=$(shell find $(VPATH)/. -type f -name '*.rs') $(CSSPARSER_DIR)/libcssparser.dummy +PROPERTIES_RS=$(VPATH)/properties/mod.rs +RUST_SRC=$(shell find $(VPATH)/. -type f -name '*.rs') $(CSSPARSER_DIR)/libcssparser.dummy $(PROPERTIES_RS) .PHONY: all all: libservo-style.dummy @@ -32,3 +33,7 @@ check-debug: servo-style-tests .PHONY: clean clean: rm -f *.o *.a *.so *.dylib *.dll *.dummy *-test + + +$(PROPERTIES_RS): $(PROPERTIES_RS).mako + PYTHONPATH=$(VPATH)/Mako-0.8.1.zip python -c "from mako.template import Template; print(Template(filename='$<').render())" > $@ diff --git a/Mako-0.8.1.zip b/Mako-0.8.1.zip new file mode 100644 index 0000000000000000000000000000000000000000..c324c72ef8a9a40df5d32ab01d497bb55be84505 GIT binary patch literal 481842 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

@+p^{~jlgxbTNF2s*XqQZ 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 U5isnilegSj%7v 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 REcymr7=qBia5xIl{{gQElqUcH literal 0 HcmV?d00001 diff --git a/properties/common_types.rs b/properties/common_types.rs index 80304ff7fe0..1b39f46ea55 100644 --- a/properties/common_types.rs +++ b/properties/common_types.rs @@ -3,9 +3,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use cssparser::*; -use parsing_utils::*; - pub type Float = f64; pub type Integer = i64; @@ -140,30 +137,3 @@ pub mod computed { } } } - - -pub enum BorderStyle { - BorderStyleSolid, - // Uncomment when supported -// BorderStyleDotted, -// BorderStyleDashed, -// BorderStyleDouble, -// BorderStyleGroove, -// BorderStyleRidge, -// BorderStyleInset, -// BorderStyleOutset, -// BorderStyleHidden, - BorderStyleNone, -} -impl BorderStyle { - pub fn parse(input: &ComponentValue) -> Option { - do get_ident_lower(input).chain |keyword| { - match keyword.as_slice() { - "solid" => Some(BorderStyleSolid), - "none" => Some(BorderStyleNone), - _ => None, - } - } - } -} - diff --git a/properties/longhands.rs b/properties/longhands.rs deleted file mode 100644 index e0bc102f8f2..00000000000 --- a/properties/longhands.rs +++ /dev/null @@ -1,362 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - - -use std::ascii::StrAsciiExt; -pub use std::iterator; -pub use std::option; -pub use cssparser::*; -pub use CSSColor = cssparser::Color; -pub use parsing_utils::*; -pub use super::common_types::*; - - -macro_rules! single_keyword( - ($property_name: ident, $( $lower_case_keyword_string: pat => $variant: ident ),+ ) => { - pub mod $property_name { - use super::*; - pub enum SpecifiedValue { - $( $variant ),+ - } - pub fn parse(input: &[ComponentValue]) -> option::Option { - one_component_value(input).chain(from_component_value) - } - pub fn from_component_value(v: &ComponentValue) -> option::Option { - do get_ident_lower(v).chain |keyword| { - match keyword.as_slice() { - $( $lower_case_keyword_string => option::Some($variant) ),+ , - _ => option::None, - } - } - } - } - }; -) - - -macro_rules! single_type( - ($property_name: ident, $type_: ident) => { - single_type!($property_name, $type_, $type_::parse) - }; - ($property_name: ident, $type_: ty, $parse_function: expr) => { - pub mod $property_name { - use super::*; - pub type SpecifiedValue = $type_; - pub fn parse(input: &[ComponentValue]) -> Option { - one_component_value(input).chain($parse_function) - } - } - }; -) - - - -// CSS 2.1, Section 8 - Box model - -single_type!(margin_top, specified::LengthOrPercentageOrAuto, - specified::LengthOrPercentageOrAuto::parse) -single_type!(margin_right, specified::LengthOrPercentageOrAuto, - specified::LengthOrPercentageOrAuto::parse) -single_type!(margin_bottom, specified::LengthOrPercentageOrAuto, - specified::LengthOrPercentageOrAuto::parse) -single_type!(margin_left, specified::LengthOrPercentageOrAuto, - specified::LengthOrPercentageOrAuto::parse) - -single_type!(padding_top, specified::LengthOrPercentage, - specified::LengthOrPercentage::parse_non_negative) -single_type!(padding_right, specified::LengthOrPercentage, - specified::LengthOrPercentage::parse_non_negative) -single_type!(padding_bottom, specified::LengthOrPercentage, - specified::LengthOrPercentage::parse_non_negative) -single_type!(padding_left, specified::LengthOrPercentage, - specified::LengthOrPercentage::parse_non_negative) - -single_type!(border_top_color, CSSColor) -single_type!(border_right_color, CSSColor) -single_type!(border_bottom_color, CSSColor) -single_type!(border_left_color, CSSColor) - -single_type!(border_top_style, BorderStyle) -single_type!(border_right_style, BorderStyle) -single_type!(border_bottom_style, BorderStyle) -single_type!(border_left_style, BorderStyle) - -pub fn parse_border_width(component_value: &ComponentValue) -> Option { - match component_value { - &Ident(ref value) => match value.to_ascii_lower().as_slice() { - "thin" => Some(specified::Length::from_px(1.)), - "medium" => Some(specified::Length::from_px(3.)), - "thick" => Some(specified::Length::from_px(5.)), - _ => None - }, - _ => specified::Length::parse_non_negative(component_value) - } -} - -single_type!(border_top_width, specified::Length, parse_border_width) -single_type!(border_right_width, specified::Length, parse_border_width) -single_type!(border_bottom_width, specified::Length, parse_border_width) -single_type!(border_left_width, specified::Length, parse_border_width) - - -// CSS 2.1, Section 9 - Visual formatting model - -// TODO: don’t parse values we don’t support -single_keyword!(display, - "inline" => Inline, - "block" => Block, - "list-item" => ListItem, - "inline-block" => InlineBlock, - "table" => Table, - "inline-table" => InlineTable, - "table-row-group" => TableRowGroup, - "table-header-group" => TableHeaderGroup, - "table-footer-group" => TableFooterGroup, - "table-row" => TableRow, - "table-column-group" => TableColumnGroup, - "table-column" => TableColumn, - "table-cell" => TableCell, - "table-caption" => TableCaption, - "none" => None -) - -single_keyword!(position, - "static" => Static, "absolute" => Absolute, "relative" => Relative, "fixed" => Fixed) -single_keyword!(float, "left" => Left, "right" => Right, "none" => None) -single_keyword!(clear, "left" => Left, "right" => Right, "none" => None, "both" => Both) - - -// CSS 2.1, Section 10 - Visual formatting model details - -single_type!(width, specified::LengthOrPercentageOrAuto, - specified::LengthOrPercentageOrAuto::parse_non_negative) -single_type!(height, specified::LengthOrPercentageOrAuto, - specified::LengthOrPercentageOrAuto::parse_non_negative) - -pub mod line_height { - use super::*; - pub enum SpecifiedValue { - Normal, - Length(specified::Length), - Percentage(Float), - Number(Float), - } - /// normal | | | - pub fn parse(input: &[ComponentValue]) -> Option { - one_component_value(input).chain(from_component_value) - } - pub fn from_component_value(input: &ComponentValue) -> Option { - match input { - &ast::Number(ref value) if value.value >= 0. - => Some(Number(value.value)), - &ast::Percentage(ref value) if value.value >= 0. - => Some(Percentage(value.value)), - &Dimension(ref value, ref unit) if value.value >= 0. - => specified::Length::parse_dimension(value.value, unit.as_slice()).map_move(Length), - &Ident(ref value) if value.eq_ignore_ascii_case("auto") - => Some(Normal), - _ => None, - } - } -} - - -// CSS 2.1, Section 11 - Visual effects - -// CSS 2.1, Section 12 - Generated content, automatic numbering, and lists - -// CSS 2.1, Section 13 - Paged media - -// CSS 2.1, Section 14 - Colors and Backgrounds - -single_type!(background_color, CSSColor) -single_type!(color, CSSColor) - -// CSS 2.1, Section 15 - Fonts - -pub mod font_family { - use super::*; - enum FontFamily { - FamilyName(~str), - // Generic - Serif, - SansSerif, - Cursive, - Fantasy, - Monospace, - } - pub type SpecifiedValue = ~[FontFamily]; - /// # - /// = | [ + ] - /// TODO: - pub fn parse(input: &[ComponentValue]) -> Option { - from_iter(input.skip_whitespace()) - } - pub fn from_iter<'a>(mut iter: SkipWhitespaceIterator<'a>) -> Option { - let mut result = ~[]; - macro_rules! add( - ($value: expr) => { - { - result.push($value); - match iter.next() { - Some(&Comma) => (), - None => break 'outer, - _ => return None, - } - } - } - ) - 'outer: loop { - match iter.next() { - // TODO: avoid copying strings? - Some(&String(ref value)) => add!(FamilyName(value.to_owned())), - Some(&Ident(ref value)) => { - let value = value.as_slice(); - match value.to_ascii_lower().as_slice() { - "serif" => add!(Serif), - "sans-serif" => add!(SansSerif), - "cursive" => add!(Cursive), - "fantasy" => add!(Fantasy), - "monospace" => add!(Monospace), - _ => { - let mut idents = ~[value]; - loop { - match iter.next() { - Some(&Ident(ref value)) => idents.push(value.as_slice()), - Some(&Comma) => { - result.push(FamilyName(idents.connect(" "))); - break - }, - None => { - result.push(FamilyName(idents.connect(" "))); - break 'outer - }, - _ => return None, - } - } - } - } - } - _ => return None, - } - } - Some(result) - } -} - -single_keyword!(font_style, "normal" => Normal, "italic" => Italic, "oblique" => Oblique) -single_keyword!(font_variant, - // Uncomment when supported - //"small-caps" => SmallCaps, - "normal" => Normal -) - -pub mod font_weight { - use super::*; - pub enum SpecifiedValue { - Bolder, - Lighther, - Weight100, - Weight200, - Weight300, - Weight400, - Weight500, - Weight600, - Weight700, - Weight800, - Weight900, - } - /// normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 - pub fn parse(input: &[ComponentValue]) -> Option { - one_component_value(input).chain(from_component_value) - } - pub fn from_component_value(input: &ComponentValue) -> Option { - match input { - &Ident(ref value) => match value.to_ascii_lower().as_slice() { - "bold" => Some(Weight700), - "normal" => Some(Weight400), - "bolder" => Some(Bolder), - "lighter" => Some(Lighther), - _ => None, - }, - &Number(ref value) => match value.int_value { - Some(100) => Some(Weight100), - Some(200) => Some(Weight200), - Some(300) => Some(Weight300), - Some(400) => Some(Weight400), - Some(500) => Some(Weight500), - Some(600) => Some(Weight600), - Some(700) => Some(Weight700), - Some(800) => Some(Weight800), - Some(900) => Some(Weight900), - _ => None, - }, - _ => None - } - } -} - -pub mod font_size { - use super::*; - pub type SpecifiedValue = specified::Length; // Percentages are the same as em. - /// | - /// TODO: support and - pub fn parse(input: &[ComponentValue]) -> Option { - one_component_value(input).chain(from_component_value) - } - pub fn from_component_value(input: &ComponentValue) -> Option { - do specified::LengthOrPercentage::parse_non_negative(input).map_move |value| { - match value { - specified::Length(value) => value, - specified::Percentage(value) => specified::Em(value), - } - } - } -} - -// CSS 2.1, Section 16 - Text - -single_keyword!(text_align, "left" => Left, "right" => Right, - "center" => Center, "justify" => Justify) - -pub mod text_decoration { - use super::*; - pub struct SpecifiedValue { - underline: bool, - overline: bool, - line_through: bool, - // 'blink' is accepted in the parser but ignored. - // Just not blinking the text is a conforming implementation per CSS 2.1. - } - /// none | [ underline || overline || line-through || blink ] - fn parse(input: &[ComponentValue]) -> Option { - let mut result = SpecifiedValue { - underline: false, overline: false, line_through: false, - }; - let mut blink = false; - let mut empty = true; - for component_value in input.skip_whitespace() { - match get_ident_lower(component_value) { - None => return None, - Some(keyword) => match keyword.as_slice() { - "underline" => if result.underline { return None } - else { empty = false; result.underline = true }, - "overline" => if result.overline { return None } - else { empty = false; result.overline = true }, - "line-through" => if result.line_through { return None } - else { empty = false; result.line_through = true }, - "blink" => if blink { return None } - else { empty = false; blink = true }, - "none" => return if empty { Some(result) } else { None }, - _ => return None, - } - } - } - if !empty { Some(result) } else { None } - } -} - -// CSS 2.1, Section 17 - Tables - -// CSS 2.1, Section 18 - User interface diff --git a/properties/mod.rs b/properties/mod.rs deleted file mode 100644 index fc1bd46d7f2..00000000000 --- a/properties/mod.rs +++ /dev/null @@ -1,48 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use std::ascii::StrAsciiExt; -use cssparser::*; -use errors::{ErrorLoggerIterator, log_css_error}; - -pub mod common_types; -pub mod longhands; -pub mod shorthands; - - -pub struct PropertyDeclarationBlock { - important: ~[PropertyDeclaration], - normal: ~[PropertyDeclaration], -} - -pub struct PropertyDeclaration; // TODO - - -pub fn parse_property_declaration_list(input: ~[Node]) -> PropertyDeclarationBlock { - let mut important = ~[]; - let mut normal = ~[]; - for item in ErrorLoggerIterator(parse_declaration_list(input.move_iter())) { - match item { - Decl_AtRule(rule) => log_css_error( - rule.location, fmt!("Unsupported at-rule in declaration list: @%s", rule.name)), - Declaration(Declaration{ location: l, name: n, value: v, important: i}) => { - let list = if i { &mut important } else { &mut normal }; - if !parse_one_property_declaration(n.to_ascii_lower(), v, list) { - log_css_error(l, "Invalid property declaration") - } - } - } - } - PropertyDeclarationBlock { important: important, normal: normal } -} - - -fn parse_one_property_declaration(name: &str, value: ~[ComponentValue], - result_list: &mut ~[PropertyDeclaration]) -> bool { - - let _ = name; - let _ = value; - let _ = result_list; - false -} diff --git a/properties/mod.rs.mako b/properties/mod.rs.mako new file mode 100644 index 00000000000..7bcd3bd6636 --- /dev/null +++ b/properties/mod.rs.mako @@ -0,0 +1,639 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// This file is a Mako template: http://www.makotemplates.org/ + +use std::ascii::StrAsciiExt; +use errors::{ErrorLoggerIterator, log_css_error}; +pub use std::iterator; +pub use cssparser::*; +pub use CSSColor = cssparser::Color; +pub use parsing_utils::*; +pub use self::common_types::*; + +pub mod common_types; + + +<%! + +def to_rust_ident(name): + name = name.replace("-", "_") + if name in ["static"]: # Rust keywords + name += "_" + return name + +class Longhand(object): + def __init__(self, name): + self.name = name + self.ident = to_rust_ident(name) + + +class Shorthand(object): + def __init__(self, name, sub_properties): + self.name = name + self.ident = to_rust_ident(name) + self.sub_properties = [Longhand(s) for s in sub_properties] + +longhands = [] +shorthands = [] + +%> + +pub mod longhands { + pub use super::*; + + <%def name="longhand(name)"> + <% + property = Longhand(name) + longhands.append(property) + %> + pub mod ${property.ident} { + use super::*; + ${caller.body()} + } + + + <%def name="single_component_value(name)"> + <%self:longhand name="${name}"> + ${caller.body()} + pub fn parse(input: &[ComponentValue]) -> Option { + one_component_value(input).chain(from_component_value) + } + + + + <%def name="single_keyword(name, values)"> + <%self:single_component_value name="${name}"> + pub enum SpecifiedValue { + % for value in values.split(): + ${to_rust_ident(value)}, + % endfor + } + pub fn from_component_value(v: &ComponentValue) -> Option { + do get_ident_lower(v).chain |keyword| { + match keyword.as_slice() { + % for value in values.split(): + "${value}" => Some(${to_rust_ident(value)}), + % endfor + _ => None, + } + } + } + + + + <%def name="predefined_function(name, result_type, function)"> + <%self:longhand name="${name}"> + pub type SpecifiedValue = ${result_type}; + pub fn parse(input: &[ComponentValue]) -> Option { + one_component_value(input).chain(${function}) + } + + + + <%def name="predefined_type(name, type)"> + ${predefined_function(name, type, type + "::parse")} + + + + // CSS 2.1, Section 8 - Box model + + ${predefined_function("margin-top", "specified::LengthOrPercentageOrAuto", + "specified::LengthOrPercentageOrAuto::parse")} + ${predefined_function("margin-right", "specified::LengthOrPercentageOrAuto", + "specified::LengthOrPercentageOrAuto::parse")} + ${predefined_function("margin-bottom", "specified::LengthOrPercentageOrAuto", + "specified::LengthOrPercentageOrAuto::parse")} + ${predefined_function("margin-left", "specified::LengthOrPercentageOrAuto", + "specified::LengthOrPercentageOrAuto::parse")} + + ${predefined_function("padding-top", + "specified::LengthOrPercentage", + "specified::LengthOrPercentage::parse_non_negative")} + ${predefined_function("padding-right", + "specified::LengthOrPercentage", + "specified::LengthOrPercentage::parse_non_negative")} + ${predefined_function("padding-bottom", + "specified::LengthOrPercentage", + "specified::LengthOrPercentage::parse_non_negative")} + ${predefined_function("padding-left", + "specified::LengthOrPercentage", + "specified::LengthOrPercentage::parse_non_negative")} + + ${predefined_type("border-top-color", "CSSColor")} + ${predefined_type("border-right-color", "CSSColor")} + ${predefined_type("border-bottom-color", "CSSColor")} + ${predefined_type("border-left-color", "CSSColor")} + + pub enum BorderStyle { + BorderStyleSolid, + // Uncomment when supported +// BorderStyleDotted, +// BorderStyleDashed, +// BorderStyleDouble, +// BorderStyleGroove, +// BorderStyleRidge, +// BorderStyleInset, +// BorderStyleOutset, +// BorderStyleHidden, + BorderStyleNone, + } + impl BorderStyle { + pub fn parse(input: &ComponentValue) -> Option { + do get_ident_lower(input).chain |keyword| { + match keyword.as_slice() { + "solid" => Some(BorderStyleSolid), + "none" => Some(BorderStyleNone), + _ => None, + } + } + } + } + ${predefined_type("border-top-style", "BorderStyle")} + ${predefined_type("border-right-style", "BorderStyle")} + ${predefined_type("border-bottom-style", "BorderStyle")} + ${predefined_type("border-left-style", "BorderStyle")} + + pub fn parse_border_width(component_value: &ComponentValue) -> Option { + match component_value { + &Ident(ref value) => match value.to_ascii_lower().as_slice() { + "thin" => Some(specified::Length::from_px(1.)), + "medium" => Some(specified::Length::from_px(3.)), + "thick" => Some(specified::Length::from_px(5.)), + _ => None + }, + _ => specified::Length::parse_non_negative(component_value) + } + } + ${predefined_function("border-top-width", "specified::Length", "parse_border_width")} + ${predefined_function("border-right-width", "specified::Length", "parse_border_width")} + ${predefined_function("border-bottom-width", "specified::Length", "parse_border_width")} + ${predefined_function("border-left-width", "specified::Length", "parse_border_width")} + + // CSS 2.1, Section 9 - Visual formatting model + + // TODO: don't parse values we don't support + ${single_keyword("display", + "inline block list-item inline-block none " + )} +// "table inline-table table-row-group table-header-group table-footer-group " +// "table-row table-column-group table-column table-cell table-caption" + + ${single_keyword("position", "static absolute relative fixed")} + ${single_keyword("float", "left right none")} + ${single_keyword("clear", "left right none both")} + + // CSS 2.1, Section 10 - Visual formatting model details + + ${predefined_function("width", + "specified::LengthOrPercentageOrAuto", + "specified::LengthOrPercentageOrAuto::parse_non_negative")} + ${predefined_function("height", + "specified::LengthOrPercentageOrAuto", + "specified::LengthOrPercentageOrAuto::parse_non_negative")} + + <%self:single_component_value name="line-height"> + pub enum SpecifiedValue { + Normal, + Length(specified::Length), + Percentage(Float), + Number(Float), + } + /// normal | | | + pub fn from_component_value(input: &ComponentValue) -> Option { + match input { + &ast::Number(ref value) if value.value >= 0. + => Some(Number(value.value)), + &ast::Percentage(ref value) if value.value >= 0. + => Some(Percentage(value.value)), + &Dimension(ref value, ref unit) if value.value >= 0. + => specified::Length::parse_dimension(value.value, unit.as_slice()) + .map_move(Length), + &Ident(ref value) if value.eq_ignore_ascii_case("auto") + => Some(Normal), + _ => None, + } + } + + + // CSS 2.1, Section 11 - Visual effects + + // CSS 2.1, Section 12 - Generated content, automatic numbering, and lists + + // CSS 2.1, Section 13 - Paged media + + // CSS 2.1, Section 14 - Colors and Backgrounds + + ${predefined_type("background-color", "CSSColor")} + ${predefined_type("color", "CSSColor")} + + // CSS 2.1, Section 15 - Fonts + + <%self:longhand name="font-family"> + enum FontFamily { + FamilyName(~str), + // Generic +// Serif, +// SansSerif, +// Cursive, +// Fantasy, +// Monospace, + } + pub type SpecifiedValue = ~[FontFamily]; + /// # + /// = | [ + ] + /// TODO: + pub fn parse(input: &[ComponentValue]) -> Option { + from_iter(input.skip_whitespace()) + } + pub fn from_iter<'a>(mut iter: SkipWhitespaceIterator<'a>) -> Option { + let mut result = ~[]; + macro_rules! add( + ($value: expr) => { + { + result.push($value); + match iter.next() { + Some(&Comma) => (), + None => break 'outer, + _ => return None, + } + } + } + ) + 'outer: loop { + match iter.next() { + // TODO: avoid copying strings? + Some(&String(ref value)) => add!(FamilyName(value.to_owned())), + Some(&Ident(ref value)) => { + let value = value.as_slice(); + match value.to_ascii_lower().as_slice() { +// "serif" => add!(Serif), +// "sans-serif" => add!(SansSerif), +// "cursive" => add!(Cursive), +// "fantasy" => add!(Fantasy), +// "monospace" => add!(Monospace), + _ => { + let mut idents = ~[value]; + loop { + match iter.next() { + Some(&Ident(ref value)) => idents.push(value.as_slice()), + Some(&Comma) => { + result.push(FamilyName(idents.connect(" "))); + break + }, + None => { + result.push(FamilyName(idents.connect(" "))); + break 'outer + }, + _ => return None, + } + } + } + } + } + _ => return None, + } + } + Some(result) + } + + + + ${single_keyword("font-style", "normal italic oblique")} + ${single_keyword("font-variant", "normal")} // Add small-caps when supported + + <%self:single_component_value name="font-weight"> + pub enum SpecifiedValue { + Bolder, + Lighther, + Weight100, + Weight200, + Weight300, + Weight400, + Weight500, + Weight600, + Weight700, + Weight800, + Weight900, + } + /// normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 + pub fn from_component_value(input: &ComponentValue) -> Option { + match input { + &Ident(ref value) => match value.to_ascii_lower().as_slice() { + "bold" => Some(Weight700), + "normal" => Some(Weight400), + "bolder" => Some(Bolder), + "lighter" => Some(Lighther), + _ => None, + }, + &Number(ref value) => match value.int_value { + Some(100) => Some(Weight100), + Some(200) => Some(Weight200), + Some(300) => Some(Weight300), + Some(400) => Some(Weight400), + Some(500) => Some(Weight500), + Some(600) => Some(Weight600), + Some(700) => Some(Weight700), + Some(800) => Some(Weight800), + Some(900) => Some(Weight900), + _ => None, + }, + _ => None + } + } + + + <%self:single_component_value name="font-size"> + pub type SpecifiedValue = specified::Length; // Percentages are the same as em. + /// | + /// TODO: support and + pub fn from_component_value(input: &ComponentValue) -> Option { + do specified::LengthOrPercentage::parse_non_negative(input).map_move |value| { + match value { + specified::Length(value) => value, + specified::Percentage(value) => specified::Em(value), + } + } + } + + + // CSS 2.1, Section 16 - Text + + ${single_keyword("text-align", "left right center justify")} + + <%self:longhand name="text-decoration"> + pub struct SpecifiedValue { + underline: bool, + overline: bool, + line_through: bool, + // 'blink' is accepted in the parser but ignored. + // Just not blinking the text is a conforming implementation per CSS 2.1. + } + /// none | [ underline || overline || line-through || blink ] + pub fn parse(input: &[ComponentValue]) -> Option { + let mut result = SpecifiedValue { + underline: false, overline: false, line_through: false, + }; + let mut blink = false; + let mut empty = true; + for component_value in input.skip_whitespace() { + match get_ident_lower(component_value) { + None => return None, + Some(keyword) => match keyword.as_slice() { + "underline" => if result.underline { return None } + else { empty = false; result.underline = true }, + "overline" => if result.overline { return None } + else { empty = false; result.overline = true }, + "line-through" => if result.line_through { return None } + else { empty = false; result.line_through = true }, + "blink" => if blink { return None } + else { empty = false; blink = true }, + "none" => return if empty { Some(result) } else { None }, + _ => return None, + } + } + } + if !empty { Some(result) } else { None } + } + + + // CSS 2.1, Section 17 - Tables + + // CSS 2.1, Section 18 - User interface +} + + +pub mod shorthands { + pub use super::*; + pub use super::longhands::*; + + <%def name="shorthand(name, sub_properties)"> + <% + shorthand = Shorthand(name, sub_properties.split()) + shorthands.append(shorthand) + %> + pub mod ${shorthand.ident} { + use super::*; + struct Longhands { + % for sub_property in shorthand.sub_properties: + ${sub_property.ident}: Option<${sub_property.ident}::SpecifiedValue>, + % endfor + } + pub fn parse(input: &[ComponentValue]) -> Option { + ${caller.body()} + } + } + + + <%def name="four_sides_shorthand(name, sub_property_pattern, parser_function)"> + <%self:shorthand name="${name}" sub_properties="${ + ' '.join(sub_property_pattern % side + for side in ['top', 'right', 'bottom', 'left'])}"> + let mut iter = input.skip_whitespace().map(${parser_function}); + // zero or more than four values is invalid. + // one value sets them all + // two values set (top, bottom) and (left, right) + // three values set top, (left, right) and bottom + // four values set them in order + let top = iter.next().unwrap_or_default(None); + let right = iter.next().unwrap_or_default(top); + let bottom = iter.next().unwrap_or_default(top); + let left = iter.next().unwrap_or_default(right); + if top.is_some() && right.is_some() && bottom.is_some() && left.is_some() + && iter.next().is_none() { + Some(Longhands { + % for side in ["top", "right", "bottom", "left"]: + ${to_rust_ident(sub_property_pattern % side)}: ${side}, + % endfor + }) + } else { + None + } + + + + + // TODO: other background-* properties + <%self:shorthand name="background" sub_properties="background-color"> + do one_component_value(input).chain(CSSColor::parse).map_move |color| { + Longhands { background_color: Some(color) } + } + + + ${four_sides_shorthand("border-color", "border-%s-color", "CSSColor::parse")} + ${four_sides_shorthand("border-style", "border-%s-style", "BorderStyle::parse")} + ${four_sides_shorthand("border-width", "border-%s-width", "parse_border_width")} + + pub fn parse_border(input: &[ComponentValue]) -> Option<(Option, Option, + Option)> { + let mut color = None; + let mut style = None; + let mut width = None; + let mut any = false; + for component_value in input.skip_whitespace() { + if color.is_none() { + match CSSColor::parse(component_value) { + Some(c) => { color = Some(c); any = true; loop }, + None => () + } + } + if style.is_none() { + match BorderStyle::parse(component_value) { + Some(s) => { style = Some(s); any = true; loop }, + None => () + } + } + if width.is_none() { + match parse_border_width(component_value) { + Some(w) => { width = Some(w); any = true; loop }, + None => () + } + } + return None + } + if any { Some((color, style, width)) } else { None } + } + + <%def name="border_side(side)"> + <%self:shorthand name="border-${side}" sub_properties="border-${side}-color + border-${side}-style + border-${side}-width"> + do parse_border(input).map_move |(color, style, width)| { + Longhands { border_${side}_color: color, border_${side}_style: style, + border_${side}_width: width } + } + + + + ${border_side("top")} + ${border_side("right")} + ${border_side("bottom")} + ${border_side("left")} + + <%self:shorthand name="border" sub_properties=" + border-top-color + border-top-width + border-top-style + border-right-color + border-right-width + border-right-style + border-bottom-color + border-bottom-width + border-bottom-style + border-left-color + border-left-width + border-left-style + "> + do parse_border(input).map_move |(color, style, width)| { + Longhands { + border_top_color: color, border_top_style: style, border_top_width: width, + border_right_color: color, border_right_style: style, border_right_width: width, + border_bottom_color: color, border_bottom_style: style, border_bottom_width: width, + border_left_color: color, border_left_style: style, border_left_width: width, + } + } + + +} + + +pub struct PropertyDeclarationBlock { + important: ~[PropertyDeclaration], + normal: ~[PropertyDeclaration], +} + + +pub fn parse_property_declaration_list(input: ~[Node]) -> PropertyDeclarationBlock { + let mut important = ~[]; + let mut normal = ~[]; + for item in ErrorLoggerIterator(parse_declaration_list(input.move_iter())) { + match item { + Decl_AtRule(rule) => log_css_error( + rule.location, fmt!("Unsupported at-rule in declaration list: @%s", rule.name)), + Declaration(Declaration{ location: l, name: n, value: v, important: i}) => { + let list = if i { &mut important } else { &mut normal }; + if !PropertyDeclaration::parse(n, v, list) { + log_css_error(l, "Invalid property declaration") + } + } + } + } + PropertyDeclarationBlock { important: important, normal: normal } +} + + +pub enum CSSWideKeyword { + Initial, + Inherit, + Unset, +} + +impl CSSWideKeyword { + pub fn parse(input: &[ComponentValue]) -> Option { + do one_component_value(input).chain(get_ident_lower).chain |keyword| { + match keyword.as_slice() { + "initial" => Some(Initial), + "inherit" => Some(Inherit), + "unset" => Some(Unset), + _ => None + } + } + } +} + +pub enum DeclaredValue { + SpecifiedValue(T), + CSSWideKeyword(CSSWideKeyword), +} + +pub enum PropertyDeclaration { + % for property in longhands: + ${property.ident}_declaration(DeclaredValue), + % endfor +} + +impl PropertyDeclaration { + pub fn parse(name: &str, value: &[ComponentValue], + result_list: &mut ~[PropertyDeclaration]) -> bool { + match name.to_ascii_lower().as_slice() { + % for property in longhands: + "${property.name}" => result_list.push(${property.ident}_declaration( + match CSSWideKeyword::parse(value) { + Some(keyword) => CSSWideKeyword(keyword), + None => match longhands::${property.ident}::parse(value) { + Some(value) => SpecifiedValue(value), + None => return false, + } + } + )), + % endfor + % for shorthand in shorthands: + "${shorthand.name}" => match CSSWideKeyword::parse(value) { + Some(keyword) => { + % for sub_property in shorthand.sub_properties: + result_list.push(${sub_property.ident}_declaration( + CSSWideKeyword(keyword) + )); + % endfor + }, + None => match shorthands::${shorthand.ident}::parse(value) { + Some(result) => { + % for sub_property in shorthand.sub_properties: + result_list.push(${sub_property.ident}_declaration( + match result.${sub_property.ident} { + Some(value) => SpecifiedValue(value), + None => CSSWideKeyword(Initial), + } + )); + % endfor + }, + None => return false, + } + }, + % endfor + _ => return false, // Unknown property + } + true + } +} diff --git a/properties/shorthands.rs b/properties/shorthands.rs deleted file mode 100644 index 178d6bfbe8b..00000000000 --- a/properties/shorthands.rs +++ /dev/null @@ -1,286 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -pub use super::longhands::*; - - -macro_rules! shorthand( - ($name: ident[$($longhand: ident),+] |input| $parser: expr) => { - pub mod $name { - use super::*; - struct Longhands { - $( $longhand: Option<$longhand::SpecifiedValue> ),+ - } - fn parse(input: &[ComponentValue]) -> Option { $parser } - } - }; -) - - -// The value of each longhand is the same as the value of the shorthand -macro_rules! duplicating_shorthand( - ($name: ident, $parser_function: expr, $($longhand: ident),+) => { - shorthand!($name [$($longhand),+] |input| { - do $parser_function(input).map_move |value| { - Longhands { $( $longhand: Some(value) ),+ } - } - }) - }; -) - - -macro_rules! four_side_shorthand( - ($name: ident, $parser_function: expr, - $top: ident, $right: ident, $bottom: ident, $left: ident) => { - shorthand!($name [$top, $right, $bottom, $left] |input| { - let mut iter = input.skip_whitespace().map($parser_function); - // zero or more than four values is invalid. - // one value sets them all - // two values set (top, bottom) and (left, right) - // three values set top, (left, right) and bottom - // four values set them in order - let top = iter.next().unwrap_or_default(None); - let right = iter.next().unwrap_or_default(top); - let bottom = iter.next().unwrap_or_default(top); - let left = iter.next().unwrap_or_default(right); - if top.is_some() && right.is_some() && bottom.is_some() && left.is_some() - && iter.next().is_none() { - Some(Longhands { $top: top, $right: right, $bottom: bottom, $left: left }) - } else { - None - } - }) - }; -) - - -// TODO: other background-* properties -shorthand!(background [ - background_color -] |input| { - do one_component_value(input).chain(CSSColor::parse).map_move |color| { - Longhands { background_color: Some(color) } - } -}) - - -duplicating_shorthand!(border_color, border_top_color::parse, - border_top_color, - border_right_color, - border_bottom_color, - border_left_color -) - -duplicating_shorthand!(border_width, border_top_width::parse, - border_top_width, - border_right_width, - border_bottom_width, - border_left_width -) - -duplicating_shorthand!(border_style, border_top_style::parse, - border_top_style, - border_right_style, - border_bottom_style, - border_left_style -) - - -pub fn parse_border(input: &[ComponentValue]) -> Option<(Option, Option, - Option)> { - let mut color = None; - let mut style = None; - let mut width = None; - let mut any = false; - for component_value in input.skip_whitespace() { - if color.is_none() { - match CSSColor::parse(component_value) { - Some(c) => { color = Some(c); any = true; loop }, - None => () - } - } - if style.is_none() { - match BorderStyle::parse(component_value) { - Some(s) => { style = Some(s); any = true; loop }, - None => () - } - } - if width.is_none() { - match parse_border_width(component_value) { - Some(w) => { width = Some(w); any = true; loop }, - None => () - } - } - return None - } - if any { Some((color, style, width)) } else { None } -} - - -shorthand!(border_top [ - border_top_color, - border_top_width, - border_top_style -] |input| { - do parse_border(input).map_move |(color, style, width)| { - Longhands { border_top_color: color, border_top_style: style, - border_top_width: width } - } -}) - -shorthand!(border_right [ - border_right_color, - border_right_width, - border_right_style -] |input| { - do parse_border(input).map_move |(color, style, width)| { - Longhands { border_right_color: color, border_right_style: style, - border_right_width: width } - } -}) - -shorthand!(border_bottom [ - border_bottom_color, - border_bottom_width, - border_bottom_style -] |input| { - do parse_border(input).map_move |(color, style, width)| { - Longhands { border_bottom_color: color, border_bottom_style: style, - border_bottom_width: width } - } -}) - -shorthand!(border_left [ - border_left_color, - border_left_width, - border_left_style -] |input| { - do parse_border(input).map_move |(color, style, width)| { - Longhands { border_left_color: color, border_left_style: style, - border_left_width: width } - } -}) - -shorthand!(border [ - border_top_color, - border_top_width, - border_top_style, - border_right_color, - border_right_width, - border_right_style, - border_bottom_color, - border_bottom_width, - border_bottom_style, - border_left_color, - border_left_width, - border_left_style -] |input| { - do parse_border(input).map_move |(color, style, width)| { - Longhands { - border_top_color: color, border_top_style: style, border_top_width: width, - border_right_color: color, border_right_style: style, border_right_width: width, - border_bottom_color: color, border_bottom_style: style, border_bottom_width: width, - border_left_color: color, border_left_style: style, border_left_width: width, - } - } -}) - - -// TODO: system fonts -shorthand!(font [ - font_style, - font_variant, - font_weight, - font_size, - line_height, - font_family -] |input| { - let mut iter = input.skip_whitespace(); - let mut nb_normals = 0u; - let mut style = None; - let mut variant = None; - let mut weight = None; - let mut size = None; - let mut line_height = None; - for component_value in iter { - // Special-case 'normal' because it is valid in each of - // font-style, font-weight and font-variant. - // Leaves the values to None, 'normal' is the initial value for each of them. - if get_ident_lower(component_value).filtered( - |v| v.eq_ignore_ascii_case("normal")).is_some() { - nb_normals += 1; - loop; - } - if style.is_none() { - match font_style::from_component_value(component_value) { - Some(s) => { style = Some(s); loop }, - None => () - } - } - if weight.is_none() { - match font_weight::from_component_value(component_value) { - Some(w) => { weight = Some(w); loop }, - None => () - } - } - if variant.is_none() { - match font_variant::from_component_value(component_value) { - Some(v) => { variant = Some(v); loop }, - None => () - } - } - match font_size::from_component_value(component_value) { - Some(s) => { size = Some(s); break }, - None => return None - } - } - #[inline] - fn count(opt: &Option) -> uint { - match opt { - &Some(_) => 1, - &None => 0, - } - } - if size.is_none() || (count(&style) + count(&weight) + count(&variant) + nb_normals) > 3 { - return None - } - let mut copied_iter = iter.clone(); - match copied_iter.next() { - Some(&Delim('/')) => { - iter = copied_iter; - line_height = match iter.next() { - Some(v) => line_height::from_component_value(v), - _ => return None, - }; - if line_height.is_none() { return None } - } - _ => () - } - let family = font_family::from_iter(iter); - if family.is_none() { return None } - Some(Longhands{ - font_style: style, - font_variant: variant, - font_weight: weight, - font_size: size, - line_height: line_height, - font_family: family - }) -}) - - -four_side_shorthand!(margin, specified::LengthOrPercentageOrAuto::parse, - margin_top, - margin_right, - margin_bottom, - margin_left -) - - -four_side_shorthand!(padding, specified::LengthOrPercentage::parse, - padding_top, - padding_right, - padding_bottom, - padding_left -) From a931c8d4a0e916148180848169378cc7ff9a7c1b Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 23 Aug 2013 15:25:57 +0100 Subject: [PATCH 21/29] Add "inherited" markers on longhand properties. --- properties/mod.rs.mako | 49 ++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/properties/mod.rs.mako b/properties/mod.rs.mako index 7bcd3bd6636..c5580b9137b 100644 --- a/properties/mod.rs.mako +++ b/properties/mod.rs.mako @@ -35,18 +35,21 @@ class Shorthand(object): self.ident = to_rust_ident(name) self.sub_properties = [Longhand(s) for s in sub_properties] -longhands = [] -shorthands = [] +LONGHANDS = [] +SHORTHANDS = [] +INHERITED = set() %> pub mod longhands { pub use super::*; - <%def name="longhand(name)"> + <%def name="longhand(name, inherited=False)"> <% property = Longhand(name) - longhands.append(property) + LONGHANDS.append(property) + if inherited: + INHERITED.add(name) %> pub mod ${property.ident} { use super::*; @@ -54,8 +57,8 @@ pub mod longhands { } - <%def name="single_component_value(name)"> - <%self:longhand name="${name}"> + <%def name="single_component_value(name, inherited=False)"> + <%self:longhand name="${name}" inherited="${inherited}"> ${caller.body()} pub fn parse(input: &[ComponentValue]) -> Option { one_component_value(input).chain(from_component_value) @@ -63,8 +66,8 @@ pub mod longhands { - <%def name="single_keyword(name, values)"> - <%self:single_component_value name="${name}"> + <%def name="single_keyword(name, values, inherited=False)"> + <%self:single_component_value name="${name}" inherited="${inherited}"> pub enum SpecifiedValue { % for value in values.split(): ${to_rust_ident(value)}, @@ -83,8 +86,8 @@ pub mod longhands { - <%def name="predefined_function(name, result_type, function)"> - <%self:longhand name="${name}"> + <%def name="predefined_function(name, result_type, function, inherited=False)"> + <%self:longhand name="${name}" inherited="${inherited}"> pub type SpecifiedValue = ${result_type}; pub fn parse(input: &[ComponentValue]) -> Option { one_component_value(input).chain(${function}) @@ -92,8 +95,8 @@ pub mod longhands { - <%def name="predefined_type(name, type)"> - ${predefined_function(name, type, type + "::parse")} + <%def name="predefined_type(name, type, inherited=False)"> + ${predefined_function(name, type, type + "::parse", inherited)} @@ -226,11 +229,11 @@ pub mod longhands { // CSS 2.1, Section 14 - Colors and Backgrounds ${predefined_type("background-color", "CSSColor")} - ${predefined_type("color", "CSSColor")} + ${predefined_type("color", "CSSColor", inherited=True)} // CSS 2.1, Section 15 - Fonts - <%self:longhand name="font-family"> + <%self:longhand name="font-family" inherited="True"> enum FontFamily { FamilyName(~str), // Generic @@ -300,10 +303,10 @@ pub mod longhands { - ${single_keyword("font-style", "normal italic oblique")} - ${single_keyword("font-variant", "normal")} // Add small-caps when supported + ${single_keyword("font-style", "normal italic oblique", inherited=True)} + ${single_keyword("font-variant", "normal", inherited=True)} // Add small-caps when supported - <%self:single_component_value name="font-weight"> + <%self:single_component_value name="font-weight" inherited="True"> pub enum SpecifiedValue { Bolder, Lighther, @@ -344,7 +347,7 @@ pub mod longhands { } - <%self:single_component_value name="font-size"> + <%self:single_component_value name="font-size" inherited="True"> pub type SpecifiedValue = specified::Length; // Percentages are the same as em. /// | /// TODO: support and @@ -360,7 +363,7 @@ pub mod longhands { // CSS 2.1, Section 16 - Text - ${single_keyword("text-align", "left right center justify")} + ${single_keyword("text-align", "left right center justify", inherited=True)} <%self:longhand name="text-decoration"> pub struct SpecifiedValue { @@ -411,7 +414,7 @@ pub mod shorthands { <%def name="shorthand(name, sub_properties)"> <% shorthand = Shorthand(name, sub_properties.split()) - shorthands.append(shorthand) + SHORTHANDS.append(shorthand) %> pub mod ${shorthand.ident} { use super::*; @@ -588,7 +591,7 @@ pub enum DeclaredValue { } pub enum PropertyDeclaration { - % for property in longhands: + % for property in LONGHANDS: ${property.ident}_declaration(DeclaredValue), % endfor } @@ -597,7 +600,7 @@ impl PropertyDeclaration { pub fn parse(name: &str, value: &[ComponentValue], result_list: &mut ~[PropertyDeclaration]) -> bool { match name.to_ascii_lower().as_slice() { - % for property in longhands: + % for property in LONGHANDS: "${property.name}" => result_list.push(${property.ident}_declaration( match CSSWideKeyword::parse(value) { Some(keyword) => CSSWideKeyword(keyword), @@ -608,7 +611,7 @@ impl PropertyDeclaration { } )), % endfor - % for shorthand in shorthands: + % for shorthand in SHORTHANDS: "${shorthand.name}" => match CSSWideKeyword::parse(value) { Some(keyword) => { % for sub_property in shorthand.sub_properties: From 254c522ab47312ed1d5449e9eed4643d65fccccb Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 23 Aug 2013 20:06:21 +0100 Subject: [PATCH 22/29] Simplify properties template a bit. --- properties/mod.rs.mako | 142 +++++++++++++++-------------------------- 1 file changed, 51 insertions(+), 91 deletions(-) diff --git a/properties/mod.rs.mako b/properties/mod.rs.mako index c5580b9137b..fed5e8fbaa8 100644 --- a/properties/mod.rs.mako +++ b/properties/mod.rs.mako @@ -102,61 +102,27 @@ pub mod longhands { // CSS 2.1, Section 8 - Box model - ${predefined_function("margin-top", "specified::LengthOrPercentageOrAuto", - "specified::LengthOrPercentageOrAuto::parse")} - ${predefined_function("margin-right", "specified::LengthOrPercentageOrAuto", - "specified::LengthOrPercentageOrAuto::parse")} - ${predefined_function("margin-bottom", "specified::LengthOrPercentageOrAuto", - "specified::LengthOrPercentageOrAuto::parse")} - ${predefined_function("margin-left", "specified::LengthOrPercentageOrAuto", - "specified::LengthOrPercentageOrAuto::parse")} + % for side in ["top", "right", "bottom", "left"]: + ${predefined_type("margin-" + side, "specified::LengthOrPercentageOrAuto")} + % endfor - ${predefined_function("padding-top", - "specified::LengthOrPercentage", - "specified::LengthOrPercentage::parse_non_negative")} - ${predefined_function("padding-right", - "specified::LengthOrPercentage", - "specified::LengthOrPercentage::parse_non_negative")} - ${predefined_function("padding-bottom", - "specified::LengthOrPercentage", - "specified::LengthOrPercentage::parse_non_negative")} - ${predefined_function("padding-left", - "specified::LengthOrPercentage", - "specified::LengthOrPercentage::parse_non_negative")} + % for side in ["top", "right", "bottom", "left"]: + ${predefined_function("padding-" + side, + "specified::LengthOrPercentage", + "specified::LengthOrPercentage::parse_non_negative")} + % endfor - ${predefined_type("border-top-color", "CSSColor")} - ${predefined_type("border-right-color", "CSSColor")} - ${predefined_type("border-bottom-color", "CSSColor")} - ${predefined_type("border-left-color", "CSSColor")} + % for side in ["top", "right", "bottom", "left"]: + ${predefined_type("border-%s-color" % side, "CSSColor")} + % endfor - pub enum BorderStyle { - BorderStyleSolid, - // Uncomment when supported -// BorderStyleDotted, -// BorderStyleDashed, -// BorderStyleDouble, -// BorderStyleGroove, -// BorderStyleRidge, -// BorderStyleInset, -// BorderStyleOutset, -// BorderStyleHidden, - BorderStyleNone, - } - impl BorderStyle { - pub fn parse(input: &ComponentValue) -> Option { - do get_ident_lower(input).chain |keyword| { - match keyword.as_slice() { - "solid" => Some(BorderStyleSolid), - "none" => Some(BorderStyleNone), - _ => None, - } - } - } - } - ${predefined_type("border-top-style", "BorderStyle")} - ${predefined_type("border-right-style", "BorderStyle")} - ${predefined_type("border-bottom-style", "BorderStyle")} - ${predefined_type("border-left-style", "BorderStyle")} + // dotted dashed double groove ridge insed outset hidden + ${single_keyword("border-top-style", "none solid")} + % for side in ["right", "bottom", "left"]: + ${predefined_function("border-%s-style" % side, + "border_top_style::SpecifiedValue", + "border_top_style::from_component_value")} + % endfor pub fn parse_border_width(component_value: &ComponentValue) -> Option { match component_value { @@ -169,10 +135,9 @@ pub mod longhands { _ => specified::Length::parse_non_negative(component_value) } } - ${predefined_function("border-top-width", "specified::Length", "parse_border_width")} - ${predefined_function("border-right-width", "specified::Length", "parse_border_width")} - ${predefined_function("border-bottom-width", "specified::Length", "parse_border_width")} - ${predefined_function("border-left-width", "specified::Length", "parse_border_width")} + % for side in ["top", "right", "bottom", "left"]: + ${predefined_function("border-%s-width" % side, "specified::Length", "parse_border_width")} + % endfor // CSS 2.1, Section 9 - Visual formatting model @@ -465,11 +430,14 @@ pub mod shorthands { ${four_sides_shorthand("border-color", "border-%s-color", "CSSColor::parse")} - ${four_sides_shorthand("border-style", "border-%s-style", "BorderStyle::parse")} + ${four_sides_shorthand("border-style", "border-%s-style", + "border_top_style::from_component_value")} ${four_sides_shorthand("border-width", "border-%s-width", "parse_border_width")} - pub fn parse_border(input: &[ComponentValue]) -> Option<(Option, Option, - Option)> { + pub fn parse_border(input: &[ComponentValue]) + -> Option<(Option, + Option, + Option)> { let mut color = None; let mut style = None; let mut width = None; @@ -482,7 +450,7 @@ pub mod shorthands { } } if style.is_none() { - match BorderStyle::parse(component_value) { + match border_top_style::from_component_value(component_value) { Some(s) => { style = Some(s); any = true; loop }, None => () } @@ -498,42 +466,34 @@ pub mod shorthands { if any { Some((color, style, width)) } else { None } } - <%def name="border_side(side)"> - <%self:shorthand name="border-${side}" sub_properties="border-${side}-color - border-${side}-style - border-${side}-width"> + + % for side in ["top", "right", "bottom", "left"]: + <%self:shorthand name="border-${side}" sub_properties="${' '.join( + 'border-%s-%s' % (side, prop) + for prop in ['color', 'style', 'width'] + )}"> do parse_border(input).map_move |(color, style, width)| { - Longhands { border_${side}_color: color, border_${side}_style: style, - border_${side}_width: width } + Longhands { + % for prop in ["color", "style", "width"]: + ${"border_%s_%s: %s," % (side, prop, prop)} + % endfor + } } - - + + % endfor - ${border_side("top")} - ${border_side("right")} - ${border_side("bottom")} - ${border_side("left")} - - <%self:shorthand name="border" sub_properties=" - border-top-color - border-top-width - border-top-style - border-right-color - border-right-width - border-right-style - border-bottom-color - border-bottom-width - border-bottom-style - border-left-color - border-left-width - border-left-style - "> + <%self:shorthand name="border" sub_properties="${' '.join( + 'border-%s-%s' % (side, prop) + for side in ['top', 'right', 'bottom', 'left'] + for prop in ['color', 'style', 'width'] + )}"> do parse_border(input).map_move |(color, style, width)| { Longhands { - border_top_color: color, border_top_style: style, border_top_width: width, - border_right_color: color, border_right_style: style, border_right_width: width, - border_bottom_color: color, border_bottom_style: style, border_bottom_width: width, - border_left_color: color, border_left_style: style, border_left_width: width, + % for side in ["top", "right", "bottom", "left"]: + % for prop in ["color", "style", "width"]: + ${"border_%s_%s: %s," % (side, prop, prop)} + % endfor + % endfor } } From e2ec549da5ad9c617f063e7b6ec3947fa76524fa Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 29 Aug 2013 17:06:33 +0100 Subject: [PATCH 23/29] Add computed values. --- properties/common_types.rs | 103 ++++++++++++++++------ properties/mod.rs.mako | 176 ++++++++++++++++++++++++------------- 2 files changed, 195 insertions(+), 84 deletions(-) diff --git a/properties/common_types.rs b/properties/common_types.rs index 1b39f46ea55..b567647386d 100644 --- a/properties/common_types.rs +++ b/properties/common_types.rs @@ -2,7 +2,6 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - pub type Float = f64; pub type Integer = i64; @@ -11,6 +10,7 @@ pub mod specified { use std::ascii::StrAsciiExt; use cssparser::*; use super::{Integer, Float}; + pub use CSSColor = cssparser::Color; pub enum Length { Au(Integer), // application units @@ -66,51 +66,54 @@ pub mod specified { } pub enum LengthOrPercentage { - Length(Length), - Percentage(Float), + LP_Length(Length), + LP_Percentage(Float), } impl LengthOrPercentage { fn parse_internal(input: &ComponentValue, negative_ok: bool) -> Option { match input { &Dimension(ref value, ref unit) if negative_ok || value.value >= 0. - => Length::parse_dimension(value.value, unit.as_slice()).map_move(Length), + => Length::parse_dimension(value.value, unit.as_slice()).map_move(LP_Length), &ast::Percentage(ref value) if negative_ok || value.value >= 0. - => Some(Percentage(value.value)), - &Number(ref value) if value.value == 0. => Some(Length(Au(0))), + => Some(LP_Percentage(value.value)), + &Number(ref value) if value.value == 0. => Some(LP_Length(Au(0))), _ => None } } + #[inline] pub fn parse(input: &ComponentValue) -> Option { LengthOrPercentage::parse_internal(input, /* negative_ok = */ true) } + #[inline] pub fn parse_non_negative(input: &ComponentValue) -> Option { LengthOrPercentage::parse_internal(input, /* negative_ok = */ false) } } pub enum LengthOrPercentageOrAuto { - Length_(Length), - Percentage_(Float), - Auto, + LPA_Length(Length), + LPA_Percentage(Float), + LPA_Auto, } impl LengthOrPercentageOrAuto { - #[inline] fn parse_internal(input: &ComponentValue, negative_ok: bool) -> Option { match input { &Dimension(ref value, ref unit) if negative_ok || value.value >= 0. - => Length::parse_dimension(value.value, unit.as_slice()).map_move(Length_), + => Length::parse_dimension(value.value, unit.as_slice()).map_move(LPA_Length), &ast::Percentage(ref value) if negative_ok || value.value >= 0. - => Some(Percentage_(value.value)), - &Number(ref value) if value.value == 0. => Some(Length_(Au(0))), - &Ident(ref value) if value.eq_ignore_ascii_case("auto") => Some(Auto), + => Some(LPA_Percentage(value.value)), + &Number(ref value) if value.value == 0. => Some(LPA_Length(Au(0))), + &Ident(ref value) if value.eq_ignore_ascii_case("auto") => Some(LPA_Auto), _ => None } } + #[inline] pub fn parse(input: &ComponentValue) -> Option { LengthOrPercentageOrAuto::parse_internal(input, /* negative_ok = */ true) } + #[inline] pub fn parse_non_negative(input: &ComponentValue) -> Option { LengthOrPercentageOrAuto::parse_internal(input, /* negative_ok = */ false) } @@ -118,22 +121,72 @@ pub mod specified { } pub mod computed { + use cssparser; use super::*; - struct Length(Integer); // in application units + use super::super::longhands::font_weight; + pub struct Context { + current_color: cssparser::RGBA, + has_border_top: bool, + has_border_right: bool, + has_border_bottom: bool, + has_border_left: bool, + font_size: Length, + font_weight: font_weight::ComputedValue, + // TODO, as needed: root font size, viewport size, etc. + } + pub struct Length(Integer); // in application units impl Length { - fn times(self, factor: Float) -> Length { + pub fn times(self, factor: Float) -> Length { Length(((*self as Float) * factor) as Integer) } + } - pub fn compute(parent_font_size: Length, value: specified::Length) -> Length { - match value { - specified::Au(value) => Length(value), - specified::Em(value) => parent_font_size.times(value), - specified::Ex(value) => { - let x_height = 0.5; // TODO: find that form the font - parent_font_size.times(value * x_height) - }, - } + pub fn compute_Length(value: specified::Length, context: &Context) -> Length { + match value { + specified::Au(value) => Length(value), + specified::Em(value) => context.font_size.times(value), + specified::Ex(value) => { + let x_height = 0.5; // TODO: find that from the font + context.font_size.times(value * x_height) + }, + } + } + + pub enum LengthOrPercentage { + LP_Length(Length), + LP_Percentage(Float), + } + pub fn compute_LengthOrPercentage(value: specified::LengthOrPercentage, context: &Context) + -> LengthOrPercentage { + match value { + specified::LP_Length(value) => LP_Length(compute_Length(value, context)), + specified::LP_Percentage(value) => LP_Percentage(value), + } + } + + pub enum LengthOrPercentageOrAuto { + LPA_Length(Length), + LPA_Percentage(Float), + LPA_Auto, + } + pub fn compute_LengthOrPercentageOrAuto(value: specified::LengthOrPercentageOrAuto, + context: &Context) -> LengthOrPercentageOrAuto { + match value { + specified::LPA_Length(value) => LPA_Length(compute_Length(value, context)), + specified::LPA_Percentage(value) => LPA_Percentage(value), + specified::LPA_Auto => LPA_Auto, + } + } + + pub struct CSSColor { + rgba: cssparser::RGBA, + is_current_color: bool, // For inheritance + } + pub fn compute_CSSColor(color: specified::CSSColor, context: &Context) -> CSSColor { + match color { + cssparser::RGBA(rgba) => CSSColor { rgba: rgba, is_current_color: false }, + cssparser::CurrentColor => CSSColor { rgba: context.current_color, + is_current_color: true }, } } } diff --git a/properties/mod.rs.mako b/properties/mod.rs.mako index fed5e8fbaa8..b4fb229856f 100644 --- a/properties/mod.rs.mako +++ b/properties/mod.rs.mako @@ -8,7 +8,6 @@ use std::ascii::StrAsciiExt; use errors::{ErrorLoggerIterator, log_css_error}; pub use std::iterator; pub use cssparser::*; -pub use CSSColor = cssparser::Color; pub use parsing_utils::*; pub use self::common_types::*; @@ -43,8 +42,9 @@ INHERITED = set() pub mod longhands { pub use super::*; + pub use std; - <%def name="longhand(name, inherited=False)"> + <%def name="longhand(name, inherited=False, no_super=False)"> <% property = Longhand(name) LONGHANDS.append(property) @@ -52,7 +52,9 @@ pub mod longhands { INHERITED.add(name) %> pub mod ${property.ident} { - use super::*; + % if not no_super: + use super::*; + % endif ${caller.body()} } @@ -68,11 +70,14 @@ pub mod longhands { <%def name="single_keyword(name, values, inherited=False)"> <%self:single_component_value name="${name}" inherited="${inherited}"> + // The computed value is the same as the specified value. + pub use to_computed_value = std::util::id; pub enum SpecifiedValue { % for value in values.split(): ${to_rust_ident(value)}, % endfor } + pub type ComputedValue = SpecifiedValue; pub fn from_component_value(v: &ComponentValue) -> Option { do get_ident_lower(v).chain |keyword| { match keyword.as_slice() { @@ -86,30 +91,26 @@ pub mod longhands { - <%def name="predefined_function(name, result_type, function, inherited=False)"> + <%def name="predefined_type(name, type, parse_method='parse', inherited=False)"> <%self:longhand name="${name}" inherited="${inherited}"> - pub type SpecifiedValue = ${result_type}; + pub use to_computed_value = super::super::common_types::computed::compute_${type}; + pub type SpecifiedValue = specified::${type}; + pub type ComputedValue = computed::${type}; pub fn parse(input: &[ComponentValue]) -> Option { - one_component_value(input).chain(${function}) + one_component_value(input).chain(specified::${type}::${parse_method}) } - <%def name="predefined_type(name, type, inherited=False)"> - ${predefined_function(name, type, type + "::parse", inherited)} - - // CSS 2.1, Section 8 - Box model % for side in ["top", "right", "bottom", "left"]: - ${predefined_type("margin-" + side, "specified::LengthOrPercentageOrAuto")} + ${predefined_type("margin-" + side, "LengthOrPercentageOrAuto")} % endfor % for side in ["top", "right", "bottom", "left"]: - ${predefined_function("padding-" + side, - "specified::LengthOrPercentage", - "specified::LengthOrPercentage::parse_non_negative")} + ${predefined_type("padding-" + side, "LengthOrPercentage", "parse_non_negative")} % endfor % for side in ["top", "right", "bottom", "left"]: @@ -119,9 +120,11 @@ pub mod longhands { // dotted dashed double groove ridge insed outset hidden ${single_keyword("border-top-style", "none solid")} % for side in ["right", "bottom", "left"]: - ${predefined_function("border-%s-style" % side, - "border_top_style::SpecifiedValue", - "border_top_style::from_component_value")} + <%self:longhand name="border-${side}-style", no_super="True"> + pub use super::border_top_style::*; + pub type SpecifiedValue = super::border_top_style::SpecifiedValue; + pub type ComputedValue = super::border_top_style::ComputedValue; + % endfor pub fn parse_border_width(component_value: &ComponentValue) -> Option { @@ -136,7 +139,18 @@ pub mod longhands { } } % for side in ["top", "right", "bottom", "left"]: - ${predefined_function("border-%s-width" % side, "specified::Length", "parse_border_width")} + <%self:longhand name="border-${side}-width"> + pub type SpecifiedValue = specified::Length; + pub type ComputedValue = computed::Length; + pub fn parse(input: &[ComponentValue]) -> Option { + one_component_value(input).chain(parse_border_width) + } + pub fn to_computed_value(value: SpecifiedValue, context: &computed::Context) + -> ComputedValue { + if context.has_border_${side} { computed::compute_Length(value, context) } + else { computed::Length(0) } + } + % endfor // CSS 2.1, Section 9 - Visual formatting model @@ -154,35 +168,44 @@ pub mod longhands { // CSS 2.1, Section 10 - Visual formatting model details - ${predefined_function("width", - "specified::LengthOrPercentageOrAuto", - "specified::LengthOrPercentageOrAuto::parse_non_negative")} - ${predefined_function("height", - "specified::LengthOrPercentageOrAuto", - "specified::LengthOrPercentageOrAuto::parse_non_negative")} + ${predefined_type("width", "LengthOrPercentageOrAuto", "parse_non_negative")} + ${predefined_type("height", "LengthOrPercentageOrAuto", "parse_non_negative")} <%self:single_component_value name="line-height"> pub enum SpecifiedValue { - Normal, - Length(specified::Length), - Percentage(Float), - Number(Float), + SpecifiedNormal, + SpecifiedLength(specified::Length), + SpecifiedNumber(Float), + // percentage are the same as em. } /// normal | | | pub fn from_component_value(input: &ComponentValue) -> Option { match input { &ast::Number(ref value) if value.value >= 0. - => Some(Number(value.value)), + => Some(SpecifiedNumber(value.value)), &ast::Percentage(ref value) if value.value >= 0. - => Some(Percentage(value.value)), + => Some(SpecifiedLength(specified::Em(value.value))), &Dimension(ref value, ref unit) if value.value >= 0. => specified::Length::parse_dimension(value.value, unit.as_slice()) - .map_move(Length), - &Ident(ref value) if value.eq_ignore_ascii_case("auto") - => Some(Normal), + .map_move(SpecifiedLength), + &Ident(ref value) if value.eq_ignore_ascii_case("normal") + => Some(SpecifiedNormal), _ => None, } } + pub enum ComputedValue { + Normal, + Length(computed::Length), + Number(Float), + } + pub fn to_computed_value(value: SpecifiedValue, context: &computed::Context) + -> ComputedValue { + match value { + SpecifiedNormal => Normal, + SpecifiedLength(value) => Length(computed::compute_Length(value, context)), + SpecifiedNumber(value) => Number(value), + } + } // CSS 2.1, Section 11 - Visual effects @@ -199,6 +222,7 @@ pub mod longhands { // CSS 2.1, Section 15 - Fonts <%self:longhand name="font-family" inherited="True"> + pub use to_computed_value = std::util::id; enum FontFamily { FamilyName(~str), // Generic @@ -209,6 +233,7 @@ pub mod longhands { // Monospace, } pub type SpecifiedValue = ~[FontFamily]; + pub type ComputedValue = SpecifiedValue; /// # /// = | [ + ] /// TODO: @@ -275,52 +300,83 @@ pub mod longhands { pub enum SpecifiedValue { Bolder, Lighther, - Weight100, - Weight200, - Weight300, - Weight400, - Weight500, - Weight600, - Weight700, - Weight800, - Weight900, + % for weight in range(100, 901, 100): + SpecifiedWeight${weight}, + % endfor } /// normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 pub fn from_component_value(input: &ComponentValue) -> Option { match input { &Ident(ref value) => match value.to_ascii_lower().as_slice() { - "bold" => Some(Weight700), - "normal" => Some(Weight400), + "bold" => Some(SpecifiedWeight700), + "normal" => Some(SpecifiedWeight400), "bolder" => Some(Bolder), "lighter" => Some(Lighther), _ => None, }, &Number(ref value) => match value.int_value { - Some(100) => Some(Weight100), - Some(200) => Some(Weight200), - Some(300) => Some(Weight300), - Some(400) => Some(Weight400), - Some(500) => Some(Weight500), - Some(600) => Some(Weight600), - Some(700) => Some(Weight700), - Some(800) => Some(Weight800), - Some(900) => Some(Weight900), + Some(100) => Some(SpecifiedWeight100), + Some(200) => Some(SpecifiedWeight200), + Some(300) => Some(SpecifiedWeight300), + Some(400) => Some(SpecifiedWeight400), + Some(500) => Some(SpecifiedWeight500), + Some(600) => Some(SpecifiedWeight600), + Some(700) => Some(SpecifiedWeight700), + Some(800) => Some(SpecifiedWeight800), + Some(900) => Some(SpecifiedWeight900), _ => None, }, _ => None } } + pub enum ComputedValue { + % for weight in range(100, 901, 100): + Weight${weight}, + % endfor + } + pub fn to_computed_value(value: SpecifiedValue, context: &computed::Context) + -> ComputedValue { + match value { + % for weight in range(100, 901, 100): + SpecifiedWeight${weight} => Weight${weight}, + % endfor + Bolder => match context.font_weight { + Weight100 => Weight400, + Weight200 => Weight400, + Weight300 => Weight400, + Weight400 => Weight700, + Weight500 => Weight700, + Weight600 => Weight900, + Weight700 => Weight900, + Weight800 => Weight900, + Weight900 => Weight900, + }, + Lighther => match context.font_weight { + Weight100 => Weight100, + Weight200 => Weight100, + Weight300 => Weight100, + Weight400 => Weight100, + Weight500 => Weight100, + Weight600 => Weight400, + Weight700 => Weight400, + Weight800 => Weight700, + Weight900 => Weight700, + }, + } + } <%self:single_component_value name="font-size" inherited="True"> + pub use to_computed_value = super::super::common_types::computed::compute_Length; pub type SpecifiedValue = specified::Length; // Percentages are the same as em. + pub type ComputedValue = computed::Length; /// | /// TODO: support and pub fn from_component_value(input: &ComponentValue) -> Option { do specified::LengthOrPercentage::parse_non_negative(input).map_move |value| { match value { - specified::Length(value) => value, - specified::Percentage(value) => specified::Em(value), + specified::LP_Length(value) => value, + specified::LP_Percentage(value) => specified::Em(value), } } } @@ -331,6 +387,7 @@ pub mod longhands { ${single_keyword("text-align", "left right center justify", inherited=True)} <%self:longhand name="text-decoration"> + pub use to_computed_value = std::util::id; pub struct SpecifiedValue { underline: bool, overline: bool, @@ -338,6 +395,7 @@ pub mod longhands { // 'blink' is accepted in the parser but ignored. // Just not blinking the text is a conforming implementation per CSS 2.1. } + pub type ComputedValue = SpecifiedValue; /// none | [ underline || overline || line-through || blink ] pub fn parse(input: &[ComponentValue]) -> Option { let mut result = SpecifiedValue { @@ -424,18 +482,18 @@ pub mod shorthands { // TODO: other background-* properties <%self:shorthand name="background" sub_properties="background-color"> - do one_component_value(input).chain(CSSColor::parse).map_move |color| { + do one_component_value(input).chain(specified::CSSColor::parse).map_move |color| { Longhands { background_color: Some(color) } } - ${four_sides_shorthand("border-color", "border-%s-color", "CSSColor::parse")} + ${four_sides_shorthand("border-color", "border-%s-color", "specified::CSSColor::parse")} ${four_sides_shorthand("border-style", "border-%s-style", "border_top_style::from_component_value")} ${four_sides_shorthand("border-width", "border-%s-width", "parse_border_width")} pub fn parse_border(input: &[ComponentValue]) - -> Option<(Option, + -> Option<(Option, Option, Option)> { let mut color = None; @@ -444,7 +502,7 @@ pub mod shorthands { let mut any = false; for component_value in input.skip_whitespace() { if color.is_none() { - match CSSColor::parse(component_value) { + match specified::CSSColor::parse(component_value) { Some(c) => { color = Some(c); any = true; loop }, None => () } From bdca6d9fc44f47a34fcab43ca338ff4cc524af57 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 30 Aug 2013 13:50:49 +0100 Subject: [PATCH 24/29] Revert early resolving of currentColor. --- properties/common_types.rs | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/properties/common_types.rs b/properties/common_types.rs index b567647386d..8031df10479 100644 --- a/properties/common_types.rs +++ b/properties/common_types.rs @@ -122,6 +122,8 @@ pub mod specified { pub mod computed { use cssparser; + pub use CSSColor = cssparser::Color; + pub use compute_CSSColor = std::util::id; use super::*; use super::super::longhands::font_weight; pub struct Context { @@ -177,16 +179,4 @@ pub mod computed { specified::LPA_Auto => LPA_Auto, } } - - pub struct CSSColor { - rgba: cssparser::RGBA, - is_current_color: bool, // For inheritance - } - pub fn compute_CSSColor(color: specified::CSSColor, context: &Context) -> CSSColor { - match color { - cssparser::RGBA(rgba) => CSSColor { rgba: rgba, is_current_color: false }, - cssparser::CurrentColor => CSSColor { rgba: context.current_color, - is_current_color: true }, - } - } } From dd8b17886099b3a9ac59f6a4e9eb948bb485b520 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 30 Aug 2013 13:57:39 +0100 Subject: [PATCH 25/29] Add initial values. --- properties/mod.rs.mako | 47 +++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/properties/mod.rs.mako b/properties/mod.rs.mako index b4fb229856f..8b3417263df 100644 --- a/properties/mod.rs.mako +++ b/properties/mod.rs.mako @@ -78,6 +78,9 @@ pub mod longhands { % endfor } pub type ComputedValue = SpecifiedValue; + #[inline] pub fn get_initial_value() -> ComputedValue { + ${to_rust_ident(values.split()[0])} + } pub fn from_component_value(v: &ComponentValue) -> Option { do get_ident_lower(v).chain |keyword| { match keyword.as_slice() { @@ -91,11 +94,12 @@ pub mod longhands { - <%def name="predefined_type(name, type, parse_method='parse', inherited=False)"> + <%def name="predefined_type(name, type, initial_value, parse_method='parse', inherited=False)"> <%self:longhand name="${name}" inherited="${inherited}"> pub use to_computed_value = super::super::common_types::computed::compute_${type}; pub type SpecifiedValue = specified::${type}; pub type ComputedValue = computed::${type}; + #[inline] pub fn get_initial_value() -> ComputedValue { ${initial_value} } pub fn parse(input: &[ComponentValue]) -> Option { one_component_value(input).chain(specified::${type}::${parse_method}) } @@ -106,15 +110,18 @@ pub mod longhands { // CSS 2.1, Section 8 - Box model % for side in ["top", "right", "bottom", "left"]: - ${predefined_type("margin-" + side, "LengthOrPercentageOrAuto")} + ${predefined_type("margin-" + side, "LengthOrPercentageOrAuto", + "computed::LPA_Length(computed::Length(0))")} % endfor % for side in ["top", "right", "bottom", "left"]: - ${predefined_type("padding-" + side, "LengthOrPercentage", "parse_non_negative")} + ${predefined_type("padding-" + side, "LengthOrPercentage", + "computed::LP_Length(computed::Length(0))", + "parse_non_negative")} % endfor % for side in ["top", "right", "bottom", "left"]: - ${predefined_type("border-%s-color" % side, "CSSColor")} + ${predefined_type("border-%s-color" % side, "CSSColor", "CurrentColor")} % endfor // dotted dashed double groove ridge insed outset hidden @@ -142,6 +149,9 @@ pub mod longhands { <%self:longhand name="border-${side}-width"> pub type SpecifiedValue = specified::Length; pub type ComputedValue = computed::Length; + #[inline] pub fn get_initial_value() -> ComputedValue { + computed::Length(3 * 60) // medium + } pub fn parse(input: &[ComponentValue]) -> Option { one_component_value(input).chain(parse_border_width) } @@ -163,13 +173,17 @@ pub mod longhands { // "table-row table-column-group table-column table-cell table-caption" ${single_keyword("position", "static absolute relative fixed")} - ${single_keyword("float", "left right none")} - ${single_keyword("clear", "left right none both")} + ${single_keyword("float", "none left right")} + ${single_keyword("clear", "none left right both")} // CSS 2.1, Section 10 - Visual formatting model details - ${predefined_type("width", "LengthOrPercentageOrAuto", "parse_non_negative")} - ${predefined_type("height", "LengthOrPercentageOrAuto", "parse_non_negative")} + ${predefined_type("width", "LengthOrPercentageOrAuto", + "computed::LPA_Auto", + "parse_non_negative")} + ${predefined_type("height", "LengthOrPercentageOrAuto", + "computed::LPA_Auto", + "parse_non_negative")} <%self:single_component_value name="line-height"> pub enum SpecifiedValue { @@ -198,6 +212,7 @@ pub mod longhands { Length(computed::Length), Number(Float), } + #[inline] pub fn get_initial_value() -> ComputedValue { Normal } pub fn to_computed_value(value: SpecifiedValue, context: &computed::Context) -> ComputedValue { match value { @@ -216,8 +231,11 @@ pub mod longhands { // CSS 2.1, Section 14 - Colors and Backgrounds - ${predefined_type("background-color", "CSSColor")} - ${predefined_type("color", "CSSColor", inherited=True)} + ${predefined_type("background-color", "CSSColor", + "RGBA(RGBA { red: 0., green: 0., blue: 0., alpha: 0. }) /* transparent */")} + ${predefined_type("color", "CSSColor", + "RGBA(RGBA { red: 0., green: 0., blue: 0., alpha: 1. }) /* black */", + inherited=True)} // CSS 2.1, Section 15 - Fonts @@ -234,6 +252,7 @@ pub mod longhands { } pub type SpecifiedValue = ~[FontFamily]; pub type ComputedValue = SpecifiedValue; + #[inline] pub fn get_initial_value() -> ComputedValue { ~[FamilyName(~"serif")] } /// # /// = | [ + ] /// TODO: @@ -334,6 +353,7 @@ pub mod longhands { Weight${weight}, % endfor } + #[inline] pub fn get_initial_value() -> ComputedValue { Weight400 } // normal pub fn to_computed_value(value: SpecifiedValue, context: &computed::Context) -> ComputedValue { match value { @@ -370,6 +390,9 @@ pub mod longhands { pub use to_computed_value = super::super::common_types::computed::compute_Length; pub type SpecifiedValue = specified::Length; // Percentages are the same as em. pub type ComputedValue = computed::Length; + #[inline] pub fn get_initial_value() -> ComputedValue { + computed::Length(16 * 60) // medium + } /// | /// TODO: support and pub fn from_component_value(input: &ComponentValue) -> Option { @@ -384,6 +407,7 @@ pub mod longhands { // CSS 2.1, Section 16 - Text + // TODO: initial value should be 'start' (CSS Text Level 3, direction-dependent.) ${single_keyword("text-align", "left right center justify", inherited=True)} <%self:longhand name="text-decoration"> @@ -396,6 +420,9 @@ pub mod longhands { // Just not blinking the text is a conforming implementation per CSS 2.1. } pub type ComputedValue = SpecifiedValue; + #[inline] pub fn get_initial_value() -> ComputedValue { + SpecifiedValue { underline: false, overline: false, line_through: false } // none + } /// none | [ underline || overline || line-through || blink ] pub fn parse(input: &[ComponentValue]) -> Option { let mut result = SpecifiedValue { From 0c726b45813c9596801470108ce13395f046cc7e Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 30 Aug 2013 17:15:21 +0100 Subject: [PATCH 26/29] Upgrade to rustc 0.8-pre (0ac3e02 2013-08-30 05:45:45 -0700) --- src/compiler/rust | 2 +- src/components/gfx/text/shaping/harfbuzz.rs | 2 +- src/components/main/layout/layout_task.rs | 2 +- .../dom/bindings/codegen/CodegenRust.py | 4 +-- src/components/util/tree.rs | 32 +++++++++++-------- src/platform/macos/rust-core-foundation | 2 +- src/platform/macos/rust-core-graphics | 2 +- src/platform/macos/rust-core-text | 2 +- src/platform/macos/rust-io-surface | 2 +- src/support/netsurfcss/rust-netsurfcss | 2 +- src/support/spidermonkey/rust-mozjs | 2 +- 11 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/compiler/rust b/src/compiler/rust index c822d1070ac..0ac3e023d86 160000 --- a/src/compiler/rust +++ b/src/compiler/rust @@ -1 +1 @@ -Subproject commit c822d1070ac39871165df30ac8d09e733a6e7fb9 +Subproject commit 0ac3e023d86fa84ed38bca3d34003b494fd28acf diff --git a/src/components/gfx/text/shaping/harfbuzz.rs b/src/components/gfx/text/shaping/harfbuzz.rs index 3ef24173851..cfc6630a49b 100644 --- a/src/components/gfx/text/shaping/harfbuzz.rs +++ b/src/components/gfx/text/shaping/harfbuzz.rs @@ -86,8 +86,8 @@ impl ShapedGlyphData { fn byte_offset_of_glyph(&self, i: uint) -> uint { assert!(i < self.count); - let glyph_info_i = ptr::offset(self.glyph_infos, i as int); unsafe { + let glyph_info_i = ptr::offset(self.glyph_infos, i as int); (*glyph_info_i).cluster as uint } } diff --git a/src/components/main/layout/layout_task.rs b/src/components/main/layout/layout_task.rs index 141df0e3f33..43751ddbc55 100644 --- a/src/components/main/layout/layout_task.rs +++ b/src/components/main/layout/layout_task.rs @@ -307,7 +307,7 @@ impl LayoutTask { ctx: &layout_ctx, }; - let display_list = ~Cell::new(DisplayList::new::>()); + let display_list = ~Cell::new(DisplayList::>::new()); // TODO: Set options on the builder before building. // TODO: Be smarter about what needs painting. diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 31d2ac1a595..1fa65e67c02 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -1247,10 +1247,10 @@ for (uint32_t i = 0; i < length; ++i) { dataLoc = "${declName}" #XXXjdm conversionBehavior should be used template = ( - "match JSValConvertible::from_jsval::<%s>(${val}) {\n" + "match JSValConvertible::from_jsval(${val}) {\n" " None => return 0,\n" " Some(v) => %s = v\n" - "}" % (typeName, dataLoc)) + "}" % (dataLoc,)) declType = CGGeneric(typeName) if (defaultValue is not None and # We already handled IDLNullValue, so just deal with the other ones diff --git a/src/components/util/tree.rs b/src/components/util/tree.rs index 3664bae9ac1..d38d4a7f5da 100644 --- a/src/components/util/tree.rs +++ b/src/components/util/tree.rs @@ -9,13 +9,19 @@ // and use its default methods. macro_rules! get( ($node:expr, $fun:ident) => ( - TreeNodeRef::$fun::($node) + { + let val: Option = TreeNodeRef::::$fun($node); + val + } ) ) macro_rules! set( ($node:expr, $fun:ident, $val:expr) => ( - TreeNodeRef::$fun::($node, $val) + { + let val: Option = $val; + TreeNodeRef::::$fun($node, val) + } ) ) @@ -31,7 +37,7 @@ impl> Iterator for ChildIterator { // FIXME: Do we need two clones here? let x = self.current.get_ref().clone(); - self.current = x.with_base(|n| TreeNodeRef::next_sibling::(n)); + self.current = x.with_base(|n| TreeNodeRef::::next_sibling(n)); Some(x.clone()) } } @@ -246,51 +252,51 @@ fn gather>(cur: &Ref, refs: &mut ~[Ref], pub trait TreeNode> { /// Returns the parent of this node. fn parent_node(&self) -> Option { - TreeNodeRef::parent_node::(self) + TreeNodeRef::::parent_node(self) } /// Returns the first child of this node. fn first_child(&self) -> Option { - TreeNodeRef::first_child::(self) + TreeNodeRef::::first_child(self) } /// Returns the last child of this node. fn last_child(&self) -> Option { - TreeNodeRef::last_child::(self) + TreeNodeRef::::last_child(self) } /// Returns the previous sibling of this node. fn prev_sibling(&self) -> Option { - TreeNodeRef::prev_sibling::(self) + TreeNodeRef::::prev_sibling(self) } /// Returns the next sibling of this node. fn next_sibling(&self) -> Option { - TreeNodeRef::next_sibling::(self) + TreeNodeRef::::next_sibling(self) } /// Sets the parent of this node. fn set_parent_node(&mut self, new_parent: Option) { - TreeNodeRef::set_parent_node::(self, new_parent) + TreeNodeRef::::set_parent_node(self, new_parent) } /// Sets the first child of this node. fn set_first_child(&mut self, new_first_child: Option) { - TreeNodeRef::set_first_child::(self, new_first_child) + TreeNodeRef::::set_first_child(self, new_first_child) } /// Sets the last child of this node. fn set_last_child(&mut self, new_last_child: Option) { - TreeNodeRef::set_last_child::(self, new_last_child) + TreeNodeRef::::set_last_child(self, new_last_child) } /// Sets the previous sibling of this node. fn set_prev_sibling(&mut self, new_prev_sibling: Option) { - TreeNodeRef::set_prev_sibling::(self, new_prev_sibling) + TreeNodeRef::::set_prev_sibling(self, new_prev_sibling) } /// Sets the next sibling of this node. fn set_next_sibling(&mut self, new_next_sibling: Option) { - TreeNodeRef::set_next_sibling::(self, new_next_sibling) + TreeNodeRef::::set_next_sibling(self, new_next_sibling) } } diff --git a/src/platform/macos/rust-core-foundation b/src/platform/macos/rust-core-foundation index 9755a007a02..95f2f30981e 160000 --- a/src/platform/macos/rust-core-foundation +++ b/src/platform/macos/rust-core-foundation @@ -1 +1 @@ -Subproject commit 9755a007a0294294740d728ba14de30b45b769e5 +Subproject commit 95f2f30981e12128e1dab0956f11c70386d85bfc diff --git a/src/platform/macos/rust-core-graphics b/src/platform/macos/rust-core-graphics index 4c4662a5d60..adb526a6ca8 160000 --- a/src/platform/macos/rust-core-graphics +++ b/src/platform/macos/rust-core-graphics @@ -1 +1 @@ -Subproject commit 4c4662a5d6077b547466d33c9a00cb33df9f6f26 +Subproject commit adb526a6ca8deee37152ef3ba1197894286e2204 diff --git a/src/platform/macos/rust-core-text b/src/platform/macos/rust-core-text index 36b060d0aef..129e99ff088 160000 --- a/src/platform/macos/rust-core-text +++ b/src/platform/macos/rust-core-text @@ -1 +1 @@ -Subproject commit 36b060d0aef4b3d3f644ef221a0aaca4cd31bcdb +Subproject commit 129e99ff088fad6ea8f3187680c15a0a3e2cc403 diff --git a/src/platform/macos/rust-io-surface b/src/platform/macos/rust-io-surface index e775ce635a0..d685aad6f6a 160000 --- a/src/platform/macos/rust-io-surface +++ b/src/platform/macos/rust-io-surface @@ -1 +1 @@ -Subproject commit e775ce635a063bf1d5d6b5b0c5339cbb818116ab +Subproject commit d685aad6f6ab3559c8de5ca76520b8f1e0e21b64 diff --git a/src/support/netsurfcss/rust-netsurfcss b/src/support/netsurfcss/rust-netsurfcss index 0793c920f33..f69e26f4d97 160000 --- a/src/support/netsurfcss/rust-netsurfcss +++ b/src/support/netsurfcss/rust-netsurfcss @@ -1 +1 @@ -Subproject commit 0793c920f33c5928323358f7aba7da3253019c60 +Subproject commit f69e26f4d97316063b6c20f0c71d7568d8d42a76 diff --git a/src/support/spidermonkey/rust-mozjs b/src/support/spidermonkey/rust-mozjs index d951d00382c..b7121da7fcb 160000 --- a/src/support/spidermonkey/rust-mozjs +++ b/src/support/spidermonkey/rust-mozjs @@ -1 +1 @@ -Subproject commit d951d00382c7ad95d64b87f876188df7f0254f00 +Subproject commit b7121da7fcb5eba84b563118db49a43279c88ee9 From 91593b54d215de4a5cc17d9a0d7f5b4d1d9134e3 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 30 Aug 2013 15:54:25 +0100 Subject: [PATCH 27/29] Build the new (yet unused) style system as part of libscript, to avoid bitrot. --- Makefile.in | 9 +- src/components/script/script.rc | 4 + src/components/script/style/.gitignore | 10 - src/components/script/style/LICENSE | 373 ------------------ src/components/script/style/Makefile.in | 39 -- src/components/script/style/README.md | 4 - src/components/script/style/configure | 4 - src/components/script/style/media_queries.rs | 6 +- src/components/script/style/mod.rs | 7 + src/components/script/style/namespaces.rs | 2 +- .../script/style/properties/.gitignore | 1 + .../style/{ => properties}/Mako-0.8.1.zip | Bin .../script/style/properties/mod.rs.mako | 4 +- src/components/script/style/selectors.rs | 2 +- src/components/script/style/servo-style.rc | 17 - src/components/script/style/stylesheets.rs | 12 +- src/support/css/rust-cssparser | 2 +- 17 files changed, 34 insertions(+), 462 deletions(-) delete mode 100644 src/components/script/style/.gitignore delete mode 100644 src/components/script/style/LICENSE delete mode 100644 src/components/script/style/Makefile.in delete mode 100755 src/components/script/style/configure create mode 100644 src/components/script/style/mod.rs create mode 100644 src/components/script/style/properties/.gitignore rename src/components/script/style/{ => properties}/Mako-0.8.1.zip (100%) delete mode 100644 src/components/script/style/servo-style.rc diff --git a/Makefile.in b/Makefile.in index c086feeb3dd..d5872eebd6a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -226,7 +226,10 @@ DEPS_gfx = $(CRATE_gfx) $(SRC_gfx) $(DONE_SUBMODULES) $(DONE_util) $(DONE_net) $ RFLAGS_script = $(strip $(CFG_RUSTC_FLAGS)) $(addprefix -L $(B)src/,$(DEPS_SUBMODULES)) -L $(B)src/components/util -L $(B)src/components/net -L $(B)src/components/gfx -L $(B)src/components/msg WEBIDL_script = $(call rwildcard,$(S)src/components/script/,*.webidl) AUTOGEN_SRC_script = $(patsubst %.webidl, %Binding.rs, $(WEBIDL_script)) -SRC_script = $(call rwildcard,$(S)src/components/script/,*.rs) $(AUTOGEN_SRC_script) +MAKO_ZIP = $(S)src/components/script/style/properties/Mako-0.8.1.zip +MAKO_script = $(S)src/components/script/style/properties/mod.rs +MAKO_SRC_script = $(MAKO_script).mako +SRC_script = $(call rwildcard,$(S)src/components/script/,*.rs) $(AUTOGEN_SRC_script) $(MAKO_script) CRATE_script = $(S)src/components/script/script.rc DONE_script = $(B)src/components/script/libscript.dummy @@ -287,6 +290,10 @@ $(AUTOGEN_SRC_script): %Binding.rs: $(bindinggen_dependencies) \ globalgen_dependencies := $(addprefix $(BINDINGS_SRC)/, GlobalGen.py Bindings.conf Configuration.py CodegenRust.py parser/WebIDL.py) $(CACHE_DIR)/.done +$(MAKO_script): $(MAKO_SRC_script) + PYTHONPATH=$(MAKO_ZIP) python -c "from mako.template import Template; print(Template(filename='$<').render())" > $@ + + $(CACHE_DIR)/.done: mkdir -p $(CACHE_DIR) @touch $@ diff --git a/src/components/script/script.rc b/src/components/script/script.rc index 21a70515c86..7dfb21293d0 100644 --- a/src/components/script/script.rc +++ b/src/components/script/script.rc @@ -17,6 +17,7 @@ extern mod hubbub; extern mod js; extern mod netsurfcss; extern mod newcss (name = "css"); +extern mod cssparser; extern mod servo_net (name = "net"); extern mod servo_util (name = "util"); extern mod servo_msg (name = "msg"); @@ -132,3 +133,6 @@ pub mod html { pub mod layout_interface; pub mod script_task; + +// "New" (as of 2013-08) style system, not used yet but included to avoid bitrot. +mod style; diff --git a/src/components/script/style/.gitignore b/src/components/script/style/.gitignore deleted file mode 100644 index 55369470c0c..00000000000 --- a/src/components/script/style/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -*.o -*.a -*.so -*.dylib -*.dll -*.dummy -*.pyc -*-test -Makefile -properties/mod.rs diff --git a/src/components/script/style/LICENSE b/src/components/script/style/LICENSE deleted file mode 100644 index 14e2f777f6c..00000000000 --- a/src/components/script/style/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/src/components/script/style/Makefile.in b/src/components/script/style/Makefile.in deleted file mode 100644 index 585705efd53..00000000000 --- a/src/components/script/style/Makefile.in +++ /dev/null @@ -1,39 +0,0 @@ -VPATH=%VPATH% -CSSPARSER_DIR ?= ../rust-cssparser - -CC ?= gcc -CXX ?= g++ -CXXFLAGS ?= -AR ?= ar -RUSTC ?= rustc -RUSTFLAGS ?= -L $(CSSPARSER_DIR) - - -PROPERTIES_RS=$(VPATH)/properties/mod.rs -RUST_SRC=$(shell find $(VPATH)/. -type f -name '*.rs') $(CSSPARSER_DIR)/libcssparser.dummy $(PROPERTIES_RS) - -.PHONY: all -all: libservo-style.dummy - -libservo-style.dummy: servo-style.rc $(RUST_SRC) - $(RUSTC) $(RUSTFLAGS) $< - touch $@ - -servo-style-test: servo-style.rc $(RUST_SRC) - $(RUSTC) $(RUSTFLAGS) $< -o $@ --test - -.PHONY: check -check: servo-style-test - ./servo-style-test - -.PHONY: check-debug -check-debug: servo-style-tests - echo -e "start\n break upcall_fail\n continue\n where\n continue" | gdb -q ./servo-style-tests - -.PHONY: clean -clean: - rm -f *.o *.a *.so *.dylib *.dll *.dummy *-test - - -$(PROPERTIES_RS): $(PROPERTIES_RS).mako - PYTHONPATH=$(VPATH)/Mako-0.8.1.zip python -c "from mako.template import Template; print(Template(filename='$<').render())" > $@ diff --git a/src/components/script/style/README.md b/src/components/script/style/README.md index fd3bb045639..6a77ba5611c 100644 --- a/src/components/script/style/README.md +++ b/src/components/script/style/README.md @@ -4,7 +4,3 @@ servo-style Prototype replacement style system for Servo, based on [rust-cssparser](https://github.com/mozilla-servo/rust-cssparser) instead of [NetSurf’s libcss](https://github.com/mozilla-servo/libcss). - -This is meant to go into Servo’s `src/components/script/style` directory, -but is maintained here for now because it requires at least -Rust ecfc9a8 (2013-08-12). diff --git a/src/components/script/style/configure b/src/components/script/style/configure deleted file mode 100755 index 62a0f4cd3e6..00000000000 --- a/src/components/script/style/configure +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -SRCDIR="$(cd $(dirname $0) && pwd)" -sed "s#%VPATH%#${SRCDIR}#" ${SRCDIR}/Makefile.in > Makefile diff --git a/src/components/script/style/media_queries.rs b/src/components/script/style/media_queries.rs index 3266130fcf1..cffa9703beb 100644 --- a/src/components/script/style/media_queries.rs +++ b/src/components/script/style/media_queries.rs @@ -4,9 +4,9 @@ use std::ascii::StrAsciiExt; use cssparser::*; -use errors::{ErrorLoggerIterator, log_css_error}; -use stylesheets::{CSSRule, CSSMediaRule, parse_style_rule, parse_nested_at_rule}; -use namespaces::NamespaceMap; +use style::errors::{ErrorLoggerIterator, log_css_error}; +use style::stylesheets::{CSSRule, CSSMediaRule, parse_style_rule, parse_nested_at_rule}; +use style::namespaces::NamespaceMap; pub struct MediaRule { diff --git a/src/components/script/style/mod.rs b/src/components/script/style/mod.rs new file mode 100644 index 00000000000..8ed3bf918f7 --- /dev/null +++ b/src/components/script/style/mod.rs @@ -0,0 +1,7 @@ +pub mod stylesheets; +pub mod errors; +pub mod selectors; +pub mod properties; +pub mod namespaces; +pub mod media_queries; +pub mod parsing_utils; diff --git a/src/components/script/style/namespaces.rs b/src/components/script/style/namespaces.rs index 3c94ec3b3ea..1bb9260b40c 100644 --- a/src/components/script/style/namespaces.rs +++ b/src/components/script/style/namespaces.rs @@ -4,7 +4,7 @@ use std::hashmap::HashMap; use cssparser::*; -use errors::log_css_error; +use style::errors::log_css_error; pub struct NamespaceMap { default: Option<~str>, // Optional URL diff --git a/src/components/script/style/properties/.gitignore b/src/components/script/style/properties/.gitignore new file mode 100644 index 00000000000..73abffdd5d0 --- /dev/null +++ b/src/components/script/style/properties/.gitignore @@ -0,0 +1 @@ +mod.rs diff --git a/src/components/script/style/Mako-0.8.1.zip b/src/components/script/style/properties/Mako-0.8.1.zip similarity index 100% rename from src/components/script/style/Mako-0.8.1.zip rename to src/components/script/style/properties/Mako-0.8.1.zip diff --git a/src/components/script/style/properties/mod.rs.mako b/src/components/script/style/properties/mod.rs.mako index 8b3417263df..3d6227417f4 100644 --- a/src/components/script/style/properties/mod.rs.mako +++ b/src/components/script/style/properties/mod.rs.mako @@ -5,10 +5,10 @@ // This file is a Mako template: http://www.makotemplates.org/ use std::ascii::StrAsciiExt; -use errors::{ErrorLoggerIterator, log_css_error}; pub use std::iterator; pub use cssparser::*; -pub use parsing_utils::*; +pub use style::errors::{ErrorLoggerIterator, log_css_error}; +pub use style::parsing_utils::*; pub use self::common_types::*; pub mod common_types; diff --git a/src/components/script/style/selectors.rs b/src/components/script/style/selectors.rs index 2cacb177b54..3945b3240f7 100644 --- a/src/components/script/style/selectors.rs +++ b/src/components/script/style/selectors.rs @@ -5,7 +5,7 @@ use std::{vec, iterator}; use std::ascii::StrAsciiExt; use cssparser::*; -use namespaces::NamespaceMap; +use style::namespaces::NamespaceMap; pub struct Selector { diff --git a/src/components/script/style/servo-style.rc b/src/components/script/style/servo-style.rc deleted file mode 100644 index c4b891dd2d7..00000000000 --- a/src/components/script/style/servo-style.rc +++ /dev/null @@ -1,17 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#[link(name = "servo-style", vers = "0.1")]; -#[crate_type = "lib"]; - -extern mod extra; -extern mod cssparser; - -pub mod stylesheets; -pub mod errors; -pub mod selectors; -pub mod properties; -pub mod namespaces; -pub mod media_queries; -pub mod parsing_utils; diff --git a/src/components/script/style/stylesheets.rs b/src/components/script/style/stylesheets.rs index 5d9d5a2a9fa..4fb13611bba 100644 --- a/src/components/script/style/stylesheets.rs +++ b/src/components/script/style/stylesheets.rs @@ -5,12 +5,12 @@ use std::iterator::Iterator; use std::ascii::StrAsciiExt; use cssparser::*; -use selectors; -use properties; -use errors::{ErrorLoggerIterator, log_css_error}; -use namespaces::{NamespaceMap, parse_namespace_rule}; -use media_queries::{MediaRule, parse_media_rule}; -use media_queries; +use style::selectors; +use style::properties; +use style::errors::{ErrorLoggerIterator, log_css_error}; +use style::namespaces::{NamespaceMap, parse_namespace_rule}; +use style::media_queries::{MediaRule, parse_media_rule}; +use style::media_queries; pub struct Stylesheet { diff --git a/src/support/css/rust-cssparser b/src/support/css/rust-cssparser index 8700565717e..38d1caae638 160000 --- a/src/support/css/rust-cssparser +++ b/src/support/css/rust-cssparser @@ -1 +1 @@ -Subproject commit 8700565717e8c94f6615761f074dafe8e6283d9f +Subproject commit 38d1caae638b28bbfbbbc988b0b841e973345243 From 496072c8e114ff22f7a6aec10e2d9b09f4aadde0 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Tue, 3 Sep 2013 22:19:05 +0100 Subject: [PATCH 28/29] Trigger a rust rebuild I previously changed this to the same date as another commit, so the changed "disappeared" when I rebased. --- src/compiler/rust-auto-clean-trigger | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/rust-auto-clean-trigger b/src/compiler/rust-auto-clean-trigger index e1b3ff78958..a7e1310f916 100644 --- a/src/compiler/rust-auto-clean-trigger +++ b/src/compiler/rust-auto-clean-trigger @@ -1,4 +1,4 @@ # If this file is modified, then rust will be forcibly cleaned and then rebuilt. # The actual contents of this file do not matter, but to trigger a change on the # build bots then the contents should be changed so git updates the mtime. -2013-08-30 +2013-09-03 From 1912b82bfa45380ff76dd540e235187db806de46 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Wed, 4 Sep 2013 17:41:41 +0100 Subject: [PATCH 29/29] Add missing license header in src/components/script/style/mod.rs --- src/components/script/style/mod.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/script/style/mod.rs b/src/components/script/style/mod.rs index 8ed3bf918f7..f243ef0feb8 100644 --- a/src/components/script/style/mod.rs +++ b/src/components/script/style/mod.rs @@ -1,3 +1,7 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + pub mod stylesheets; pub mod errors; pub mod selectors;