Module: Olyx::Guardrails::Text::Normalizer

Defined in:
lib/olyx/guardrails/text/normalizer.rb

Overview

Produces a bounded comparison form for common Unicode evasions.

Constant Summary collapse

ZERO_WIDTH =
/[\u200B-\u200D\u2060\uFEFF]/
HOMOGLYPHS =
{
  'Α' => 'A', 'А' => 'A', 'Β' => 'B', 'В' => 'B', 'Ε' => 'E', 'Е' => 'E',
  'Η' => 'H', 'Н' => 'H', 'Ι' => 'I', 'І' => 'I', 'Κ' => 'K', 'К' => 'K',
  'Μ' => 'M', 'М' => 'M', 'Ν' => 'N', 'О' => 'O', 'Ρ' => 'P', 'Р' => 'P',
  'С' => 'C', 'Τ' => 'T', 'Т' => 'T', 'Χ' => 'X', 'Х' => 'X',
  'а' => 'a', 'е' => 'e', 'і' => 'i', 'о' => 'o', 'р' => 'p', 'с' => 'c',
  'х' => 'x', 'у' => 'y'
}.freeze

Class Method Summary collapse

Class Method Details

.call(value) ⇒ Object



20
21
22
# File 'lib/olyx/guardrails/text/normalizer.rb', line 20

def call(value)
  value.to_s.each_char.filter_map { |character| normalize_character(character) }.join
end

.normalize_character(character) ⇒ Object



24
25
26
27
28
29
30
31
# File 'lib/olyx/guardrails/text/normalizer.rb', line 24

def normalize_character(character)
  return if character.match?(ZERO_WIDTH)

  normalized = character.unicode_normalize(:nfkc)
  HOMOGLYPHS.fetch(normalized, normalized)
rescue Encoding::CompatibilityError, ArgumentError
  character
end