422
422
exercisedesc = rst(innerXML(elem).strip())
423
423
if elem.tagName == "partial":
424
424
exercisepartial= getTextData(elem) + '\n'
425
exercisepartial_backup = exercisepartial
426
427
# If the user has already saved some text for this problem, or submitted
427
428
# an attempt, then use that text instead of the supplied "partial".
444
445
req.write("<div>%s</div>\n" % exercisedesc)
445
446
filename = cgi.escape(cjson.encode(exercisesrc), quote=True)
446
447
exercisepartial = cgi.escape(exercisepartial)
447
req.write('<textarea id="textarea_exercise%d" class="exercisebox" '
448
'onkeypress="return catch_textbox_input("exercise%d", %s, '
450
'onchange="set_saved_status("exercise%d", %s, '
451
'"Save")" '
452
'cols="80" rows="%s">%s</textarea>'
448
req.write("""<input id="input_resettext_exercise%d" type="hidden"
450
% (exerciseid, exercisepartial_backup))
451
req.write("""<textarea id="textarea_exercise%d" class="exercisebox"
452
onkeypress="return catch_textbox_input("exercise%d", %s,
454
onchange="set_saved_status("exercise%d", %s,
456
cols="80" rows="%s">%s</textarea>"""
453
457
% (exerciseid, exerciseid, filename, exerciseid, filename,
454
458
rows, exercisepartial))
455
459
req.write("""\n<div class="exercisebuttons">
460
<input type="button" value="Reset"
461
id="resetbutton_exercise%d"
462
onclick="resetexercise("exercise%d", %s)"
463
title="Reload the original partial solution for this exercise" />
456
464
<input type="button" value="Saved" disabled="disabled"
457
465
id="savebutton_exercise%d"
458
466
onclick="saveexercise("exercise%d", %s)"
468
476
<div class="testoutput">
470
""" % (exerciseid, exerciseid, filename, exerciseid, filename,
471
exerciseid, exerciseid, filename))
478
""" % (exerciseid, exerciseid, filename, exerciseid, exerciseid, filename,
479
exerciseid, filename,
480
exerciseid, exerciseid, filename))
472
481
# Write the "summary" - whether this problem is complete and how many
473
482
# attempts it has taken.
474
483
req.write("""<div class="problem_summary">