#!/usr/bin/python # -*- coding: utf-8 -*- ###################################################### # Purpose : # Converting a sleep time XML file to formatted text. # You can get XML files from the following URL: # # blah^3 # http://s03.2log.net/home/blah/ # # Version : # 1.1 (2005/02/27) # # Author : # isr ###################################################### # Usage : # sleeptime.py [xml_files...] ###################################################### import sys, datetime import string, re import xml.parsers.expat CHAR_CODE = 'utf-8' TAG_DATA = "timedata" TAG_SLEEP = "sleep" TAG_WAKE = "wake" ATTR_AT = "at" ATTR_WEEK = "dayweek" TAG_BGM = "bgm" TAG_DRINK = "drink" ATTR_NAME = "name" ATTR_NUM = "number" TAG_GAME = "game" ATTR_PLAYTIME = "playtime" TAG_COMMENT = "comment" ###################################################### def Iif(a_try, a_true, a_false) : """Python's ? : .""" if a_try : return a_true return a_false def GetArgc() : """Return the Number of this Program Arguments.""" if len(sys.argv) > 1 : return len(sys.argv) else : return Iif(len(sys.argv[0]) > 0, 1, 0) def AllInt(a_array) : """Return int arrays from string arrays.""" ai = [] for x in a_array : ai.append(int(x)) return ai def GetDateTime(a_datetime) : """Return datetime object from formatted string.""" sMatch = "(\d{4})/(\d{2})/(\d{2}).{5}(\d{2}):(\d{2})" m = re.match(sMatch, a_datetime) if m == None : return None a = AllInt(m.groups()) return datetime.datetime(a[0], a[1], a[2], a[3], a[4]) class CXmlHandler : def __init__(self) : self.times_ = [] self.drinks_ = [] self.games_ = [] self.bgms_ = [] self.comment_ = "" self.com_ok_ = False def PrintTimes(self) : for x in self.times_ : total = GetDateTime(x[1]) - GetDateTime(x[0]) print x[0], "-", x[1], "[" + str(total)[:-3] + "]" def PrintTotalTime(self) : total = datetime.timedelta() for x in self.times_ : total += GetDateTime(x[1]) - GetDateTime(x[0]) print "Week Total Time :", str(total)[:-3] def PrintSub(self) : for x in self.bgms_ : print "BGM :", x.encode(CHAR_CODE) for x in self.games_ : print "GAME :", x[0].encode(CHAR_CODE), "(" + x[1].encode(CHAR_CODE) + " play)" for x in self.drinks_ : print "Drink :", x[0].encode(CHAR_CODE), "*", x[1].encode(CHAR_CODE) def PrintComment(self) : if len(self.comment_) > 0 : s = self.comment_[1:] print string.replace(s, "\t", "") def ConvertDateStr(self, a_date, a_weekday) : sMatch = "(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})" m = re.match(sMatch, a_date) if m == None : return None as = m.groups() s = as[0] + "/" + as[1] + "/" + as[2] + "(" + a_weekday + ")" + as[3] + ":" + as[4] return s def StartElement(self, a_name, a_attrs) : if a_name == TAG_SLEEP : self.tmp_sleep_ = self.ConvertDateStr(a_attrs[ATTR_AT], a_attrs[ATTR_WEEK]) if a_name == TAG_WAKE : self.tmp_wake_ = self.ConvertDateStr(a_attrs[ATTR_AT], a_attrs[ATTR_WEEK]) if a_name == TAG_DRINK : self.drinks_.append( (a_attrs[ATTR_NAME], a_attrs[ATTR_NUM]) ) if a_name == TAG_BGM : self.bgms_.append(a_attrs[ATTR_NAME]) if a_name == TAG_GAME : self.games_.append( (a_attrs[ATTR_NAME], a_attrs[ATTR_PLAYTIME]) ) if a_name == TAG_COMMENT : self.com_ok_ = True def EndElement(self, a_name) : if a_name == TAG_DATA : self.times_.append( (self.tmp_sleep_, self.tmp_wake_) ) self.tmp_sleep_ = None self.tmp_wake_ = None if a_name == TAG_COMMENT : self.com_ok_ = False def CharData(self, a_data) : if self.com_ok_ : self.comment_ += str(a_data.encode(CHAR_CODE)) def main() : handler = CXmlHandler() p = xml.parsers.expat.ParserCreate() p.StartElementHandler = handler.StartElement p.EndElementHandler = handler.EndElement p.CharacterDataHandler = handler.CharData if GetArgc() > 1 : for name in sys.argv[1:] : f = open(name, 'r') if f == None : continue p.ParseFile(f) f.close() else : p.Parse(sys.stdin.read()) # print results print "Sleep Data -------" handler.PrintTimes() handler.PrintTotalTime() print print "Sub Data ---------" handler.PrintSub() print print "Comment ----------" handler.PrintComment() print ''' [original data] [convert script]''' return 0 if __name__ == '__main__' : main()