1# 2# Copyright 2012 Sebastian Gottfried <sebastiangottfried@web.de> 3# 4# This program is free software; you can redistribute it and/or 5# modify it under the terms of the GNU General Public License as 6# published by the Free Software Foundation; either version 2 of 7# the License, or (at your option) any later version. 8# 9# This program is distributed in the hope that it will be useful, 10# but WITHOUT ANY WARRANTY; without even the implied warranty of 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12# GNU General Public License for more details. 13# 14# You should have received a copy of the GNU General Public License 15# along with this program. If not, see <https://www.gnu.org/licenses/>. 16# 17 18import argparse, os 19from lxml import etree 20 21def find_courses(data_dir, rel_path, root): 22 path = os.path.join(data_dir, rel_path) 23 course_elems = [] 24 for filename in os.listdir(path): 25 if filename.endswith('.xml'): 26 course_tree = etree.parse(file(os.path.join(path, filename), 'r')) 27 elem = etree.Element("course") 28 title = etree.SubElement(elem, "title") 29 title.text, = course_tree.xpath("//course/title/text()") 30 description = etree.SubElement(elem, "description") 31 description.text, = course_tree.xpath("//course/description/text()") 32 keyboard_layout_name = etree.SubElement(elem, "keyboardLayout") 33 keyboard_layout_name.text, = course_tree.xpath("//course/keyboardLayout/text()") 34 id_ele = etree.SubElement(elem, "id") 35 id_ele.text, = course_tree.xpath("//course/id/text()") 36 path_ele = etree.SubElement(elem, "path") 37 path_ele.text = os.path.join(rel_path, filename) 38 course_elems.append(elem) 39 course_elems.sort(key=lambda elem: elem.xpath("path/text()")) 40 for elem in course_elems: 41 root.append(elem) 42 43def find_keyboard_layouts(data_dir, rel_path, root): 44 path = os.path.join(data_dir, rel_path) 45 keyboard_layout_elems = [] 46 for filename in os.listdir(path): 47 if filename.endswith('.xml'): 48 keyboard_tree = etree.parse(file(os.path.join(path, filename), 'r')) 49 elem = etree.Element("keyboardLayout") 50 title = etree.SubElement(elem, "title") 51 title.text, = keyboard_tree.xpath("//keyboardLayout/title/text()") 52 name = etree.SubElement(elem, "name") 53 name.text, = keyboard_tree.xpath("//keyboardLayout/name/text()") 54 id_ele = etree.SubElement(elem, "id") 55 id_ele.text, = keyboard_tree.xpath("//keyboardLayout/id/text()") 56 path_ele = etree.SubElement(elem, "path") 57 path_ele.text = os.path.join(rel_path, filename) 58 keyboard_layout_elems.append(elem) 59 keyboard_layout_elems.sort(key=lambda elem: elem.xpath("path/text()")) 60 for elem in keyboard_layout_elems: 61 root.append(elem) 62 63 64if __name__ == '__main__': 65 def dir_arg(path): 66 if not os.path.exists(path): 67 msg = "{!r} doesn't exist".format(path) 68 raise argparse.ArgumentTypeError(msg) 69 if not os.path.isdir(path): 70 msg = "{!r} has to be a directory".format(path) 71 raise argparse.ArgumentTypeError(msg) 72 return path 73 parser = argparse.ArgumentParser( 74 description='builds data.xml index file' 75 ) 76 parser.add_argument("datadir", 77 type=dir_arg, 78 help="the directory containing the data files", 79 metavar="DIR" 80 ) 81 args = parser.parse_args() 82 root = etree.Element('data') 83 find_courses(args.datadir, 'courses', root) 84 find_keyboard_layouts(args.datadir, 'keyboardlayouts', root) 85 print etree.tostring(root) 86