#!/usr/bin/env python #---------------------------------------------------------------------- # Convert.py # Dave Reed # 01/23/2008 #---------------------------------------------------------------------- import sys, os try: from xml.etree import ElementTree as etree except: sys.exit() from GladeWindow import * #---------------------------------------------------------------------- class Window(GladeWindow): #---------------------------------------------------------------------- def __init__(self): ''' ''' self.init() #---------------------------------------------------------------------- def init(self): filename = 'Convert.glade' widget_list = [ 'window1', 'entry1', 'entry2', ] handlers = [ 'on_entry2_activate', ] top_window = 'window1' GladeWindow.__init__(self, filename, top_window, widget_list, handlers) #---------------------------------------------------------------------- def on_entry2_activate(self, *args): output_folder = self.widgets['entry2'].get_text() convert_main(output_folder) def main_window_destroy(): self.destroy() #---------------------------------------------------------------------- class InTree(): def __init__(self, filename): self.tree = etree.parse(filename) self.xml = self.tree.getroot() def get(self, node): idcard = node.attrib.get("id") if not idcard: idcard = '0' question = node.findtext("front") if not question: question = '' hint = node.findtext('comment') if not hint: hint = '' sound = node.findtext('sound') if not sound: sound = '' answer = node.findtext("back") if not answer: answer = '' more = node.findtext('backexample') if not more: more = '' image = node.findtext('image') if not image: image = '' return (idcard, question, hint, answer, more, sound, image) #---------------------------------------------------------------------- class SaveDeck(): def __init__(self): self.xml = etree.Element("quiz") def put(self, card): if len(card) < 7: print 'fatal error in put:', len(card) sys.exit() xmlcard = etree.Element("card") xmlcard.set("id",str(card[0])) question = etree.SubElement(xmlcard, "question") question.text = card[1] if len(card[2]) > 0: hint = etree.SubElement(question, "hint") hint.text = card[2] if len(card[5]) > 0: sound = etree.SubElement(question, 'sound') sound.text = card[5] answer = etree.SubElement(xmlcard, "answer") answer.text = card[3] if len(card[4]) > 0: more = etree.SubElement(answer, "more") more.text = card[4] if len(card[6]) > 0: image = etree.SubElement(answer, 'image') image.text = card[6] self.xml.append(xmlcard) # in-place prettyprint formatter def indent(self, elem, level=0): i = "\n" + level*" " if len(elem): if not elem.text or not elem.text.strip(): elem.text = i + " " for elem in elem: self.indent(elem, level+1) if not elem.tail or not elem.tail.strip(): elem.tail = i else: if level and (not elem.tail or not elem.tail.strip()): elem.tail = i def printtree(self, filename, last): self.xml.set("last",str(last)) #prettyprint tree = etree.ElementTree(self.xml) self.indent(self.xml) tree.write(filename, encoding = 'utf-8') #---------------------------------------------------------------------- def get_filenames(): #select decks using file chooser dialog [ user must select in correct order ] chooser = gtk.FileChooserDialog(title=None,action=gtk.FILE_CHOOSER_ACTION_OPEN, \ buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) chooser.set_select_multiple(True) chooser.set_default_response(gtk.RESPONSE_OK) response = chooser.run() if response != gtk.RESPONSE_OK: sys.exit() decks = chooser.get_filenames() chooser.destroy() return decks def fix_file(filename, outfilename): infile = open(filename) s = unicode(infile.read(),'ISO 8859-1') infile.close() t = s.replace('','') s = t t = s.replace('utf-16', 'utf-8') s = t s = t t = s.replace('front example', 'frontexample') s = t s = t t = s.replace('back example', 'backexample') s = t outfile = open(outfilename, 'w') outfile.write(t) outfile.close def get_deck(tree): deck = [] for node in tree.xml: card = tree.get(node) deck.append(card) return deck def get_tree(filename): global w tree = InTree(filename) return tree def convert_deck(deck): cards = [] for card in deck: #card = [id, question, hint, answer, more, sound, image] id = str(len(cards)) #make newcard [id, card[1], card[2], card[3], card[4], card[5], card[6]] #sound = card[5] #if len(sound) > 0: # newcard = [id, card[1], card[2], sound[:-4], card[4], card[5], card[6]] #else: newcard = [id, card[1], card[2], card[3], card[4], card[5], card[6]] #add to cards cards.append(newcard) return cards def save_deck(filename, cards): #create tree from cards out = SaveDeck() for card in cards: out.put(card) #write tree with pretty print number = len(cards) out.printtree(filename, number) def path_strip(pathname): # get part after last /, if any filename = os.path.basename(pathname) return filename def convert_main(outfolder): global w decks = get_filenames() for filename in decks: w.widgets['entry1'].set_text(path_strip(filename)) outfilename = './' + outfolder + '/' + path_strip(filename) #fix_file(filename, outfilename) tree = get_tree(filename) deck = get_deck(tree) cards = convert_deck(deck) save_deck(outfilename, cards) sys.exit() #---------------------------------------------------------------------- def main(argv): global w w = Window() w.show() w.widgets['entry2'].grab_focus() gtk.main() #---------------------------------------------------------------------- if __name__ == '__main__': main(sys.argv)