anchor.diff:  
   %% @spec to_tokens(html_node()) -> [html_token()]
   %% @doc Convert a html_node() tree to a list of tokens.
  +to_tokens({Tag0}) ->
  +    to_tokens({Tag0, [], []});
  +to_tokens(T={'=', _}) ->
  +    [T];
  +to_tokens(T={doctype, _}) ->
  +    [T];
  +to_tokens(T={comment, _}) ->
  +    [T];
  +to_tokens({Tag0, Acc}) ->
  +    to_tokens({Tag0, [], Acc});
   to_tokens({Tag0, Attrs, Acc}) ->
       Tag = to_tag(Tag0),
       to_tokens([{Tag, Acc}], [{start_tag, Tag, Attrs, is_singleton(Tag)}]).
   
   %% @spec to_html([html_token()] | html_node()) -> iolist()
   %% @doc Convert a list of html_token() to a HTML document.
  -to_html(Node={_Tag, _Attrs, _Acc}) ->
  +to_html(Node) when is_tuple(Node) ->
       to_html(to_tokens(Node));
   to_html(Tokens) when is_list(Tokens) ->
       to_html(Tokens, []).
  
positive.code: to_tokens([{Tag0, [{T0} | R1]} | Rest], Acc) ->
      %% Allow {br}
      to_tokens([{Tag0, [{T0, [], []} | R1]} | Rest], Acc);
  to_tokens([{Tag0, [{T0, C0} | R1]} | Rest], Acc) ->
      %% Allow {p, ["content"]}
      to_tokens([{Tag0, [{T0, [], C0} | R1]} | Rest], Acc);
  to_tokens([{Tag0, [{T0, A1, C0} | R1]} | Rest], Acc) when is_binary(C0) ->
      %% Allow {"p", [{"class", "foo"}], <<"content">>}
  
negative.code: to_html([{end_tag, Tag} | Rest], Acc) ->
      to_html(Rest, [["</" ++ Tag, ">"] | Acc]).
  
  doctype_to_html([], Acc) ->
      lists:reverse(Acc);
  doctype_to_html([Word | Rest], Acc) ->
      case lists:all(fun (C) -> ?IS_LITERAL_SAFE(C) end, Word) of
          true ->
              doctype_to_html(Rest, [" " ++ Word | Acc]);
          false ->
              doctype_to_html(Rest, [[" \"" ++ escape_attr(Word), ?QUOTE] | Acc])
      end.
  
  attrs_to_html([], Acc) ->
      lists:reverse(Acc);
  attrs_to_html([{K, V} | Rest], Acc) ->
  