#!/usr/bin/python # -*- coding: utf-8 -*- from Tkinter import * from tkFileDialog import askopenfilename import tkFont import re, os class App: def __init__(self,master): frame = Frame(master, width=400, height=300) frame.pack() self.getFile = Entry(frame, width=30) self.getFile.grid(row=0,column=0) self.browse = Button(frame, text="Browse", command=self.browseFiles) self.browse.grid(row=0,column=1) self.next = Button(frame, text="Next >", command=self.chooseColors) self.next.grid(row=1,column=1, pady=5) Letters = tkFont.Font(family='Gulim',size=10) self.nickScroll = Scrollbar(frame) self.nickList = Listbox(frame, selectmode=SINGLE, font=Letters, \ yscrollcommand=self.nickScroll.set) self.nickScroll.config(command=self.nickList.yview) self.nickList.bind("", self.activateIndex) self.colorScroll = Scrollbar(frame) self.colorChoices = Listbox(frame,selectmode=SINGLE, font=Letters) self.colorScroll.config(command=self.colorChoices.yview) #colors = ['검정','빨강','파랑','초록','보라','잿빛','갈색','군청','진적색','청록','분홍'] colors = ['Black','Red','Blue','Green','Purple','Gray','Brown','Navy','Maroon','Teal','Pink'] for color in colors: self.colorChoices.insert(END,color) self.colorChoices.bind("", self.saveToFile) self.getHTML = Button(frame, text="Apply Style >", command=self.genHTML) self.abortStyle = Button(frame, text="Abort", command=frame.destroy) self.previous = Button(frame, text="< Back", command=self.previous) self.doneMsg = Label(frame,text="You have generated an HTML file of your log.") self.finish = Button(frame, text="Done", command=frame.destroy) def saveToFile(self,event): selected = self.colorChoices.nearest(event.y) selectedColor = self.colorChoices.get(selected) currnick = self.nickList.get(ANCHOR) currindex = self.nickList.index(ANCHOR) leftBracket = currnick.rfind('(') if leftBracket != -1: currnick = currnick[0:leftBracket] currnick = currnick.strip() ucurrnick = currnick.encode('utf-8') self.nickList.delete(currindex) self.nickList.insert(currindex,currnick+' ('+selectedColor+')') self.nickList.select_anchor(currindex) uselectedColor = selectedColor.encode('utf-8') config = self.readINI() nickcolor = self.findINI(config,ucurrnick) if nickcolor: newconfig = config.replace(nickcolor,"%s=%s"%\ (ucurrnick,uselectedColor)) self.writeINI(newconfig) else: self.appendINI("%s=%s"%(ucurrnick,uselectedColor)) def activateIndex(self,event): selected = self.nickList.nearest(event.y) self.nickList.select_anchor(selected) def browseFiles(self): contents = self.readINI() try: prevfileline = self.findINI(contents,'file') except: prevfileline = None if prevfileline: prevfile = prevfileline.replace('file=','') prevfile = prevfile.strip() lastdash = prevfile.rfind('/') startdir = prevfile[0:lastdash] else: startdir = None filename = askopenfilename(initialdir=startdir) filename = filename.strip() self.getFile.delete(0,END) self.getFile.insert(0,filename) if contents: fileinfo = self.findINI(contents,'file') if fileinfo: contents = contents.replace(fileinfo,'file='+filename,1) self.writeINI(contents) else: self.appendINI('file='+filename) else: self.appendINI('file='+filename) def chooseColors(self): #This function handles the main HTML file-writing work #Maybe a name change is in order, to prevent confusion? contents = self.readINI() if contents: fileline = self.findINI(contents,'file') else: fileline = None if fileline: #get the file... origfile = fileline.replace('file=','') origfile = origfile.strip() lastdot = origfile.rfind('.') #if there is a . in the file name if lastdot != -1: origfileName = origfile[0:lastdot] origex = origfile[lastdot:] #if no . in the file name else: origfileName = origfile origex = '' #debug #print origex if origex != '.log' and origex !='.txt': import tkMessageBox tkMessageBox.showwarning('Extension error',\ 'File must be a .log or .txt file.') return else: #process head part of file head = self.readINI('filehead.html') lastdash = origfileName.rfind('/') justfileName = origfileName[lastdash + 1:] puncpattern = re.compile('[^&#\w]') logtitle = "%s"%puncpattern.sub(' ',justfileName) head = head.replace('',logtitle,1) newfile = origfileName + '.html' #open in write mode and write HTML head newfilewrite = open(newfile,'w') newfilewrite.write(head) newfilewrite.close() #get the contents of original logfile... origlog = '\n' + self.readINI(origfile) #erase all time stamps, if any timestamp = re.compile('\n\[.*?\][ ]?') origlog = timestamp.sub('\n',origlog) #erase all color codes colorcode = re.compile('[0-9]{1,2}') origlog = colorcode.sub('',origlog) #split into list of lines lines = origlog.split("\n") lines = [line.strip() for line in lines] nicks = [] cleanNicks = [] newfileprocess = open(newfile,'a') #start and end chat characters startchars = ['(','['] endchars = [')',']'] #process by line lineno = 0 while lineno < len(lines): line = lines[lineno] prevchat = False if lineno > 0: prevline = lines[lineno - 1] prevchat = self.wasChat(prevline,startchars,endchars) #spoken line rightBracket = line.find('>') if line.startswith('<') and rightBracket !=-1: #extract nick nick = line[1:rightBracket] #clean up nickname cleanup = re.compile('[@]') nick = cleanup.sub('',nick) spacedNick = nick.replace('_',' ') cleanNick = spacedNick.strip() #append to lists if not already there try: x = nicks.index(nick) except ValueError: nicks.append(nick) cleanNicks.append(cleanNick) #extract spoken line spoken = line[rightBracket+1:] spoken = spoken.strip() currchat = self.isChat(spoken,startchars,endchars) if prevchat and not currchat: #end of chatter div = '' elif not prevchat and currchat: #start of chatter div = "
" else: div = '' #create new line newline0="

