mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-04-20 23:46:14 -04:00
Merge branch 'develop' into objectify_ep
Conflicts: src/node/utils/tar.json src/static/js/ace2_inner.js
This commit is contained in:
commit
daca484747
20 changed files with 1196 additions and 344 deletions
|
@ -19,39 +19,37 @@
|
|||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
var editor, _, $, jQuery, plugins, Ace2Common;
|
||||
|
||||
var Ace2Common = require('./ace2_common');
|
||||
Ace2Common = require('./ace2_common');
|
||||
|
||||
// Extract useful method defined in the other module.
|
||||
var isNodeText = Ace2Common.isNodeText;
|
||||
var object = Ace2Common.object;
|
||||
var extend = Ace2Common.extend;
|
||||
var forEach = Ace2Common.forEach;
|
||||
var map = Ace2Common.map;
|
||||
var filter = Ace2Common.filter;
|
||||
var isArray = Ace2Common.isArray;
|
||||
var browser = Ace2Common.browser;
|
||||
var getAssoc = Ace2Common.getAssoc;
|
||||
var setAssoc = Ace2Common.setAssoc;
|
||||
var binarySearchInfinite = Ace2Common.binarySearchInfinite;
|
||||
var htmlPrettyEscape = Ace2Common.htmlPrettyEscape;
|
||||
var map = Ace2Common.map;
|
||||
var noop = Ace2Common.noop;
|
||||
plugins = require('ep_etherpad-lite/static/js/pluginfw/plugins');
|
||||
$ = jQuery = require('./rjquery').$;
|
||||
_ = require("./underscore");
|
||||
|
||||
var makeChangesetTracker = require('./changesettracker').makeChangesetTracker;
|
||||
var colorutils = require('./colorutils').colorutils;
|
||||
var makeContentCollector = require('./contentcollector').makeContentCollector;
|
||||
var makeCSSManager = require('./cssmanager').makeCSSManager;
|
||||
var domline = require('./domline').domline;
|
||||
var AttribPool = require('./AttributePool');
|
||||
var Changeset = require('./Changeset');
|
||||
var linestylefilter = require('./linestylefilter').linestylefilter;
|
||||
var SkipList = require('./skiplist');
|
||||
var undoModule = require('./undomodule').undoModule;
|
||||
var makeVirtualLineView = require('./virtual_lines').makeVirtualLineView;
|
||||
var isNodeText = Ace2Common.isNodeText,
|
||||
browser = Ace2Common.browser,
|
||||
getAssoc = Ace2Common.getAssoc,
|
||||
setAssoc = Ace2Common.setAssoc,
|
||||
isTextNode = Ace2Common.isTextNode,
|
||||
binarySearchInfinite = Ace2Common.binarySearchInfinite,
|
||||
htmlPrettyEscape = Ace2Common.htmlPrettyEscape,
|
||||
noop = Ace2Common.noop;
|
||||
|
||||
function Ace2Inner(){
|
||||
|
||||
|
||||
var makeChangesetTracker = require('./changesettracker').makeChangesetTracker;
|
||||
var colorutils = require('./colorutils').colorutils;
|
||||
var makeContentCollector = require('./contentcollector').makeContentCollector;
|
||||
var makeCSSManager = require('./cssmanager').makeCSSManager;
|
||||
var domline = require('./domline').domline;
|
||||
var AttribPool = require('./AttributePool');
|
||||
var Changeset = require('./Changeset');
|
||||
var linestylefilter = require('./linestylefilter').linestylefilter;
|
||||
var SkipList = require('./skiplist');
|
||||
var undoModule = require('./undomodule').undoModule;
|
||||
var makeVirtualLineView = require('./virtual_lines').makeVirtualLineView;
|
||||
|
||||
var DEBUG = false; //$$ build script replaces the string "var DEBUG=true;//$$" with "var DEBUG=false;"
|
||||
// changed to false
|
||||
var isSetUp = false;
|
||||
|
@ -70,7 +68,6 @@ function Ace2Inner(){
|
|||
var thisAuthor = '';
|
||||
|
||||
var disposed = false;
|
||||
|
||||
var editorInfo = parent.editorInfo;
|
||||
|
||||
var iframe = window.frameElement;
|
||||
|
@ -685,7 +682,7 @@ function Ace2Inner(){
|
|||
}
|
||||
else
|
||||
{
|
||||
lines = map(text.split('\n'), textify);
|
||||
lines = _.map(text.split('\n'), textify);
|
||||
}
|
||||
var newText = "\n";
|
||||
if (lines.length > 0)
|
||||
|
@ -884,9 +881,7 @@ function Ace2Inner(){
|
|||
{
|
||||
return fn(editorInfo);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
if (normalize !== undefined)
|
||||
{
|
||||
var wrapper1 = wrapper;
|
||||
|
@ -1623,8 +1618,7 @@ function Ace2Inner(){
|
|||
}
|
||||
//var fragment = magicdom.wrapDom(document.createDocumentFragment());
|
||||
domInsertsNeeded.push([nodeToAddAfter, lineNodeInfos]);
|
||||
forEach(dirtyNodes, function(n)
|
||||
{
|
||||
_.each(dirtyNodes,function(n){
|
||||
toDeleteAtEnd.push(n);
|
||||
});
|
||||
var spliceHints = {};
|
||||
|
@ -1646,7 +1640,7 @@ function Ace2Inner(){
|
|||
|
||||
// update the representation
|
||||
p.mark("splice");
|
||||
forEach(splicesToDo, function(splice)
|
||||
_.each(splicesToDo, function(splice)
|
||||
{
|
||||
doIncorpLineSplice(splice[0], splice[1], splice[2], splice[3], splice[4]);
|
||||
});
|
||||
|
@ -1656,14 +1650,14 @@ function Ace2Inner(){
|
|||
//var isTimeUp = newTimeLimit(100);
|
||||
// do DOM inserts
|
||||
p.mark("insert");
|
||||
forEach(domInsertsNeeded, function(ins)
|
||||
_.each(domInsertsNeeded,function(ins)
|
||||
{
|
||||
insertDomLines(ins[0], ins[1], isTimeUp);
|
||||
});
|
||||
|
||||
p.mark("del");
|
||||
// delete old dom nodes
|
||||
forEach(toDeleteAtEnd, function(n)
|
||||
_.each(toDeleteAtEnd,function(n)
|
||||
{
|
||||
//var id = n.uniqueId();
|
||||
// parent of n may not be "root" in IE due to non-tree-shaped DOM (wtf)
|
||||
|
@ -1773,7 +1767,7 @@ function Ace2Inner(){
|
|||
var charEnd = rep.lines.offsetOfEntry(endEntry) + endEntry.width;
|
||||
|
||||
//rep.lexer.lexCharRange([charStart, charEnd], isTimeUp);
|
||||
forEach(infoStructs, function(info)
|
||||
_.each(infoStructs, function(info)
|
||||
{
|
||||
var p2 = PROFILER("insertLine", false);
|
||||
var node = info.node;
|
||||
|
@ -2084,10 +2078,8 @@ function Ace2Inner(){
|
|||
var linesMutatee = {
|
||||
splice: function(start, numRemoved, newLinesVA)
|
||||
{
|
||||
domAndRepSplice(start, numRemoved, map(Array.prototype.slice.call(arguments, 2), function(s)
|
||||
{
|
||||
return s.slice(0, -1);
|
||||
}), null);
|
||||
var args = Array.prototype.slice.call(arguments, 2);
|
||||
domAndRepSplice(start, numRemoved, _.map(args, function(s){ return s.slice(0, -1); }), null);
|
||||
},
|
||||
get: function(i)
|
||||
{
|
||||
|
@ -2099,7 +2091,7 @@ function Ace2Inner(){
|
|||
},
|
||||
slice_notused: function(start, end)
|
||||
{
|
||||
return map(rep.lines.slice(start, end), function(e)
|
||||
return _.map(rep.lines.slice(start, end), function(e)
|
||||
{
|
||||
return e.text + '\n';
|
||||
});
|
||||
|
@ -2132,7 +2124,7 @@ function Ace2Inner(){
|
|||
}
|
||||
}
|
||||
|
||||
var lineEntries = map(newLineStrings, createDomLineEntry);
|
||||
var lineEntries = _.map(newLineStrings, createDomLineEntry);
|
||||
|
||||
doRepLineSplice(startLine, deleteCount, lineEntries);
|
||||
|
||||
|
@ -2143,12 +2135,12 @@ function Ace2Inner(){
|
|||
}
|
||||
else nodeToAddAfter = null;
|
||||
|
||||
insertDomLines(nodeToAddAfter, map(lineEntries, function(entry)
|
||||
insertDomLines(nodeToAddAfter, _.map(lineEntries, function(entry)
|
||||
{
|
||||
return entry.domInfo;
|
||||
}), isTimeUp);
|
||||
|
||||
forEach(keysToDelete, function(k)
|
||||
_.each(keysToDelete, function(k)
|
||||
{
|
||||
var n = doc.getElementById(k);
|
||||
n.parentNode.removeChild(n);
|
||||
|
@ -2468,7 +2460,7 @@ function Ace2Inner(){
|
|||
function doRepLineSplice(startLine, deleteCount, newLineEntries)
|
||||
{
|
||||
|
||||
forEach(newLineEntries, function(entry)
|
||||
_.each(newLineEntries, function(entry)
|
||||
{
|
||||
entry.width = entry.text.length + 1;
|
||||
});
|
||||
|
@ -2483,7 +2475,7 @@ function Ace2Inner(){
|
|||
currentCallStack.repChanged = true;
|
||||
var newRegionEnd = rep.lines.offsetOfIndex(startLine + newLineEntries.length);
|
||||
|
||||
var newText = map(newLineEntries, function(e)
|
||||
var newText = _.map(newLineEntries, function(e)
|
||||
{
|
||||
return e.text + '\n';
|
||||
}).join('');
|
||||
|
@ -2513,7 +2505,7 @@ function Ace2Inner(){
|
|||
selEndHintChar = rep.lines.offsetOfIndex(hints.selEnd[0]) + hints.selEnd[1] - oldRegionStart;
|
||||
}
|
||||
|
||||
var newText = map(newLineEntries, function(e)
|
||||
var newText = _.map(newLineEntries, function(e)
|
||||
{
|
||||
return e.text + '\n';
|
||||
}).join('');
|
||||
|
@ -3054,7 +3046,7 @@ function Ace2Inner(){
|
|||
{
|
||||
// returns index of cleanRange containing i, or -1 if none
|
||||
var answer = -1;
|
||||
forEach(cleanRanges, function(r, idx)
|
||||
_.each(cleanRanges ,function(r, idx)
|
||||
{
|
||||
if (i >= r[1]) return false; // keep looking
|
||||
if (i < r[0]) return true; // not found, stop looking
|
||||
|
@ -3847,7 +3839,7 @@ function Ace2Inner(){
|
|||
|
||||
function getRepHTML()
|
||||
{
|
||||
return map(rep.lines.slice(), function(entry)
|
||||
return _.map(rep.lines.slice(), function(entry)
|
||||
{
|
||||
var text = entry.text;
|
||||
var content;
|
||||
|
@ -4533,7 +4525,7 @@ function Ace2Inner(){
|
|||
|
||||
enforceEditability();
|
||||
|
||||
addClass(sideDiv, 'sidedivdelayed');
|
||||
$(sideDiv).addClass('sidedivdelayed');
|
||||
}
|
||||
|
||||
function getScrollXY()
|
||||
|
@ -4586,14 +4578,12 @@ function Ace2Inner(){
|
|||
|
||||
function teardown()
|
||||
{
|
||||
forEach(_teardownActions, function(a)
|
||||
_.each(_teardownActions, function(a)
|
||||
{
|
||||
a();
|
||||
});
|
||||
}
|
||||
|
||||
bindEventHandler(window, "load", setup);
|
||||
|
||||
function setDesignMode(newVal)
|
||||
{
|
||||
try
|
||||
|
@ -4670,20 +4660,20 @@ function Ace2Inner(){
|
|||
|
||||
function bindTheEventHandlers()
|
||||
{
|
||||
bindEventHandler(document, "keydown", handleKeyEvent);
|
||||
bindEventHandler(document, "keypress", handleKeyEvent);
|
||||
bindEventHandler(document, "keyup", handleKeyEvent);
|
||||
bindEventHandler(document, "click", handleClick);
|
||||
bindEventHandler(root, "blur", handleBlur);
|
||||
$(document).on("keydown", handleKeyEvent);
|
||||
$(document).on("keypress", handleKeyEvent);
|
||||
$(document).on("keyup", handleKeyEvent);
|
||||
$(document).on("click", handleClick);
|
||||
$(root).on("blur", handleBlur);
|
||||
if (browser.msie)
|
||||
{
|
||||
bindEventHandler(document, "click", handleIEOuterClick);
|
||||
$(document).on("click", handleIEOuterClick);
|
||||
}
|
||||
if (browser.msie) bindEventHandler(root, "paste", handleIEPaste);
|
||||
if (browser.msie) $(root).on("paste", handleIEPaste);
|
||||
if ((!browser.msie) && document.documentElement)
|
||||
{
|
||||
bindEventHandler(document.documentElement, "compositionstart", handleCompositionEvent);
|
||||
bindEventHandler(document.documentElement, "compositionend", handleCompositionEvent);
|
||||
$(document.documentElement).on("compositionstart", handleCompositionEvent);
|
||||
$(document.documentElement).on("compositionend", handleCompositionEvent);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4730,91 +4720,10 @@ function Ace2Inner(){
|
|||
elem.className = array.join(' ');
|
||||
}
|
||||
|
||||
function addClass(elem, className)
|
||||
{
|
||||
var seen = false;
|
||||
var cc = getClassArray(elem, function(c)
|
||||
{
|
||||
if (c == className) seen = true;
|
||||
return true;
|
||||
});
|
||||
if (!seen)
|
||||
{
|
||||
cc.push(className);
|
||||
setClassArray(elem, cc);
|
||||
}
|
||||
}
|
||||
|
||||
function removeClass(elem, className)
|
||||
{
|
||||
var seen = false;
|
||||
var cc = getClassArray(elem, function(c)
|
||||
{
|
||||
if (c == className)
|
||||
{
|
||||
seen = true;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
if (seen)
|
||||
{
|
||||
setClassArray(elem, cc);
|
||||
}
|
||||
}
|
||||
|
||||
function setClassPresence(elem, className, present)
|
||||
{
|
||||
if (present) addClass(elem, className);
|
||||
else removeClass(elem, className);
|
||||
}
|
||||
|
||||
function setup()
|
||||
{
|
||||
doc = document; // defined as a var in scope outside
|
||||
inCallStack("setup", function()
|
||||
{
|
||||
var body = doc.getElementById("innerdocbody");
|
||||
root = body; // defined as a var in scope outside
|
||||
if (browser.mozilla) addClass(root, "mozilla");
|
||||
if (browser.safari) addClass(root, "safari");
|
||||
if (browser.msie) addClass(root, "msie");
|
||||
if (browser.msie)
|
||||
{
|
||||
// cache CSS background images
|
||||
try
|
||||
{
|
||||
doc.execCommand("BackgroundImageCache", false, true);
|
||||
}
|
||||
catch (e)
|
||||
{ /* throws an error in some IE 6 but not others! */
|
||||
}
|
||||
}
|
||||
setClassPresence(root, "authorColors", true);
|
||||
setClassPresence(root, "doesWrap", doesWrap);
|
||||
|
||||
initDynamicCSS();
|
||||
|
||||
enforceEditability();
|
||||
|
||||
// set up dom and rep
|
||||
while (root.firstChild) root.removeChild(root.firstChild);
|
||||
var oneEntry = createDomLineEntry("");
|
||||
doRepLineSplice(0, rep.lines.length(), [oneEntry]);
|
||||
insertDomLines(null, [oneEntry.domInfo], null);
|
||||
rep.alines = Changeset.splitAttributionLines(
|
||||
Changeset.makeAttribution("\n"), "\n");
|
||||
|
||||
bindTheEventHandlers();
|
||||
|
||||
});
|
||||
|
||||
scheduler.setTimeout(function()
|
||||
{
|
||||
parent.readyFunc(); // defined in code that sets up the inner iframe
|
||||
}, 0);
|
||||
|
||||
isSetUp = true;
|
||||
if (present) $(elem).addClass(className);
|
||||
else $(elem).removeClass(elem, className);
|
||||
}
|
||||
|
||||
function focus()
|
||||
|
@ -4833,32 +4742,6 @@ function Ace2Inner(){
|
|||
}
|
||||
}
|
||||
|
||||
function bindEventHandler(target, type, func)
|
||||
{
|
||||
var handler;
|
||||
if ((typeof func._wrapper) != "function")
|
||||
{
|
||||
func._wrapper = function(event)
|
||||
{
|
||||
func(fixEvent(event || window.event || {}));
|
||||
}
|
||||
}
|
||||
var handler = func._wrapper;
|
||||
if (target.addEventListener) target.addEventListener(type, handler, false);
|
||||
else target.attachEvent("on" + type, handler);
|
||||
_teardownActions.push(function()
|
||||
{
|
||||
unbindEventHandler(target, type, func);
|
||||
});
|
||||
}
|
||||
|
||||
function unbindEventHandler(target, type, func)
|
||||
{
|
||||
var handler = func._wrapper;
|
||||
if (target.removeEventListener) target.removeEventListener(type, handler, false);
|
||||
else target.detachEvent("on" + type, handler);
|
||||
}
|
||||
|
||||
function getSelectionPointX(point)
|
||||
{
|
||||
// doesn't work in wrap-mode
|
||||
|
@ -5520,67 +5403,7 @@ function Ace2Inner(){
|
|||
}
|
||||
};
|
||||
})());
|
||||
|
||||
|
||||
// stolen from jquery-1.2.1
|
||||
|
||||
|
||||
function fixEvent(event)
|
||||
{
|
||||
// store a copy of the original event object
|
||||
// and clone to set read-only properties
|
||||
var originalEvent = event;
|
||||
event = extend(
|
||||
{}, originalEvent);
|
||||
|
||||
// add preventDefault and stopPropagation since
|
||||
// they will not work on the clone
|
||||
event.preventDefault = function()
|
||||
{
|
||||
// if preventDefault exists run it on the original event
|
||||
if (originalEvent.preventDefault) originalEvent.preventDefault();
|
||||
// otherwise set the returnValue property of the original event to false (IE)
|
||||
originalEvent.returnValue = false;
|
||||
};
|
||||
event.stopPropagation = function()
|
||||
{
|
||||
// if stopPropagation exists run it on the original event
|
||||
if (originalEvent.stopPropagation) originalEvent.stopPropagation();
|
||||
// otherwise set the cancelBubble property of the original event to true (IE)
|
||||
originalEvent.cancelBubble = true;
|
||||
};
|
||||
|
||||
// Fix target property, if necessary
|
||||
if (!event.target && event.srcElement) event.target = event.srcElement;
|
||||
|
||||
// check if target is a textnode (safari)
|
||||
if (browser.safari && event.target.nodeType == 3) event.target = originalEvent.target.parentNode;
|
||||
|
||||
// Add relatedTarget, if necessary
|
||||
if (!event.relatedTarget && event.fromElement) event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
|
||||
|
||||
// Calculate pageX/Y if missing and clientX/Y available
|
||||
if (event.pageX == null && event.clientX != null)
|
||||
{
|
||||
var e = document.documentElement,
|
||||
b = document.body;
|
||||
event.pageX = event.clientX + (e && e.scrollLeft || b.scrollLeft || 0);
|
||||
event.pageY = event.clientY + (e && e.scrollTop || b.scrollTop || 0);
|
||||
}
|
||||
|
||||
// Add which for key events
|
||||
if (!event.which && (event.charCode || event.keyCode)) event.which = event.charCode || event.keyCode;
|
||||
|
||||
// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
|
||||
if (!event.metaKey && event.ctrlKey) event.metaKey = event.ctrlKey;
|
||||
|
||||
// Add which for click: 1 == left; 2 == middle; 3 == right
|
||||
// Note: button is not normalized, so don't use it
|
||||
if (!event.which && event.button) event.which = (event.button & 1 ? 1 : (event.button & 2 ? 3 : (event.button & 4 ? 2 : 0)));
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
|
||||
var lineNumbersShown;
|
||||
var sideDivInner;
|
||||
|
||||
|
@ -5665,6 +5488,56 @@ function Ace2Inner(){
|
|||
}
|
||||
}
|
||||
|
||||
$(document).ready(function(){
|
||||
doc = document; // defined as a var in scope outside
|
||||
inCallStack("setup", function()
|
||||
{
|
||||
var body = doc.getElementById("innerdocbody");
|
||||
root = body; // defined as a var in scope outside
|
||||
if (browser.mozilla) $(root).addClass("mozilla");
|
||||
if (browser.safari) $(root).addClass("safari");
|
||||
if (browser.msie) $(root).addClass("msie");
|
||||
if (browser.msie)
|
||||
{
|
||||
// cache CSS background images
|
||||
try
|
||||
{
|
||||
doc.execCommand("BackgroundImageCache", false, true);
|
||||
}
|
||||
catch (e)
|
||||
{ /* throws an error in some IE 6 but not others! */
|
||||
}
|
||||
}
|
||||
setClassPresence(root, "authorColors", true);
|
||||
setClassPresence(root, "doesWrap", doesWrap);
|
||||
|
||||
initDynamicCSS();
|
||||
|
||||
enforceEditability();
|
||||
|
||||
// set up dom and rep
|
||||
while (root.firstChild) root.removeChild(root.firstChild);
|
||||
var oneEntry = createDomLineEntry("");
|
||||
doRepLineSplice(0, rep.lines.length(), [oneEntry]);
|
||||
insertDomLines(null, [oneEntry.domInfo], null);
|
||||
rep.alines = Changeset.splitAttributionLines(
|
||||
Changeset.makeAttribution("\n"), "\n");
|
||||
|
||||
bindTheEventHandlers();
|
||||
|
||||
});
|
||||
|
||||
scheduler.setTimeout(function()
|
||||
{
|
||||
parent.readyFunc(); // defined in code that sets up the inner iframe
|
||||
}, 0);
|
||||
|
||||
isSetUp = true;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
exports.editor = new Ace2Inner();
|
||||
// Ensure that plugins are loaded before initializing the editor
|
||||
plugins.ensure(function () {
|
||||
var editor = new Ace2Inner();
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue