Files

75 lines
1.9 KiB
Ruby
Raw Permalink Normal View History

2024-01-15 01:45:26 +02:00
# frozen_string_literal: true
module TextUtils
RTL_REGEXP = /[\p{Hebrew}\p{Arabic}]/
2025-10-04 18:33:37 +03:00
MASK_REGEXP = /[^\s\-_\[\]()+?.,]/
2025-03-03 00:14:14 +02:00
MASK_SYMBOL = 'X'
2024-01-15 01:45:26 +02:00
2025-06-05 13:16:55 +03:00
TRANSLITERATIONS =
I18n::Backend::Transliterator::HashTransliterator::DEFAULT_APPROXIMATIONS.reject { |_, v| v.length > 1 }
TRANSLITERATION_REGEXP = Regexp.union(TRANSLITERATIONS.keys)
2024-01-15 01:45:26 +02:00
module_function
2024-03-15 13:44:16 +02:00
def rtl?(text)
return false if text.blank?
text.match?(TextUtils::RTL_REGEXP)
rescue Encoding::CompatibilityError
false
end
2025-06-05 13:16:55 +03:00
def transliterate(text)
text.to_s.gsub(TRANSLITERATION_REGEXP) { |e| TRANSLITERATIONS[e] }
end
2025-12-08 09:32:03 +02:00
def mask_value(text, unmask_size = 0, mask_symbol = MASK_SYMBOL)
2025-03-05 18:07:38 +02:00
if unmask_size.is_a?(Numeric) && !unmask_size.zero? && unmask_size.abs < text.length
2025-03-04 00:12:56 +02:00
if unmask_size.negative?
[
text.first(text.length + unmask_size).gsub(MASK_REGEXP, MASK_SYMBOL),
text.last(-unmask_size)
].join
elsif unmask_size.positive?
[
text.first(unmask_size),
2025-12-08 09:32:03 +02:00
text.last(text.length - unmask_size).gsub(MASK_REGEXP, mask_symbol)
2025-03-04 00:12:56 +02:00
].join
end
else
2025-12-08 09:32:03 +02:00
text.to_s.gsub(MASK_REGEXP, mask_symbol)
2025-03-04 00:12:56 +02:00
end
2025-03-03 00:14:14 +02:00
end
2025-12-08 09:32:03 +02:00
def mask_email(email, unmask_size = 2)
return email if email.exclude?('@')
local, domain = email.split('@', 2)
return email if local.blank? || domain.blank?
masked_local = mask_value(local, unmask_size, '*')
domain_parts = domain.split('.')
if domain_parts.blank? || domain_parts[0].blank?
masked_domain = mask_value(domain, 1, '*')
else
domain_parts[0] = mask_value(domain_parts[0], 1, '*')
masked_domain = domain_parts.join('.')
end
"#{masked_local}@#{masked_domain}"
end
2024-01-15 01:45:26 +02:00
def maybe_rtl_reverse(text)
if text.match?(RTL_REGEXP)
TwitterCldr::Shared::Bidi
.from_string(ArabicLetterConnector.transform(text), direction: :RTL)
.reorder_visually!.to_s
else
text
end
end
end