anchor.diff:      binary().
   
   normalize(Text, Opts) ->
  -    String = norm(nklib_util:to_list(Text), Opts, []),
  +    NoLower = maps:get(not_to_lowercase, Opts, false),
  +    String = norm(nklib_util:to_list(Text), Opts, NoLower, []),
       list_to_binary(String).
   
   
   %% @private
  -norm([], _Opts, Acc) ->
  +norm([], _Opts, _NoLower, Acc) ->
       lists:reverse(string:strip(Acc));
   
  -norm([32|T], Opts, Acc) ->
  +norm([32|T], Opts, NoLower, Acc) ->
       case maps:get(space, Opts, allowed) of
           allowed ->
  -            norm(T, Opts, [32|Acc]);
  +            norm(T, Opts, NoLower, [32|Acc]);
           skip ->
  -            norm(T, Opts, Acc);
  +            norm(T, Opts, NoLower, Acc);
           Char when is_integer(Char) ->
  -            norm(T, Opts, [Char|Acc])
  +            norm(T, Opts, NoLower, [Char|Acc])
       end;
   
  -%%norm([$_|T], Opts, Acc) ->
  -%%    case maps:get(underscore, Opts, $-) of
  -%%        allowed ->
  -%%            norm(T, Opts, [$_|Acc]);
  -%%        skip ->
  -%%            norm(T, Opts, Acc);
  -%%        Char when is_integer(Char) ->
  -%%            norm(T, Opts, [Char|Acc])
  -%%    end;
  -
  -norm([H|T], Opts, Acc) when H >= $0, H =< $9 ->
  -    norm(T, Opts, [H|Acc]);
  -
  -norm([H|T], Opts, Acc) when H >= $a, H =< $z ->
  -    norm(T, Opts, [H|Acc]);
  -
  -norm([H|T], Opts, Acc) when H >= $A, H =< $Z ->
  -    norm(T, Opts, [H+32|Acc]);
  +norm([H|T], Opts, NoLower, Acc) when H >= $0, H =< $9 ->
  +    norm(T, Opts, NoLower, [H|Acc]);
  +
  +norm([H|T], Opts, NoLower, Acc) when H >= $a, H =< $z ->
  +    norm(T, Opts, NoLower, [H|Acc]);
  +
  +norm([H|T], Opts, false, Acc) when H >= $A, H =< $Z ->
  +    norm(T, Opts, false, [H+32|Acc]);
  +
  +norm([H|T], Opts, true, Acc) when H >= $A, H =< $Z ->
  +    norm(T, Opts, true, [H|Acc]);
   
   %% UTF-8
  -norm([16#c3, U|T], Opts, Acc) when U >= 16#80, U =< 16#bc->
  +% https://www.utf8-chartable.de/unicode-utf8-table.plnorm([16#c3, U|T], Opts, false, Acc) when U >= 16#80, U =< 16#bc->
  +norm([16#c3, U|T], Opts, false, Acc) when U >= 16#80, U =< 16#bc->
       L = if
           U >= 16#80, U =< 16#86 -> $a;
           U == 16#87 -> $c;
  
positive.code:     end,
      case L of
          skip ->
              norm(T, Opts, Acc);
          keep ->
              norm(T, Opts, [H|Acc]);
          _ ->
              norm(T, Opts, [L|Acc])
      end;
  
  norm([Char|T], Opts, Acc) ->
      Allowed = maps:get(allowed, Opts, []),
      case lists:member(Char, Allowed) of
          true ->
              norm(T, Opts, [Char|Acc]);
          false ->
              case norm_unrecognized(Opts) of
                  skip ->
                      norm(T, Opts, Acc);
                  keep ->
                      norm(T, Opts, [Char|Acc]);
                  New ->
                      norm(T, Opts, [New|Acc])
              end
      end.
  
  
negative.code:     [binary()].
  
  normalize_words(Text, Opts) ->
      NoLower = maps:get(not_to_lowercase, Opts, false),
      String = norm(nklib_util:to_list(Text), Opts, NoLower, []),
      Chars = maps:get(split, Opts, [32, $., $/, $-, $_, $,, $;, $:]),
      norm_split(String, Chars, false, [], []).
  
  