Merge pull request #14 from jonathanKingston/handle-bool

Handle bool attributes. Fixes #13
This commit is contained in:
Bodil Stokke 2018-11-29 14:28:11 +00:00 committed by GitHub
commit b3ecb54ed8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 55 additions and 35 deletions

View File

@ -26,6 +26,7 @@ impl<'r> Responder<'r> for Html {
#[get("/")] #[get("/")]
fn index() -> Html { fn index() -> Html {
let a = false;
Html(html!( Html(html!(
<html> <html>
<head> <head>
@ -44,7 +45,7 @@ fn index() -> Html {
}) })
} }
<p>"<img src=\"javascript:alert('pwned lol')\">"</p> <p>"<img src=\"javascript:alert('pwned lol')\">"</p>
<button onclick="alert('She is not a cat.')">"Click me!"</button> <button disabled=a onclick="alert('She is not a cat.')">"Click me!"</button>
</body> </body>
</html> </html>
)) ))

View File

@ -154,6 +154,7 @@ impl Element {
.collect::<Result<Vec<TokenStream>, TokenStream>>()?; .collect::<Result<Vec<TokenStream>, TokenStream>>()?;
let mut body = TokenStream::new(); let mut body = TokenStream::new();
for (attr_str, key, value) in attrs { for (attr_str, key, value) in attrs {
match value { match value {
TokenTree::Literal(lit) if is_string_literal(lit) => { TokenTree::Literal(lit) if is_string_literal(lit) => {

View File

@ -79,11 +79,11 @@ declare_elements!{
article in [FlowContent, SectioningContent] with FlowContent; article in [FlowContent, SectioningContent] with FlowContent;
aside in [FlowContent, SectioningContent] with FlowContent; aside in [FlowContent, SectioningContent] with FlowContent;
audio { audio {
autoplay: bool, autoplay: Bool,
controls: bool, controls: Bool,
crossorigin: CrossOrigin, crossorigin: CrossOrigin,
loop: bool, loop: Bool,
muted: bool, muted: Bool,
preload: Preload, preload: Preload,
src: Uri, src: Uri,
} in [FlowContent, PhrasingContent, EmbeddedContent] with MediaContent; } in [FlowContent, PhrasingContent, EmbeddedContent] with MediaContent;
@ -95,13 +95,13 @@ declare_elements!{
} in [FlowContent] with FlowContent; } in [FlowContent] with FlowContent;
br in [FlowContent, PhrasingContent]; br in [FlowContent, PhrasingContent];
button { button {
autofocus: bool, autofocus: Bool,
disabled: bool, disabled: Bool,
form: Id, form: Id,
formaction: Uri, formaction: Uri,
formenctype: FormEncodingType, formenctype: FormEncodingType,
formmethod: FormMethod, formmethod: FormMethod,
formnovalidate: bool, formnovalidate: Bool,
formtarget: Target, formtarget: Target,
name: Id, name: Id,
type: ButtonType, type: ButtonType,
@ -122,7 +122,7 @@ declare_elements!{
datetime: Datetime, datetime: Datetime,
} in [FlowContent, PhrasingContent] with FlowContent; } in [FlowContent, PhrasingContent] with FlowContent;
details { details {
open: bool, open: Bool,
} in [FlowContent, SectioningContent, InteractiveContent] with [summary] FlowContent; } in [FlowContent, SectioningContent, InteractiveContent] with [summary] FlowContent;
dfn in [FlowContent, PhrasingContent] with PhrasingContent; dfn in [FlowContent, PhrasingContent] with PhrasingContent;
div in [FlowContent] with FlowContent; div in [FlowContent] with FlowContent;
@ -146,7 +146,7 @@ declare_elements!{
enctype: FormEncodingType, enctype: FormEncodingType,
method: FormMethod, method: FormMethod,
name: Id, name: Id,
novalidate: bool, novalidate: Bool,
target: Target, target: Target,
} in [FlowContent] with FlowContent; } in [FlowContent] with FlowContent;
h1 in [FlowContent, HeadingContent, HGroupContent] with PhrasingContent; h1 in [FlowContent, HeadingContent, HGroupContent] with PhrasingContent;
@ -161,8 +161,8 @@ declare_elements!{
i in [FlowContent, PhrasingContent] with PhrasingContent; i in [FlowContent, PhrasingContent] with PhrasingContent;
iframe { iframe {
allow: FeaturePolicy, allow: FeaturePolicy,
allowfullscreen: bool, allowfullscreen: Bool,
allowpaymentrequest: bool, allowpaymentrequest: Bool,
height: usize, height: usize,
name: Id, name: Id,
referrerpolicy: ReferrerPolicy, referrerpolicy: ReferrerPolicy,
@ -176,7 +176,7 @@ declare_elements!{
crossorigin: CrossOrigin, crossorigin: CrossOrigin,
decoding: ImageDecoding, decoding: ImageDecoding,
height: usize, height: usize,
ismap: bool, ismap: Bool,
sizes: SpacedList<String>, // FIXME it's not really just a string sizes: SpacedList<String>, // FIXME it's not really just a string
src: Uri, src: Uri,
srcset: String, // FIXME this is much more complicated srcset: String, // FIXME this is much more complicated
@ -185,12 +185,12 @@ declare_elements!{
} in [FlowContent, PhrasingContent, EmbeddedContent]; } in [FlowContent, PhrasingContent, EmbeddedContent];
input { input {
autocomplete: String, autocomplete: String,
autofocus: bool, autofocus: Bool,
disabled: bool, disabled: Bool,
form: Id, form: Id,
list: Id, list: Id,
name: Id, name: Id,
required: bool, required: Bool,
tabindex: usize, tabindex: usize,
type: InputType, type: InputType,
value: String, value: String,
@ -227,12 +227,12 @@ declare_elements!{
height: usize, height: usize,
name: Id, name: Id,
type: Mime, type: Mime,
typemustmatch: bool, typemustmatch: Bool,
usemap: String, // TODO should be a fragment starting with '#' usemap: String, // TODO should be a fragment starting with '#'
width: usize, width: usize,
} in [FlowContent, PhrasingContent, EmbeddedContent, InteractiveContent, FormContent] with param; } in [FlowContent, PhrasingContent, EmbeddedContent, InteractiveContent, FormContent] with param;
ol { ol {
reversed: bool, reversed: Bool,
start: isize, start: isize,
type: OrderedListType, type: OrderedListType,
} in [FlowContent] with li; } in [FlowContent] with li;
@ -254,11 +254,11 @@ declare_elements!{
s in [FlowContent, PhrasingContent] with PhrasingContent; s in [FlowContent, PhrasingContent] with PhrasingContent;
samp in [FlowContent, PhrasingContent] with PhrasingContent; samp in [FlowContent, PhrasingContent] with PhrasingContent;
script { script {
async: bool, async: Bool,
crossorigin: CrossOrigin, crossorigin: CrossOrigin,
defer: bool, defer: Bool,
integrity: Integrity, integrity: Integrity,
nomodule: bool, nomodule: Bool,
nonce: Nonce, nonce: Nonce,
src: Uri, src: Uri,
text: String, text: String,
@ -267,12 +267,12 @@ declare_elements!{
section in [FlowContent, SectioningContent] with FlowContent; section in [FlowContent, SectioningContent] with FlowContent;
select { select {
autocomplete: String, autocomplete: String,
autofocus: bool, autofocus: Bool,
disabled: bool, disabled: Bool,
form: Id, form: Id,
multiple: bool, multiple: Bool,
name: Id, name: Id,
required: bool, required: Bool,
size: usize, size: usize,
} in [FlowContent, PhrasingContent, InteractiveContent, FormContent] with SelectContent; } in [FlowContent, PhrasingContent, InteractiveContent, FormContent] with SelectContent;
small in [FlowContent, PhrasingContent] with PhrasingContent; small in [FlowContent, PhrasingContent] with PhrasingContent;
@ -284,16 +284,16 @@ declare_elements!{
template in [MetadataContent, FlowContent, PhrasingContent, TableColumnContent] with Node; template in [MetadataContent, FlowContent, PhrasingContent, TableColumnContent] with Node;
textarea { textarea {
autocomplete: OnOff, autocomplete: OnOff,
autofocus: bool, autofocus: Bool,
cols: usize, cols: usize,
disabled: bool, disabled: Bool,
form: Id, form: Id,
maxlength: usize, maxlength: usize,
minlength: usize, minlength: usize,
name: Id, name: Id,
placeholder: String, placeholder: String,
readonly: bool, readonly: Bool,
required: bool, required: Bool,
rows: usize, rows: usize,
spellcheck: BoolOrDefault, spellcheck: BoolOrDefault,
wrap: Wrap, wrap: Wrap,
@ -310,7 +310,7 @@ declare_elements!{
area { area {
alt: String, alt: String,
coords: String, // TODO could perhaps be validated coords: String, // TODO could perhaps be validated
download: bool, download: Bool,
href: Uri, href: Uri,
hreflang: LanguageTag, hreflang: LanguageTag,
ping: SpacedList<Uri>, ping: SpacedList<Uri>,
@ -333,13 +333,13 @@ declare_elements!{
value: isize, value: isize,
} with FlowContent; } with FlowContent;
option { option {
disabled: bool, disabled: Bool,
label: String, label: String,
selected: bool, selected: Bool,
value: String, value: String,
} in [SelectContent] with TextNode; } in [SelectContent] with TextNode;
optgroup { optgroup {
disabled: bool, disabled: Bool,
label: String, label: String,
} in [SelectContent] with option; } in [SelectContent] with option;
param { param {
@ -368,7 +368,7 @@ declare_elements!{
thead in [TableContent] with tr; thead in [TableContent] with tr;
tr in [TableContent] with TableColumnContent; tr in [TableContent] with TableColumnContent;
track { track {
default: bool, default: Bool,
kind: VideoKind, kind: VideoKind,
label: String, label: String,
src: Uri, src: Uri,
@ -386,7 +386,7 @@ declare_elements!{
loop: isize, loop: isize,
scrollamount: usize, scrollamount: usize,
scrolldelay: usize, scrolldelay: usize,
truespeed: bool, truespeed: Bool,
vspace: String, // FIXME size vspace: String, // FIXME size
width: String, // FIXME size width: String, // FIXME size
} in [FlowContent, PhrasingContent] with PhrasingContent; } in [FlowContent, PhrasingContent] with PhrasingContent;

View File

@ -58,6 +58,24 @@ pub enum ButtonType {
Button, Button,
} }
#[derive(EnumString, Display, PartialEq, Eq, PartialOrd, Ord, AsRefStr, AsStaticStr)]
pub enum Bool {
#[strum(to_string = "true")]
True,
#[strum(to_string = "")]
False,
}
impl From<bool> for Bool {
fn from(v: bool) -> Self {
if v {
Bool::True
} else {
Bool::False
}
}
}
#[derive(EnumString, Display, PartialEq, Eq, PartialOrd, Ord, AsRefStr, AsStaticStr)] #[derive(EnumString, Display, PartialEq, Eq, PartialOrd, Ord, AsRefStr, AsStaticStr)]
pub enum CrossOrigin { pub enum CrossOrigin {
#[strum(to_string = "anonymous")] #[strum(to_string = "anonymous")]