From 2e26f84e9bdb3335f3a1d1c34fef1cb4b6c34f75 Mon Sep 17 00:00:00 2001 From: Rocky Duan Date: Thu, 26 Jul 2012 16:20:26 -0400 Subject: [PATCH] improve for multiple editor on page --- lms/static/coffee/src/customwmd.coffee | 70 +++++++++++-------- lms/static/coffee/src/discussion.coffee | 2 + .../coffee/src/mathjax_delay_renderer.coffee | 13 ++-- 3 files changed, 46 insertions(+), 39 deletions(-) diff --git a/lms/static/coffee/src/customwmd.coffee b/lms/static/coffee/src/customwmd.coffee index e893ddf0d1..e8012d8f42 100644 --- a/lms/static/coffee/src/customwmd.coffee +++ b/lms/static/coffee/src/customwmd.coffee @@ -6,10 +6,6 @@ $ -> class MathJaxProcessor - inlineMark = "$" - math = null - blocks = null - MATHSPLIT = /// ( \$\$? # normal inline or display delimiter | \\(?:begin|end)\{[a-z]*\*?\} # \begin{} \end{} style @@ -27,20 +23,26 @@ $ -> (?!`) ///gm - @processMath: (start, last, preProcess) => - block = blocks.slice(start, last + 1).join("").replace(/&/g, "&") + constructor: (inlineMark, displayMark) -> + @inlineMark = inlineMark || "$" + @displayMark = displayMark || "$$" + @math = null + @blocks = null + + processMath: (start, last, preProcess) -> + block = @blocks.slice(start, last + 1).join("").replace(/&/g, "&") .replace(//g, ">") if HUB.Browser.isMSIE block = block.replace /(%[^\n]*)\n/g, "$1
\n" - blocks[i] = "" for i in [start+1..last] - blocks[start] = "@@#{math.length}@@" + @blocks[i] = "" for i in [start+1..last] + @blocks[start] = "@@#{@math.length}@@" block = preProcess(block) if preProcess - math.push block + @math.push block - @removeMath: (text) => + removeMath: (text) -> - math = [] + @math = [] start = end = last = null braces = 0 @@ -54,13 +56,13 @@ $ -> else deTilde = (text) -> text - blocks = _split(text.replace(/\r\n?/g, "\n"), MATHSPLIT) + @blocks = _split(text.replace(/\r\n?/g, "\n"), MATHSPLIT) - for current in [1...blocks.length] by 2 - block = blocks[current] + for current in [1...@blocks.length] by 2 + block = @blocks[current] if block.charAt(0) == "@" - blocks[current] = "@@#{math.length}@@" - math.push block + @blocks[current] = "@@#{@math.length}@@" + @math.push block else if start if block == end if braces @@ -79,7 +81,7 @@ $ -> else if block == "}" and braces --braces else - if block == inlineMark or block == "$$" + if block == @inlineMark or block == @displayMark start = current end = block braces = 0 @@ -92,21 +94,27 @@ $ -> @processMath(start, last, deTilde) start = end = last = null - deTilde(blocks.join("")) + deTilde(@blocks.join("")) - @replaceMath: (text) => - text = text.replace /@@(\d+)@@/g, ($0, $1) => math[$1] - math = null + replaceMath: (text) -> + text = text.replace /@@(\d+)@@/g, ($0, $1) => @math[$1] + @math = null text if Markdown? - converter = Markdown.getSanitizingConverter() - editor = new Markdown.Editor(converter) - converter.hooks.chain "preConversion", MathJaxProcessor.removeMath - converter.hooks.chain "postConversion", MathJaxProcessor.replaceMath - delayRenderer = new MathJaxDelayRenderer() - editor.hooks.chain "onPreviewPush", (text, previewSet) -> - delayRenderer.render - text: text - previewSetter: previewSet - editor.run() + Markdown.getMathCompatibleConverter = -> + converter = Markdown.getSanitizingConverter() + processor = new MathJaxProcessor() + converter.hooks.chain "preConversion", processor.removeMath + converter.hooks.chain "postConversion", processor.replaceMath + converter + + Markdown.makeWmdEditor = (appended_id) -> + converter = Markdown.getMathCompatibleConverter() + editor = new Markdown.Editor(converter, appended_id) + delayRenderer = new MathJaxDelayRenderer() + editor.hooks.chain "onPreviewPush", (text, previewSet) -> + delayRenderer.render + text: text + previewSetter: previewSet + editor.run() diff --git a/lms/static/coffee/src/discussion.coffee b/lms/static/coffee/src/discussion.coffee index 51420f38cc..50bc95d8e8 100644 --- a/lms/static/coffee/src/discussion.coffee +++ b/lms/static/coffee/src/discussion.coffee @@ -13,6 +13,8 @@ $ -> Discussion.bindDiscussionEvents(discussion) Discussion.initializeDiscussion(discussion) + Markdown.makeWmdEditor() + generateLocal = (elem) -> (selector) -> $(elem).find(selector) diff --git a/lms/static/coffee/src/mathjax_delay_renderer.coffee b/lms/static/coffee/src/mathjax_delay_renderer.coffee index 03bb4b3cc9..b70cb28246 100644 --- a/lms/static/coffee/src/mathjax_delay_renderer.coffee +++ b/lms/static/coffee/src/mathjax_delay_renderer.coffee @@ -13,9 +13,7 @@ class @MathJaxDelayRenderer constructor: (params) -> params = params || {} @maxDelay = params["maxDelay"] || @maxDelay - @bufferId = params["buffer"] || @bufferId - if not $("##{@bufferId}").length - $("
").attr("id", @bufferId).css("display", "none").appendTo($("body")) + @$buffer = $("
").attr("id", @bufferId).css("display", "none").appendTo($("body")) # render: (params) -> # params: @@ -35,7 +33,6 @@ class @MathJaxDelayRenderer if not text? text = $(elem).html() preprocessor = params["preprocessor"] - buffer = $("##{@bufferId}") if params["delay"] == false if preprocessor? @@ -54,20 +51,20 @@ class @MathJaxDelayRenderer prevTime = getTime() if preprocessor? text = preprocessor(text) - buffer.html(text) + @$buffer.html(text) curTime = getTime() @elapsedTime = curTime - prevTime if MathJax prevTime = getTime() @mathjaxRunning = true - MathJax.Hub.Queue ["Typeset", MathJax.Hub, buffer.attr("id")], => + MathJax.Hub.Queue ["Typeset", MathJax.Hub, @$buffer.attr("id")], => @mathjaxRunning = false curTime = getTime() @mathjaxDelay = curTime - prevTime if previewSetter - previewSetter($(buffer).html()) + previewSetter($(@$buffer).html()) else - $(elem).html($(buffer).html()) + $(elem).html($(@$buffer).html()) else @mathjaxDelay = 0 @mathjaxTimeout = window.setTimeout(renderer, delay)