require "action_view"
require "htmlentities"
module Govspeak
class AttachmentPresenter
attr_reader :attachment
include ActionView::Helpers::TagHelper
include ActionView::Helpers::NumberHelper
include ActionView::Helpers::TextHelper
def initialize(attachment)
@attachment = attachment
end
def id
attachment[:id]
end
def url
attachment[:url]
end
def title
attachment[:title]
end
def file_extension
# Note: this is a separate parameter rather than being calculated from the
# filename because at the time of writing not all apps were using the effects
# of this field.
attachment[:file_extension]
end
def attachment_attributes
attributes = []
if file_extension == "html"
attributes << content_tag(:span, "HTML", class: "type")
elsif attachment[:external?]
attributes << content_tag(:span, url, class: "url")
else
attributes << content_tag(:span, humanized_content_type(file_extension), class: "type") if file_extension
attributes << content_tag(:span, number_to_human_size(attachment[:file_size]), class: "file-size") if attachment[:file_size]
attributes << content_tag(:span, pluralize(attachment[:number_of_pages], "page"), class: "page-length") if attachment[:number_of_pages]
end
attributes.join(", ").html_safe
end
MS_WORD_DOCUMENT_HUMANIZED_CONTENT_TYPE = "MS Word Document".freeze
MS_EXCEL_SPREADSHEET_HUMANIZED_CONTENT_TYPE = "MS Excel Spreadsheet".freeze
MS_POWERPOINT_PRESENTATION_HUMANIZED_CONTENT_TYPE = "MS Powerpoint Presentation".freeze
def file_abbr_tag(abbr, title)
content_tag(:abbr, abbr, title: title)
end
def humanized_content_type(file_extension)
file_extension_vs_humanized_content_type = {
"chm" => file_abbr_tag("CHM", "Microsoft Compiled HTML Help"),
"csv" => file_abbr_tag("CSV", "Comma-separated Values"),
"diff" => file_abbr_tag("DIFF", "Plain text differences"),
"doc" => MS_WORD_DOCUMENT_HUMANIZED_CONTENT_TYPE,
"docx" => MS_WORD_DOCUMENT_HUMANIZED_CONTENT_TYPE,
"dot" => file_abbr_tag("DOT", "MS Word Document Template"),
"dxf" => file_abbr_tag("DXF", "AutoCAD Drawing Exchange Format"),
"eps" => file_abbr_tag("EPS", "Encapsulated PostScript"),
"gif" => file_abbr_tag("GIF", "Graphics Interchange Format"),
"gml" => file_abbr_tag("GML", "Geography Markup Language"),
"html" => file_abbr_tag("HTML", "Hypertext Markup Language"),
"ics" => file_abbr_tag("ICS", "iCalendar file"),
"jpg" => "JPEG",
"odp" => file_abbr_tag("ODP", "OpenDocument Presentation"),
"ods" => file_abbr_tag("ODS", "OpenDocument Spreadsheet"),
"odt" => file_abbr_tag("ODT", "OpenDocument Text document"),
"pdf" => file_abbr_tag("PDF", "Portable Document Format"),
"png" => file_abbr_tag("PNG", "Portable Network Graphic"),
"ppt" => MS_POWERPOINT_PRESENTATION_HUMANIZED_CONTENT_TYPE,
"pptx" => MS_POWERPOINT_PRESENTATION_HUMANIZED_CONTENT_TYPE,
"ps" => file_abbr_tag("PS", "PostScript"),
"rdf" => file_abbr_tag("RDF", "Resource Description Framework"),
"rtf" => file_abbr_tag("RTF", "Rich Text Format"),
"sch" => file_abbr_tag("SCH", "XML based Schematic"),
"txt" => "Plain text",
"wsdl" => file_abbr_tag("WSDL", "Web Services Description Language"),
"xls" => MS_EXCEL_SPREADSHEET_HUMANIZED_CONTENT_TYPE,
"xlsm" => file_abbr_tag("XLSM", "MS Excel Macro-Enabled Workbook"),
"xlsx" => MS_EXCEL_SPREADSHEET_HUMANIZED_CONTENT_TYPE,
"xlt" => file_abbr_tag("XLT", "MS Excel Spreadsheet Template"),
"xsd" => file_abbr_tag("XSD", "XML Schema"),
"xslt" => file_abbr_tag("XSLT", "Extensible Stylesheet Language Transformation"),
"zip" => file_abbr_tag("ZIP", "Zip archive"),
}
file_extension_vs_humanized_content_type.fetch(file_extension.to_s.downcase, "")
end
def link(body, url, options = {})
options_str = options.map { |k, v| %{#{encode(k)}="#{encode(v)}"} }.join(" ")
%{#{body}}
end
private
def encode(text)
HTMLEntities.new.encode(text)
end
end
end