anchor.diff:      mark_keywords(T, [{by_keyword, Pos, String}|Acc]);
   mark_keywords([{identifier, Pos, "with" = String}|T], Acc) ->
       mark_keywords(T, [{with_keyword, Pos, String}|Acc]);
  -% These must be succeeded by a close_tag
  +						% These must be succeeded by a close_tag
   mark_keywords([{identifier, Pos, "only" = String}, {close_tag, _, _} = CloseTag|T], Acc) ->
       mark_keywords(T, lists:reverse([{only_keyword, Pos, String}, CloseTag], Acc));
   mark_keywords([{identifier, Pos, "parsed" = String}, {close_tag, _, _} = CloseTag|T], Acc) ->
  
positive.code:     mark_keywords(T, lists:reverse([{opencomment_keyword, Pos, String}, CloseTag], Acc));
  mark_keywords([{identifier, Pos, "closecomment" = String}, {close_tag, _, _} = CloseTag|T], Acc) ->
      mark_keywords(T, lists:reverse([{closecomment_keyword, Pos, String}, CloseTag], Acc));
  % The rest must be preceded by an open_tag.
  % This allows variables to have the same names as tags.
  mark_keywords([{open_tag, _, _} = OpenToken, {identifier, Pos, "autoescape" = String}|T], Acc) ->
      mark_keywords(T, lists:reverse([OpenToken, {autoescape_keyword, Pos, String}], Acc));
  mark_keywords([{open_tag, _, _} = OpenToken, {identifier, Pos, "endautoescape" = String}|T], Acc) ->
  
negative.code: 
  scan("<!--{%" ++ T, Scanned, {Row, Column}, in_text) ->
      scan(T, [{open_tag, {Row, Column}, '<!--{%'} | Scanned], 
  	 {Row, Column + length("<!--{%")}, {in_code, "%}-->"});
  
  scan("{%" ++ T, Scanned, {Row, Column}, in_text) ->
      scan(T, [{open_tag, {Row, Column}, '{%'} | Scanned], 
  	 {Row, Column + length("{%")}, {in_code, "%}"});
  
  scan([_ | T], Scanned, {Row, Column}, {in_comment, Closer}) ->
      scan(T, Scanned, {Row, Column + 1}, {in_comment, Closer});
  