anchor.diff:          end,
           Props).
   
  -escape_props1(_K, V, _Options) when is_float(V); is_integer(V); is_atom(V) ->
  +escape_props1(_K, null, _Options) ->
  +    null;
  +escape_props1(_K, undefined, _Options) ->
  +    undefined;
  +escape_props1(_K, V, _Options) when is_number(V); is_boolean(V) ->
       V;
  +escape_props1(K, V, Options) when is_atom(V) ->
  +    escape_props1(K, atom_to_binary(V, utf8), Options);
   escape_props1(<<"body", _/binary>>, V, Options) ->
       sanitize(V, Options);
   escape_props1(<<"summary">>, Summary, _Options) ->
  
positive.code:     escape_props_check(V, Options);
  escape_props_check1(K, V, Options) ->
      Type = lists:last(binary:split(K, <<"_">>, [global])),
      case Type of
          <<"html">> -> sanitize(V, Options);
          <<"uri">> -> escape_value(sanitize_uri(unescape(V)));
          <<"url">> -> escape_value(sanitize_uri(unescape(V)));
          _ -> escape_value_check(V)
      end.
  
  escape_value_check({trans, _Ts} = Tr) ->
      escape_check(Tr);
  escape_value_check(V) when is_list(V) ->
      try
          escape_check(iolist_to_binary(V))
      catch _:_ ->
          V
      end;
  
negative.code:     escape_props(V, Options);
  escape_props1(K, V, Options) ->
      Type = lists:last(binary:split(K, <<"_">>, [global])),
      sanitize_type(Type, V, Options).
  
  sanitize_type(<<"html">>, V, Options) -> sanitize(V, Options);
  sanitize_type(<<"uri">>, V, _Options) -> escape_value(sanitize_uri(V));
  sanitize_type(<<"url">>, V, _Options) -> escape_value(sanitize_uri(V));
  sanitize_type(<<"list">>, V, Options) -> sanitize_list(V, Options);
  sanitize_type(<<"int">>, V, _Options) -> sanitize_int(V);
  sanitize_type(_, V, _Options) -> escape_value(V).
  
  sanitize_list(L, Options) when is_list(L) ->
      lists:map(
          fun
              ({P, V}) ->
                  P1 = z_convert:to_binary(P),
                  V1 = escape_props1(P1, V, Options),
                  {P1, V1};
              (V) ->
                  escape_value(V)
          end,
          L);
  sanitize_list(Map, Options) when is_map(Map) ->
      sanitize_list(maps:to_list(Map), Options);
  sanitize_list(undefined, _Options) ->
      undefined;
  sanitize_list(V, Options) ->
      sanitize_list([V], Options).
  
  sanitize_int(V) ->
      try
          z_convert:to_integer(V)
      catch
          _:_ -> undefined
      end.
  
  escape_value(undefined) -> undefined;
  escape_value(null) -> null;
  escape_value(V) when is_boolean(V) -> V;
  escape_value(V) when is_number(V) -> V;
  escape_value(V) when is_atom(V) ->
      escape( atom_to_binary(V, utf8) );
  escape_value({trans, _Ts} = Tr) ->
      escape(Tr);
  escape_value(V) when is_list(V) ->
      try
          escape_value(unicode:characters_to_binary(V))
      catch _:_ ->
          V
      end;
  