| 
									
										
										
										
											2016-11-15 16:56:29 +01:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-07 16:16:51 +02:00
										 |  |  | module StatusesHelper | 
					
						
							| 
									
										
										
										
											2017-08-30 10:23:43 +02:00
										 |  |  |   EMBEDDED_CONTROLLER = 'statuses' | 
					
						
							| 
									
										
										
										
											2017-06-08 20:24:28 +09:00
										 |  |  |   EMBEDDED_ACTION = 'embed' | 
					
						
							| 
									
										
										
										
											2017-04-23 00:05:52 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-28 19:25:33 +02:00
										 |  |  |   def link_to_more(url) | 
					
						
							|  |  |  |     link_to t('statuses.show_more'), url, class: 'load-more load-gap' | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def nothing_here(extra_classes = '') | 
					
						
							|  |  |  |     content_tag(:div, class: "nothing-here #{extra_classes}") do | 
					
						
							|  |  |  |       t('accounts.nothing_here') | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-18 20:33:07 +01:00
										 |  |  |   def media_summary(status) | 
					
						
							|  |  |  |     attachments = { image: 0, video: 0 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     status.media_attachments.each do |media| | 
					
						
							|  |  |  |       if media.video? | 
					
						
							|  |  |  |         attachments[:video] += 1
 | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         attachments[:image] += 1
 | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 02:10:02 +02:00
										 |  |  |     text = attachments.to_a.reject { |_, value| value.zero? }.map { |key, value| I18n.t("statuses.attached.#{key}", count: value) }.join(' · ') | 
					
						
							| 
									
										
										
										
											2018-03-18 20:33:07 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return if text.blank? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 02:10:02 +02:00
										 |  |  |     I18n.t('statuses.attached.description', attached: text) | 
					
						
							| 
									
										
										
										
											2018-03-18 20:33:07 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def status_text_summary(status) | 
					
						
							|  |  |  |     return if status.spoiler_text.blank? | 
					
						
							| 
									
										
										
										
											2019-07-07 16:16:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 02:10:02 +02:00
										 |  |  |     I18n.t('statuses.content_warning', warning: status.spoiler_text) | 
					
						
							| 
									
										
										
										
											2018-03-18 20:33:07 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-05 03:51:18 +01:00
										 |  |  |   def poll_summary(status) | 
					
						
							| 
									
										
										
										
											2019-03-28 04:44:59 +01:00
										 |  |  |     return unless status.preloadable_poll | 
					
						
							| 
									
										
										
										
											2019-07-07 16:16:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-28 04:44:59 +01:00
										 |  |  |     status.preloadable_poll.options.map { |o| "[ ] #{o}" }.join("\n") | 
					
						
							| 
									
										
										
										
											2019-03-05 03:51:18 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-18 20:33:07 +01:00
										 |  |  |   def status_description(status) | 
					
						
							|  |  |  |     components = [[media_summary(status), status_text_summary(status)].reject(&:blank?).join(' · ')] | 
					
						
							| 
									
										
										
										
											2019-03-05 03:51:18 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if status.spoiler_text.blank? | 
					
						
							|  |  |  |       components << status.text | 
					
						
							|  |  |  |       components << poll_summary(status) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-18 20:33:07 +01:00
										 |  |  |     components.reject(&:blank?).join("\n\n") | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-12 10:12:42 -04:00
										 |  |  |   def stream_link_target | 
					
						
							|  |  |  |     embedded_view? ? '_blank' : nil | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-12 14:04:33 -04:00
										 |  |  |   def style_classes(status, is_predecessor, is_successor, include_threads) | 
					
						
							| 
									
										
										
										
											2016-02-28 14:02:53 +01:00
										 |  |  |     classes = ['entry'] | 
					
						
							| 
									
										
										
										
											2017-04-12 14:04:33 -04:00
										 |  |  |     classes << 'entry-predecessor' if is_predecessor | 
					
						
							|  |  |  |     classes << 'entry-reblog' if status.reblog? | 
					
						
							|  |  |  |     classes << 'entry-successor' if is_successor | 
					
						
							|  |  |  |     classes << 'entry-center' if include_threads | 
					
						
							| 
									
										
										
										
											2016-02-28 14:02:53 +01:00
										 |  |  |     classes.join(' ') | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-12 14:04:33 -04:00
										 |  |  |   def microformats_classes(status, is_direct_parent, is_direct_child) | 
					
						
							|  |  |  |     classes = [] | 
					
						
							|  |  |  |     classes << 'p-in-reply-to' if is_direct_parent | 
					
						
							|  |  |  |     classes << 'p-repost-of' if status.reblog? && is_direct_parent | 
					
						
							|  |  |  |     classes << 'p-comment' if is_direct_child | 
					
						
							|  |  |  |     classes.join(' ') | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def microformats_h_class(status, is_predecessor, is_successor, include_threads) | 
					
						
							| 
									
										
										
										
											2017-04-23 00:04:32 -04:00
										 |  |  |     if is_predecessor || status.reblog? || is_successor | 
					
						
							|  |  |  |       'h-cite' | 
					
						
							|  |  |  |     elsif include_threads | 
					
						
							|  |  |  |       '' | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       'h-entry' | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-04-12 14:04:33 -04:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-10 15:06:50 +02:00
										 |  |  |   def rtl_status?(status) | 
					
						
							|  |  |  |     status.local? ? rtl?(status.text) : rtl?(strip_tags(status.text)) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-28 01:52:31 +01:00
										 |  |  |   def rtl?(text) | 
					
						
							| 
									
										
										
										
											2017-06-10 15:06:50 +02:00
										 |  |  |     text = simplified_text(text) | 
					
						
							| 
									
										
										
										
											2017-06-21 01:45:09 +09:00
										 |  |  |     rtl_words = text.scan(/[\p{Hebrew}\p{Arabic}\p{Syriac}\p{Thaana}\p{Nko}]+/m) | 
					
						
							| 
									
										
										
										
											2017-02-28 01:52:31 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-21 01:45:09 +09:00
										 |  |  |     if rtl_words.present? | 
					
						
							| 
									
										
										
										
											2017-06-10 15:06:50 +02:00
										 |  |  |       total_size = text.size.to_f | 
					
						
							| 
									
										
										
										
											2017-06-21 01:45:09 +09:00
										 |  |  |       rtl_size(rtl_words) / total_size > 0.3
 | 
					
						
							| 
									
										
										
										
											2017-04-21 18:13:37 -04:00
										 |  |  |     else | 
					
						
							|  |  |  |       false | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-02-28 01:52:31 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-04-12 10:12:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-20 02:28:48 +02:00
										 |  |  |   def fa_visibility_icon(status) | 
					
						
							|  |  |  |     case status.visibility | 
					
						
							|  |  |  |     when 'public' | 
					
						
							|  |  |  |       fa_icon 'globe fw' | 
					
						
							|  |  |  |     when 'unlisted' | 
					
						
							| 
									
										
										
										
											2019-01-31 07:45:15 -05:00
										 |  |  |       fa_icon 'unlock fw' | 
					
						
							| 
									
										
										
										
											2018-04-20 02:28:48 +02:00
										 |  |  |     when 'private' | 
					
						
							|  |  |  |       fa_icon 'lock fw' | 
					
						
							|  |  |  |     when 'direct' | 
					
						
							|  |  |  |       fa_icon 'envelope fw' | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-12 10:12:42 -04:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-10 15:06:50 +02:00
										 |  |  |   def simplified_text(text) | 
					
						
							|  |  |  |     text.dup.tap do |new_text| | 
					
						
							|  |  |  |       URI.extract(new_text).each do |url| | 
					
						
							|  |  |  |         new_text.gsub!(url, '') | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       new_text.gsub!(Account::MENTION_RE, '') | 
					
						
							|  |  |  |       new_text.gsub!(Tag::HASHTAG_RE, '') | 
					
						
							|  |  |  |       new_text.gsub!(/\s+/, '') | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-21 01:45:09 +09:00
										 |  |  |   def rtl_size(words) | 
					
						
							|  |  |  |     words.reduce(0) { |acc, elem| acc + elem.size }.to_f | 
					
						
							| 
									
										
										
										
											2017-04-21 18:13:37 -04:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-12 10:12:42 -04:00
										 |  |  |   def embedded_view? | 
					
						
							| 
									
										
										
										
											2017-04-23 00:05:52 -04:00
										 |  |  |     params[:controller] == EMBEDDED_CONTROLLER && params[:action] == EMBEDDED_ACTION | 
					
						
							| 
									
										
										
										
											2017-04-12 10:12:42 -04:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-02-22 16:00:20 +01:00
										 |  |  | end |