Commit 2e26f84e by Rocky Duan

improve for multiple editor on page

parent dbad9338
...@@ -6,10 +6,6 @@ $ -> ...@@ -6,10 +6,6 @@ $ ->
class MathJaxProcessor class MathJaxProcessor
inlineMark = "$"
math = null
blocks = null
MATHSPLIT = /// ( MATHSPLIT = /// (
\$\$? # normal inline or display delimiter \$\$? # normal inline or display delimiter
| \\(?:begin|end)\{[a-z]*\*?\} # \begin{} \end{} style | \\(?:begin|end)\{[a-z]*\*?\} # \begin{} \end{} style
...@@ -27,20 +23,26 @@ $ -> ...@@ -27,20 +23,26 @@ $ ->
(?!`) (?!`)
///gm ///gm
@processMath: (start, last, preProcess) => constructor: (inlineMark, displayMark) ->
block = blocks.slice(start, last + 1).join("").replace(/&/g, "&") @inlineMark = inlineMark || "$"
@displayMark = displayMark || "$$"
@math = null
@blocks = null
processMath: (start, last, preProcess) ->
block = @blocks.slice(start, last + 1).join("").replace(/&/g, "&")
.replace(/</g, "&lt;") .replace(/</g, "&lt;")
.replace(/>/g, "&gt;") .replace(/>/g, "&gt;")
if HUB.Browser.isMSIE if HUB.Browser.isMSIE
block = block.replace /(%[^\n]*)\n/g, "$1<br/>\n" block = block.replace /(%[^\n]*)\n/g, "$1<br/>\n"
blocks[i] = "" for i in [start+1..last] @blocks[i] = "" for i in [start+1..last]
blocks[start] = "@@#{math.length}@@" @blocks[start] = "@@#{@math.length}@@"
block = preProcess(block) if preProcess block = preProcess(block) if preProcess
math.push block @math.push block
@removeMath: (text) => removeMath: (text) ->
math = [] @math = []
start = end = last = null start = end = last = null
braces = 0 braces = 0
...@@ -54,13 +56,13 @@ $ -> ...@@ -54,13 +56,13 @@ $ ->
else else
deTilde = (text) -> text 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 for current in [1...@blocks.length] by 2
block = blocks[current] block = @blocks[current]
if block.charAt(0) == "@" if block.charAt(0) == "@"
blocks[current] = "@@#{math.length}@@" @blocks[current] = "@@#{@math.length}@@"
math.push block @math.push block
else if start else if start
if block == end if block == end
if braces if braces
...@@ -79,7 +81,7 @@ $ -> ...@@ -79,7 +81,7 @@ $ ->
else if block == "}" and braces else if block == "}" and braces
--braces --braces
else else
if block == inlineMark or block == "$$" if block == @inlineMark or block == @displayMark
start = current start = current
end = block end = block
braces = 0 braces = 0
...@@ -92,21 +94,27 @@ $ -> ...@@ -92,21 +94,27 @@ $ ->
@processMath(start, last, deTilde) @processMath(start, last, deTilde)
start = end = last = null start = end = last = null
deTilde(blocks.join("")) deTilde(@blocks.join(""))
@replaceMath: (text) => replaceMath: (text) ->
text = text.replace /@@(\d+)@@/g, ($0, $1) => math[$1] text = text.replace /@@(\d+)@@/g, ($0, $1) => @math[$1]
math = null @math = null
text text
if Markdown? if Markdown?
converter = Markdown.getSanitizingConverter() Markdown.getMathCompatibleConverter = ->
editor = new Markdown.Editor(converter) converter = Markdown.getSanitizingConverter()
converter.hooks.chain "preConversion", MathJaxProcessor.removeMath processor = new MathJaxProcessor()
converter.hooks.chain "postConversion", MathJaxProcessor.replaceMath converter.hooks.chain "preConversion", processor.removeMath
delayRenderer = new MathJaxDelayRenderer() converter.hooks.chain "postConversion", processor.replaceMath
editor.hooks.chain "onPreviewPush", (text, previewSet) -> converter
delayRenderer.render
text: text Markdown.makeWmdEditor = (appended_id) ->
previewSetter: previewSet converter = Markdown.getMathCompatibleConverter()
editor.run() editor = new Markdown.Editor(converter, appended_id)
delayRenderer = new MathJaxDelayRenderer()
editor.hooks.chain "onPreviewPush", (text, previewSet) ->
delayRenderer.render
text: text
previewSetter: previewSet
editor.run()
...@@ -13,6 +13,8 @@ $ -> ...@@ -13,6 +13,8 @@ $ ->
Discussion.bindDiscussionEvents(discussion) Discussion.bindDiscussionEvents(discussion)
Discussion.initializeDiscussion(discussion) Discussion.initializeDiscussion(discussion)
Markdown.makeWmdEditor()
generateLocal = (elem) -> generateLocal = (elem) ->
(selector) -> $(elem).find(selector) (selector) -> $(elem).find(selector)
......
...@@ -13,9 +13,7 @@ class @MathJaxDelayRenderer ...@@ -13,9 +13,7 @@ class @MathJaxDelayRenderer
constructor: (params) -> constructor: (params) ->
params = params || {} params = params || {}
@maxDelay = params["maxDelay"] || @maxDelay @maxDelay = params["maxDelay"] || @maxDelay
@bufferId = params["buffer"] || @bufferId @$buffer = $("<div>").attr("id", @bufferId).css("display", "none").appendTo($("body"))
if not $("##{@bufferId}").length
$("<div>").attr("id", @bufferId).css("display", "none").appendTo($("body"))
# render: (params) -> # render: (params) ->
# params: # params:
...@@ -35,7 +33,6 @@ class @MathJaxDelayRenderer ...@@ -35,7 +33,6 @@ class @MathJaxDelayRenderer
if not text? if not text?
text = $(elem).html() text = $(elem).html()
preprocessor = params["preprocessor"] preprocessor = params["preprocessor"]
buffer = $("##{@bufferId}")
if params["delay"] == false if params["delay"] == false
if preprocessor? if preprocessor?
...@@ -54,20 +51,20 @@ class @MathJaxDelayRenderer ...@@ -54,20 +51,20 @@ class @MathJaxDelayRenderer
prevTime = getTime() prevTime = getTime()
if preprocessor? if preprocessor?
text = preprocessor(text) text = preprocessor(text)
buffer.html(text) @$buffer.html(text)
curTime = getTime() curTime = getTime()
@elapsedTime = curTime - prevTime @elapsedTime = curTime - prevTime
if MathJax if MathJax
prevTime = getTime() prevTime = getTime()
@mathjaxRunning = true @mathjaxRunning = true
MathJax.Hub.Queue ["Typeset", MathJax.Hub, buffer.attr("id")], => MathJax.Hub.Queue ["Typeset", MathJax.Hub, @$buffer.attr("id")], =>
@mathjaxRunning = false @mathjaxRunning = false
curTime = getTime() curTime = getTime()
@mathjaxDelay = curTime - prevTime @mathjaxDelay = curTime - prevTime
if previewSetter if previewSetter
previewSetter($(buffer).html()) previewSetter($(@$buffer).html())
else else
$(elem).html($(buffer).html()) $(elem).html($(@$buffer).html())
else else
@mathjaxDelay = 0 @mathjaxDelay = 0
@mathjaxTimeout = window.setTimeout(renderer, delay) @mathjaxTimeout = window.setTimeout(renderer, delay)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment