Commit 2e26f84e by Rocky Duan

improve for multiple editor on page

parent dbad9338
......@@ -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, "&lt;")
.replace(/>/g, "&gt;")
if HUB.Browser.isMSIE
block = block.replace /(%[^\n]*)\n/g, "$1<br/>\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()
......@@ -13,6 +13,8 @@ $ ->
Discussion.bindDiscussionEvents(discussion)
Discussion.initializeDiscussion(discussion)
Markdown.makeWmdEditor()
generateLocal = (elem) ->
(selector) -> $(elem).find(selector)
......
......@@ -13,9 +13,7 @@ class @MathJaxDelayRenderer
constructor: (params) ->
params = params || {}
@maxDelay = params["maxDelay"] || @maxDelay
@bufferId = params["buffer"] || @bufferId
if not $("##{@bufferId}").length
$("<div>").attr("id", @bufferId).css("display", "none").appendTo($("body"))
@$buffer = $("<div>").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)
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