diff --git a/common/lib/xmodule/xmodule/js/fixtures/combinedopenended-with-markdown.html b/common/lib/xmodule/xmodule/js/fixtures/combinedopenended-with-markdown.html new file mode 100644 index 0000000000..0c4c406c74 --- /dev/null +++ b/common/lib/xmodule/xmodule/js/fixtures/combinedopenended-with-markdown.html @@ -0,0 +1,6 @@ +
+
+ + +
+
\ No newline at end of file diff --git a/common/lib/xmodule/xmodule/js/fixtures/combinedopenended-without-markdown.html b/common/lib/xmodule/xmodule/js/fixtures/combinedopenended-without-markdown.html new file mode 100644 index 0000000000..7c92922bb0 --- /dev/null +++ b/common/lib/xmodule/xmodule/js/fixtures/combinedopenended-without-markdown.html @@ -0,0 +1,5 @@ +
+
+ +
+
\ No newline at end of file diff --git a/common/lib/xmodule/xmodule/js/fixtures/problem-with-markdown.html b/common/lib/xmodule/xmodule/js/fixtures/problem-with-markdown.html index be4fcd5ecc..a7681ed776 100644 --- a/common/lib/xmodule/xmodule/js/fixtures/problem-with-markdown.html +++ b/common/lib/xmodule/xmodule/js/fixtures/problem-with-markdown.html @@ -1,6 +1,6 @@
- +
\ No newline at end of file diff --git a/common/lib/xmodule/xmodule/js/spec/combinedopenended/edit_spec.coffee b/common/lib/xmodule/xmodule/js/spec/combinedopenended/edit_spec.coffee new file mode 100644 index 0000000000..fb9312724a --- /dev/null +++ b/common/lib/xmodule/xmodule/js/spec/combinedopenended/edit_spec.coffee @@ -0,0 +1,145 @@ +describe 'OpenEndedMarkdownEditingDescriptor', -> + describe 'save stores the correct data', -> + it 'saves markdown from markdown editor', -> + loadFixtures 'combinedopenended-with-markdown.html' + @descriptor = new OpenEndedMarkdownEditingDescriptor($('.combinedopenended-editor')) + saveResult = @descriptor.save() + expect(saveResult.metadata.markdown).toEqual('markdown') + expect(saveResult.data).toEqual('\nmarkdown\n') + it 'clears markdown when xml editor is selected', -> + loadFixtures 'combinedopenended-with-markdown.html' + @descriptor = new OpenEndedMarkdownEditingDescriptor($('.combinedopenended-editor')) + @descriptor.createXMLEditor('replace with markdown') + saveResult = @descriptor.save() + expect(saveResult.metadata.markdown).toEqual(null) + expect(saveResult.data).toEqual('replace with markdown') + it 'saves xml from the xml editor', -> + loadFixtures 'combinedopenended-without-markdown.html' + @descriptor = new OpenEndedMarkdownEditingDescriptor($('.combinedopenended-editor')) + saveResult = @descriptor.save() + expect(saveResult.metadata.markdown).toEqual(null) + expect(saveResult.data).toEqual('xml only') + + describe 'insertPrompt', -> + it 'inserts the template if selection is empty', -> + revisedSelection = OpenEndedMarkdownEditingDescriptor.insertPrompt('') + expect(revisedSelection).toEqual(OpenEndedMarkdownEditingDescriptor.promptTemplate) + it 'recognizes html in the prompt', -> + revisedSelection = OpenEndedMarkdownEditingDescriptor.insertPrompt('[prompt]

Hello

[prompt]') + expect(revisedSelection).toEqual('[prompt]

Hello

[prompt]') + + describe 'insertRubric', -> + it 'inserts the template if selection is empty', -> + revisedSelection = OpenEndedMarkdownEditingDescriptor.insertRubric('') + expect(revisedSelection).toEqual(OpenEndedMarkdownEditingDescriptor.rubricTemplate) + it 'recognizes a proper rubric', -> + revisedSelection = OpenEndedMarkdownEditingDescriptor.insertRubric('[rubric]\n+1\n-1\n-2\n[rubric]') + expect(revisedSelection).toEqual('[rubric]\n+1\n-1\n-2\n[rubric]') + + describe 'insertTasks', -> + it 'inserts the template if selection is empty', -> + revisedSelection = OpenEndedMarkdownEditingDescriptor.insertTasks('') + expect(revisedSelection).toEqual(OpenEndedMarkdownEditingDescriptor.tasksTemplate) + it 'recognizes a proper task string', -> + revisedSelection = OpenEndedMarkdownEditingDescriptor.insertTasks('[tasks](Self)[tasks]') + expect(revisedSelection).toEqual('[tasks](Self)[tasks]') + + describe 'markdownToXml', -> + # test default templates + it 'converts prompt to xml', -> + data = OpenEndedMarkdownEditingDescriptor.markdownToXml("""[prompt] +

Prompt!

+ This is my super awesome prompt. + [prompt] + """) + data = data.replace(/[\t\n\s]/gmi,'') + expect(data).toEqual(""" + + +

Prompt!

+ This is my super awesome prompt. +
+
+ """.replace(/[\t\n\s]/gmi,'')) + + it 'converts rubric to xml', -> + data = OpenEndedMarkdownEditingDescriptor.markdownToXml("""[rubric] + + 1 + -1 + -2 + + 2 + -1 + -2 + +3 + -1 + -2 + -3 + [rubric] + """) + data = data.replace(/[\t\n\s]/gmi,'') + expect(data).toEqual(""" + + + + + 1 + + + + + 2 + + + + + 3 + + + + + + + + """.replace(/[\t\n\s]/gmi,'')) + + it 'converts tasks to xml', -> + data = OpenEndedMarkdownEditingDescriptor.markdownToXml("""[tasks] + (Self), ({1-2}AI), ({1-4}AI), ({1-2}Peer + [tasks] + """) + data = data.replace(/[\t\n\s]/gmi,'') + equality_list = """ + + + + + + + + Enter essay here. + This is the answer. + {"grader_settings" : "ml_grading.conf", "problem_id" : "6.002x/Welcome/OETest"} + + + + + + + Enter essay here. + This is the answer. + {"grader_settings" : "ml_grading.conf", "problem_id" : "6.002x/Welcome/OETest"} + + + + + + + Enter essay here. + This is the answer. + {"grader_settings" : "peer_grading.conf", "problem_id" : "6.002x/Welcome/OETest"} + + + + + """ + expect(data).toEqual(equality_list.replace(/[\t\n\s]/gmi,'')) diff --git a/common/lib/xmodule/xmodule/js/src/combinedopenended/edit.coffee b/common/lib/xmodule/xmodule/js/src/combinedopenended/edit.coffee index b5c7f69f1d..997d6f12fa 100644 --- a/common/lib/xmodule/xmodule/js/src/combinedopenended/edit.coffee +++ b/common/lib/xmodule/xmodule/js/src/combinedopenended/edit.coffee @@ -131,8 +131,12 @@ class @OpenEndedMarkdownEditingDescriptor extends XModule.Descriptor @insertGenericInput: (selectedText, lineStart, lineEnd, template) -> if selectedText.length > 0 - # TODO: should this insert a newline afterwards? - return lineStart + selectedText + lineEnd + new_string = selectedText.replace(/^\s+|\s+$/g,'') + if new_string.substring(0,lineStart.length) != lineStart + new_string = lineStart + new_string + if new_string.substring((new_string.length)-lineEnd.length,new_string.length) != lineEnd + new_string = new_string + lineEnd + return new_string else return template diff --git a/lms/djangoapps/courseware/module_render.py b/lms/djangoapps/courseware/module_render.py index 1b3bb91dda..491b6b00ea 100644 --- a/lms/djangoapps/courseware/module_render.py +++ b/lms/djangoapps/courseware/module_render.py @@ -217,8 +217,8 @@ def get_module_for_descriptor(user, request, descriptor, model_data_cache, cours #this first checks to see if the descriptor is the correct one, and only sends settings if it is #Get descriptor metadata fields indicating needs for various settings - needs_open_ended_interface = hasattr(descriptor, "needs_open_ended_interface") and descriptor.needs_open_ended_interface - needs_s3_interface = hasattr(descriptor, "needs_s3_interface") and descriptor.needs_s3_interface + needs_open_ended_interface = hasattr(descriptor, "needs_open_ended_interface", False) + needs_s3_interface = hasattr(descriptor, "needs_s3_interface", False) #Initialize interfaces to None open_ended_grading_interface = None