| 
									
										
										
										
											2019-01-05 07:16:46 +01:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class NoteLengthValidator < ActiveModel::EachValidator | 
					
						
							|  |  |  |   def validate_each(record, attribute, value) | 
					
						
							| 
									
										
										
										
											2021-03-01 04:59:13 +01:00
										 |  |  |     record.errors.add(attribute, :too_long, message: I18n.t('statuses.over_character_limit', max: options[:maximum]), count: options[:maximum]) if too_long?(value) | 
					
						
							| 
									
										
										
										
											2019-01-05 07:16:46 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def too_long?(value) | 
					
						
							|  |  |  |     countable_text(value).mb_chars.grapheme_length > options[:maximum] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def countable_text(value) | 
					
						
							|  |  |  |     return '' if value.nil? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     value.dup.tap do |new_text| | 
					
						
							| 
									
										
										
										
											2021-03-04 00:12:26 +01:00
										 |  |  |       new_text.gsub!(FetchLinkCardService::URL_PATTERN, StatusLengthValidator::URL_PLACEHOLDER) | 
					
						
							| 
									
										
										
										
											2019-01-05 07:16:46 +01:00
										 |  |  |       new_text.gsub!(Account::MENTION_RE, '@\2') | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |