From 6eb30b09566a53ef510532f2a1705d7fc22985a8 Mon Sep 17 00:00:00 2001 From: Tony Anderson Date: Mon, 22 Jun 2009 14:04:24 +0000 Subject: initial commit --- (limited to 'Convert.py') diff --git a/Convert.py b/Convert.py new file mode 100755 index 0000000..fae30f7 --- /dev/null +++ b/Convert.py @@ -0,0 +1,238 @@ +#!/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) -- cgit v0.9.1