%s

%s:"\ %(div,nick,cleanNick) newline1=" %s\n" % (spoken,) newline = newline0 + newline1 else: #append to new file if prevchat: div = '' else: div = "

" newline = "

%s

%s\n" % (div,line) #write to html log file try: newline = unicode(newline,"cp949").encode("utf-8") newfileprocess.write(newline) except UnicodeDecodeError: pass lineno = lineno + 1 #add closing tags newfileprocess.write("\n

") #close out file newfileprocess.close() #write nicks to log.ini nickline = ','.join(nicks) cleanNickline = ','.join(cleanNicks) self.appendINI("nicks(%s)=%s"%(newfile,nickline)) self.appendINI("cleanNicks(%s)=%s"%(newfile,cleanNickline)) self.getFile.grid_forget() self.browse.grid_forget() self.next.grid_forget() nickslist = self.getNickLists()['nicks'] orignickslist = self.getNickLists()['origs'] for nick in nickslist: nick = unicode(nick,"euc-kr") unick = nick.encode("utf-8") config = self.readINI() nickcolor = self.findINI(config,unick) if nickcolor: try: color = nickcolor.split('=')[1].strip() except IndexError: color = None if color: kocolor = unicode(color,'euc-kr') nick = nick + ' (' + kocolor + ')' self.nickList.insert(END,nick) self.nickList.grid(row=0,column=0) self.nickList.select_anchor(0) self.nickScroll.grid(row=0,column=1,padx=0) self.colorChoices.grid(row=0,column=2) self.colorScroll.grid(row=0,column=3,padx=0) self.previous.grid(row=1,column=0,pady=5) self.getHTML.grid(row=1,column=2,pady=5) def genHTML(self): #This function fills out the stylesheet #Doesn't work very well yet nicks = self.getNickLists()['nicks'] origs = self.getNickLists()['origs'] #debug #for nick in nicks: #print unicode(nick,'cp949').encode('utf-8') filename = self.getNewFileName() logfile = self.readINI(filename) #fill out the stylesheet i=0 while i') if line.startswith('<') and rightBracket != -1: #is spoken line #extract spoken part spoken = line[rightBracket+1:] spoken = spoken.strip() ischatter = self.isChat(spoken,startchars,endchars) if ischatter: chatter = True else: chatter = False else: #no nick, no dialogue chatter = True return chatter def isChat(self,line,startchars,endchars): chatter = False startchat = False for startchar in startchars: if line.startswith(startchar): startchat = True break endchat = False for endchar in endchars: if line.endswith(endchar): endchat = True break if startchat and endchat: chatter = True return chatter def getNickLists(self): config = self.readINI() filename = self.getNewFileName() nicksline = self.findINI(config,'cleanNicks('+filename) orignicksline = self.findINI(config,'nicks('+filename) nickslinesplit = nicksline.split(')=') orignickslinesplit = orignicksline.split(')=') try: nickslist = nickslinesplit[1].split(',') orignickslist = orignickslinesplit[1].split(',') except IndexError: nickslist = [] orignickslist = [] return {'nicks':nickslist,'origs':orignickslist} root = Tk() application = App(root) root.mainloop()