# coding: utf-8 ############################################################################ # Copyright 2009-2019 Benjamin Kellermann # # # # This file is part of Dudle. # # # # Dudle is free software: you can redistribute it and/or modify it under # # the terms of the GNU Affero General Public License as published by # # the Free Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # Dudle is distributed in the hope that it will be useful, but WITHOUT ANY # # WARRANTY; without even the implied warranty of MERCHANTABILITY or # # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public # # License for more details. # # # # You should have received a copy of the GNU Affero General Public License # # along with dudle. If not, see <http://www.gnu.org/licenses/>. # ############################################################################ class HTML attr_accessor :body, :header attr_reader :relative_dir def initialize(title, relative_dir = "") @title = title @relative_dir = relative_dir @header = {} @header["type"] = "text/html" # @header["type"] = "application/xhtml+xml" @header["charset"] = "utf-8" @body = "" @htmlheader = '' @css = [] @atom = [] end def head ret = <<HEAD <head> <meta http-equiv="Content-Type" content="#{@header["type"]}; charset=#{@header["charset"]}" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <title>#{@title}</title> <link rel="shortcut icon" href="/favicon.ico" type="image/vnd.microsoft.icon" /> HEAD @css = [@css[0]] + @css[1..-1].sort unless @css.empty? @css.each{|title,href| titleattr = "title='#{title}'" if title != "" ret += "<link rel='stylesheet' type='text/css' href='#{@relative_dir}#{href}' #{titleattr} media='screen, projection, tv, handheld'/>\n" ret += "<link rel='stylesheet' type='text/css' href='#{@relative_dir}#{href}' media='print' />\n" if title == "print" } @atom.each{|href| ret += "<link rel='alternate' type='application/atom+xml' href='#{@relative_dir}#{href}' />\n" } ret += @htmlheader ret += "</head>" ret end def add_css(href, title = "", default = false) if default @css.unshift([title,href]) else @css << [title,href] end end def add_atom(href) @atom << href end def add_cookie(key,value,path,expiretime) c = CGI::Cookie.new(key, value) c.path = path c.expires = expiretime @header["cookie"] ||= [] @header["cookie"] << c end def add_head_script(file) add_html_head("<script type='text/javascript' src='#{@relative_dir}#{file}'></script>") end def add_script_file(file) self << "<script type='text/javascript' src='#{@relative_dir}#{file}'></script>" end def add_script(script) self << <<SCRIPT <script type="text/javascript"> // <![CDATA[ #{script} // ]]> </script> SCRIPT end def << (bodycontent) @body += bodycontent.chomp + "\n" end def add_html_head(headercontent) @htmlheader += headercontent.chomp + "\n" end def out(cgi) #FIXME: quick and dirty fix for encoding problem { "ö" => "ö", "ü" => "ü", "ä" => "ä", "Ö" => "Ö", "Ü" => "Ü", "Ä" => "Ä", "ß" => "ß", "–" => "–", "„" => "„", "“" => "“", "”" => "”", "✔" => "✔", "✘" => "✘", "◀" => "◀", "▶" => "▶", "✍" => "✍", "✖" => "✖", "•" => "•", "▾" => "▾", "▴" => "▴" }.each{|from,to| @body.gsub!(from,to) } # @body.gsub!(/./){|char| # code = char[0] # code > 127 ? "&##{code};" : char # } xmllang = _("xml:lang='en' dir='ltr'") cgi.out(@header){ <<HEAD <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" #{xmllang}> #{head} #{@body} </html> HEAD } end end