remove math.blas.syntax and merge parsing words into math.blas.vectors/matrices
[factor/jcg.git] / basis / html / templates / templates.factor
blob57418a3e02a0e0b6fa8aa9fb8ff6018b4ad69708
1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors kernel fry io io.encodings.utf8 io.files
4 debugger prettyprint continuations namespaces boxes sequences
5 arrays strings html.elements io.streams.string
6 quotations xml.data xml.writer ;
7 IN: html.templates
9 MIXIN: template
11 GENERIC: call-template* ( template -- )
13 M: string call-template* write ;
15 M: callable call-template* call ;
17 M: xml call-template* write-xml ;
19 M: object call-template* output-stream get stream-copy ;
21 ERROR: template-error template error ;
23 M: template-error error.
24     "Error while processing template " write
25     [ template>> short. ":" print nl ]
26     [ error>> error. ]
27     bi ;
29 : call-template ( template -- )
30     [ call-template* ] [ \ template-error boa rethrow ] recover ;
32 SYMBOL: title
34 : set-title ( string -- )
35     title get >box ;
37 : write-title ( -- )
38     title get value>> write ;
40 SYMBOL: style
42 : add-style ( string -- )
43     "\n" style get push-all
44          style get push-all ;
46 : write-style ( -- )
47     style get >string write ;
49 SYMBOL: atom-feeds
51 : add-atom-feed ( title url -- )
52     2array atom-feeds get push ;
54 : write-atom-feeds ( -- )
55     atom-feeds get [
56         <link "alternate" =rel "application/atom+xml" =type
57         first2 [ =title ] [ =href ] bi*
58         link/>
59     ] each ;
61 SYMBOL: nested-template?
63 SYMBOL: next-template
65 : call-next-template ( -- )
66     next-template get write-html ;
68 M: f call-template* drop call-next-template ;
70 : with-boilerplate ( child master -- )
71     [
72         title [ <box> or ] change
73         style [ SBUF" " clone or ] change
74         atom-feeds [ V{ } like ] change
76         [
77             [
78                 nested-template? on
79                 call-template
80             ] with-string-writer
81             next-template set
82         ]
83         [ call-template ]
84         bi*
85     ] with-scope ; inline
87 : template-convert ( template output -- )
88     utf8 [ call-template ] with-file-writer ;