# frozen_string_literal: true
module ActiveCleaner
# = Utf8mb3Cleaner
#
# Cleans a string by removes all 4-bytes encoded chars in UTF8 strings that mess with
# the +utf8mb3+ (also simply known as +utf8+) encoding in MySQL.
#
# Useful for user input that may contain iOS6 emojis for example (as they are only compatible
# with +utf8mb4+ and cause string truncation, at best).
#
# It turns "String with emoticon 😀" into "String with emoticon".
#
# == Options
#
# [:nilify]
# Whether or not set the field to +nil+ when the field was or is cleaned to "".
# Default to +false+.
#
# == Example
#
# class Comment
# include ActiveCleaner
#
# clean :body, as: :utf8mb3
# end
#
# comment = Comment.new(body: "Nice! 😀")
# comment.save
# comment.body
# # => "Nice!"
class Utf8mb3Cleaner < BaseCleaner
# Cleans the value.
def clean_value(old_value, _record = nil)
case old_value
when String
old_value.each_char.select { |char| char.bytesize < 4 }.join
else
old_value
end
end
end
end