diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index cc9f1288d..6c84e27fd 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -200,6 +200,10 @@ function Ace2Inner(){ var authorInfos = {}; // presence of key determines if author is present in doc + function getAuthorInfos(){ + return authorInfos; + }; + editorInfo.ace_getAuthorInfos= getAuthorInfos; function setAuthorInfo(author, info) { if ((typeof author) != "string") @@ -884,7 +888,12 @@ function Ace2Inner(){ editorInfo.ace_setEditable = setEditable; editorInfo.ace_execCommand = execCommand; editorInfo.ace_replaceRange = replaceRange; - + editorInfo.ace_performDocumentReplaceRange = performDocumentReplaceRange; + editorInfo.ace_performDocumentReplaceCharRange = performDocumentReplaceCharRange; + editorInfo.ace_renumberList = renumberList; + editorInfo.ace_doReturnKey = doReturnKey; + editorInfo.ace_isBlockElement = isBlockElement; + editorInfo.ace_getLineListType = getLineListType; editorInfo.ace_callWithAce = function(fn, callStack, normalize) { var wrapper = function() @@ -1683,16 +1692,34 @@ function Ace2Inner(){ p.mark("findsel"); // if the nodes that define the selection weren't encountered during // content collection, figure out where those nodes are now. - if (selection && !selStart) + if (selection && !selStart) { //if (domChanges) dmesg("selection not collected"); - selStart = getLineAndCharForPoint(selection.startPoint); + editorInfo.lineAndChar = null; + hooks.callAll('aceLineAndCharForPoint', { + callstack: currentCallStack, + editorInfo: editorInfo, + rep: rep, + root:root, + point:selection.startPoint, + documentAttributeManager: documentAttributeManager + }); + selStart = editorInfo.lineAndChar || getLineAndCharForPoint(selection.startPoint); } if (selection && !selEnd) { - selEnd = getLineAndCharForPoint(selection.endPoint); + editorInfo.lineAndChar = null; + hooks.callAll('aceLineAndCharForPoint', { + callstack: currentCallStack, + editorInfo: editorInfo, + rep: rep, + root:root, + point:selection.endPoint, + documentAttributeManager: documentAttributeManager + }); + selEnd = editorInfo.lineAndChar || getLineAndCharForPoint(selection.endPoint); } - + // selection from content collection can, in various ways, extend past final // BR in firefox DOM, so cap the line var numLines = rep.lines.length(); @@ -1845,16 +1872,18 @@ function Ace2Inner(){ { return rep.selStart[0]; } + editorInfo.ace_caretLine = caretLine; function caretColumn() { return rep.selStart[1]; } - + editorInfo.ace_caretColumn = caretColumn; function caretDocChar() { return rep.lines.offsetOfIndex(caretLine()) + caretColumn(); } + editorInfo.ace_caretDocChar = caretDocChar; function handleReturnIndentation() { @@ -3447,7 +3476,7 @@ function Ace2Inner(){ { return !!REGEX_WORDCHAR.exec(c); } - + editorInfo.ace_isWordChar = isWordChar; function isSpaceChar(c) { return !!REGEX_SPACE.exec(c); @@ -3548,7 +3577,17 @@ function Ace2Inner(){ if (!stopped) { - if (isTypeForSpecialKey && keyCode == 8) + editorInfo.specialHandled = null; + hooks.callAll('aceKeyEvent', { + callstack: currentCallStack, + editorInfo: editorInfo, + rep: rep, + specialHandled:specialHandled, + documentAttributeManager: documentAttributeManager, + evt:evt + }); + specialHandled = editorInfo.specialHandled||specialHandled; + if ((!specialHandled) &&isTypeForSpecialKey && keyCode == 8) { // "delete" key; in mozilla, if we're at the beginning of a line, normalize now, // or else deleting a blank line can take two delete presses. diff --git a/src/static/js/contentcollector.js b/src/static/js/contentcollector.js index 219976d33..f9d43df2c 100644 --- a/src/static/js/contentcollector.js +++ b/src/static/js/contentcollector.js @@ -372,7 +372,17 @@ function makeContentCollector(collectStyles, browser, apool, domInterface, class _reachBlockPoint(node, 0, state); if (dom.isNodeText(node)) { - var txt = dom.nodeValue(node); + var tname = dom.nodeAttr(node.parentNode,"name"); + hooks.callAll('collectContentTblTd', { + cc: this, + state: state, + tname: tname, + node:node, + text:dom.nodeValue(node), + styl: null, + cls: null + }); + var txt = this.text||dom.nodeValue(node); var rest = ''; var x = 0; // offset into original text if (txt.length == 0) @@ -440,7 +450,19 @@ function makeContentCollector(collectStyles, browser, apool, domInterface, class var tname = (dom.nodeTagName(node) || "").toLowerCase(); if (tname == "br") { - cc.startNewLine(state); + this.breakLine = true; + var tvalue = dom.nodeAttr(node, 'value'); + hooks.callAll('collectContentBreak', { + cc: this, + state: state, + tname: tname, + tvalue:tvalue, + styl: null, + cls: null + }); + if(this.breakLine){ + cc.startNewLine(state); + } } else if (tname == "script" || tname == "style") { diff --git a/src/static/js/linestylefilter.js b/src/static/js/linestylefilter.js index 1cbfac29c..3915bf266 100644 --- a/src/static/js/linestylefilter.js +++ b/src/static/js/linestylefilter.js @@ -153,14 +153,20 @@ linestylefilter.getLineStyleFilter = function(lineLength, aline, textAndClassFun // prevent infinite loop if something funny's going on return nextAfterAuthorColors(txt, cls); } - var spanSize = txt.length; - if (spanSize > leftInAuthor) - { - spanSize = leftInAuthor; + var spanSize = txt.length; + if(txt&&txt.indexOf('data-tables')!=-1){ + spanSize = leftInAuthor = txt.length; } + else if (spanSize > leftInAuthor){ + spanSize = leftInAuthor; + } var curTxt = txt.substring(0, spanSize); - txt = txt.substring(spanSize); - nextAfterAuthorColors(curTxt, (cls && cls + " ") + extraClasses); + txt = txt.substring(spanSize); + if(curTxt&&curTxt.indexOf('data-tables')!=-1){ + nextAfterAuthorColors(curTxt,extraClasses ); + }else{ + nextAfterAuthorColors(curTxt, (cls && cls + " ") + extraClasses); + } curIndex += spanSize; leftInAuthor -= spanSize; if (leftInAuthor == 0)