mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Move CSS lexing into the parser to create a simpler interface
This commit is contained in:
parent
66f4fdc017
commit
23b6b386cb
3 changed files with 15 additions and 25 deletions
|
@ -1 +1 @@
|
||||||
Subproject commit 5ff00c90ba3c668f5da62eb25377e37714f855e7
|
Subproject commit 37cfbe86b6c024de87d1815843c956f4de535e9c
|
|
@ -1 +1 @@
|
||||||
Subproject commit 16ed0ba20caab03e5c16acb674e0f97d04327065
|
Subproject commit d83cd4e787993461bd00e321ee28570005dc933c
|
|
@ -3,42 +3,32 @@ Some little helpers for hooking up the HTML parser with the CSS parser
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use std::net::url::Url;
|
use std::net::url::Url;
|
||||||
|
use std::cell::Cell;
|
||||||
use resource::resource_task::{ResourceTask, ProgressMsg, Load, Payload, Done};
|
use resource::resource_task::{ResourceTask, ProgressMsg, Load, Payload, Done};
|
||||||
use newcss::values::Rule;
|
use newcss::values::Stylesheet;
|
||||||
use newcss::lexer_util::DataStream;
|
use newcss::util::{DataStream, DataStreamFactory};
|
||||||
use newcss::lexer::{Token, lex_css_from_bytes};
|
|
||||||
|
|
||||||
pub fn spawn_css_parser(url: Url, resource_task: ResourceTask) -> comm::Port<~[~Rule]> {
|
pub fn spawn_css_parser(url: Url, resource_task: ResourceTask) -> comm::Port<Stylesheet> {
|
||||||
let result_port = comm::Port();
|
let result_port = comm::Port();
|
||||||
let result_chan = comm::Chan(&result_port);
|
let result_chan = comm::Chan(&result_port);
|
||||||
// TODO: change copy to move once we have match move
|
|
||||||
let url = copy url;
|
|
||||||
do task::spawn |move url, copy resource_task| {
|
do task::spawn |move url, copy resource_task| {
|
||||||
let css_stream = spawn_css_lexer_task(copy url, resource_task);
|
let sheet = newcss::parser::parse_stylesheet(copy url, data_stream_factory(copy url, resource_task));
|
||||||
let mut css_rules = newcss::parser::build_stylesheet(move css_stream);
|
result_chan.send(move sheet);
|
||||||
result_chan.send(move css_rules);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result_port;
|
return result_port;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(non_implicitly_copyable_typarams)]
|
fn data_stream_factory(url: Url, resource_task: ResourceTask) -> DataStreamFactory {
|
||||||
fn spawn_css_lexer_task(url: Url, resource_task: ResourceTask) -> pipes::Port<Token> {
|
let url = Cell(move url);
|
||||||
let (result_chan, result_port) = pipes::stream();
|
return |move url| {
|
||||||
|
|
||||||
do task::spawn |move result_chan, move url| {
|
|
||||||
assert url.path.ends_with(".css");
|
|
||||||
let input_port = Port();
|
let input_port = Port();
|
||||||
// TODO: change copy to move once the compiler permits it
|
resource_task.send(Load(url.take(), input_port.chan()));
|
||||||
resource_task.send(Load(copy url, input_port.chan()));
|
resource_port_to_data_stream(input_port)
|
||||||
|
}
|
||||||
lex_css_from_bytes(resource_port_to_lexer_stream(input_port), &result_chan);
|
|
||||||
};
|
|
||||||
|
|
||||||
return move result_port;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resource_port_to_lexer_stream(input_port: comm::Port<ProgressMsg>) -> DataStream {
|
fn resource_port_to_data_stream(input_port: comm::Port<ProgressMsg>) -> DataStream {
|
||||||
return || {
|
return || {
|
||||||
match input_port.recv() {
|
match input_port.recv() {
|
||||||
Payload(move data) => Some(move data),
|
Payload(move data) => Some(move data),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue