factor/basis/html/templates/fhtml/fhtml.factor

78 lines
1.9 KiB
Factor
Raw Normal View History

2007-09-20 18:09:08 -04:00
! Copyright (C) 2005 Alex Chapman
! Copyright (C) 2006, 2009 Slava Pestov
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
2008-04-15 07:10:08 -04:00
USING: continuations sequences kernel namespaces debugger
combinators math quotations generic strings splitting accessors
assocs fry vocabs.parser parser lexer io io.files call
io.streams.string io.encodings.utf8 html.templates ;
2008-05-23 20:16:21 -04:00
IN: html.templates.fhtml
2007-09-20 18:09:08 -04:00
! We use a custom lexer so that %> ends a token even if not
! followed by whitespace
2008-04-14 05:34:26 -04:00
TUPLE: template-lexer < lexer ;
2007-09-20 18:09:08 -04:00
: <template-lexer> ( lines -- lexer )
template-lexer new-lexer ;
2007-09-20 18:09:08 -04:00
M: template-lexer skip-word
[
{
{ [ 2dup nth CHAR: " = ] [ drop 1+ ] }
{ [ 2dup swap tail-slice "%>" head? ] [ drop 2 + ] }
2008-04-11 13:55:57 -04:00
[ f skip ]
2007-09-20 18:09:08 -04:00
} cond
2008-03-20 20:54:25 -04:00
] change-lexer-column ;
2007-09-20 18:09:08 -04:00
DEFER: <% delimiter
: check-<% ( lexer -- col )
2008-04-14 05:34:26 -04:00
"<%" over line-text>> rot column>> start* ;
2007-09-20 18:09:08 -04:00
: found-<% ( accum lexer col -- accum )
[
2008-04-14 05:34:26 -04:00
over line-text>>
2008-05-23 20:16:21 -04:00
[ column>> ] 2dip subseq parsed
\ write parsed
2008-04-14 05:34:26 -04:00
] 2keep 2 + >>column drop ;
2007-09-20 18:09:08 -04:00
: still-looking ( accum lexer -- accum )
[
2008-04-14 05:34:26 -04:00
[ line-text>> ] [ column>> ] bi tail
parsed \ print parsed
2007-09-20 18:09:08 -04:00
] keep next-line ;
: parse-%> ( accum lexer -- accum )
dup still-parsing? [
dup check-<%
[ found-<% ] [ [ still-looking ] keep parse-%> ] if*
] [
drop
] if ;
: %> lexer get parse-%> ; parsing
: parse-template-lines ( lines -- quot )
<template-lexer> [
2008-06-25 04:25:08 -04:00
V{ } clone lexer get parse-%> f (parse-until) >quotation
] with-lexer ;
2007-09-20 18:09:08 -04:00
: parse-template ( string -- quot )
[
2008-05-23 20:16:21 -04:00
"quiet" on
parser-notes off
"html.templates.fhtml" use+
2007-09-20 18:09:08 -04:00
string-lines parse-template-lines
2008-05-23 20:16:21 -04:00
] with-file-vocabs ;
2007-09-20 18:09:08 -04:00
2008-05-23 20:16:21 -04:00
: eval-template ( string -- )
parse-template call ;
2008-04-15 07:10:08 -04:00
TUPLE: fhtml path ;
C: <fhtml> fhtml
2008-04-22 22:08:27 -04:00
M: fhtml call-template* ( filename -- )
'[ _ path>> utf8 file-contents eval-template ] call( -- ) ;
INSTANCE: fhtml template