#!/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()