/index.yaws




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],_) -> [].