-
Notifications
You must be signed in to change notification settings - Fork 267
/
ssi.yaws
114 lines (81 loc) · 3.57 KB
/
ssi.yaws
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<erl>
box(Str) ->
{'div',[{class,"box"}],
{pre,[],Str}}.
tbox(T) ->
box(lists:flatten(io_lib:format("~p",[T]))).
ssi(File) ->
{'div',[{class,"box"}],
{pre,[],
{ssi, File,[],[]}}}.
out(A) ->
[{ssi, "TAB.inc", [],[]},
{ehtml,
{'div', [{id, "entry"}],
[
{h1, [], "Server side includes (with variable expansion)"},
{p, [],
"This feature is useful when we are writing applications where "
"basically the entire page is dynamically generated but we also "
"want to include snippets of either html or, even more typically,"
" javascript which is almost static, but not quite."},
{p, [], "In particular the case with dynamically generated javascript "
"can get syntactically ugly. So instead of generating strings in "
"the erlang code for the javascripts and returning them as "
"{pre_html, Data} tuples, it is more beautiful to keep the "
"javascript functions in separate files and include them with "
"the {ssi ...} return value."},
{p, [], "The format of the ssi statement is:"},
{br},
box("{ssi, File, Delimiter, Bindings}"),
{p, [],"The ssi structure can occur in two radically different places"
" but with identical semantics. It can be a return value in the "
" out/1 function and it is a specially treated return value "
"in ehtml output, here is an example of an odd return value "
"from out/1"},
tbox([{ssi, "ssi_ex1", "%", [{"a", "gazzonk"}]},
{ehtml,
[
{h1, "a Header"},
{ssi, "ssi_ex1", "%", [{"a", "zippo"}]}]}]),
{p,[], "The file ssi_ex1 contains the following text:"},
ssi("ssi_ex1"),
{p, [], "And the following ehtml output:"},
tbox({ehtml,[{ssi, "ssi_ex1", "%", [{"a", "Godzilla"}]}]}),
{p,[], "Generates the following output"},
{'div',[{class,"box"}],
{pre,[],
{ssi, "ssi_ex1", "%", [{"a", "Godzilla"}]}}},
{p, [], "And so does the following out/1 function"},
box("out(A) -> [{ssi, \"ssi_ex1\", \"%\", [{\"a\", \"Godzilla\"}]}]."),
{p,[], "So this is the way to do when we want to embed dynamic content"
" deep inside an ehtml structure, but the content isn't representable"
" as ehtml. This is typically the case for dynamically generated "
" javascript as well as dynamically generated java applets."},
{p, [], "In the above example, \"a\" can be seen as the Variable "
"name whereas \"Godzilla\" can be vievwe upon as the value "
"of variable \"a\". It is also possible to have the variable "
" value be a complete ehtml structure, not just plain ascii "
"strings. Here is an example"},
box("out(A) ->
E = {ehtml, {h1, [], \"Godzillas baby\"}},
[{ssi, \"ssi_ex1\", \"%\", [{\"a\", E}]}]."),
{h1, [], "yssi, Yaws Server Side Includes"},
{p, [], "We have a special version of server side includes that we "
" call yssi, yaws server side includes. The syntax for this is: "},
box("{yssi, YawsFile}"),
{p, [], "Yssi can only be used as a return value from the out/1 "
" function, never nested into a deep ehtml structure."
" Yssi, will perform full yaws expansion on the file named "
"YawsFile, i.e (possibly on the fly) compile it, execute it and"
" subsequently inject the generated output from the YawsFile."
" yssi statements can be arbitrarily deeply recursively nested, that "
" is a .yaws file which has been included through an 'yssi' "
" statement, may itself contain 'yssi' return values in its "
" out/1 function(s) "}
]
}
}
].
</erl>
</html>