mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-04-26 02:16:16 -04:00
merge develop
This commit is contained in:
commit
f915285f15
23 changed files with 689 additions and 192 deletions
|
@ -1622,9 +1622,17 @@ function Ace2Inner(){
|
|||
lines = ccData.lines;
|
||||
var lineAttribs = ccData.lineAttribs;
|
||||
var linesWrapped = ccData.linesWrapped;
|
||||
var scrollToTheLeftNeeded = false;
|
||||
|
||||
if (linesWrapped > 0)
|
||||
{
|
||||
if(!browser.ie){
|
||||
// chrome decides in it's infinite wisdom that its okay to put the browsers visisble window in the middle of the span
|
||||
// an outcome of this is that the first chars of the string are no longer visible to the user.. Yay chrome..
|
||||
// Move the browsers visible area to the left hand side of the span
|
||||
// Firefox isn't quite so bad, but it's still pretty quirky.
|
||||
var scrollToTheLeftNeeded = true;
|
||||
}
|
||||
// console.log("Editor warning: " + linesWrapped + " long line" + (linesWrapped == 1 ? " was" : "s were") + " hard-wrapped into " + ccData.numLinesAfter + " lines.");
|
||||
}
|
||||
|
||||
|
@ -1692,6 +1700,10 @@ function Ace2Inner(){
|
|||
//console.log("removed: "+id);
|
||||
});
|
||||
|
||||
if(scrollToTheLeftNeeded){ // needed to stop chrome from breaking the ui when long strings without spaces are pasted
|
||||
$("#innerdocbody").scrollLeft(0);
|
||||
}
|
||||
|
||||
p.mark("findsel");
|
||||
// if the nodes that define the selection weren't encountered during
|
||||
// content collection, figure out where those nodes are now.
|
||||
|
@ -1897,7 +1909,7 @@ function Ace2Inner(){
|
|||
var prevLine = rep.lines.prev(thisLine);
|
||||
var prevLineText = prevLine.text;
|
||||
var theIndent = /^ *(?:)/.exec(prevLineText)[0];
|
||||
if (/[\[\(\{]\s*$/.exec(prevLineText)) theIndent += THE_TAB;
|
||||
if (/[\[\(\:\{]\s*$/.exec(prevLineText)) theIndent += THE_TAB;
|
||||
var cs = Changeset.builder(rep.lines.totalWidth()).keep(
|
||||
rep.lines.offsetOfIndex(lineNum), lineNum).insert(
|
||||
theIndent, [
|
||||
|
@ -3287,7 +3299,7 @@ function Ace2Inner(){
|
|||
listType = /([a-z]+)([12345678])/.exec(listType);
|
||||
var type = listType[1];
|
||||
var level = Number(listType[2]);
|
||||
|
||||
|
||||
//detect empty list item; exclude indentation
|
||||
if(text === '*' && type !== "indent")
|
||||
{
|
||||
|
@ -3317,8 +3329,10 @@ function Ace2Inner(){
|
|||
|
||||
function doIndentOutdent(isOut)
|
||||
{
|
||||
if (!(rep.selStart && rep.selEnd) ||
|
||||
((rep.selStart[0] == rep.selEnd[0]) && (rep.selStart[1] == rep.selEnd[1]) && rep.selEnd[1] > 1))
|
||||
if (!((rep.selStart && rep.selEnd) ||
|
||||
((rep.selStart[0] == rep.selEnd[0]) && (rep.selStart[1] == rep.selEnd[1]) && rep.selEnd[1] > 1)) &&
|
||||
(isOut != true)
|
||||
)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -3326,7 +3340,6 @@ function Ace2Inner(){
|
|||
var firstLine, lastLine;
|
||||
firstLine = rep.selStart[0];
|
||||
lastLine = Math.max(firstLine, rep.selEnd[0] - ((rep.selEnd[1] === 0) ? 1 : 0));
|
||||
|
||||
var mods = [];
|
||||
for (var n = firstLine; n <= lastLine; n++)
|
||||
{
|
||||
|
@ -3539,7 +3552,6 @@ function Ace2Inner(){
|
|||
{
|
||||
// if (DEBUG && window.DONT_INCORP) return;
|
||||
if (!isEditable) return;
|
||||
|
||||
var type = evt.type;
|
||||
var charCode = evt.charCode;
|
||||
var keyCode = evt.keyCode;
|
||||
|
@ -3736,26 +3748,30 @@ function Ace2Inner(){
|
|||
We have to do this the way we do because rep. doesn't hold the value for keyheld events IE if the user
|
||||
presses and holds the arrow key */
|
||||
if((evt.which == 37 || evt.which == 38 || evt.which == 39 || evt.which == 40) && $.browser.chrome){
|
||||
var isLeftArrow = evt.which === 37;
|
||||
var isUpArrow = evt.which === 38;
|
||||
var isRightArrow = evt.which === 39;
|
||||
var isDownArrow = evt.which === 40;
|
||||
|
||||
var newVisibleLineRange = getVisibleLineRange(); // get the current visible range -- This works great.
|
||||
var lineHeight = textLineHeight(); // what Is the height of each line?
|
||||
var myselection = document.getSelection(); // get the current caret selection, can't use rep. here because that only gives us the start position not the current
|
||||
var caretOffsetTop = myselection.focusNode.parentNode.offsetTop; // get the carets selection offset in px IE 214
|
||||
|
||||
if((isUpArrow || isLeftArrow || isRightArrow || isDownArrow) && caretOffsetTop){ // was it an up arrow or left arrow?
|
||||
if(caretOffsetTop){ // sometimes caretOffsetTop bugs out and returns 0, not sure why, possible Chrome bug? Either way if it does we don't wanna mess with it
|
||||
var lineNum = Math.round(caretOffsetTop / lineHeight) ; // Get the current Line Number IE 84
|
||||
newVisibleLineRange[1] = newVisibleLineRange[1]-1;
|
||||
var caretIsVisible = (lineNum > newVisibleLineRange[0] && lineNum < newVisibleLineRange[1]); // Is the cursor in the visible Range IE ie 84 > 14 and 84 < 90?
|
||||
|
||||
if(!caretIsVisible){ // is the cursor no longer visible to the user?
|
||||
// Oh boy the caret is out of the visible area, I need to scroll the browser window to lineNum.
|
||||
// Get the new Y by getting the line number and multiplying by the height of each line.
|
||||
var newY = lineHeight * (lineNum -1); // -1 to go to the line above
|
||||
if(evt.which == 37 || evt.which == 38){ // If left or up
|
||||
var newY = lineHeight * (lineNum -1); // -1 to go to the line above
|
||||
}else if(evt.which == 39 || evt.which == 40){ // if down or right
|
||||
var newY = getScrollY() + (lineHeight*3); // the offset and one additional line
|
||||
}
|
||||
setScrollY(newY); // set the scroll height of the browser
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
(function(document) {
|
||||
// Set language for l10n
|
||||
var language = document.cookie.match(/language=((\w{2,3})(-w+)?)/);
|
||||
var language = document.cookie.match(/language=((\w{2,3})(-\w+)?)/);
|
||||
if(language) language = language[1];
|
||||
|
||||
|
||||
html10n.bind('indexed', function() {
|
||||
html10n.localize([language, navigator.language, navigator.userLanguage, 'en'])
|
||||
})
|
||||
|
|
|
@ -156,10 +156,7 @@ var padeditbar = (function()
|
|||
else if (cmd == 'insertorderedlist') ace.ace_doInsertOrderedList();
|
||||
else if (cmd == 'indent')
|
||||
{
|
||||
if (!ace.ace_doIndentOutdent(false))
|
||||
{
|
||||
ace.ace_doInsertUnorderedList();
|
||||
}
|
||||
ace.ace_doIndentOutdent(false);
|
||||
}
|
||||
else if (cmd == 'outdent')
|
||||
{
|
||||
|
|
|
@ -70,10 +70,12 @@ exports.flatten = function (lst) {
|
|||
|
||||
exports.callAll = function (hook_name, args) {
|
||||
if (!args) args = {};
|
||||
if (exports.plugins.hooks[hook_name] === undefined) return [];
|
||||
return _.flatten(_.map(exports.plugins.hooks[hook_name], function (hook) {
|
||||
return hookCallWrapper(hook, hook_name, args);
|
||||
}), true);
|
||||
if (exports.plugins){
|
||||
if (exports.plugins.hooks[hook_name] === undefined) return [];
|
||||
return _.flatten(_.map(exports.plugins.hooks[hook_name], function (hook) {
|
||||
return hookCallWrapper(hook, hook_name, args);
|
||||
}), true);
|
||||
}
|
||||
}
|
||||
|
||||
exports.aCallAll = function (hook_name, args, cb) {
|
||||
|
|
|
@ -29,6 +29,7 @@ var createCookie = require('./pad_utils').createCookie;
|
|||
var readCookie = require('./pad_utils').readCookie;
|
||||
var randomString = require('./pad_utils').randomString;
|
||||
var _ = require('./underscore');
|
||||
var hooks = require('./pluginfw/hooks');
|
||||
|
||||
var token, padId, export_links;
|
||||
|
||||
|
@ -108,6 +109,7 @@ function init() {
|
|||
|
||||
exports.socket = socket; // make the socket available
|
||||
|
||||
hooks.aCallAll("postTimesliderInit");
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue