! Copyright (C) 2005 Alex Chapman
-! Copyright (C) 2006, 2009 Slava Pestov
+! Copyright (C) 2006, 2010 Slava Pestov
! See http://factorcode.org/license.txt for BSD license.
-USING: continuations sequences kernel namespaces debugger
-combinators math quotations generic strings splitting accessors
-assocs fry vocabs.parser parser lexer io io.files
-io.streams.string io.encodings.utf8 html.templates ;
+USING: accessors compiler.units html.templates io
+io.encodings.utf8 io.files kernel lexer lexer.private math
+namespaces parser parser.notes quotations sequences splitting
+vocabs.parser ;
IN: html.templates.fhtml
! We use a custom lexer so that %> ends a token even if not
M: template-lexer skip-word
[
- {
- { [ 2dup nth CHAR: " = ] [ drop 1+ ] }
- { [ 2dup swap tail-slice "%>" head? ] [ drop 2 + ] }
- [ f skip ]
- } cond
+ 2dup swap tail-slice "%>" head?
+ [ drop 2 + ] [ (skip-word) ] if
] change-lexer-column ;
DEFER: <% delimiter
: check-<% ( lexer -- col )
- "<%" over line-text>> rot column>> start* ;
+ "<%" swap [ line-text>> ] [ column>> ] bi subseq-start-from ;
: found-<% ( accum lexer col -- accum )
[
over line-text>>
- [ column>> ] 2dip subseq parsed
- \ write parsed
+ [ column>> ] 2dip subseq suffix!
+ \ write suffix!
] 2keep 2 + >>column drop ;
: still-looking ( accum lexer -- accum )
[
[ line-text>> ] [ column>> ] bi tail
- parsed \ print parsed
+ suffix! \ print suffix!
] keep next-line ;
: parse-%> ( accum lexer -- accum )
drop
] if ;
-: %> lexer get parse-%> ; parsing
+SYNTAX: %> lexer get parse-%> ;
: parse-template-lines ( lines -- quot )
<template-lexer> [
: parse-template ( string -- quot )
[
- "quiet" on
- parser-notes off
- "html.templates.fhtml" use+
- string-lines parse-template-lines
- ] with-file-vocabs ;
+ [
+ parser-quiet? on
+ "html.templates.fhtml" use-vocab
+ split-lines parse-template-lines
+ ] with-file-vocabs
+ ] with-compilation-unit ;
: eval-template ( string -- )
parse-template call( -- ) ;
C: <fhtml> fhtml
-M: fhtml call-template* ( filename -- )
- [ path>> utf8 file-contents eval-template ] call( filename -- ) ;
+M: fhtml call-template*
+ path>> utf8 file-contents eval-template ;
INSTANCE: fhtml template