anchor.diff:      "<tr>\n"
           ++ lists:flatmap(fun (TD) -> "<td>" ++ TD ++ "</td>\n" end, TDs) ++
       "</tr>\n".
  +
  +table_titles (Items) ->
  +    C = trunc(math:sqrt(length(Items))),
  +    Cols = split_n_times(C, Items, []),
  +    Body = [[case Rev of
  +                 '@' -> "";
  +                 _ -> Rev
  +             end || Rev <- Revs]
  +            || Revs <- Cols],
  +    "<table>\n"
  +        "<tbody>\n" ++ lists:flatmap(fun html_row/1, Body) ++ "</tbody>\n"
  +    "</table>\n".
  +
  +split_n_times (_, [], Acc) -> Acc;
  +split_n_times (N, List, Acc)
  +  when length(List) >= N ->
  +    {Top0,Rest} = lists:split(N, List),
  +    Top = case length(Top0) of
  +              N -> Top0;
  +              S when S < N -> Top0 ++ lists:duplicate(N - S, '@')
  +          end,
  +    split_n_times(N, Rest, [Top|Acc]).
   
   %% http://erlang.org/pipermail/erlang-questions/2012-October/069856.html
   transpose ([[X|Xs] | Xss]) ->
  
positive.code:                       discover_urls("\\s\"'();,", Contents);
                    ".gitmodules" ->
                        discover_urls("\\s=",       Contents)
                     ++ discover_urls("\\s\"", "@", Contents);
                    _ ->  %% "rebar.config"++_ ->%%FIXME maybe
                        discover_urls("\\s\"",      Contents)
                     ++ discover_urls("\\s\"", "@", Contents)
                end
        end, Files).
  
  discover_urls (Seps, Bin) ->
      discover_urls (Seps, "://", Bin).
  discover_urls (Seps, Mid, Bin) ->
      RegExp = [ "[",Seps,"]([^", Seps, "]+", Mid, "[^", Seps, "]+)[",Seps,"]" ],
      case re:run(Bin, lists:flatten(RegExp),
                  [{capture,all_but_first,list}, global]) of
  
negative.code:                     Text -> Text
                  end || Header <- Headers0],
      Body = [[case Rev of
                   '@' -> "";
                   _ -> list_rev(Dir, Rev)
               end || Rev <- Revs]
              || Revs <- Body0],
  