# -*- coding: iso-8859-1 -*- # Copyright (C) 2000-2010 Bastian Kleineidam # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ A HTML logger. """ import time import cgi import os from . import Logger from .. import strformat, configuration # ss=1 enables show source validate_html = "http://validator.w3.org/check?ss=1&uri=%(uri)s" # options are the default validate_css = "http://jigsaw.w3.org/css-validator/validator?" \ "uri=%(uri)s&warning=1&profile=css2&usermedium=all" HTML_HEADER = """ %(title)s """ class HtmlLogger (Logger): """ Logger with HTML output. """ def __init__ (self, **args): """ Initialize default HTML color values. """ super(HtmlLogger, self).__init__(**args) self.init_fileoutput(args) self.colorbackground = args['colorbackground'] self.colorurl = args['colorurl'] self.colorborder = args['colorborder'] self.colorlink = args['colorlink'] self.colorwarning = args['colorwarning'] self.colorerror = args['colorerror'] self.colorok = args['colorok'] def part (self, name): """ Return non-space-breakable part name. """ return super(HtmlLogger, self).part(name).replace(" ", " ") def comment (self, s, **args): """ Write HTML comment. """ self.write(u"") def start_output (self): """Write start of checking info.""" super(HtmlLogger, self).start_output() header = { "encoding": self.output_encoding, "title": configuration.App, "body": self.colorbackground, "link": self.colorlink, "vlink": self.colorlink, "alink": self.colorlink, } self.write(HTML_HEADER % header) self.comment("Generated by %s" % configuration.App) if self.has_part('intro'): self.write(u"

"+configuration.App+ "


"+ configuration.Freeware+"

"+ (_("Start checking at %s") % strformat.strtime(self.starttime))+ os.linesep+"
") self.check_date() self.flush() def log_url (self, url_data): """ Write url checking info as HTML. """ self.write_table_start() if self.has_part("id"): self.write_id() if self.has_part("url"): self.write_url(url_data) if url_data.name and self.has_part("name"): self.write_name(url_data) if url_data.parent_url and self.has_part("parenturl"): self.write_parent(url_data) if url_data.base_ref and self.has_part("base"): self.write_base(url_data) if url_data.url and self.has_part("realurl"): self.write_real(url_data) if url_data.dltime >= 0 and self.has_part("dltime"): self.write_dltime(url_data) if url_data.dlsize >= 0 and self.has_part("dlsize"): self.write_dlsize(url_data) if url_data.checktime and self.has_part("checktime"): self.write_checktime(url_data) if url_data.info and self.has_part("info"): self.write_info(url_data) if url_data.warnings and self.has_part("warning"): self.write_warning(url_data) if self.has_part("result"): self.write_result(url_data) self.write_table_end() self.flush() def write_table_start (self): """ Start html table. """ self.writeln(u'

') self.writeln(u'' % self.colorborder) self.writeln(u"") self.writeln(u"
") self.writeln(u'' % (cgi.escape(_("checked link")), self.colorbackground)) def write_table_end (self): """End html table.""" self.write(u'

') def write_id (self): """Write ID for current URL.""" self.writeln(u"") self.writeln(u'%s' % self.part("id")) self.write(u"%d" % self.number) def write_url (self, url_data): """Write url_data.base_url.""" self.writeln(u"") self.writeln(u'%s' % (self.colorurl, self.part("url"))) self.write(u'' % self.colorurl) self.write(u"`%s'" % cgi.escape(url_data.base_url)) if url_data.cached: self.write(_(" (cached)")) self.writeln(u"") def write_name (self, url_data): """ Write url_data.name. """ args = (self.part("name"), cgi.escape(url_data.name)) self.writeln(u"%s`%s'" % args) def write_parent (self, url_data): """ Write url_data.parent_url. """ self.write(u""+self.part("parenturl")+ u''+ cgi.escape(url_data.parent_url)+u"") self.write(_(", line %d") % url_data.line) self.write(_(", col %d") % url_data.column) if not url_data.valid: # on errors show HTML and CSS validation for parent url vhtml = validate_html % {'uri': url_data.parent_url} vcss = validate_css % {'uri': url_data.parent_url} self.writeln() self.writeln(u'(HTML)') self.write(u'(CSS)') self.writeln(u"") def write_base (self, url_data): """ Write url_data.base_ref. """ self.writeln(u""+self.part("base")+u""+ cgi.escape(url_data.base_ref)+u"") def write_real (self, url_data): """ Write url_data.url. """ self.writeln(""+self.part("realurl")+u""+ u''+cgi.escape(url_data.url)+u"") def write_dltime (self, url_data): """ Write url_data.dltime. """ self.writeln(u""+self.part("dltime")+u""+ (_("%.3f seconds") % url_data.dltime)+ u"") def write_dlsize (self, url_data): """ Write url_data.dlsize. """ self.writeln(u""+self.part("dlsize")+u""+ strformat.strsize(url_data.dlsize)+ u"") def write_checktime (self, url_data): """ Write url_data.checktime. """ self.writeln(u""+self.part("checktime")+u""+ (_("%.3f seconds") % url_data.checktime)+u"") def write_info (self, url_data): """ Write url_data.info. """ sep = u"
"+os.linesep text = sep.join(cgi.escape(x) for x in url_data.info) self.writeln(u'' + self.part("info")+ u""+text+u"") def write_warning (self, url_data): """ Write url_data.warnings. """ sep = u"
"+os.linesep text = sep.join(cgi.escape(x) for x in url_data.warnings) self.writeln(u'' + self.part("warning") + u'' + text + u"") def write_result (self, url_data): """ Write url_data.result. """ if url_data.valid: self.write(u'' % self.colorok) self.write(self.part("result")) self.write(u'' % self.colorok) self.write(cgi.escape(_("Valid"))) else: self.write(u'' % self.colorerror) self.write(self.part("result")) self.write(u'' % self.colorerror) self.write(cgi.escape(_("Error"))) if url_data.result: self.write(u": "+cgi.escape(url_data.result)) self.writeln(u"") def end_output (self): """ Write end of checking info as HTML. """ if self.has_part("outro"): self.writeln() self.write(_("That's it.")+" ") if self.number >= 0: self.write(_n("%d link checked.", "%d links checked.", self.number) % self.number) self.write(u" ") self.write(_n("%d warning found", "%d warnings found", self.warnings_printed) % self.warnings_printed) if self.warnings != self.warnings_printed: self.write(_(" (%d ignored or duplicates not printed)") % (self.warnings - self.warnings_printed)) self.write(u". ") self.write(_n("%d error found", "%d errors found", self.errors_printed) % self.errors_printed) if self.errors != self.errors_printed: self.write(_(" (%d duplicates not printed)") % (self.errors - self.errors_printed)) self.writeln(u".") self.writeln(u"
") self.stoptime = time.time() duration = self.stoptime - self.starttime self.writeln(_("Stopped checking at %(time)s (%(duration)s)") % {"time": strformat.strtime(self.stoptime), "duration": strformat.strduration_long(duration)}) self.writeln(u'


'+ configuration.HtmlAppInfo+u"
") self.writeln(_("Get the newest version at %s") % (u''+ configuration.Url+u".
")) self.writeln(_("Write comments and bugs to %s") % (u''+ configuration.SupportUrl+u".")) self.writeln(u"
") self.close_fileoutput()