chloe: ensure self-closing tags are self-closing

This gets us much closer to HTML5 compatibility, while not breaking the
existing XHTML functionality. (Indeed, the entire reason this is necessary is
that XHTML, being an XML derivative, treats `<foo></foo>` and `<foo />`
equivalently, whereas HTML5 does not.)
db4
Benjamin Pollack 2016-03-11 11:01:22 -05:00
parent 2f1b7bf9e1
commit ed1ccc4448
1 changed files with 33 additions and 7 deletions

View File

@ -2,7 +2,7 @@
! See http://factorcode.org/license.txt for BSD license.
USING: assocs namespaces make kernel sequences accessors
combinators strings splitting io io.streams.string present
xml.writer xml.data xml.entities html.forms
sets ascii xml.writer xml.data xml.entities html.forms
html.templates html.templates.chloe.syntax ;
IN: html.templates.chloe.compiler
@ -60,6 +60,11 @@ DEFER: compile-element
"\"" [write]
] assoc-each ;
: compile-self-closing-tag ( tag -- )
"<" [write]
[ name>string [write] ] [ attrs>> compile-attrs ] bi
" />" [write] ;
: compile-start-tag ( tag -- )
"<" [write]
[ name>string [write] ] [ attrs>> compile-attrs ] bi
@ -74,17 +79,38 @@ SYMBOL: string-context?
ERROR: tag-not-allowed-here ;
CONSTANT: self-closing-tags {
"area"
"base"
"br"
"embed"
"hr"
"iframe"
"img"
"input"
"link"
"meta"
"param"
"source"
"track"
}
: check-tag ( -- )
string-context? get [ tag-not-allowed-here ] when ;
: compile-tag ( tag -- )
check-tag
{
[ main>> tag-stack get push ]
: (compile-tag) ( tag -- )
dup name>string >lower self-closing-tags in?
[ compile-self-closing-tag ]
[
[ compile-start-tag ]
[ compile-children ]
[ compile-end-tag ]
} cleave
[ compile-end-tag ] tri
] if ;
: compile-tag ( tag -- )
check-tag
[ main>> tag-stack get push ]
[ (compile-tag) ] bi
tag-stack get pop* ;
ERROR: unknown-chloe-tag tag ;