diff --git a/common/lib/xmodule/xmodule/js/spec/problem/edit_spec.coffee b/common/lib/xmodule/xmodule/js/spec/problem/edit_spec.coffee
new file mode 100644
index 0000000000..2e1cfc9531
--- /dev/null
+++ b/common/lib/xmodule/xmodule/js/spec/problem/edit_spec.coffee
@@ -0,0 +1,5 @@
+describe 'MarkdownEditingDescriptor', ->
+ describe 'markdownToXml', ->
+ it 'converts raw text to paragraph', ->
+ data = MarkdownEditingDescriptor.markdownToXml('foo')
+ expect(data).toEqual('
foo
')
\ No newline at end of file
diff --git a/common/lib/xmodule/xmodule/js/src/problem/edit.coffee b/common/lib/xmodule/xmodule/js/src/problem/edit.coffee
index adc3cc05b7..a5c2f26aa6 100644
--- a/common/lib/xmodule/xmodule/js/src/problem/edit.coffee
+++ b/common/lib/xmodule/xmodule/js/src/problem/edit.coffee
@@ -17,7 +17,7 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor
})
@setCurrentEditor(@markdown_editor)
- onMarkdownEditorUpdate: ->
+ onMarkdownEditorUpdate: ->
console.log('update')
@updateXML()
@@ -32,7 +32,7 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor
# onMarkdownEditorUpdate();
else
@setCurrentEditor(@xml_editor)
- # xmlEditor.refresh();
+ # xmlEditor.refresh();
setCurrentEditor: (editor) ->
$(@current_editor.getWrapperElement()).hide()
@@ -43,3 +43,108 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor
save: ->
$body.off('click', '.editor-tabs .tab', @changeEditor)
data: @xml_editor.getValue()
+
+ @markdownToXml: (markdown)->
+ toXml = `function(markdown) {
+ var xml = markdown;
+
+ // replace headers
+ xml = xml.replace(/(^.*?$)(?=\n\=\=+$)/gm, '$1
');
+ xml = xml.replace(/\n^\=\=+$/gm, '');
+
+ // group multiple choice answers
+ xml = xml.replace(/(^\s*\(.?\).*?$\n*)+/gm, function(match, p) {
+ var groupString = '\n';
+ groupString += ' \n';
+ var options = match.split('\n');
+ for(var i = 0; i < options.length; i++) {
+ if(options[i].length > 0) {
+ var value = options[i].split(/^\s*\(.?\)\s*/)[1];
+ var correct = /^\s*\(x\)/i.test(options[i]);
+ groupString += ' ' + value + '\n';
+ }
+ }
+ groupString += ' \n';
+ groupString += '\n\n';
+ return groupString;
+ });
+
+ // group check answers
+ xml = xml.replace(/(^\s*\[.?\].*?$\n*)+/gm, function(match, p) {
+ var groupString = '\n';
+ groupString += ' \n';
+ var options = match.split('\n');
+ for(var i = 0; i < options.length; i++) {
+ if(options[i].length > 0) {
+ var value = options[i].split(/^\s*\[.?\]\s*/)[1];
+ var correct = /^\s*\[x\]/i.test(options[i]);
+ groupString += ' ' + value + '\n';
+ }
+ }
+ groupString += ' \n';
+ groupString += '\n\n';
+ return groupString;
+ });
+
+ // replace videos
+ xml = xml.replace(/\{\{video\s(.*?)\}\}/g, '\n\n');
+
+ // replace string and numerical
+ xml = xml.replace(/^\=\s*(.*?$)/gm, function(match, p) {
+ var string;
+ var params = /(.*?)\+\-\s*(.*?)/.exec(p);
+ if(parseFloat(p)) {
+ if(params) {
+ string = '\n';
+ string += ' \n';
+ } else {
+ string = '\n';
+ }
+ string += ' \n';
+ string += '\n\n';
+ } else {
+ string = '\n \n\n\n';
+ }
+ return string;
+ });
+
+ // replace selects
+ xml = xml.replace(/\[\[(.+?)\]\]/g, function(match, p) {
+ var selectString = '\n\n';
+ selectString += ' \n';
+ selectString += '\n\n';
+ return selectString;
+ });
+
+ // split scripts and wrap paragraphs
+ var splits = xml.split(/(\<\/?script.*?\>)/g);
+ var scriptFlag = false;
+ for(var i = 0; i < splits.length; i++) {
+ if(/\