diff --git a/data/test/ignore b/data/test/ignore index af3dd507..60dd1e87 100644 --- a/data/test/ignore +++ b/data/test/ignore @@ -1,6 +1,3 @@ -tb: isindex.dat-0 -tb: isindex.dat-1 -tb: isindex.dat-2 tb: ruby.dat-0 tb: ruby.dat-1 tb: ruby.dat-10 @@ -13,14 +10,8 @@ tb: ruby.dat-20 tb: ruby.dat-3 tb: ruby.dat-5 tb: ruby.dat-7 -tb: tests19.dat-10 -tb: tests19.dat-11 tb: tests19.dat-18 tb: tests19.dat-21 -tb: tests19.dat-7 -tb: tests19.dat-8 -tb: tests19.dat-9 -tb: tests2.dat-44 tb: tests20.dat-34 tb: tests20.dat-35 tb: tests20.dat-36 diff --git a/src/tree_builder/rules.expanded.rs b/src/tree_builder/rules.expanded.rs index 7495b88f..492281bd 100644 --- a/src/tree_builder/rules.expanded.rs +++ b/src/tree_builder/rules.expanded.rs @@ -8,15 +8,15 @@ // except according to those terms. // This file is generated from rules.rs -// source SipHash: 4083772598771558827 +// source SipHash: 6604065678599019684 # ! [ doc = "//! The tree builder rules, as a single, enormous nested match expression." ] use tree_builder::types::*; use tree_builder::tag_sets::*; -use tree_builder::actions::TreeBuilderActions; +use tree_builder::actions::{NoPush, Push, TreeBuilderActions}; use tree_builder::interface::{TreeSink, Quirks, AppendNode, NextParserState}; -use tokenizer::{Tag, StartTag, EndTag}; +use tokenizer::{Attribute, EndTag, StartTag, Tag}; use tokenizer::states::{Rcdata, Rawtext, ScriptData, Plaintext, Quiescent}; use util::str::is_ascii_whitespace; use std::ascii::AsciiExt; use std::mem::replace; use std::borrow::Cow::Borrowed; @@ -1169,10 +1169,52 @@ impl TreeBuilderStep for super::TreeBuilder where self.unexpected(&tag); self.step(InBody, TagToken(Tag{name: atom!(img), ..tag})) } - ::tree_builder::types::TagToken(::tokenizer::Tag { + ::tree_builder::types::TagToken(tag@::tokenizer::Tag { kind: ::tokenizer::StartTag, name: atom!(isindex), .. }) => - panic!("FIXME: not implemented"), + { + self.unexpected(&tag); + let in_template = + self.in_html_elem_named(atom!(template)); + if !in_template && self.form_elem.is_some() { + return Done; + } + self.frameset_ok = false; + self.close_p_element_in_button_scope(); + let mut form_attrs = vec!(); + let mut prompt = None; + let mut input_attrs = vec!(); + for attr in tag.attrs.into_iter() { + match attr.name { + qualname!("" , action) => form_attrs.push(attr), + qualname!("" , prompt) => + prompt = Some(attr.value), + qualname!("" , name) => { } + _ => input_attrs.push(attr), + } + } + input_attrs.push(Attribute{name: qualname!("" , name), + value: + "isindex".to_tendril(),}); + let form = + self.insert_element(Push, ns!(HTML), atom!(form), + form_attrs); + if !in_template { self.form_elem = Some(form.clone()); } + self.insert_element(NoPush, ns!(HTML), atom!(hr), vec!()); + self.reconstruct_formatting(); + self.insert_element(Push, ns!(HTML), atom!(label), + vec!()); + self.append_text(prompt.unwrap_or_else(|| { + "This is a searchable index. Enter search keywords: ".to_tendril() + })); + self.insert_element(NoPush, ns!(HTML), atom!(input), + input_attrs); + self.pop(); + self.insert_element(NoPush, ns!(HTML), atom!(hr), vec!()); + self.pop(); + if !in_template { self.form_elem = None; } + DoneAckSelfClosing + } ::tree_builder::types::TagToken(tag@::tokenizer::Tag { kind: ::tokenizer::StartTag, name: atom!(textarea), .. }) diff --git a/src/tree_builder/rules.rs b/src/tree_builder/rules.rs index 8ed47c86..e2a03558 100644 --- a/src/tree_builder/rules.rs +++ b/src/tree_builder/rules.rs @@ -11,10 +11,10 @@ use tree_builder::types::*; use tree_builder::tag_sets::*; -use tree_builder::actions::TreeBuilderActions; +use tree_builder::actions::{NoPush, Push, TreeBuilderActions}; use tree_builder::interface::{TreeSink, Quirks, AppendNode, NextParserState}; -use tokenizer::{Tag, StartTag, EndTag}; +use tokenizer::{Attribute, EndTag, StartTag, Tag}; use tokenizer::states::{Rcdata, Rawtext, ScriptData, Plaintext, Quiescent}; use util::str::is_ascii_whitespace; @@ -629,7 +629,48 @@ impl TreeBuilderStep })) } - => panic!("FIXME: not implemented"), + tag @ => { + self.unexpected(&tag); + let in_template = self.in_html_elem_named(atom!(template)); + if !in_template && self.form_elem.is_some() { + return Done; + } + self.frameset_ok = false; + self.close_p_element_in_button_scope(); + let mut form_attrs = vec![]; + let mut prompt = None; + let mut input_attrs = vec![]; + for attr in tag.attrs.into_iter() { + match attr.name { + qualname!("", action) => form_attrs.push(attr), + qualname!("", prompt) => prompt = Some(attr.value), + qualname!("", name) => {}, + _ => input_attrs.push(attr), + } + } + input_attrs.push(Attribute { + name: qualname!("", name), + value: "isindex".to_tendril(), + }); + let form = self.insert_element(Push, ns!(HTML), atom!(form), form_attrs); + if !in_template { + self.form_elem = Some(form.clone()); + } + self.insert_element(NoPush, ns!(HTML), atom!(hr), vec![]); + self.reconstruct_formatting(); + self.insert_element(Push, ns!(HTML), atom!(label), vec![]); + self.append_text(prompt.unwrap_or_else(|| { + "This is a searchable index. Enter search keywords: ".to_tendril() + })); + self.insert_element(NoPush, ns!(HTML), atom!(input), input_attrs); + self.pop(); + self.insert_element(NoPush, ns!(HTML), atom!(hr), vec![]); + self.pop(); + if !in_template { + self.form_elem = None; + } + DoneAckSelfClosing + } tag @