diff --git a/basis/html/templates/chloe/compiler/compiler.factor b/basis/html/templates/chloe/compiler/compiler.factor
index 1c7c73c90f..1d83a568da 100644
--- a/basis/html/templates/chloe/compiler/compiler.factor
+++ b/basis/html/templates/chloe/compiler/compiler.factor
@@ -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 ;