anchor.diff:      {App,Mod,Marker}.
   
   read_link(_Line, {_App,"index",_}, _Cache) ->
  -    "index";
  +    #{type => "index", markers => [] };
   read_link(Line, {App,Mod,_}, Cache) ->
       case maps:find({App,Mod}, Cache) of
  -        {ok, #{ type := Type } } ->
  -            Type;
  +        {ok, Info } ->
  +            Info;
           error ->
               %% fail(Line, "Could not find: ~p~p~n~p~n",
               %%   [App,Mod,lists:sort(maps:keys(Cache))]),
  
positive.code:     put(top, ErlTop),
      put(exit_code, 0),
      CachedFiles = maps:from_list([{m2a,M2A}|Files]),
      [validate_links(File,CachedFiles) || File <- Files],
      erlang:halt(get(exit_code)).
  
  parse_file(Filename) ->
  %    io:format("Parse: ~p~n",[Filename]),
      case xmerl_sax_parser:file(Filename, [skip_external_dtd,
                                            {event_fun,fun handle_event/3},
                                            {event_state,#{ funcs => [],
                                                            datatypes => []}}]) of
          {ok, Res, _} ->
  %            [io:format("~p~n",[Res]) || maps:get(filename,Res) == {"erts","erl_tracer"}],
              {maps:get(filename,Res), maps:remove(filename,Res)}
      end.
  
  handle_event(startDocument, _Line, State) ->
  
negative.code:             halt(1)
      end.
  
  validate_type(_Line, "seeerl",#{ type := "erlref" }) ->
      ok;
  validate_type(_Line, "seemfa", #{ type := "erlref"}) ->
      ok;
  validate_type(_Line, "seetype", #{ type := "erlref"}) ->
      ok;
  validate_type(_Line, "seeguide", #{ type := "chapter"}) ->
      ok;
  validate_type(_Line, "seeguide", #{ type := "index"}) ->
      ok;
  validate_type(_Line, "seefile", #{ type := "fileref"}) ->
      ok;
  validate_type(_Line, "seeapp", #{ type := "appref"}) ->
      ok;
  validate_type(_Line, "seeapp", #{ type := "index"}) ->
      ok;
  validate_type(_Line, "seecom", #{ type := "comref"}) ->
      ok;
  validate_type(_Line, "seecref", #{ type := "cref"}) ->
      ok;
  validate_type(Line, From, #{ type := To }) ->
      fail(Line, "Invalid <~s> pointing to a <~s> file",[From,To]).
  
  validate_marker(_Line, {_,_,[]}, _) ->
      ok;
  validate_marker(Line, {_,_,Marker}, #{ filename := {App,Name}, markers := Markers }) ->
      case lists:any(fun(M) -> string:equal(Marker,M,true) end,Markers) of
          true ->
              ok;
          false ->
              StringMarkers = lists:join(", ",Markers),
              fail(Line, "Could not find marker <~s> in ~s:~s~n  Available: ~s",
                   [Marker,App,Name,StringMarkers])
      end.
  
  path2app(Path) ->
      case lists:reverse(string:lexemes(Path,"/")) of
  