Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Convert.py
diff options
context:
space:
mode:
Diffstat (limited to 'Convert.py')
-rwxr-xr-xConvert.py238
1 files changed, 238 insertions, 0 deletions
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('<?xml version="1.0" ?>','<?xml version="1.0" encoding= "utf-16" ?>')
+ 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)