diff --git a/admin/editor-js.php b/admin/editor-js.php index 9c842862..cbd8e4e3 100644 --- a/admin/editor-js.php +++ b/admin/editor-js.php @@ -55,36 +55,59 @@ $(document).ready(function () { var editor = new Markdown.Editor(converter, '', options), diffMatch = new diff_match_patch(), last = '', preview = $('#wmd-preview'), - boundary = '@boundary' + Math.ceil(Math.random() * 1000000) + '@'; + mark = '@mark' + Math.ceil(Math.random() * 100000000) + '@', + span = ''; // 自动跟随 - converter.preConversion = function (text) { - var diffs = diffMatch.diff_main(last, text); - last = text; - + converter.postConversion = function (html) { + var diffs = diffMatch.diff_main(last, html); + last = html; if (diffs.length > 0) { - text = ''; - + var stack = [], markStr = mark; + for (var i = 0; i < diffs.length; i ++) { - var diff = diffs[i]; + var diff = diffs[i], op = diff[0], str = diff[1] + sp = str.lastIndexOf('<'), ep = str.lastIndexOf('>'); - if (diff[0] >= 0) { - text += diff[1]; + if (op != 0) { + if (sp >=0 && sp > ep) { + if (op > 0) { + stack.push(str.substring(0, sp) + markStr + str.substring(sp)); + } else { + var lastStr = stack[stack.length - 1], lastSp = lastStr.lastIndexOf('<'); + stack[stack.length - 1] = lastStr.substring(0, lastSp) + markStr + lastStr.substring(lastSp); + } + } else { + if (op > 0) { + stack.push(str + markStr); + } else { + stack.push(markStr); + } + } + + markStr = ''; + } else { + stack.push(str); } + } - if (diff[0] != 0) { - text += (diff[1].substring(-1).match(/\w\u3300-\u33ff\u3400-\u4d8f\u4e00-\u9fff/i) ? ' ' : '') + boundary; + html = stack.join(''); + + if (!markStr) { + var pos = html.indexOf(mark), prev = html.substring(0, pos), + next = html.substr(pos + mark.length), + sp = prev.lastIndexOf('<'), ep = prev.lastIndexOf('>'); + + if (sp >= 0 && sp > ep) { + html = prev.substring(0, sp) + span + prev.substring(sp) + next; + } else { + html = prev + span + next; } } } - return text; - } - - converter.postConversion = function (html) { - html = html.replace(boundary, ''); - return html.replace(new RegExp(boundary, 'g'), ''); + return html; } editor.hooks.chain('onPreviewRefresh', function () {