mirror of
https://github.com/discourse/discourse.git
synced 2025-02-17 07:23:15 +08:00
FEATURE: Treat emoji or similar characters as one (#12482)
Long messages consisting only of emojis, dots or commas used to be valid because character-wise they were over the limit.
This commit is contained in:
parent
c449bf77b3
commit
e7fb45cc29
|
@ -3,14 +3,15 @@
|
|||
class StrippedLengthValidator < ActiveModel::EachValidator
|
||||
def self.validate(record, attribute, value, range)
|
||||
if !value.nil?
|
||||
html_comments_regexp = /<!--(.*?)-->/
|
||||
stripped_length = value.gsub(html_comments_regexp, '')
|
||||
stripped_length = stripped_length.strip.length
|
||||
value = value.dup
|
||||
value.gsub!(/<!--(.*?)-->/, '') # strip HTML comments
|
||||
value.gsub!(/:\w+(:\w+)?:/, "X") # replace emojis with a single character
|
||||
value.gsub!(/\.{2,}/, '…') # replace multiple ... with …
|
||||
value.gsub!(/\,{2,}/, ',') # replace multiple ,,, with ,
|
||||
value.strip!
|
||||
|
||||
record.errors.add attribute, (I18n.t('errors.messages.too_short', count: range.begin)) unless
|
||||
stripped_length >= range.begin
|
||||
record.errors.add attribute, (I18n.t('errors.messages.too_long_validation', max: range.end, length: stripped_length)) unless
|
||||
stripped_length <= range.end
|
||||
record.errors.add attribute, (I18n.t('errors.messages.too_short', count: range.begin)) if value.length < range.begin
|
||||
record.errors.add attribute, (I18n.t('errors.messages.too_long_validation', max: range.end, length: value.length)) if value.length > range.end
|
||||
else
|
||||
record.errors.add attribute, (I18n.t('errors.messages.blank'))
|
||||
end
|
||||
|
|
|
@ -52,6 +52,33 @@ describe PostValidator do
|
|||
expect(post.errors.count).to eq(1)
|
||||
end
|
||||
|
||||
it "counts emoji as a single character" do
|
||||
post.raw = ":smiling_face_with_three_hearts:" * (SiteSetting.min_post_length - 1)
|
||||
validator.stripped_length(post)
|
||||
expect(post.errors.count).to eq(1)
|
||||
|
||||
post = build(:post, topic: topic)
|
||||
post.raw = ":smiling_face_with_three_hearts:" * SiteSetting.min_post_length
|
||||
validator.stripped_length(post)
|
||||
expect(post.errors.count).to eq(0)
|
||||
end
|
||||
|
||||
it "counts multiple characters as a single character" do
|
||||
post.raw = "." * SiteSetting.min_post_length
|
||||
validator.stripped_length(post)
|
||||
expect(post.errors.count).to eq(1)
|
||||
|
||||
post = build(:post, topic: topic)
|
||||
post.raw = "," * SiteSetting.min_post_length
|
||||
validator.stripped_length(post)
|
||||
expect(post.errors.count).to eq(1)
|
||||
|
||||
post = build(:post, topic: topic)
|
||||
post.raw = "<!-- #{'very long comment' * SiteSetting.min_post_length} -->"
|
||||
validator.stripped_length(post)
|
||||
expect(post.errors.count).to eq(1)
|
||||
end
|
||||
|
||||
it "adds no error for long raw" do
|
||||
post.raw = "this is a long topic body testing 123"
|
||||
validator.stripped_length(post)
|
||||
|
|
Loading…
Reference in New Issue
Block a user