class PostPresenter < Presenter attr_reader :pool, :next_post_in_pool delegate :tag_list_html, :split_tag_list_html, :inline_tag_list_html, :split_inline_tag_list_html, to: :tag_set_presenter def self.preview(post, options = {}) if post.nil? return "none".html_safe end if !options[:show_deleted] && post.is_deleted? && options[:tags] !~ /status:(?:all|any|deleted|banned)/ && !options[:raw] return "" end if !post.visible? return "" end if post.is_ugoira? && !post.has_ugoira_webm? # ugoira preview gen is async so dont render it immediately return "" end path = options[:path_prefix] || "/posts" html = %{
} if options[:tags].present? && !CurrentUser.is_anonymous? tag_param = "?tags=#{CGI::escape(options[:tags])}" elsif options[:pool_id] || options[:pool] tag_param = "?pool_id=#{CGI::escape((options[:pool_id] || options[:pool].id).to_s)}" elsif options[:favgroup_id] || options[:favgroup] tag_param = "?favgroup_id=#{CGI::escape((options[:favgroup_id] || options[:favgroup].id).to_s)}" else tag_param = nil end html << %{} if options[:show_cropped] && post.has_cropped? src = post.cropped_file_url else src = post.preview_file_url end tooltip = "#{post.tag_string} rating:#{post.rating} score:#{post.score}" html << %{#{h(post.tag_string)}} html << %{} if options[:pool] html << %{

} html << %{} html << h(options[:pool].pretty_name.truncate(80)) html << %{} html << %{

} end if options[:similarity] html << %{

} html << "Similarity: #{options[:similarity].round}%" html << %{

} end if options[:size] html << %{

} html << post.file_size.to_s(:human_size) html << " (#{post.image_width}x#{post.image_height})" html << %{

} end html << %{
} html.html_safe end def self.preview_class(post, description = nil, options = {}) klass = "post-preview" klass << " large-cropped" if post.has_cropped? && options[:show_cropped] klass << " pooled" if description klass << " post-status-pending" if post.is_pending? klass << " post-status-flagged" if post.is_flagged? klass << " post-status-deleted" if post.is_deleted? klass << " post-status-has-parent" if post.parent_id klass << " post-status-has-children" if post.has_visible_children? klass end def self.data_attributes(post) attributes = %{ data-id="#{post.id}" data-has-sound="#{post.has_tag?('video_with_sound|flash_with_sound')}" data-tags="#{h(post.tag_string)}" data-pools="#{post.pool_string}" data-approver-id="#{post.approver_id}" data-rating="#{post.rating}" data-width="#{post.image_width}" data-height="#{post.image_height}" data-flags="#{post.status_flags}" data-parent-id="#{post.parent_id}" data-has-children="#{post.has_children?}" data-score="#{post.score}" data-views="#{post.view_count}" data-fav-count="#{post.fav_count}" data-pixiv-id="#{post.pixiv_id}" data-file-ext="#{post.file_ext}" data-source="#{h(post.source)}" data-top-tagger="#{post.keeper_id}" data-uploader-id="#{post.uploader_id}" data-normalized-source="#{h(post.normalized_source)}" data-is-favorited="#{post.favorited_by?(CurrentUser.user.id)}" } if CurrentUser.is_moderator? attributes += %{ data-uploader="#{h(post.uploader_name)}" } end if post.visible? attributes += %{ data-md5="#{post.md5}" data-file-url="#{post.file_url}" data-large-file-url="#{post.large_file_url}" data-preview-file-url="#{post.preview_file_url}" } end attributes.html_safe end def initialize(post) @post = post end def tag_set_presenter @tag_set_presenter ||= TagSetPresenter.new(@post.tag_array) end def preview_html PostPresenter.preview(@post) end def humanized_tag_string @post.tag_string.split(/ /).slice(0, 25).join(", ").tr("_", " ") end def humanized_essential_tag_string @post.humanized_essential_tag_string end def filename_for_download "#{humanized_essential_tag_string} - #{@post.md5}.#{@post.file_ext}" end def categorized_tag_groups string = [] TagCategory.categorized_list.each do |category| if @post.typed_tags(category).any? string << @post.typed_tags(category).join(" ") end end string end def categorized_tag_string categorized_tag_groups.join(" \n") end def safe_mode_message(template) html = ["This image is unavailable on safe mode (#{Danbooru.config.app_name}). Go to "] html << template.link_to("Danbooru", "https://danbooru.donmai.us") # XXX don't hardcode. html << " or disable safe mode to view (" html << template.link_to("learn more", template.wiki_pages_path(title: "help:user_settings")) html << ")." html.join.html_safe end def image_html(template) return template.content_tag("p", "The artist requested removal of this image") if @post.banblocked? return template.content_tag("p", template.link_to("You need a gold account to see this image.", template.new_user_upgrade_path)) if @post.levelblocked? return template.content_tag("p", safe_mode_message(template)) if @post.safeblocked? if @post.is_flash? template.render("posts/partials/show/flash", :post => @post) elsif @post.is_video? template.render("posts/partials/show/video", :post => @post) elsif @post.is_ugoira? template.render("posts/partials/show/ugoira", :post => @post) elsif !@post.is_image? template.render("posts/partials/show/download", :post => @post) elsif @post.is_image? template.render("posts/partials/show/image", :post => @post) end end def has_nav_links?(template) has_sequential_navigation?(template.params) || @post.pools.undeleted.any? || @post.favorite_groups(active_id=template.params[:favgroup_id]).any? end def has_sequential_navigation?(params) return false if params[:tags] =~ /(?:^|\s)(?:order|ordfav|ordpool):/i return false if params[:pool_id].present? || params[:favgroup_id].present? return CurrentUser.user.enable_sequential_post_navigation end def post_footer_for_pool_html(template) if template.params[:pool_id] pool = Pool.where(:id => template.params[:pool_id]).first return if pool.nil? return if pool.neighbors(@post).next.nil? template.link_to("Next in #{pool.pretty_name}", template.post_path(pool.neighbors(@post).next)) else nil end end def pool_html(template) html = ["" html.join("\n").html_safe end def pool_link_html(template, pool, options = {}) pool_html = [%{" pool_html end end