out(A) ->
[{ssi, "TAB.inc","%%",[{"index", "choosen"}]},
{ehtml,
[{'div', [{id, "entry"}],
[{h1,[],"Yaws"},
{p,[],"Yaws is a HTTP high perfomance 1.1 webserver particularly"
" well suited for dynamic-content web applications. Two
separate modes of operations are supported:"},
{ul,[],
[{li,[],
{p,[],"Standalone mode where Yaws runs as a regular webserver "
"daemon. This is the default mode."}},
{li,[],
{p,[], "Embedded mode where Yaws runs as an embedded webserver in "
"another Erlang application."}}
]},
{p,[], ["Yaws is entirely written in ",
{a, [{href, "https://www.erlang.org"}], "Erlang"},
", and furthermore it is a multithreaded webserver where one "
"Erlang lightweight process is used to handle each client."]},
{p,[], "The main advantages of Yaws compared to other Web technologies"
" are performance and elegance. The performance comes from the "
" underlying Erlang system and its ability to handle concurrent "
" processes in an efficent way. Its elegance comes from Erlang as "
"well. Web applications don't have to be written in ugly ad hoc "
"languages."},
{h2,[], "erlyaws.github.io"},
{p,[], ["The www page for Yaws is ",
{a ,[{href,"https://erlyaws.github.io"}], "erlyaws.github.io"},
". The documentation, examples as well as releases can be "
"found there, and of course, ",
{a ,[{href,"https://erlyaws.github.io"}],"erlyaws.github.io"},
" is itself powered by Yaws."]},
{p,[], ["Code is on : ",
{a,[{href,"https://github.com/erlyaws/yaws"}],
"https://github.com/erlyaws/yaws"}]},
{p, [], ["Travis test results at :",
{a, [{href, "https://github.com/erlyaws/yaws/actions"
"/workflows/main.yml"}],
"https://github.com/erlyaws/yaws/actions"
"/workflows/main.yml"}]},
{p,[], ["A mailing list exists at: ",
{a,[{href,"https://lists.sourceforge.net/lists/listinfo/"
"erlyaws-list"}],
"https://lists.sourceforge.net/lists/listinfo/erlyaws-list"}]},
{p, [], ["A lot of excellent"
" engineers have contributed to Yaws over the years, "
"we keep a list of all "
,{a ,[{href,"contributors.txt"}], "contributors"}
]},
{p, [], ["A high resolution logo created by Tomas Selander exists at ",
{a, [{href, "yaws.eps"}], "yaws.eps"}]},
{h2, [], "News"},
{p, [], ["To see all the most recent changes and activity in Yaws "
"development, please visit the ",
{a, [{href, "https://github.com/erlyaws/yaws"}],
"Yaws github repository"}, "."]},
gen_log(A)]}]},
{ssi, "END2",[],[]}].
is_proper(10) ->
false;
is_proper(Tag) ->
case string:tokens(Tag, "-") of
["yaws", Rel] ->
IntList = string:tokens(Rel, "."),
case lists:filter(
fun(IntStr) ->
case catch list_to_integer(IntStr) of
{'EXIT', _} ->
true;
_ ->
false
end
end, IntList) of
[] ->
true;
_ ->
false
end;
_ ->
false
end.
cd(Git) ->
["cd ", Git, "; "].
git(Cd, Cmd) ->
os:cmd([cd(Cd), Cmd]).
head(Tag, Dir) ->
Date =
git(Dir, ["git --no-pager show ", Tag, " | grep Date | head -1"]),
Ret = ["Version " , Tag, " " , Date],
Ret.
gen_log(A) ->
case os:getenv("YAWS_GIT") of
false ->
[];
Dir ->
Tags = lists:filter(
fun(Tag) ->
is_proper(Tag) end,
lists:reverse(
string:tokens(
git(Dir, "git tag -l"), [10]))),
gen_log(A, Tags, Dir)
end.
dlog(Last, Prev, Dir) ->
Str =
git(Dir,
["git --no-pager log --abbrev-commit --no-merges --pretty=medium ",
Prev, "..", Last, " | cat"]),
Str2 = lists:zf(fun(I) ->
if I == $< ->
%% XSS
false;
0
{true, I};
true ->
false
end
end, Str),
Lines = string:tokens(Str2, "\n"),
lists:map(
fun(Line) ->
case Line of
"commit " ++ _ ->
["
", Line, "
"];
_ ->
[Line, "
"]
end
end,Lines).
gen_log(_, [], _) ->
[];
gen_log(A, [Last, Prev | Tail], Dir) ->
Head = head(Last, Dir),
Data = dlog(Last, Prev, Dir),
X = [{'div', [{class, "news"}],
[{h3, [], Head},
{p, [], ["", Data, "
"]}]}
],
[ X | gen_log(A, [Prev | Tail], Dir)];
gen_log(A, [Last],_) ->
[].