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