444
444
if exercisedesc is not None:
445
445
req.write("<div>%s</div>\n" % exercisedesc)
446
446
filename = cgi.escape(cjson.encode(exercisesrc), quote=True)
447
exercisepartial = cgi.escape(exercisepartial)
448
447
req.write("""<input id="input_resettext_exercise%d" type="hidden"
450
% (exerciseid, exercisepartial_backup))
449
% (exerciseid, urllib.quote(exercisepartial_backup)))
451
450
req.write("""<textarea id="textarea_exercise%d" class="exercisebox"
452
451
onkeypress="return catch_textbox_input("exercise%d", %s,
455
454
"Save")"
456
455
cols="80" rows="%s">%s</textarea>"""
457
456
% (exerciseid, exerciseid, filename, exerciseid, filename,
458
rows, exercisepartial))
459
req.write("""\n<div class="exercisebuttons">
460
<input type="button" value="Reset"
457
rows, cgi.escape(exercisepartial)))
458
req.write("""\n<div class="exercisebuttons">\n""")
459
req.write(""" <input type="button" value="Reset"
461
460
id="resetbutton_exercise%d"
462
onclick="resetexercise("exercise%d", %s)"
463
title="Reload the original partial solution for this exercise" />
464
<input type="button" value="Saved" disabled="disabled"
461
onclick="resetexercise("exercise%d")"
462
title="Reload the original partial solution for this exercise" />\n"""
463
% (exerciseid, exerciseid))
464
req.write(""" <input type="button" value="Saved" disabled="disabled"
465
465
id="savebutton_exercise%d"
466
466
onclick="saveexercise("exercise%d", %s)"
467
title="Save your solution to this exercise" />
468
<input type="button" value="Run"
467
title="Save your solution to this exercise" />\n"""
468
% (exerciseid, exerciseid, filename))
469
req.write(""" <input type="button" value="Run"
469
470
onclick="runexercise("exercise%d", %s)"
470
title="Run this program in the console" />
471
<input type="button" value="Submit"
471
title="Run this program in the console" />\n"""
472
% (exerciseid, filename))
473
req.write(""" <input type="button" value="Submit"
472
474
id="submitbutton_exercise%d"
473
475
onclick="submitexercise("exercise%d", %s)"
474
title="Submit this solution for evaluation" />
476
title="Submit this solution for evaluation" />\n"""
477
% (exerciseid, exerciseid, filename))
476
479
<div class="testoutput">
478
""" % (exerciseid, exerciseid, filename, exerciseid, exerciseid, filename,
479
exerciseid, filename,
480
exerciseid, exerciseid, filename))
481
481
# Write the "summary" - whether this problem is complete and how many
482
482
# attempts it has taken.
483
483
req.write("""<div class="problem_summary">