factor/basis/html/templates/chloe/syntax/syntax.factor

62 lines
1.5 KiB
Factor
Raw Normal View History

! Copyright (C) 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
IN: html.templates.chloe.syntax
USING: accessors kernel sequences combinators kernel namespaces
2008-06-25 04:25:08 -04:00
classes.tuple assocs splitting words arrays memoize parser lexer
io io.files io.encodings.utf8 io.streams.string
unicode.case tuple-syntax mirrors fry math urls
multiline xml xml.data xml.writer xml.utilities
html.elements
html.components
html.templates ;
SYMBOL: tags
tags global [ H{ } clone or ] change-at
2008-06-02 16:00:03 -04:00
: define-chloe-tag ( name quot -- ) swap tags get set-at ;
: CHLOE:
2008-06-02 16:00:03 -04:00
scan parse-definition define-chloe-tag ; parsing
: chloe-ns "http://factorcode.org/chloe/1.0" ; inline
MEMO: chloe-name ( string -- name )
name new
2008-08-29 05:23:39 -04:00
swap >>main
chloe-ns >>url ;
: required-attr ( tag name -- value )
dup chloe-name rot at*
[ nip ] [ drop " attribute is required" append throw ] if ;
: optional-attr ( tag name -- value )
chloe-name swap at ;
: singleton-component-tag ( tag class -- )
[ "name" required-attr ] dip render ;
: CHLOE-SINGLETON:
2008-06-02 16:00:03 -04:00
scan-word
[ name>> ] [ '[ , singleton-component-tag ] ] bi
2008-06-02 16:00:03 -04:00
define-chloe-tag ;
parsing
: attrs>slots ( tag tuple -- )
[ attrs>> ] [ <mirror> ] bi*
'[
2008-08-29 05:23:39 -04:00
swap main>> dup "name" =
[ 2drop ] [ , set-at ] if
] assoc-each ;
: tuple-component-tag ( tag class -- )
[ drop "name" required-attr ]
[ new [ attrs>slots ] keep ]
2bi render ;
: CHLOE-TUPLE:
2008-06-02 16:00:03 -04:00
scan-word
[ name>> ] [ '[ , tuple-component-tag ] ] bi
2008-06-02 16:00:03 -04:00
define-chloe-tag ;
parsing