anchor.diff:  
   %% @doc Loosely tokenizes and generates parse trees for HTML 4.
   -module(mochiweb_html).
  --export([tokens/1, parse/1, parse_tokens/1, test/0]).
  +-export([tokens/1, parse/1, parse_tokens/1, to_tokens/1, escape/1,
  +         escape_attr/1, to_html/1, test/0]).
   
   % This is a macro to placate syntax highlighters..
   -define(QUOTE, $\").
  +-define(SQUOTE, $\').
   -define(ADV_COL(S, N), S#decoder{column=N+S#decoder.column}).
   -define(INC_COL(S), S#decoder{column=1+S#decoder.column}).
   -define(INC_LINE(S), S#decoder{column=1, line=1+S#decoder.line}).
  
positive.code: find_gt(">" ++ Rest, S, HasSlash) ->
      {Rest, ?INC_COL(S), HasSlash};
  find_gt([$/ | Rest], S, _) ->
      {Rest, ?INC_COL(S), true};
  find_gt([C | Rest], S, HasSlash) ->
      find_gt(Rest, ?INC_CHAR(S, C), HasSlash).
  
  
negative.code: tokenize_word_or_literal([C | _], S) when ?IS_WHITESPACE(C) ->
      {error, {whitespace, [C], S}};
  tokenize_word_or_literal([?QUOTE | Rest], S) ->
      tokenize_word(Rest, ?INC_COL(S), ?QUOTE, []);
  tokenize_word_or_literal([?SQUOTE | Rest], S) ->
      tokenize_word(Rest, ?INC_COL(S), ?SQUOTE, []);
  tokenize_word_or_literal(Rest, S) ->
      tokenize_literal(Rest, S, []).
      
  tokenize_word([], S, _Quote, Acc) ->
      {lists:reverse(Acc), [], S};
  tokenize_word([Quote | Rest], S, Quote, Acc) ->
      {lists:reverse(Acc), Rest, ?INC_COL(S)};
  tokenize_word([$& | Rest], S, Quote, Acc) ->
      {{data, Data, false}, S1, Rest1} = tokenize_charref(Rest, ?INC_COL(S), []),
      tokenize_word(Rest1, S1, Quote, lists:reverse(Data, Acc));
  tokenize_word([C | Rest], S, Quote, Acc) ->
      tokenize_word(Rest, ?INC_CHAR(S, C), Quote, [C | Acc]).
  
  tokenize_literal([], S, Acc) ->
      {lists:reverse(Acc), [], S};
  