Skip to content

Instantly share code, notes, and snippets.

@kmcallister
Last active August 29, 2015 14:02
Show Gist options
  • Save kmcallister/f19ac199bc3de8a4649d to your computer and use it in GitHub Desktop.
Save kmcallister/f19ac199bc3de8a4649d to your computer and use it in GitHub Desktop.
HTML token match macro
states::InHead => match_token!(token {
CharacterTokens(NotSplit, text) => Split(KeepWhitespace, text),
CharacterTokens(Whitespace, text) => append_text!(self.target(), text),
CommentToken(text) => append_comment!(self.target(), text),
tag @ <base> <basefont> <bgsound> <link> <meta> => {
self.create_element_nopush(tag.name, tag.attrs);
Done
}
tag @ <title> => {
self.parse_raw_data(Rcdata);
self.create_element_move(tag);
Done
}
tag @ <noframes> <style> <noscript> => {
if (!self.opts.scripting_enabled) && named!(tag, noscript) {
self.create_element_move(tag);
self.mode = states::InHeadNoscript;
} else {
self.parse_raw_data(Rawtext);
self.create_element_move(tag);
}
Done
}
tag @ <script> => {
let target = self.target();
let elem = self.sink.create_element(HTML, atom!(script), tag.attrs);
if self.opts.fragment {
self.sink.mark_script_already_started(elem.clone());
}
self.push(&elem);
self.sink.append_element(target, elem);
self.parse_raw_data(ScriptData);
Done
}
<template>
=> fail!("FIXME: <template> not implemented"),
<head> => {
self.sink.parse_error("<head> in insertion mode InHead".to_string());
Done
}
</head> => {
self.pop();
self.mode = states::AfterHead;
Done
}
</body> </html> </br> => else,
<html>
=> self.step(states::InBody, token),
</template>
=> fail!("FIXME: <template> not implemented"),
tag @ </_> => {
self.sink.parse_error(format!("Unexpected end tag in InHead mode: {}", tag));
Done
}
token => {
self.pop();
Reprocess(states::AfterHead, token)
}
}),
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment