Merge pull request #14 from jonathanKingston/handle-bool
Handle bool attributes. Fixes #13
This commit is contained in:
commit
b3ecb54ed8
|
@ -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>
|
||||||
))
|
))
|
||||||
|
|
|
@ -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) => {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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")]
|
||||||
|
|
Loading…
Reference in New Issue