diff --git a/lms/static/coffee/src/customwmd.coffee b/lms/static/coffee/src/customwmd.coffee
index 7efcddb90a..74be7ddbfe 100644
--- a/lms/static/coffee/src/customwmd.coffee
+++ b/lms/static/coffee/src/customwmd.coffee
@@ -112,14 +112,16 @@ $ ->
if Markdown?
- Markdown.getMathCompatibleConverter = ->
+ Markdown.getMathCompatibleConverter = (postProcessor) ->
+ postProcessor ||= ((text) -> text)
converter = Markdown.getSanitizingConverter()
processor = new MathJaxProcessor()
converter.hooks.chain "preConversion", MathJaxProcessor.removeMathWrapper(processor)
- converter.hooks.chain "postConversion", MathJaxProcessor.replaceMathWrapper(processor)
+ converter.hooks.chain "postConversion", (text) ->
+ postProcessor(MathJaxProcessor.replaceMathWrapper(processor)(text))
converter
- Markdown.makeWmdEditor = (elem, appended_id, imageUploadUrl) ->
+ Markdown.makeWmdEditor = (elem, appended_id, imageUploadUrl, postProcessor) ->
$elem = $(elem)
if not $elem.length
@@ -136,7 +138,7 @@ $ ->
.append($("
").attr("id", "wmd-preview#{_append}").addClass("wmd-panel wmd-preview"))
$elem.append($wmdPanel)
- converter = Markdown.getMathCompatibleConverter()
+ converter = Markdown.getMathCompatibleConverter(postProcessor)
ajaxFileUpload = (imageUploadUrl, input, startUploadHandler) ->
$("#loading").ajaxStart(-> $(this).show()).ajaxComplete(-> $(this).hide())
diff --git a/lms/static/coffee/src/discussion/content.coffee b/lms/static/coffee/src/discussion/content.coffee
index 058872c172..cea77c69ff 100644
--- a/lms/static/coffee/src/discussion/content.coffee
+++ b/lms/static/coffee/src/discussion/content.coffee
@@ -283,8 +283,13 @@ initializeFollowThread = (thread) ->
text.replace(/\<\;highlight\>\;/g, "
")
.replace(/\<\;\/highlight\>\;/g, "")
+ stripHighlight = (text, type) ->
+ text.replace(/\&(amp\;)?lt\;highlight\&(amp\;)?gt\;/g, "")
+ .replace(/\&(amp\;)?lt\;\/highlight\&(amp\;)?gt\;/g, "")
+
+
stripLatexHighlight = (text) ->
- text
+ Discussion.processEachMathAndCode text, stripHighlight
markdownWithHighlight = (text) ->
converter = Markdown.getMathCompatibleConverter()
@@ -303,10 +308,7 @@ initializeFollowThread = (thread) ->
$contentBody = $local(".content-body")
- console.log "raw html:"
- console.log $contentBody.html()
-
- $contentBody.html markdownWithHighlight $contentBody.html()
+ $contentBody.html Discussion.postMathJaxProcessor markdownWithHighlight $contentBody.html()
MathJax.Hub.Queue ["Typeset", MathJax.Hub, $contentBody.attr("id")]
id = $content.attr("_id")
diff --git a/lms/static/coffee/src/discussion/utils.coffee b/lms/static/coffee/src/discussion/utils.coffee
index 44944f0201..e4515b941b 100644
--- a/lms/static/coffee/src/discussion/utils.coffee
+++ b/lms/static/coffee/src/discussion/utils.coffee
@@ -95,12 +95,25 @@ wmdEditors = {}
else
success(response, textStatus, xhr)
+ postMathJaxProcessor: (text) ->
+ RE_INLINEMATH = /^\$([^\$]*)\$/g
+ RE_DISPLAYMATH = /^\$\$([^\$]*)\$\$/g
+ Discussion.processEachMathAndCode text, (s, type) ->
+ if type == 'display'
+ s.replace RE_DISPLAYMATH, ($0, $1) ->
+ "\\[" + $1 + "\\]"
+ else if type == 'inline'
+ s.replace RE_INLINEMATH, ($0, $1) ->
+ "\\(" + $1 + "\\)"
+ else
+ s
+
makeWmdEditor: ($content, $local, cls_identifier) ->
elem = $local(".#{cls_identifier}")
id = $content.attr("_id")
appended_id = "-#{cls_identifier}-#{id}"
imageUploadUrl = Discussion.urlFor('upload')
- editor = Markdown.makeWmdEditor elem, appended_id, imageUploadUrl
+ editor = Markdown.makeWmdEditor elem, appended_id, imageUploadUrl, Discussion.postMathJaxProcessor
wmdEditors["#{cls_identifier}-#{id}"] = editor
editor
@@ -164,3 +177,54 @@ wmdEditors = {}
unfollowLink()
else
followLink()
+
+ processEachMathAndCode: (text, processor) ->
+
+ codeArchive = []
+
+ RE_DISPLAYMATH = /^([^\$]*?)\$\$([^\$].+?)\$\$(.*)$/m
+ RE_INLINEMATH = /^([^\$]*?)\$([^\$]+?)\$(.*)$/m
+
+ ESCAPED_DOLLAR = '@@ESCAPED_D@@'
+ ESCAPED_BACKSLASH = '@@ESCAPED_B@@'
+
+ processedText = ""
+
+ $div = $("
").html(text)
+
+ $div.find("code").each (index, code) ->
+ codeArchive.push $(code).html()
+ $(code).html(codeArchive.length - 1)
+
+ text = $div.html()
+ text = text.replace /\\\$/g, ESCAPED_DOLLAR
+
+ while true
+ if RE_INLINEMATH.test(text)
+ text = text.replace RE_INLINEMATH, ($0, $1, $2, $3) ->
+ processedText += $1 + processor("$" + $2 + "$", 'inline')
+ $3
+ else if RE_DISPLAYMATH.test(text)
+ text = text.replace RE_DISPLAYMATH, ($0, $1, $2, $3) ->
+ processedText += $1 + processor("$$" + $2 + "$$", 'display')
+ $3
+ else
+ processedText += text
+ break
+
+ text = processedText
+ text = text.replace(new RegExp(ESCAPED_DOLLAR), '\\$')
+
+ text = text.replace /\\\\\\\\/g, ESCAPED_BACKSLASH
+ text = text.replace /\\begin\{([a-z]*\*?)\}([\s\S]*?)\\end\{\1\}/img, ($0, $1, $2) ->
+ processor("\\begin{#{$1}}" + $2 + "\\end{#{$1}}")
+ text = text.replace(new RegExp(ESCAPED_BACKSLASH), '\\\\\\\\')
+
+ $div = $("
").html(text)
+ cnt = 0
+ $div.find("code").each (index, code) ->
+ $(code).html(processor(codeArchive[cnt], 'code'))
+ cnt += 1
+
+ $div.html()
+