diff --git a/src/main.py b/src/main.py index 538b41b..f99322e 100755 --- a/src/main.py +++ b/src/main.py @@ -8,60 +8,61 @@ __license__ = "Apache" import argparse +import json from logzero import logger from lxml import etree -qti_resource = {} +qti_resource = { + 'assessments': [] +} def main(args): """ Main entry point of the app """ - logger.info("Main program starting point.") + logger.info("QTI converter utility.") logger.info(args) - xml_doc = etree.parse(args.filename) + try: + xml_doc = etree.parse(args.input) - for xml_resource in xml_doc.getroot().findall(".//{http://www.imsglobal.org/xsd/imsccv1p1/imscp_v1p1}resource[@type='imsqti_xmlv1p2']"): - this_resource_id = xml_resource.get("identifier") - qti_resource[this_resource_id] = {} - qti_resource[this_resource_id]['id'] = this_resource_id - qti_resource[this_resource_id]['href'] = xml_resource.find("{http://www.imsglobal.org/xsd/imsccv1p1/imscp_v1p1}file").get("href") - qti_resource[this_resource_id]['title'] = etree.parse(qti_resource[xml_resource.get("identifier")]['href']).getroot().find("{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}assessment").get("title") - qti_resource[this_resource_id]['items'] = {} + for xml_resource in xml_doc.getroot().findall(".//{http://www.imsglobal.org/xsd/imsccv1p1/imscp_v1p1}resource[@type='imsqti_xmlv1p2']"): + this_assessment = { + 'id': xml_resource.get("identifier"), + 'title': '', + 'questions': [] + } + this_assessment_xml = this_assessment['id'] + "/" + this_assessment['id'] + ".xml" - for xml_item in etree.parse(qti_resource[xml_resource.get("identifier")]['href']).getroot().findall(".//{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}item"): - this_item_id = xml_item.get("ident") - qti_resource[this_resource_id]['items'][this_item_id] = {} - qti_resource[this_resource_id]['items'][this_item_id]['id'] = this_item_id - qti_resource[this_resource_id]['items'][this_item_id]['title'] = xml_item.find("{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}presentation/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}material/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}mattext").text + for xml_item in etree.parse(this_assessment_xml).getroot().findall(".//{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}item"): + this_question = { + 'id': xml_item.get("ident"), + 'text': xml_item.find("{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}presentation/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}material/{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}mattext").text, + 'answers': [] + } + this_assessment['questions'].append(this_question) + this_assessment['title'] = etree.parse(this_assessment_xml).getroot().find("{http://www.imsglobal.org/xsd/ims_qtiasiv1p2}assessment").get("title") - for assessment in qti_resource: - a = qti_resource[assessment] - print(a['id'] + " " + a['title']) - for item in a['items']: - i = a['items'][item] - print(i['id'] + i['title']) - + # multiple_choice_question + # short_answer_question -if __name__ == "__main__": - """ This is executed when run from the command line """ - parser = argparse.ArgumentParser(description="Convert QTI files into other formats.") + qti_resource['assessments'].append(this_assessment) + + qti_resource_json = json.dumps(qti_resource, indent = 2) + print(qti_resource_json) - # Input file - parser.add_argument("filename", help="QTI input file") + except OSError as e: + logger.error("%s", e) - # Optional verbosity counter (eg. -v, -vv, -vvv, etc.) - parser.add_argument( - "-v", - "--verbose", - action="count", - default=0, - help="verbosity (-v, -vv, etc)") + except etree.ParseError as e: + logger.error("XML parser error: %s", e) - # Specify output of "--version" - parser.add_argument( - "--version", - action="version", - version="%(prog)s (version {version})".format(version=__version__)) +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Convert QTI files into other formats.", add_help=False) + parser.add_argument("input", help="QTI input file.") + parser.add_argument("-v", action="count", default=0, help="Verbosity (-v, -vv, etc).") + parser.add_argument("-f", action="store", dest="format", default="json", help="Output format, defaults to JSON.") + parser.add_argument( "--version", action="version", help="Display version and exit.", version="%(prog)s (version {version})".format(version=__version__)) + parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS, help='Show this help message and exit.') args = parser.parse_args() + print(args) main(args) \ No newline at end of file