import sys
# types = ["multichoice", "truefalse", "shortanswer" , "matching",
# "cloze", "essay", "numerical", "description"] # These are the possible
# question types in moodle (for reference)
def txt2xml(ifi, ofi, category):
ifi = open(ifi)
ofi = open(ofi, 'w')
ofi.write("\n\n")
ofi.write("\n\n")
ofi.write(" " + category + "\n\n\n")
ctr = 0
question = {"text": "", "type": "", "answers": []}
# Answers are a dictionary consisting of text and the amount of credit
# given for this answer
for li in ifi:
print(li)
li = li.strip()
if li == "":
continue
mark = marktype(li.split(".")[0])
li = ".".join(li.split(".")[1:])
li = li.strip()
if mark == 0: # We don't know what this line is
print(li, ctr)
i = input(
"We don't know what " + li + " is. Is this a problem (y/n)?:")
if i == 'y':
sys.exit(0)
else:
continue
if mark == 1: # We have a new question
# print the old question
ctr += 1
ctr = xmlout(ofi, question, ctr)
# Make a new question with the given question text
question = {"text": li, "type": "", "answers": []}
if mark == 2: # We have a description
# print the old question
ctr += 1
ctr = xmlout(ofi, question, ctr)
# Make a new question with the given question text
question = {"text": li, "type": "description", "answers": []}
if mark == 3: # We have a short answer answer
# create the new answer
# assign it 100% credit
question["type"] = "shortanswer"
question["answers"].append({"text": li, "credit": 100})
if mark == 4: # We have a t/f or multiple choice answer
# create the new answer
question["answers"].append({"text": li, "credit": 0})
# if it is marked with ~, assign it 100% credit
if "~" in li:
question["answers"][-1]["credit"] = 100
question[
"answers"][-1]["text"] = question["answers"][-1]["text"].replace("~", "")
if mark == 6: # matching question/answer pair
matchpair = li.split("->")
if len(matchpair) == 1:
assert(" -> " in li)
a = matchpair[0].strip()
else:
q = matchpair[0].strip()
a = matchpair[1].strip()
question["type"] = "matching"
if not "pairs" in question:
question["pairs"] = []
question["pairs"].append({"question": q, "answer": a})
# print the last question
ctr += 1
ctr = xmlout(ofi, question, ctr)
ofi.write("")
ofi.close()
ifi.close()
def gettype(q):
if q["type"] != "":
return
if len(q["answers"]) == 0:
q["type"] = "essay"
q["answers"] = [{"text": "", "credit": 0}]
# this is a true false question
elif len([a for a in q["answers"] if a["text"] in ["True", "False", "true", "false"]]) == len(q["answers"]):
for a in range(len(q["answers"])):
q["answers"][a]["text"] = q["answers"][a]["text"].lower()
q["type"] = "truefalse"
else:
q["type"] = "multichoice"
def marktype(s):
if s == "":
return 0
if isint(s):
return 1
if s == "D":
return 2
if s == "ANS":
return 3
if s in "abcdefghijklmnopqrstuvwxyz":
return 4
if s == "FEED":
return 5
if s == "M":
return 6
return 0
def isint(a):
try:
int(a)
return True
except:
return False
def matchingout(ofi, question, ctr):
for pair in question["pairs"]:
ofi.write("\n")
ofi.write("\n")
ofi.write("\n")
ofi.write("\n")
ofi.write("\n")
ofi.write("\n")
def xmlout(ofi, question, ctr):
if question["text"] == "":
return ctr - 1
gettype(question)
ofi.write("\n")
ofi.write(
"\n")
ofi.write("\n")
ofi.write(
"\n\n")
if question["type"] == "matching":
matchingout(ofi, question, ctr)
ofi.write("false\n")
else:
# Generally want to shuffle the answers because most people write the correct answers first.
# You can override later in the XML or online.
ofi.write("true\n")
# handle multichoice case when checkboxes are desired
anscount = 0
if question["type"] == "multichoice":
for a in question["answers"]:
if a["credit"] > 0:
anscount += 1
if anscount > 1: # need checkboxes
ofi.write('false')
break
anscount = max(anscount, 1)
for a in question["answers"]:
ofi.write(
"\n")
ofi.write("\n")
ofi.write("\n")
ofi.write("\n")
return ctr
def make_quiz(quiz_number, term='201740'):
txt = './quizzes-' + term + '/Quiz' + str(quiz_number) + '.txt'
xml = './quizzes-xml/Quiz' + str(quiz_number) + '.xml'
category = ('$course/Quizzes-' + term + '/$Quiz ' +
str(quiz_number) + '/')
txt2xml(txt, xml, category)
# for j in range(4):
# for k in range(1, j + 2):
# print(j + k, end="")
# print()
#
# for j in range(3):
# for k in range(1, 6):
# print(j + k, end="")
# print()
make_quiz(1)
# for q in range(8, 9):
# txt2xml("./quizzes txt/Quiz" + str(q) + ".txt",
# "./quizzes xml/Quiz" + str(q) + ".xml", "$course/Quizzes-201630/$Quiz " + str(q) + "/")
# def foo1(seq):
# total = 0
# for k in range(len(seq) // 2):
# total = total + seq[1 + (2 * k)]
# return total
#
#
# def foo2(seq):
# total = 0
# for k in range(1, len(seq), 2):
# total = total + seq[k]
# return total
#
#
# def foo3(seq):
# total = 0
# m = 1
# for _ in range(len(seq) // 2):
# total = total + seq[m]
# m = m + 2
# return total
#
# print(foo1([3]))
# print(foo1([3, 6]))
# print(foo1([3, 6, 1, 4, 9, 5]))
#
# print(foo2([3]))
# print(foo2([3, 6]))
# print(foo2([3, 6, 1, 4, 9, 5]))
#
# print(foo3([3]))
# print(foo3([3, 6]))
# print(foo3([3, 6, 1, 4, 9, 5]))